name: macos description: Read this BEFORE trying to fix a GenVM build that fails on macOS. GenVM is NOT built natively on macOS — building from source on Darwin breaks the deterministic runner-artifact invariant. Use a remote Linux nix-builder instead. Triggers on any build/nix/runner/linker/ar failure on a Mac (Apple Silicon or Intel).
Building GenVM on macOS
STOP — do not "fix" the build to run natively on macOS
If you are on macOS and a build (nix build, ninja, runner packaging, linking,
ar, FFI deps, …) fails, do not try to make GenVM compile natively on Darwin.
This has been attempted and rejected before. Native macOS builds break the
project's core invariant.
Why native macOS builds are forbidden
Runner artifacts are content-addressed .tar files. The file name encodes the
content hash (a Nix nix32 SHA-256), so two nodes that build the "same" runner
must produce byte-identical tars with identical names. This is what prevents
determinism violations across the network: one node running a correct artifact
and another running a differently-built artifact will disagree.
A native macOS build:
- produced different and/or missing runner tars vs. the Linux reference build
(e.g. only one
cpythontar instead of two, mismatched hashes), and - silently changed the on-disk set of runners.
You can verify the reference set on Linux with:
find $(nix build .#runners-all --no-link --print-out-paths) -name '*.tar' \
| sort | xargs sha256sum | sed -e 's+/nix/store/[^/]*++'
Any macOS output that does not reproduce these exact hashes is wrong.
Specific anti-fixes — never do these
These are the tempting "fixes" that actually break determinism. Do not apply them:
- Removing
outputHashfrom fixed-output derivations (e.g.runners/cpython/deps/ffi/default.nix). The repo literally warns: "the moment you delete this you should question yourself."outputHashis what pins the artifact; deleting it destroys reproducibility. - Adding a platform-native linker path for Darwin.
- Patching
arto work on macOS. - Any change that lets runners build on
aarch64-darwin/x86_64-darwininstead of Linux. - Editing
runners/support/versions/current.nixhashes to make a macOS build pass. A change whose only purpose is "make it build on macOS" must not touch those hashes — they pin the Linux reference artifacts. If a macOS build forces you to change a hash there, the build is producing the wrong bytes; fix the builder (use the Linux remote builder), not the hash. - Removing / pruning old runner generations (existing
.tarentries or prior hash versions). A macOS-build-only change must leave the existing set of runner generations intact — silently dropping old ones is exactly the determinism-breaking regression that gets such changes rejected.
Per the maintainer: runners can only be built on Linux (x86_64). On macOS you download prebuilt runners or build them on a remote Linux builder — you do not build them locally.
The supported path: a remote Linux nix-builder
Build Linux derivations on Linux, from your Mac, over SSH. The repo ships a ready-made containerized Linux remote builder:
support/macos/nix-builder/— see itsREADME.mdfor the full, current procedure. Read that file; do not improvise.
In short (read the README for exact, up-to-date steps):
- Install Rosetta (
softwareupdate --install-rosetta --agree-to-license) and Docker Desktop with "Use Rosetta for x86_64/amd64 emulation" enabled. docker build -t nix-builder support/macos/nix-builder(add--platform linux/arm64if needed), drop yourid_ed25519.pubinto the volume, anddocker runit (privileged, port2222).- Register it in
/etc/nix/machinesand setbuilders-use-substitutes = truein/etc/nix/nix.conf. Add the host key toknown_hostsfor root too. - Sanity-check with
NIX_REMOTE="ssh-ng://root@localhost:2222" nix build --system x86_64-linux nixpkgs#hello.
Notes that bite people (all in the README): use Nix 2.34.7+ (older 2.2x
mishandles ssh-ng://host:port), and the root user — not just your user — must
trust the builder's host key.
If you just need to develop / run, not rebuild runners
You usually do not need to build runners at all. Download them instead (works on any platform):
nix develop .#full --command python3 build/out/bin/post-install.py \
--create-venv false --default-step false \
--runners-download true --error-on-missing-executor false
See the build skill for the normal Rust build flow.