python39: backport patch to accomodate system library changes in Big Sur

(cherry picked from commit 9738723b2486cfe9988abbff0c873cce5cba1849)
main
Martin Weinelt 3 years ago committed by Jonathan Ringer
parent 05eb41e468
commit 59cd736ec2
  1. 84
      pkgs/development/interpreters/python/cpython/3.9/bpo-44689-ctypes.util.find_library-now-finds-macOS-1.patch
  2. 3
      pkgs/development/interpreters/python/cpython/default.nix

@ -0,0 +1,84 @@
From 4b55837e7c747e0f3bd2df1b5c8996ce86c6f60a Mon Sep 17 00:00:00 2001
From: "Miss Islington (bot)"
<31488909+miss-islington@users.noreply.github.com>
Date: Mon, 30 Aug 2021 02:08:16 -0700
Subject: [PATCH] bpo-44689: ctypes.util.find_library() now finds macOS 11+
system libraries when built on older macOS systems (GH-27251) (GH-28053)
Previously, when built on older macOS systems, `find_library` was not able to find macOS system libraries when running on Big Sur due to changes in how system libraries are stored.
(cherry picked from commit 71853a73024a98aa38a3c0444fe364dbd9709134)
Co-authored-by: Tobias Bergkvist <tobias@bergkv.ist>
---
.../2021-07-20-22-27-01.bpo-44689.mmT_xH.rst | 5 ++++
Modules/_ctypes/callproc.c | 29 +++++++++++++++++--
2 files changed, 31 insertions(+), 3 deletions(-)
create mode 100644 Misc/NEWS.d/next/macOS/2021-07-20-22-27-01.bpo-44689.mmT_xH.rst
diff --git a/Misc/NEWS.d/next/macOS/2021-07-20-22-27-01.bpo-44689.mmT_xH.rst b/Misc/NEWS.d/next/macOS/2021-07-20-22-27-01.bpo-44689.mmT_xH.rst
new file mode 100644
index 0000000000..b1e878d1ee
--- /dev/null
+++ b/Misc/NEWS.d/next/macOS/2021-07-20-22-27-01.bpo-44689.mmT_xH.rst
@@ -0,0 +1,5 @@
+ :meth:`ctypes.util.find_library` now works correctly on macOS 11 Big Sur
+ even if Python is built on an older version of macOS. Previously, when
+ built on older macOS systems, ``find_library`` was not able to find
+ macOS system libraries when running on Big Sur due to changes in
+ how system libraries are stored.
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index 18984d15ab..b0f1e0bd04 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1449,14 +1449,37 @@ copy_com_pointer(PyObject *self, PyObject *args)
return r;
}
#else
-
+#ifdef __APPLE__
#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH
+#define HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH_RUNTIME \
+ __builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
+#else
+// Support the deprecated case of compiling on an older macOS version
+static void *libsystem_b_handle;
+static bool (*_dyld_shared_cache_contains_path)(const char *path);
+
+__attribute__((constructor)) void load_dyld_shared_cache_contains_path(void) {
+ libsystem_b_handle = dlopen("/usr/lib/libSystem.B.dylib", RTLD_LAZY);
+ if (libsystem_b_handle != NULL) {
+ _dyld_shared_cache_contains_path = dlsym(libsystem_b_handle, "_dyld_shared_cache_contains_path");
+ }
+}
+
+__attribute__((destructor)) void unload_dyld_shared_cache_contains_path(void) {
+ if (libsystem_b_handle != NULL) {
+ dlclose(libsystem_b_handle);
+ }
+}
+#define HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH_RUNTIME \
+ _dyld_shared_cache_contains_path != NULL
+#endif
+
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, *)) {
+ if (HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH_RUNTIME) {
int r;
if (!PyArg_ParseTuple(args, "O", &name))
@@ -1999,7 +2022,7 @@ PyMethodDef _ctypes_module_methods[] = {
{"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
+#ifdef __APPLE__
{"_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},
--
2.33.1

@ -240,6 +240,9 @@ in with passthru; stdenv.mkDerivation {
] ++ optionals (pythonAtLeast "3.9" && stdenv.isDarwin) [
# Stop checking for TCL/TK in global macOS locations
./3.9/darwin-tcl-tk.patch
# ctypes.util.find_library() now finds macOS 11+ system libraries when built on older macOS systems
# https://github.com/python/cpython/pull/28053
./3.9/bpo-44689-ctypes.util.find_library-now-finds-macOS-1.patch
] ++ optionals (isPy3k && hasDistutilsCxxPatch) [
# Fix for http://bugs.python.org/issue1222585
# Upstream distutils is calling C compiler to compile C++ code, which

Loading…
Cancel
Save