* 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) | ||||
| { | ||||
|     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. */ | ||||
| static Expr primTrue(EvalState & state, const ATermVector & args) | ||||
| { | ||||
|  | @ -724,6 +737,7 @@ void EvalState::addPrimOps() | |||
|     addPrimOp("dirOf", 1, primDirOf); | ||||
|     addPrimOp("toString", 1, primToString); | ||||
|     addPrimOp("__toXML", 1, primToXML); | ||||
|     addPrimOp("__toFile", 1, primToFile); | ||||
|     addPrimOp("isNull", 1, primIsNull); | ||||
|     addPrimOp("dependencyClosure", 1, primDependencyClosure); | ||||
|     addPrimOp("abort", 1, primAbort); | ||||
|  |  | |||
|  | @ -1,7 +1,23 @@ | |||
| derivation { | ||||
|   name = "gc-runtime"; | ||||
|   system = "@system@"; | ||||
|   builder = "@shell@"; | ||||
|   args = ["-e" "-x" ./gc-runtime.builder.sh]; | ||||
|   PATH = "@testPath@"; | ||||
| let { | ||||
| 
 | ||||
|   # Test inline source file definitions. | ||||
|   builder = builtins.toFile " | ||||
| mkdir $out | ||||
| 
 | ||||
| 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