Skip to content

chore: fixing build on mac#21685

Merged
ludamad merged 1 commit intomerge-train/spartanfrom
mr/fix-build-on-mac-2
Mar 17, 2026
Merged

chore: fixing build on mac#21685
ludamad merged 1 commit intomerge-train/spartanfrom
mr/fix-build-on-mac-2

Conversation

@mrzeszutko
Copy link
Contributor

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.

@ludamad ludamad enabled auto-merge (squash) March 17, 2026 16:18
@ludamad ludamad merged commit 09a1e9b into merge-train/spartan Mar 17, 2026
11 checks passed
@ludamad ludamad deleted the mr/fix-build-on-mac-2 branch March 17, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants