diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2023-07-06 14:23:16 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2023-09-05 10:30:13 +0000 |
commit | 05923d13b5272924105576ca215a038f8b554ead (patch) | |
tree | d2b8b7ebb68a5197a5010b07c7c66252ed3b6d59 | |
parent | ae82e039eb74b092604910a1f3f7fa4887397cbc (diff) |
Let users specify a job count also when resolving
Preparation for loader parallelization.
For simplicity, we do not introduce a new command-line option, but re-
use the -j flag that was already present for building.
Change-Id: I71ce31ec3ccc592d222bcfe14a8aaf311126020c
Reviewed-by: Ivan Komissarov <ABBAPOH@gmail.com>
-rw-r--r-- | doc/appendix/json-api.qdoc | 1 | ||||
-rw-r--r-- | src/app/qbs/commandlinefrontend.cpp | 1 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineparser.cpp | 21 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineparser.h | 1 | ||||
-rw-r--r-- | src/app/qbs/parser/parsercommand.cpp | 2 | ||||
-rw-r--r-- | src/app/qbs/sessionpacket.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/tools/setupprojectparameters.cpp | 27 | ||||
-rw-r--r-- | src/lib/corelib/tools/setupprojectparameters.h | 3 | ||||
-rw-r--r-- | tests/auto/api/tst_api.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.cpp | 3 | ||||
-rw-r--r-- | tests/auto/cmdlineparser/tst_cmdlineparser.cpp | 21 | ||||
-rw-r--r-- | tests/auto/language/tst_language.cpp | 1 |
12 files changed, 72 insertions, 12 deletions
diff --git a/doc/appendix/json-api.qdoc b/doc/appendix/json-api.qdoc index b555825f9..28a8a943c 100644 --- a/doc/appendix/json-api.qdoc +++ b/doc/appendix/json-api.qdoc @@ -125,6 +125,7 @@ \row \li force-probe-execution \li bool \li no \row \li log-time \li bool \li no \row \li log-level \li \l LogLevel \li no + \row \li max-job-count \li int \li no \row \li module-properties \li list of strings \li no \row \li overridden-properties \li object \li no \row \li project-file-path \li FilePath \li if resolving from scratch diff --git a/src/app/qbs/commandlinefrontend.cpp b/src/app/qbs/commandlinefrontend.cpp index 3ed5cd1ad..701a49046 100644 --- a/src/app/qbs/commandlinefrontend.cpp +++ b/src/app/qbs/commandlinefrontend.cpp @@ -184,6 +184,7 @@ void CommandLineFrontend::start() params.setConfigurationName(configurationName); params.setBuildRoot(buildDirectory(profileName)); params.setOverriddenValues(userConfig); + params.setMaxJobCount(m_parser.jobCount(profileName)); SetupProjectJob * const job = Project().setupProject(params, ConsoleLogger::instance().logSink(), this); connectJob(job); diff --git a/src/app/qbs/parser/commandlineparser.cpp b/src/app/qbs/parser/commandlineparser.cpp index b4b541fa2..7fbfa28f1 100644 --- a/src/app/qbs/parser/commandlineparser.cpp +++ b/src/app/qbs/parser/commandlineparser.cpp @@ -156,17 +156,11 @@ QString CommandLineParser::projectBuildDirectory() const BuildOptions CommandLineParser::buildOptions(const QString &profile) const { - Settings settings(settingsDir()); - Preferences preferences(&settings, profile); - - if (d->buildOptions.maxJobCount() <= 0) { - d->buildOptions.setMaxJobCount(preferences.jobs()); - } - + d->buildOptions.setMaxJobCount(jobCount(profile)); if (d->buildOptions.echoMode() < 0) { - d->buildOptions.setEchoMode(preferences.defaultEchoMode()); + Settings settings(settingsDir()); + d->buildOptions.setEchoMode(Preferences(&settings, profile).defaultEchoMode()); } - return d->buildOptions; } @@ -203,6 +197,15 @@ InstallOptions CommandLineParser::installOptions(const QString &profile) const return options; } +int CommandLineParser::jobCount(const QString &profile) const +{ + if (const int explicitJobCount = d->optionPool.jobsOption()->jobCount(); explicitJobCount > 0) + return explicitJobCount; + + Settings settings(settingsDir()); + return Preferences(&settings, profile).jobs(); +} + bool CommandLineParser::forceTimestampCheck() const { return d->optionPool.forceTimestampCheckOption()->enabled(); diff --git a/src/app/qbs/parser/commandlineparser.h b/src/app/qbs/parser/commandlineparser.h index 999027006..4ce7756ef 100644 --- a/src/app/qbs/parser/commandlineparser.h +++ b/src/app/qbs/parser/commandlineparser.h @@ -75,6 +75,7 @@ public: CleanOptions cleanOptions(const QString &profile) const; GenerateOptions generateOptions() const; InstallOptions installOptions(const QString &profile) const; + int jobCount(const QString &profile) const; bool forceTimestampCheck() const; bool forceOutputCheck() const; bool dryRun() const; diff --git a/src/app/qbs/parser/parsercommand.cpp b/src/app/qbs/parser/parsercommand.cpp index bbb5db3d1..f11a7b6ac 100644 --- a/src/app/qbs/parser/parsercommand.cpp +++ b/src/app/qbs/parser/parsercommand.cpp @@ -209,6 +209,7 @@ static QList<CommandLineOption::Type> resolveOptions() CommandLineOption::ForceProbesOptionType, CommandLineOption::LogTimeOptionType, CommandLineOption::DeprecationWarningsOptionType, + CommandLineOption::JobsOptionType, CommandLineOption::DisableFallbackProviderType}; } @@ -279,7 +280,6 @@ static QList<CommandLineOption::Type> buildOptions() << CommandLineOption::ForceTimestampCheckOptionType << CommandLineOption::ForceOutputCheckOptionType << CommandLineOption::BuildNonDefaultOptionType - << CommandLineOption::JobsOptionType << CommandLineOption::CommandEchoModeOptionType << CommandLineOption::NoInstallOptionType << CommandLineOption::RemoveFirstOptionType diff --git a/src/app/qbs/sessionpacket.cpp b/src/app/qbs/sessionpacket.cpp index 3830704fa..43dd22aba 100644 --- a/src/app/qbs/sessionpacket.cpp +++ b/src/app/qbs/sessionpacket.cpp @@ -99,7 +99,7 @@ QJsonObject SessionPacket::helloMessage() { return QJsonObject{ {StringConstants::type(), QLatin1String("hello")}, - {QLatin1String("api-level"), 3}, + {QLatin1String("api-level"), 4}, {QLatin1String("api-compat-level"), 2} }; } diff --git a/src/lib/corelib/tools/setupprojectparameters.cpp b/src/lib/corelib/tools/setupprojectparameters.cpp index bc07acfef..28ad745ce 100644 --- a/src/lib/corelib/tools/setupprojectparameters.cpp +++ b/src/lib/corelib/tools/setupprojectparameters.cpp @@ -38,6 +38,8 @@ ****************************************************************************/ #include "setupprojectparameters.h" +#include "buildoptions.h" + #include <logging/logger.h> #include <logging/translator.h> #include <tools/buildgraphlocker.h> @@ -90,6 +92,7 @@ public: mutable QVariantMap buildConfigurationTree; mutable QVariantMap overriddenValuesTree; mutable QVariantMap finalBuildConfigTree; + int maxJobCount = 0; bool overrideBuildGraphData; bool dryRun; bool logElapsedTime; @@ -154,6 +157,9 @@ SetupProjectParameters SetupProjectParameters::fromJson(const QJsonObject &data) setValueFromJson(params.d->projectFilePath, data, "project-file-path"); setValueFromJson(params.d->buildRoot, data, "build-root"); setValueFromJson(params.d->settingsBaseDir, data, "settings-directory"); + setValueFromJson(params.d->maxJobCount, data, "max-job-count"); + if (params.maxJobCount() <= 0) + params.setMaxJobCount(BuildOptions::defaultMaxJobCount()); setValueFromJson(params.d->overriddenValues, data, "overridden-properties"); setValueFromJson(params.d->dryRun, data, "dry-run"); setValueFromJson(params.d->logElapsedTime, data, "log-time"); @@ -373,6 +379,27 @@ void SetupProjectParameters::setSettingsDirectory(const QString &settingsBaseDir } /*! + * \brief Returns the maximum number of threads to employ when resolving the project. + * If the value is not valid (i.e. <= 0), a sensible one will be derived from the number of + * available processor cores. + * The default is 0. + * \sa BuildOptions::defaultMaxJobCount + */ +int SetupProjectParameters::maxJobCount() const +{ + return d->maxJobCount; +} + +/*! + * \brief Controls how many threads to employ when resolving the project. + * A value <= 0 leaves the decision to qbs. + */ +void SetupProjectParameters::setMaxJobCount(int jobCount) +{ + d->maxJobCount = jobCount; +} + +/*! * Returns the overridden values of the build configuration. */ QVariantMap SetupProjectParameters::overriddenValues() const diff --git a/src/lib/corelib/tools/setupprojectparameters.h b/src/lib/corelib/tools/setupprojectparameters.h index 67bb5298a..76b038752 100644 --- a/src/lib/corelib/tools/setupprojectparameters.h +++ b/src/lib/corelib/tools/setupprojectparameters.h @@ -99,6 +99,9 @@ public: QString settingsDirectory() const; void setSettingsDirectory(const QString &settingsBaseDir); + int maxJobCount() const; + void setMaxJobCount(int jobCount); + QVariantMap overriddenValues() const; void setOverriddenValues(const QVariantMap &values); QVariantMap overriddenValuesTree() const; diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index 5042766d9..c07d358c2 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -2522,6 +2522,7 @@ qbs::SetupProjectParameters TestApi::defaultSetupParameters(const QString &proje setupParams.setLibexecPath(QDir::cleanPath(QCoreApplication::applicationDirPath() + QLatin1String("/" QBS_RELATIVE_LIBEXEC_PATH))); setupParams.setTopLevelProfile(profileName()); + setupParams.setMaxJobCount(2); setupParams.setConfigurationName(QStringLiteral("default")); setupParams.setSettingsDirectory(settings()->baseDirectory()); return setupParams; diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index 465c97196..93a676697 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -6345,7 +6345,7 @@ void TestBlackbox::qbsSession() // Wait for and verify hello packet. QJsonObject receivedMessage = getNextSessionPacket(sessionProc, incomingData); QCOMPARE(receivedMessage.value("type"), "hello"); - QCOMPARE(receivedMessage.value("api-level").toInt(), 3); + QCOMPARE(receivedMessage.value("api-level").toInt(), 4); QCOMPARE(receivedMessage.value("api-compat-level").toInt(), 2); // Resolve & verify structure @@ -6361,6 +6361,7 @@ void TestBlackbox::qbsSession() resolveMessage.insert("overridden-properties", overriddenValues); resolveMessage.insert("environment", envToJson(QbsRunParameters::defaultEnvironment())); resolveMessage.insert("data-mode", "only-if-changed"); + resolveMessage.insert("max-job-count", 2); resolveMessage.insert("log-time", true); resolveMessage.insert("module-properties", QJsonArray::fromStringList({"cpp.cxxLanguageVersion"})); diff --git a/tests/auto/cmdlineparser/tst_cmdlineparser.cpp b/tests/auto/cmdlineparser/tst_cmdlineparser.cpp index f617d41c7..6a8b44f89 100644 --- a/tests/auto/cmdlineparser/tst_cmdlineparser.cpp +++ b/tests/auto/cmdlineparser/tst_cmdlineparser.cpp @@ -26,6 +26,8 @@ ** ****************************************************************************/ +#include "../shared.h" + #include <app/qbs/parser/commandlineparser.h> #include <app/shared/logging/consolelogger.h> #include <tools/buildoptions.h> @@ -55,6 +57,25 @@ private slots: m_fileArgs = QStringList() << "-f" << m_projectFile.fileName(); } + void testResolve_data() + { + QTest::addColumn<QStringList>("args"); + QTest::addColumn<int>("expectedJobCount"); + + QTest::newRow("default job count") << QStringList() << BuildOptions::defaultMaxJobCount(); + QTest::newRow("explicit job count") << QStringList("-j5") << 5; + } + void testResolve() + { + QFETCH(QStringList, args); + QFETCH(int, expectedJobCount); + + CommandLineParser parser; + QVERIFY(parser.parseCommandLine(QStringList("resolve") << args << m_fileArgs)); + QCOMPARE(parser.command(), ResolveCommandType); + QCOMPARE(parser.jobCount(profileName()), expectedJobCount); + } + void testValidCommandLine() { QStringList args; diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp index 9b8506d84..8b50d39b9 100644 --- a/tests/auto/language/tst_language.cpp +++ b/tests/auto/language/tst_language.cpp @@ -195,6 +195,7 @@ void TestLanguage::init() defaultParameters.setPropertyCheckingMode(ErrorHandlingMode::Strict); defaultParameters.setSettingsDirectory(m_settings->baseDirectory()); defaultParameters.setTopLevelProfile(profileName()); + defaultParameters.setMaxJobCount(1); defaultParameters.setConfigurationName("default"); defaultParameters.setEnvironment(QProcessEnvironment::systemEnvironment()); defaultParameters.setSearchPaths({SRCDIR "/../../../share/qbs"}); |