summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-10-25 15:35:45 +0200
committerEelco Dolstra <edolstra@gmail.com>2017-10-25 15:38:14 +0200
commit8f349a3bf3cc9a2a4733a25d66cd06309bb4d586 (patch)
tree7d2772af5f333ecc0c5f826f0ea3700394ac8737
parent5939af52b32c01edca7ad4c363b627970db3e04e (diff)
downloadnixlib-8f349a3bf3cc9a2a4733a25d66cd06309bb4d586.tar
nixlib-8f349a3bf3cc9a2a4733a25d66cd06309bb4d586.tar.gz
nixlib-8f349a3bf3cc9a2a4733a25d66cd06309bb4d586.tar.bz2
nixlib-8f349a3bf3cc9a2a4733a25d66cd06309bb4d586.tar.lz
nixlib-8f349a3bf3cc9a2a4733a25d66cd06309bb4d586.tar.xz
nixlib-8f349a3bf3cc9a2a4733a25d66cd06309bb4d586.tar.zst
nixlib-8f349a3bf3cc9a2a4733a25d66cd06309bb4d586.zip
Add function closureInfo to replace pathsFromGraph
Unlike pathsFromGraph, on Nix 1.12, this function produces a
registration file containing correct NAR hash/size information.

https://hydra.nixos.org/build/62832723
-rw-r--r--nixos/modules/virtualisation/qemu-vm.nix12
-rw-r--r--pkgs/build-support/closure-info.nix55
-rw-r--r--pkgs/top-level/all-packages.nix2
3 files changed, 59 insertions, 10 deletions
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 { };