diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2017-10-17 16:38:07 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2017-10-18 10:52:32 +0000 |
commit | c005ae0a1629a2d7adc7ff6d6b292775008adaf8 (patch) | |
tree | 40600f935236ca349de95916d1e4cb1cad74474f /src | |
parent | 9f6ee4c33ac1474c89d4cddf702e10ae1e21b555 (diff) |
CLI: Check generator name before building
We can and should detect invalid generator names before starting a
potentially expensive operation.
Task-number: QBS-1194
Change-Id: I3588df48b7f3e3d7d085a2e4b620296f5eaf02c9
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/app/qbs/commandlinefrontend.cpp | 46 | ||||
-rw-r--r-- | src/app/qbs/commandlinefrontend.h | 5 |
2 files changed, 31 insertions, 20 deletions
diff --git a/src/app/qbs/commandlinefrontend.cpp b/src/app/qbs/commandlinefrontend.cpp index c1e9415c9..2deaf33e7 100644 --- a/src/app/qbs/commandlinefrontend.cpp +++ b/src/app/qbs/commandlinefrontend.cpp @@ -376,8 +376,10 @@ void CommandLineFrontend::handleProjectsResolved() case StatusCommandType: qApp->exit(printStatus(m_projects.first().projectData())); break; - case BuildCommandType: case GenerateCommandType: + checkGeneratorName(); + Q_FALLTHROUGH(); + case BuildCommandType: build(); break; case InstallCommandType: @@ -499,31 +501,35 @@ void CommandLineFrontend::build() m_currentBuildEffort = 0; } -void CommandLineFrontend::generate() +void CommandLineFrontend::checkGeneratorName() { const QString generatorName = m_parser.generateOptions().generatorName(); - auto generator = ProjectGeneratorManager::findGenerator(generatorName); - if (!generator) { - const auto generatorNames = ProjectGeneratorManager::loadedGeneratorNames(); - if (!generatorNames.empty()) { - const QString generatorNamesString = generatorNames.join(QLatin1String("\n\t")); - if (!generatorName.isEmpty()) { - throw ErrorInfo(Tr::tr("No generator named '%1'. Available generators:\n\t%2") - .arg(generatorName, generatorNamesString)); - } - - throw ErrorInfo(Tr::tr("No generator specified. Available generators:\n\t%1") - .arg(generatorNamesString)); + m_generator = ProjectGeneratorManager::findGenerator(generatorName); + if (m_generator) + return; + const auto generatorNames = ProjectGeneratorManager::loadedGeneratorNames(); + if (!generatorNames.empty()) { + const QString generatorNamesString = generatorNames.join(QLatin1String("\n\t")); + if (!generatorName.isEmpty()) { + throw ErrorInfo(Tr::tr("No generator named '%1'. Available generators:\n\t%2") + .arg(generatorName, generatorNamesString)); } - throw ErrorInfo(Tr::tr("No generator specified or no generators are available.")); + throw ErrorInfo(Tr::tr("No generator specified. Available generators:\n\t%1") + .arg(generatorNamesString)); } - generator->generate(m_projects, - m_parser.buildConfigurations(), - m_parser.installOptions(QString()), - m_parser.settingsDir(), - ConsoleLogger::instance(m_settings)); + throw ErrorInfo(Tr::tr("No generator specified or no generators are available.")); +} + +void CommandLineFrontend::generate() +{ + QBS_CHECK(!!m_generator); + m_generator->generate(m_projects, + m_parser.buildConfigurations(), + m_parser.installOptions(QString()), + m_parser.settingsDir(), + ConsoleLogger::instance(m_settings)); } int CommandLineFrontend::runTarget() diff --git a/src/app/qbs/commandlinefrontend.h b/src/app/qbs/commandlinefrontend.h index ab37f6c8a..9fc1f2c5b 100644 --- a/src/app/qbs/commandlinefrontend.h +++ b/src/app/qbs/commandlinefrontend.h @@ -47,6 +47,8 @@ #include <QtCore/qlist.h> #include <QtCore/qobject.h> +#include <memory> + QT_BEGIN_NAMESPACE class QTimer; QT_END_NAMESPACE @@ -56,6 +58,7 @@ class AbstractJob; class ConsoleProgressObserver; class ErrorInfo; class ProcessResult; +class ProjectGenerator; class Settings; class CommandLineFrontend : public QObject @@ -88,6 +91,7 @@ private: void makeClean(); int runShell(); void build(); + void checkGeneratorName(); void generate(); int runTarget(); void updateTimestamps(); @@ -118,6 +122,7 @@ private: int m_totalBuildEffort; int m_currentBuildEffort; QHash<AbstractJob *, int> m_buildEfforts; + std::shared_ptr<ProjectGenerator> m_generator; }; } // namespace qbs |