Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
25 changes: 25 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,29 @@ jobs:
- name: Build and test
run: ./Android/android.py ci --fast-ci ${{ matrix.arch }}-linux-android

build-ios:
name: iOS
needs: build-context
if: needs.build-context.outputs.run-tests == 'true'
timeout-minutes: 60
runs-on: macos-15
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false

# GitHub recommends explicitly selecting the desired Xcode version:
# https://github.com/actions/runner-images/issues/12541#issuecomment-3083850140
# This became a necessity as a result of
# https://github.com/actions/runner-images/issues/12541 and
# https://github.com/actions/runner-images/issues/12751.
- name: Select Xcode version
run: |
sudo xcode-select --switch /Applications/Xcode_16.4.app

- name: Build and test
run: python3 Apple ci iOS --fast-ci --simulator 'iPhone 16e,OS=18.5'

build-wasi:
name: 'WASI'
needs: build-context
Expand Down Expand Up @@ -694,6 +717,7 @@ jobs:
- build-ubuntu
- build-ubuntu-ssltests
- build-android
- build-ios
- build-wasi
- test-hypothesis
- build-asan
Expand Down Expand Up @@ -728,6 +752,7 @@ jobs:
build-ubuntu,
build-ubuntu-ssltests,
build-android,
build-ios,
build-wasi,
test-hypothesis,
build-asan,
Expand Down
54 changes: 45 additions & 9 deletions Apple/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -823,7 +823,7 @@ def test(context: argparse.Namespace, host: str | None = None) -> None:
+ [
"--",
"test",
"--slow-ci" if context.slow else "--fast-ci",
f"--{context.ci_mode}-ci",
"--single-process",
"--no-randomize",
# Timeout handling requires subprocesses; explicitly setting
Expand All @@ -836,11 +836,39 @@ def test(context: argparse.Namespace, host: str | None = None) -> None:
)


def apple_sim_host(platform_name: str) -> str:
"""Determine the native simulator target for this platform."""
for _, slice_parts in HOSTS[platform_name].items():
for host_triple in slice_parts:
parts = host_triple.split('-')
if parts[0] == platform.machine() and parts[-1] == "simulator":
return host_triple

raise KeyError(platform_name)


def ci(context: argparse.Namespace) -> None:
"""The implementation of the "ci" command."""
"""The implementation of the "ci" command.

In "Fast" mode, this compiles the build python, and the simulator for the
build machine's architecture; and runs the test suite with `--fast-ci`
configuration.

In "Slow" mode, it compiles the build python, plus all candidate
architectures (both device and simulator); then runs the test suite with
`--slow-ci` configuration.
"""
clean(context, "all")
build(context, host="all")
test(context, host="all")
if context.ci_mode == "slow":
# In slow mode, build and test the full XCframework
build(context, host="all")
test(context, host="all")
else:
# In fast mode, just build the simulator platform.
sim_host = apple_sim_host(context.platform)
build(context, host="build")
build(context, host=sim_host)
test(context, host=sim_host)


def parse_args() -> argparse.Namespace:
Expand Down Expand Up @@ -947,11 +975,13 @@ def parse_args() -> argparse.Namespace:
"an ARM64 iPhone 16 Pro simulator running iOS 26.0."
),
)
cmd.add_argument(
"--slow",
action="store_true",
help="Run tests with --slow-ci options.",
)
group = cmd.add_mutually_exclusive_group()
group.add_argument(
"--fast-ci", action="store_const", dest="ci_mode", const="fast",
help="Add test arguments for GitHub Actions")
group.add_argument(
"--slow-ci", action="store_const", dest="ci_mode", const="slow",
help="Add test arguments for buildbots")

for subcommand in [configure_build, configure_host, build, ci]:
subcommand.add_argument(
Expand Down Expand Up @@ -1012,4 +1042,10 @@ def signal_handler(*args):


if __name__ == "__main__":
# Under the buildbot, stdout is not a TTY, but we must still flush after
# every line to make sure our output appears in the correct order relative
# to the output of our subprocesses.
for stream in [sys.stdout, sys.stderr]:
stream.reconfigure(line_buffering=True)

main()
5 changes: 5 additions & 0 deletions Apple/testbed/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,4 +412,9 @@ def main():


if __name__ == "__main__":
# Under the buildbot, stdout is not a TTY, but we must still flush after
# every line to make sure our output appears in the correct order relative
# to the output of our subprocesses.
for stream in [sys.stdout, sys.stderr]:
stream.reconfigure(line_buffering=True)
main()
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
iOS builds were added to CI.
Loading