* 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>
80 lines
2.2 KiB
Python
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()
|