diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-07-24 12:44:28 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-08-08 11:18:45 +0000 |
commit | 0bc341e3dcba1f561a685d72cfa0f4b1a7f697dd (patch) | |
tree | bc79d5bc3f8bbbda56b72b0825c70bb71127d863 /src/app/qbs | |
parent | 43e3b7ad7e5e68bae839feb74cdbcde48424c065 (diff) |
Add support for job pools
Commands can now be assigned to an arbitrary job pool and a limit for
the number of concurrently running jobs in such pools can be provided in
a number of ways:
- via the build command line: qbs --job-limits linker:1
- via the settings: qbs config preferences.jobLimit.linker 1
- in a project file: JobLimit {
jobPool: "linker";
jobCount: 1
}
We provide two job pools ourselves with the cpp module: "compiler" and
"linker".
[ChangeLog] Added the concept of job pools for limiting concurrent
execution of commands by type
Task-number: QBS-743
Change-Id: Ib3f361dbc73093e342bf0eba0daf2079a2b3a8ce
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/app/qbs')
-rw-r--r-- | src/app/qbs/parser/commandlineoption.cpp | 53 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoption.h | 26 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoptionpool.cpp | 17 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoptionpool.h | 2 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineparser.cpp | 4 | ||||
-rw-r--r-- | src/app/qbs/parser/parsercommand.cpp | 2 |
6 files changed, 104 insertions, 0 deletions
diff --git a/src/app/qbs/parser/commandlineoption.cpp b/src/app/qbs/parser/commandlineoption.cpp index c2eea340a..e18658751 100644 --- a/src/app/qbs/parser/commandlineoption.cpp +++ b/src/app/qbs/parser/commandlineoption.cpp @@ -574,6 +574,59 @@ void SettingsDirOption::doParse(const QString &representation, QStringList &inpu m_settingsDir = input.takeFirst(); } +QString JobLimitsOption::description(CommandType command) const +{ + Q_UNUSED(command); + return Tr::tr("%1 <pool1>:<limit1>[,<pool2>:<limit2>...]\n" + "\tSet pool-specific job limits.\n").arg(longRepresentation()); +} + +QString JobLimitsOption::longRepresentation() const +{ + return QLatin1String("--job-limits"); +} + +void JobLimitsOption::doParse(const QString &representation, QStringList &input) +{ + if (input.empty()) { + throw ErrorInfo(Tr::tr("Invalid use of option '%1: Argument expected.\n" + "Usage: %2").arg(representation, description(command()))); + } + const QString jobLimitsSpec = input.takeFirst(); + const QStringList jobLimitStrings = jobLimitsSpec.split(QLatin1Char(',')); + for (const QString &jobLimitString : jobLimitStrings) { + const int sepIndex = jobLimitString.indexOf(QLatin1Char(':')); + if (sepIndex <= 0 || sepIndex == jobLimitString.size() - 1) { + throw ErrorInfo(Tr::tr("Invalid use of option '%1: " + "Invalid job limits specification '%2'.\n" + "Usage: %3").arg(representation, jobLimitsSpec, + description(command()))); + } + const QString pool = jobLimitString.left(sepIndex); + const QString limitString = jobLimitString.mid(sepIndex + 1); + bool isValidNumber; + const int limit = limitString.toInt(&isValidNumber); + if (!isValidNumber) { + throw ErrorInfo(Tr::tr("Invalid use of option '%1: '%2' is not a number.\n" + "Usage: %3").arg(representation, limitString, + description(command()))); + } + m_jobLimits.setJobLimit(pool, limit); + } +} + +QString RespectProjectJobLimitsOption::description(CommandType command) const +{ + Q_UNUSED(command); + return Tr::tr("%1\n\tGive maximum priority to job limits defined inside the project.\n") + .arg(longRepresentation()); +} + +QString RespectProjectJobLimitsOption::longRepresentation() const +{ + return QLatin1String("--enforce-project-job-limits"); +} + CommandEchoModeOption::CommandEchoModeOption() { } diff --git a/src/app/qbs/parser/commandlineoption.h b/src/app/qbs/parser/commandlineoption.h index c645c533b..d57ec76b7 100644 --- a/src/app/qbs/parser/commandlineoption.h +++ b/src/app/qbs/parser/commandlineoption.h @@ -42,6 +42,7 @@ #include "commandtype.h" #include <tools/commandechomode.h> +#include <tools/joblimits.h> #include <QtCore/qstringlist.h> @@ -69,6 +70,8 @@ public: LogTimeOptionType, CommandEchoModeOptionType, SettingsDirOptionType, + JobLimitsOptionType, + RespectProjectJobLimitsOptionType, GeneratorOptionType, WaitLockOptionType, RunEnvConfigOptionType, @@ -380,6 +383,29 @@ private: QString m_settingsDir; }; +class JobLimitsOption : public CommandLineOption +{ +public: + JobLimits jobLimits() const { return m_jobLimits; } + + QString description(CommandType command) const override; + QString shortRepresentation() const override { return QString(); } + QString longRepresentation() const override; + +private: + void doParse(const QString &representation, QStringList &input) override; + + JobLimits m_jobLimits; +}; + +class RespectProjectJobLimitsOption : public OnOffOption +{ +public: + QString description(CommandType command) const override; + QString shortRepresentation() const override { return QString(); } + QString longRepresentation() const override; +}; + class WaitLockOption : public OnOffOption { public: diff --git a/src/app/qbs/parser/commandlineoptionpool.cpp b/src/app/qbs/parser/commandlineoptionpool.cpp index 8850fad87..9964f051a 100644 --- a/src/app/qbs/parser/commandlineoptionpool.cpp +++ b/src/app/qbs/parser/commandlineoptionpool.cpp @@ -116,6 +116,12 @@ CommandLineOption *CommandLineOptionPool::getOption(CommandLineOption::Type type case CommandLineOption::SettingsDirOptionType: option = new SettingsDirOption; break; + case CommandLineOption::JobLimitsOptionType: + option = new JobLimitsOption; + break; + case CommandLineOption::RespectProjectJobLimitsOptionType: + option = new RespectProjectJobLimitsOption; + break; case CommandLineOption::GeneratorOptionType: option = new GeneratorOption; break; @@ -246,6 +252,17 @@ SettingsDirOption *CommandLineOptionPool::settingsDirOption() const return static_cast<SettingsDirOption *>(getOption(CommandLineOption::SettingsDirOptionType)); } +JobLimitsOption *CommandLineOptionPool::jobLimitsOption() const +{ + return static_cast<JobLimitsOption *>(getOption(CommandLineOption::JobLimitsOptionType)); +} + +RespectProjectJobLimitsOption *CommandLineOptionPool::respectProjectJobLimitsOption() const +{ + return static_cast<RespectProjectJobLimitsOption *>( + getOption(CommandLineOption::RespectProjectJobLimitsOptionType)); +} + GeneratorOption *CommandLineOptionPool::generatorOption() const { return static_cast<GeneratorOption *>(getOption(CommandLineOption::GeneratorOptionType)); diff --git a/src/app/qbs/parser/commandlineoptionpool.h b/src/app/qbs/parser/commandlineoptionpool.h index a4e6c30c1..6a4669165 100644 --- a/src/app/qbs/parser/commandlineoptionpool.h +++ b/src/app/qbs/parser/commandlineoptionpool.h @@ -73,6 +73,8 @@ public: LogTimeOption *logTimeOption() const; CommandEchoModeOption *commandEchoModeOption() const; SettingsDirOption *settingsDirOption() const; + JobLimitsOption *jobLimitsOption() const; + RespectProjectJobLimitsOption *respectProjectJobLimitsOption() const; GeneratorOption *generatorOption() const; WaitLockOption *waitLockOption() const; RunEnvConfigOption *runEnvConfigOption() const; diff --git a/src/app/qbs/parser/commandlineparser.cpp b/src/app/qbs/parser/commandlineparser.cpp index 92c43c8c6..c2e265336 100644 --- a/src/app/qbs/parser/commandlineparser.cpp +++ b/src/app/qbs/parser/commandlineparser.cpp @@ -462,6 +462,10 @@ void CommandLineParser::CommandLineParserPrivate::setupBuildOptions() buildOptions.setEchoMode(echoMode()); buildOptions.setInstall(!optionPool.noInstallOption()->enabled()); buildOptions.setRemoveExistingInstallation(optionPool.removeFirstoption()->enabled()); + buildOptions.setJobLimits(optionPool.jobLimitsOption()->jobLimits()); + buildOptions.setProjectJobLimitsTakePrecedence( + optionPool.respectProjectJobLimitsOption()->enabled()); + buildOptions.setSettingsDirectory(settingsDir()); } void CommandLineParser::CommandLineParserPrivate::setupBuildConfigurations() diff --git a/src/app/qbs/parser/parsercommand.cpp b/src/app/qbs/parser/parsercommand.cpp index b85e98540..ff331fd50 100644 --- a/src/app/qbs/parser/parsercommand.cpp +++ b/src/app/qbs/parser/parsercommand.cpp @@ -287,6 +287,8 @@ static QList<CommandLineOption::Type> buildOptions() << CommandLineOption::CommandEchoModeOptionType << CommandLineOption::NoInstallOptionType << CommandLineOption::RemoveFirstOptionType + << CommandLineOption::JobLimitsOptionType + << CommandLineOption::RespectProjectJobLimitsOptionType << CommandLineOption::WaitLockOptionType; } |