aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.hh1
-rw-r--r--src/libexpr/get-drvs.cc16
2 files changed, 16 insertions, 1 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index cbdcb274e..8070f4884 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -55,6 +55,7 @@ Expr evalFile(EvalState & state, const Path & path);
/* Specific results. */
string evalString(EvalState & state, Expr e);
Path evalPath(EvalState & state, Expr e);
+bool evalBool(EvalState & state, Expr e);
ATermList evalList(EvalState & state, Expr e);
ATerm coerceToString(Expr e);
diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc
index ff38ff794..78edbd392 100644
--- a/src/libexpr/get-drvs.cc
+++ b/src/libexpr/get-drvs.cc
@@ -171,7 +171,21 @@ static void getDerivations(EvalState & state, Expr e,
for (ATermIterator i(drvMap.keys()); i; ++i) {
startNest(nest, lvlDebug,
format("evaluating attribute `%1%'") % aterm2String(*i));
- getDerivation(state, drvMap.get(*i), drvs, doneExprs);
+ if (getDerivation(state, drvMap.get(*i), drvs, doneExprs)) {
+ /* If the value of this attribute is itself an
+ attribute self, should we recurse into it?
+ => Only if it has a `recurseForDerivations = true'
+ attribute. */
+ ATermList es;
+ Expr e = evalExpr(state, drvMap.get(*i));
+ if (matchAttrs(e, es)) {
+ ATermMap attrs;
+ queryAllAttrs(e, attrs, false);
+ if (attrs.get("recurseForDerivations") &&
+ evalBool(state, attrs.get("recurseForDerivations")))
+ getDerivations(state, e, drvs, doneExprs, attrPathRest);
+ }
+ }
}
} else {
Expr e2 = drvMap.get(attr);