Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
12 changes: 6 additions & 6 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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]
Expand Down
12 changes: 6 additions & 6 deletions Makefile.pre.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The Apple/iOS build script has been moved to the Platforms directory.
2 changes: 1 addition & 1 deletion Apple/.ruff.toml → Platforms/Apple/.ruff.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
extend = "../.ruff.toml" # Inherit the project-wide settings
extend = "../../.ruff.toml" # Inherit the project-wide settings

[format]
preview = true
Expand Down
23 changes: 13 additions & 10 deletions Apple/__main__.py → Platforms/Apple/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -57,7 +57,7 @@
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"

Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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",
)

Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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",
)

Expand All @@ -711,7 +714,7 @@ def package(context: argparse.Namespace) -> None:
print()
run([
sys.executable,
"Apple/testbed",
"Platforms/Apple/testbed",
"clone",
"--platform",
context.platform,
Expand Down Expand Up @@ -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,
Expand Down
30 changes: 15 additions & 15 deletions Apple/iOS/README.md → Platforms/Apple/iOS/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand All @@ -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
Expand All @@ -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.

Expand All @@ -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.

Expand All @@ -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 \
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -237,15 +237,15 @@ 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.

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
Expand 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>`.
Expand All @@ -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
Expand Down
File renamed without changes.
8 changes: 4 additions & 4 deletions configure

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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])
Expand Down
Loading