feat: add CPython 3.15 support for iOS (#2857)
* feat: add CPython 3.15 support for iOS Assisted-by: OpenCode:Kimi-K2.6 Signed-off-by: Henry Schreiner <henryfs@princeton.edu> * fix: copy in iOS support files Assisted-by: Copilot:claude-sonnet-4.6 Signed-off-by: Henry Schreiner <henryfs@princeton.edu> * fix: skip directories when copying iOS support files When copying multiarch-specific support files (e.g. _cross_arm64_iphoneos.py), the code was trying to copy all items in the directory including __pycache__ directories. The shutil.copy() function only works with files, not directories, which caused an IsADirectoryError. This fix adds a check to only copy files, skipping any directories like __pycache__ that may have been created by Python imports. Assisted-by: Copilot:claude-haiku-4.5 * fix: - in dir fine for now Signed-off-by: Henry Schreiner <henryfs@princeton.edu> * fix: apply review suggestions Assisted-by: Copilot:claude-sonnet-4.6 Signed-off-by: Henry Schreiner <henryfs@princeton.edu> * fix: only do this on 3.15+ Signed-off-by: Henry Schreiner <henryfs@princeton.edu> * Ensure target Python directory exists before build Add assertion to check if target Python directory exists. * fix(ios): use stdlib dir directly instead of copying to platform-config Remove the _inject_support_files workaround for python.org 3.15+ distributions. Instead of copying sysconfig files from the stdlib into a synthetic platform-config/ directory, pass the stdlib directory directly to make_cross_venv.py. make_cross_venv.py is updated to derive the multiarch tag from the _sysconfigdata_ filename rather than assuming it comes from the directory name. Co-authored-by: Russell Keith-Magee <russell@keith-magee.com> Assisted-by: OpenCode:Kimi-K2.6 Signed-off-by: Henry Schreiner <henryfs@princeton.edu> * Minor format cleanups on pre-commit skipped files. * Clarify path names in make_cross_venv script. --------- Signed-off-by: Henry Schreiner <henryfs@princeton.edu> Co-authored-by: Russell Keith-Magee <russell@keith-magee.com>
This commit is contained in:
co-authored by
Russell Keith-Magee
parent
a7b3f178c3
commit
45cfffd3ee
@@ -11,6 +11,7 @@ from pathlib import Path
|
||||
from typing import assert_never
|
||||
|
||||
from filelock import FileLock
|
||||
from packaging.version import Version
|
||||
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.architecture import Architecture
|
||||
@@ -183,18 +184,37 @@ def cross_virtualenv(
|
||||
)
|
||||
|
||||
# Convert the macOS virtual environment into an iOS virtual environment
|
||||
# using the cross-platform conversion script in the iOS distribution.
|
||||
# using make_cross_venv.py.
|
||||
|
||||
# target_python is the path to the Python binary;
|
||||
# determine the root of the XCframework slice that is being used.
|
||||
slice_path = target_python.parent.parent
|
||||
call(
|
||||
"python",
|
||||
str(slice_path / f"platform-config/{multiarch}/make_cross_venv.py"),
|
||||
str(venv_path),
|
||||
env=env,
|
||||
cwd=venv_path,
|
||||
)
|
||||
if Version(py_version) >= Version("3.15"):
|
||||
# python.org 3.15+ distributions: sysconfig data lives in the
|
||||
# stdlib directory (lib-<arch>/python<version>); cross-venv scripts
|
||||
# come from cibuildwheel resources.
|
||||
arch = multiarch.split("-", maxsplit=1)[0]
|
||||
stdlib_path = slice_path / f"lib-{arch}" / f"python{py_version}"
|
||||
call(
|
||||
"python",
|
||||
str(resources.IOS_SUPPORT_FILES / "make_cross_venv.py"),
|
||||
str(venv_path),
|
||||
str(stdlib_path),
|
||||
str(resources.IOS_SUPPORT_FILES),
|
||||
env=env,
|
||||
cwd=venv_path,
|
||||
)
|
||||
else:
|
||||
# BeeWare distributions: platform-config already contains both
|
||||
# sysconfig data and the make_cross_venv.py script.
|
||||
platform_config_path = slice_path / f"platform-config/{multiarch}"
|
||||
call(
|
||||
"python",
|
||||
str(platform_config_path / "make_cross_venv.py"),
|
||||
str(venv_path),
|
||||
env=env,
|
||||
cwd=venv_path,
|
||||
)
|
||||
|
||||
# When running on macOS, it's easy for the build environment to leak into
|
||||
# the target environment, especially when building for ARM64 (because the
|
||||
@@ -312,8 +332,8 @@ def setup_python(
|
||||
/ f"python{python_configuration.version}"
|
||||
)
|
||||
|
||||
assert target_python.exists(), (
|
||||
f"{target_python.name} not found, has {list(target_install_path.iterdir())}"
|
||||
assert target_python.parent.exists(), (
|
||||
f"{target_python.parent} not found, has {list(target_install_path.iterdir())}"
|
||||
)
|
||||
|
||||
log.step("Creating cross build environment...")
|
||||
|
||||
Reference in New Issue
Block a user