Files
haikuports/dev-lang/python/python3.10-3.10.13.recipe

269 lines
9.2 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="2"
SOURCE_URI="https://www.python.org/ftp/python/$portVersion/Python-$portVersion.tar.xz"
CHECKSUM_SHA256="5c88848668640d3e152b35b4536ef1c23b2ca4bd2c957ef1ecbb053f571dd3f6"
SOURCE_DIR="Python-$portVersion"
pyShortVer="${portVersion%.*}"
pyVersionCompat="$portVersion compat >= $pyShortVer"
PATCHES="python$pyShortVer-$portVersion.patchset"
if [ "$secondaryArchSuffix" = _x86 ] ; then
PATCHES+="
python${pyShortVer}_x86-$portVersion.patchset
"
fi
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
python310$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
cmd:2to3 = $portVersion compat >= $pyShortVer
cmd:idle3 = $portVersion compat >= $pyShortVer
cmd:python3 = $portVersion compat >= $pyShortVer
cmd:pydoc3 = $portVersion compat >= $pyShortVer
cmd:python3_config = $portVersion compat >= $pyShortVer
"
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:libssl$secondaryArchSuffix
lib:libsqlite3$secondaryArchSuffix
lib:libz$secondaryArchSuffix
"
REPLACES="
python310$secondaryArchSuffix
"
BUILD_REQUIRES="
haiku${secondaryArchSuffix}_devel
devel:libbz2$secondaryArchSuffix
devel:libexpat$secondaryArchSuffix
devel:libffi$secondaryArchSuffix
devel:liblzma$secondaryArchSuffix
devel:libncurses$secondaryArchSuffix
devel:libssl$secondaryArchSuffix
devel:libedit$secondaryArchSuffix
devel:libsqlite3$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:pkg_config$secondaryArchSuffix
cmd:make
"
BUILD()
{
autoupdate
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-readline=editline \
--with-system-expat \
--with-system-ffi
# configure: WARNING: --with(out)-system-ffi is ignored on this platform
# --with-lto # this one is too CPU/RAM intensive.
# 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()
{
make install
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/
# drop testsuite altogether; move to a separate package if needed
cd $prefix/lib/python$pyShortVer
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
}