forked from lix-project/lix
First attempt at the output-as-derivation semantics
For each output, this adds a corresponding attribute to the derivation that is the same as the derivation except for outPath, which is set to the path specific to that output. Additionally, an "all" attribute is added that is a list of all of the output derivations. This has to be done outside of derivationStrict as each output is itself a derivation that contains itself (and all other outputs) as an attribute. The derivation itself is equivalent to the first output in the outputs list (or "out" if that list isn't set).
This commit is contained in:
parent
0b34e57eb8
commit
c172d16b00
|
@ -1052,15 +1052,6 @@ void EvalState::createBaseEnv()
|
||||||
addPrimOp("__getEnv", 1, prim_getEnv);
|
addPrimOp("__getEnv", 1, prim_getEnv);
|
||||||
addPrimOp("__trace", 2, prim_trace);
|
addPrimOp("__trace", 2, prim_trace);
|
||||||
|
|
||||||
// Derivations
|
|
||||||
addPrimOp("derivationStrict", 1, prim_derivationStrict);
|
|
||||||
|
|
||||||
/* Add a wrapper around the derivation primop that computes the
|
|
||||||
`drvPath' and `outPath' attributes lazily. */
|
|
||||||
string s = "attrs: let res = derivationStrict attrs; in attrs // { drvPath = res.drvPath; outPath = res.outPath; type = \"derivation\"; }";
|
|
||||||
mkThunk_(v, parseExprFromString(s, "/"));
|
|
||||||
addConstant("derivation", v);
|
|
||||||
|
|
||||||
// Paths
|
// Paths
|
||||||
addPrimOp("__toPath", 1, prim_toPath);
|
addPrimOp("__toPath", 1, prim_toPath);
|
||||||
addPrimOp("__storePath", 1, prim_storePath);
|
addPrimOp("__storePath", 1, prim_storePath);
|
||||||
|
@ -1109,6 +1100,33 @@ void EvalState::createBaseEnv()
|
||||||
addPrimOp("__parseDrvName", 1, prim_parseDrvName);
|
addPrimOp("__parseDrvName", 1, prim_parseDrvName);
|
||||||
addPrimOp("__compareVersions", 2, prim_compareVersions);
|
addPrimOp("__compareVersions", 2, prim_compareVersions);
|
||||||
|
|
||||||
|
// Derivations
|
||||||
|
addPrimOp("derivationStrict", 1, prim_derivationStrict);
|
||||||
|
|
||||||
|
/* Add a wrapper around the derivation primop that computes the
|
||||||
|
`drvPath' and `outPath' attributes lazily. */
|
||||||
|
string s = "attrs: \
|
||||||
|
let \
|
||||||
|
strict = derivationStrict attrs; \
|
||||||
|
attrValues = attrs: \
|
||||||
|
map (name: builtins.getAttr name attrs) (builtins.attrNames attrs); \
|
||||||
|
outputToAttrListElement = output: \
|
||||||
|
let outPath = builtins.getAttr (output + \"Path\") strict; in { \
|
||||||
|
name = output; \
|
||||||
|
value = attrs // { \
|
||||||
|
drvPath = strict.drvPath; inherit outPath; type = \"derivation\"; \
|
||||||
|
} // outputsAttrs // { all = allList; }; \
|
||||||
|
}; \
|
||||||
|
outputsList = if attrs ? outputs then \
|
||||||
|
map outputToAttrListElement attrs.outputs else \
|
||||||
|
[ (outputToAttrListElement \"out\") ]; \
|
||||||
|
outputsAttrs = builtins.listToAttrs outputsList; \
|
||||||
|
allList = attrValues outputsAttrs; \
|
||||||
|
head = if attrs ? outputs then builtins.head attrs.outputs else \"out\"; \
|
||||||
|
in builtins.getAttr head outputsAttrs";
|
||||||
|
mkThunk_(v, parseExprFromString(s, "/"));
|
||||||
|
addConstant("derivation", v);
|
||||||
|
|
||||||
/* Now that we've added all primops, sort the `builtins' attribute
|
/* Now that we've added all primops, sort the `builtins' attribute
|
||||||
set, because attribute lookups expect it to be sorted. */
|
set, because attribute lookups expect it to be sorted. */
|
||||||
baseEnv.values[0]->attrs->sort();
|
baseEnv.values[0]->attrs->sort();
|
||||||
|
|
Loading…
Reference in a new issue