aboutsummaryrefslogtreecommitdiff
path: root/pkgs/top-level/splice.nix
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2017-12-10 16:38:48 -0500
committerJohn Ericson <John.Ericson@Obsidian.Systems>2017-12-10 17:01:23 -0500
commit6c36d3c9e0b615c4e76fc3b3582e6f3ec1637af3 (patch)
tree0deb8f4dfc50a406e409118df076685c7652f95c /pkgs/top-level/splice.nix
parent965cc5da574c8ee2310d0cc0a7d75363f422b4c3 (diff)
top-level: Fix splicing, again
Diffstat (limited to 'pkgs/top-level/splice.nix')
-rw-r--r--pkgs/top-level/splice.nix19
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