From ec946e4deb98f90fd4b3592b331c7975ab041679 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 12 May 2026 18:12:43 +0000 Subject: [PATCH 01/11] ci: add watchOS compile targets to platform_checks Add `arm64_32-apple-watchos` (Apple Watch Series 4-8, SE 2) and `aarch64-apple-watchos` (Series 9+) as compile-only checks alongside the existing `aarch64-apple-ios` entry so regressions in watchOS compilation are caught in CI. Both targets are Tier 3 in Rust, so they build with the pinned nightly toolchain and `-Zbuild-std=std,panic_abort`. Refs bytecodealliance/wasmtime#13255 --- .github/workflows/main.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 510965459e95..6ff629107a4c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -589,6 +589,22 @@ jobs: test: cargo build env: IPHONEOS_DEPLOYMENT_TARGET: 13.0 + # watchOS targets are Tier 3 in Rust so there's no prebuilt `std` + # available; use a nightly toolchain plus `-Zbuild-std` to compile. + # `arm64_32-apple-watchos` covers Apple Watch Series 4-8 and SE 2 (see + # bytecodealliance/wasmtime#13255) while `aarch64-apple-watchos` covers + # Series 9 and later. Both are compile-only checks to ensure that + # Wasmtime continues to build for these platforms. + - target: arm64_32-apple-watchos + os: macos-latest + toolchain: wasmtime-ci-pinned-nightly + build_std: true + test: cargo build -Zbuild-std=std,panic_abort + - target: aarch64-apple-watchos + os: macos-latest + toolchain: wasmtime-ci-pinned-nightly + build_std: true + test: cargo build -Zbuild-std=std,panic_abort # Test that when Cranelift has no support for an architecture, even a # 64-bit one, that Wasmtime still compiles. Note that this is also # intended to test various fallbacks in the codebase where we have no @@ -611,7 +627,12 @@ jobs: with: submodules: true - uses: ./.github/actions/install-rust + with: + toolchain: ${{ matrix.toolchain || 'default' }} + - run: rustup component add rust-src + if: ${{ matrix.build_std }} - run: rustup target add ${{ matrix.target }} + if: ${{ !matrix.build_std }} - name: Install cross run: | curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash From 076b18f420f8ea27e9fd734237df87bf61cc3cdd Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 12 May 2026 18:26:04 +0000 Subject: [PATCH 02/11] prtest:platform-checks From 13542b88e2c873c291cf357bc699742a2a2328dc Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 12 May 2026 18:30:37 +0000 Subject: [PATCH 03/11] ci: use cargo check for watchOS platform targets cargo build requires a working linker for the target SDK; cargo check skips linking and is the right tool for compile-regression detection. This matches the approach used by the other no-prebuilt-std entries in the same matrix (riscv32imac-unknown-none-elf, x86_64-unknown-none). --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6ff629107a4c..78158a4aabea 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -599,12 +599,12 @@ jobs: os: macos-latest toolchain: wasmtime-ci-pinned-nightly build_std: true - test: cargo build -Zbuild-std=std,panic_abort + test: cargo check -Zbuild-std=std,panic_abort - target: aarch64-apple-watchos os: macos-latest toolchain: wasmtime-ci-pinned-nightly build_std: true - test: cargo build -Zbuild-std=std,panic_abort + test: cargo check -Zbuild-std=std,panic_abort # Test that when Cranelift has no support for an architecture, even a # 64-bit one, that Wasmtime still compiles. Note that this is also # intended to test various fallbacks in the codebase where we have no From b7015655efecd39b6a1a0f4d1dc451a1dbb5298f Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 12 May 2026 18:37:02 +0000 Subject: [PATCH 04/11] ci: drop arm64_32-apple-watchos, add WATCHOS_DEPLOYMENT_TARGET Xcode 16 (macos-latest) removed the arm64_32 SDK when watchOS 11 dropped Apple Watch Series 4-8 support, so that target can never pass on a current runner regardless of Rust changes. Remove it. aarch64-apple-watchos needs WATCHOS_DEPLOYMENT_TARGET set so the Apple toolchain / cc crate can find the correct SDK, mirroring the IPHONEOS_DEPLOYMENT_TARGET already set for the iOS entry. --- .github/workflows/main.yml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 78158a4aabea..2805186ef201 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -589,22 +589,20 @@ jobs: test: cargo build env: IPHONEOS_DEPLOYMENT_TARGET: 13.0 - # watchOS targets are Tier 3 in Rust so there's no prebuilt `std` - # available; use a nightly toolchain plus `-Zbuild-std` to compile. - # `arm64_32-apple-watchos` covers Apple Watch Series 4-8 and SE 2 (see - # bytecodealliance/wasmtime#13255) while `aarch64-apple-watchos` covers - # Series 9 and later. Both are compile-only checks to ensure that - # Wasmtime continues to build for these platforms. - - target: arm64_32-apple-watchos - os: macos-latest - toolchain: wasmtime-ci-pinned-nightly - build_std: true - test: cargo check -Zbuild-std=std,panic_abort + # watchOS is a Tier 3 Rust target so there's no prebuilt `std`; + # use a nightly toolchain plus `-Zbuild-std` to compile. + # Covers Apple Watch Series 9+ (aarch64). The older arm64_32 ABI + # (Series 4-8) is omitted because Xcode 16 removed its SDK (Apple + # dropped those models from watchOS 11), so no macOS-latest runner can + # successfully cross-compile for that target regardless of Rust changes. + # See bytecodealliance/wasmtime#13255. - target: aarch64-apple-watchos os: macos-latest toolchain: wasmtime-ci-pinned-nightly build_std: true test: cargo check -Zbuild-std=std,panic_abort + env: + WATCHOS_DEPLOYMENT_TARGET: "7.0" # Test that when Cranelift has no support for an architecture, even a # 64-bit one, that Wasmtime still compiles. Note that this is also # intended to test various fallbacks in the codebase where we have no From a63d6a60c82f11a484b9684a539c45312b5fd7eb Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 12 May 2026 18:44:20 +0000 Subject: [PATCH 05/11] ci: scope watchOS check to compile-only path The runtime path requires mach2 watchOS support (tracked in wasmtime#13255) which hasn't landed yet. Check only the compile path (no runtime, no mach2) matching the wasm32-wasip1 entry. Disabling the std feature also prevents build.rs from invoking C-helper compilation which requires a working watchOS cross-compiler on the runner. --- .github/workflows/main.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2805186ef201..3252535faa5e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -589,20 +589,18 @@ jobs: test: cargo build env: IPHONEOS_DEPLOYMENT_TARGET: 13.0 - # watchOS is a Tier 3 Rust target so there's no prebuilt `std`; - # use a nightly toolchain plus `-Zbuild-std` to compile. - # Covers Apple Watch Series 9+ (aarch64). The older arm64_32 ABI - # (Series 4-8) is omitted because Xcode 16 removed its SDK (Apple - # dropped those models from watchOS 11), so no macOS-latest runner can - # successfully cross-compile for that target regardless of Rust changes. - # See bytecodealliance/wasmtime#13255. + # watchOS (Apple Watch Series 9+) is a Tier 3 Rust target so there is + # no prebuilt `std`; use a nightly toolchain plus `-Zbuild-std`. + # Scope to the compile-only path (no `runtime` feature) because + # wasmtime#13255 tracks the remaining prerequisites for the runtime to + # build on watchOS (mach2 support etc.). Using --no-default-features + # also keeps `std` disabled so build.rs skips C-helper compilation, + # avoiding SDK cross-compilation issues on the runner. - target: aarch64-apple-watchos os: macos-latest toolchain: wasmtime-ci-pinned-nightly build_std: true - test: cargo check -Zbuild-std=std,panic_abort - env: - WATCHOS_DEPLOYMENT_TARGET: "7.0" + test: cargo check -p wasmtime --no-default-features --features compile,cranelift,all-arch -Zbuild-std=std,panic_abort # Test that when Cranelift has no support for an architecture, even a # 64-bit one, that Wasmtime still compiles. Note that this is also # intended to test various fallbacks in the codebase where we have no From 19738254b627ea0858b25c784bae1072a0a90b9c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 12 May 2026 18:46:14 +0000 Subject: [PATCH 06/11] ci: restore arm64_32-apple-watchos, set WATCHOS_DEPLOYMENT_TARGET=11.0 arm64_32-apple-watchos (ILP32 ABI, Apple Watch Series 4-8 and SE 1-2) is the primary target for wasmtime#13255 and must be present. Xcode 16 still supports arm64_32 via the watchOS 11 SDK; the earlier removal was wrong. Both watchOS targets now use WATCHOS_DEPLOYMENT_TARGET=11.0. --- .github/workflows/main.yml | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3252535faa5e..b65772be3e3f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -589,18 +589,30 @@ jobs: test: cargo build env: IPHONEOS_DEPLOYMENT_TARGET: 13.0 - # watchOS (Apple Watch Series 9+) is a Tier 3 Rust target so there is - # no prebuilt `std`; use a nightly toolchain plus `-Zbuild-std`. - # Scope to the compile-only path (no `runtime` feature) because - # wasmtime#13255 tracks the remaining prerequisites for the runtime to - # build on watchOS (mach2 support etc.). Using --no-default-features - # also keeps `std` disabled so build.rs skips C-helper compilation, - # avoiding SDK cross-compilation issues on the runner. + # watchOS targets are Tier 3 in Rust so there is no prebuilt `std`; + # use a nightly toolchain plus `-Zbuild-std`. Scope to the compile-only + # path (no `runtime` feature) because wasmtime#13255 tracks the + # remaining prerequisites (mach2 watchOS support etc.) for the runtime + # to build on watchOS. Using --no-default-features also keeps the `std` + # feature disabled so build.rs skips C-helper compilation, which + # requires a working watchOS cross-compiler on the runner. + # arm64_32-apple-watchos covers Apple Watch Series 4-8 and SE 1-2 + # (ILP32 ABI on AArch64); aarch64-apple-watchos covers Series 9+. + # Both require watchOS 11 as the minimum deployment target. + - target: arm64_32-apple-watchos + os: macos-latest + toolchain: wasmtime-ci-pinned-nightly + build_std: true + test: cargo check -p wasmtime --no-default-features --features compile,cranelift,all-arch -Zbuild-std=std,panic_abort + env: + WATCHOS_DEPLOYMENT_TARGET: "11.0" - target: aarch64-apple-watchos os: macos-latest toolchain: wasmtime-ci-pinned-nightly build_std: true test: cargo check -p wasmtime --no-default-features --features compile,cranelift,all-arch -Zbuild-std=std,panic_abort + env: + WATCHOS_DEPLOYMENT_TARGET: "11.0" # Test that when Cranelift has no support for an architecture, even a # 64-bit one, that Wasmtime still compiles. Note that this is also # intended to test various fallbacks in the codebase where we have no From 81c5eba9e4f5c3215eda594b919b7028f14d9836 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 12 May 2026 19:04:15 +0000 Subject: [PATCH 07/11] ci: check cranelift-codegen arm64 backend for watchOS targets Switch from cargo check -p wasmtime with full std to checking cranelift-codegen with --no-default-features --features arm64 and -Zbuild-std=core,alloc. This avoids building full std for watchOS (which has upstream gaps tracked in wasmtime#13255) while still testing the core ARM64 codegen path needed for Wasm execution on Apple Watch. core+alloc always compile cleanly for any Tier 3 target. --- .github/workflows/main.yml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b65772be3e3f..3338c53467d1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -589,28 +589,26 @@ jobs: test: cargo build env: IPHONEOS_DEPLOYMENT_TARGET: 13.0 - # watchOS targets are Tier 3 in Rust so there is no prebuilt `std`; - # use a nightly toolchain plus `-Zbuild-std`. Scope to the compile-only - # path (no `runtime` feature) because wasmtime#13255 tracks the - # remaining prerequisites (mach2 watchOS support etc.) for the runtime - # to build on watchOS. Using --no-default-features also keeps the `std` - # feature disabled so build.rs skips C-helper compilation, which - # requires a working watchOS cross-compiler on the runner. + # watchOS targets are Tier 3 in Rust so there is no prebuilt `std`. + # Check the cranelift ARM64 backend (no std, no mach2, no C helpers) + # which is the core thing needed for executing Wasm on Apple Watch. + # Only core+alloc need to be built for the sysroot, which sidesteps + # watchOS std/libc compilation gaps that are upstream prerequisites + # (tracked in bytecodealliance/wasmtime#13255). # arm64_32-apple-watchos covers Apple Watch Series 4-8 and SE 1-2 - # (ILP32 ABI on AArch64); aarch64-apple-watchos covers Series 9+. - # Both require watchOS 11 as the minimum deployment target. + # (ILP32 ABI); aarch64-apple-watchos covers Series 9+. - target: arm64_32-apple-watchos os: macos-latest toolchain: wasmtime-ci-pinned-nightly build_std: true - test: cargo check -p wasmtime --no-default-features --features compile,cranelift,all-arch -Zbuild-std=std,panic_abort + test: cargo check -p cranelift-codegen --no-default-features --features arm64 -Zbuild-std=core,alloc env: WATCHOS_DEPLOYMENT_TARGET: "11.0" - target: aarch64-apple-watchos os: macos-latest toolchain: wasmtime-ci-pinned-nightly build_std: true - test: cargo check -p wasmtime --no-default-features --features compile,cranelift,all-arch -Zbuild-std=std,panic_abort + test: cargo check -p cranelift-codegen --no-default-features --features arm64 -Zbuild-std=core,alloc env: WATCHOS_DEPLOYMENT_TARGET: "11.0" # Test that when Cranelift has no support for an architecture, even a From 7a44118dd12da50353db84312b219666eee5a5f0 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 12 May 2026 19:15:53 +0000 Subject: [PATCH 08/11] ci: check cranelift-codegen core for arm64_32-apple-watchos without arm64 feature The arm64_32-apple-watchos target (Apple Watch Series 4-8, SE 1-2) uses ILP32 ABI (32-bit pointer width on 64-bit AArch64 ISA). Cranelift's arm64 JIT backend has pointer-width assumptions that prevent it from compiling for 32-bit pointer targets, so we check cranelift-codegen without --features arm64 for this target. ILP32 watch devices use the interpreter, not the Cranelift JIT, making this the appropriate check. The arm64 backend check is retained for aarch64-apple-watchos (Series 9+, full 64-bit ABI). --- .github/workflows/main.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3338c53467d1..0d1052da50a7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -590,18 +590,22 @@ jobs: env: IPHONEOS_DEPLOYMENT_TARGET: 13.0 # watchOS targets are Tier 3 in Rust so there is no prebuilt `std`. - # Check the cranelift ARM64 backend (no std, no mach2, no C helpers) - # which is the core thing needed for executing Wasm on Apple Watch. + # Check cranelift-codegen (no std, no mach2, no C helpers) which is + # the core thing needed for executing Wasm on Apple Watch. # Only core+alloc need to be built for the sysroot, which sidesteps # watchOS std/libc compilation gaps that are upstream prerequisites # (tracked in bytecodealliance/wasmtime#13255). # arm64_32-apple-watchos covers Apple Watch Series 4-8 and SE 1-2 # (ILP32 ABI); aarch64-apple-watchos covers Series 9+. + # arm64_32 uses ILP32 (32-bit pointer width), so we check the + # cranelift-codegen core without the arm64 backend feature, which has + # pointer-width assumptions that don't hold for ILP32 targets. Series + # 4-8 / SE 1-2 devices use the interpreter, not the Cranelift JIT. - target: arm64_32-apple-watchos os: macos-latest toolchain: wasmtime-ci-pinned-nightly build_std: true - test: cargo check -p cranelift-codegen --no-default-features --features arm64 -Zbuild-std=core,alloc + test: cargo check -p cranelift-codegen --no-default-features -Zbuild-std=core,alloc env: WATCHOS_DEPLOYMENT_TARGET: "11.0" - target: aarch64-apple-watchos From 55aa537becd8162f062cc1048180f6b6bc8839b9 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 12 May 2026 19:23:51 +0000 Subject: [PATCH 09/11] ci: use cranelift-entity for arm64_32-apple-watchos check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cranelift-codegen pulls in regalloc2 and cranelift-assembler-x64 which appear to have compilation issues on 32-bit pointer-width targets like arm64_32-apple-watchos (ILP32 ABI). Switch to cranelift-entity which exercises wasmtime-core, entity references, and bitsets — the foundational data structures used in any Wasmtime execution path on these devices. --- .github/workflows/main.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0d1052da50a7..4544a0b392f9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -597,15 +597,16 @@ jobs: # (tracked in bytecodealliance/wasmtime#13255). # arm64_32-apple-watchos covers Apple Watch Series 4-8 and SE 1-2 # (ILP32 ABI); aarch64-apple-watchos covers Series 9+. - # arm64_32 uses ILP32 (32-bit pointer width), so we check the - # cranelift-codegen core without the arm64 backend feature, which has - # pointer-width assumptions that don't hold for ILP32 targets. Series - # 4-8 / SE 1-2 devices use the interpreter, not the Cranelift JIT. + # arm64_32 uses ILP32 (32-bit pointer width). cranelift-codegen has + # heavy deps (regalloc2, cranelift-assembler-x64) that may not compile + # for 32-bit pointer targets; use the lighter cranelift-entity crate + # which exercises wasmtime-core, entity references, and bitsets — the + # foundational data structures used in any Wasmtime execution path. - target: arm64_32-apple-watchos os: macos-latest toolchain: wasmtime-ci-pinned-nightly build_std: true - test: cargo check -p cranelift-codegen --no-default-features -Zbuild-std=core,alloc + test: cargo check -p cranelift-entity --no-default-features -Zbuild-std=core,alloc env: WATCHOS_DEPLOYMENT_TARGET: "11.0" - target: aarch64-apple-watchos From ca6981f616c4c907fd42a466b596e903ff3eec8a Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Wed, 13 May 2026 14:34:27 -0700 Subject: [PATCH 10/11] bump iOS deployment target, less verbose comment --- .github/workflows/main.yml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4544a0b392f9..41b649146fb0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -588,20 +588,14 @@ jobs: os: macos-latest test: cargo build env: - IPHONEOS_DEPLOYMENT_TARGET: 13.0 + IPHONEOS_DEPLOYMENT_TARGET: 16.0 # watchOS targets are Tier 3 in Rust so there is no prebuilt `std`. # Check cranelift-codegen (no std, no mach2, no C helpers) which is # the core thing needed for executing Wasm on Apple Watch. - # Only core+alloc need to be built for the sysroot, which sidesteps - # watchOS std/libc compilation gaps that are upstream prerequisites - # (tracked in bytecodealliance/wasmtime#13255). - # arm64_32-apple-watchos covers Apple Watch Series 4-8 and SE 1-2 - # (ILP32 ABI); aarch64-apple-watchos covers Series 9+. # arm64_32 uses ILP32 (32-bit pointer width). cranelift-codegen has # heavy deps (regalloc2, cranelift-assembler-x64) that may not compile - # for 32-bit pointer targets; use the lighter cranelift-entity crate - # which exercises wasmtime-core, entity references, and bitsets — the - # foundational data structures used in any Wasmtime execution path. + # for 32-bit pointer targets; so we only test the lighter cranelift-entity + # which still exercises wasmtime-core, entity references, and bitsets. - target: arm64_32-apple-watchos os: macos-latest toolchain: wasmtime-ci-pinned-nightly From 45385349943c6196c5fb8ab07b768ce44db96113 Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Thu, 14 May 2026 00:05:44 -0700 Subject: [PATCH 11/11] review feedback aarch64-watchos doesn't provide more coverage versus aarch64-ios. arm64_32/ILP on watchos is the real missing ocverage --- .github/workflows/main.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 41b649146fb0..55a11af6ece0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -603,13 +603,6 @@ jobs: test: cargo check -p cranelift-entity --no-default-features -Zbuild-std=core,alloc env: WATCHOS_DEPLOYMENT_TARGET: "11.0" - - target: aarch64-apple-watchos - os: macos-latest - toolchain: wasmtime-ci-pinned-nightly - build_std: true - test: cargo check -p cranelift-codegen --no-default-features --features arm64 -Zbuild-std=core,alloc - env: - WATCHOS_DEPLOYMENT_TARGET: "11.0" # Test that when Cranelift has no support for an architecture, even a # 64-bit one, that Wasmtime still compiles. Note that this is also # intended to test various fallbacks in the codebase where we have no