SUMMARY="An interpreted, interactive, object-oriented programming language" DESCRIPTION="Python is a programming language that lets you work more quickly \ and integrate your systems more effectively. You can learn to use Python and \ see almost immediate gains in productivity and lower maintenance costs. Python runs on Windows, Linux/Unix, Mac OS X, and has been ported to the Java \ and .NET virtual machines. Python is free to use, even for commercial products, because of its \ OSI-approved open source license." HOMEPAGE="https://www.python.org" LICENSE="Python" COPYRIGHT="1990-2023 Python Software Foundation" REVISION="1" SOURCE_URI="https://www.python.org/ftp/python/$portVersion/Python-$portVersion.tar.xz" CHECKSUM_SHA256="01597db0132c1cf7b331eff68ae09b5a235a3c3caa9c944c29cac7d1c4c4c00a" SOURCE_DIR="Python-$portVersion" PATCHES="python3.9-$portVersion.patchset" if [ "$secondaryArchSuffix" = _x86 ] ; then PATCHES+=" python3.9_x86-$portVersion.patchset " fi ARCHITECTURES="all !x86_gcc2 ?x86" SECONDARY_ARCHITECTURES="x86" # On x86_gcc2 we don't want to install the commands in bin//, but in bin/. commandSuffix=$secondaryArchSuffix commandBinDir=$binDir if [ "$targetArchitecture" = x86_gcc2 ]; then commandSuffix= commandBinDir=$prefix/bin fi PROVIDES=" python3.9$secondaryArchSuffix = $portVersion compat >= 3.9 python39$secondaryArchSuffix = $portVersion compat >= 3.9 cmd:2to3_3.9 = $portVersion compat >= 3.9 cmd:idle3.9 = $portVersion compat >= 3.9 cmd:pydoc3.9 = $portVersion compat >= 3.9 cmd:python3.9 = $portVersion compat >= 3.9 cmd:python3.9_config = $portVersion compat >= 3.9 devel:libpython3.9$secondaryArchSuffix = 1.0 lib:libpython3.9$secondaryArchSuffix = 1.0 " REQUIRES=" haiku$secondaryArchSuffix cmd:file lib:libbz2$secondaryArchSuffix lib:libedit$secondaryArchSuffix lib:libexpat$secondaryArchSuffix lib:libffi$secondaryArchSuffix lib:libintl$secondaryArchSuffix lib:liblzma$secondaryArchSuffix lib:libncurses$secondaryArchSuffix lib:libsqlite3$secondaryArchSuffix lib:libssl$secondaryArchSuffix lib:libz$secondaryArchSuffix " BUILD_REQUIRES=" haiku${secondaryArchSuffix}_devel devel:libbz2$secondaryArchSuffix devel:libedit$secondaryArchSuffix devel:libexpat$secondaryArchSuffix devel:libffi$secondaryArchSuffix devel:liblzma$secondaryArchSuffix devel:libncurses$secondaryArchSuffix devel:libsqlite3$secondaryArchSuffix devel:libssl$secondaryArchSuffix devel:libtclstub8.6$secondaryArchSuffix devel:libtk8.6$secondaryArchSuffix devel:libz$secondaryArchSuffix " BUILD_PREREQUIRES=" autoconf_archive cmd:aclocal cmd:autoconf cmd:find cmd:gcc$secondaryArchSuffix cmd:ld$secondaryArchSuffix cmd:libtoolize$secondaryArchSuffix cmd:make cmd:pkg_config$secondaryArchSuffix " GLOBAL_WRITABLE_FILES=" non-packaged/lib/python3.9/site-packages directory keep-old " BUILD() { autoreconf -fi # From ./configure: # "compiler flags are generated in two sets, BASECFLAGS and OPT. OPT is just # for debug/optimization stuff. BASECFLAGS is for flags that are required # just to get things to compile and link." export BASECFLAGS="-D_BSD_SOURCE" # Not exporting OPT ends up with "-g -fwrapv -O3 -Wall" being used, # and using OPT="" means the build ends up being "-O0". export OPT="-fwrapv -O3 -Wall" runConfigure --omit-dirs binDir,includeDir ./configure \ --bindir=$commandBinDir \ --includedir=$developDir/headers \ --enable-optimizations \ --enable-shared \ --with-ensurepip=no \ --with-system-expat \ --with-system-ffi # "configure: WARNING: --with(out)-system-ffi is ignored on this platform" # prevent make from rebuilding stuff that requires python touch Parser/asdl* Python/Python-ast.c Include/Python-ast.h rm -f python # NOTE: When using "--enable-optimizations" above, using "make $jobArgs" might be unreliable. # make clean # Uncomment when doing repeated builds (for testing different flags/options). make $jobArgs } INSTALL() { # altinstall avoids clobbering $prefix/bin/{2to3,idle3,pydoc3,python3,python3-config} make altinstall rm $libDir/libpython3.so if [ "$targetArchitecture" = x86_gcc2 ]; then # On x86_gcc2, move lib-dynload to lib/python3.x/ mv $libDir/python3.9/lib-dynload $prefix/lib/python3.9/ fi prepareInstalledDevelLibs libpython3.9 fixPkgconfig if [ "$targetArchitecture" = x86_gcc2 ]; then # fix pkgconfig to match configure flags sed -i -e 's,headers/x86,headers,' $developLibDir/pkgconfig/python*.pc fi mkdir -p $prefix/lib/python3.9/vendor-packages echo 'This directory contains packaged python modules.' \ >$prefix/lib/python3.9/vendor-packages/README mkdir -p $prefix/non-packaged/lib/python3.9 mv $prefix/lib/python3.9/site-packages $prefix/non-packaged/lib/python3.9/ # drop testsuite altogether; move to a separate package if needed cd $prefix/lib/python3.9 rm -rf ctypes/test distutils/tests idlelib/idle_test lib2to3/tests \ sqlite3/test test tkinter/test unittest/test } # Some of the test will crash, invoking the crash dialog, and will hang waiting for # user's interaction. To avoid that, make sure to configure your system by adding # the following lines in the file "~/config/settings/system/debug_server/settings": ##--- # executable_actions { # /sources/Python-$portVersion/python kill # } ##--- # Replace $portVersion as necessary. # For some tests that purposefully crash, it would make sense to add support for # crash-report suppression (as done for other platforms) on "tests/support/__init__,py"'s # SuppressCrashReport class. # But that needs support from Haiku's debug_server, as we can't change settings from # the recipe's building environment at the moment (https://dev.haiku-os.org/ticket/10301) TEST() { # Remove tests data left-overs, if any rm -f -r /boot/system/cache/tmp/ rm -f -d -r build/test_python* cd Lib/test # distutils is deprecated, and will be removed on 3.12. rm -f test_distutils.py # The following tests invoke the crash dialog, and unless your configure # debug_server default action to "kill" or "report", they will hang waiting for # user input. See comment above TEST(). rm -f test_asyncio/test_futures.py # Crashes: Exception (Segment violation) rm -f test_faulthandler.py rm -f test_subprocess.py # tends to hang. rm -f test_threading.py # tends to hang. # Many of the tests hang/stall. We have two options: # # 1- Manually remove the problematic test-cases. # 2- Set a TIMEOUT. # # Option 1: Works, but requires manual identification/mainteinance. # # Option 2: Doesn't requires maintaining a list of stalling tests, but: # - Causes errors at the end of the run: # "unmounting failed: Device/File/Resource Busy" # - Leaves dangling threads running when the tests timeout: # "Warning -- threading_cleanup() failed to cleanup 0 threads (count: 0, dangling: 2)" # - The time it takes to run the full suite goes from 14 to 30+ minutes, # # For Option 2, use: export EXTRATESTOPTS="--timeout=300" # before calling "make $jobArgs test". # # Let's use Option 1, for now at least: # These hang reliably. # You might want then to manually restore them on re-runs, use: # > git checkout -- Lib/test/ rm -f test__xxsubinterpreters.py rm -f test_asynchat.py rm -f test_concurrent_futures.py rm -f test_importlib/test_threaded_import.py rm -f test_interpreters.py rm -f test_multiprocessing_fork.py rm -f test_multiprocessing_forkserver.py rm -f test_multiprocessing_main_handling.py rm -f test_multiprocessing_spawn.py rm -f test_multiprocessing.py rm -f test_socketserver.py # "test_asyncio" doesn't seems to runs reliably, even after individually skipping # all the problematic test-cases that could be identify by running them one by one. rm -f -r test_asyncio # rm -f test_asyncio/test_base_events.py # rm -f test_asyncio/test_buffered_proto.py # Exception on Exception handler. # rm -f test_asyncio/test_events.py # rm -f test_asyncio/test_sendfile.py # rm -f test_asyncio/test_server.py # Exception on Exception handler. # rm -f test_asyncio/test_sslproto.py # Exception on Exception handler. # rm -f test_asyncio/test_streams.py # These not always hang/stall, but they do it enough to warrant skipping for now. rm -f test_imaplib.py rm -f test_signal.py rm -f test_socket.py rm -f test_ssl.py rm -f test_urllib2_localnet.py cd ../.. # These allows to change what resources tests can use: # export EXTRATESTOPTS="-uall,-largefile,-audio,-gui,-network,-cpu,-urlfetch,-tzdata" # Occasionally, some test fails seemingly due to the racy nature of tempfile.mktemp(). # Even the help for that function says to NOT use it, but some tests still do. # # If you find some strange "æ" suffix on temp dirnames, ej: # "cwd: /sources/Python-3.10.12/build/test_python_10324æ" # That's due to usages of os_helper.FS_NONASCII. make $jobArgs test }