You've already forked macports-ports
mirror of
https://github.com/macports/macports-ports.git
synced 2026-07-12 18:20:25 -07:00
969 lines
33 KiB
Diff
969 lines
33 KiB
Diff
Big Sur and Apple Silicon support, backported from 3.8
|
|
https://github.com/python/cpython/pull/25806
|
|
--- Lib/_osx_support.py.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Lib/_osx_support.py 2021-06-02 05:24:23.000000000 +1000
|
|
@@ -52,7 +52,7 @@
|
|
return executable
|
|
|
|
|
|
-def _read_output(commandstring):
|
|
+def _read_output(commandstring, capture_stderr=False):
|
|
"""Output from successful command execution or None"""
|
|
# Similar to os.popen(commandstring, "r").read(),
|
|
# but without actually using os.popen because that
|
|
@@ -67,7 +67,10 @@
|
|
os.getpid(),), "w+b")
|
|
|
|
with contextlib.closing(fp) as fp:
|
|
- cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name)
|
|
+ if capture_stderr:
|
|
+ cmd = "%s >'%s' 2>&1" % (commandstring, fp.name)
|
|
+ else:
|
|
+ cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name)
|
|
return fp.read().decode('utf-8').strip() if not os.system(cmd) else None
|
|
|
|
|
|
@@ -110,6 +113,26 @@
|
|
|
|
return _SYSTEM_VERSION
|
|
|
|
+_SYSTEM_VERSION_TUPLE = None
|
|
+def _get_system_version_tuple():
|
|
+ """
|
|
+ Return the macOS system version as a tuple
|
|
+
|
|
+ The return value is safe to use to compare
|
|
+ two version numbers.
|
|
+ """
|
|
+ global _SYSTEM_VERSION_TUPLE
|
|
+ if _SYSTEM_VERSION_TUPLE is None:
|
|
+ osx_version = _get_system_version()
|
|
+ if osx_version:
|
|
+ try:
|
|
+ _SYSTEM_VERSION_TUPLE = tuple(int(i) for i in osx_version.split('.'))
|
|
+ except ValueError:
|
|
+ _SYSTEM_VERSION_TUPLE = ()
|
|
+
|
|
+ return _SYSTEM_VERSION_TUPLE
|
|
+
|
|
+
|
|
def _remove_original_values(_config_vars):
|
|
"""Remove original unmodified values for testing"""
|
|
# This is needed for higher-level cross-platform tests of get_platform.
|
|
@@ -125,6 +148,33 @@
|
|
_config_vars[_INITPRE + cv] = oldvalue
|
|
_config_vars[cv] = newvalue
|
|
|
|
+
|
|
+_cache_default_sysroot = None
|
|
+def _default_sysroot(cc):
|
|
+ """ Returns the root of the default SDK for this system, or '/' """
|
|
+ global _cache_default_sysroot
|
|
+
|
|
+ if _cache_default_sysroot is not None:
|
|
+ return _cache_default_sysroot
|
|
+
|
|
+ contents = _read_output('%s -c -E -v - </dev/null' % (cc,), True)
|
|
+ in_incdirs = False
|
|
+ for line in contents.splitlines():
|
|
+ if line.startswith("#include <...>"):
|
|
+ in_incdirs = True
|
|
+ elif line.startswith("End of search list"):
|
|
+ in_incdirs = False
|
|
+ elif in_incdirs:
|
|
+ line = line.strip()
|
|
+ if line == '/usr/include':
|
|
+ _cache_default_sysroot = '/'
|
|
+ elif line.endswith(".sdk/usr/include"):
|
|
+ _cache_default_sysroot = line[:-12]
|
|
+ if _cache_default_sysroot is None:
|
|
+ _cache_default_sysroot = '/'
|
|
+
|
|
+ return _cache_default_sysroot
|
|
+
|
|
def _supports_universal_builds():
|
|
"""Returns True if universal builds are supported on this system"""
|
|
# As an approximation, we assume that if we are running on 10.4 or above,
|
|
@@ -132,14 +182,18 @@
|
|
# builds, in particular -isysroot and -arch arguments to the compiler. This
|
|
# is in support of allowing 10.4 universal builds to run on 10.3.x systems.
|
|
|
|
- osx_version = _get_system_version()
|
|
- if osx_version:
|
|
- try:
|
|
- osx_version = tuple(int(i) for i in osx_version.split('.'))
|
|
- except ValueError:
|
|
- osx_version = ''
|
|
+ osx_version = _get_system_version_tuple()
|
|
return bool(osx_version >= (10, 4)) if osx_version else False
|
|
|
|
+def _supports_arm64_builds():
|
|
+ """Returns True if arm64 builds are supported on this system"""
|
|
+ # There are two sets of systems supporting macOS/arm64 builds:
|
|
+ # 1. macOS 11 and later, unconditionally
|
|
+ # 2. macOS 10.15 with Xcode 12.2 or later
|
|
+ # For now the second category is ignored.
|
|
+ osx_version = _get_system_version_tuple()
|
|
+ return osx_version >= (11, 0) if osx_version else False
|
|
+
|
|
|
|
def _find_appropriate_compiler(_config_vars):
|
|
"""Find appropriate C compiler for extension module builds"""
|
|
@@ -331,6 +385,12 @@
|
|
except ValueError:
|
|
break
|
|
|
|
+ elif not _supports_arm64_builds():
|
|
+ # Look for "-arch arm64" and drop that
|
|
+ for idx in reversed(range(len(compiler_so))):
|
|
+ if compiler_so[idx] == '-arch' and compiler_so[idx+1] == "arm64":
|
|
+ del compiler_so[idx:idx+2]
|
|
+
|
|
if 'ARCHFLAGS' in os.environ and not stripArch:
|
|
# User specified different -arch flags in the environ,
|
|
# see also distutils.sysconfig
|
|
@@ -481,6 +541,8 @@
|
|
|
|
if len(archs) == 1:
|
|
machine = archs[0]
|
|
+ elif archs == ('arm64', 'x86_64'):
|
|
+ machine = 'universal2'
|
|
elif archs == ('i386', 'ppc'):
|
|
machine = 'fat'
|
|
elif archs == ('i386', 'x86_64'):
|
|
--- Lib/ctypes/macholib/dyld.py.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Lib/ctypes/macholib/dyld.py 2021-06-02 05:26:49.000000000 +1000
|
|
@@ -6,6 +6,11 @@
|
|
from ctypes.macholib.framework import framework_info
|
|
from ctypes.macholib.dylib import dylib_info
|
|
from itertools import *
|
|
+try:
|
|
+ from _ctypes import _dyld_shared_cache_contains_path
|
|
+except ImportError:
|
|
+ def _dyld_shared_cache_contains_path(*args):
|
|
+ raise NotImplementedError
|
|
|
|
__all__ = [
|
|
'dyld_find', 'framework_find',
|
|
@@ -122,8 +127,15 @@
|
|
dyld_executable_path_search(name, executable_path),
|
|
dyld_default_search(name, env),
|
|
), env):
|
|
+
|
|
if os.path.isfile(path):
|
|
return path
|
|
+ try:
|
|
+ if _dyld_shared_cache_contains_path(path):
|
|
+ return path
|
|
+ except NotImplementedError:
|
|
+ pass
|
|
+
|
|
raise ValueError("dylib %s could not be found" % (name,))
|
|
|
|
def framework_find(fn, executable_path=None, env=None):
|
|
--- Lib/distutils/tests/test_build_ext.py.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Lib/distutils/tests/test_build_ext.py 2021-06-02 05:46:15.000000000 +1000
|
|
@@ -475,7 +475,11 @@
|
|
target = '%02d%01d0' % target
|
|
else:
|
|
# for 10.10 and beyond -> "10nn00"
|
|
- target = '%02d%02d00' % target
|
|
+ if len(target) >= 2:
|
|
+ target = '%02d%02d00' % target
|
|
+ else:
|
|
+ # 11 and later can have no minor version (11 instead of 11.0)
|
|
+ target = '%02d0000' % target
|
|
deptarget_ext = Extension(
|
|
'deptarget',
|
|
[deptarget_c],
|
|
--- Lib/distutils/unixccompiler.py.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Lib/distutils/unixccompiler.py 2021-06-02 05:47:23.000000000 +1000
|
|
@@ -290,7 +290,7 @@
|
|
cflags = sysconfig.get_config_var('CFLAGS')
|
|
m = re.search(r'-isysroot\s*(\S+)', cflags)
|
|
if m is None:
|
|
- sysroot = '/'
|
|
+ sysroot = _osx_support._default_sysroot(sysconfig.get_config_var('CC'))
|
|
else:
|
|
sysroot = m.group(1)
|
|
|
|
--- Lib/sysconfig.py.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Lib/sysconfig.py 2021-06-02 05:49:01.000000000 +1000
|
|
@@ -18,6 +18,11 @@
|
|
'parse_config_h',
|
|
]
|
|
|
|
+# Keys for get_config_var() that are never converted to Python integers.
|
|
+_ALWAYS_STR = {
|
|
+ 'MACOSX_DEPLOYMENT_TARGET',
|
|
+}
|
|
+
|
|
_INSTALL_SCHEMES = {
|
|
'posix_prefix': {
|
|
'stdlib': '{installed_base}/lib/python{py_version_short}',
|
|
@@ -242,6 +247,9 @@
|
|
notdone[n] = v
|
|
else:
|
|
try:
|
|
+ if n in _ALWAYS_STR:
|
|
+ raise ValueError
|
|
+
|
|
v = int(v)
|
|
except ValueError:
|
|
# insert literal `$'
|
|
@@ -300,6 +308,8 @@
|
|
notdone[name] = value
|
|
else:
|
|
try:
|
|
+ if name in _ALWAYS_STR:
|
|
+ raise ValueError
|
|
value = int(value)
|
|
except ValueError:
|
|
done[name] = value.strip()
|
|
@@ -460,6 +470,8 @@
|
|
if m:
|
|
n, v = m.group(1, 2)
|
|
try:
|
|
+ if n in _ALWAYS_STR:
|
|
+ raise ValueError
|
|
v = int(v)
|
|
except ValueError:
|
|
pass
|
|
--- Lib/test/test_bytes.py.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Lib/test/test_bytes.py 2021-06-02 05:50:46.000000000 +1000
|
|
@@ -903,6 +903,7 @@
|
|
c_char_p)
|
|
|
|
PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
|
|
+ PyBytes_FromFormat.argtypes = (c_char_p,)
|
|
PyBytes_FromFormat.restype = py_object
|
|
|
|
# basic tests
|
|
--- Lib/test/test_platform.py.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Lib/test/test_platform.py 2021-06-02 05:56:02.000000000 +1000
|
|
@@ -254,7 +254,7 @@
|
|
self.assertEqual(res[1], ('', '', ''))
|
|
|
|
if sys.byteorder == 'little':
|
|
- self.assertIn(res[2], ('i386', 'x86_64'))
|
|
+ self.assertIn(res[2], ('i386', 'x86_64', 'arm64'))
|
|
else:
|
|
self.assertEqual(res[2], 'PowerPC')
|
|
|
|
--- Lib/test/test_unicode.py.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Lib/test/test_unicode.py 2021-06-02 05:57:50.000000000 +1000
|
|
@@ -2458,11 +2458,13 @@
|
|
def test_from_format(self):
|
|
support.import_module('ctypes')
|
|
from ctypes import (
|
|
+ c_char_p,
|
|
pythonapi, py_object, sizeof,
|
|
c_int, c_long, c_longlong, c_ssize_t,
|
|
c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p)
|
|
name = "PyUnicode_FromFormat"
|
|
_PyUnicode_FromFormat = getattr(pythonapi, name)
|
|
+ _PyUnicode_FromFormat.argtypes = (c_char_p,)
|
|
_PyUnicode_FromFormat.restype = py_object
|
|
|
|
def PyUnicode_FromFormat(format, *args):
|
|
--- Mac/README.rst.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Mac/README.rst 2021-06-02 06:03:31.000000000 +1000
|
|
@@ -120,6 +120,8 @@
|
|
using the configure option ``--with-universal-archs=VALUE``. The following
|
|
values are available:
|
|
|
|
+ * ``universal2``: ``arm64``, ``x86_64``
|
|
+
|
|
* ``intel``: ``i386``, ``x86_64``
|
|
|
|
* ``intel-32``: ``i386``
|
|
@@ -155,6 +157,8 @@
|
|
|
|
* 10.15 and later SDKs support ``intel-64`` only
|
|
|
|
+ * 11.0 and later SDKs support ``universal2``
|
|
+
|
|
The makefile for a framework build will also install ``python3.x-32``
|
|
binaries when the universal architecture includes at least one 32-bit
|
|
architecture (that is, for all flavors but ``64-bit`` and ``intel-64``).
|
|
--- Mac/Tools/pythonw.c.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Mac/Tools/pythonw.c 2021-06-02 06:04:24.000000000 +1000
|
|
@@ -95,9 +95,6 @@
|
|
size_t count;
|
|
cpu_type_t cpu_types[1];
|
|
short flags = 0;
|
|
-#ifdef __LP64__
|
|
- int ch;
|
|
-#endif
|
|
|
|
if ((errno = posix_spawnattr_init(spawnattr)) != 0) {
|
|
err(2, "posix_spawnattr_int");
|
|
@@ -119,10 +116,16 @@
|
|
|
|
#elif defined(__ppc__)
|
|
cpu_types[0] = CPU_TYPE_POWERPC;
|
|
+
|
|
#elif defined(__i386__)
|
|
cpu_types[0] = CPU_TYPE_X86;
|
|
+
|
|
+#elif defined(__arm64__)
|
|
+ cpu_types[0] = CPU_TYPE_ARM64;
|
|
+
|
|
#else
|
|
# error "Unknown CPU"
|
|
+
|
|
#endif
|
|
|
|
if (posix_spawnattr_setbinpref_np(spawnattr, count,
|
|
@@ -220,7 +223,8 @@
|
|
/* We're weak-linking to posix-spawnv to ensure that
|
|
* an executable build on 10.5 can work on 10.4.
|
|
*/
|
|
- if (posix_spawn != NULL) {
|
|
+
|
|
+ if (&posix_spawn != NULL) {
|
|
posix_spawnattr_t spawnattr = NULL;
|
|
|
|
setup_spawnattr(&spawnattr);
|
|
--- Misc/ACKS.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Misc/ACKS 2021-06-02 06:05:21.000000000 +1000
|
|
@@ -128,6 +128,7 @@
|
|
Ian Beer
|
|
Stefan Behnel
|
|
Reimer Behrends
|
|
+Maxime Bélanger
|
|
Ben Bell
|
|
Thomas Bellman
|
|
Alexander “Саша” Belopolsky
|
|
@@ -334,6 +335,7 @@
|
|
David Costanzo
|
|
Scott Cotton
|
|
Greg Couch
|
|
+FX Coudert
|
|
David Cournapeau
|
|
Julien Courteau
|
|
Steve Cousins
|
|
@@ -363,6 +365,7 @@
|
|
Evan Dandrea
|
|
Eric Daniel
|
|
Scott David Daniels
|
|
+Lawrence D'Anna
|
|
Ben Darnell
|
|
Kushal Das
|
|
Jonathan Dasteel
|
|
@@ -1411,6 +1414,7 @@
|
|
Rusty Russell
|
|
Nick Russo
|
|
James Rutherford
|
|
+Eli Rykoff
|
|
Chris Ryland
|
|
Bernt Røskar Brenna
|
|
Constantina S.
|
|
--- Modules/_ctypes/callbacks.c.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Modules/_ctypes/callbacks.c 2021-06-02 06:07:10.000000000 +1000
|
|
@@ -1,6 +1,8 @@
|
|
#include "Python.h"
|
|
#include "frameobject.h"
|
|
|
|
+#include <stdbool.h>
|
|
+
|
|
#include <ffi.h>
|
|
#ifdef MS_WIN32
|
|
#include <windows.h>
|
|
@@ -18,7 +20,7 @@
|
|
Py_XDECREF(self->callable);
|
|
Py_XDECREF(self->restype);
|
|
if (self->pcl_write)
|
|
- ffi_closure_free(self->pcl_write);
|
|
+ Py_ffi_closure_free(self->pcl_write);
|
|
PyObject_GC_Del(self);
|
|
}
|
|
|
|
@@ -341,8 +343,7 @@
|
|
|
|
assert(CThunk_CheckExact((PyObject *)p));
|
|
|
|
- p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure),
|
|
- &p->pcl_exec);
|
|
+ p->pcl_write = Py_ffi_closure_alloc(sizeof(ffi_closure), &p->pcl_exec);
|
|
if (p->pcl_write == NULL) {
|
|
PyErr_NoMemory();
|
|
goto error;
|
|
@@ -388,13 +389,35 @@
|
|
"ffi_prep_cif failed with %d", result);
|
|
goto error;
|
|
}
|
|
-#if defined(X86_DARWIN) || defined(POWERPC_DARWIN)
|
|
- result = ffi_prep_closure(p->pcl_write, &p->cif, closure_fcn, p);
|
|
+#if HAVE_FFI_PREP_CLOSURE_LOC
|
|
+# if USING_APPLE_OS_LIBFFI
|
|
+# define HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)
|
|
+# else
|
|
+# define HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME 1
|
|
+# endif
|
|
+ if (HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME) {
|
|
+ result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn,
|
|
+ p,
|
|
+ p->pcl_exec);
|
|
+ } else
|
|
+#endif
|
|
+ {
|
|
+#if USING_APPLE_OS_LIBFFI && defined(__arm64__)
|
|
+ PyErr_Format(PyExc_NotImplementedError, "ffi_prep_closure_loc() is missing");
|
|
+ goto error;
|
|
#else
|
|
- result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn,
|
|
- p,
|
|
- p->pcl_exec);
|
|
+#ifdef MACOSX
|
|
+ #pragma clang diagnostic push
|
|
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
#endif
|
|
+ result = ffi_prep_closure(p->pcl_write, &p->cif, closure_fcn, p);
|
|
+
|
|
+#ifdef MACOSX
|
|
+ #pragma clang diagnostic pop
|
|
+#endif
|
|
+
|
|
+#endif
|
|
+ }
|
|
if (result != FFI_OK) {
|
|
PyErr_Format(PyExc_RuntimeError,
|
|
"ffi_prep_closure failed with %d", result);
|
|
--- Modules/_ctypes/callproc.c.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Modules/_ctypes/callproc.c 2021-06-02 06:10:03.000000000 +1000
|
|
@@ -57,6 +57,8 @@
|
|
#include "Python.h"
|
|
#include "structmember.h"
|
|
|
|
+#include <stdbool.h>
|
|
+
|
|
#ifdef MS_WIN32
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
@@ -64,6 +66,10 @@
|
|
#include "ctypes_dlfcn.h"
|
|
#endif
|
|
|
|
+#ifdef __APPLE__
|
|
+#include <mach-o/dyld.h>
|
|
+#endif
|
|
+
|
|
#ifdef MS_WIN32
|
|
#include <malloc.h>
|
|
#endif
|
|
@@ -754,7 +760,8 @@
|
|
ffi_type **atypes,
|
|
ffi_type *restype,
|
|
void *resmem,
|
|
- int argcount)
|
|
+ int argcount,
|
|
+ int argtypecount)
|
|
{
|
|
PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */
|
|
PyObject *error_object = NULL;
|
|
@@ -780,14 +787,70 @@
|
|
if ((flags & FUNCFLAG_CDECL) == 0)
|
|
cc = FFI_STDCALL;
|
|
#endif
|
|
- if (FFI_OK != ffi_prep_cif(&cif,
|
|
- cc,
|
|
- argcount,
|
|
- restype,
|
|
- atypes)) {
|
|
- PyErr_SetString(PyExc_RuntimeError,
|
|
- "ffi_prep_cif failed");
|
|
- return -1;
|
|
+
|
|
+# if USING_APPLE_OS_LIBFFI
|
|
+# define HAVE_FFI_PREP_CIF_VAR_RUNTIME __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)
|
|
+# elif HAVE_FFI_PREP_CIF_VAR
|
|
+# define HAVE_FFI_PREP_CIF_VAR_RUNTIME true
|
|
+# else
|
|
+# define HAVE_FFI_PREP_CIF_VAR_RUNTIME false
|
|
+# endif
|
|
+
|
|
+ /* Even on Apple-arm64 the calling convention for variadic functions conincides
|
|
+ * with the standard calling convention in the case that the function called
|
|
+ * only with its fixed arguments. Thus, we do not need a special flag to be
|
|
+ * set on variadic functions. We treat a function as variadic if it is called
|
|
+ * with a nonzero number of variadic arguments */
|
|
+ bool is_variadic = (argtypecount != 0 && argcount > argtypecount);
|
|
+ (void) is_variadic;
|
|
+
|
|
+#if defined(__APPLE__) && defined(__arm64__)
|
|
+ if (is_variadic) {
|
|
+ if (HAVE_FFI_PREP_CIF_VAR_RUNTIME) {
|
|
+ } else {
|
|
+ PyErr_SetString(PyExc_NotImplementedError, "ffi_prep_cif_var() is missing");
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+
|
|
+#if HAVE_FFI_PREP_CIF_VAR
|
|
+ if (is_variadic) {
|
|
+ if (HAVE_FFI_PREP_CIF_VAR_RUNTIME) {
|
|
+ if (FFI_OK != ffi_prep_cif_var(&cif,
|
|
+ cc,
|
|
+ argtypecount,
|
|
+ argcount,
|
|
+ restype,
|
|
+ atypes)) {
|
|
+ PyErr_SetString(PyExc_RuntimeError,
|
|
+ "ffi_prep_cif_var failed");
|
|
+ return -1;
|
|
+ }
|
|
+ } else {
|
|
+ if (FFI_OK != ffi_prep_cif(&cif,
|
|
+ cc,
|
|
+ argcount,
|
|
+ restype,
|
|
+ atypes)) {
|
|
+ PyErr_SetString(PyExc_RuntimeError,
|
|
+ "ffi_prep_cif failed");
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+ } else
|
|
+#endif
|
|
+
|
|
+ {
|
|
+ if (FFI_OK != ffi_prep_cif(&cif,
|
|
+ cc,
|
|
+ argcount,
|
|
+ restype,
|
|
+ atypes)) {
|
|
+ PyErr_SetString(PyExc_RuntimeError,
|
|
+ "ffi_prep_cif failed");
|
|
+ return -1;
|
|
+ }
|
|
}
|
|
|
|
if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) {
|
|
@@ -1187,9 +1250,8 @@
|
|
|
|
if (-1 == _call_function_pointer(flags, pProc, avalues, atypes,
|
|
rtype, resbuf,
|
|
- Py_SAFE_DOWNCAST(argcount,
|
|
- Py_ssize_t,
|
|
- int)))
|
|
+ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int),
|
|
+ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int)))
|
|
goto cleanup;
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
@@ -1341,6 +1403,42 @@
|
|
}
|
|
#else
|
|
|
|
+#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH
|
|
+static PyObject *py_dyld_shared_cache_contains_path(PyObject *self, PyObject *args)
|
|
+{
|
|
+ PyObject *name, *name2;
|
|
+ char *name_str;
|
|
+
|
|
+ if (__builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)) {
|
|
+ int r;
|
|
+
|
|
+ if (!PyArg_ParseTuple(args, "O", &name))
|
|
+ return NULL;
|
|
+
|
|
+ if (name == Py_None)
|
|
+ Py_RETURN_FALSE;
|
|
+
|
|
+ if (PyUnicode_FSConverter(name, &name2) == 0)
|
|
+ return NULL;
|
|
+ name_str = PyBytes_AS_STRING(name2);
|
|
+
|
|
+ r = _dyld_shared_cache_contains_path(name_str);
|
|
+ Py_DECREF(name2);
|
|
+
|
|
+ if (r) {
|
|
+ Py_RETURN_TRUE;
|
|
+ } else {
|
|
+ Py_RETURN_FALSE;
|
|
+ }
|
|
+
|
|
+ } else {
|
|
+ PyErr_SetString(PyExc_NotImplementedError, "_dyld_shared_cache_contains_path symbol is missing");
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ }
|
|
+#endif
|
|
+
|
|
static PyObject *py_dl_open(PyObject *self, PyObject *args)
|
|
{
|
|
PyObject *name, *name2;
|
|
@@ -1805,6 +1903,8 @@
|
|
return Py_BuildValue("siN", dict->format, dict->ndim, shape);
|
|
}
|
|
|
|
+
|
|
+
|
|
PyMethodDef _ctypes_module_methods[] = {
|
|
{"get_errno", get_errno, METH_NOARGS},
|
|
{"set_errno", set_errno, METH_VARARGS},
|
|
@@ -1827,6 +1927,9 @@
|
|
{"dlclose", py_dl_close, METH_VARARGS, "dlclose a library"},
|
|
{"dlsym", py_dl_sym, METH_VARARGS, "find symbol in shared library"},
|
|
#endif
|
|
+#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH
|
|
+ {"_dyld_shared_cache_contains_path", py_dyld_shared_cache_contains_path, METH_VARARGS, "check if path is in the shared cache"},
|
|
+#endif
|
|
{"alignment", align_func, METH_O, alignment_doc},
|
|
{"sizeof", sizeof_func, METH_O, sizeof_doc},
|
|
{"byref", byref, METH_VARARGS, byref_doc},
|
|
--- Modules/_ctypes/ctypes.h.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Modules/_ctypes/ctypes.h 2021-06-02 06:11:40.000000000 +1000
|
|
@@ -366,6 +366,14 @@
|
|
extern PyObject *ComError;
|
|
#endif
|
|
|
|
+#if USING_MALLOC_CLOSURE_DOT_C
|
|
+void Py_ffi_closure_free(void *p);
|
|
+void *Py_ffi_closure_alloc(size_t size, void** codeloc);
|
|
+#else
|
|
+#define Py_ffi_closure_free ffi_closure_free
|
|
+#define Py_ffi_closure_alloc ffi_closure_alloc
|
|
+#endif
|
|
+
|
|
/*
|
|
Local Variables:
|
|
compile-command: "python setup.py -q build install --home ~"
|
|
--- Modules/_ctypes/malloc_closure.c.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Modules/_ctypes/malloc_closure.c 2021-06-02 06:12:42.000000000 +1000
|
|
@@ -89,16 +89,35 @@ static void more_core(void)
|
|
/******************************************************************/
|
|
|
|
/* put the item back into the free list */
|
|
-void ffi_closure_free(void *p)
|
|
+void Py_ffi_closure_free(void *p)
|
|
{
|
|
+#if HAVE_FFI_CLOSURE_ALLOC
|
|
+#if USING_APPLE_OS_LIBFFI
|
|
+ if (__builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)) {
|
|
+#endif
|
|
+ ffi_closure_free(p);
|
|
+ return;
|
|
+#if USING_APPLE_OS_LIBFFI
|
|
+ }
|
|
+#endif
|
|
+#endif
|
|
ITEM *item = (ITEM *)p;
|
|
item->next = free_list;
|
|
free_list = item;
|
|
}
|
|
|
|
/* return one item from the free list, allocating more if needed */
|
|
-void *ffi_closure_alloc(size_t ignored, void** codeloc)
|
|
+void *Py_ffi_closure_alloc(size_t size, void** codeloc)
|
|
{
|
|
+#if HAVE_FFI_CLOSURE_ALLOC
|
|
+#if USING_APPLE_OS_LIBFFI
|
|
+ if (__builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)) {
|
|
+#endif
|
|
+ return ffi_closure_alloc(size, codeloc);
|
|
+#if USING_APPLE_OS_LIBFFI
|
|
+ }
|
|
+#endif
|
|
+#endif
|
|
ITEM *item;
|
|
if (!free_list)
|
|
more_core();
|
|
--- Modules/_decimal/libmpdec/mpdecimal.h.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ Modules/_decimal/libmpdec/mpdecimal.h 2021-06-02 06:14:03.000000000 +1000
|
|
@@ -135,6 +135,9 @@ const char *mpd_version(void);
|
|
#elif defined(__x86_64__)
|
|
#define CONFIG_64
|
|
#define ASM
|
|
+ #elif defined(__arm64__)
|
|
+ #define CONFIG_64
|
|
+ #define ANSI
|
|
#else
|
|
#error "unknown architecture for universal build."
|
|
#endif
|
|
--- configure.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ configure 2021-06-02 06:21:14.000000000 +1000
|
|
@@ -1490,7 +1490,7 @@
|
|
--with-universal-archs=ARCH
|
|
select architectures for universal build ("32-bit",
|
|
"64-bit", "3-way", "intel", "intel-32", "intel-64",
|
|
- or "all")
|
|
+ "universal2", or "all")
|
|
--with-framework-name=FRAMEWORK
|
|
specify an alternate name of the framework built
|
|
with --enable-framework
|
|
@@ -6899,7 +6899,7 @@
|
|
|
|
|
|
|
|
-# The -arch flags for universal builds on OSX
|
|
+# The -arch flags for universal builds on macOS
|
|
UNIVERSAL_ARCH_FLAGS=
|
|
|
|
|
|
@@ -7427,6 +7427,11 @@
|
|
LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386"
|
|
ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
|
|
;;
|
|
+ universal2)
|
|
+ UNIVERSAL_ARCH_FLAGS="-arch arm64 -arch x86_64"
|
|
+ LIPO_32BIT_FLAGS=""
|
|
+ ARCH_RUN_32BIT="true"
|
|
+ ;;
|
|
intel)
|
|
UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64"
|
|
LIPO_32BIT_FLAGS="-extract i386"
|
|
@@ -7448,7 +7453,7 @@
|
|
ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
|
|
;;
|
|
*)
|
|
- as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5
|
|
+ as_fn_error $? "proper usage is --with-universal-arch=universal2|32-bit|64-bit|all|intel|3-way" "$LINENO" 5
|
|
;;
|
|
esac
|
|
|
|
@@ -9240,7 +9245,7 @@
|
|
MACOSX_DEFAULT_ARCH="ppc"
|
|
;;
|
|
*)
|
|
- as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5
|
|
+ as_fn_error $? "Unexpected output of 'arch' on macOS" "$LINENO" 5
|
|
;;
|
|
esac
|
|
else
|
|
@@ -9255,7 +9260,7 @@
|
|
MACOSX_DEFAULT_ARCH="arm64"
|
|
;;
|
|
*)
|
|
- as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5
|
|
+ as_fn_error $? "Unexpected output of 'arch' on macOS" "$LINENO" 5
|
|
;;
|
|
esac
|
|
|
|
@@ -11808,6 +11813,31 @@
|
|
|
|
fi
|
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _dyld_shared_cache_contains_path" >&5
|
|
+$as_echo_n "checking for _dyld_shared_cache_contains_path... " >&6; }
|
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
+/* end confdefs.h. */
|
|
+#include <mach-o/dyld.h>
|
|
+int
|
|
+main ()
|
|
+{
|
|
+void *x=_dyld_shared_cache_contains_path
|
|
+ ;
|
|
+ return 0;
|
|
+}
|
|
+_ACEOF
|
|
+if ac_fn_c_try_compile "$LINENO"; then :
|
|
+
|
|
+$as_echo "#define HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH 1" >>confdefs.h
|
|
+
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
|
+$as_echo "yes" >&6; }
|
|
+else
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
+$as_echo "no" >&6; }
|
|
+
|
|
+fi
|
|
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|
|
|
# On some systems (eg. FreeBSD 5), we would find a definition of the
|
|
# functions ctermid_r, setgroups in the library, but no prototype
|
|
--- pyconfig.h.in.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ pyconfig.h.in 2021-06-02 06:26:35.000000000 +1000
|
|
@@ -725,6 +725,9 @@
|
|
/* Define if you have the 'prlimit' functions. */
|
|
#undef HAVE_PRLIMIT
|
|
|
|
+/* Define if you have the '_dyld_shared_cache_contains_path' function. */
|
|
+#undef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH
|
|
+
|
|
/* Define to 1 if you have the <process.h> header file. */
|
|
#undef HAVE_PROCESS_H
|
|
|
|
--- setup.py.orig 2021-02-16 12:29:22.000000000 +1100
|
|
+++ setup.py 2021-06-02 07:13:42.000000000 +1000
|
|
@@ -6,6 +6,7 @@
|
|
import importlib._bootstrap
|
|
import importlib.util
|
|
import sysconfig
|
|
+import _osx_support
|
|
|
|
from distutils import log
|
|
from distutils.errors import *
|
|
@@ -114,31 +115,8 @@
|
|
if m is not None:
|
|
MACOS_SDK_ROOT = m.group(1)
|
|
else:
|
|
- MACOS_SDK_ROOT = '/'
|
|
- cc = sysconfig.get_config_var('CC')
|
|
- tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid()
|
|
- try:
|
|
- os.unlink(tmpfile)
|
|
- except:
|
|
- pass
|
|
- ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile))
|
|
- in_incdirs = False
|
|
- try:
|
|
- if ret >> 8 == 0:
|
|
- with open(tmpfile) as fp:
|
|
- for line in fp.readlines():
|
|
- if line.startswith("#include <...>"):
|
|
- in_incdirs = True
|
|
- elif line.startswith("End of search list"):
|
|
- in_incdirs = False
|
|
- elif in_incdirs:
|
|
- line = line.strip()
|
|
- if line == '/usr/include':
|
|
- MACOS_SDK_ROOT = '/'
|
|
- elif line.endswith(".sdk/usr/include"):
|
|
- MACOS_SDK_ROOT = line[:-12]
|
|
- finally:
|
|
- os.unlink(tmpfile)
|
|
+ MACOS_SDK_ROOT = _osx_support._default_sysroot(
|
|
+ sysconfig.get_config_var('CC'))
|
|
|
|
return MACOS_SDK_ROOT
|
|
|
|
@@ -150,6 +128,13 @@
|
|
or path.startswith('/System/')
|
|
or path.startswith('/Library/') )
|
|
|
|
+def grep_headers_for(function, headers):
|
|
+ for header in headers:
|
|
+ with open(header, 'r', errors='surrogateescape') as f:
|
|
+ if function in f.read():
|
|
+ return True
|
|
+ return False
|
|
+
|
|
def find_file(filename, std_dirs, paths):
|
|
"""Searches for the directory where a given file is located,
|
|
and returns a possibly-empty list of additional directories, or None
|
|
@@ -1936,43 +1921,16 @@
|
|
# *** Uncomment these for TOGL extension only:
|
|
# -lGL -lGLU -lXext -lXmu \
|
|
|
|
- def configure_ctypes_darwin(self, ext):
|
|
- # Darwin (OS X) uses preconfigured files, in
|
|
- # the Modules/_ctypes/libffi_osx directory.
|
|
- srcdir = sysconfig.get_config_var('srcdir')
|
|
- ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
|
|
- '_ctypes', 'libffi_osx'))
|
|
- sources = [os.path.join(ffi_srcdir, p)
|
|
- for p in ['ffi.c',
|
|
- 'x86/darwin64.S',
|
|
- 'x86/x86-darwin.S',
|
|
- 'x86/x86-ffi_darwin.c',
|
|
- 'x86/x86-ffi64.c',
|
|
- 'powerpc/ppc-darwin.S',
|
|
- 'powerpc/ppc-darwin_closure.S',
|
|
- 'powerpc/ppc-ffi_darwin.c',
|
|
- 'powerpc/ppc64-darwin_closure.S',
|
|
- ]]
|
|
-
|
|
- # Add .S (preprocessed assembly) to C compiler source extensions.
|
|
- self.compiler.src_extensions.append('.S')
|
|
-
|
|
- include_dirs = [os.path.join(ffi_srcdir, 'include'),
|
|
- os.path.join(ffi_srcdir, 'powerpc')]
|
|
- ext.include_dirs.extend(include_dirs)
|
|
- ext.sources.extend(sources)
|
|
- return True
|
|
-
|
|
def configure_ctypes(self, ext):
|
|
- if not self.use_system_libffi:
|
|
- if host_platform == 'darwin':
|
|
- return self.configure_ctypes_darwin(ext)
|
|
- print('INFO: Could not locate ffi libs and/or headers')
|
|
- return False
|
|
return True
|
|
|
|
def detect_ctypes(self, inc_dirs, lib_dirs):
|
|
- self.use_system_libffi = False
|
|
+
|
|
+ if (not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and host_platform == 'darwin'):
|
|
+ self.use_system_libffi = True
|
|
+ else:
|
|
+ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS")
|
|
+
|
|
include_dirs = []
|
|
extra_compile_args = []
|
|
extra_link_args = []
|
|
@@ -1985,7 +1943,7 @@
|
|
|
|
if host_platform == 'darwin':
|
|
sources.append('_ctypes/malloc_closure.c')
|
|
- sources.append('_ctypes/darwin/dlfcn_simple.c')
|
|
+ extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C=1')
|
|
extra_compile_args.append('-DMACOSX')
|
|
include_dirs.append('_ctypes/darwin')
|
|
# XXX Is this still needed?
|
|
@@ -2018,30 +1976,47 @@
|
|
libraries=['m'])
|
|
self.extensions.extend([ext, ext_test])
|
|
|
|
+ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
|
|
+ ffi_lib = None
|
|
+
|
|
if host_platform == 'darwin':
|
|
- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"):
|
|
- return
|
|
- # OS X 10.5 comes with libffi.dylib; the include files are
|
|
- # in /usr/include/ffi
|
|
- inc_dirs.append('/usr/include/ffi')
|
|
-
|
|
- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
|
|
- if not ffi_inc or ffi_inc[0] == '':
|
|
- ffi_inc = find_file('ffi.h', [], inc_dirs)
|
|
- if ffi_inc is not None:
|
|
- ffi_h = ffi_inc[0] + '/ffi.h'
|
|
+ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi")
|
|
+
|
|
+ if not ffi_inc:
|
|
+ if os.path.exists(ffi_in_sdk):
|
|
+ ext.extra_compile_args.append("-DUSING_APPLE_OS_LIBFFI=1")
|
|
+ ffi_inc = ffi_in_sdk
|
|
+ ffi_lib = 'ffi'
|
|
+ else:
|
|
+ # OS X 10.5 comes with libffi.dylib; the include files are
|
|
+ # in /usr/include/ffi
|
|
+ inc_dirs.append('/usr/include/ffi')
|
|
+
|
|
+ if not ffi_inc:
|
|
+ found = find_file('ffi.h', [], ffi_inc_dirs)
|
|
+ if found:
|
|
+ ffi_inc = found[0]
|
|
+ if ffi_inc:
|
|
+ ffi_h = ffi_inc + '/ffi.h'
|
|
if not os.path.exists(ffi_h):
|
|
ffi_inc = None
|
|
print('Header file {} does not exist'.format(ffi_h))
|
|
- ffi_lib = None
|
|
- if ffi_inc is not None:
|
|
+ if ffi_lib is None and ffi_inc:
|
|
for lib_name in ('ffi', 'ffi_pic'):
|
|
if (self.compiler.find_library_file(lib_dirs, lib_name)):
|
|
ffi_lib = lib_name
|
|
break
|
|
|
|
if ffi_inc and ffi_lib:
|
|
- ext.include_dirs.extend(ffi_inc)
|
|
+ ffi_headers = glob(os.path.join(ffi_inc, '*.h'))
|
|
+ if grep_headers_for('ffi_prep_cif_var', ffi_headers):
|
|
+ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1")
|
|
+ if grep_headers_for('ffi_prep_closure_loc', ffi_headers):
|
|
+ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CLOSURE_LOC=1")
|
|
+ if grep_headers_for('ffi_closure_alloc', ffi_headers):
|
|
+ ext.extra_compile_args.append("-DHAVE_FFI_CLOSURE_ALLOC=1")
|
|
+
|
|
+ ext.include_dirs.append(ffi_inc)
|
|
ext.libraries.append(ffi_lib)
|
|
self.use_system_libffi = True
|
|
|