From 747c55e702e8a8184d1de7fc602c035515da610b Mon Sep 17 00:00:00 2001 From: Winter Date: Thu, 15 May 2025 22:41:35 -0400 Subject: [PATCH] nixos/profiles/nix-builder-vm: allow the system derivation to be substituted Consider a user wanting to set up the Linux builder for the first time, but with a slightly more generous allocation of resources compared to the default. They'll do something like this: ``` { virtualisation.cores = 3; virtualisation.darwin-builder = { diskSize = 40 * 1024; memorySize = 4 * 1024; }; } ``` This will fail with an error like this: ``` error: a 'aarch64-linux' with features {} is required to build '/nix/store/3acpgmwqwnk8g2gc5r05ar2lvmn01b8a-builder.pl.drv', but I am a 'aarch64-darwin' with features {apple-virt, benchmark, big-parallel, nixos-test} ``` But why would they have to rebuild the NixOS system?! All they did was change the arguments passed to QEMU, and nothing those options control would affect the NixOS configuration itself... right? `config.system.build.toplevel` is defined with `allowSubstitutes` set to `false` by default, which makes it so that the toplevel can't be substituted if Nix is trying to use it "directly." So because the above example would have to rebuild the VM runner, which references toplevel directly, Nix refuses to substitute it, unless `always-allow-substitutes = true` is set as a Nix option. (In the case where the QEMU options aren't changed at all, Nix just substitutes the runner, which sidesteps this issue as the runner itself doesn't use toplevel as an input.) --- nixos/modules/profiles/nix-builder-vm.nix | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/nixos/modules/profiles/nix-builder-vm.nix b/nixos/modules/profiles/nix-builder-vm.nix index 2279d5f8d2f6..50dde02eef64 100644 --- a/nixos/modules/profiles/nix-builder-vm.nix +++ b/nixos/modules/profiles/nix-builder-vm.nix @@ -126,6 +126,20 @@ in # TODO system.switch.enable = false;? system.disableInstallerTools = true; + # Allow the system derivation to be substituted, so that + # users are less likely to run into a state where they need + # the builder running to build the builder if they just want + # to make a tweak that only affects the macOS side of things, + # like changing the QEMU args. + # + # TODO(winter): Move to qemu-vm? Trying it here for now as a + # low impact change that'll probably improve people's experience. + # + # (I have no clue what is going on in https://github.com/nix-darwin/nix-darwin/issues/1081 + # though, as this fix would only apply to one person in that thread... hopefully someone + # comes across with a reproducer if this doesn't do it.) + system.systemBuilderArgs.allowSubstitutes = true; + nix.settings = { min-free = cfg.min-free;