blob: 3339289b3bd148c4e0a95e46365085e154ea8ea0 (
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
|
{ 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;
}
|