diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2008-12-04T10·40+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2008-12-04T10·40+0000 |
commit | f8713e1287e2641c3d2550f7af1a445c77b8552a (patch) | |
tree | 3d36c2f46758dfc6d90e9174d4c0ac82c1f3e429 /src/libexpr/primops.cc | |
parent | 82ae85de2759eaa68bb2411a1f0a640cf9f8e76a (diff) |
* Dirty hack to make nix-push work properly on derivations: the
derivation should be a source rather than a derivation dependency of the call to the NAR derivation. Otherwise the derivation (and all its dependencies) will be built as a side-effect, which may not even succeed.
Diffstat (limited to 'src/libexpr/primops.cc')
-rw-r--r-- | src/libexpr/primops.cc | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 7d179da8ec12..989a68682204 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -366,12 +366,18 @@ static Expr prim_derivationStrict(EvalState & state, const ATermVector & args) attributes should be added as dependencies of the resulting derivation. */ for (PathSet::iterator i = context.begin(); i != context.end(); ++i) { - debug(format("derivation uses `%1%'") % *i); - assert(isStorePath(*i)); - if (isDerivation(*i)) - drv.inputDrvs[*i] = singleton<StringSet>("out"); + Path path = *i; + bool buildDrv = true; + if (path.at(0) == '=') { + buildDrv = false; + path = string(path, 1); + } + debug(format("derivation uses `%1%'") % path); + assert(isStorePath(path)); + if (buildDrv && isDerivation(path)) + drv.inputDrvs[path] = singleton<StringSet>("out"); else - drv.inputSrcs.insert(*i); + drv.inputSrcs.insert(path); } /* Do we have all required attributes? */ @@ -498,9 +504,17 @@ static Expr prim_storePath(EvalState & state, const ATermVector & args) Path path = canonPath(coerceToPath(state, args[0], context)); if (!isInStore(path)) throw EvalError(format("path `%1%' is not in the Nix store") % path); - if (!store->isValidPath(path)) - throw EvalError(format("store path `%1%' is not valid") % path); - context.insert(toStorePath(path)); + Path path2 = toStorePath(path); + if (!store->isValidPath(path2)) + throw EvalError(format("store path `%1%' is not valid") % path2); + /* If this is a derivation, mark it so it doesn't get built; + i.e. we want the dependency as a "source" dependency. This is + to make nix-push work properly (we want it to create a NAR + archive of the derivation, not build the derivation as a + side-effect). The `=' is a special marker that gets stripped + off by prim_derivationStrict. */ + if (isDerivation(path2)) path2 = "=" + path2; + context.insert(path2); return makeStr(path, context); } @@ -578,6 +592,7 @@ static Expr prim_toFile(EvalState & state, const ATermVector & args) for (PathSet::iterator i = context.begin(); i != context.end(); ++i) { if (isDerivation(*i)) throw EvalError(format("in `toFile': the file `%1%' cannot refer to derivation outputs") % name); + /* !!! */ refs.insert(*i); } |