Files
cibuildwheel/cibuildwheel/resources/ios-support/arm64-iphoneos/_cross_arm64_iphoneos.py
T
Henry SchreinerandRussell Keith-Magee 45cfffd3ee 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>
2026-05-23 10:47:49 -04:00

80 lines
2.2 KiB
Python

# A site package that turns a macOS virtual environment
# into an arm64 iphoneos cross-platform virtual environment
import platform
import subprocess
import sys
import sysconfig
###########################################################################
# sys module patches
###########################################################################
sys.cross_compiling = True
sys.platform = "ios"
sys.implementation._multiarch = "arm64-iphoneos"
sys.base_prefix = sysconfig._get_sysconfigdata()["prefix"]
sys.base_exec_prefix = sysconfig._get_sysconfigdata()["prefix"]
###########################################################################
# subprocess module patches
###########################################################################
subprocess._can_fork_exec = True
###########################################################################
# platform module patches
###########################################################################
def cross_system():
return "iOS"
def cross_uname():
return platform.uname_result(
system="iOS",
node="build",
release="13.0",
version="",
machine="arm64",
)
def cross_ios_ver(system="", release="", model="", is_simulator=False):
if system == "":
system = "iOS"
if release == "":
release = "13.0"
if model == "":
model = "iphoneos"
return platform.IOSVersionInfo(system, release, model, False)
platform.system = cross_system
platform.uname = cross_uname
platform.ios_ver = cross_ios_ver
###########################################################################
# sysconfig module patches
###########################################################################
def cross_get_platform():
return "ios-13.0-arm64-iphoneos"
def cross_get_sysconfigdata_name():
return "_sysconfigdata__ios_arm64-iphoneos"
sysconfig.get_platform = cross_get_platform
sysconfig._get_sysconfigdata_name = cross_get_sysconfigdata_name
# Ensure module-level values cached at time of import are updated.
sysconfig._BASE_PREFIX = sys.base_prefix
sysconfig._BASE_EXEC_PREFIX = sys.base_exec_prefix
# Force sysconfig data to be loaded (and cached).
sysconfig._init_config_vars()