Building x86-64 Packages With Nix on Apple Silicon

Recent revisions of Nixpkgs provide good support for Apple silicon (aarch64-darwin), however not 100% of packages work natively as of writing.

These simple instructions will guide you through installing Rosetta 2 and configuring Nix to enable building and running of non-native x86_64-darwin packages.

1. Install Rosetta 2

$ sudo softwareupdate --install-rosetta --agree-to-license

With Rosetta 2 installed, your machine is now capable of running programs built for x86_64-darwin.

2. Configure Nix's extra-platforms option

Nix doesn't know about Rosetta 2, so we need to tell it we're capable of building for x86_64-darwin.

$ sudo --edit /etc/nix/nix.conf
# /etc/nix/nix.conf

build-users-group = nixbld
extra-platforms = x86_64-darwin aarch64-darwin

3. Override Nixpkgs' default system

By default, system defaults to builtins.currentSystem, which is aarch64-darwin on machines with Apple silicon. We can override this in order to get packages for x86_64-darwin.

# hello.nix

let
  pkgs = import <nixpkgs> { system = "x86_64-darwin"; };

in
pkgs.hello

4. Build and run x86_64-darwin packages

$ nix build --file hello.nix

$ file ./result/bin/hello
./result/bin/hello: Mach-O 64-bit executable x86_64

$ ./result/bin/hello
Hello, world!