mirror of
https://github.com/NixOS/nix
synced 2025-06-27 08:31:16 +02:00
* `nix-instantiate ... --arg NAME VALUE': allow arguments to be passed
to functions from the command line. * nix-build: started removing backticks.
This commit is contained in:
parent
c11839d7b2
commit
4661282fde
8 changed files with 58 additions and 32 deletions
|
@ -33,7 +33,7 @@ Expr findAlongAttrPath(EvalState & state, const string & attrPath, Expr e)
|
|||
if (string2Int(attr, attrIndex)) apType = apIndex;
|
||||
|
||||
/* Evaluate the expression. */
|
||||
e = evalExpr(state, autoCallFunction(evalExpr(state, e)));
|
||||
e = evalExpr(state, autoCallFunction(evalExpr(state, e), ATermMap(1)));
|
||||
|
||||
/* It should evaluate to either an attribute set or an
|
||||
expression, according to what is specified in the
|
||||
|
|
|
@ -287,20 +287,27 @@ static ATerm concatStrings(EvalState & state, const ATermVector & args)
|
|||
}
|
||||
|
||||
|
||||
Expr autoCallFunction(Expr e)
|
||||
Expr autoCallFunction(Expr e, const ATermMap & args)
|
||||
{
|
||||
ATermList formals;
|
||||
ATerm body, pos;
|
||||
|
||||
if (matchFunction(e, formals, body, pos)) {
|
||||
ATermMap actualArgs(128);
|
||||
|
||||
for (ATermIterator i(formals); i; ++i) {
|
||||
Expr name, def; ATerm values, def2;
|
||||
Expr name, def, value; ATerm values, def2;
|
||||
if (!matchFormal(*i, name, values, def2)) abort();
|
||||
if (!matchDefaultValue(def2, def))
|
||||
if ((value = args.get(name)))
|
||||
actualArgs.set(name, makeAttrRHS(value, makeNoPos()));
|
||||
else if (!matchDefaultValue(def2, def))
|
||||
throw TypeError(format("cannot auto-call a function that has an argument without a default value (`%1%')")
|
||||
% aterm2String(name));
|
||||
}
|
||||
e = makeCall(e, makeAttrs(ATermMap(0)));
|
||||
|
||||
e = makeCall(e, makeAttrs(actualArgs));
|
||||
}
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
|
|
|
@ -60,9 +60,9 @@ string coerceToStringWithContext(EvalState & state,
|
|||
Expr wrapInContext(ATermList context, Expr e);
|
||||
|
||||
/* Automatically call a function for which each argument has a default
|
||||
value. Note: result is a call, not a normal form; it should be
|
||||
evaluated by calling evalExpr(). */
|
||||
Expr autoCallFunction(Expr e);
|
||||
value or has a binding in the `args' map. Note: result is a call,
|
||||
not a normal form; it should be evaluated by calling evalExpr(). */
|
||||
Expr autoCallFunction(Expr e, const ATermMap & args);
|
||||
|
||||
/* Print statistics. */
|
||||
void printEvalStats(EvalState & state);
|
||||
|
|
|
@ -121,9 +121,10 @@ static string addToPath(const string & s1, const string & s2)
|
|||
|
||||
|
||||
static void getDerivations(EvalState & state, Expr e,
|
||||
const string & pathPrefix, DrvInfos & drvs, Exprs & doneExprs)
|
||||
const string & pathPrefix, const ATermMap & autoArgs,
|
||||
DrvInfos & drvs, Exprs & doneExprs)
|
||||
{
|
||||
e = evalExpr(state, autoCallFunction(evalExpr(state, e)));
|
||||
e = evalExpr(state, autoCallFunction(evalExpr(state, e), autoArgs));
|
||||
|
||||
/* Process the expression. */
|
||||
ATermList es;
|
||||
|
@ -152,7 +153,7 @@ static void getDerivations(EvalState & state, Expr e,
|
|||
queryAllAttrs(e, attrs, false);
|
||||
Expr e2 = attrs.get(toATerm("recurseForDerivations"));
|
||||
if (e2 && evalBool(state, e2))
|
||||
getDerivations(state, e, pathPrefix2, drvs, doneExprs);
|
||||
getDerivations(state, e, pathPrefix2, autoArgs, drvs, doneExprs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -167,7 +168,7 @@ static void getDerivations(EvalState & state, Expr e,
|
|||
format("evaluating list element"));
|
||||
string pathPrefix2 = addToPath(pathPrefix, (format("%1%") % n).str());
|
||||
if (getDerivation(state, *i, pathPrefix2, drvs, doneExprs))
|
||||
getDerivations(state, *i, pathPrefix2, drvs, doneExprs);
|
||||
getDerivations(state, *i, pathPrefix2, autoArgs, drvs, doneExprs);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -177,8 +178,8 @@ static void getDerivations(EvalState & state, Expr e,
|
|||
|
||||
|
||||
void getDerivations(EvalState & state, Expr e, const string & pathPrefix,
|
||||
DrvInfos & drvs)
|
||||
const ATermMap & autoArgs, DrvInfos & drvs)
|
||||
{
|
||||
Exprs doneExprs;
|
||||
getDerivations(state, e, pathPrefix, drvs, doneExprs);
|
||||
getDerivations(state, e, pathPrefix, autoArgs, drvs, doneExprs);
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ typedef list<DrvInfo> DrvInfos;
|
|||
bool getDerivation(EvalState & state, Expr e, DrvInfo & drv);
|
||||
|
||||
void getDerivations(EvalState & state, Expr e, const string & pathPrefix,
|
||||
DrvInfos & drvs);
|
||||
const ATermMap & autoArgs, DrvInfos & drvs);
|
||||
|
||||
|
||||
#endif /* !__GET_DRVS_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue