aboutsummaryrefslogtreecommitdiffstats
path: root/src/app/qbs
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-07-24 12:44:28 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2018-08-08 11:18:45 +0000
commit0bc341e3dcba1f561a685d72cfa0f4b1a7f697dd (patch)
treebc79d5bc3f8bbbda56b72b0825c70bb71127d863 /src/app/qbs
parent43e3b7ad7e5e68bae839feb74cdbcde48424c065 (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.cpp53
-rw-r--r--src/app/qbs/parser/commandlineoption.h26
-rw-r--r--src/app/qbs/parser/commandlineoptionpool.cpp17
-rw-r--r--src/app/qbs/parser/commandlineoptionpool.h2
-rw-r--r--src/app/qbs/parser/commandlineparser.cpp4
-rw-r--r--src/app/qbs/parser/parsercommand.cpp2
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;
}