From 1ca51b7d3c887816fe89e55a5b1fd1fe6bdcb48f Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Sat, 5 Oct 2019 11:23:03 +0200 Subject: [PATCH] python38: add recipe for version 3.8.0~rc1. disable register_at_fork in Lib/logging/__init__.py to workaround deadlocks with multijobs build. --- .../python/patches/python3-3.8.0.patchset | 756 ++++++++++++++++++ .../python/patches/python3_x86-3.8.0.patchset | 45 ++ dev-lang/python/python38-3.8.0~rc1.recipe | 153 ++++ 3 files changed, 954 insertions(+) create mode 100644 dev-lang/python/patches/python3-3.8.0.patchset create mode 100644 dev-lang/python/patches/python3_x86-3.8.0.patchset create mode 100644 dev-lang/python/python38-3.8.0~rc1.recipe diff --git a/dev-lang/python/patches/python3-3.8.0.patchset b/dev-lang/python/patches/python3-3.8.0.patchset new file mode 100644 index 000000000..f3c9ceab9 --- /dev/null +++ b/dev-lang/python/patches/python3-3.8.0.patchset @@ -0,0 +1,756 @@ +From a98a3ada8aa548353cc3c8c30f3249ca9e0a5f8a Mon Sep 17 00:00:00 2001 +From: Jerome Duval +Date: Thu, 10 Apr 2014 16:03:33 +0000 +Subject: initial Haiku patch + + +diff --git a/Include/pyport.h b/Include/pyport.h +index 71f5794..ba221b0 100644 +--- a/Include/pyport.h ++++ b/Include/pyport.h +@@ -828,7 +828,7 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; + # define _Py_FORCE_UTF8_LOCALE + #endif + +-#if defined(_Py_FORCE_UTF8_LOCALE) || defined(__APPLE__) ++#if defined(_Py_FORCE_UTF8_LOCALE) || defined(__APPLE__) || defined(__HAIKU__) + /* Use UTF-8 as filesystem encoding */ + # define _Py_FORCE_UTF8_FS_ENCODING + #endif +diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py +index c625c95..fd16af0 100644 +--- a/Lib/distutils/command/install.py ++++ b/Lib/distutils/command/install.py +@@ -43,6 +43,27 @@ INSTALL_SCHEMES = { + 'data' : '$base', + }, + 'nt': WINDOWS_SCHEME, ++ 'haiku': { ++ 'purelib': '$base/non-packaged/lib/python$py_version_short/site-packages', ++ 'platlib': '$platbase/non-packaged/lib/python$py_version_short/site-packages', ++ 'headers': '$base/non-packaged/develop/headers/python$py_version_short/$dist_name', ++ 'scripts': '$base/non-packaged/bin', ++ 'data' : '$base/non-packaged', ++ }, ++ 'haiku_vendor': { ++ 'purelib': '$base/lib/python$py_version_short/vendor-packages', ++ 'platlib': '$platbase/lib/python$py_version_short/vendor-packages', ++ 'headers': '$base/develop/headers/python$py_version_short/$dist_name', ++ 'scripts': '$base/bin', ++ 'data' : '$base', ++ }, ++ 'haiku_home': { ++ 'purelib': '$base/lib/python', ++ 'platlib': '$base/lib/python', ++ 'headers': '$base/develop/headers/python/$dist_name', ++ 'scripts': '$base/bin', ++ 'data' : '$base', ++ }, + } + + # user site schemes +@@ -64,6 +85,14 @@ if HAS_USER_SITE: + 'data' : '$userbase', + } + ++ INSTALL_SCHEMES['haiku_user'] = { ++ 'purelib': '$usersite', ++ 'platlib': '$usersite', ++ 'headers': '$userbase/develop/headers/python$py_version_short/$dist_name', ++ 'scripts': '$userbase/bin', ++ 'data' : '$userbase', ++ } ++ + # The keys to an installation scheme; if any new types of files are to be + # installed, be sure to add an entry to every installation scheme above, + # and to SCHEME_KEYS here. +@@ -408,10 +437,16 @@ class install(Command): + raise DistutilsPlatformError( + "User base directory is not specified") + self.install_base = self.install_platbase = self.install_userbase +- self.select_scheme("unix_user") ++ if sys.platform.startswith('haiku'): ++ self.select_scheme("haiku_user") ++ else: ++ self.select_scheme("unix_user") + elif self.home is not None: + self.install_base = self.install_platbase = self.home +- self.select_scheme("unix_home") ++ if sys.platform.startswith('haiku'): ++ self.select_scheme("haiku_home") ++ else: ++ self.select_scheme("unix_home") + else: + if self.prefix is None: + if self.exec_prefix is not None: +@@ -427,7 +462,13 @@ class install(Command): + + self.install_base = self.prefix + self.install_platbase = self.exec_prefix +- self.select_scheme("unix_prefix") ++ if sys.platform.startswith('haiku'): ++ if os.environ.get('HAIKU_USE_VENDOR_DIRECTORIES') == '1': ++ self.select_scheme("haiku_vendor") ++ else: ++ self.select_scheme("haiku") ++ else: ++ self.select_scheme("unix_prefix") + + def finalize_other(self): + """Finalizes options for non-posix platforms""" +diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py +index b51629e..552980a 100644 +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -111,7 +111,8 @@ def get_python_inc(plat_specific=0, prefix=None): + incdir = os.path.join(get_config_var('srcdir'), 'Include') + return os.path.normpath(incdir) + python_dir = 'python' + get_python_version() + build_flags +- return os.path.join(prefix, "include", python_dir) ++ inc_dir = "include" if sys.platform != "haiku1" else "develop/headers" ++ return os.path.join(prefix, inc_dir, python_dir) + elif os.name == "nt": + if python_build: + # Include both the include and PC dir to ensure we can find +@@ -146,12 +147,20 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + prefix = plat_specific and EXEC_PREFIX or PREFIX + + if os.name == "posix": +- libpython = os.path.join(prefix, +- "lib", "python" + get_python_version()) +- if standard_lib: +- return libpython ++ if sys.platform.startswith('haiku'): ++ if standard_lib: ++ return os.path.join(prefix, ++ "lib", "python" + get_python_version()) ++ return os.path.join(prefix, "non-packaged", ++ "lib", "python" + get_python_version(), ++ "site-packages") + else: +- return os.path.join(libpython, "site-packages") ++ libpython = os.path.join(prefix, ++ "lib", "python" + get_python_version()) ++ if standard_lib: ++ return libpython ++ else: ++ return os.path.join(libpython, "site-packages") + elif os.name == "nt": + if standard_lib: + return os.path.join(prefix, "Lib") +diff --git a/Lib/plat-haiku1/regen b/Lib/plat-haiku1/regen +new file mode 100644 +index 0000000..4372ee2 +--- /dev/null ++++ b/Lib/plat-haiku1/regen +@@ -0,0 +1,4 @@ ++#! /bin/sh ++HEADERS=/boot/develop/headers ++set -v ++eval $PYTHON_FOR_BUILD ../../Tools/scripts/h2py.py -i "'(u_long)'" $HEADERS/posix/netinet/in.h +diff --git a/Lib/site.py b/Lib/site.py +index a065ab0..d7ecc28 100644 +--- a/Lib/site.py ++++ b/Lib/site.py +@@ -259,6 +259,14 @@ def _getuserbase(): + return joinuser("~", "Library", sys._framework, + "%d.%d" % sys.version_info[:2]) + ++ if sys.platform.startswith('haiku'): ++ try: ++ import subprocess ++ return subprocess.run(['finddir', 'B_USER_NONPACKAGED_DIRECTORY'], ++ stdout=subprocess.PIPE, check=True).stdout.rstrip().decode('utf-8') ++ except: ++ pass ++ + return joinuser("~", ".local") + + +@@ -334,7 +342,14 @@ def getsitepackages(prefixes=None): + continue + seen.add(prefix) + +- if os.sep == '/': ++ if sys.platform.startswith('haiku'): ++ sitepackages.append(os.path.join(prefix, "non-packaged", "lib", ++ "python" + sys.version[:3], ++ "site-packages")) ++ sitepackages.append(os.path.join(prefix, "lib", ++ "python" + sys.version[:3], ++ "vendor-packages")) ++ elif os.sep == '/': + sitepackages.append(os.path.join(prefix, "lib", + "python%d.%d" % sys.version_info[:2], + "site-packages")) +@@ -434,8 +449,16 @@ def enablerlcompleter(): + # each interpreter exit when readline was already configured + # through a PYTHONSTARTUP hook, see: + # http://bugs.python.org/issue5845#msg198636 +- history = os.path.join(os.path.expanduser('~'), +- '.python_history') ++ import subprocess ++ try: ++ history = os.path.join(subprocess.run(['finddir', 'B_USER_VAR_DIRECTORY'], ++ check=True, stdout=subprocess.PIPE).stdout.rstrip().decode('utf-8'), ++ 'python', 'history') ++ if not os.path.exists(os.path.dirname(history)): ++ os.makedirs(os.path.dirname(history)) ++ except subprocess.CalledProcessError: ++ history = os.path.join(os.path.expanduser('~'), ++ '.python_history') + try: + readline.read_history_file(history) + except OSError: +diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py +index 26e4500..c150211 100644 +--- a/Lib/test/test_fileio.py ++++ b/Lib/test/test_fileio.py +@@ -384,6 +384,7 @@ class OtherFileTests: + self.assertEqual(f.writable(), True) + if sys.platform != "darwin" and \ + 'bsd' not in sys.platform and \ ++ 'haiku' not in sys.platform and \ + not sys.platform.startswith(('sunos', 'aix')): + # Somehow /dev/tty appears seekable on some BSDs + self.assertEqual(f.seekable(), False) +diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py +index 9bdd284..0491681 100644 +--- a/Lib/test/test_posix.py ++++ b/Lib/test/test_posix.py +@@ -1167,7 +1167,7 @@ class PosixTester(unittest.TestCase): + posix.close(f) + support.rmtree(support.TESTFN + 'dir') + +- @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'), ++ @unittest.skipUnless(hasattr(os, 'mknod') and (os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'), + "test requires both stat.S_IFIFO and dir_fd support for os.mknod()") + def test_mknod_dir_fd(self): + # Test using mknodat() to create a FIFO (the only use specified +diff --git a/Makefile.pre.in b/Makefile.pre.in +index 502317a..ae9fe21 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -142,7 +142,7 @@ BINDIR= @bindir@ + LIBDIR= @libdir@ + MANDIR= @mandir@ + INCLUDEDIR= @includedir@ +-CONFINCLUDEDIR= $(exec_prefix)/include ++CONFINCLUDEDIR= $(INCLUDEDIR) + SCRIPTDIR= $(prefix)/lib + ABIFLAGS= @ABIFLAGS@ + +diff --git a/Modules/resource.c b/Modules/resource.c +index 87c72e7..af58ac5 100644 +--- a/Modules/resource.c ++++ b/Modules/resource.c +@@ -99,6 +99,7 @@ resource_getrusage_impl(PyObject *module, int who) + PyFloat_FromDouble(doubletime(ru.ru_utime))); + PyStructSequence_SET_ITEM(result, 1, + PyFloat_FromDouble(doubletime(ru.ru_stime))); ++#ifndef __HAIKU__ + PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(ru.ru_maxrss)); + PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(ru.ru_ixrss)); + PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(ru.ru_idrss)); +@@ -113,7 +114,22 @@ resource_getrusage_impl(PyObject *module, int who) + PyStructSequence_SET_ITEM(result, 13, PyLong_FromLong(ru.ru_nsignals)); + PyStructSequence_SET_ITEM(result, 14, PyLong_FromLong(ru.ru_nvcsw)); + PyStructSequence_SET_ITEM(result, 15, PyLong_FromLong(ru.ru_nivcsw)); +- ++#else ++ PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 7, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 8, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 9, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 10, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 11, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 12, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 13, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 14, PyLong_FromLong(0)); ++ PyStructSequence_SET_ITEM(result, 15, PyLong_FromLong(0)); ++#endif + if (PyErr_Occurred()) { + Py_DECREF(result); + return NULL; +@@ -366,19 +382,19 @@ PyInit_resource(void) + (PyObject*) &StructRUsageType); + + /* insert constants */ +-#ifdef RLIMIT_CPU ++#if !defined(__HAIKU__) && defined(RLIMIT_CPU) + PyModule_AddIntMacro(m, RLIMIT_CPU); + #endif + +-#ifdef RLIMIT_FSIZE ++#if !defined(__HAIKU__) && defined(RLIMIT_FSIZE) + PyModule_AddIntMacro(m, RLIMIT_FSIZE); + #endif + +-#ifdef RLIMIT_DATA ++#if !defined(__HAIKU__) && defined(RLIMIT_DATA) + PyModule_AddIntMacro(m, RLIMIT_DATA); + #endif + +-#ifdef RLIMIT_STACK ++#if !defined(__HAIKU__) && defined(RLIMIT_STACK) + PyModule_AddIntMacro(m, RLIMIT_STACK); + #endif + +@@ -390,31 +406,31 @@ PyInit_resource(void) + PyModule_AddIntMacro(m, RLIMIT_NOFILE); + #endif + +-#ifdef RLIMIT_OFILE ++#if !defined(__HAIKU__) && defined(RLIMIT_OFILE) + PyModule_AddIntMacro(m, RLIMIT_OFILE); + #endif + +-#ifdef RLIMIT_VMEM ++#if !defined(__HAIKU__) && defined(RLIMIT_VMEM) + PyModule_AddIntMacro(m, RLIMIT_VMEM); + #endif + +-#ifdef RLIMIT_AS ++#if !defined(__HAIKU__) && defined(RLIMIT_AS) + PyModule_AddIntMacro(m, RLIMIT_AS); + #endif + +-#ifdef RLIMIT_RSS ++#if !defined(__HAIKU__) && defined(RLIMIT_RSS) + PyModule_AddIntMacro(m, RLIMIT_RSS); + #endif + +-#ifdef RLIMIT_NPROC ++#if !defined(__HAIKU__) && defined(RLIMIT_NPROC) + PyModule_AddIntMacro(m, RLIMIT_NPROC); + #endif + +-#ifdef RLIMIT_MEMLOCK ++#if !defined(__HAIKU__) && defined(RLIMIT_MEMLOCK) + PyModule_AddIntMacro(m, RLIMIT_MEMLOCK); + #endif + +-#ifdef RLIMIT_SBSIZE ++#if !defined(__HAIKU__) && defined(RLIMIT_SBSIZE) + PyModule_AddIntMacro(m, RLIMIT_SBSIZE); + #endif + +diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c +index 594a0d6..c3f6534 100644 +--- a/Modules/socketmodule.c ++++ b/Modules/socketmodule.c +@@ -7418,7 +7418,9 @@ PyInit__socket(void) + /* SOCK_RAW is marked as optional in the POSIX specification */ + PyModule_AddIntMacro(m, SOCK_RAW); + #endif ++#ifndef __HAIKU__ + PyModule_AddIntMacro(m, SOCK_SEQPACKET); ++#endif + #if defined(SOCK_RDM) + PyModule_AddIntMacro(m, SOCK_RDM); + #endif +diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h +index dff1f8f..c00e7b7 100644 +--- a/Modules/socketmodule.h ++++ b/Modules/socketmodule.h +@@ -63,6 +63,10 @@ typedef int socklen_t; + # undef AF_QIPCRTR + #endif + ++#if defined(__HAIKU__) ++#undef HAVE_BLUETOOTH_BLUETOOTH_H ++#endif ++ + #ifdef HAVE_BLUETOOTH_BLUETOOTH_H + #include + #include +diff --git a/Modules/spwdmodule.c b/Modules/spwdmodule.c +index 1601ec0..4c98fe8 100644 +--- a/Modules/spwdmodule.c ++++ b/Modules/spwdmodule.c +@@ -9,6 +9,7 @@ + #ifdef HAVE_SHADOW_H + #include + #endif ++#include + + #include "clinic/spwdmodule.c.h" + +@@ -138,7 +139,12 @@ spwd_getspnam_impl(PyObject *module, PyObject *arg) + if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1) + goto out; + if ((p = getspnam(name)) == NULL) { ++// Haiku sets ENOENT if invalid user is specified. Ignore it to make KeyError is set. ++#ifdef __HAIKU__ ++ if (errno != 0 && errno != ENOENT) ++#else + if (errno != 0) ++#endif + PyErr_SetFromErrno(PyExc_OSError); + else + PyErr_SetString(PyExc_KeyError, "getspnam(): name not found"); +diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py +index ea37c04..d6dc9e9 100755 +--- a/Tools/scripts/h2py.py ++++ b/Tools/scripts/h2py.py +@@ -49,12 +49,15 @@ except KeyError: + try: + searchdirs=os.environ['INCLUDE'].split(';') + except KeyError: +- searchdirs=['/usr/include'] +- try: +- searchdirs.insert(0, os.path.join('/usr/include', ++ if sys.platform.find("beos") == 0 or sys.platform.find("haiku1") == 0: ++ searchdirs=os.environ['BEINCLUDES'].split(';') ++ else: ++ searchdirs=['/usr/include'] ++ try: ++ searchdirs.insert(0, os.path.join('/usr/include', + os.environ['MULTIARCH'])) +- except KeyError: +- pass ++ except KeyError: ++ pass + + def main(): + global filedict +diff --git a/configure.ac b/configure.ac +index a189d42..b08b42f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1129,6 +1129,16 @@ if test $enable_shared = "yes"; then + PY3LIBRARY=libpython3.so + fi + ;; ++ Haiku*) ++ LDLIBRARY='libpython$(LDVERSION).so' ++ BLDLIBRARY='-L. -lpython$(LDVERSION)' ++ RUNSHARED=LIBRARY_PATH=`pwd`${LIBRARY_PATH:+:${LIBRARY_PATH}} ++ INSTSONAME="$LDLIBRARY".$SOVERSION ++ if test "$with_pydebug" != yes ++ then ++ PY3LIBRARY=libpython3.so ++ fi ++ ;; + hp*|HP*) + case `uname -m` in + ia64) +@@ -1204,6 +1214,7 @@ AC_PROG_MKDIR_P + AC_SUBST(LN) + if test -z "$LN" ; then + case $ac_sys_system in ++ Haiku*) LN="ln -s";; + CYGWIN*) LN="ln -s";; + *) LN=ln;; + esac +@@ -2591,7 +2602,7 @@ then + BLDSHARED="$LDSHARED" + fi + ;; +- Linux*|GNU*|QNX*|VxWorks*) ++ Linux*|GNU*|QNX*|VxWorks*|Haiku*) + LDSHARED='$(CC) -shared' + LDCXXSHARED='$(CXX) -shared';; + FreeBSD*) +@@ -2658,7 +2669,7 @@ then + else CCSHARED="+z"; + fi;; + Linux-android*) ;; +- Linux*|GNU*) CCSHARED="-fPIC";; ++ Linux*|GNU*|Haiku*) CCSHARED="-fPIC";; + FreeBSD*|NetBSD*|OpenBSD*|DragonFly*) CCSHARED="-fPIC";; + OpenUNIX*|UnixWare*) + if test "$GCC" = "yes" +@@ -2686,7 +2697,7 @@ then + LINKFORSHARED="-Wl,-E -Wl,+s";; + # LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";; + Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";; +- Linux*|GNU*) LINKFORSHARED="-Xlinker -export-dynamic";; ++ Linux*|GNU*|Haiku*) LINKFORSHARED="-Xlinker -export-dynamic";; + # -u libsys_s pulls in all symbols in libsys + Darwin/*) + LINKFORSHARED="$extra_undefs -framework CoreFoundation" +@@ -2935,6 +2946,12 @@ LDFLAGS="-fsanitize=undefined $LDFLAGS" + AC_CHECK_LIB(nsl, t_open, [LIBS="-lnsl $LIBS"]) # SVR4 + AC_CHECK_LIB(socket, socket, [LIBS="-lsocket $LIBS"], [], $LIBS) # SVR4 sockets + ++# Haiku's sockets are stashed in libnetwork. ++case "$ac_sys_system" in ++ Haiku*) ++ AC_CHECK_LIB(network, socket, [LIBS="-lnetwork $LIBS"], [], $LIBS);; ++esac ++ + AC_MSG_CHECKING(for --with-libs) + AC_ARG_WITH(libs, + AS_HELP_STRING([--with-libs='lib1 ...'], [link against additional libs]), +@@ -4296,6 +4313,7 @@ AC_CHECK_FUNC(__fpu_control, + AC_SUBST(LIBM) + case $ac_sys_system in + Darwin) ;; ++Haiku) ;; + *) LIBM=-lm + esac + AC_MSG_CHECKING(for --with-libm=STRING) +diff --git a/setup.py b/setup.py +index 20d7f35..148642c 100644 +--- a/setup.py ++++ b/setup.py +@@ -45,6 +45,7 @@ CYGWIN = (HOST_PLATFORM == 'cygwin') + MACOS = (HOST_PLATFORM == 'darwin') + AIX = (HOST_PLATFORM.startswith('aix')) + VXWORKS = ('vxworks' in HOST_PLATFORM) ++HAIKU = (HOST_PLATFORM == 'haiku1') + + + SUMMARY = """ +@@ -692,6 +693,11 @@ class PyBuildExt(build_ext): + with open(config_h) as file: + self.config_h_vars = sysconfig.parse_config_h(file) + ++ # Haiku-specific library locations ++ if HAIKU: ++ self.inc_dirs += ['/boot/develop/headers/posix', ++ '/boot/system/develop/headers'] ++ self.lib_dirs += ['/boot/system/develop/lib'] + # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) + if HOST_PLATFORM in ['osf1', 'unixware7', 'openunix8']: + self.lib_dirs += ['/usr/ccs/lib'] +@@ -736,13 +742,13 @@ class PyBuildExt(build_ext): + self.add(Extension('math', ['mathmodule.c'], + extra_objects=[shared_math], + depends=['_math.h', shared_math], +- libraries=['m'])) ++ libraries=[])) + + # complex math library functions + self.add(Extension('cmath', ['cmathmodule.c'], + extra_objects=[shared_math], + depends=['_math.h', shared_math], +- libraries=['m'])) ++ libraries=[])) + + # time libraries: librt may be needed for clock_gettime() + time_libs = [] +@@ -756,7 +762,7 @@ class PyBuildExt(build_ext): + # libm is needed by delta_new() that uses round() and by accum() that + # uses modf(). + self.add(Extension('_datetime', ['_datetimemodule.c'], +- libraries=['m'])) ++ libraries=[])) + # random number generator implemented in C + self.add(Extension("_random", ["_randommodule.c"])) + # bisect +@@ -844,7 +850,7 @@ class PyBuildExt(build_ext): + # + # audioop needs libm for floor() in multiple functions. + self.add(Extension('audioop', ['audioop.c'], +- libraries=['m'])) ++ libraries=[])) + + # CSV files + self.add(Extension('_csv', ['_csv.c'])) +@@ -2037,7 +2043,7 @@ class PyBuildExt(build_ext): + # function my_sqrt() needs libm for sqrt() + self.add(Extension('_ctypes_test', + sources=['_ctypes/_ctypes_test.c'], +- libraries=['m'])) ++ libraries=[])) + + ffi_inc_dirs = self.inc_dirs.copy() + if MACOS: +@@ -2085,7 +2091,7 @@ class PyBuildExt(build_ext): + 'Modules', + '_decimal', + 'libmpdec'))] +- libraries = ['m'] ++ libraries = [] + sources = [ + '_decimal/_decimal.c', + '_decimal/libmpdec/basearith.c', +@@ -2274,7 +2280,7 @@ class PyBuildExt(build_ext): + depends=sha3_deps)) + + def detect_nis(self): +- if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6': ++ if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6' or HAIKU: + self.missing.append('nis') + return + +-- +2.21.0 + + +From 0575b9f2e856ddd6cf28260e70acdeaf9809198a Mon Sep 17 00:00:00 2001 +From: Jerome Duval +Date: Sun, 16 Apr 2017 10:05:42 +0200 +Subject: fix for negative errnos + + +diff --git a/Lib/subprocess.py b/Lib/subprocess.py +index 85b9ea0..855d399 100644 +--- a/Lib/subprocess.py ++++ b/Lib/subprocess.py +@@ -1690,6 +1690,8 @@ class Popen(object): + SubprocessError) + if issubclass(child_exception_type, OSError) and hex_errno: + errno_num = int(hex_errno, 16) ++ if sys.platform.startswith('haiku'): ++ errno_num = -errno_num; + child_exec_never_called = (err_msg == "noexec") + if child_exec_never_called: + err_msg = "" +diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c +index e693e53..30ac104 100644 +--- a/Modules/_posixsubprocess.c ++++ b/Modules/_posixsubprocess.c +@@ -534,6 +534,10 @@ error: + char *cur; + _Py_write_noraise(errpipe_write, "OSError:", 8); + cur = hex_errno + sizeof(hex_errno); ++#ifdef __HAIKU__ ++ if (saved_errno < 0) ++ saved_errno = -saved_errno; ++#endif + while (saved_errno != 0 && cur != hex_errno) { + *--cur = Py_hexdigits[saved_errno % 16]; + saved_errno /= 16; +-- +2.21.0 + + +From a631af68871420059e2c4b46eb943c29385ce183 Mon Sep 17 00:00:00 2001 +From: Philippe Houdoin +Date: Wed, 24 May 2017 11:09:43 +0000 +Subject: Implement CTypes's find_library for Haiku + + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index 97973bc..b2e4095 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -252,6 +252,56 @@ elif os.name == "posix": + def find_library(name, is64 = False): + return _get_soname(_findLib_crle(name, is64) or _findLib_gcc(name)) + ++ elif sys.platform.startswith("haiku"): ++ ++ def _num_version(libname): ++ # "libxyz.so.MAJOR.MINOR" => [ MAJOR, MINOR ] ++ parts = libname.split('.') ++ nums = [] ++ try: ++ while parts: ++ nums.insert(0, int(parts.pop())) ++ except ValueError: ++ pass ++ return nums or [sys.maxint] ++ ++ def find_library(name): ++ if name in ('c', 'm'): ++ return find_library('root') ++ for directory in os.environ['LIBRARY_PATH'].split(os.pathsep): ++ if directory.startswith("%A/"): ++ directory = directory.replace('%A', ++ os.path.dirname(os.path.abspath(sys.argv[0] or os.getcwd()))) ++ ++ if not os.path.isdir(directory): ++ continue ++ ++ # try direct match ++ fname = os.path.join(directory, name) ++ if os.path.isfile(fname): ++ return fname ++ ++ fname = os.path.join(directory, 'lib%s.so' % name) ++ if os.path.isfile(fname): ++ return fname ++ ++ # no exact matching in this directroy ++ # collect versioned candidates, if any ++ candidates = [] ++ pattern = re.compile(r'lib%s\.so\.\S+' % re.escape(name)) ++ for entry in os.listdir(directory): ++ if not os.path.isfile(os.path.join(directory, entry)): ++ continue ++ ++ if re.match(pattern, entry): ++ candidates.append(os.path.join(directory, entry)) ++ ++ if candidates: ++ # return latest version found ++ candidates.sort(key=_num_version) ++ return candidates[-1] ++ ++ return None + else: + + def _findSoname_ldconfig(name): +@@ -349,6 +399,12 @@ def test(): + print(f"crypt\t:: {cdll.LoadLibrary(find_library('crypt'))}") + print(f"crypto\t:: {find_library('crypto')}") + print(f"crypto\t:: {cdll.LoadLibrary(find_library('crypto'))}") ++ elif sys.platform.startswith("haiku"): ++ print(find_library("libbz2.so.1.0")) ++ print(find_library("tracker")) ++ print(find_library("media")) ++ print(cdll.LoadLibrary(find_library("tracker"))) ++ print(cdll.LoadLibrary("libmedia.so")) + else: + print(cdll.LoadLibrary("libm.so")) + print(cdll.LoadLibrary("libcrypt.so")) +-- +2.21.0 + + +From 6cf94d0677df23ea9c042ded31f03ed7cb8fcb17 Mon Sep 17 00:00:00 2001 +From: Philipp Wolfer +Date: Mon, 23 Sep 2019 09:14:58 +0200 +Subject: webbrowser: Support for default browsers on Haiku + + +diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py +index 0af36c4..0a39655 100755 +--- a/Lib/webbrowser.py ++++ b/Lib/webbrowser.py +@@ -527,6 +527,11 @@ def register_standard_browsers(): + "netscape", "opera", iexplore): + if shutil.which(browser): + register(browser, None, BackgroundBrowser(browser)) ++ elif sys.platform[:5] == "haiku": ++ # First try to use the default configured browser ++ register("haiku-default", None, GenericBrowser("open")) ++ # Fall back to WebPositive as the standard browser of Haiku ++ register("webpositive", None, BackgroundBrowser("WebPositive")) + else: + # Prefer X browsers if present + if os.environ.get("DISPLAY"): +-- +2.21.0 + + +From 5a948cadd0123f22c3b747d9e9cba9a9d9e22370 Mon Sep 17 00:00:00 2001 +From: Jerome Duval +Date: Fri, 4 Oct 2019 22:02:35 +0200 +Subject: since 3.8, don't reinit locks on fork. + + +diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py +index 16812ec..54935bf 100644 +--- a/Lib/logging/__init__.py ++++ b/Lib/logging/__init__.py +@@ -230,7 +230,7 @@ def _releaseLock(): + + # Prevent a held logging lock from blocking a child from logging. + +-if not hasattr(os, 'register_at_fork'): # Windows and friends. ++if sys.platform.startswith('haiku') or not hasattr(os, 'register_at_fork'): # Windows and friends. + def _register_at_fork_reinit_lock(instance): + pass # no-op when os.register_at_fork does not exist. + else: +-- +2.21.0 + diff --git a/dev-lang/python/patches/python3_x86-3.8.0.patchset b/dev-lang/python/patches/python3_x86-3.8.0.patchset new file mode 100644 index 000000000..a235272c7 --- /dev/null +++ b/dev-lang/python/patches/python3_x86-3.8.0.patchset @@ -0,0 +1,45 @@ +From 672ea87bdc26e47c81052cecc9cfde9f4c7467a7 Mon Sep 17 00:00:00 2001 +From: Adrien Destugues +Date: Sat, 3 Feb 2018 11:33:49 +0100 +Subject: [PATCH] Fix include paths for secondary x86 + +This helps python find libraries and dependencies properly (openssl, +etc), so a few more modules are enabled. + +It also fixes a crash because python would try to load the gcc2 libroot +even when built with gcc5. +--- + Lib/ctypes/util.py | 1 + + setup.py | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index b2e4095..34e56aa 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -273,6 +273,7 @@ elif os.name == "posix": + directory = directory.replace('%A', + os.path.dirname(os.path.abspath(sys.argv[0] or os.getcwd()))) + ++ directory = os.path.join(directory, "x86") + if not os.path.isdir(directory): + continue + +diff --git a/setup.py b/setup.py +index 704e7ec..f480cc9 100644 +--- a/setup.py ++++ b/setup.py +@@ -696,8 +696,8 @@ class PyBuildExt(build_ext): + # Haiku-specific library locations + if HAIKU: + self.inc_dirs += ['/boot/develop/headers/posix', +- '/boot/system/develop/headers'] +- self.lib_dirs += ['/boot/system/develop/lib'] ++ '/boot/system/develop/headers/x86'] ++ self.lib_dirs += ['/boot/system/develop/lib/x86'] + # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) + if HOST_PLATFORM in ['osf1', 'unixware7', 'openunix8']: + self.lib_dirs += ['/usr/ccs/lib'] +-- +2.23.0 + diff --git a/dev-lang/python/python38-3.8.0~rc1.recipe b/dev-lang/python/python38-3.8.0~rc1.recipe new file mode 100644 index 000000000..67d2569be --- /dev/null +++ b/dev-lang/python/python38-3.8.0~rc1.recipe @@ -0,0 +1,153 @@ +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-2019 Python Software Foundation" +REVISION="1" +SOURCE_URI="https://www.python.org/ftp/python/3.8.0/Python-${portVersion/\~/}.tar.xz" +CHECKSUM_SHA256="ae44df6ccf5d70059dd4d04c97156f5fcace74384a6f3cfb2fdf9baddb90a821" +SOURCE_DIR="Python-${portVersion/\~/}" +PATCHES="python3-3.8.0.patchset" +if [ "$secondaryArchSuffix" = _x86 ] ; then + PATCHES+=" + python3_x86-3.8.0.patchset + " +fi + +ARCHITECTURES=" !x86_gcc2 ?x86 ?x86_64" +SECONDARY_ARCHITECTURES="?x86" + +# On x86_gcc2 we don't want to install the commands in bin//, but in bin/. +commandSuffix=$secondaryArchSuffix +commandBinDir=$binDir +if [ "$targetArchitecture" = x86_gcc2 ]; then + commandSuffix= + commandBinDir=$prefix/bin +fi + +PROVIDES=" + python38$secondaryArchSuffix = $portVersion compat >= 3.8 + cmd:2to3_3.8 = $portVersion compat >= 3.8 + cmd:idle3.8 = $portVersion compat >= 3.8 + cmd:pydoc3.8 = $portVersion compat >= 3.8 + cmd:python3.8 = $portVersion compat >= 3.8 + cmd:python3.8_config = $portVersion compat >= 3.8 + cmd:pyvenv_3.8 = $portVersion compat >= 3.8 + devel:libpython3.8$secondaryArchSuffix = 1.0 + lib:libpython3.8$secondaryArchSuffix = 1.0 + " +REQUIRES=" + haiku$secondaryArchSuffix + cmd:file + lib:libbz2$secondaryArchSuffix + lib:libexpat$secondaryArchSuffix + lib:libffi$secondaryArchSuffix + lib:liblzma$secondaryArchSuffix + lib:libncurses$secondaryArchSuffix + lib:libssl$secondaryArchSuffix + lib:libreadline$secondaryArchSuffix + lib:libsqlite3$secondaryArchSuffix + lib:libz$secondaryArchSuffix + " +BUILD_REQUIRES=" + devel:libbz2$secondaryArchSuffix + devel:libexpat$secondaryArchSuffix + devel:libffi$secondaryArchSuffix + devel:liblzma$secondaryArchSuffix + devel:libncurses$secondaryArchSuffix + devel:libssl$secondaryArchSuffix + devel:libreadline$secondaryArchSuffix + devel:libsqlite3$secondaryArchSuffix + devel:libz$secondaryArchSuffix + " +BUILD_PREREQUIRES=" + haiku${secondaryArchSuffix}_devel + cmd:aclocal + cmd:autoconf + cmd:find + cmd:gcc$secondaryArchSuffix + cmd:ld$secondaryArchSuffix + cmd:libtoolize + cmd:pkg_config$secondaryArchSuffix + cmd:make + cmd:python + " + +GLOBAL_WRITABLE_FILES=" + non-packaged/lib/python3.8/site-packages directory keep-old + " + +BUILD() +{ + export CFLAGS="-D_BSD_SOURCE" + rm -Rf Modules/expat + + libtoolize --force --copy --install + aclocal + autoconf + export OPT="" + + runConfigure --omit-dirs binDir,includeDir ./configure \ + --enable-shared --without-ensurepip --with-system-ffi \ + --with-system-expat --bindir=$commandBinDir --includedir=$developDir/headers + + # prevent make from rebuilding stuff that requires python + touch Parser/asdl* Python/Python-ast.c Include/Python-ast.h + + rm -f python + + 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/python3.8/lib-dynload $prefix/lib/python3.8/ + fi + prepareInstalledDevelLibs libpython3.8 + 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/python3.8/vendor-packages + echo 'This directory contains packaged python modules.' \ + >$prefix/lib/python3.8/vendor-packages/README + + mkdir -p $prefix/non-packaged/lib/python3.8 + mv $prefix/lib/python3.8/site-packages $prefix/non-packaged/lib/python3.8/ + + # drop testsuite altogether; move to a separate package if needed + cd $prefix/lib/python3.8 + rm -rf ctypes/test distutils/tests idlelib/idle_test lib2to3/tests \ + sqlite3/test test tkinter/test unittest/test + + # TODO: drop __pycache__ folders as well? + find . -name __pycache__ | xargs rm -rf + + rm -f $prefix/bin/{2to3,idle3,pydoc3,python3,python3-config} +} + +TEST() +{ + cd Lib/test + rm -f test_asynchat.py # this one stalls, so skip it for now + rm -f test_multiprocessing.py # this one stalls, so skip it for now + + cd ../.. + make $jobArgs test +}