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
{ depot, lib, pkgs, ... }:

let

  /* 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 :: [derivation] -> derivation -> derivation
   */
  drvSeqL = 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;
}