From 83647f4ef14f1ecf40b9fc6099fc77864b87cf41 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 4 Jan 2012 11:04:19 +0000 Subject: [PATCH] * Simplify the implementation of "derivation" a bit: lift out the common attribution so that they're evaluated only once, etc. Note that the default output is now the first element of the "outputs" attribute, rather than the first element of the sorted list of outputs. This seems more user-friendly. --- corepkgs/derivation.nix | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/corepkgs/derivation.nix b/corepkgs/derivation.nix index d5044a83b1..157a1647eb 100644 --- a/corepkgs/derivation.nix +++ b/corepkgs/derivation.nix @@ -1,31 +1,24 @@ -attrs: +/* This is the implementation of the ‘derivation’ builtin function. + It's actually a wrapper around the ‘derivationStrict’ primop. */ + +drvAttrs @ { outputs ? [ "out" ], ... }: let - strict = derivationStrict attrs; + strict = derivationStrict drvAttrs; - attrValues = attrs: - map (name: builtins.getAttr name attrs) (builtins.attrNames attrs); - + commonAttrs = drvAttrs // (builtins.listToAttrs outputsList) // { all = map (x: x.value) outputsList; }; + outputToAttrListElement = outputName: { name = outputName; - value = attrs // { + value = commonAttrs // { outPath = builtins.getAttr outputName strict; drvPath = strict.drvPath; type = "derivation"; currentOutput = outputName; - } // outputsAttrs // { all = allList; }; + }; }; - outputsList = - if attrs ? outputs - then map outputToAttrListElement attrs.outputs - else [ (outputToAttrListElement "out") ]; + outputsList = map outputToAttrListElement outputs; - outputsAttrs = builtins.listToAttrs outputsList; - - allList = attrValues outputsAttrs; - - head = if attrs ? outputs then builtins.head attrs.outputs else "out"; - -in builtins.getAttr head outputsAttrs +in (builtins.head outputsList).value