python-3.12.7_p1.ebuild 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. # Copyright 1999-2024 Gentoo Authors
  2. # Distributed under the terms of the GNU General Public License v2
  3. EAPI="8"
  4. WANT_LIBTOOL="none"
  5. inherit autotools check-reqs flag-o-matic multiprocessing pax-utils
  6. inherit python-utils-r1 toolchain-funcs verify-sig
  7. MY_PV=${PV/_rc/rc}
  8. MY_P="Python-${MY_PV%_p*}"
  9. PYVER=$(ver_cut 1-2)
  10. PATCHSET="python-gentoo-patches-${MY_PV}-r1"
  11. DESCRIPTION="An interpreted, interactive, object-oriented programming language"
  12. HOMEPAGE="
  13. https://www.python.org/
  14. https://github.com/python/cpython/
  15. "
  16. SRC_URI="
  17. https://www.python.org/ftp/python/${PV%%_*}/${MY_P}.tar.xz
  18. https://dev.gentoo.org/~mgorny/dist/python/${PATCHSET}.tar.xz
  19. verify-sig? (
  20. https://www.python.org/ftp/python/${PV%%_*}/${MY_P}.tar.xz.asc
  21. )
  22. "
  23. S="${WORKDIR}/${MY_P}"
  24. LICENSE="PSF-2"
  25. SLOT="${PYVER}"
  26. KEYWORDS="~alpha amd64 ~arm arm64 ~hppa ~loong ~m68k ~mips ppc ~ppc64 ~riscv ~s390 ~sparc x86"
  27. IUSE="
  28. asan tsan msan ubsan lto thinlto
  29. bluetooth build debug +ensurepip examples gdbm libedit
  30. +ncurses pgo +readline +sqlite +ssl test tk valgrind
  31. "
  32. REQUIRED_USE="${PYTHON_REQUIRED_USE}
  33. asan? ( debug )
  34. tsan? ( debug )
  35. msan? ( debug )
  36. ubsan? ( debug )
  37. "
  38. RESTRICT="!test? ( test )"
  39. # Do not add a dependency on dev-lang/python to this ebuild.
  40. # If you need to apply a patch which requires python for bootstrapping, please
  41. # run the bootstrap code on your dev box and include the results in the
  42. # patchset. See bug 447752.
  43. RDEPEND="
  44. app-arch/bzip2:=
  45. app-arch/xz-utils:=
  46. app-crypt/libb2
  47. >=dev-libs/expat-2.1:=
  48. dev-libs/libffi:=
  49. dev-libs/mpdecimal:=
  50. dev-python/gentoo-common
  51. >=sys-libs/zlib-1.1.3:=
  52. virtual/libcrypt:=
  53. virtual/libintl
  54. ensurepip? ( dev-python/ensurepip-pip )
  55. gdbm? ( sys-libs/gdbm:=[berkdb] )
  56. kernel_linux? ( sys-apps/util-linux:= )
  57. ncurses? ( >=sys-libs/ncurses-5.2:= )
  58. readline? (
  59. !libedit? ( >=sys-libs/readline-4.1:= )
  60. libedit? ( dev-libs/libedit:= )
  61. )
  62. sqlite? ( >=dev-db/sqlite-3.3.8:3= )
  63. ssl? ( >=dev-libs/openssl-1.1.1:= )
  64. tk? (
  65. >=dev-lang/tcl-8.0:=
  66. >=dev-lang/tk-8.0:=
  67. dev-tcltk/blt:=
  68. dev-tcltk/tix
  69. )
  70. "
  71. # bluetooth requires headers from bluez
  72. DEPEND="
  73. ${RDEPEND}
  74. bluetooth? ( net-wireless/bluez )
  75. test? (
  76. app-arch/xz-utils
  77. dev-python/ensurepip-pip
  78. dev-python/ensurepip-setuptools
  79. dev-python/ensurepip-wheel
  80. )
  81. valgrind? ( dev-debug/valgrind )
  82. "
  83. # autoconf-archive needed to eautoreconf
  84. BDEPEND="
  85. dev-build/autoconf-archive
  86. app-alternatives/awk
  87. virtual/pkgconfig
  88. verify-sig? ( >=sec-keys/openpgp-keys-python-20221025 )
  89. "
  90. RDEPEND+="
  91. !build? ( app-misc/mime-types )
  92. "
  93. if [[ ${PV} != *_alpha* ]]; then
  94. RDEPEND+="
  95. dev-lang/python-exec[python_targets_python${PYVER/./_}(-)]
  96. "
  97. fi
  98. VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/python.org.asc
  99. # large file tests involve a 2.5G file being copied (duplicated)
  100. CHECKREQS_DISK_BUILD=5500M
  101. QA_PKGCONFIG_VERSION=${PYVER}
  102. # false positives -- functions specific to *BSD
  103. QA_CONFIG_IMPL_DECL_SKIP=( chflags lchflags )
  104. pkg_pretend() {
  105. use test && check-reqs_pkg_pretend
  106. }
  107. pkg_setup() {
  108. use test && check-reqs_pkg_setup
  109. }
  110. src_unpack() {
  111. if use verify-sig; then
  112. verify-sig_verify_detached "${DISTDIR}"/${MY_P}.tar.xz{,.asc}
  113. fi
  114. default
  115. }
  116. src_prepare() {
  117. # Ensure that internal copies of expat and libffi are not used.
  118. # TODO: Makefile has annoying deps on expat headers
  119. #rm -r Modules/expat || die
  120. local PATCHES=(
  121. "${WORKDIR}/${PATCHSET}"
  122. )
  123. default
  124. # force the correct number of jobs
  125. # https://bugs.gentoo.org/737660
  126. sed -i -e "s:-j0:-j$(makeopts_jobs):" Makefile.pre.in || die
  127. # breaks tests when using --with-wheel-pkg-dir
  128. rm -r Lib/test/wheeldata || die
  129. eautoreconf
  130. }
  131. build_cbuild_python() {
  132. # Hack to workaround get_libdir not being able to handle CBUILD, bug #794181
  133. local cbuild_libdir=$(unset PKG_CONFIG_PATH ; $(tc-getBUILD_PKG_CONFIG) --keep-system-libs --libs-only-L libffi)
  134. # pass system CFLAGS & LDFLAGS as _NODIST, otherwise they'll get
  135. # propagated to sysconfig for built extensions
  136. #
  137. local -x CFLAGS_NODIST="${BUILD_CFLAGS}"
  138. local -x LDFLAGS_NODIST=${BUILD_LDFLAGS}
  139. local -x CFLAGS= LDFLAGS=
  140. local -x BUILD_CFLAGS="${CFLAGS_NODIST}"
  141. local -x BUILD_LDFLAGS=${LDFLAGS_NODIST}
  142. # We need to build our own Python on CBUILD first, and feed it in.
  143. # bug #847910
  144. local myeconfargs_cbuild=(
  145. "${myeconfargs[@]}"
  146. --prefix="${BROOT}"/usr
  147. --libdir="${cbuild_libdir:2}"
  148. # Avoid needing to load the right libpython.so.
  149. --disable-shared
  150. # As minimal as possible for the mini CBUILD Python
  151. # we build just for cross to satisfy --with-build-python.
  152. --without-lto
  153. --without-readline
  154. --disable-optimizations
  155. )
  156. mkdir "${WORKDIR}"/${P}-${CBUILD} || die
  157. pushd "${WORKDIR}"/${P}-${CBUILD} &> /dev/null || die
  158. # Avoid as many dependencies as possible for the cross build.
  159. mkdir Modules || die
  160. cat > Modules/Setup.local <<-EOF || die
  161. *disabled*
  162. nis
  163. _dbm _gdbm
  164. _sqlite3
  165. _hashlib _ssl
  166. _curses _curses_panel
  167. readline
  168. _tkinter
  169. pyexpat
  170. zlib
  171. # We disabled these for CBUILD because Python's setup.py can't handle locating
  172. # libdir correctly for cross. This should be rechecked for the pure Makefile approach,
  173. # and uncommented if needed.
  174. #_ctypes _crypt
  175. EOF
  176. ECONF_SOURCE="${S}" econf_build "${myeconfargs_cbuild[@]}"
  177. # Unfortunately, we do have to build this immediately, and
  178. # not in src_compile, because CHOST configure for Python
  179. # will check the existence of the --with-build-python value
  180. # immediately.
  181. emake
  182. popd &> /dev/null || die
  183. }
  184. src_configure() {
  185. # disable automagic bluetooth headers detection
  186. if ! use bluetooth; then
  187. local -x ac_cv_header_bluetooth_bluetooth_h=no
  188. fi
  189. append-flags -fwrapv
  190. filter-flags -malign-double
  191. # Export CXX so it ends up in /usr/lib/python3.X/config/Makefile.
  192. # PKG_CONFIG needed for cross.
  193. tc-export CXX PKG_CONFIG
  194. local dbmliborder=
  195. if use gdbm; then
  196. dbmliborder+="${dbmliborder:+:}gdbm"
  197. fi
  198. # Set baseline test skip flags.
  199. COMMON_TEST_SKIPS=(
  200. # this is actually test_gdb.test_pretty_print
  201. -x test_pretty_print
  202. )
  203. # Arch-specific skips. See #931888 for a collection of these.
  204. case ${CHOST} in
  205. alpha*)
  206. COMMON_TEST_SKIPS+=(
  207. -x test_builtin
  208. -x test_capi
  209. -x test_cmath
  210. -x test_float
  211. # timeout
  212. -x test_free_threading
  213. -x test_math
  214. -x test_numeric_tower
  215. -x test_random
  216. -x test_statistics
  217. # bug 653850
  218. -x test_resource
  219. -x test_strtod
  220. )
  221. ;;
  222. mips*)
  223. COMMON_TEST_SKIPS+=(
  224. -x test_ctypes
  225. -x test_external_inspection
  226. -x test_statistics
  227. )
  228. ;;
  229. powerpc64-*) # big endian
  230. COMMON_TEST_SKIPS+=(
  231. -x test_gdb
  232. )
  233. ;;
  234. riscv*)
  235. COMMON_TEST_SKIPS+=(
  236. -x test_urllib2
  237. )
  238. ;;
  239. sparc*)
  240. COMMON_TEST_SKIPS+=(
  241. # bug 788022
  242. -x test_multiprocessing_fork
  243. -x test_multiprocessing_forkserver
  244. -x test_multiprocessing_spawn
  245. -x test_ctypes
  246. -x test_gdb
  247. # bug 931908
  248. -x test_exceptions
  249. )
  250. ;;
  251. esac
  252. # musl-specific skips
  253. use elibc_musl && COMMON_TEST_SKIPS+=(
  254. # various musl locale deficiencies
  255. -x test__locale
  256. -x test_c_locale_coercion
  257. -x test_locale
  258. -x test_re
  259. # known issues with find_library on musl
  260. # https://bugs.python.org/issue21622
  261. -x test_ctypes
  262. # fpathconf, ttyname errno values
  263. -x test_os
  264. )
  265. if use pgo; then
  266. local profile_task_flags=(
  267. -m test
  268. "-j$(makeopts_jobs)"
  269. --pgo-extended
  270. -u-network
  271. # We use a timeout because of how often we've had hang issues
  272. # here. It also matches the default upstream PROFILE_TASK.
  273. --timeout 1200
  274. "${COMMON_TEST_SKIPS[@]}"
  275. -x test_dtrace
  276. # All of these seem to occasionally hang for PGO inconsistently
  277. # They'll even hang here but be fine in src_test sometimes.
  278. # bug #828535 (and related: bug #788022)
  279. -x test_asyncio
  280. -x test_concurrent_futures
  281. -x test_httpservers
  282. -x test_logging
  283. -x test_multiprocessing_fork
  284. -x test_socket
  285. -x test_xmlrpc
  286. # Hangs (actually runs indefinitely executing itself w/ many cpython builds)
  287. # bug #900429
  288. -x test_tools
  289. )
  290. # Arch-specific skips. See #931888 for a collection of these.
  291. case ${CHOST} in
  292. alpha*)
  293. profile_task_flags+=(
  294. -x test_os
  295. )
  296. ;;
  297. hppa*)
  298. profile_task_flags+=(
  299. -x test_descr
  300. # bug 931908
  301. -x test_exceptions
  302. -x test_os
  303. )
  304. ;;
  305. powerpc64-*) # big endian
  306. profile_task_flags+=(
  307. # bug 931908
  308. -x test_exceptions
  309. )
  310. ;;
  311. riscv*)
  312. profile_task_flags+=(
  313. -x test_statistics
  314. )
  315. ;;
  316. esac
  317. if has_version "app-arch/rpm" ; then
  318. # Avoid sandbox failure (attempts to write to /var/lib/rpm)
  319. profile_task_flags+=(
  320. -x test_distutils
  321. )
  322. fi
  323. local -x PROFILE_TASK="${profile_task_flags[*]}"
  324. fi
  325. local myeconfargs=(
  326. # glibc-2.30 removes it; since we can't cleanly force-rebuild
  327. # Python on glibc upgrade, remove it proactively to give
  328. # a chance for users rebuilding python before glibc
  329. ac_cv_header_stropts_h=no
  330. --enable-shared
  331. --without-static-libpython
  332. --enable-ipv6
  333. --infodir='${prefix}/share/info'
  334. --mandir='${prefix}/share/man'
  335. --with-computed-gotos
  336. --with-dbmliborder="${dbmliborder}"
  337. --with-libc=
  338. --enable-loadable-sqlite-extensions
  339. --without-ensurepip
  340. --without-lto
  341. --with-system-expat
  342. --with-system-libmpdec
  343. --with-platlibdir=lib
  344. --with-pkg-config=yes
  345. --with-wheel-pkg-dir="${EPREFIX}"/usr/lib/python/ensurepip
  346. $(use_with debug assertions)
  347. $(use_enable pgo optimizations)
  348. $(use_with readline readline "$(usex libedit editline readline)")
  349. $(use_with valgrind)
  350. )
  351. if tc-is-clang ; then
  352. $(use_with asan address-sanitizer)
  353. $(use_with msan memory-sanitizer)
  354. $(use_with ubsan undefined-behavior-sanitizer)
  355. $(use_with tsan thread-sanitizer)
  356. fi
  357. # https://bugs.gentoo.org/700012
  358. if use lto ; then
  359. append-cflags $(test-flags-CC -ffat-lto-objects)
  360. myeconfargs+=(
  361. --with-lto=yes
  362. )
  363. fi
  364. if use thinlto ; then
  365. myeconfargs+=(
  366. --with-lto=thin
  367. )
  368. fi
  369. # Force-disable modules we don't want built.
  370. # See Modules/Setup for docs on how this works. Setup.local contains our local deviations.
  371. cat > Modules/Setup.local <<-EOF || die
  372. *disabled*
  373. nis
  374. $(usev !gdbm '_gdbm _dbm')
  375. $(usev !sqlite '_sqlite3')
  376. $(usev !ssl '_hashlib _ssl')
  377. $(usev !ncurses '_curses _curses_panel')
  378. $(usev !readline 'readline')
  379. $(usev !tk '_tkinter')
  380. EOF
  381. # Workaround for: undefined symbol error with --no-undefined ldflag
  382. append-ldflags $(no-as-needed)
  383. # disable implicit optimization/debugging flags
  384. local -x OPT=
  385. if tc-is-cross-compiler ; then
  386. build_cbuild_python
  387. myeconfargs+=(
  388. # Point the imminent CHOST build to the Python we just
  389. # built for CBUILD.
  390. --with-build-python="${WORKDIR}"/${P}-${CBUILD}/python
  391. )
  392. fi
  393. # pass system CFLAGS & LDFLAGS as _NODIST, otherwise they'll get
  394. # propagated to sysconfig for built extensions
  395. local -x CFLAGS_NODIST=${CFLAGS}
  396. local -x LDFLAGS_NODIST=${LDFLAGS}
  397. local -x CFLAGS= LDFLAGS=
  398. # Fix implicit declarations on cross and prefix builds. Bug #674070.
  399. if use ncurses; then
  400. append-cppflags -I"${ESYSROOT}"/usr/include/ncursesw
  401. fi
  402. econf "${myeconfargs[@]}"
  403. if grep -q "#define POSIX_SEMAPHORES_NOT_ENABLED 1" pyconfig.h; then
  404. eerror "configure has detected that the sem_open function is broken."
  405. eerror "Please ensure that /dev/shm is mounted as a tmpfs with mode 1777."
  406. die "Broken sem_open function (bug 496328)"
  407. fi
  408. # install epython.py as part of stdlib
  409. echo "EPYTHON='python${PYVER}'" > Lib/epython.py || die
  410. }
  411. src_compile() {
  412. # Ensure sed works as expected
  413. # https://bugs.gentoo.org/594768
  414. local -x LC_ALL=C
  415. export PYTHONSTRICTEXTENSIONBUILD=1
  416. # Save PYTHONDONTWRITEBYTECODE so that 'has_version' doesn't
  417. # end up writing bytecode & violating sandbox.
  418. # bug #831897
  419. local -x _PYTHONDONTWRITEBYTECODE=${PYTHONDONTWRITEBYTECODE}
  420. # Gentoo hack to disable accessing system site-packages
  421. export GENTOO_CPYTHON_BUILD=1
  422. if use pgo ; then
  423. # bug 660358
  424. local -x COLUMNS=80
  425. local -x PYTHONDONTWRITEBYTECODE=
  426. local -x TMPDIR=/tmp
  427. fi
  428. # also need to clear the flags explicitly here or they end up
  429. # in _sysconfigdata*
  430. emake CPPFLAGS= CFLAGS= LDFLAGS= DFLAGS= DFFLAGS=
  431. # Restore saved value from above.
  432. local -x PYTHONDONTWRITEBYTECODE=${_PYTHONDONTWRITEBYTECODE}
  433. # Work around bug 329499. See also bug 413751 and 457194.
  434. if has_version dev-libs/libffi[pax-kernel]; then
  435. pax-mark E python
  436. else
  437. pax-mark m python
  438. fi
  439. }
  440. src_test() {
  441. # Tests will not work when cross compiling.
  442. if tc-is-cross-compiler; then
  443. elog "Disabling tests due to crosscompiling."
  444. return
  445. fi
  446. # this just happens to skip test_support.test_freeze that is broken
  447. # without bundled expat
  448. # TODO: get a proper skip for it upstream
  449. local -x LOGNAME=buildbot
  450. local test_opts=(
  451. --verbose3
  452. -u-network
  453. -j "$(makeopts_jobs)"
  454. "${COMMON_TEST_SKIPS[@]}"
  455. )
  456. # bug 660358
  457. local -x COLUMNS=80
  458. local -x PYTHONDONTWRITEBYTECODE=
  459. local -x TMPDIR=/tmp
  460. nonfatal emake -Onone test EXTRATESTOPTS="${test_opts[*]}" \
  461. CPPFLAGS= CFLAGS= LDFLAGS= < /dev/tty
  462. local ret=${?}
  463. [[ ${ret} -eq 0 ]] || die "emake test failed"
  464. }
  465. src_install() {
  466. local libdir=${ED}/usr/lib/python${PYVER}
  467. # the Makefile rules are broken
  468. # https://github.com/python/cpython/issues/100221
  469. mkdir -p "${libdir}"/lib-dynload || die
  470. # -j1 hack for now for bug #843458
  471. emake -j1 DESTDIR="${D}" TEST_MODULES=no altinstall
  472. # Fix collisions between different slots of Python.
  473. rm "${ED}/usr/$(get_libdir)/libpython3.so" || die
  474. # Cheap hack to get version with ABIFLAGS
  475. local abiver=$(cd "${ED}/usr/include"; echo python*)
  476. if [[ ${abiver} != python${PYVER} ]]; then
  477. # Replace python3.X with a symlink to python3.Xm
  478. rm "${ED}/usr/bin/python${PYVER}" || die
  479. dosym "${abiver}" "/usr/bin/python${PYVER}"
  480. # Create python3.X-config symlink
  481. dosym "${abiver}-config" "/usr/bin/python${PYVER}-config"
  482. # Create python-3.5m.pc symlink
  483. dosym "python-${PYVER}.pc" "/usr/$(get_libdir)/pkgconfig/${abiver/${PYVER}/-${PYVER}}.pc"
  484. fi
  485. # python seems to get rebuilt in src_install (bug 569908)
  486. # Work around it for now.
  487. if has_version dev-libs/libffi[pax-kernel]; then
  488. pax-mark E "${ED}/usr/bin/${abiver}"
  489. else
  490. pax-mark m "${ED}/usr/bin/${abiver}"
  491. fi
  492. rm -r "${libdir}"/ensurepip/_bundled || die
  493. if ! use sqlite; then
  494. rm -r "${libdir}/"sqlite3 || die
  495. fi
  496. if ! use tk; then
  497. rm -r "${ED}/usr/bin/idle${PYVER}" || die
  498. rm -r "${libdir}/"{idlelib,tkinter} || die
  499. fi
  500. ln -s ../python/EXTERNALLY-MANAGED "${libdir}/EXTERNALLY-MANAGED" || die
  501. dodoc Misc/{ACKS,HISTORY,NEWS}
  502. if use examples; then
  503. docinto examples
  504. find Tools -name __pycache__ -exec rm -fr {} + || die
  505. dodoc -r Tools
  506. fi
  507. insinto /usr/share/gdb/auto-load/usr/$(get_libdir) #443510
  508. local libname=$(
  509. printf 'e:\n\t@echo $(INSTSONAME)\ninclude Makefile\n' |
  510. emake --no-print-directory -s -f - 2>/dev/null
  511. )
  512. newins Tools/gdb/libpython.py "${libname}"-gdb.py
  513. newconfd "${FILESDIR}/pydoc.conf" pydoc-${PYVER}
  514. newinitd "${FILESDIR}/pydoc.init" pydoc-${PYVER}
  515. sed \
  516. -e "s:@PYDOC_PORT_VARIABLE@:PYDOC${PYVER/./_}_PORT:" \
  517. -e "s:@PYDOC@:pydoc${PYVER}:" \
  518. -i "${ED}/etc/conf.d/pydoc-${PYVER}" \
  519. "${ED}/etc/init.d/pydoc-${PYVER}" || die "sed failed"
  520. # python-exec wrapping support
  521. local pymajor=${PYVER%.*}
  522. local EPYTHON=python${PYVER}
  523. local scriptdir=${D}$(python_get_scriptdir)
  524. mkdir -p "${scriptdir}" || die
  525. # python and pythonX
  526. ln -s "../../../bin/${abiver}" "${scriptdir}/python${pymajor}" || die
  527. ln -s "python${pymajor}" "${scriptdir}/python" || die
  528. # python-config and pythonX-config
  529. # note: we need to create a wrapper rather than symlinking it due
  530. # to some random dirname(argv[0]) magic performed by python-config
  531. cat > "${scriptdir}/python${pymajor}-config" <<-EOF || die
  532. #!/bin/sh
  533. exec "${abiver}-config" "\${@}"
  534. EOF
  535. chmod +x "${scriptdir}/python${pymajor}-config" || die
  536. ln -s "python${pymajor}-config" "${scriptdir}/python-config" || die
  537. # 2to3, pydoc
  538. ln -s "../../../bin/2to3-${PYVER}" "${scriptdir}/2to3" || die
  539. ln -s "../../../bin/pydoc${PYVER}" "${scriptdir}/pydoc" || die
  540. # idle
  541. if use tk; then
  542. ln -s "../../../bin/idle${PYVER}" "${scriptdir}/idle" || die
  543. fi
  544. }