about summary refs log tree commit diff
path: root/pkgs/build-support/closure-info.nix
blob: f2aa4964d9a1dee9be515c977b3b7f4faebec7d8 (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
# 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 }:

{ rootPaths }:

assert builtins.langVersion >= 5;

stdenv.mkDerivation {
  name = "closure-info";

  __structuredAttrs = true;

  exportReferencesGraph.closure = rootPaths;

  preferLocalBuild = true;

  nativeBuildInputs = [ coreutils jq ];

  empty = rootPaths == [];

  buildCommand =
    ''
      out=''${outputs[out]}

      mkdir $out

      if [[ -n "$empty" ]]; then
        echo 0 > $out/total-nar-size
        touch $out/registration $out/store-paths
      else
        jq -r ".closure | map(.narSize) | add" < "$NIX_ATTRS_JSON_FILE" > $out/total-nar-size
        jq -r '.closure | map([.path, .narHash, .narSize, "", (.references | length)] + .references) | add | map("\(.)\n") | add' < "$NIX_ATTRS_JSON_FILE" | head -n -1 > $out/registration
        jq -r '.closure[].path' < "$NIX_ATTRS_JSON_FILE" > $out/store-paths
      fi

    '';
}