44 lines
1.3 KiB
Nix
44 lines
1.3 KiB
Nix
|
{ 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;
|
|||
|
}
|