Support auto-configuration of build-max-jobs

"build-max-jobs" and the "-j" option can now be set to "auto" to use
the number of CPUs in the system. (Unlike build-cores, it doesn't use
0 to imply auto-configuration, because a) magic values are a bad idea
in general; b) 0 is a legitimate value used to disable local
building.)

Fixes #1198.
This commit is contained in:
Eelco Dolstra 2017-02-28 12:54:50 +01:00
parent 3fab1f04a7
commit 7251d048fa
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
4 changed files with 18 additions and 7 deletions

View file

@ -101,9 +101,9 @@ flag, e.g. <literal>--option gc-keep-outputs false</literal>.</para>
<listitem><para>This option defines the maximum number of jobs <listitem><para>This option defines the maximum number of jobs
that Nix will try to build in parallel. The default is that Nix will try to build in parallel. The default is
<literal>1</literal>. You should generally set it to the number <literal>1</literal>. The special value <literal>auto</literal>
of CPUs in your system (e.g., <literal>2</literal> on an Athlon 64 causes Nix to use the number of CPUs in your system. It can be
X2). It can be overridden using the <option overridden using the <option
linkend='opt-max-jobs'>--max-jobs</option> (<option>-j</option>) linkend='opt-max-jobs'>--max-jobs</option> (<option>-j</option>)
command line switch.</para></listitem> command line switch.</para></listitem>

View file

@ -93,8 +93,9 @@
<term><option>-j</option></term> <term><option>-j</option></term>
<listitem><para>Sets the maximum number of build jobs that Nix will <listitem><para>Sets the maximum number of build jobs that Nix will
perform in parallel to the specified number. The default is perform in parallel to the specified number. Specify
specified by the <link <literal>auto</literal> to use the number of CPUs in the system.
The default is specified by the <link
linkend='conf-build-max-jobs'><literal>build-max-jobs</literal></link> linkend='conf-build-max-jobs'><literal>build-max-jobs</literal></link>
configuration setting, which itself defaults to configuration setting, which itself defaults to
<literal>1</literal>. A higher value is useful on SMP systems or to <literal>1</literal>. A higher value is useful on SMP systems or to

View file

@ -167,6 +167,10 @@ struct LegacyArgs : public MixCommonArgs
settings.set("build-fallback", "true"); 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, auto intSettingAlias = [&](char shortName, const std::string & longName,
const std::string & description, const std::string & dest) { const std::string & description, const std::string & dest) {
mkFlag<unsigned int>(shortName, longName, description, [=](unsigned int n) { mkFlag<unsigned int>(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, "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, "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"); intSettingAlias(0, "timeout", "number of seconds before a build is killed", "build-timeout");

View file

@ -147,7 +147,14 @@ int Settings::get(const string & name, int def)
void Settings::update() void Settings::update()
{ {
_get(tryFallback, "build-fallback"); _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(buildCores, "build-cores");
_get(thisSystem, "system"); _get(thisSystem, "system");
_get(maxSilentTime, "build-max-silent-time"); _get(maxSilentTime, "build-max-silent-time");