From 6855844913537c7594aaf6a59f3438a8b83b9d5c Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Thu, 25 Jul 2024 17:26:26 -0300 Subject: Initial Haiku patch (re-worked a bit). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This combines: * The original "initial Haiku patch" from Jérôme Duval. * A variation of Adrien Destugues changes in setup.py from his x86 patch. Ideally, we can continue moving changes from here into "per topic" commits, leaving here mostly only make/config related changes, for example. diff --git a/Include/pyport.h b/Include/pyport.h index b3b8b6f..40d8c2d 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -680,7 +680,7 @@ extern char * _getpty(int *, int, mode_t, int); # 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 the filesystem encoding. // See PyUnicode_DecodeFSDefaultAndSize(), PyUnicode_EncodeFSDefault(), // Py_DecodeLocale() and Py_EncodeLocale(). 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/Makefile.pre.in b/Makefile.pre.in index 81d4d50..7f990cc 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -146,7 +146,7 @@ BINDIR= @bindir@ LIBDIR= @libdir@ MANDIR= @mandir@ INCLUDEDIR= @includedir@ -CONFINCLUDEDIR= $(exec_prefix)/include +CONFINCLUDEDIR= $(INCLUDEDIR) PLATLIBDIR= @PLATLIBDIR@ SCRIPTDIR= $(prefix)/$(PLATLIBDIR) ABIFLAGS= @ABIFLAGS@ diff --git a/Modules/resource.c b/Modules/resource.c index d8bba2e..f010e09 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -113,6 +113,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)); @@ -127,7 +128,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; @@ -378,19 +394,19 @@ resource_exec(PyObject *module) } /* insert constants */ -#ifdef RLIMIT_CPU +#if !defined(__HAIKU__) && defined(RLIMIT_CPU) ADD_INT(module, RLIMIT_CPU); #endif -#ifdef RLIMIT_FSIZE +#if !defined(__HAIKU__) && defined(RLIMIT_FSIZE) ADD_INT(module, RLIMIT_FSIZE); #endif -#ifdef RLIMIT_DATA +#if !defined(__HAIKU__) && defined(RLIMIT_DATA) ADD_INT(module, RLIMIT_DATA); #endif -#ifdef RLIMIT_STACK +#if !defined(__HAIKU__) && defined(RLIMIT_STACK) ADD_INT(module, RLIMIT_STACK); #endif @@ -402,31 +418,31 @@ resource_exec(PyObject *module) ADD_INT(module, RLIMIT_NOFILE); #endif -#ifdef RLIMIT_OFILE +#if !defined(__HAIKU__) && defined(RLIMIT_OFILE) ADD_INT(module, RLIMIT_OFILE); #endif -#ifdef RLIMIT_VMEM +#if !defined(__HAIKU__) && defined(RLIMIT_VMEM) ADD_INT(module, RLIMIT_VMEM); #endif -#ifdef RLIMIT_AS +#if !defined(__HAIKU__) && defined(RLIMIT_AS) ADD_INT(module, RLIMIT_AS); #endif -#ifdef RLIMIT_RSS +#if !defined(__HAIKU__) && defined(RLIMIT_RSS) ADD_INT(module, RLIMIT_RSS); #endif -#ifdef RLIMIT_NPROC +#if !defined(__HAIKU__) && defined(RLIMIT_NPROC) ADD_INT(module, RLIMIT_NPROC); #endif -#ifdef RLIMIT_MEMLOCK +#if !defined(__HAIKU__) && defined(RLIMIT_MEMLOCK) ADD_INT(module, RLIMIT_MEMLOCK); #endif -#ifdef RLIMIT_SBSIZE +#if !defined(__HAIKU__) && defined(RLIMIT_SBSIZE) ADD_INT(module, RLIMIT_SBSIZE); #endif diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 1b35b11..f230057 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -102,6 +102,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 42123c9..60de40a 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" @@ -148,7 +149,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/configure.ac b/configure.ac index 7b4000f..0bb76a1 100644 --- a/configure.ac +++ b/configure.ac @@ -1503,6 +1503,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) @@ -1659,6 +1669,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 @@ -3264,7 +3275,7 @@ then else CCSHARED="+z"; fi;; Linux-android*) ;; - Linux*|GNU*) CCSHARED="-fPIC";; + Linux*|GNU*|Haiku*) CCSHARED="-fPIC";; Emscripten*|WASI*) AS_VAR_IF([enable_wasm_dynamic_linking], [yes], [ CCSHARED="-fPIC" @@ -3297,7 +3308,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" @@ -5353,6 +5364,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 ad8fb81..07fd69f 100644 --- a/setup.py +++ b/setup.py @@ -84,6 +84,7 @@ CYGWIN = (HOST_PLATFORM == 'cygwin') MACOS = (HOST_PLATFORM == 'darwin') AIX = (HOST_PLATFORM.startswith('aix')) VXWORKS = ('vxworks' in HOST_PLATFORM) +HAIKU = (HOST_PLATFORM == 'haiku1') EMSCRIPTEN = HOST_PLATFORM == 'emscripten-wasm32' CC = os.environ.get("CC") if not CC: @@ -891,6 +892,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'] -- 2.45.2 From 549e67f9aef5ee96b1d5a867ba7e3977ccfbce1f 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 1d17ae3..4461393 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1940,6 +1940,8 @@ class Popen: 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; if err_msg == "noexec:chdir": err_msg = "" # The error must be from chdir(cwd). diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index d91bf21..cb6c6a2 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -729,6 +729,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.45.2 From dd0487c74688d93a2d8da93d9e3c4557ea8c8ab8 Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Sun, 8 Oct 2023 20:06:31 -0300 Subject: Implement CTypes's find_library for Haiku This combines: - the original patch by Philippe Houdoin - A slight variation of Adrien Destugues' fix for x86_gcc2. diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index c550883..6b23423 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -1,4 +1,5 @@ import os +import platform import shutil import subprocess import sys @@ -268,6 +269,60 @@ 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()))) + + # Are we on x86 32 bits?: + if platform.machine() == 'BePC': + directory = os.path.join(directory, "x86") + + 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): @@ -370,6 +425,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.45.2 From 6d8687e0ae7e50e105906910f5e18441f87bb8ca 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 5d72524..eb0879f 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -549,6 +549,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") or os.environ.get("WAYLAND_DISPLAY"): -- 2.45.2 From 88513479c1cd6eb116ca5bd89d835295ac1ded26 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 e364419..86f0bcc 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -244,7 +244,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.45.2 From 3666540441c9d6fec0d19b85c2dc4fd9a60562a0 Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Fri, 15 May 2020 15:20:57 +0200 Subject: handle errors returned by internal_connect() upstream bug #40628 by Ryan C. Gordon diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index f0c9b46..dd9b7da 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3327,7 +3327,7 @@ sock_connect(PySocketSockObject *s, PyObject *addro) } res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1); - if (res < 0) + if (res == -1) return NULL; Py_RETURN_NONE; @@ -3358,7 +3358,7 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro) } res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0); - if (res < 0) + if (res == -1) return NULL; return PyLong_FromLong((long) res); -- 2.45.2 From 1f1f74f5cb59ef0c6f60978091bb02d28e46ab4e Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Mon, 19 Oct 2020 18:03:09 +0200 Subject: ttyname_r can use MAXPATHLEN diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6fb2fc8..fd04fc2 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3118,11 +3118,14 @@ static PyObject * os_ttyname_impl(PyObject *module, int fd) /*[clinic end generated code: output=c424d2e9d1cd636a input=9ff5a58b08115c55]*/ { - +#ifndef __HAIKU__ long size = sysconf(_SC_TTY_NAME_MAX); if (size == -1) { return posix_error(); } +#else + long size = MAXPATHLEN; +#endif char *buffer = (char *)PyMem_RawMalloc(size); if (buffer == NULL) { return PyErr_NoMemory(); -- 2.45.2 From de05d54136a5752054feeeeb521413f66484623f Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Thu, 25 Jul 2024 17:27:04 -0300 Subject: Miscellaneous "Lib/test/" fixes for Haiku. This combines test_fileio.py changes from the "initial Haiku patch", plus... "Lib/test: require the "largefile" usage flag for I/O heavy tests.": The same was done for Windows and MacOSX already. This avoids needing several GBs of storage to run the tests (unless they "largefile" resource usage flag is enabled). diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index 5cc3d4b..6f53287 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -391,6 +391,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_io.py b/Lib/test/test_io.py index d528b4a..74f2ee5 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -634,7 +634,7 @@ class IOTest(unittest.TestCase): # On Windows and Mac OSX this test consumes large resources; It takes # a long time to build the >2 GiB file and takes >2 GiB of disk space # therefore the resource must be enabled to run this test. - if sys.platform[:3] == 'win' or sys.platform == 'darwin': + if sys.platform[:3] == 'win' or sys.platform == 'darwin' or sys.platform[:5] == 'haiku': support.requires( 'largefile', 'test requires %s bytes and a long time to run' % self.LARGE) diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py index 3b0930f..c793ea1 100644 --- a/Lib/test/test_largefile.py +++ b/Lib/test/test_largefile.py @@ -255,7 +255,7 @@ def setUpModule(): # takes a long time to build the >2 GiB file and takes >2 GiB of disk # space therefore the resource must be enabled to run this test. # If not, nothing after this line stanza will be executed. - if sys.platform[:3] == 'win' or sys.platform == 'darwin': + if sys.platform[:3] == 'win' or sys.platform == 'darwin' or sys.platform[:5] == 'haiku': requires('largefile', 'test requires %s bytes and a long time to run' % str(size)) else: diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 1867e8c..e4fab02 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -1009,7 +1009,7 @@ class LargeMmapTests(unittest.TestCase): unlink(TESTFN) def _make_test_file(self, num_zeroes, tail): - if sys.platform[:3] == 'win' or sys.platform == 'darwin': + if sys.platform[:3] == 'win' or sys.platform == 'darwin' or sys.platform[:5] == 'haiku': requires('largefile', 'test requires %s bytes and a long time to run' % str(0x180000000)) f = open(TESTFN, 'w+b') -- 2.45.2 From 67ebce82b7a572d38d3a1d5d74718f4db77f1fe3 Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Fri, 26 Jul 2024 19:18:56 -0300 Subject: _getuserbase(), getsitepackages(), and INSTALL_SCHEMES for Haiku. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This combines (at least parts of) previous "commits" on older ".patchset"s: * Initial Haiku patch. * default schemes for Haiku from Jérôme Duval * syncronize both _getuserbase() copies on site.py and sysconfig.py. * Add missing 'platinclude' to sysconfig's _INSTALL_SCHEMES. * Adjust test_sysconfig.test_get_scheme_names for Haiku. by me, plus: * new changes to allow Python to find modules installed via 'pkgman -H'. * Attempt to support the "venv" install scheme (untested). The idea was to have all _getuserbase()/INSTALL_SCHEMES related changes in "one place". diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py index 01d5331..b109392 100644 --- a/Lib/distutils/command/install.py +++ b/Lib/distutils/command/install.py @@ -33,13 +33,15 @@ SCHEME_KEYS = ('purelib', 'platlib', 'headers', 'scripts', 'data') # alter locations for packages installations in a single place. # Note that this module is deprecated (PEP 632); all consumers # of this information should switch to using sysconfig directly. -INSTALL_SCHEMES = {"unix_prefix": {}, "unix_home": {}, "nt": {}} +INSTALL_SCHEMES = {"unix_prefix": {}, "unix_home": {}, "nt": {}, + "haiku": {}, "haiku_vendor": {}, "haiku_home": {}} # Copy from sysconfig._INSTALL_SCHEMES for key in SCHEME_KEYS: for distutils_scheme_name, sys_scheme_name in ( ("unix_prefix", "posix_prefix"), ("unix_home", "posix_home"), - ("nt", "nt")): + ("nt", "nt"), ("haiku", "haiku"), ("haiku_vendor", "haiku_vendor"), + ("haiku_home", "haiku_home")): sys_key = key sys_scheme = sysconfig._INSTALL_SCHEMES[sys_scheme_name] if key == "headers" and key not in sys_scheme: @@ -86,6 +88,13 @@ 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', + } class install(Command): @@ -431,10 +440,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: @@ -450,7 +465,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 03b8558..a7253b6 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -287,7 +287,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 @@ -322,19 +323,27 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): prefix = plat_specific and EXEC_PREFIX or PREFIX if os.name == "posix": - if plat_specific or standard_lib: - # Platform-specific modules (any module from a non-pure-Python - # module distribution) or standard Python library modules. - libdir = sys.platlibdir + 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: - # Pure Python - libdir = "lib" - libpython = os.path.join(prefix, libdir, - "python" + get_python_version()) - if standard_lib: - return libpython - else: - return os.path.join(libpython, "site-packages") + if plat_specific or standard_lib: + # Platform-specific modules (any module from a non-pure-Python + # module distribution) or standard Python library modules. + libdir = sys.platlibdir + + # Pure Python + libdir = "lib" + libpython = os.path.join(prefix, libdir, + "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/site.py b/Lib/site.py index 2904e44..b01254d 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -291,6 +291,14 @@ def _getuserbase(): return joinuser("~", "Library", sys._framework, "%d.%d" % sys.version_info[:2]) + if sys.platform.startswith('haiku'): + try: + import subprocess + return subprocess.check_output( + ['finddir', 'B_USER_NONPACKAGED_DIRECTORY']).rstrip().decode('utf-8') + except: + pass + return joinuser("~", ".local") @@ -371,7 +379,31 @@ def getsitepackages(prefixes=None): continue seen.add(prefix) - if os.sep == '/': + if sys.platform.startswith('haiku'): + # Locations under /system/ + sitepackages.append(os.path.join(prefix, "non-packaged", "lib", + "python%d.%d" % sys.version_info[:2], + "site-packages")) + sitepackages.append(os.path.join(prefix, "lib", + "python%d.%d" % sys.version_info[:2], + "vendor-packages")) + + # For .hpkg installed under ~/config/ (pkgman install -H) + # ("pip install --user" uses ~/config/non-packaged/, and gets + # handled by the "haiku_user" install scheme. + try: + import subprocess + _home_prefix = subprocess.check_output( + ['finddir', 'B_USER_CONFIG_DIRECTORY']).rstrip().decode('utf-8') + except: + # print("'finddir B_USER_CONFIG_DIRECTORY' failed.") + _home_prefix = None + + if _home_prefix is not None: + sitepackages.append(os.path.join(_home_prefix, "lib", + "python%d.%d" % sys.version_info[:2], + "vendor-packages")) + elif os.sep == '/': libdirs = [sys.platlibdir] if sys.platlibdir != "lib": libdirs.append("lib") diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index ebe3711..3379435 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -46,6 +46,36 @@ _INSTALL_SCHEMES = { 'scripts': '{base}/bin', 'data': '{base}', }, + 'haiku': { + 'stdlib': '{installed_base}/lib/python{py_version_short}', + 'platstdlib': '{platbase}/lib/python{py_version_short}', + 'purelib': '{base}/non-packaged/lib/python{py_version_short}/site-packages', + 'platlib': '{platbase}/non-packaged/lib/python{py_version_short}/site-packages', + 'include': '{installed_base}/non-packaged/develop/headers/python{py_version_short}', + 'platinclude': '{installed_platbase}/develop/headers/python{py_version_short}', + 'scripts': '{base}/non-packaged/bin', + 'data' : '{base}/non-packaged', + }, + 'haiku_vendor': { + 'stdlib': '{installed_base}/lib/python{py_version_short}', + 'platstdlib': '{platbase}/lib/python{py_version_short}', + 'purelib': '{base}/lib/python{py_version_short}/vendor-packages', + 'platlib': '{platbase}/lib/python{py_version_short}/vendor-packages', + 'include': '{installed_base}/develop/headers/python{py_version_short}', + 'platinclude': '{installed_platbase}/develop/headers/python{py_version_short}', + 'scripts': '{base}/bin', + 'data' : '{base}', + }, + 'haiku_home': { + 'stdlib': '{installed_base}/lib/python{py_version_short}', + 'platstdlib': '{base}/lib/python{py_version_short}', + 'purelib': '{base}/lib/python{py_version_short}', + 'platlib': '{base}/lib/python{py_version_short}', + 'include': '{installed_base}/develop/headers/python{py_version_short}', + 'platinclude': '{installed_base}/develop/headers/python{py_version_short}', + 'scripts': '{base}/bin', + 'data': '{base}', + }, 'nt': { 'stdlib': '{installed_base}/Lib', 'platstdlib': '{base}/Lib', @@ -85,6 +115,16 @@ _INSTALL_SCHEMES = { 'scripts': '{base}/bin', 'data': '{base}', }, + 'haiku_venv': { + 'stdlib': '{installed_base}/lib/python{py_version_short}', + 'platstdlib': '{platbase}/lib/python{py_version_short}', + 'purelib': '{base}/non-packaged/lib/python{py_version_short}/site-packages', + 'platlib': '{platbase}/non-packaged/lib/python{py_version_short}/site-packages', + 'include': '{installed_base}/non-packaged/develop/headers/python{py_version_short}', + 'platinclude': '{installed_platbase}/develop/headers/python{py_version_short}', + 'scripts': '{base}/non-packaged/bin', + 'data' : '{base}/non-packaged', + }, 'nt_venv': { 'stdlib': '{installed_base}/Lib', 'platstdlib': '{base}/Lib', @@ -100,6 +140,8 @@ _INSTALL_SCHEMES = { # For the OS-native venv scheme, we essentially provide an alias: if os.name == 'nt': _INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['nt_venv'] +elif sys.platform.startswith('haiku'): + _INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['haiku_venv'] else: _INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['posix_venv'] @@ -126,6 +168,14 @@ def _getuserbase(): return joinuser("~", "Library", sys._framework, f"{sys.version_info[0]}.{sys.version_info[1]}") + if sys.platform.startswith('haiku'): + try: + import subprocess + return subprocess.check_output( + ['finddir', 'B_USER_NONPACKAGED_DIRECTORY']).rstrip().decode('utf-8') + except: + pass + return joinuser("~", ".local") _HAS_USER_BASE = (_getuserbase() is not None) @@ -151,6 +201,15 @@ if _HAS_USER_BASE: 'scripts': '{userbase}/bin', 'data': '{userbase}', }, + 'haiku_user': { + 'stdlib': '{userbase}/lib/python{py_version_short}', + 'platstdlib': '{userbase}/lib/python{py_version_short}', + 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', + 'platlib': '{userbase}/lib/python{py_version_short}/site-packages', + 'include': '{userbase}/develop/headers/python{py_version_short}', + 'scripts': '{userbase}/bin', + 'data': '{userbase}', + }, 'osx_framework_user': { 'stdlib': '{userbase}/lib/python', 'platstdlib': '{userbase}/lib/python', @@ -277,6 +336,18 @@ def _expand_vars(scheme, vars): def _get_preferred_schemes(): + if sys.platform.startswith('haiku'): + if os.environ.get('HAIKU_USE_VENDOR_DIRECTORIES') == '1': + return { + 'prefix': 'haiku_vendor', + 'home': 'haiku_home', + 'user': 'haiku_user', + } + return { + 'prefix': 'haiku', + 'home': 'haiku_home', + 'user': 'haiku_user', + } if os.name == 'nt': return { 'prefix': 'nt', diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index d3bb0d2..7fb3a41 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -345,9 +345,10 @@ class TestSysConfig(unittest.TestCase): self.assertTrue(os.path.isfile(config_h), config_h) def test_get_scheme_names(self): - wanted = ['nt', 'posix_home', 'posix_prefix', 'posix_venv', 'nt_venv', 'venv'] + wanted = ['nt', 'posix_home', 'posix_prefix', 'posix_venv', 'nt_venv', 'venv', 'haiku', + 'haiku_home', 'haiku_vendor'] if HAS_USER_BASE: - wanted.extend(['nt_user', 'osx_framework_user', 'posix_user']) + wanted.extend(['nt_user', 'osx_framework_user', 'posix_user', 'haiku_user']) self.assertEqual(get_scheme_names(), tuple(sorted(wanted))) @skip_unless_symlink -- 2.45.2 From 17124c54c39d54ef86e0659366873e976d99088e Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Thu, 25 Jul 2024 17:27:28 -0300 Subject: Fix location of REPL's history file. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Originally from "initial Haiku patch" by Jérôme Duval. diff --git a/Lib/site.py b/Lib/site.py index b01254d..ce157f2 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -512,8 +512,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.check_output( + ['finddir', 'B_USER_VAR_DIRECTORY']).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: -- 2.45.2 From c3e307eb0c3fa2827cdcec667b16300f7f60770c Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Sat, 10 Feb 2024 06:01:25 -0300 Subject: Fix build on nightlies, following the addition of kqueue. See HaikuPorts issue #10001. diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 8210269..5750d2c 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -2588,13 +2588,20 @@ _select_exec(PyObject *m) #ifdef EVFILT_SIGNAL PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL); #endif +#ifdef EVFILT_TIMER PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER); - +#endif /* event flags */ PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD); PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE); +#ifdef EV_ENABLE PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE); +#else + PyModule_AddIntConstant(m, "KQ_EV_ENABLE", 0); // "test_kqueue.py" assumes KQ_EV_ENABLE exists +#endif +#ifdef EV_DISABLE PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE); +#endif PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT); PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR); @@ -2627,14 +2634,28 @@ _select_exec(PyObject *m) /* PROC filter flags */ #ifdef EVFILT_PROC PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT); +#ifdef NOTE_FORK PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK); +#endif +#ifdef NOTE_EXEC PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC); +#endif +#ifdef NOTE_PCTRLMASK PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK); +#endif +#ifdef NOTE_PDATAMASK PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK); +#endif +#ifdef NOTE_TRACK PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK); +#endif +#ifdef NOTE_CHILD PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD); +#endif +#ifdef NOTE_TRACKERR PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR); +#endif #endif /* NETDEV filter flags */ -- 2.45.2 From dfd1152f7e745fc08ac5416e0d0ec1efd3b2c77c Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Thu, 14 Mar 2024 12:54:33 -0500 Subject: config.guess: Update to universal haiku arch guessing * Matches upstream config.guess as of 2022, python just ships a really old one diff --git a/config.guess b/config.guess index e81d3ae..366429c 100755 --- a/config.guess +++ b/config.guess @@ -1364,8 +1364,11 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; - x86_64:Haiku:*:*) - GUESS=x86_64-unknown-haiku + ppc:Haiku:*:*) + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) + GUESS=$UNAME_MACHINE-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE -- 2.45.2