From 1eefd44b6d354d85e69d79ec7d55bd1c13b9a63a Mon Sep 17 00:00:00 2001 From: Anthony Ronning <101225832+AnthonyRonning@users.noreply.github.com> Date: Thu, 29 Oct 2026 02:38:20 +0000 Subject: [PATCH 1/6] ci: accept suffixed Xcode installs with the pinned build GitHub's Xcode 27 image keeps 27.1 (27A9275) as Xcode_27.1_Release_Candidate.app, and its default is still 27.0. Consider Xcode__*.app installs too; selection still requires the exact pinned build and still skips betas. Co-Authored-By: Claude Opus 5.5 --- scripts/ci/select-xcode.py | 5 ++++- scripts/ci/test_select_xcode.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/scripts/ci/select-xcode.py b/scripts/ci/select-xcode.py index 2e29aadb5..8a85f59cb 100644 --- a/scripts/ci/select-xcode.py +++ b/scripts/ci/select-xcode.py @@ -29,7 +29,10 @@ def load_pin(path=PIN): def select_xcode(pin, applications=Path("/Applications")): version = pin["version"] - for name in (f"Xcode_{version}.app", f"Xcode_{version}.0.app", "Xcode.app"): + # Hosted images may keep a release under a suffixed name (for example + # Xcode_27.1_Release_Candidate.app); the exact build check below decides. + suffixed = sorted(path.name for path in applications.glob(f"Xcode_{version}_*.app")) + for name in (f"Xcode_{version}.app", f"Xcode_{version}.0.app", *suffixed, "Xcode.app"): developer = applications / name / "Contents/Developer" if not (developer / "usr/bin/xcodebuild").is_file(): continue diff --git a/scripts/ci/test_select_xcode.py b/scripts/ci/test_select_xcode.py index e2115b194..2785cc128 100644 --- a/scripts/ci/test_select_xcode.py +++ b/scripts/ci/test_select_xcode.py @@ -97,6 +97,19 @@ def test_beta_install_and_disguised_beta_symlink_are_never_probed(self): selector.select_xcode(self.pin, self.directory) run.assert_not_called() + def test_suffixed_release_install_is_selected_by_exact_build(self): + self.install("Xcode_26.5_beta_2.app") + developer = self.install("Xcode_26.5_Release_Candidate.app") + with patch.object(selector.subprocess, "run", return_value=self.result()) as run: + self.assertEqual(selector.select_xcode(self.pin, self.directory), developer) + self.assertEqual(run.call_count, 1) + + def test_suffixed_install_with_another_build_is_rejected(self): + self.install("Xcode_26.5_Release_Candidate.app") + with patch.object(selector.subprocess, "run", return_value=self.result(build="17F40")): + with self.assertRaisesRegex(selector.ToolchainError, "26.5 build 17F42"): + selector.select_xcode(self.pin, self.directory) + def test_rolling_default_is_skipped_when_pinned_release_is_available(self): self.install("Xcode_26.5.app") developer = self.install("Xcode_26.5.0.app") From 70a0547308ba1bc80a8f2a47d1cc247f6eb8b091 Mon Sep 17 00:00:00 2001 From: Anthony Ronning <101225832+AnthonyRonning@users.noreply.github.com> Date: Thu, 29 Oct 2026 02:38:58 +0000 Subject: [PATCH 2/6] ci: make Agent and Research builds work with the macOS 27 SDK These are no-ops on Xcode 26.5 and needed before the Xcode 27.1 pin. - Agent shell: link Rust with Xcode's clang as well. nixpkgs' ld64 cannot read the macOS 27 SDK's .tbd stubs (they list arm64e.x1), so build scripts failed to link (_strerror_r undefined). - Research and Agent: stop stripping build scripts and proc-macros in release builds. rustc strips Apple outputs with rust-objcopy, which doesn't pad __LINKEDIT entries, so chained-fixup images (deployment target 12+) can end up with a 4-byte-aligned string table. macOS 27's dyld refuses such dylibs once they're linked against the macOS 27 SDK, so rustc could not load zerofrom-derive ("can't find crate"). Executables aren't checked, so shipped binaries keep their strip settings. Upstream fix: llvm/llvm-project#203680. - test-canonical-macho: Xcode 27's ld sorts local absolute symbols, so both fixtures came out in the same order. Swap the entries to recreate the input-order variant older linkers emitted. Co-Authored-By: Claude Opus 5.5 --- apps/maple-agent/Cargo.toml | 8 +++++ apps/maple-agent/flake.nix | 5 +++ .../frontend/src-tauri/Cargo.toml | 8 +++++ scripts/ci/test-canonical-macho.py | 33 +++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/apps/maple-agent/Cargo.toml b/apps/maple-agent/Cargo.toml index 6da94889d..a5660ddaa 100644 --- a/apps/maple-agent/Cargo.toml +++ b/apps/maple-agent/Cargo.toml @@ -35,6 +35,14 @@ lto = "fat" codegen-units = 1 strip = true +# rustc strips with rust-objcopy, which can leave a dylib's LINKEDIT string table +# 4-byte aligned. macOS 27 refuses to load such dylibs when they are linked against +# its SDK, and the build loads its proc-macros as dylibs. Build scripts and +# proc-macros never ship, so leave them unstripped. Remove once the pinned Rust's +# rust-objcopy includes llvm/llvm-project#203680. +[profile.release.build-override] +strip = false + # The embedded proxy requires `maple-sdk` from the registry; resolve it to the same # in-tree source as the workspace dependency above (docs/sdk-publishing.md). [patch.crates-io] diff --git a/apps/maple-agent/flake.nix b/apps/maple-agent/flake.nix index ac7a6df80..e0ac4c226 100644 --- a/apps/maple-agent/flake.nix +++ b/apps/maple-agent/flake.nix @@ -310,6 +310,11 @@ # nixpkgs' generic clang wrapper cannot infer that SDK boundary. export CC="$(/usr/bin/xcrun --find clang)" export CXX="$(/usr/bin/xcrun --find clang++)" + # Rust links through `cc`, which is nixpkgs' clang wrapper and its + # older ld64. That ld64 cannot read the macOS 27 SDK's .tbd stubs + # (they list the arm64e.x1 architecture), so link with Xcode too. + export CARGO_TARGET_AARCH64_APPLE_DARWIN_LINKER="$CC" + export CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER="$CC" export PATH="${xcrun}/bin:$PATH" unset maple_nix_developer_dir maple_nix_selected_developer_dir diff --git a/apps/maple-research/frontend/src-tauri/Cargo.toml b/apps/maple-research/frontend/src-tauri/Cargo.toml index 4770e167c..be10e613b 100644 --- a/apps/maple-research/frontend/src-tauri/Cargo.toml +++ b/apps/maple-research/frontend/src-tauri/Cargo.toml @@ -118,3 +118,11 @@ tao = { path = "patches/tao-0.37.1" } # to link (Tauri 2.12.3 made its own public: tauri-apps/tauri#16130); the # vendored copy only adds that keyword. Remove once upstream publishes the fix. tauri-plugin-sign-in-with-apple = { path = "patches/tauri-plugin-sign-in-with-apple-1.0.2" } + +# Release builds strip with rustc's rust-objcopy, which can leave a dylib's LINKEDIT +# string table 4-byte aligned. macOS 27 refuses to load such dylibs when they are +# linked against its SDK, and the build loads its proc-macros as dylibs. Build +# scripts and proc-macros never ship, so leave them unstripped. Remove once the +# pinned Rust's rust-objcopy includes llvm/llvm-project#203680. +[profile.release.build-override] +strip = false diff --git a/scripts/ci/test-canonical-macho.py b/scripts/ci/test-canonical-macho.py index 99e344fe0..94790a3af 100644 --- a/scripts/ci/test-canonical-macho.py +++ b/scripts/ci/test-canonical-macho.py @@ -71,6 +71,35 @@ def local_absolute_symbols(path): return symbols +def swap_local_absolute_symbols(path): + """Swap the first two local absolute nlist entries in place.""" + data = bytearray(Path(path).read_bytes()) + _, _, _, _, ncmds, _, _, _ = struct.unpack_from(" Date: Thu, 29 Oct 2026 02:40:57 +0000 Subject: [PATCH 3/6] ci: pin Xcode 27.1 and move Apple jobs to the Xcode 27 images Xcode 27.1 (27A9275) adds the iOS 27.1 SDK and iPhone Duo support, and App Store Connect requires the iOS 27 SDK from April 2027. The macOS 26 images have no Xcode 27, so every job that selects the pin moves: - Blacksmith blacksmith-6vcpu-macos-26 -> blacksmith-6vcpu-macos-27: lanes.MACOS and ci.yml's special jobs in lockstep, plus the signed and release builders (agent-desktop-build, desktop-build, mobile-build, ios-dev-testflight, release, proxy-rust). - GitHub macos-26 -> xcode-27: artifact verifiers, signing, TestFlight and the nightly provider suite. - actionlint knows neither label yet. - iOS ONNX Runtime builds for iOS 16.0 (the app's minimum) instead of 13.0, because Xcode 27 only targets iOS 15.0-27.1. The hash pins move to 27A9275, from a local Xcode 27.1 build that reproduces them. - Docs, the outage advice and the StoreKit harness name the new versions; the stale project.pbxproj.backup goes. Co-Authored-By: Claude Opus 5.5 --- .../change-maple-ci/references/debugging.md | 2 +- .github/actionlint.yaml | 4 +- .github/workflows/agent-desktop-build.yml | 6 +- .github/workflows/ci.yml | 8 +- .github/workflows/desktop-build.yml | 4 +- .github/workflows/ios-dev-testflight.yml | 4 +- .github/workflows/mobile-build.yml | 6 +- .github/workflows/nightly.yml | 2 +- .github/workflows/proxy-rust.yml | 2 +- .github/workflows/release.yml | 10 +- .../maple.xcodeproj/project.pbxproj.backup | 626 ------------------ .../scripts/build-ios-onnxruntime-all.sh | 2 +- .../scripts/build-ios-onnxruntime.sh | 2 +- .../src-tauri/scripts/onnxruntime-pins.sh | 18 +- .../src-tauri/tests/storekit/README.md | 23 +- docs/ci.md | 2 +- docs/repository-workflows.md | 4 +- scripts/ci/_common.sh | 2 +- scripts/ci/apple-toolchain.json | 4 +- scripts/ci/lanes.py | 2 +- scripts/testing/storekit/run.sh | 7 +- 21 files changed, 55 insertions(+), 685 deletions(-) delete mode 100644 apps/maple-research/frontend/src-tauri/gen/apple/maple.xcodeproj/project.pbxproj.backup diff --git a/.agents/skills/change-maple-ci/references/debugging.md b/.agents/skills/change-maple-ci/references/debugging.md index 915e46d47..19ee47d4b 100644 --- a/.agents/skills/change-maple-ci/references/debugging.md +++ b/.agents/skills/change-maple-ci/references/debugging.md @@ -70,7 +70,7 @@ the cancellation to finish, so rapid re-pushes each add some delay. variable `CI_LINUX_HEAVY_RUNNER=blacksmith-16vcpu-ubuntu-2404` (same vendor, so caches still work) and unset it afterwards. For the 8-vCPU lanes, `CI_LINUX_RUNNER=blacksmith-16vcpu-ubuntu-2404` keeps Blacksmith's - store. In a Blacksmith-wide outage use `ubuntu-latest` (or `macos-26`, + store. In a Blacksmith-wide outage use `ubuntu-latest` (or `xcode-27`, `windows-2025`): cold, saves nothing, slower. - Matrix lanes take their runner from `plan`, so re-plan: cancel a PR run, then **Re-run all jobs**. Never cancel a master run; the variable applies diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml index 571459b27..8b5c0d6e8 100644 --- a/.github/actionlint.yaml +++ b/.github/actionlint.yaml @@ -3,8 +3,10 @@ self-hosted-runner: labels: - blacksmith-16vcpu-ubuntu-2404-arm - blacksmith-8vcpu-windows-2025 - - blacksmith-6vcpu-macos-26 + - blacksmith-6vcpu-macos-27 - blacksmith-8vcpu-ubuntu-2404 - blacksmith-32vcpu-ubuntu-2404 # GitHub-hosted larger runner (org runner group "Maple"); actionlint only knows standard labels. - maple-windows-2025-16core + # GitHub-hosted Xcode 27 image; newer than the pinned actionlint label list. + - xcode-27 diff --git a/.github/workflows/agent-desktop-build.yml b/.github/workflows/agent-desktop-build.yml index c0c529a58..266dd2440 100644 --- a/.github/workflows/agent-desktop-build.yml +++ b/.github/workflows/agent-desktop-build.yml @@ -55,7 +55,7 @@ jobs: name: Build macOS binary (${{ matrix.variant }}) needs: changes if: ${{ always() && !cancelled() && (needs.changes.result != 'success' || needs.changes.outputs.agent != 'false') && github.repository == 'MaplePrivacyLabs/Maple' && github.ref == 'refs/heads/master' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') }} - runs-on: blacksmith-6vcpu-macos-26 + runs-on: blacksmith-6vcpu-macos-27 permissions: contents: read timeout-minutes: 120 @@ -138,7 +138,7 @@ jobs: contents: read id-token: write attestations: write - runs-on: macos-26 + runs-on: xcode-27 timeout-minutes: 120 strategy: fail-fast: false @@ -513,7 +513,7 @@ jobs: permissions: contents: read attestations: read - runs-on: macos-26 + runs-on: xcode-27 timeout-minutes: 30 strategy: fail-fast: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 271f33873..1766b3420 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -233,7 +233,7 @@ jobs: name: agent-package-macos needs: plan if: fromJSON(needs.plan.outputs.lanes)['agent-package-macos'] - runs-on: ${{ vars.CI_MACOS_RUNNER || 'blacksmith-6vcpu-macos-26' }} + runs-on: ${{ vars.CI_MACOS_RUNNER || 'blacksmith-6vcpu-macos-27' }} timeout-minutes: 60 steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 @@ -355,7 +355,7 @@ jobs: name: research-ios needs: plan if: fromJSON(needs.plan.outputs.lanes)['research-ios'] - runs-on: ${{ vars.CI_MACOS_RUNNER || 'blacksmith-6vcpu-macos-26' }} + runs-on: ${{ vars.CI_MACOS_RUNNER || 'blacksmith-6vcpu-macos-27' }} timeout-minutes: 120 # a missed ONNX Runtime cache builds it from source steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 @@ -388,7 +388,7 @@ jobs: name: research-desktop-macos needs: plan if: fromJSON(needs.plan.outputs.lanes)['research-desktop-macos'] - runs-on: ${{ vars.CI_MACOS_RUNNER || 'blacksmith-6vcpu-macos-26' }} + runs-on: ${{ vars.CI_MACOS_RUNNER || 'blacksmith-6vcpu-macos-27' }} timeout-minutes: 45 steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 @@ -498,7 +498,7 @@ jobs: name: research-dev-macos needs: plan if: fromJSON(needs.plan.outputs.lanes)['research-dev-macos'] - runs-on: ${{ vars.CI_MACOS_RUNNER || 'blacksmith-6vcpu-macos-26' }} + runs-on: ${{ vars.CI_MACOS_RUNNER || 'blacksmith-6vcpu-macos-27' }} timeout-minutes: 45 steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 diff --git a/.github/workflows/desktop-build.yml b/.github/workflows/desktop-build.yml index bfff307bb..7891bd453 100644 --- a/.github/workflows/desktop-build.yml +++ b/.github/workflows/desktop-build.yml @@ -15,7 +15,7 @@ jobs: environment: desktop-signing needs: changes if: ${{ always() && !cancelled() && (needs.changes.result != 'success' || needs.changes.outputs.frontend != 'false' || needs.changes.outputs.macos != 'false') }} - runs-on: blacksmith-6vcpu-macos-26 + runs-on: blacksmith-6vcpu-macos-27 timeout-minutes: 120 permissions: contents: read @@ -214,7 +214,7 @@ jobs: verify-macos-desktop-artifacts: needs: - build-macos - runs-on: macos-26 + runs-on: xcode-27 timeout-minutes: 30 permissions: contents: read diff --git a/.github/workflows/ios-dev-testflight.yml b/.github/workflows/ios-dev-testflight.yml index 5b7cf75e4..dc511336a 100644 --- a/.github/workflows/ios-dev-testflight.yml +++ b/.github/workflows/ios-dev-testflight.yml @@ -36,7 +36,7 @@ jobs: (github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && (needs.changes.result != 'success' || needs.changes.outputs.frontend != 'false' || needs.changes.outputs.ios != 'false'))) environment: apple-signing - runs-on: blacksmith-6vcpu-macos-26 + runs-on: blacksmith-6vcpu-macos-27 timeout-minutes: 240 permissions: contents: read @@ -144,7 +144,7 @@ jobs: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') needs: build-ios-dev environment: apple-signing - runs-on: macos-26 + runs-on: xcode-27 timeout-minutes: 45 permissions: contents: read diff --git a/.github/workflows/mobile-build.yml b/.github/workflows/mobile-build.yml index 4a04c6a33..5bae3046e 100644 --- a/.github/workflows/mobile-build.yml +++ b/.github/workflows/mobile-build.yml @@ -34,7 +34,7 @@ jobs: github.ref == 'refs/heads/master' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (needs.changes.result != 'success' || needs.changes.outputs.frontend != 'false' || needs.changes.outputs.ios != 'false') - runs-on: blacksmith-6vcpu-macos-26 + runs-on: blacksmith-6vcpu-macos-27 # The ONNX source build and the app build each allow 90 minutes. timeout-minutes: 240 permissions: @@ -120,7 +120,7 @@ jobs: verify-ios-artifacts: needs: build-ios - runs-on: macos-26 + runs-on: xcode-27 timeout-minutes: 30 permissions: contents: read @@ -156,7 +156,7 @@ jobs: github.ref == 'refs/heads/master' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') needs: verify-ios-artifacts - runs-on: macos-26 + runs-on: xcode-27 timeout-minutes: 45 permissions: contents: read diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index b8d603b44..c42421626 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -46,7 +46,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-26, windows-latest] + os: [ubuntu-latest, xcode-27, windows-latest] defaults: run: shell: bash diff --git a/.github/workflows/proxy-rust.yml b/.github/workflows/proxy-rust.yml index 32f8d38e3..8b76bf186 100644 --- a/.github/workflows/proxy-rust.yml +++ b/.github/workflows/proxy-rust.yml @@ -45,7 +45,7 @@ jobs: archive: maple-proxy-linux-x86_64.tar.gz - runner: ubuntu-24.04-arm archive: maple-proxy-linux-aarch64.tar.gz - - runner: blacksmith-6vcpu-macos-26 + - runner: blacksmith-6vcpu-macos-27 archive: maple-proxy-macos-aarch64.tar.gz - runner: windows-2025 archive: maple-proxy-windows-x86_64.zip diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2e002420e..40d471ee4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -137,7 +137,7 @@ jobs: fail-fast: false matrix: include: - - platform: blacksmith-6vcpu-macos-26 + - platform: blacksmith-6vcpu-macos-27 nix_shell: ci artifact_prefix: macos - platform: blacksmith-8vcpu-ubuntu-2404 @@ -452,7 +452,7 @@ jobs: build-ios: environment: apple-signing needs: classify-app-release - runs-on: blacksmith-6vcpu-macos-26 + runs-on: blacksmith-6vcpu-macos-27 permissions: contents: write id-token: write @@ -619,7 +619,7 @@ jobs: archive: maple-proxy-linux-x86_64.tar.gz - runner: ubuntu-24.04-arm archive: maple-proxy-linux-aarch64.tar.gz - - runner: blacksmith-6vcpu-macos-26 + - runner: blacksmith-6vcpu-macos-27 archive: maple-proxy-macos-aarch64.tar.gz - runner: windows-2025 archive: maple-proxy-windows-x86_64.zip @@ -816,7 +816,7 @@ jobs: needs: - classify-app-release - build-tauri - runs-on: macos-26 + runs-on: xcode-27 permissions: contents: read steps: @@ -964,7 +964,7 @@ jobs: - update-latest-json - verify-android-release-artifacts - verify-proxy-release-artifacts - runs-on: macos-26 + runs-on: xcode-27 permissions: contents: read steps: diff --git a/apps/maple-research/frontend/src-tauri/gen/apple/maple.xcodeproj/project.pbxproj.backup b/apps/maple-research/frontend/src-tauri/gen/apple/maple.xcodeproj/project.pbxproj.backup deleted file mode 100644 index 41a99a896..000000000 --- a/apps/maple-research/frontend/src-tauri/gen/apple/maple.xcodeproj/project.pbxproj.backup +++ /dev/null @@ -1,626 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 56; - objects = { - -/* Begin PBXBuildFile section */ - 0F4AA8C5111094B8D7B033A4 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E996CAD20B045EF299247BEF /* WebKit.framework */; }; - 23D760C25DBAAA96DF52F98C /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAFD3E024B29F57EA0D88AB5 /* MetalKit.framework */; }; - 27222ACBBD95CA356BDB87AB /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BAF092EB33F2B4FDF867E2ED /* QuartzCore.framework */; }; - 46728F6CD07C626A781543FF /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 938F41BA03AF7FAB80585A60 /* Security.framework */; }; - 4E14944735CA89389849E430 /* libapp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F27A6FC4AB3E06D481B1E137 /* libapp.a */; }; - 621A96F6B965E600E714FB6C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B0EAFEFF59AA7CFEF57FA63C /* LaunchScreen.storyboard */; }; - 8F9EDB5679AB5E12D6F1E071 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DACD0B6B9FB86AFF47366EB2 /* UIKit.framework */; }; - 90DEA2E2EC5F95784C9D8B00 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 898D6E7ABC92C3B9A7970DAE /* CoreGraphics.framework */; }; - 9F3ED7EA97AFC22E0B4A6EAF /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = CE20E8A9C4CF149CA9CA485A /* main.mm */; }; - A120CF155DE2B343CEFFB77C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6BF4C7EB12DBD2E253B2741E /* Assets.xcassets */; }; - B79EC8A2A1A869B9F38906ED /* assets in Resources */ = {isa = PBXBuildFile; fileRef = AF5DA3546C7B12BA141E9508 /* assets */; }; - FB98D58EAB479A32F7CA66CA /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C072EB8E1CCC1094712EA7F7 /* Metal.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 1094B8CB671809878F533CEC /* lib.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = lib.rs; sourceTree = ""; }; - 19C98BDFCAE8C0B2FE05F13B /* maple_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = maple_iOS.entitlements; sourceTree = ""; }; - 1DB07799A17353B2E32B65D3 /* Maple.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Maple.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 6BF4C7EB12DBD2E253B2741E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 7BBAB8D5C4E3D05A4F48B6EA /* bindings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bindings.h; sourceTree = ""; }; - 898D6E7ABC92C3B9A7970DAE /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 938F41BA03AF7FAB80585A60 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - AAFD3E024B29F57EA0D88AB5 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; }; - AF5DA3546C7B12BA141E9508 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = SOURCE_ROOT; }; - B0EAFEFF59AA7CFEF57FA63C /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; - BAF092EB33F2B4FDF867E2ED /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - C072EB8E1CCC1094712EA7F7 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; - C0A332F21EB65CD4B83229DF /* main.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = main.rs; sourceTree = ""; }; - CE20E8A9C4CF149CA9CA485A /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; - D6F6085362AF0C062EDB5810 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - DACD0B6B9FB86AFF47366EB2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - E996CAD20B045EF299247BEF /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - F27A6FC4AB3E06D481B1E137 /* libapp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libapp.a; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 04F3BEBB04BD927FDC86B255 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4E14944735CA89389849E430 /* libapp.a in Frameworks */, - 90DEA2E2EC5F95784C9D8B00 /* CoreGraphics.framework in Frameworks */, - FB98D58EAB479A32F7CA66CA /* Metal.framework in Frameworks */, - 23D760C25DBAAA96DF52F98C /* MetalKit.framework in Frameworks */, - 27222ACBBD95CA356BDB87AB /* QuartzCore.framework in Frameworks */, - 46728F6CD07C626A781543FF /* Security.framework in Frameworks */, - 8F9EDB5679AB5E12D6F1E071 /* UIKit.framework in Frameworks */, - 0F4AA8C5111094B8D7B033A4 /* WebKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 31943D18956B6AFD5A82AB02 /* maple_iOS */ = { - isa = PBXGroup; - children = ( - D6F6085362AF0C062EDB5810 /* Info.plist */, - 19C98BDFCAE8C0B2FE05F13B /* maple_iOS.entitlements */, - ); - path = maple_iOS; - sourceTree = ""; - }; - 6AE8986BFC081ADF4EF98889 /* Externals */ = { - isa = PBXGroup; - children = ( - ); - path = Externals; - sourceTree = ""; - }; - A278899D6905367F60E00F01 /* Sources */ = { - isa = PBXGroup; - children = ( - E5992A2C52DE443515252068 /* maple */, - ); - path = Sources; - sourceTree = ""; - }; - B58B2AB62FA5D8F41C3A031C /* Frameworks */ = { - isa = PBXGroup; - children = ( - 898D6E7ABC92C3B9A7970DAE /* CoreGraphics.framework */, - F27A6FC4AB3E06D481B1E137 /* libapp.a */, - C072EB8E1CCC1094712EA7F7 /* Metal.framework */, - AAFD3E024B29F57EA0D88AB5 /* MetalKit.framework */, - BAF092EB33F2B4FDF867E2ED /* QuartzCore.framework */, - 938F41BA03AF7FAB80585A60 /* Security.framework */, - DACD0B6B9FB86AFF47366EB2 /* UIKit.framework */, - E996CAD20B045EF299247BEF /* WebKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - C312B5C9A1506139452E194B /* Products */ = { - isa = PBXGroup; - children = ( - 1DB07799A17353B2E32B65D3 /* Maple.app */, - ); - name = Products; - sourceTree = ""; - }; - D3140E092D76240F6A157CCE = { - isa = PBXGroup; - children = ( - AF5DA3546C7B12BA141E9508 /* assets */, - 6BF4C7EB12DBD2E253B2741E /* Assets.xcassets */, - B0EAFEFF59AA7CFEF57FA63C /* LaunchScreen.storyboard */, - 6AE8986BFC081ADF4EF98889 /* Externals */, - 31943D18956B6AFD5A82AB02 /* maple_iOS */, - A278899D6905367F60E00F01 /* Sources */, - FF31B258F4FE6CC5B57B4FB8 /* src */, - B58B2AB62FA5D8F41C3A031C /* Frameworks */, - C312B5C9A1506139452E194B /* Products */, - ); - sourceTree = ""; - }; - E5992A2C52DE443515252068 /* maple */ = { - isa = PBXGroup; - children = ( - CE20E8A9C4CF149CA9CA485A /* main.mm */, - F9E1B0C7AF484C8F6312F2C8 /* bindings */, - ); - path = maple; - sourceTree = ""; - }; - F9E1B0C7AF484C8F6312F2C8 /* bindings */ = { - isa = PBXGroup; - children = ( - 7BBAB8D5C4E3D05A4F48B6EA /* bindings.h */, - ); - path = bindings; - sourceTree = ""; - }; - FF31B258F4FE6CC5B57B4FB8 /* src */ = { - isa = PBXGroup; - children = ( - 1094B8CB671809878F533CEC /* lib.rs */, - C0A332F21EB65CD4B83229DF /* main.rs */, - ); - name = src; - path = ../../src; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 745812EBA5246F9E4CEE1574 /* maple_iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 27939507295816FC37580B40 /* Build configuration list for PBXNativeTarget "maple_iOS" */; - buildPhases = ( - 88FF8D973FB9516A2A98CD39 /* Build Rust Code */, - 6D9F08407F22BE108C77276C /* Sources */, - 25104604B2C2A81B04543E68 /* Resources */, - 04F3BEBB04BD927FDC86B255 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = maple_iOS; - productName = maple_iOS; - productReference = 1DB07799A17353B2E32B65D3 /* Maple.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - EAA0B11A781B9CD753D1399F /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1430; - }; - buildConfigurationList = 2FA6FD4DEFE659C96AAB5E5D /* Build configuration list for PBXProject "maple" */; - compatibilityVersion = "Xcode 14.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - Base, - en, - ); - mainGroup = D3140E092D76240F6A157CCE; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 745812EBA5246F9E4CEE1574 /* maple_iOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 25104604B2C2A81B04543E68 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - A120CF155DE2B343CEFFB77C /* Assets.xcassets in Resources */, - 621A96F6B965E600E714FB6C /* LaunchScreen.storyboard in Resources */, - B79EC8A2A1A869B9F38906ED /* assets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 88FF8D973FB9516A2A98CD39 /* Build Rust Code */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Build Rust Code"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(SRCROOT)/Externals/x86_64/${CONFIGURATION}/libapp.a", - "$(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a", - "$(SRCROOT)/Externals/arm64-sim/${CONFIGURATION}/libapp.a", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "bun tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths \"${FRAMEWORK_SEARCH_PATHS:?}\" --header-search-paths \"${HEADER_SEARCH_PATHS:?}\" --gcc-preprocessor-definitions \"${GCC_PREPROCESSOR_DEFINITIONS:-}\" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?}"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 6D9F08407F22BE108C77276C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9F3ED7EA97AFC22E0B4A6EAF /* main.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DE1BEC252AAEF735A07CA8B /* debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ARCHS = ( - arm64, - "arm64-sim", - ); - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = maple_iOS/maple_iOS.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = "X773Y823TN"; - ENABLE_BITCODE = NO; - "EXCLUDED_ARCHS[sdk=iphoneos*]" = "arm64-sim x86_64"; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\".\"", - ); - INFOPLIST_FILE = maple_iOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - "LIBRARY_SEARCH_PATHS[arch=arm64-sim]" = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/arm64-sim/$(CONFIGURATION)", - "$(SDKROOT)/usr/lib/swift", - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", - "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", - ); - "LIBRARY_SEARCH_PATHS[arch=arm64]" = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION)", - "$(SDKROOT)/usr/lib/swift", - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", - "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", - ); - "LIBRARY_SEARCH_PATHS[arch=x86_64]" = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION)", - "$(SDKROOT)/usr/lib/swift", - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", - "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", - ); - PRODUCT_BUNDLE_IDENTIFIER = cloud.opensecret.maple; - PRODUCT_NAME = Maple; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 arm64-sim"; - }; - name = debug; - }; - 1E8FE8E2E3063C3FDCD3B5D1 /* debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = debug; - }; - 94ECC2E044AA76E166E0866E /* release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - }; - name = release; - }; - B90C9BEF4885680BFA986CD2 /* release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ARCHS = ( - arm64, - "arm64-sim", - ); - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = maple_iOS/maple_iOS.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = "X773Y823TN"; - ENABLE_BITCODE = NO; - "EXCLUDED_ARCHS[sdk=iphoneos*]" = "arm64-sim x86_64"; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\".\"", - ); - INFOPLIST_FILE = maple_iOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - "LIBRARY_SEARCH_PATHS[arch=arm64-sim]" = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/arm64-sim/$(CONFIGURATION)", - "$(SDKROOT)/usr/lib/swift", - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", - "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", - ); - "LIBRARY_SEARCH_PATHS[arch=arm64]" = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION)", - "$(SDKROOT)/usr/lib/swift", - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", - "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", - ); - "LIBRARY_SEARCH_PATHS[arch=x86_64]" = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION)", - "$(SDKROOT)/usr/lib/swift", - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", - "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", - ); - PRODUCT_BUNDLE_IDENTIFIER = cloud.opensecret.maple; - PRODUCT_NAME = Maple; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 arm64-sim"; - }; - name = release; - }; - EA2669D02DADAA11005A7F4B /* local */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = local; - }; - EA2669D12DADAA11005A7F4B /* local */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ARCHS = ( - arm64, - "arm64-sim", - ); - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = maple_iOS/maple_iOS.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = "X773Y823TN"; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = X773Y823TN; - ENABLE_BITCODE = NO; - "EXCLUDED_ARCHS[sdk=iphoneos*]" = "arm64-sim x86_64"; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\".\"", - ); - INFOPLIST_FILE = maple_iOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - "LIBRARY_SEARCH_PATHS[arch=arm64-sim]" = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/arm64-sim/$(CONFIGURATION)", - "$(SDKROOT)/usr/lib/swift", - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", - "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", - ); - "LIBRARY_SEARCH_PATHS[arch=arm64]" = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION)", - "$(SDKROOT)/usr/lib/swift", - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", - "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", - ); - "LIBRARY_SEARCH_PATHS[arch=x86_64]" = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION)", - "$(SDKROOT)/usr/lib/swift", - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", - "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", - ); - PRODUCT_BUNDLE_IDENTIFIER = cloud.opensecret.maple; - PRODUCT_NAME = Maple; - PROVISIONING_PROFILE_SPECIFIER = "86059ea7-ae8e-44af-8a58-b2ab7c78d299"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "86059ea7-ae8e-44af-8a58-b2ab7c78d299"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 arm64-sim"; - }; - name = local; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 27939507295816FC37580B40 /* Build configuration list for PBXNativeTarget "maple_iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DE1BEC252AAEF735A07CA8B /* debug */, - EA2669D12DADAA11005A7F4B /* local */, - B90C9BEF4885680BFA986CD2 /* release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = debug; - }; - 2FA6FD4DEFE659C96AAB5E5D /* Build configuration list for PBXProject "maple" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E8FE8E2E3063C3FDCD3B5D1 /* debug */, - EA2669D02DADAA11005A7F4B /* local */, - 94ECC2E044AA76E166E0866E /* release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = debug; - }; -/* End XCConfigurationList section */ - }; - rootObject = EAA0B11A781B9CD753D1399F /* Project object */; -} diff --git a/apps/maple-research/frontend/src-tauri/scripts/build-ios-onnxruntime-all.sh b/apps/maple-research/frontend/src-tauri/scripts/build-ios-onnxruntime-all.sh index 21b6e43c8..0baf7fc9d 100755 --- a/apps/maple-research/frontend/src-tauri/scripts/build-ios-onnxruntime-all.sh +++ b/apps/maple-research/frontend/src-tauri/scripts/build-ios-onnxruntime-all.sh @@ -23,7 +23,7 @@ BUILD_DIR="${TAURI_DIR}/onnxruntime-build" OUTPUT_DIR="${TAURI_DIR}/onnxruntime-ios" XCFRAMEWORK_DIR="${OUTPUT_DIR}/onnxruntime.xcframework" -IOS_DEPLOYMENT_TARGET="13.0" +IOS_DEPLOYMENT_TARGET="16.0" echo "========================================" echo "Building ONNX Runtime ${ORT_VERSION} for iOS" diff --git a/apps/maple-research/frontend/src-tauri/scripts/build-ios-onnxruntime.sh b/apps/maple-research/frontend/src-tauri/scripts/build-ios-onnxruntime.sh index de3e38d0e..649e1df11 100755 --- a/apps/maple-research/frontend/src-tauri/scripts/build-ios-onnxruntime.sh +++ b/apps/maple-research/frontend/src-tauri/scripts/build-ios-onnxruntime.sh @@ -24,7 +24,7 @@ OUTPUT_DIR="${TAURI_DIR}/onnxruntime-ios" XCFRAMEWORK_DIR="${OUTPUT_DIR}/onnxruntime.xcframework" # Minimum iOS version to support -IOS_DEPLOYMENT_TARGET="13.0" +IOS_DEPLOYMENT_TARGET="16.0" echo "========================================" echo "Building ONNX Runtime ${ORT_VERSION} for iOS" diff --git a/apps/maple-research/frontend/src-tauri/scripts/onnxruntime-pins.sh b/apps/maple-research/frontend/src-tauri/scripts/onnxruntime-pins.sh index 51cb644df..ce6b55e44 100644 --- a/apps/maple-research/frontend/src-tauri/scripts/onnxruntime-pins.sh +++ b/apps/maple-research/frontend/src-tauri/scripts/onnxruntime-pins.sh @@ -165,11 +165,11 @@ onnxruntime_ios_commit_for_version() { } onnxruntime_ios_device_lib_sha256_for_version() { - local xcode_build="${2:-${MAPLE_XCODE_BUILD_VERSION:-17F42}}" + local xcode_build="${2:-${MAPLE_XCODE_BUILD_VERSION:-27A9275}}" case "$1:${xcode_build}" in - 1.23.2:17F42) - printf '%s\n' "917cf5f30aa65f435371e323e347e094c99804fd6a268d3ae946cd8e5e58945f" + 1.23.2:27A9275) + printf '%s\n' "e4d288188f0b520d6676e87ad4a694326a8844618f471b5c8cfcdb69daf66657" ;; *) echo "No pinned ONNX Runtime iOS device library SHA-256 for version '$1' and Xcode build '${xcode_build}'." >&2 @@ -179,11 +179,11 @@ onnxruntime_ios_device_lib_sha256_for_version() { } onnxruntime_ios_simulator_lib_sha256_for_version() { - local xcode_build="${2:-${MAPLE_XCODE_BUILD_VERSION:-17F42}}" + local xcode_build="${2:-${MAPLE_XCODE_BUILD_VERSION:-27A9275}}" case "$1:${xcode_build}" in - 1.23.2:17F42) - printf '%s\n' "87c87225026db5ee2b5a1293468b9cc3410ad22eac182899056a05f2f2862071" + 1.23.2:27A9275) + printf '%s\n' "0b670a0fce021844551d7bd9fc0c3c4275208375155e0c17254866215ae28736" ;; *) echo "No pinned ONNX Runtime iOS simulator library SHA-256 for version '$1' and Xcode build '${xcode_build}'." >&2 @@ -193,11 +193,11 @@ onnxruntime_ios_simulator_lib_sha256_for_version() { } onnxruntime_ios_xcframework_sha256_for_version() { - local xcode_build="${2:-${MAPLE_XCODE_BUILD_VERSION:-17F42}}" + local xcode_build="${2:-${MAPLE_XCODE_BUILD_VERSION:-27A9275}}" case "$1:${xcode_build}" in - 1.23.2:17F42) - printf '%s\n' "86871fe82fb5b043540d5bbc67de5ba73f2a52105ec05c66e835b7add8972af5" + 1.23.2:27A9275) + printf '%s\n' "93cbb699abebba06963ccf1b5c283ea0bbf7b8e9e4664f9b2df726d2808bf18a" ;; *) echo "No pinned ONNX Runtime iOS xcframework SHA-256 for version '$1' and Xcode build '${xcode_build}'." >&2 diff --git a/apps/maple-research/frontend/src-tauri/tests/storekit/README.md b/apps/maple-research/frontend/src-tauri/tests/storekit/README.md index 96943c890..e570b3064 100644 --- a/apps/maple-research/frontend/src-tauri/tests/storekit/README.md +++ b/apps/maple-research/frontend/src-tauri/tests/storekit/README.md @@ -26,8 +26,9 @@ re-signs/verifies them, and generates the local experiment scheme. Source plist and entitlements are restored. Preserve the existing frozen artifact when comparing toolchains; rebuilding Maple is a separate action. -These test commands explicitly select installed Xcode 26.6 **after entering** the -pinned Apple shell, without changing repository pins or global Xcode selection. +These test commands use the Xcode selected by the pinned Apple shell +(`scripts/ci/apple-toolchain.json`). The dated notes below record earlier runs on +Xcode 26.5 and 26.6. Use `run.sh`, which prepares native linker variables; do not invoke `run.py` directly from an unprepared Nix shell. Substitute the exact frozen app path and intended simulator UDID when different from these examples. @@ -35,9 +36,7 @@ intended simulator UDID when different from these examples. First build the small runner and run the catalog canary, which needs no fixture: ```sh -nix develop --no-update-lock-file .#apple -c env \ - MAPLE_NIX_XCODE_VERSION=26.6 MAPLE_NIX_XCODE_BUILD_VERSION=17F113 \ - DEVELOPER_DIR=/Applications/Xcode_26.6.app/Contents/Developer \ +nix develop --no-update-lock-file .#apple -c \ bash scripts/testing/storekit/run.sh \ --app apps/maple-research/frontend/src-tauri/gen/apple/build/arm64-sim/Maple.app \ --udid "" \ @@ -47,9 +46,7 @@ nix develop --no-update-lock-file .#apple -c env \ Then run the certificate canary with a fresh runner-owned bootstrap fixture: ```sh -nix develop --no-update-lock-file .#apple -c env \ - MAPLE_NIX_XCODE_VERSION=26.6 MAPLE_NIX_XCODE_BUILD_VERSION=17F113 \ - DEVELOPER_DIR=/Applications/Xcode_26.6.app/Contents/Developer \ +nix develop --no-update-lock-file .#apple -c \ bash scripts/testing/storekit/run.sh --skip-build --fixture-bootstrap \ --app apps/maple-research/frontend/src-tauri/gen/apple/build/arm64-sim/Maple.app \ --udid "" \ @@ -69,9 +66,7 @@ Pass that certificate to the remaining cases. They reuse the runner build but each gets a separate XCTest invocation, fixture process and journal: ```sh -nix develop --no-update-lock-file .#apple -c env \ - MAPLE_NIX_XCODE_VERSION=26.6 MAPLE_NIX_XCODE_BUILD_VERSION=17F113 \ - DEVELOPER_DIR=/Applications/Xcode_26.6.app/Contents/Developer \ +nix develop --no-update-lock-file .#apple -c \ bash scripts/testing/storekit/run.sh --skip-build \ --fixture-certificate /absolute/path/to/MapleStoreKitSigningCertificate.cer \ --app apps/maple-research/frontend/src-tauri/gen/apple/build/arm64-sim/Maple.app \ @@ -175,9 +170,7 @@ To export metadata from an already running purchased diagnostic screen without reinstalling or restarting Maple, pass the exact GUI-built DerivedData app: ```sh -nix develop --no-update-lock-file .#apple -c env \ - MAPLE_NIX_XCODE_VERSION=26.6 MAPLE_NIX_XCODE_BUILD_VERSION=17F113 \ - DEVELOPER_DIR=/Applications/Xcode_26.6.app/Contents/Developer \ +nix develop --no-update-lock-file .#apple -c \ bash scripts/testing/storekit/run.sh --app /absolute/path/to/Maple.app \ --udid "" \ --only MapleStoreKitCaptureUITests/testExportPublicSigningCertificate @@ -202,7 +195,7 @@ The exact Foundation-only parser can also be checked on the host, without building an app or operating a simulator: ```sh -DEVELOPER_DIR=/Applications/Xcode_26.6.app/Contents/Developer \ +DEVELOPER_DIR=/Applications/Xcode_27.1.app/Contents/Developer \ python3 scripts/testing/storekit/check-snapshot-parser.py ``` diff --git a/docs/ci.md b/docs/ci.md index 1eba71e17..61f207d2c 100644 --- a/docs/ci.md +++ b/docs/ci.md @@ -169,7 +169,7 @@ org's 16-core GitHub runner are billed by the minute. | Runner | Lanes | Why | | --- | --- | --- | -| `blacksmith-8vcpu-ubuntu-2404`, `blacksmith-6vcpu-macos-26`, `blacksmith-8vcpu-windows-2025` | Most compiling lanes, for example Research Rust, OpenSecret Rust, every macOS lane and the Agent's Windows Clippy | Fast, with warm caches in Blacksmith's store | +| `blacksmith-8vcpu-ubuntu-2404`, `blacksmith-6vcpu-macos-27`, `blacksmith-8vcpu-windows-2025` | Most compiling lanes, for example Research Rust, OpenSecret Rust, every macOS lane and the Agent's Windows Clippy | Fast, with warm caches in Blacksmith's store | | `blacksmith-32vcpu-ubuntu-2404` | `agent-lint`, `agent-test` | The heaviest cold builds | | `ubuntu-latest`, `ubuntu-24.04-arm` | Lighter lanes, for example `repo`, SDK, proxy, Research web, services, `deps-*` and `os-pcr` | Free, and fast enough without Blacksmith | | `windows-2025` | `agent-windows-updater`, `agent-full-windows` | Blacksmith's Windows workspace inherits a foreign write ACE that the updater's storage validation rejects, and the reparse tests need the symlink privilege GitHub's runner grants | diff --git a/docs/repository-workflows.md b/docs/repository-workflows.md index 8eec5ddde..5cc96d853 100644 --- a/docs/repository-workflows.md +++ b/docs/repository-workflows.md @@ -247,7 +247,7 @@ release workflows use: | Work | Runner | | --- | --- | -| Research macOS, Linux, Android and iOS builds, which compile and sign (master and release); `rust-tests.yml`; the Agent's unsigned master builds | Blacksmith (`blacksmith-6vcpu-macos-26`, `blacksmith-8vcpu-ubuntu-2404`, `blacksmith-8vcpu-windows-2025`) | +| Research macOS, Linux, Android and iOS builds, which compile and sign (master and release); `rust-tests.yml`; the Agent's unsigned master builds | Blacksmith (`blacksmith-6vcpu-macos-27`, `blacksmith-8vcpu-ubuntu-2404`, `blacksmith-8vcpu-windows-2025`) | | Release `build-windows` | `maple-windows-2025-16core` | | Signed Research Windows master build; Agent Windows signing and verification | `windows-2025` | | Artifact verifiers, TestFlight submission, the Agent's signing and attestation, CodeQL, web and frontend evidence | Other GitHub-hosted runners | @@ -268,7 +268,7 @@ PowerShell Gallery and its CDN and accepts only the pinned SHA-256. Rust, MSVC, Perl and the linker are pinned by `.github/actions/setup-agent-windows` for the Agent. -Research desktop and iOS builds select Xcode 26.5 (`17F42`) from +Research desktop and iOS builds select Xcode 27.1 (`27A9275`) from [`scripts/ci/apple-toolchain.json`](../scripts/ci/apple-toolchain.json) through `scripts/ci/select-xcode.py`; the root Nix shell exports the same version for its Apple recipes. Do not rely on a runner's default Xcode. The diff --git a/scripts/ci/_common.sh b/scripts/ci/_common.sh index 046293ea3..6736b1e31 100755 --- a/scripts/ci/_common.sh +++ b/scripts/ci/_common.sh @@ -2814,7 +2814,7 @@ verify_ios_onnxruntime_pinned_hashes() { local version xcode_build xcframework manifest file expected actual status version="$(ios_onnxruntime_version)" - xcode_build="${MAPLE_XCODE_BUILD_VERSION:-17F42}" + xcode_build="${MAPLE_XCODE_BUILD_VERSION:-27A9275}" xcframework="$(ios_onnxruntime_xcframework_dir)" manifest="$(ios_onnxruntime_manifest_file)" status=0 diff --git a/scripts/ci/apple-toolchain.json b/scripts/ci/apple-toolchain.json index 8f2cd86e1..9aa97b351 100644 --- a/scripts/ci/apple-toolchain.json +++ b/scripts/ci/apple-toolchain.json @@ -1,4 +1,4 @@ { - "version": "26.5", - "build": "17F42" + "version": "27.1", + "build": "27A9275" } diff --git a/scripts/ci/lanes.py b/scripts/ci/lanes.py index d71ca362c..d56a1e3dc 100644 --- a/scripts/ci/lanes.py +++ b/scripts/ci/lanes.py @@ -36,7 +36,7 @@ def cache_store(label: str) -> str: # The override variables are unset; set one to fail over during an outage. LINUX = Runner("blacksmith-8vcpu-ubuntu-2404", "CI_LINUX_RUNNER") LINUX_HEAVY = Runner("blacksmith-32vcpu-ubuntu-2404", "CI_LINUX_HEAVY_RUNNER") -MACOS = Runner("blacksmith-6vcpu-macos-26", "CI_MACOS_RUNNER") +MACOS = Runner("blacksmith-6vcpu-macos-27", "CI_MACOS_RUNNER") WINDOWS = Runner("blacksmith-8vcpu-windows-2025", "CI_WINDOWS_RUNNER") GITHUB = Runner("ubuntu-latest") # free GitHub runner for lanes that compile nothing heavy # The Agent updater's native Windows tests and the installer smoke test need GitHub's diff --git a/scripts/testing/storekit/run.sh b/scripts/testing/storekit/run.sh index 812b01f14..e0ac66d1a 100644 --- a/scripts/testing/storekit/run.sh +++ b/scripts/testing/storekit/run.sh @@ -2,10 +2,11 @@ set -euo pipefail # Invoke through .#apple so native linker variables are prepared here. -# A deliberate local comparison can select Xcode 26.6 without changing pins: +# A deliberate local comparison can select another installed Xcode without +# changing pins: # nix develop --no-update-lock-file .#apple -c env \ -# MAPLE_NIX_XCODE_VERSION=26.6 MAPLE_NIX_XCODE_BUILD_VERSION=17F113 \ -# DEVELOPER_DIR=/Applications/Xcode_26.6.app/Contents/Developer \ +# MAPLE_NIX_XCODE_VERSION= MAPLE_NIX_XCODE_BUILD_VERSION= \ +# DEVELOPER_DIR=/Applications/Xcode_.app/Contents/Developer \ # bash scripts/testing/storekit/run.sh ... source "$(cd "$(dirname "${BASH_SOURCE[0]}")/../../ci" && pwd)/_common.sh" use_xcode_toolchain From 840d8d78f152cea3ddb94d88e05b67c2c49df3ed Mon Sep 17 00:00:00 2001 From: Anthony Ronning <101225832+AnthonyRonning@users.noreply.github.com> Date: Thu, 29 Oct 2026 02:57:17 +0000 Subject: [PATCH 4/6] ci: compile Agent Metal shaders on Blacksmith macOS 27 Blacksmith's macOS 27 image has no Metal Toolchain for Xcode 27.1 and cannot download it (the MobileAsset catalog fetch fails), while GitHub's xcode-27 image ships it. - A new export runs on xcode-27 and uploads the toolchain as a one-day artifact (.github/actions/export-metal-toolchain). The jobs that compile gpui's shaders import it (import-metal-toolchain): the signed macOS build in agent-desktop-build.yml and, in ci.yml, the macOS packaging rehearsal. - Lanes gain `requires`. The planner adds a required lane to every plan that selects the lane requiring it, dispatches included, so metal-toolchain runs exactly when agent-package-macos does. lint checks that requirements exist, form no cycle, select nothing on their own, and that the requiring job needs them. - agent-macos (PR Clippy) and agent-full-macos (the native suite) build gpui with runtime_shaders and need no Metal. Compiled shaders are proven by master's signed Prod build on every Agent push, the nightly Dev build and ci:package. Toolchain changes now also select agent-full-macos on master. - Cache keys include the Xcode pin, so an upgrade never restores objects built against the previous SDK: the macOS lanes' cache_files, the packaging rehearsal's key prefix, and the signed build's release key (cargo_graph_key.py takes optional pin files; C4 expects the pin for macos-build only, so the Windows and Linux keys are unchanged). - The policy tests know GitHub's per-Xcode labels are GitHub-hosted, so the attesting signing job may run on xcode-27. Co-Authored-By: Claude Opus 5.5 --- .../change-maple-ci/references/changing-ci.md | 13 +++++- .../actions/export-metal-toolchain/action.yml | 28 ++++++++++++ .../actions/import-metal-toolchain/action.yml | 30 +++++++++++++ .github/workflows/agent-desktop-build.yml | 25 ++++++++++- .github/workflows/ci.yml | 26 +++++++++-- docs/ci.md | 4 +- docs/repository-workflows.md | 6 ++- scripts/ci/cargo_graph_key.py | 19 +++++--- scripts/ci/lanes.py | 35 +++++++++++---- scripts/ci/plan.py | 44 ++++++++++++++++++- scripts/ci/test_cargo_graph_key.py | 19 ++++++++ scripts/ci/test_contracts.py | 17 +++++-- scripts/ci/test_plan.py | 42 ++++++++++++++++++ scripts/ci/test_workflow_policy.py | 4 +- 14 files changed, 280 insertions(+), 32 deletions(-) create mode 100644 .github/actions/export-metal-toolchain/action.yml create mode 100644 .github/actions/import-metal-toolchain/action.yml diff --git a/.agents/skills/change-maple-ci/references/changing-ci.md b/.agents/skills/change-maple-ci/references/changing-ci.md index d1c7c8cb1..7fcefe334 100644 --- a/.agents/skills/change-maple-ci/references/changing-ci.md +++ b/.agents/skills/change-maple-ci/references/changing-ci.md @@ -23,6 +23,7 @@ Paths are relative to the repository root. `scripts/ci/lanes.py` and | `submodules` | Recursive submodules with full blobless history (Nix needs `revCount`) | | `hook` | Pre-commit component that runs the same checks locally | | `restore` | Read-only restore of a cache another workflow writes | +| `requires` | Lanes whose jobs this lane's special job needs. The planner adds them to every plan that selects the lane, dispatches included; a required lane has no paths, labels or gate of its own, so nothing else selects it (lint). `metal-toolchain` is the example: GitHub's xcode-27 image exports Xcode's Metal Toolchain for `agent-package-macos` | Event sets: @@ -99,6 +100,8 @@ Its id is the lane's `job`. Checked by `plan.py lint` and the policy tests: - `runs-on` exactly `${{ vars. || '