From f8713e1287e2641c3d2550f7af1a445c77b8552a Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 4 Dec 2008 10:40:41 +0000 Subject: [PATCH] * 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. --- scripts/nix-push.in | 3 +-- src/libexpr/primops.cc | 31 +++++++++++++++++++++++-------- 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 () { 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 () { 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("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("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); }