Added support for passing an (impure) NIX_BUILD_CORES variable to build expressions.
This patch adds the configuration file variable "build-cores" and the command line argument "--cores". These settings specify the number of CPU cores to utilize for parallel building within a job, i.e. by passing an appropriate "-j" flag to GNU Make. The default value is 1, which means that parallel building is *disabled*. If the number of build cores is specified as 0 (synonymously: "guess" or "auto"), then the actual value is supposed to be auto-detected by builders at run-time, i.e by calling the nproc(1) utility from coreutils. The environment variable $NIX_BUILD_CORES is available to builders, but the contents of that variable does *not* influence the hash that goes into the $out store path, i.e. the number of build cores to be utilized can be changed at will without requiring any re-builds.
This commit is contained in:
parent
819548d92f
commit
8b7f8b56f1
5 changed files with 35 additions and 0 deletions
|
@ -59,6 +59,18 @@
|
||||||
#build-max-jobs = 1
|
#build-max-jobs = 1
|
||||||
|
|
||||||
|
|
||||||
|
### Option `build-cores'
|
||||||
|
#
|
||||||
|
# This option defines the number of CPU cores to utilize in parallel
|
||||||
|
# within a build job, i.e. by passing an appropriate `-jN' flag to
|
||||||
|
# GNU make. The default is 1, meaning that parallel building within
|
||||||
|
# jobs is disabled. Passing the special values `0', `auto', or
|
||||||
|
# `guess' causes Nix to try and auto-detect the number of available
|
||||||
|
# cores on the local host. This setting can be overridden using the
|
||||||
|
# `--cores' command line switch.
|
||||||
|
#build-cores = 1
|
||||||
|
|
||||||
|
|
||||||
### Option `build-max-silent-time'
|
### Option `build-max-silent-time'
|
||||||
#
|
#
|
||||||
# This option defines the maximum number of seconds that a builder can
|
# This option defines the maximum number of seconds that a builder can
|
||||||
|
|
|
@ -135,6 +135,12 @@ static void initAndRun(int argc, char * * argv)
|
||||||
/* Get some settings from the configuration file. */
|
/* Get some settings from the configuration file. */
|
||||||
thisSystem = querySetting("system", SYSTEM);
|
thisSystem = querySetting("system", SYSTEM);
|
||||||
maxBuildJobs = queryIntSetting("build-max-jobs", 1);
|
maxBuildJobs = queryIntSetting("build-max-jobs", 1);
|
||||||
|
string tmp = querySetting("build-cores", "/UNDEFINED");
|
||||||
|
std::transform(tmp.begin(), tmp.end(), tmp.begin(), tolower);
|
||||||
|
if (tmp == "auto" || tmp == "guess")
|
||||||
|
buildCores = 0;
|
||||||
|
else
|
||||||
|
buildCores = queryIntSetting("build-cores", 1);
|
||||||
maxSilentTime = queryIntSetting("build-max-silent-time", 0);
|
maxSilentTime = queryIntSetting("build-max-silent-time", 0);
|
||||||
|
|
||||||
/* Catch SIGINT. */
|
/* Catch SIGINT. */
|
||||||
|
@ -226,6 +232,14 @@ static void initAndRun(int argc, char * * argv)
|
||||||
tryFallback = true;
|
tryFallback = true;
|
||||||
else if (arg == "--max-jobs" || arg == "-j")
|
else if (arg == "--max-jobs" || arg == "-j")
|
||||||
maxBuildJobs = getIntArg<unsigned int>(arg, i, args.end());
|
maxBuildJobs = getIntArg<unsigned int>(arg, i, args.end());
|
||||||
|
else if (arg == "--cores") {
|
||||||
|
string tmp = *(++i);
|
||||||
|
std::transform(tmp.begin(), tmp.end(), tmp.begin(), tolower);
|
||||||
|
if (tmp == "auto" || tmp == "guess")
|
||||||
|
buildCores = 0u;
|
||||||
|
else
|
||||||
|
buildCores = getIntArg<unsigned int>(arg, --i, args.end());
|
||||||
|
}
|
||||||
else if (arg == "--readonly-mode")
|
else if (arg == "--readonly-mode")
|
||||||
readOnlyMode = true;
|
readOnlyMode = true;
|
||||||
else if (arg == "--max-silent-time")
|
else if (arg == "--max-silent-time")
|
||||||
|
|
|
@ -1411,6 +1411,9 @@ void DerivationGoal::startBuilder()
|
||||||
in the store or in the build directory). */
|
in the store or in the build directory). */
|
||||||
env["NIX_STORE"] = nixStore;
|
env["NIX_STORE"] = nixStore;
|
||||||
|
|
||||||
|
/* The maximum number of cores to utilize for parallel building. */
|
||||||
|
env["NIX_BUILD_CORES"] = (format("%d") % buildCores).str();
|
||||||
|
|
||||||
/* Add all bindings specified in the derivation. */
|
/* Add all bindings specified in the derivation. */
|
||||||
foreach (StringPairs::iterator, i, drv.env)
|
foreach (StringPairs::iterator, i, drv.env)
|
||||||
env[i->first] = i->second;
|
env[i->first] = i->second;
|
||||||
|
|
|
@ -22,6 +22,7 @@ bool keepGoing = false;
|
||||||
bool tryFallback = false;
|
bool tryFallback = false;
|
||||||
Verbosity buildVerbosity = lvlInfo;
|
Verbosity buildVerbosity = lvlInfo;
|
||||||
unsigned int maxBuildJobs = 1;
|
unsigned int maxBuildJobs = 1;
|
||||||
|
unsigned int buildCores = 1;
|
||||||
bool readOnlyMode = false;
|
bool readOnlyMode = false;
|
||||||
string thisSystem = "unset";
|
string thisSystem = "unset";
|
||||||
time_t maxSilentTime = 0;
|
time_t maxSilentTime = 0;
|
||||||
|
|
|
@ -55,6 +55,11 @@ extern Verbosity buildVerbosity;
|
||||||
/* Maximum number of parallel build jobs. 0 means unlimited. */
|
/* Maximum number of parallel build jobs. 0 means unlimited. */
|
||||||
extern unsigned int maxBuildJobs;
|
extern unsigned int maxBuildJobs;
|
||||||
|
|
||||||
|
/* Number of CPU cores to utilize in parallel within a build, i.e. by passing
|
||||||
|
this number to Make via '-j'. 0 means that the number of actual CPU cores on
|
||||||
|
the local host ought to be auto-detected. */
|
||||||
|
extern unsigned int buildCores;
|
||||||
|
|
||||||
/* Read-only mode. Don't copy stuff to the store, don't change the
|
/* Read-only mode. Don't copy stuff to the store, don't change the
|
||||||
database. */
|
database. */
|
||||||
extern bool readOnlyMode;
|
extern bool readOnlyMode;
|
||||||
|
|
Loading…
Reference in a new issue