diff --git a/doc/manual/command-ref/conf-file.xml b/doc/manual/command-ref/conf-file.xml
index 0f7a2deba..96f8a4b60 100644
--- a/doc/manual/command-ref/conf-file.xml
+++ b/doc/manual/command-ref/conf-file.xml
@@ -101,9 +101,9 @@ flag, e.g. --option gc-keep-outputs false.
This option defines the maximum number of jobs
that Nix will try to build in parallel. The default is
- 1. You should generally set it to the number
- of CPUs in your system (e.g., 2 on an Athlon 64
- X2). It can be overridden using the ()
command line switch.
diff --git a/doc/manual/command-ref/opt-common.xml b/doc/manual/command-ref/opt-common.xml
index 2a076877a..2aa41c4d4 100644
--- a/doc/manual/command-ref/opt-common.xml
+++ b/doc/manual/command-ref/opt-common.xml
@@ -93,8 +93,9 @@
Sets the maximum number of build jobs that Nix will
- perform in parallel to the specified number. The default is
- specified by the auto to use the number of CPUs in the system.
+ The default is specified by the build-max-jobs
configuration setting, which itself defaults to
1. A higher value is useful on SMP systems or to
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index 53fa83fe0..326202d29 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -167,6 +167,10 @@ struct LegacyArgs : public MixCommonArgs
settings.set("build-fallback", "true");
});
+ mkFlag1('j', "max-jobs", "jobs", "maximum number of parallel builds", [=](std::string s) {
+ settings.set("build-max-jobs", s);
+ });
+
auto intSettingAlias = [&](char shortName, const std::string & longName,
const std::string & description, const std::string & dest) {
mkFlag(shortName, longName, description, [=](unsigned int n) {
@@ -174,7 +178,6 @@ struct LegacyArgs : public MixCommonArgs
});
};
- intSettingAlias('j', "max-jobs", "maximum number of parallel builds", "build-max-jobs");
intSettingAlias(0, "cores", "maximum number of CPU cores to use inside a build", "build-cores");
intSettingAlias(0, "max-silent-time", "number of seconds of silence before a build is killed", "build-max-silent-time");
intSettingAlias(0, "timeout", "number of seconds before a build is killed", "build-timeout");
diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc
index 12e2a3cf4..07af62926 100644
--- a/src/libstore/globals.cc
+++ b/src/libstore/globals.cc
@@ -147,7 +147,14 @@ int Settings::get(const string & name, int def)
void Settings::update()
{
_get(tryFallback, "build-fallback");
- _get(maxBuildJobs, "build-max-jobs");
+
+ auto s = get("build-max-jobs", std::string("1"));
+ if (s == "auto")
+ maxBuildJobs = std::max(1U, std::thread::hardware_concurrency());
+ else
+ if (!string2Int(s, maxBuildJobs))
+ throw Error("configuration setting ‘build-max-jobs’ should be ‘auto’ or an integer");
+
_get(buildCores, "build-cores");
_get(thisSystem, "system");
_get(maxSilentTime, "build-max-silent-time");