diff --git a/nixos/modules/virtualisation/qemu-vm.nix b/nixos/modules/virtualisation/qemu-vm.nix index a17e2c9ca471..3c89ca68113b 100644 --- a/nixos/modules/virtualisation/qemu-vm.nix +++ b/nixos/modules/virtualisation/qemu-vm.nix @@ -92,7 +92,7 @@ let -drive index=0,id=drive1,file=$NIX_DISK_IMAGE,if=${cfg.qemu.diskInterface},cache=writeback,werror=report \ -kernel ${config.system.build.toplevel}/kernel \ -initrd ${config.system.build.toplevel}/initrd \ - -append "$(cat ${config.system.build.toplevel}/kernel-params) init=${config.system.build.toplevel}/init regInfo=${regInfo} ${kernelConsole} $QEMU_KERNEL_PARAMS" \ + -append "$(cat ${config.system.build.toplevel}/kernel-params) init=${config.system.build.toplevel}/init regInfo=${regInfo}/registration ${kernelConsole} $QEMU_KERNEL_PARAMS" \ ''} \ $extraDisks \ ${qemuGraphics} \ @@ -102,15 +102,7 @@ let ''; - regInfo = pkgs.runCommand "reginfo" - { exportReferencesGraph = - map (x: [("closure-" + baseNameOf x) x]) config.virtualisation.pathsInNixDB; - buildInputs = [ pkgs.perl ]; - preferLocalBuild = true; - } - '' - printRegistration=1 perl ${pkgs.pathsFromGraph} closure-* > $out - ''; + regInfo = pkgs.closureInfo { rootPaths = config.virtualisation.pathsInNixDB; }; # Generate a hard disk image containing a /boot partition and GRUB diff --git a/pkgs/build-support/closure-info.nix b/pkgs/build-support/closure-info.nix new file mode 100644 index 000000000000..f1b0930cdcff --- /dev/null +++ b/pkgs/build-support/closure-info.nix @@ -0,0 +1,55 @@ +# This derivation builds two files containing information about the +# closure of 'rootPaths': $out/store-paths contains the paths in the +# closure, and $out/registration contains a file suitable for use with +# "nix-store --load-db" and "nix-store --register-validity +# --hash-given". + +{ stdenv, coreutils, jq, perl, pathsFromGraph }: + +{ rootPaths }: + +if builtins.langVersion >= 5 then + + # Nix >= 1.12: Include NAR hash / size info. + + stdenv.mkDerivation { + name = "closure-info"; + + __structuredAttrs = true; + + exportReferencesGraph.closure = rootPaths; + + PATH = "${coreutils}/bin:${jq}/bin"; + + builder = builtins.toFile "builder" + '' + if [ -e .attrs.sh ]; then . .attrs.sh; fi + + out=''${outputs[out]} + + mkdir $out + + jq -r '.closure | map([.path, .narHash, .narSize, "", (.references | length)] + .references) | add | map("\(.)\n") | add' < .attrs.json | head -n -1 > $out/registration + jq -r .closure[].path < .attrs.json > $out/store-paths + ''; + } + +else + + # Nix < 1.12 + + stdenv.mkDerivation { + name = "closure-info"; + + exportReferencesGraph = + map (x: [("closure-" + baseNameOf x) x]) rootPaths; + + buildInputs = [ perl ]; + + buildCommand = + '' + mkdir $out + printRegistration=1 perl ${pathsFromGraph} closure-* > $out/registration + perl ${pathsFromGraph} closure-* > $out/store-paths + ''; + } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 57d4ee6c3f55..ccc11caee717 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -305,6 +305,8 @@ with pkgs; pathsFromGraph = ../build-support/kernel/paths-from-graph.pl; + closureInfo = callPackage ../build-support/closure-info.nix { }; + setupSystemdUnits = callPackage ../build-support/setup-systemd-units.nix { }; singularity-tools = callPackage ../build-support/singularity-tools { };