* New primop: builtins.toFile, which writes a string into the store
and returns its path.  This can be used to (for instance) write
  builders inside a Nix expression, e.g.,
  stdenv.mkDerivation {
    builder = "
      source $stdenv/setup
      ...
    ";
    ...
  }
			
			
This commit is contained in:
		
							parent
							
								
									de90fdf908
								
							
						
					
					
						commit
						7974aae81c
					
				
					 2 changed files with 36 additions and 6 deletions
				
			
		|  | @ -467,6 +467,9 @@ static Expr primToString(EvalState & state, const ATermVector & args) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | /* Convert the argument (which can be any Nix expression) to an XML
 | ||||||
|  |    representation returned in a string.  Not all Nix expressions can | ||||||
|  |    be sensibly or completely represented (e.g., functions). */ | ||||||
| static Expr primToXML(EvalState & state, const ATermVector & args) | static Expr primToXML(EvalState & state, const ATermVector & args) | ||||||
| { | { | ||||||
|     ostringstream out; |     ostringstream out; | ||||||
|  | @ -475,6 +478,16 @@ static Expr primToXML(EvalState & state, const ATermVector & args) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | /* Store a string in the Nix store as a source file that can be used
 | ||||||
|  |    as an input by derivations. */ | ||||||
|  | static Expr primToFile(EvalState & state, const ATermVector & args) | ||||||
|  | { | ||||||
|  |     string s = evalString(state, args[0]); | ||||||
|  |     Path storePath = addTextToStore("", s, PathSet()); | ||||||
|  |     return makePath(toATerm(storePath)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| /* Boolean constructors. */ | /* Boolean constructors. */ | ||||||
| static Expr primTrue(EvalState & state, const ATermVector & args) | static Expr primTrue(EvalState & state, const ATermVector & args) | ||||||
| { | { | ||||||
|  | @ -724,6 +737,7 @@ void EvalState::addPrimOps() | ||||||
|     addPrimOp("dirOf", 1, primDirOf); |     addPrimOp("dirOf", 1, primDirOf); | ||||||
|     addPrimOp("toString", 1, primToString); |     addPrimOp("toString", 1, primToString); | ||||||
|     addPrimOp("__toXML", 1, primToXML); |     addPrimOp("__toXML", 1, primToXML); | ||||||
|  |     addPrimOp("__toFile", 1, primToFile); | ||||||
|     addPrimOp("isNull", 1, primIsNull); |     addPrimOp("isNull", 1, primIsNull); | ||||||
|     addPrimOp("dependencyClosure", 1, primDependencyClosure); |     addPrimOp("dependencyClosure", 1, primDependencyClosure); | ||||||
|     addPrimOp("abort", 1, primAbort); |     addPrimOp("abort", 1, primAbort); | ||||||
|  |  | ||||||
|  | @ -1,7 +1,23 @@ | ||||||
| derivation { | let { | ||||||
|   name = "gc-runtime"; | 
 | ||||||
|   system = "@system@"; |   # Test inline source file definitions. | ||||||
|   builder = "@shell@"; |   builder = builtins.toFile " | ||||||
|   args = ["-e" "-x" ./gc-runtime.builder.sh]; | mkdir $out | ||||||
|   PATH = "@testPath@"; | 
 | ||||||
|  | cat > $out/program <<EOF | ||||||
|  | #! $SHELL | ||||||
|  | sleep 10000 | ||||||
|  | EOF | ||||||
|  | 
 | ||||||
|  | chmod +x $out/program | ||||||
|  | "; | ||||||
|  | 
 | ||||||
|  |   body = derivation { | ||||||
|  |     name = "gc-runtime"; | ||||||
|  |     system = "@system@"; | ||||||
|  |     builder = "@shell@"; | ||||||
|  |     args = ["-e" "-x" builder]; | ||||||
|  |     PATH = "@testPath@"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue