2021-02-14 12:29:07 +01:00
|
|
|
|
{ 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
|
2022-01-30 17:06:58 +01:00
|
|
|
|
drvOutOutputs = drvOut.outputs or [ "out" ];
|
2021-02-14 12:29:07 +01:00
|
|
|
|
in
|
2022-01-30 17:06:58 +01:00
|
|
|
|
pkgs.runCommandLocal drvOut.name
|
|
|
|
|
{
|
2021-02-14 12:29:07 +01:00
|
|
|
|
# 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
|
2022-01-30 17:06:58 +01:00
|
|
|
|
(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));
|
2021-02-14 12:29:07 +01:00
|
|
|
|
|
2022-01-30 17:06:58 +01:00
|
|
|
|
in
|
|
|
|
|
{
|
2021-02-14 12:29:07 +01:00
|
|
|
|
__functor = _: drvSeqL;
|
|
|
|
|
}
|