about summary refs log tree commit diff
path: root/nix/drvSeqL/default.nix
blob: 6437e1a043a5088d96df23b808417ba938020d13 (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
{ depot, lib, pkgs, ... }:

let

  inherit (depot.nix.yants)
    defun
    list
    drv
    ;

  /* Realize drvDeps, then return drvOut if that succeds.
   * This can be used to make drvOut depend on the
   * build success of all drvDeps without making each drvDep
   * a dependency of drvOut.
   * => drvOut is not rebuilt if drvDep changes
   */
  drvSeqL = defun [ (list drv) drv drv ]
    (drvDeps: drvOut:
      let
        drvOutOutputs = drvOut.outputs or [ "out" ];
      in
      pkgs.runCommandLocal drvOut.name
        {
          # we inherit all attributes in order to replicate
          # the original derivation as much as possible
          outputs = drvOutOutputs;
          passthru = drvOut.drvAttrs;
          # depend on drvDeps (by putting it in builder context)
          inherit drvDeps;
        }
        # the outputs of the original derivation are replicated
        # by creating a symlink to the old output path
        (lib.concatMapStrings
          (output: ''
            target=${lib.escapeShellArg drvOut.${output}}
            # if the target is already a symlink, follow it until it’s not;
            # this is done to prevent too many dereferences
            target=$(readlink -e "$target")
            # link to the output
            ln -s "$target" "${"$"}${output}"
          '')
          drvOutOutputs));

in
{
  __functor = _: drvSeqL;
}