Skip to content

fix: skip -march auto-detection for cross-compile targets#21660

Closed
AztecBot wants to merge 1 commit intomerge-train/spartanfrom
claudebox/fix-cross-compile-march
Closed

fix: skip -march auto-detection for cross-compile targets#21660
AztecBot wants to merge 1 commit intomerge-train/spartanfrom
claudebox/fix-cross-compile-march

Conversation

@AztecBot
Copy link
Collaborator

Summary

Fixes CI failure in merge-train/spartan caused by #21611's -march auto-detection in arch.cmake breaking cross-compilation:

  1. arm64-android: Host's CMAKE_SYSTEM_PROCESSOR (x86_64) was used since the preset doesn't override it, so -march=skylake was passed to aarch64 zig — invalid CPU for ARM.
  2. arm64-macos: ARM detected correctly, but -march=generic overrides the preset's -mcpu=apple_a14, disabling AES/crypto extensions needed by libdeflate NEON code.

Fix: Gate -march auto-detection on NOT CMAKE_CROSSCOMPILING. Cross-compile presets already control the target CPU via zig's -target and -mcpu flags — adding -march from the host side is incorrect.

Also restores native_build_dir export accidentally removed by #21611.

Test plan

  • cmake --preset arm64-android no longer injects -march=skylake
  • cmake --preset arm64-macos no longer injects -march=generic
  • Native builds still get -march=skylake on x86_64
  • bb-cpp-cross-arm64-android, bb-cpp-cross-arm64-ios, bb-cpp-cross-arm64-macos-objects all pass in local bootstrap.sh ci-full

ClaudeBox log: https://claudebox.work/s/dd1c3d23a5ab7fde?run=1

#21611 introduced -march auto-detection in arch.cmake (skylake for x86,
generic for ARM) but this breaks cross-compilation:

1. arm64-android: CMAKE_SYSTEM_PROCESSOR defaults to host (x86_64) since
   the preset doesn't set it, so -march=skylake is passed to aarch64 zig.
2. arm64-macos: ARM is detected, but -march=generic overrides the preset's
   -mcpu=apple_a14, disabling AES/crypto extensions needed by libdeflate.

Fix: Gate auto-detection on NOT CMAKE_CROSSCOMPILING. Cross-compile presets
already control the target CPU via zig -target and -mcpu flags.

Also restores native_build_dir export accidentally removed by #21611.
@AztecBot AztecBot added the claudebox Owned by claudebox. it can push to this PR. label Mar 17, 2026
ludamad pushed a commit that referenced this pull request Mar 17, 2026
# fix: ARM64 devcontainer builds — skip `-march` on ARM and use explicit
zig aarch64 target

## Summary

Fixes SIGILL (Illegal Instruction) crashes and build failures on ARM64
Mac (M3/Apple Silicon) devcontainers caused by incorrect `-march`
handling introduced in #21611.

## Problem

PR #21611 originally fixed ARM64 devcontainer builds by using explicit
`aarch64-linux-gnu.2.35` zig targets. During the merge, that approach
was replaced with cmake-based auto-detection that sets
`TARGET_ARCH=generic` on ARM and passes `-march=generic` to the
compiler. This caused two distinct failures:

### 1. SIGILL crashes (`Illegal instruction`)

The zig compiler wrappers still used `-target native-linux-gnu.2.35`,
which auto-detects the host CPU. On CI (AWS Graviton with SVE
extensions), this produces binaries containing SVE instructions. These
cached binaries are then downloaded on Apple Silicon devcontainers
(ARM64 without SVE), causing SIGILL when executed — e.g.
`honk_solidity_key_gen` crashing during `barretenberg/sol` bootstrap.

The `-march=generic` flag was supposed to override this, but
`-march=generic` is **not a valid value on aarch64**. It's an x86
concept. LLVM/zig silently ignored it, so the native CPU detection still
produced SVE instructions.

### 2. Build failures (`unknown CPU: 'armv8'`)

Even attempting `-march=armv8-a` (a valid GCC/Clang aarch64 value) fails
because zig uses its own CPU naming scheme (e.g. `generic`,
`cortex_a72`, `apple_m3`), not GCC-style architecture strings. Zig
interprets `-march=armv8-a` as CPU name `armv8`, which doesn't exist →
`error: unknown CPU: 'armv8'`.

**Bottom line:** The `-march` cmake approach fundamentally doesn't work
with zig on ARM. Zig has its own architecture targeting via `-target`,
which is the correct mechanism.

## What this PR changes

### 1. `arch.cmake` — Skip `-march` auto-detection on ARM

Removed the ARM branch from the auto-detection. On x86_64, we still
auto-detect `TARGET_ARCH=skylake`. On ARM, we don't set `TARGET_ARCH` at
all, so no `-march` flag is passed — the zig wrappers handle
architecture targeting instead.

### 2. `zig-cc.sh` / `zig-c++.sh` — Explicit aarch64 target on ARM Linux

Restored the original fix from #21611 that was dropped during merge. On
ARM64 Linux, the wrappers now use `-target aarch64-linux-gnu.2.35`
instead of `-target native-linux-gnu.2.35`. This produces generic ARM64
code without CPU-specific extensions (SVE, etc.), ensuring cached
binaries work on all ARM64 machines — Graviton, Apple Silicon, Ampere,
etc.

x86_64 behavior is unchanged (still uses `-target native`).

## Context: what happened after #21611

After #21611 merged with the cmake auto-detection approach, it triggered
a cascade of follow-up PRs trying to fix the fallout:

| PR | Status | Issue |
|----|--------|-------|
| #21621 | Merged | Introduced the auto-detect approach (replaced zig
wrapper fix with cmake `-march`) |
| #21356 | Merged | Added `NOT CMAKE_CROSSCOMPILING` guard for
cross-compile failures |
| #21637 | Open | Attempting to fix cross-compiles + restore
`native_build_dir` |
| #21660 | Open | Attempting to fix cross-compile targets |
| #21632 | Open | Attempting to fix cross-compile targets |
| #21662 | Open | Adding `CMAKE_SYSTEM_PROCESSOR` to ARM64 cross-compile
presets |
| #21653 | Open | Attempting to skip auto-detection when cross-compiling
|
| #21655 | Open | Attempting to skip auto-detection for
cross-compilation targets |

This PR supersedes the still-open PRs above by addressing the root
cause: `-march` via cmake doesn't work with zig on ARM. The zig
`-target` mechanism is the correct approach.
@AztecBot
Copy link
Collaborator Author

This issue was automatically closed because it was referenced in PR #21685 which has been merged to the default branch.

View workflow run

@AztecBot AztecBot closed this Mar 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

claudebox Owned by claudebox. it can push to this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant