]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-141692: Add a slice-specific lib folder to iOS XCframeworks. (GH-141693...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 19 Nov 2025 02:25:34 +0000 (03:25 +0100)
committerGitHub <noreply@github.com>
Wed, 19 Nov 2025 02:25:34 +0000 (02:25 +0000)
Modifies the iOS XCframework to include a lib folder for each slice that
contains a symlinked version of the libPython dynamic library.
(cherry picked from commit 7b0b70867586ef7109de60ccce94d13164dbb776)

Co-authored-by: Russell Keith-Magee <russell@keith-magee.com>
Apple/__main__.py
Apple/testbed/Python.xcframework/build/utils.sh
Makefile.pre.in
Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst [new file with mode: 0644]

index 1c588c23d6b5d1a0568f1efc1359310ff8782c8a..256966e76c2c977bdf55d00e525525b358ec75d4 100644 (file)
@@ -477,6 +477,12 @@ def lib_platform_files(dirname, names):
                 or name == "build-details.json"
             )
         }
+    elif path.parts[-1] == "lib":
+        ignored_names = {
+            name
+            for name in names
+            if name.startswith("libpython") and name.endswith(".dylib")
+        }
     else:
         ignored_names = set()
 
@@ -614,6 +620,12 @@ def create_xcframework(platform: str) -> str:
             slice_framework / "Headers/pyconfig.h",
         )
 
+        print(f" - {slice_name} shared library")
+        # Create a simlink for the fat library
+        shared_lib = slice_path / f"lib/libpython{version_tag}.dylib"
+        shared_lib.parent.mkdir()
+        shared_lib.symlink_to("../Python.framework/Python")
+
         print(f" - {slice_name} architecture-specific files")
         for host_triple, multiarch in slice_parts.items():
             print(f"   - {multiarch} standard library")
@@ -625,6 +637,7 @@ def create_xcframework(platform: str) -> str:
                     framework_path(host_triple, multiarch) / "lib",
                     package_path / "Python.xcframework/lib",
                     ignore=lib_platform_files,
+                    symlinks=True,
                 )
                 has_common_stdlib = True
 
@@ -632,6 +645,7 @@ def create_xcframework(platform: str) -> str:
                 framework_path(host_triple, multiarch) / "lib",
                 slice_path / f"lib-{arch}",
                 ignore=lib_non_platform_files,
+                symlinks=True,
             )
 
             # Copy the host's pyconfig.h to an architecture-specific name.
index 961c46d014b5f5445272499aaf3ada35e7776e09..e7155d8b30e213ab56c7d4bf2bfda8ba42409e6b 100755 (executable)
@@ -46,7 +46,8 @@ install_stdlib() {
         rsync -au --delete "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/"
         rsync -au "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib-$ARCHS/" "$CODESIGNING_FOLDER_PATH/python/lib/"
     else
-        rsync -au --delete "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/"
+        # A single-arch framework will have a libpython symlink; that can't be included at runtime
+        rsync -au --delete "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/" --exclude 'libpython*.dylib'
     fi
 }
 
index 711628a4c2224207c875d5b5b0aa711ca9da32d3..f29de054aba6ee748c7c2d92129327b4b328aaa9 100644 (file)
@@ -3033,6 +3033,9 @@ frameworkinstallunversionedstructure:     $(LDLIBRARY)
        $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)
        sed 's/%VERSION%/'"`$(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import platform; print(platform.python_version())'`"'/g' < $(RESSRCDIR)/Info.plist > $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Info.plist
        $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(LDLIBRARY)
+       $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(LIBDIR)
+       $(LN) -fs "../$(LDLIBRARY)" "$(DESTDIR)$(prefix)/lib/libpython$(LDVERSION).dylib"
+       $(LN) -fs "../$(LDLIBRARY)" "$(DESTDIR)$(prefix)/lib/libpython$(VERSION).dylib"
        $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(BINDIR)
        for file in $(srcdir)/$(RESSRCDIR)/bin/* ; do \
                $(INSTALL) -m $(EXEMODE) $$file $(DESTDIR)$(BINDIR); \
diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst b/Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst
new file mode 100644 (file)
index 0000000..d85c54d
--- /dev/null
@@ -0,0 +1,3 @@
+Each slice of an iOS XCframework now contains a ``lib`` folder that contains
+a symlink to the libpython dylib. This allows binary modules to be compiled
+for iOS using dynamic libreary linking, rather than Framework linking.