Files
haikuports/dev-lang/python/python3.12-3.12.1.recipe
2023-12-11 08:25:15 +01:00

324 lines
11 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-2023 Python Software Foundation"
REVISION="1"
SOURCE_URI="https://www.python.org/ftp/python/$portVersion/Python-${portVersion}.tar.xz"
CHECKSUM_SHA256="8dfb8f426fcd226657f9e2bd5f1e96e53264965176fa17d32658e873591aeb21"
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
"
PROVIDES="
python$pyShortVer$secondaryArchSuffix = $pyVersionCompat
cmd:2to3_$pyShortVer = $pyVersionCompat
cmd:idle$pyShortVer = $pyVersionCompat
cmd:pydoc$pyShortVer = $pyVersionCompat
cmd:python$pyShortVer = $pyVersionCompat
cmd:python${pyShortVer}_config = $pyVersionCompat
cmd:pyvenv_$pyShortVer = $pyVersionCompat
devel:libpython$pyShortVer$secondaryArchSuffix = 1.0
lib:libpython$pyShortVer$secondaryArchSuffix = 1.0
"
REQUIRES="
haiku$secondaryArchSuffix
timezone_data
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
cmd:python3 >= 3.10 # because using `export PYTHON_FOR_REGEN="./python"` is just unreliable.
"
# For some reason, test_zoneinfo fails to find it when running the tests inside the chroot,
# but works when calling the test with an installed Python 3.12.
TEST_REQUIRES="
timezone_data
"
# If set to "yes", the resulting "_tests" package is around 30 MB in size.
packageTests="no"
if [ "$packageTests" = "yes" ]; 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."
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"
# Unless cmd:python3 >= 3.10 is available (by being listed on BUILD_PREREQUIRES), we'll
# get "python3: command not found" when the build tries to generate some files.
# We can force the use of the "./python" built on the chroot instead:
# export PYTHON_FOR_REGEN="./python"
# But using that ocassionally fails with:
# "runtime_loader: Cannot open file libpython3.12.so.1.0 (needed by /sources/Python-3.12.0/python): No such file or directory"
# Perhaps this alternative might work?:
# export PYTHON_FOR_REGEN="LD_PRELOAD=./libpython3.12.so.1.0 ./python"
runConfigure --omit-dirs binDir,includeDir ./configure \
--bindir=$commandBinDir \
--includedir=$developDir/headers \
--enable-optimizations \
--enable-shared \
--with-ensurepip=no \
--with-readline=editline \
--with-system-expat \
--with-tzpath=$dataDir/zoneinfo \
--without-static-libpython
# --with-lto # this one is too CPU/RAM intensive.
# Uncomment when doing repeated builds (for testing different flags/options).
# 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/unicodeobject.gcda:Merge mismatch for function 477
# libgcov profiling error:/sources/Python-3.xx.x/Objects/obmalloc.gcda:Merge mismatch for function 23
#
# 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.
# make $jobArgs
make -j 1
}
INSTALL()
{
# altinstall avoids clobbering $prefix/bin/{2to3,idle3,pydoc3,python3,python3-config}
make altinstall
# Remove this one for "make altinstall" Python versions on Haiku.
rm $libDir/libpython3.so
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
prepareInstalledDevelLibs 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" = "yes" ]; 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.12
# > LIBRARY_PATH=/sources/Python-3.12.0:%A/lib:/boot/home/config/non-packaged/lib:/boot/home/config/lib:/boot/system/non-packaged/lib:/boot/system/lib python -m test --help
# or just:
# > LD_PRELOAD=./libpython3.12.so.1.0 python -m test --help
#
# To only execute a particular test (from the $sourceDir):
#
# > LD_PRELOAD=./libpython3.12.so.1.0 python -m test test_datetime -W
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).
--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
# 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_faulthandler
-x test_futures # from test_asyncio. Crashes: Exception (Segment violation)
-x test_subprocess # tends to hang.
-x test_threading # tends to hang.
# Many of the tests hang/stall. We have two options:
#
# 1- Manually remove the problematic test-cases.
# 2- Set a TIMEOUT (ej: --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")
#
# Let's use Option 1.
# These hang reliably.
-x test__xxsubinterpreters
-x test_cmd_line
-x test_concurrent_futures
-x test_eintr
-x test_interpreters
-x test_multiprocessing_fork
-x test_multiprocessing_forkserver
-x test_multiprocessing_main_handling
-x test_multiprocessing_spawn
-x test_os
-x test_posix
-x test_random
-x test_socketserver
-x test_threaded_import # test_importlib/test_threaded_import
-x test_tracemalloc
-x test_uuid
# "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.
# -x test_asyncio
# 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
# -i TestThreadedServer # in test_asyncio.functioonal
# These not always hang/stall, but they do it enough to warrant skipping for now.
-x test_imaplib
-x test_signal
-x test_socket
-x test_ssl
-x test_urllib2_localnet
# 3.11
-x test_urllib2net
-x test_venv
# 3.12 Either too slow or hangs;
-x test_builtin
-x test_mailbox
-x test_tempfile
-x test_thread
# 3.12.1
-x test_queue
)
local -x LOGNAME=buildbot # this skips tests_tools/test_freeze, copied from Gentoo's ebuild
make $jobArgs test EXTRATESTOPTS="${test_options[*]}"
}