From efa5fa1a91d5c4b29094d99b65e18b583d86dbc7 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 12 May 2004 14:20:32 +0000 Subject: * A switch `-j NUMBER' to set the maximum number of parallel jobs (0 = no limit). * Add missing file to distribution. --- src/libstore/globals.cc | 2 ++ src/libstore/globals.hh | 3 +++ src/libstore/normalise.cc | 13 ++++++++----- 3 files changed, 13 insertions(+), 5 deletions(-) (limited to 'src/libstore') diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc index b3c658c29..e6105947f 100644 --- a/src/libstore/globals.cc +++ b/src/libstore/globals.cc @@ -9,3 +9,5 @@ string nixDBPath = "/UNINIT"; bool keepFailed = false; Verbosity buildVerbosity = lvlDebug; + +unsigned int maxBuildJobs = 1; diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh index 5d5e9efcf..020a7135b 100644 --- a/src/libstore/globals.hh +++ b/src/libstore/globals.hh @@ -32,5 +32,8 @@ extern bool keepFailed; /* Verbosity level for build output. */ extern Verbosity buildVerbosity; +/* Maximum number of parallel build jobs. 0 means unlimited. */ +extern unsigned int maxBuildJobs; + #endif /* !__GLOBALS_H */ diff --git a/src/libstore/normalise.cc b/src/libstore/normalise.cc index b6746689e..02089c929 100644 --- a/src/libstore/normalise.cc +++ b/src/libstore/normalise.cc @@ -284,6 +284,9 @@ bool Normaliser::startBuild(Path nePath) { checkInterrupt(); + if (maxBuildJobs > 0 && building.size() >= maxBuildJobs) + return false; + Goals::iterator goalIt = goals.find(nePath); assert(goalIt != goals.end()); Goal & goal(goalIt->second); @@ -414,11 +417,6 @@ bool Normaliser::startBuild(Path nePath) format("build hook died with status %1%") % status); } - /* Right platform? */ - if (goal.expr.derivation.platform != thisSystem) - throw Error(format("a `%1%' is required, but I am a `%2%'") - % goal.expr.derivation.platform % thisSystem); - /* Otherwise, start the build in a child process. */ startBuildChild(goal); @@ -428,6 +426,11 @@ bool Normaliser::startBuild(Path nePath) void Normaliser::startBuildChild(Goal & goal) { + /* Right platform? */ + if (goal.expr.derivation.platform != thisSystem) + throw Error(format("a `%1%' is required, but I am a `%2%'") + % goal.expr.derivation.platform % thisSystem); + /* If any of the outputs already exist but are not registered, delete them. */ for (PathSet::iterator i = goal.expr.derivation.outputs.begin(); -- cgit v1.2.3