Hello, nixos noob here.
I’ve been googling a lot on how to compile Haskell programs to aarch64
. Given issues with TemplateHaskell, I started looking for beefy aarch64
systems that could compile my code for me.
But then I looked at emulation, namely, with qemu
and realised that I can just emulate an aarch64
system and build on it.
I also learnt that such emulation is baked into nix; namely with flakes. I saw GitHub - considerate/nixos-odroidhc4: NixOS configuration for the ODROID HC4 microcomputer.
Are there any pointers/docs on how to use flakes to target aarch64
while being on any arch?
Thanks.
Nothing to do with flakes, actually. On any NixOS machine, you can set up support for running aarch64 builds with boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
and a reboot. After that you can build things with --system aarch64-linux
or just select the aarch64 outputs of flakes explicitly. Either way, it’ll automatically use qemu for the build.
This is not an accurate explanation. 1) It has nothing to do with flakes. 2) The only part that’s baked into Nix is the ability to set the extra-platforms
setting so that it will attempt to do builds for different platforms.
The way it actually works is quite simple though. On NixOS, you just set boot.binfmt.emulatedSystems = ["aarch64-linux"];
. This setting enables your machine to transparently run binaries built for aarch64. It does this with binfmt
(see: man binformat.d
), so that when an aarch64 binary is executed, the associated emulator is automatically launched to run it. boot.binfmt.emulatedSystems
also configures the extra-platforms
Nix setting so that Nix will attempt to build as an aarch64-system despite not natively supporting it, and then the binfmt
magically makes it work.
TL;DR: All you have to do is add boot.binfmt.emulatedSystems = ["aarch64-linux"];
to your NixOS config; no need for flakes.
Thanks for replying. Nix is just great.
I’m just not sure what the role of binformat is here, but I guess that needs more reading.
Thanks. That makes it quite clear to me. I’ll read up more to understand the role of binformat. The manpage entry isn’t found, but I can read the docs online.
Thanks again for clarifying.