* 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:
Eelco Dolstra 2006-09-01 12:07:31 +00:00
parent de90fdf908
commit 7974aae81c
2 changed files with 36 additions and 6 deletions

View file

@ -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);

View file

@ -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@";
};
}