Files
haikuports/dev-lang/python/python3.13-3.13.3.recipe

464 lines
16 KiB
Bash

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-2025 Python Software Foundation"
REVISION="1"
SOURCE_URI="https://www.python.org/ftp/python/$portVersion/Python-$portVersion.tar.xz"
CHECKSUM_SHA256="40f868bcbdeb8149a3149580bb9bfd407b3321cd48f0be631af955ac92c0e041"
SOURCE_DIR="Python-$portVersion"
pyShortVer="${portVersion%.*}"
pyVersionCompat="$portVersion compat >= $pyShortVer"
PATCHES="python$pyShortVer-$portVersion.patchset"
ARCHITECTURES="all !x86_gcc2"
SECONDARY_ARCHITECTURES="x86"
# On x86_gcc2 we don't want to install the commands in bin/<arch>/, but in bin/.
commandSuffix=$secondaryArchSuffix
commandBinDir=$binDir
if [ "$targetArchitecture" = x86_gcc2 ]; then
commandSuffix=
commandBinDir=$prefix/bin
fi
GLOBAL_WRITABLE_FILES="
non-packaged/lib/python$pyShortVer/site-packages directory keep-old
"
# [RECIPE OPTIONS]>>>
# If this is not intended to be the "default" Python version, set to "false", so "make altinstall"
# is used, and only version-suffixed commands are used in PROVIDES.
installAsDefaultPython=false
# Set to "true" if we should build the "tkinter" module.
# Disabled for now, as tkinter deadlocks on Haiku. Try again when tk drops undroidwish for xlibe.
enableTkinter=false
# Set to "true" to package all the tests into a separate "_tests" package (around 30 MB in size).
# Tests are discarded if set to "false".
packageTests=false
# Set to "false" for faster local/test builds. Around 4 to 5 times faster that way.
optimizedBuild=true
# Generally, we disable parallel builds if "optimizedBuild == true" as they can fail.
forceParallelBuild=true
# Run all tests by default. Set to "true" to make "hp --test" only run then known failing tests.
runOnlyKnownFailingTests=false
# Run only the tests that are generally excluded. Expect LOTS of hangs/crashes/etc.
runOnlyExcludedTests=false
# <<<[RECIPE OPTIONS]
PROVIDES="
python$pyShortVer$secondaryArchSuffix = $pyVersionCompat
cmd:pydoc$pyShortVer = $pyVersionCompat
cmd:python$pyShortVer = $pyVersionCompat
cmd:python${pyShortVer}_config = $pyVersionCompat
devel:libpython$pyShortVer$secondaryArchSuffix = 1.0
lib:libpython$pyShortVer$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:libmpdec$secondaryArchSuffix # bundled libmpdecimal scheduled for removal on 3.15
lib:libncursesw$secondaryArchSuffix
lib:libsqlite3$secondaryArchSuffix # >= 3.15.2
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:libmpdec$secondaryArchSuffix # bundled libmpdecimal scheduled for removal on 3.15
devel:libncursesw$secondaryArchSuffix
devel:libsqlite3$secondaryArchSuffix
devel:libssl$secondaryArchSuffix
devel:libz$secondaryArchSuffix
"
BUILD_PREREQUIRES="
autoconf_archive
cmd:aclocal # >= 1.16.4
cmd:autoconf # >= 2.71
cmd:find
cmd:gcc$secondaryArchSuffix
cmd:ld$secondaryArchSuffix
cmd:libtoolize$secondaryArchSuffix
cmd:make
cmd:pkg_config$secondaryArchSuffix
"
if $installAsDefaultPython; then
PROVIDES+="
cmd:python3 = $portVersion compat >= $pyShortVer
cmd:pydoc3 = $portVersion compat >= $pyShortVer
cmd:python3_config = $portVersion compat >= $pyShortVer
"
fi
if $enableTkinter; then
PROVIDES+="
cmd:idle$pyShortVer = $pyVersionCompat
"
if $installAsDefaultPython; then
PROVIDES+="
cmd:idle3 = $portVersion compat >= $pyShortVer
"
fi
BUILD_REQUIRES+="
devel:libtclstub8.6$secondaryArchSuffix
devel:libtk8.6$secondaryArchSuffix
"
fi
if $packageTests; then
PROVIDES_tests="
python$pyShortVer${secondaryArchSuffix}_tests = $portVersion
"
REQUIRES_tests="
python$pyShortVer$secondaryArchSuffix == $portVersion base
"
fi
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."
# If not provided, the Makefile ends up with:
# BASECFLAGS= -fno-strict-overflow -Wsign-compare
# OPT= -DNDEBUG -g -O3 -Wall
# -NDEBUG gets added by ./configure unless "--with-assertions" is used.
export BASECFLAGS="-pipe -D_BSD_SOURCE"
export OPT="-Wall" # remove "-g" until we use "defineDebugInfoPackage".
if $optimizedBuild; then
export OPT+=" -O3"
maybeEnableOptimizations="--enable-optimizations"
else
export OPT+=" -O0"
maybeEnableOptimizations=
fi
runConfigure --omit-dirs binDir,includeDir ./configure \
--bindir=$commandBinDir \
--includedir=$developDir/headers \
$maybeEnableOptimizations \
--enable-shared \
--with-ensurepip=no \
--with-readline=editline \
--with-system-expat \
--with-system-libmpdec=no \
--with-tzpath=$(findpaths -c : B_FIND_PATH_DATA_DIRECTORY zoneinfo) \
--without-static-libpython \
--with-lto
# --disable-test-modules # can speed up the build a bit.
#
# --with-lto # Issues with enabling this flag:
# - Is too CPU intensive (at least 2.5x slower build times).
# - 30% final package size increase, unless "-g" is removed from 'LTOFLAGS="$LTOFLAGS -g"'
# on "configure.ac".
# but resulting Python is about 5% faster, at least on the "pystone.py" syntetic benchmark.
#
# --enable-experimental-jit=yes-off # PYTHON_JIT=1 to enable it at runtime. Requires:
# - cmd:python3.11 or newer.
# - cmd:clang >= 18
# - patching Tools/jit/_target.py so it recognizes Haiku's triplet.
# Uncomment when doing repeated builds (for testing different flags/options).
# echo "[.recipe] Cleaning before rebuild:" && make clean && rm -f python
# NOTE: When using "--enable-optimizations" above, using "make $jobArgs" might be unreliable.
# Can see several instances of, for example:
#
# libgcov profiling error:/sources/Python-3.xx.x/Objects/<filename_here>.gcda:Merge mismatch for function <some_number>
#
# Build might end OK (with only some "missing profile" warnings later on), or it can fail
# with something like:
#
# "Parser/parser.c:38718:1: error: corrupted profile info: invalid time profile"
#
# Not using multiple jobs for make solves both the warnings and the possible error.
if $optimizedBuild && ! $forceParallelBuild; then
echo "Running make with: -j 1"
make -j 1
else
echo "Running make with: $jobArgs"
make $jobArgs
fi
}
INSTALL()
{
if $installAsDefaultPython; then
make install
else
# altinstall avoids clobbering $prefix/bin/{idle3,pydoc3,python3,python3-config}
make altinstall
fi
rm $libDir/libpython3.so
# No point in having this if we don't have a working tkinter.
if ! $enableTkinter; then
rm $prefix/bin/idle$pyShortVer
if $installAsDefaultPython; then
rm -f $prefix/bin/idle3
fi
fi
if [ "$targetArchitecture" = x86_gcc2 ]; then
# On x86_gcc2, move lib-dynload to lib/python3.x/
mv $libDir/python$pyShortVer/lib-dynload $prefix/lib/python$pyShortVer/
fi
prepareInstalledDevelLib libpython$pyShortVer
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/python$pyShortVer/vendor-packages
echo 'This directory contains packaged python modules.' \
>$prefix/lib/python$pyShortVer/vendor-packages/README
mkdir -p $prefix/non-packaged/lib/python$pyShortVer
mv $prefix/lib/python$pyShortVer/site-packages $prefix/non-packaged/lib/python$pyShortVer/
if $packageTests; then
packageEntries tests \
$prefix/lib/python$pyShortVer/idlelib/idle_test \
$prefix/lib/python$pyShortVer/test
else
# drop testsuite altogether
cd $prefix/lib/python$pyShortVer
rm -rf idlelib/idle_test test
fi
}
# 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-3.*/python kill
# }
##---
# 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)
# To see the available test-runs options:
# > hp -E python3.nn
# > LIBRARY_PATH=%A:/boot/system/lib python -m test --help
# or:
# > LD_PRELOAD=./libpython3.nn.so.1.0 python -m test --help
#
# To only execute a particular test (from the $sourceDir):
#
# > LD_PRELOAD=./libpython3.nn.so.1.0 python -m test test_datetime -W
#
# Beware that running tests that way can cause some tests to fail, while they work fine under
# "hp --test"'s chroot. (test_sysconfig.MakefileTests.test_parse_makefile, for example).
# Problem is "os.getcwd()" will return wrong data, causing some file operations to fail.
# For reference, results on hrev57937+129 (64 bits, VMware, no-RAMFS):
# Total duration: 9 min 42 sec
# Total tests: run=40,337 failures=672 skipped=1,798
# Total test files: run=465/445 failed=27 skipped=32 resource_denied=7 rerun=27
TEST()
{
# Remove tests data left-overs, if any:
# rm -f -r /boot/system/cache/tmp/
# rm -f -d -r build/test_python*
make $jobArgs test EXTRATESTOPTS="--cleanup"
local test_options=(
# Use this to get same test order on different runs (actual value not important).
-r
--randseed 7858065
# Print the names of the 10 slowest tests.
--slowest
# Possibly useful?
# --tempdir=/another_drive/tmp
# Enable/disable certain tests by "resource" type:
# -uall,-audio,-cpu,-curses,-decimal,-gui,-largefile,-network,-subprocess,-urlfetch
# make test --help says that "-unone" is the default, but the build is doing this:
# "resources: all,-audio,-gui,-largefile" instead.
#
# Let's be explicit to avoid surprises:
-unone,curses,tzdata
)
local tests_to_exclude=(
# 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().
-x test_threading # tends to hang (or at least run for more than 5 minutes).
# Many of the tests hang/stall. We have two options:
#
# 1- Manually remove the problematic test-cases.
# 2- Set a TIMEOUT (eg: --timeout=300).
#
# Option 1: Works, but requires manual identification/mainteinance.
#
# Option 2: Doesn't requires maintaining a list of stalling tests, but:
# at the end of the test run it causes:
# - "unmounting failed: Device/File/Resource Busy" errors, as there are
# dangling threads running when the tests timeout (requiring `killall python`)
# - The time it takes to run the full suite largely increases.
#
# Let's use Option 1, for now at least.
# These hang reliably.
-x test_interpreters
-x test_multiprocessing_spawn
-x test_threaded_import # test_importlib.test_threaded_import
# The following are all under test_asyncio/
-x test_base_events
-x test_buffered_proto # Exception on Exception handler.
-x test_events
-x test_sendfile
-x test_server # Exception on Exception handler.
-x test_sock_lowlevel
-x test_sslproto # Exception on Exception handler.
-x test_streams
-x test_unix_events
# These not always hang/stall, but they do it enough to warrant skipping for now.
-x test_multiprocessing_fork #? resource_tracker: process died unexpectedly
-x test_multiprocessing_forkserver #?
-x test_socket
-x test_ssl # pegs one core to 100$
# 3.11.8 / 3.12.2 (hang on nightlies, at least)
-x test_httplib
-x test_logging
# Fails while outputing "ResourceWarning: unclosed <ssl.SSLSocket", but takes anywhere
# between 1 to 3+ minutes to end (and gets re-run!). Run it manually if needed, or
# re-enable once those SSLSocket warninings, that also pop up on other tests, get resolved.
-x test_ftplib # Shouldn't be enabled unless network-resource is granted.
# 3.12.6, on beta5
-x test_readline # hangs when running tests in parallel (or as part of the suite, at least).
# 3.12.10 (still on 3.13.3)
-x test_glob # sometimes hangs.
-x test_kqueue # hangs sometimes.
# hang on beta5 64 bits VM (no network connected):
-x test_httpservers
-x test_poplib
-x test_xmlrpc
)
local tests_that_fail=(
test__locale
test_c_locale_coercion
test_cmd
test_ctypes # stupid test compares wording of error message.
# test_compile # out of memory (with 2 GB of RAM)
test_datetime # on rare ocassions, it passes.
test_fcntl # "Permission denied" in test_lockf_exclusive
test_genericpath # os.path.getatime() should return an int.
test_glob # sometimes hangs.
test_importlib
test_json # "AssertionError: 13 != -2147459059" (errno.EPIPE)
test_kqueue # hangs.
test_mailbox # fails to clean a temp file? (os.utime() related?)
test_math # test expects to get -0.0, gets 0.0
test_os # named pipes related errors. set_get_priority, ttyname, and utime fails.
test_popen # sign error numbers in waitstatus_to_exitcode()... "AssertionError: -42 != 42"
test_posix # test_posix_fallocate and test_link_dir_fd. Operation not supported.
test_pty # sometimes fails.
test_pyrepl # several: "module 'termios' has no attribute 'VREPRINT'". Adding hasattr(termios, 'VREPRINT') still results in error.
test_re # locale related failures.
test_readline # hangs sometimes (when run in parallel with test_pty, I think).
test_shutil # "Operation not supported" calling "os.scandir(topfd)".
test_signal # stupid test compares wording of strsignal(signal.SIGTERM).
test_strptime # locale related failures.
test_subprocess # "Device/File/Resource busy" calling setrlimit()
test_sysconfig # venv related failures.
test_tarfile # os.path.getmtime() should return an int. Also, path.stat().st_mtime and pathlib.Path(TEMPDIR).stat().st_mtime seems to be using different scales: 1723.215266 vs 1723215266.0319815
test_termios # tcdrain/tcflow/tcflush/tcsendbreak related failures.
test_time # ctime/mktime related failures.
test_tools # _strptime / "%z" related.
test_venv
)
# besides the above ones, the following only fail when the workdir is in RAMFS:
local tests_that_fail_only_on_ramfs=(
test.test_concurrent_futures.test_as_completed
test.test_concurrent_futures.test_deadlock
test.test_concurrent_futures.test_init
test.test_concurrent_futures.test_process_pool
test.test_concurrent_futures.test_shutdown
test.test_concurrent_futures.test_wait
test_multiprocessing_main_handling # "IsADirectoryError" when calling "subprocess._execute_child()"
test_pathlib
test_smtplib
test_stat
)
# test_freeze_simple_script is auto-skipped on PGO builds.
if ! $optimizedBuild; then
# This skips tests_tools.test_freeze, copied from Gentoo's ebuild.
local -x LOGNAME=buildbot
fi
if $runOnlyExcludedTests; then
make $jobArgs test EXTRATESTOPTS="${test_options[*]} ${tests_to_exclude[*]}"
elif $runOnlyKnownFailingTests; then
make $jobArgs test EXTRATESTOPTS="${test_options[*]} ${tests_that_fail[*]}"
else
# Runs the full test suite (minus the tests that we explicitly exclude).
make $jobArgs test EXTRATESTOPTS="${test_options[*]} ${tests_to_exclude[*]}"
fi
# 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.nn.nn/build/test_python_10324æ"
# That's due to usages of os_helper.FS_NONASCII.
}