about summary refs log tree commit diff
path: root/src/libexpr/primops.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2008-12-04T10·40+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2008-12-04T10·40+0000
commitf8713e1287e2641c3d2550f7af1a445c77b8552a (patch)
tree3d36c2f46758dfc6d90e9174d4c0ac82c1f3e429 /src/libexpr/primops.cc
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.

Diffstat (limited to 'src/libexpr/primops.cc')
-rw-r--r--src/libexpr/primops.cc31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 7d179da8ec..989a686822 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);
     }