From 03bcbc8084a4e2eb67a36152bdc4b1fc19cf5336 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 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/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/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 69670d9..82ca5af 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -281,6 +281,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") @@ -361,7 +369,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%d.%d" % sys.version_info[:2], + "site-packages")) + sitepackages.append(os.path.join(prefix, "lib", + "python%d.%d" % sys.version_info[:2], + "vendor-packages")) + elif os.sep == '/': libdirs = [sys.platlibdir] if sys.platlibdir != "lib": libdirs.append("lib") @@ -470,8 +485,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 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/Makefile.pre.in b/Makefile.pre.in index c61b093..86ec08d 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"); -- 2.42.1 From ce3528842c00cb3600f145306290c2d36f81ffbf 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 6df5dd5..39dde15 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1938,6 +1938,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; 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 072519c..1023c8a 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -724,6 +724,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.42.1 From 90213d89824d796d82fc5266f65c79a6787daaef 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 0c2510e..2b4f04c 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -265,6 +265,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): @@ -367,6 +417,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.42.1 From 90badefb931e909cb4ec993b9b097badcd66e4be 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 44974d4..ce78f41 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.42.1 From 7e0b76caa0d03cc8f8761dd9edddd744dd67e300 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 bcee2ba..46630a4 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.42.1 From 8a3b2053eff0af149b8118045a1e5263479557b6 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 997df43..8b660b4 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.42.1 From 06bddd0cdf4e2529a6cea35fc126ef5477f37b1c 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 9ac021f..c77ba68 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3112,11 +3112,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.42.1 From b5cd57a0b38a76ed5049e8335700df28580b649e Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Wed, 5 Oct 2022 16:09:41 -0300 Subject: The rest of korli's "initial Haiku patch". Parts of that original patch did not applied cleanly anymore. Manually massaged them for 3.11.0rc2. diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index ebe3711..63e2742 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -56,6 +56,27 @@ _INSTALL_SCHEMES = { 'scripts': '{base}/Scripts', 'data': '{base}', }, + '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}', + '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}', + 'scripts': '{base}/bin', + 'data' : '{base}', + }, + 'haiku_home': { + 'purelib': '{base}/lib/python', + 'platlib': '{base}/lib/python', + 'headers': '{base}/develop/headers/python/', + 'scripts': '{base}/bin', + 'data' : '{base}', + }, # Downstream distributors can overwrite the default install scheme. # This is done to support downstream modifications where distributors change # the installation layout (eg. different site-packages directory). diff --git a/configure.ac b/configure.ac index 52d5c1f..78567be 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" @@ -5352,6 +5363,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 4f122b6..dc42f39 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: @@ -890,6 +891,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.42.1 From 9bfff6217e20682d79cbc465a0aecf900ba355f0 Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Mon, 24 Oct 2022 20:04:10 -0300 Subject: Lib/test: require the "largefile" usage flag for I/O heavy tests. The same is done for Windows and macOS already. This avoids needing several GBs of storage to run the tests (unless the "largefile" resource usage flag is enabled). diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 7853705..ffde3a7 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -613,7 +613,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 == 'haiku1': 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..c21f001 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 == 'haiku1': 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 dfcf303..611d3c8 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -1007,7 +1007,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 == 'haiku1': requires('largefile', 'test requires %s bytes and a long time to run' % str(0x180000000)) f = open(TESTFN, 'w+b') -- 2.42.1 From 4d17c9efbc6546f643d7f4f2d30c2b9de93dcf2d Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Tue, 7 Mar 2023 18:29:29 +0100 Subject: default schemes for Haiku diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 63e2742..6ba9d18 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -57,25 +57,32 @@ _INSTALL_SCHEMES = { 'data': '{base}', }, 'haiku': { + 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}', + 'platstdlib': '{platbase}/{platlibdir}/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', - 'headers': '{base}/non-packaged/develop/headers/python{py_version_short}', + 'platlib': '{platbase}/non-packaged/{platlibdir}/python{py_version_short}/site-packages', + 'include': '{base}/non-packaged/develop/headers/python{py_version_short}', 'scripts': '{base}/non-packaged/bin', 'data' : '{base}/non-packaged', }, 'haiku_vendor': { + 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}', + 'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}', '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}', + 'include': '{base}/develop/headers/python{py_version_short}', 'scripts': '{base}/bin', 'data' : '{base}', }, 'haiku_home': { + 'stdlib': '{installed_base}/lib/python', + 'platstdlib': '{base}/lib/python', 'purelib': '{base}/lib/python', 'platlib': '{base}/lib/python', - 'headers': '{base}/develop/headers/python/', + 'include': '{installed_base}/develop/headers/python', + 'platinclude': '{installed_base}/develop/headers/python', 'scripts': '{base}/bin', - 'data' : '{base}', + 'data': '{base}', }, # Downstream distributors can overwrite the default install scheme. # This is done to support downstream modifications where distributors change @@ -172,6 +179,15 @@ if _HAS_USER_BASE: 'scripts': '{userbase}/bin', 'data': '{userbase}', }, + 'haiku_user': { + 'stdlib': '{userbase}/{platlibdir}/python{py_version_short}', + 'platstdlib': '{userbase}/{platlibdir}/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', @@ -298,6 +314,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', -- 2.42.1 From da95612a7296813a2b12c4d82bb8fbd335560072 Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Fri, 10 Mar 2023 20:15:14 -0300 Subject: syncronize both _getuserbase() copies on site.py and sysconfig.py. diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 6ba9d18..c3e8dbc 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -154,6 +154,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.run(['finddir', 'B_USER_NONPACKAGED_DIRECTORY'], + stdout=subprocess.PIPE, check=True).stdout.rstrip().decode('utf-8') + except: + pass + return joinuser("~", ".local") _HAS_USER_BASE = (_getuserbase() is not None) -- 2.42.1