mirror of
https://github.com/yann64/haikuports.git
synced 2026-04-09 13:20:08 +02:00
"Of course they release a new version the same day I updated the previous one" edition. At least gives me an excuse to finally drop the 3.9 recipe for good. RIP 3.9! You weren't loved, but were useful nonetheless!
508 lines
18 KiB
Bash
508 lines
18 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.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/Python-$portVersion.tar.xz"
|
|
CHECKSUM_SHA256="ce543ab854bc256b61b71e9b27f831ffd1bfd60a479d639f8be7f9757cf573e9"
|
|
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=false
|
|
|
|
# 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
|
|
|
|
# Exclude known slow tests. Handy on slow hardware.
|
|
excludeSlowTests=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:libuuid$secondaryArchSuffix
|
|
lib:libssl$secondaryArchSuffix
|
|
lib:libz$secondaryArchSuffix
|
|
lib:libzstd$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:libuuid$secondaryArchSuffix
|
|
devel:libz$secondaryArchSuffix
|
|
devel:libzstd$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" # -Wno-profile-instr-unprofiled
|
|
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 unoptimized 3.14.0b4 on hrev57937+129 (64 bits VMware, RAMFS):
|
|
# Total duration: 33 min 21 sec
|
|
# Total tests: run=40,723 failures=680 skipped=1,976
|
|
# Total test files: run=481/451 failed=35 skipped=33 resource_denied=7 rerun=37
|
|
|
|
# For reference, results for unoptimized 3.14.0rc2 on hrev59030 (32 bits VMware, RAMFS):
|
|
# Total duration: 45 min 44 sec
|
|
# Total tests: run=40,470 failures=613 skipped=1,994
|
|
# Total test files: run=469/451 failed=24 skipped=33 resource_denied=7 rerun=25
|
|
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=(
|
|
# 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.
|
|
|
|
# 3.14.0b4 these hang at least once on beta5 64 bits VMware.
|
|
-x test_concurrent_futures.test_interpreter_pool
|
|
-x test_imaplib
|
|
-x test_unittest
|
|
-x test_urllib2_localnet
|
|
|
|
# 3.14.1 this takes > 11 minutes (and possible hang)
|
|
-x test_concurrent_futures.test_interpreter_pool
|
|
)
|
|
|
|
local very_slow_tests=(
|
|
# These do not hang, but take >5 to 11 minutes each (sorted in "slowest first" order).
|
|
-x test_multiprocessing_main_handling
|
|
-x test_regrtest
|
|
-x test_concurrent_futures.test_shutdown
|
|
-x test_random
|
|
-x test_concurrent_futures.test_deadlock
|
|
-x test_compileall
|
|
-x test_concurrent_futures.test_process_pool
|
|
-x test_tarfile
|
|
-x test_cmd_line
|
|
-x test_pbd
|
|
)
|
|
|
|
local tests_that_fail=(
|
|
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. OK on RAMFS? (OK on hrev59030 32 bits RAMFS?)
|
|
test_importlib
|
|
test_ioctl # B_ERROR calling "fcntl.ioctl(wfd, termios.TCFLSH, termios.TCIFLUSH)"
|
|
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 (OK on hrev59030 32 bits RAMFS?)
|
|
# test_multiprocessing_main_handling # (OK on hrev59030 32 bits RAMFS?)
|
|
test_os # named pipes related errors. set_get_priority, ttyname, and utime fails.
|
|
# test_pathlib # only on RAMFS? (OK on hrev59030 32 bits RAMFS?)
|
|
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_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_smtplib # Sometimes fails.
|
|
# test_stat # RAMFS only? (OK on hrev59030 32 bits RAMFS?)
|
|
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. (OK on hrev59030 32 bits RAMFS?)
|
|
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 # on hrev59030 32 bits RAMFS failed once.
|
|
# 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[*]}"
|
|
elif $excludeSlowTests; then
|
|
make $jobArgs test EXTRATESTOPTS="${test_options[*]} ${tests_to_exclude[*]} ${very_slow_tests[*]}"
|
|
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.
|
|
}
|