aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-05-12 09:35:51 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-05-12 09:35:51 +0000
commit8c0b42f857b53993d95c5bc077e8f8a71028c5ac (patch)
tree8911f759371585a66cfd6b5ad604fff0a97779ba /src
parentc8d3882cdc8f9e22c58af285c1996265c1af75d5 (diff)
* An quick and dirty hack to support distributed builds.
Diffstat (limited to 'src')
-rw-r--r--src/libmain/shared.cc7
-rw-r--r--src/libstore/normalise.cc22
-rw-r--r--src/libutil/util.cc10
-rw-r--r--src/libutil/util.hh3
-rw-r--r--src/nix-env/main.cc2
5 files changed, 33 insertions, 11 deletions
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index d9cc990f9..95552a361 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -52,13 +52,6 @@ void checkStoreNotSymlink(Path path)
}
-static string getEnv(const string & key, const string & def = "")
-{
- char * value = getenv(key.c_str());
- return value ? string(value) : def;
-}
-
-
/* Initialize and reorder arguments, then call the actual argument
processor. */
static void initAndRun(int argc, char * * argv)
diff --git a/src/libstore/normalise.cc b/src/libstore/normalise.cc
index 983d7d476..0c8a8057f 100644
--- a/src/libstore/normalise.cc
+++ b/src/libstore/normalise.cc
@@ -302,6 +302,7 @@ bool Normaliser::startBuild(Path nePath)
/* Obtain locks on all output paths. The locks are automatically
released when we exit this function or Nix crashes. */
+ /* !!! BUG: this could block, which is not allowed. */
goal.outputLocks.lockPaths(goal.expr.derivation.outputs);
/* Now check again whether there is a successor. This is because
@@ -364,6 +365,25 @@ bool Normaliser::startBuild(Path nePath)
return true;
}
+ /* !!! Hack */
+ Path buildHook = getEnv("NIX_BUILD_HOOK");
+ if (buildHook != "") {
+ printMsg(lvlChatty, format("using build hook `%1%'") % buildHook);
+ int status = system((buildHook + " " + goal.nePath + " 1>&2").c_str());
+ if (WIFEXITED(status)) {
+ int code = WEXITSTATUS(status);
+ if (code == 100) { /* == accepted */
+ printMsg(lvlChatty,
+ format("build hook succesfully realised output paths"));
+ finishGoal(goal);
+ return true;
+ } else if (code != 101) /* != declined */
+ throw Error(
+ format("build hook returned exit code %1%") % code);
+ } else throw Error(
+ format("build hook died with status %1%") % status);
+ }
+
/* Otherwise, start the build in a child process. */
startBuildChild(goal);
@@ -660,7 +680,7 @@ void Normaliser::finishGoal(Goal & goal)
{
Path path = *i;
if (!pathExists(path))
- throw Error(format("path `%1%' does not exist") % path);
+ throw Error(format("output path `%1%' does not exist") % path);
nf.closure.roots.insert(path);
makePathReadOnly(path);
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index bf2954f53..399233983 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -29,6 +29,13 @@ SysError::SysError(const format & f)
}
+string getEnv(const string & key, const string & def)
+{
+ char * value = getenv(key.c_str());
+ return value ? string(value) : def;
+}
+
+
Path absPath(Path path, Path dir)
{
if (path[0] != '/') {
@@ -206,8 +213,7 @@ void makePathReadOnly(const Path & path)
static Path tempName()
{
static int counter = 0;
- char * s = getenv("TMPDIR");
- Path tmpRoot = s ? canonPath(Path(s)) : "/tmp";
+ Path tmpRoot = canonPath(getEnv("TMPDIR", "/tmp"));
return (format("%1%/nix-%2%-%3%") % tmpRoot % getpid() % counter++).str();
}
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 1b0600006..d9ca1dac2 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -55,6 +55,9 @@ typedef set<Path> PathSet;
extern string thisSystem;
+/* Return an environment variable. */
+string getEnv(const string & key, const string & def = "");
+
/* Return an absolutized path, resolving paths relative to the
specified directory, or the current directory otherwise. The path
is also canonicalised. */
diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc
index ed00fc206..8cbc3b703 100644
--- a/src/nix-env/main.cc
+++ b/src/nix-env/main.cc
@@ -118,7 +118,7 @@ void loadDerivations(EvalState & state, Path nePath, DrvInfos & drvs)
static Path getHomeDir()
{
- Path homeDir(getenv("HOME"));
+ Path homeDir(getEnv("HOME", ""));
if (homeDir == "") throw Error("HOME environment variable not set");
return homeDir;
}