From 329025253d38361ee3d13af0728f99c756c86b7a Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 27 Mar 2008 13:45:17 +0000 Subject: [PATCH] * Use /tmp/nix-build-- instead of /tmp/nix-- for temporary build directories. This increases purity a bit: many packages store the temporary build path in their output, causing (generally unimportant) binary differences. --- src/libstore/build.cc | 2 +- src/libutil/util.cc | 20 ++++++++++++++------ src/libutil/util.hh | 3 ++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index a4f9c469ca..e6ab6310cd 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -1568,7 +1568,7 @@ void DerivationGoal::startBuilder() /* Create a temporary directory where the build will take place. */ - tmpDir = createTempDir(); + tmpDir = createTempDir("", "nix-build-" + baseNameOf(drvPath), false, false); /* For convenience, set an environment pointing to the top build directory. */ diff --git a/src/libutil/util.cc b/src/libutil/util.cc index d0731c0b48..822c87a050 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -318,19 +318,27 @@ void makePathReadOnly(const Path & path) } -static Path tempName(const Path & tmpRoot, const Path & prefix) +static Path tempName(Path tmpRoot, const Path & prefix, bool includePid, + int & counter) { - static int counter = 0; - Path tmpRoot2 = canonPath(tmpRoot.empty() ? getEnv("TMPDIR", "/tmp") : tmpRoot, true); - return (format("%1%/%2%-%3%-%4%") % tmpRoot2 % prefix % getpid() % counter++).str(); + tmpRoot = canonPath(tmpRoot.empty() ? getEnv("TMPDIR", "/tmp") : tmpRoot, true); + if (includePid) + return (format("%1%/%2%-%3%-%4%") % tmpRoot % prefix % getpid() % counter++).str(); + else + return (format("%1%/%2%-%3%") % tmpRoot % prefix % counter++).str(); } -Path createTempDir(const Path & tmpRoot, const Path & prefix) +Path createTempDir(const Path & tmpRoot, const Path & prefix, + bool includePid, bool useGlobalCounter) { + static int globalCounter = 0; + int localCounter = 0; + int & counter(useGlobalCounter ? globalCounter : localCounter); + while (1) { checkInterrupt(); - Path tmpDir = tempName(tmpRoot, prefix); + Path tmpDir = tempName(tmpRoot, prefix, includePid, counter); if (mkdir(tmpDir.c_str(), 0777) == 0) { /* Explicitly set the group of the directory. This is to work around around problems caused by BSD's group diff --git a/src/libutil/util.hh b/src/libutil/util.hh index 657f45ced6..d75002b021 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -70,7 +70,8 @@ void deletePath(const Path & path, unsigned long long & bytesFreed); void makePathReadOnly(const Path & path); /* Create a temporary directory. */ -Path createTempDir(const Path & tmpRoot = "", const Path & prefix = "nix"); +Path createTempDir(const Path & tmpRoot = "", const Path & prefix = "nix", + bool includePid = true, bool useGlobalCounter = true); /* Create a directory and all its parents, if necessary. Returns the list of created directories, in order of creation. */