* `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