mirror of
https://github.com/yann64/haikuports.git
synced 2026-04-09 05:10:05 +02:00
python3.14: new recipe. (#11298)
* python3.14: new recipe. First alpha release. Final 3.14.0 version expected next year. Only tested unoptimized 64 bits builds so far. * python3.14: update to alpha2. Works on 32 bits now! * python3.14: update to alpha3. * python3.14: update to alpha4. Removed patch for `config.guess`, as it is now not needed. * python3.14: update to alpha5. * python3.14: make sure 'spawn' is used and not 'forkserver'. * python3.14: update to alpha6. * python3.14: update to alpha7. * python3.14: update to 3.14.0 beta1.
This commit is contained in:
1142
dev-lang/python/patches/python3.14-3.14.0~b1.patchset
Normal file
1142
dev-lang/python/patches/python3.14-3.14.0~b1.patchset
Normal file
File diff suppressed because it is too large
Load Diff
469
dev-lang/python/python3.14-3.14.0~b1.recipe
Normal file
469
dev-lang/python/python3.14-3.14.0~b1.recipe
Normal file
@@ -0,0 +1,469 @@
|
||||
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.14 -m ensurepip --altinstall
|
||||
> python3.14 -m pip install --upgrade pip
|
||||
|
||||
And then you should be able to use \"pip3.14\" 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%~b1}/Python-${portVersion/'~'/}.tar.xz"
|
||||
CHECKSUM_SHA256="2ddd30a77c9f62e065ce648664a254b9b0c011bcdaa8c1c2787087e644cbeb39"
|
||||
SOURCE_DIR="Python-${portVersion/'~'/}"
|
||||
|
||||
pyShortVer="${portVersion%~b1}"
|
||||
pyShortVer="${pyShortVer%.*}"
|
||||
pyVersionCompat="${portVersion%~b1} 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 = $pyVersionCompat
|
||||
cmd:pydoc3 = $pyVersionCompat
|
||||
cmd:python3_config = $pyVersionCompat
|
||||
"
|
||||
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
|
||||
|
||||
# use --enable-safety/--enable-slower-safety? (the first should have no performance impact)
|
||||
|
||||
# --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 for 3.14.0b1 on hrev57937+129 (64 bits VMware):
|
||||
# Total duration: 12 min 33 sec
|
||||
# Total tests: run=41,364 failures=673 skipped=1,941
|
||||
# Total test files: run=478/454 failed=29 skipped=33 resource_denied=7 rerun=31
|
||||
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=(
|
||||
# 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
|
||||
-x test_threading # tends to hang (or at least run for more than 5 minutes).
|
||||
|
||||
# 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.14.0a5 (killed it after 12 minutes, might try to re-enable after the spawn vs forkserver patch)
|
||||
-x test__interpreters
|
||||
|
||||
# 3.14.0b1
|
||||
-x test_mailbox # Sometimes it takes >5 minutes.
|
||||
)
|
||||
|
||||
local tests_that_fail=(
|
||||
test.test_concurrent_futures.test_process_pool
|
||||
test__locale
|
||||
test_c_locale_coercion
|
||||
test_cmd
|
||||
test_ctypes # stupid test compares wording of error message.
|
||||
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_importlib
|
||||
test_ioctl
|
||||
test_json # "AssertionError: 13 != -2147459059" (errno.EPIPE)
|
||||
# test_mailbox # fails to clean a temp file? (os.utime() related?). Sometimes it takes >5 minutes.
|
||||
test_math # test expects to get -0.0, gets 0.0
|
||||
test_ntpath
|
||||
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_posixpath
|
||||
test_pyrepl # several: "module 'termios' has no attribute 'VREPRINT'". Adding hasattr(termios, 'VREPRINT') still results in error.
|
||||
test_re # locale related failures.
|
||||
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_interpreter_pool
|
||||
test.test_concurrent_futures.test_shutdown
|
||||
test.test_concurrent_futures.test_wait
|
||||
)
|
||||
|
||||
# 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.
|
||||
}
|
||||
Reference in New Issue
Block a user