gh-146444: Move the Apple folder to the Platforms directory (#146497)

Migrate the Apple/iOS XCframework build tools to the Platforms directory.
This commit is contained in:
Russell Keith-Magee
2026-03-27 10:50:35 +08:00
committed by GitHub
parent 5684b3a04c
commit 36e4ffc173
47 changed files with 50 additions and 46 deletions
+1 -1
View File
@@ -369,7 +369,7 @@ jobs:
sudo xcode-select --switch /Applications/Xcode_15.4.app
- name: Build and test
run: python3 Apple ci iOS --fast-ci --simulator 'iPhone SE (3rd generation),OS=17.5'
run: python3 Platforms/Apple ci iOS --fast-ci --simulator 'iPhone SE (3rd generation),OS=17.5'
build-emscripten:
name: 'Emscripten'
+6 -6
View File
@@ -3,9 +3,9 @@ repos:
rev: a27a2e47c7751b639d2b5badf0ef6ff11fee893f # frozen: v0.15.4
hooks:
- id: ruff-check
name: Run Ruff (lint) on Apple/
args: [--exit-non-zero-on-fix, --config=Apple/.ruff.toml]
files: ^Apple/
name: Run Ruff (lint) on Platforms/Apple/
args: [--exit-non-zero-on-fix, --config=Platforms/Apple/.ruff.toml]
files: ^Platforms/Apple/
- id: ruff-check
name: Run Ruff (lint) on Doc/
args: [--exit-non-zero-on-fix]
@@ -39,9 +39,9 @@ repos:
args: [--exit-non-zero-on-fix, --config=Tools/wasm/.ruff.toml]
files: ^Tools/wasm/
- id: ruff-format
name: Run Ruff (format) on Apple/
args: [--exit-non-zero-on-fix, --config=Apple/.ruff.toml]
files: ^Apple
name: Run Ruff (format) on Platforms/Apple/
args: [--exit-non-zero-on-fix, --config=Platforms/Apple/.ruff.toml]
files: ^Platforms/Apple/
- id: ruff-format
name: Run Ruff (format) on Doc/
args: [--exit-non-zero-on-fix]
+6 -6
View File
@@ -2358,7 +2358,7 @@ testios:
fi
# Clone the testbed project into the XCFOLDER
$(PYTHON_FOR_BUILD) $(srcdir)/Apple/testbed clone --framework $(PYTHONFRAMEWORKPREFIX) "$(XCFOLDER)"
$(PYTHON_FOR_BUILD) $(srcdir)/Platforms/Apple/testbed clone --framework $(PYTHONFRAMEWORKPREFIX) "$(XCFOLDER)"
# Run the testbed project
$(PYTHON_FOR_BUILD) "$(XCFOLDER)" run --verbose -- test -uall --single-process --rerun -W --pythoninfo
@@ -3286,10 +3286,10 @@ clean-retain-profile: pycremoval
-find build -type f -a ! -name '*.gc??' -exec rm -f {} ';'
-rm -f Include/pydtrace_probes.h
-rm -f profile-gen-stamp
-rm -rf Apple/iOS/testbed/Python.xcframework/ios-*/bin
-rm -rf Apple/iOS/testbed/Python.xcframework/ios-*/lib
-rm -rf Apple/iOS/testbed/Python.xcframework/ios-*/include
-rm -rf Apple/iOS/testbed/Python.xcframework/ios-*/Python.framework
-rm -rf Platforms/Apple/iOS/testbed/Python.xcframework/ios-*/bin
-rm -rf Platforms/Apple/iOS/testbed/Python.xcframework/ios-*/lib
-rm -rf Platforms/Apple/iOS/testbed/Python.xcframework/ios-*/include
-rm -rf Platforms/Apple/iOS/testbed/Python.xcframework/ios-*/Python.framework
.PHONY: profile-removal
profile-removal:
@@ -3323,7 +3323,7 @@ clobber: clean
config.cache config.log pyconfig.h Modules/config.c
-rm -rf build platform
-rm -rf $(PYTHONFRAMEWORKDIR)
-rm -rf Apple/iOS/Frameworks
-rm -rf Platforms/Apple/iOS/Frameworks
-rm -rf iOSTestbed.*
-rm -f python-config.py python-config
-rm -rf cross-build
@@ -0,0 +1 @@
The Apple/iOS build script has been moved to the Platforms directory.
@@ -1,4 +1,4 @@
extend = "../.ruff.toml" # Inherit the project-wide settings
extend = "../../.ruff.toml" # Inherit the project-wide settings
[format]
preview = true
@@ -10,7 +10,7 @@
#
# The simplest entry point is:
#
# $ python Apple ci iOS
# $ python Platforms/Apple ci iOS
#
# which will:
# * Clean any pre-existing build artefacts
@@ -57,7 +57,7 @@ EnvironmentT = dict[str, str]
ArgsT = Sequence[str | Path]
SCRIPT_NAME = Path(__file__).name
PYTHON_DIR = Path(__file__).resolve().parent.parent
PYTHON_DIR = Path(__file__).resolve().parent.parent.parent
CROSS_BUILD_DIR = PYTHON_DIR / "cross-build"
@@ -140,7 +140,7 @@ def apple_env(host: str) -> EnvironmentT:
"""Construct an Apple development environment for the given host."""
env = {
"PATH": ":".join([
str(PYTHON_DIR / "Apple/iOS/Resources/bin"),
str(PYTHON_DIR / "Platforms/Apple/iOS/Resources/bin"),
str(subdir(host) / "prefix"),
"/usr/bin",
"/bin",
@@ -440,7 +440,10 @@ def framework_path(host_triple: str, multiarch: str) -> Path:
:param host_triple: The host triple (e.g., arm64-apple-ios-simulator)
:param multiarch: The multiarch identifier (e.g., arm64-simulator)
"""
return CROSS_BUILD_DIR / f"{host_triple}/Apple/iOS/Frameworks/{multiarch}"
return (
CROSS_BUILD_DIR
/ f"{host_triple}/Platforms/Apple/iOS/Frameworks/{multiarch}"
)
def package_version(prefix_path: Path) -> str:
@@ -624,7 +627,7 @@ def create_xcframework(platform: str) -> str:
# Copy in the cross-architecture pyconfig.h
shutil.copy(
PYTHON_DIR / f"Apple/{platform}/Resources/pyconfig.h",
PYTHON_DIR / f"Platforms/Apple/{platform}/Resources/pyconfig.h",
slice_framework / "Headers/pyconfig.h",
)
@@ -661,7 +664,7 @@ def create_xcframework(platform: str) -> str:
host_path = (
CROSS_BUILD_DIR
/ host_triple
/ "Apple/iOS/Frameworks"
/ "Platforms/Apple/iOS/Frameworks"
/ multiarch
)
host_framework = host_path / "Python.framework"
@@ -691,7 +694,7 @@ def create_xcframework(platform: str) -> str:
print(" - build tools")
shutil.copytree(
PYTHON_DIR / "Apple/testbed/Python.xcframework/build",
PYTHON_DIR / "Platforms/Apple/testbed/Python.xcframework/build",
package_path / "Python.xcframework/build",
)
@@ -711,7 +714,7 @@ def package(context: argparse.Namespace) -> None:
print()
run([
sys.executable,
"Apple/testbed",
"Platforms/Apple/testbed",
"clone",
"--platform",
context.platform,
@@ -806,13 +809,13 @@ def test(context: argparse.Namespace, host: str | None = None) -> None: # noqa:
framework_path = (
CROSS_BUILD_DIR
/ host
/ f"Apple/{context.platform}"
/ f"Platforms/Apple/{context.platform}"
/ f"Frameworks/{apple_multiarch(host)}"
)
run([
sys.executable,
"Apple/testbed",
"Platforms/Apple/testbed",
"clone",
"--platform",
context.platform,
@@ -52,11 +52,11 @@ portable to machines using other architectures.
### Building a multi-architecture iOS XCframework
The `Apple` subfolder of the Python repository acts as a build script that
The `Platforms/Apple` subfolder of the Python repository acts as a build script that
can be used to coordinate the compilation of a complete iOS XCframework. To use
it, run::
python Apple build iOS
python Platforms/Apple build iOS
This will:
@@ -69,7 +69,7 @@ This will:
the `Python.xcframework`, plus a copy of the Testbed app pre-configured to
use the XCframework.
The `Apple` build script has other entry points that will perform the
The `Platforms/Apple` build script has other entry points that will perform the
individual parts of the overall `build` target, plus targets to test the
build, clean the `cross-build` folder of iOS build products, and perform a
complete "build and test" CI run. The `--clean` flag can also be used on
@@ -78,7 +78,7 @@ building.
### Building a single-architecture framework
If you're using the `Apple` build script, you won't need to build
If you're using the `Platforms/Apple` build script, you won't need to build
individual frameworks. However, if you do need to manually configure an iOS
Python build for a single framework, the following options are available.
@@ -100,7 +100,7 @@ Python build for a single framework, the following options are available.
> [!NOTE]
> Unless you know what you're doing, changing the name of the Python
> framework on iOS is not advised. If you use this option, you won't be able
> to run the `Apple` build script without making significant manual
> to run the `Platforms/Apple` build script without making significant manual
> alterations, and you won't be able to use any binary packages unless you
> compile them yourself using your own framework name.
@@ -119,7 +119,7 @@ provide the `--enable-framework` flag when configuring the build. The build
also requires the use of cross-compilation. The minimal commands for building
Python for the ARM64 iOS simulator will look something like:
```
export PATH="$(pwd)/Apple/iOS/Resources/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
export PATH="$(pwd)/Platforms/Apple/iOS/Resources/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
./configure \
--enable-framework \
--host=arm64-apple-ios-simulator \
@@ -131,7 +131,7 @@ make install
In this invocation:
* `Apple/iOS/Resources/bin` has been added to the path, providing some shims for the
* `Platforms/Apple/iOS/Resources/bin` has been added to the path, providing some shims for the
compilers and linkers needed by the build. Xcode requires the use of `xcrun`
to invoke compiler tooling. However, if `xcrun` is pre-evaluated and the
result passed to `configure`, these results can embed user- and
@@ -141,7 +141,7 @@ In this invocation:
cause significant problems with many C configuration systems which assume that
`CC` will be a single executable.
To work around this problem, the `Apple/iOS/Resources/bin` folder contains some
To work around this problem, the `Platforms/Apple/iOS/Resources/bin` folder contains some
wrapper scripts that present as simple compilers and linkers, but wrap
underlying calls to `xcrun`. This allows configure to use a `CC`
definition without spaces, and without user- or version-specific paths, while
@@ -222,7 +222,7 @@ simulator build with a deployment target of 15.4.
Once you have a built an XCframework, you can test that framework by running:
$ python Apple test iOS
$ python Platforms/Apple test iOS
This test will attempt to find an "SE-class" simulator (i.e., an iPhone SE, or
iPhone 16e, or similar), and run the test suite on the most recent version of
@@ -237,7 +237,7 @@ environment variable will be exposed to the iOS process at runtime.
### Testing a single-architecture framework
The `Apple/testbed` folder that contains an Xcode project that is able to run
The `Platforms/Apple/testbed` folder that contains an Xcode project that is able to run
the Python test suite on Apple platforms. This project converts the Python test
suite into a single test case in Xcode's XCTest framework. The single XCTest
passes if the test suite passes.
@@ -245,7 +245,7 @@ passes if the test suite passes.
To run the test suite, configure a Python build for an iOS simulator (i.e.,
`--host=arm64-apple-ios-simulator` or `--host=x86_64-apple-ios-simulator`
), specifying a framework build (i.e. `--enable-framework`). Ensure that your
`PATH` has been configured to include the `Apple/iOS/Resources/bin` folder and
`PATH` has been configured to include the `Platforms/Apple/iOS/Resources/bin` folder and
exclude any non-iOS tools, then run:
```
make all
@@ -269,9 +269,9 @@ project, and then boot and prepare the iOS simulator.
### Debugging test failures
Running `python Apple test iOS` generates a standalone version of the
`Apple/testbed` project, and runs the full test suite. It does this using
`Apple/testbed` itself - the folder is an executable module that can be used
Running `python Platforms/Apple test iOS` generates a standalone version of the
`Platforms/Apple/testbed` project, and runs the full test suite. It does this using
`Platforms/Apple/testbed` itself - the folder is an executable module that can be used
to create and run a clone of the testbed project. The standalone version of the
testbed will be created in a directory named
`cross-build/iOS-testbed.<timestamp>`.
@@ -287,7 +287,7 @@ testbed clone.
If you've built your own XCframework, or you only want to test a single architecture,
you can construct a standalone testbed instance by running:
```
python Apple/testbed clone --platform iOS --framework <path/to/framework> my-testbed
python Platforms/Apple/testbed clone --platform iOS --framework <path/to/framework> my-testbed
```
The framework path can be the path path to a `Python.xcframework`, or the
Generated Vendored
+4 -4
View File
@@ -4389,7 +4389,7 @@ then :
yes)
case $ac_sys_system in
Darwin) enableval=/Library/Frameworks ;;
iOS) enableval=Apple/iOS/Frameworks/\$\(MULTIARCH\) ;;
iOS) enableval=Platforms/Apple/iOS/Frameworks/\$\(MULTIARCH\) ;;
*) as_fn_error $? "Unknown platform for framework build" "$LINENO" 5
esac
esac
@@ -4500,9 +4500,9 @@ then :
prefix=$PYTHONFRAMEWORKPREFIX
PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
RESSRCDIR=Apple/iOS/Resources
RESSRCDIR=Platforms/Apple/iOS/Resources
ac_config_files="$ac_config_files Apple/iOS/Resources/Info.plist"
ac_config_files="$ac_config_files Platforms/Apple/iOS/Resources/Info.plist"
;;
*)
@@ -35618,7 +35618,7 @@ do
"Mac/PythonLauncher/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/PythonLauncher/Makefile" ;;
"Mac/Resources/framework/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/framework/Info.plist" ;;
"Mac/Resources/app/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/app/Info.plist" ;;
"Apple/iOS/Resources/Info.plist") CONFIG_FILES="$CONFIG_FILES Apple/iOS/Resources/Info.plist" ;;
"Platforms/Apple/iOS/Resources/Info.plist") CONFIG_FILES="$CONFIG_FILES Platforms/Apple/iOS/Resources/Info.plist" ;;
"Makefile.pre") CONFIG_FILES="$CONFIG_FILES Makefile.pre" ;;
"Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc" ;;
"Misc/python-embed.pc") CONFIG_FILES="$CONFIG_FILES Misc/python-embed.pc" ;;
+3 -3
View File
@@ -568,7 +568,7 @@ AC_ARG_ENABLE([framework],
yes)
case $ac_sys_system in
Darwin) enableval=/Library/Frameworks ;;
iOS) enableval=Apple/iOS/Frameworks/\$\(MULTIARCH\) ;;
iOS) enableval=Platforms/Apple/iOS/Frameworks/\$\(MULTIARCH\) ;;
*) AC_MSG_ERROR([Unknown platform for framework build])
esac
esac
@@ -675,9 +675,9 @@ AC_ARG_ENABLE([framework],
prefix=$PYTHONFRAMEWORKPREFIX
PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
RESSRCDIR=Apple/iOS/Resources
RESSRCDIR=Platforms/Apple/iOS/Resources
AC_CONFIG_FILES([Apple/iOS/Resources/Info.plist])
AC_CONFIG_FILES([Platforms/Apple/iOS/Resources/Info.plist])
;;
*)
AC_MSG_ERROR([Unknown platform for framework build])