aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2008-12-04 10:40:41 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2008-12-04 10:40:41 +0000
commitf8713e1287e2641c3d2550f7af1a445c77b8552a (patch)
tree3d36c2f46758dfc6d90e9174d4c0ac82c1f3e429
parent82ae85de2759eaa68bb2411a1f0a640cf9f8e76a (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.
-rw-r--r--scripts/nix-push.in3
-rw-r--r--src/libexpr/primops.cc31
2 files changed, 24 insertions, 10 deletions
diff --git a/scripts/nix-push.in b/scripts/nix-push.in
index c7a0dc668..ba611465c 100644
--- a/scripts/nix-push.in
+++ b/scripts/nix-push.in
@@ -128,7 +128,7 @@ while (<READ>) {
close READ or die "nix-instantiate failed: $?";
-# Realise the store expressions.
+# Build the derivations.
print STDERR "creating archives...\n";
my @narPaths;
@@ -144,7 +144,6 @@ while (scalar @tmp > 0) {
# reference (see above). Even if that is fixed, using a hook
# probably wouldn't make that much sense; pumping lots of data
# around just to compress them won't gain that much.
- $ENV{"NIX_BUILD_HOOK"} = "";
my $pid = open(READ, "$binDir/nix-store --no-build-hook --realise @tmp2|")
or die "cannot run nix-store";
while (<READ>) {
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 7d179da8e..989a68682 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);
}