about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2012-01-04T11·04+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2012-01-04T11·04+0000
commit83647f4ef14f1ecf40b9fc6099fc77864b87cf41 (patch)
tree982debf65dc2ca89b9cc1f454cb584c5e4fb88e8
parent71f3c46cf65c0638946c9bb57c36a2b5f177a672 (diff)
* 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.

-rw-r--r--corepkgs/derivation.nix29
1 files changed, 11 insertions, 18 deletions
diff --git a/corepkgs/derivation.nix b/corepkgs/derivation.nix
index d5044a83b1c2..157a1647ebd9 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