diff options
author | John Ericson <John.Ericson@Obsidian.Systems> | 2017-12-10 16:38:48 -0500 |
---|---|---|
committer | John Ericson <John.Ericson@Obsidian.Systems> | 2017-12-10 17:01:23 -0500 |
commit | 6c36d3c9e0b615c4e76fc3b3582e6f3ec1637af3 (patch) | |
tree | 0deb8f4dfc50a406e409118df076685c7652f95c /pkgs/top-level/splice.nix | |
parent | 965cc5da574c8ee2310d0cc0a7d75363f422b4c3 (diff) |
top-level: Fix splicing, again
Diffstat (limited to 'pkgs/top-level/splice.nix')
-rw-r--r-- | pkgs/top-level/splice.nix | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix index d2c339b04df8..ea81b110080d 100644 --- a/pkgs/top-level/splice.nix +++ b/pkgs/top-level/splice.nix @@ -37,26 +37,25 @@ let inherit name; value = let defaultValue = mash.${name}; - buildValue = buildPkgs.${name}; - runValue = runPkgs.${name}; + # `or {}` is for the non-derivation attsert splicing case, where `{}` is the identity. + buildValue = buildPkgs.${name} or {}; + runValue = runPkgs.${name} or {}; augmentedValue = defaultValue // (lib.optionalAttrs (buildPkgs ? ${name}) { nativeDrv = buildValue; }) // (lib.optionalAttrs (runPkgs ? ${name}) { crossDrv = runValue; }); - # Get the set of outputs of a derivation + # Get the set of outputs of a derivation. If one derivation fails to + # evaluate we don't want to diverge the entire splice, so we fall back + # on {} tryGetOutputs = value0: let - eval = builtins.tryEval value0; - in getOutputs (if eval.success then eval.value else {}); + inherit (builtins.tryEval value0) success value; + in getOutputs (lib.optionalAttrs success value); getOutputs = value: lib.genAttrs (value.outputs or (lib.optional (value ? out) "out")) (output: value.${output}); in - # Certain *Cross derivations will fail assertions, but we need their - # nativeDrv. We are assuming anything that fails to evaluate is an - # attrset (including derivation) and thus can be unioned. - if !(builtins.tryEval defaultValue).success then augmentedValue # The derivation along with its outputs, which we recur # on to splice them together. - else if lib.isDerivation defaultValue then augmentedValue + if lib.isDerivation defaultValue then augmentedValue // splicer (tryGetOutputs buildValue) (getOutputs runValue) # Just recur on plain attrsets else if lib.isAttrs defaultValue then splicer buildValue runValue |