mirror of
https://github.com/yann64/haikuports.git
synced 2026-04-09 13:20:08 +02:00
- Replaced some prefix spaces with tabs. - Added pip instructions to the package description. Just some non-functional changes to try and trigger a new build on the x86_64 builder (might fail again if the work-dir still wasn't manually cleaned).
482 lines
17 KiB
Bash
482 lines
17 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.
|
|
|
|
Note: to install \"pip\" for this Python version, use the following commands:
|
|
|
|
> python3.13 -m ensurepip --altinstall
|
|
> python3.13 -m pip install --upgrade pip
|
|
|
|
And then you should be able to use \"pip3.13\" normally."
|
|
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="93e583f243454e6e9e4588ca2c2662206ad961659863277afcdb96801647d640"
|
|
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: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: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 --with-lto"
|
|
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
|
|
# --disable-test-modules # can speed up the build a bit.
|
|
#
|
|
# --with-lto # Issues with enabling this flag:
|
|
# - Is very 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, RAMFS):
|
|
# Total duration: 14 min 29 sec
|
|
# Total tests: run=38,756 failures=662 skipped=1,811
|
|
# Total test files: run=470/439 failed=37 skipped=31 resource_denied=7 rerun=38
|
|
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=(
|
|
# --single-process
|
|
|
|
# Use this to get same test order on different runs (actual value not important).
|
|
--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
|
|
|
|
# 3.13.5 (on hrev58907, using ramfs, at least)
|
|
-x test_smtplib # seems to dead-lock sometimes (0% CPU usage on some "pthread func")
|
|
-x test_signal # seems to dead-lock sometimes (0% CPU usage on some "pthread func")
|
|
-x test_unittest # 100% CPU usage on one core.
|
|
|
|
# 3.13.5 hang at least once (on beta5, using ramfs, at least).
|
|
-x test_urllib2_localnet
|
|
-x test_imaplib
|
|
-x test_docxmlrpc # hang on next run after disabling the ones above.
|
|
)
|
|
|
|
local tests_that_fail=(
|
|
test__locale # fails on 'test_alt_digits_nl_langinfo' and 'test_era_nl_langinfo'
|
|
test_ast # seg-faulted at least once on 'test_recursion_direct'
|
|
test_c_locale_coercion
|
|
test_call # seg-faulted at least once on 'test_super_deep' (recursion related)
|
|
test_cmd # "Bad file descriptor" on 'test_basic_completion'
|
|
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_functools # seg-faulted at least once on 'test_lru_recursion'
|
|
# test_genericpath # os.path.getatime() should return an int.
|
|
# test_glob # sometimes hangs.
|
|
test_importlib # "Invalid Argument" on _os.getcwd(). RAMFS or chroot related?
|
|
test_ioctl # B_ERROR on "fcntl.ioctl(wfd, termios.TCFLSH, termios.TCIFLUSH)"
|
|
test_json # "AssertionError: 13 != -2147459059" (errno.EPIPE)
|
|
# test_kqueue # hangs (on nightlies only?).
|
|
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. (ToDo, back-port patch from 3.14)
|
|
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 # '/boot/system/cache/tmp/test_python_[...]/bin/python' can't find libpython3.13.so.1.0.
|
|
)
|
|
|
|
# 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 test EXTRATESTOPTS="${test_options[*]} ${tests_to_exclude[*]}"
|
|
elif $runOnlyKnownFailingTests; then
|
|
make test EXTRATESTOPTS="${test_options[*]} ${tests_that_fail[*]}"
|
|
else
|
|
# Runs the full test suite (minus the tests that we explicitly exclude).
|
|
make 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.
|
|
}
|