about summary refs log tree commit diff
path: root/src/libstore/build.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-06-13T15·29+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-06-13T15·29+0200
commit1b6ee8f4c7e74f75e1f49b43cf22be7730b30649 (patch)
treef5cad59175b0614105b72c29ae95148c31c15651 /src/libstore/build.cc
parentcd49ee08970f0fa44053fb12cdf29668e8131a51 (diff)
Allow hard links between the outputs of a derivation
Diffstat (limited to 'src/libstore/build.cc')
-rw-r--r--src/libstore/build.cc9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index e49c66fc57..20ed2de390 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -844,6 +844,11 @@ private:
     bool repair;
     map<Path, Path> redirectedBadOutputs;
 
+    /* Set of inodes seen during calls to canonicalisePathMetaData()
+       for this build's outputs.  This needs to be shared between
+       outputs to allow hard links between outputs. */
+    InodesSeen inodesSeen;
+
     /* Magic exit code denoting that setting up the child environment
        failed.  (It's possible that the child actually returns the
        exit code, but ah well.) */
@@ -1493,7 +1498,7 @@ void DerivationGoal::buildDone()
                 /* Canonicalise first.  This ensures that the path
                    we're rewriting doesn't contain a hard link to
                    /etc/shadow or something like that. */
-                canonicalisePathMetaData(path, buildUser.enabled() ? buildUser.getUID() : -1);
+                canonicalisePathMetaData(path, buildUser.enabled() ? buildUser.getUID() : -1, inodesSeen);
 
                 /* FIXME: this is in-memory. */
                 StringSink sink;
@@ -2307,7 +2312,7 @@ void DerivationGoal::computeClosure()
         /* Get rid of all weird permissions.  This also checks that
            all files are owned by the build user, if applicable. */
         canonicalisePathMetaData(path,
-            buildUser.enabled() && rewrittenPaths.find(path) == rewrittenPaths.end() ? buildUser.getUID() : -1);
+            buildUser.enabled() && rewrittenPaths.find(path) == rewrittenPaths.end() ? buildUser.getUID() : -1, inodesSeen);
 
         /* For this output path, find the references to other paths
            contained in it.  Compute the SHA-256 NAR hash at the same