about summary refs log tree commit diff
path: root/pkgs/build-support/closure-info.nix
blob: 4d178ac96c5d9bff4bc7a52240829ad185ff8cff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 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
# FIXME: it doesn't work on Hydra, failing to find mkdir;
#   perhaps .attrs.sh clobbers PATH with new nix?
if false 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
      '';
  }