aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2008-12-12 17:14:57 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2008-12-12 17:14:57 +0000
commit92cb7c4dfe036ed4c13d45128a21838a039d840f (patch)
tree24adccb1a893ef5d7f4f0321f47cc2b6054810d4
parent0008b0006db59ea8fccfe041cf8d87f05abb427d (diff)
* Put chroots in the Nix store. This ensures that we can create hard
links to the inputs.
-rw-r--r--src/libstore/build.cc11
-rw-r--r--src/libstore/gc.cc5
2 files changed, 14 insertions, 2 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 8d06a66f6..54890afd1 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -811,6 +811,11 @@ void DerivationGoal::haveDerivation()
return;
}
+ /* `drvPath' should already be a root, but let's be on the safe
+ side: if the user forgot to make it a root, we wouldn't want
+ things being garbage collected while we're busy. */
+ worker.store.addTempRoot(drvPath);
+
assert(worker.store.isValidPath(drvPath));
/* Get the derivation. */
@@ -1669,8 +1674,10 @@ void DerivationGoal::startBuilder()
if (useChroot) {
#if CHROOT_ENABLED
/* Create a temporary directory in which we set up the chroot
- environment using bind-mounts. */
- chrootRootDir = createTempDir("", "nix-chroot");
+ environment using bind-mounts. We put it in the Nix store
+ to ensure that we can create hard-links to non-directory
+ inputs in the fake Nix store in the chroot (see below). */
+ chrootRootDir = drvPath + ".chroot";
/* Clean up the chroot directory automatically. */
autoDelChroot = boost::shared_ptr<AutoDelete>(new AutoDelete(chrootRootDir));
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index 32cfbd022..552016584 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -565,6 +565,11 @@ static bool isLive(const Path & path, const PathSet & livePaths,
if (hasSuffix(path, ".lock") && tempRoots.find(string(path, 0, path.size() - 5)) != tempRoots.end())
return true;
+ /* Don't delete .chroot directories for derivations that are
+ currently being built. */
+ if (hasSuffix(path, ".chroot") && tempRoots.find(string(path, 0, path.size() - 7)) != tempRoots.end())
+ return true;
+
return false;
}