diff options
author | Jake Petroules <jake.petroules@petroules.com> | 2013-11-20 17:09:41 -0500 |
---|---|---|
committer | Jake Petroules <jake.petroules@petroules.com> | 2013-11-26 16:13:35 +0100 |
commit | dbb39fc1fce3686a5161d68e89e96086fc664556 (patch) | |
tree | 7651a5a1e885805eaec99105abcaf61bd865667f /src/app | |
parent | d7656eef2decad018759cae7f18c4e66c3a688bf (diff) |
Support specifying the Qbs build directory as a command line option.
Also supports changing the default build directory ('.') using the
'preferences.defaultBuildDirectory' property.
Task-number: QBS-462
Change-Id: Id3d05d2f5b14197bd3af2e7f9d55bdd263809716
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/app')
-rw-r--r-- | src/app/qbs/commandlinefrontend.cpp | 2 | ||||
-rw-r--r-- | src/app/qbs/parser/command.cpp | 4 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoption.cpp | 33 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoption.h | 17 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoptionpool.cpp | 8 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineoptionpool.h | 1 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineparser.cpp | 29 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineparser.h | 1 |
8 files changed, 94 insertions, 1 deletions
diff --git a/src/app/qbs/commandlinefrontend.cpp b/src/app/qbs/commandlinefrontend.cpp index a2264c497..2cbd087d0 100644 --- a/src/app/qbs/commandlinefrontend.cpp +++ b/src/app/qbs/commandlinefrontend.cpp @@ -121,7 +121,7 @@ void CommandLineFrontend::start() + QLatin1String("/../")); SetupProjectParameters params; params.setProjectFilePath(m_parser.projectFilePath()); - params.setBuildRoot(QDir::currentPath()); + params.setBuildRoot(m_parser.projectBuildDirectory()); params.setSearchPaths(Preferences(m_settings).searchPaths(qbsRootPath)); params.setPluginPaths(Preferences(m_settings).pluginPaths(qbsRootPath)); params.setIgnoreDifferentProjectFilePath(m_parser.force()); diff --git a/src/app/qbs/parser/command.cpp b/src/app/qbs/parser/command.cpp index c9f24a36a..f20eedf35 100644 --- a/src/app/qbs/parser/command.cpp +++ b/src/app/qbs/parser/command.cpp @@ -169,6 +169,7 @@ static QList<CommandLineOption::Type> resolveOptions() { return QList<CommandLineOption::Type>() << CommandLineOption::FileOptionType + << CommandLineOption::BuildDirectoryOptionType << CommandLineOption::LogLevelOptionType << CommandLineOption::VerboseOptionType << CommandLineOption::QuietOptionType @@ -345,6 +346,7 @@ QList<CommandLineOption::Type> ShellCommand::supportedOptions() const { return QList<CommandLineOption::Type>() << CommandLineOption::FileOptionType + << CommandLineOption::BuildDirectoryOptionType << CommandLineOption::LogLevelOptionType << CommandLineOption::VerboseOptionType << CommandLineOption::QuietOptionType @@ -375,6 +377,7 @@ QList<CommandLineOption::Type> StatusCommand::supportedOptions() const { return QList<CommandLineOption::Type>() << CommandLineOption::FileOptionType + << CommandLineOption::BuildDirectoryOptionType << CommandLineOption::LogLevelOptionType << CommandLineOption::VerboseOptionType << CommandLineOption::QuietOptionType @@ -408,6 +411,7 @@ QList<CommandLineOption::Type> UpdateTimestampsCommand::supportedOptions() const { return QList<CommandLineOption::Type>() << CommandLineOption::FileOptionType + << CommandLineOption::BuildDirectoryOptionType << CommandLineOption::LogLevelOptionType << CommandLineOption::VerboseOptionType << CommandLineOption::QuietOptionType diff --git a/src/app/qbs/parser/commandlineoption.cpp b/src/app/qbs/parser/commandlineoption.cpp index c9d21c405..21fe05b41 100644 --- a/src/app/qbs/parser/commandlineoption.cpp +++ b/src/app/qbs/parser/commandlineoption.cpp @@ -81,6 +81,39 @@ void FileOption::doParse(const QString &representation, QStringList &input) m_projectFilePath = getArgument(representation, input); } +QString BuildDirectoryOption::description(CommandType command) const +{ + Q_UNUSED(command); + return Tr::tr("%1|%2 <directory>\n" + "\tBuild in the given directory. The default value is the current directory\n" + "\tunless preferences.defaultBuildDirectory is set.\n" + "\tRelative paths will be interpreted relative to the current directory.\n" + "\tIf the directory does not exist, it will be created. Use the special\n" + "\tvalue '%3' as a placeholder for the name of the directory\n" + "\tcontaining the project file.\n") + .arg(longRepresentation(), shortRepresentation(), magicProjectString()); +} + +QString BuildDirectoryOption::shortRepresentation() const +{ + return QLatin1String("-d"); +} + +QString BuildDirectoryOption::longRepresentation() const +{ + return QLatin1String("--build-directory"); +} + +QString BuildDirectoryOption::magicProjectString() +{ + return QLatin1String("@project"); +} + +void BuildDirectoryOption::doParse(const QString &representation, QStringList &input) +{ + m_projectBuildDirectory = getArgument(representation, input); +} + static QString loglevelLongRepresentation() { return QLatin1String("--log-level"); } QString VerboseOption::description(CommandType command) const diff --git a/src/app/qbs/parser/commandlineoption.h b/src/app/qbs/parser/commandlineoption.h index 8457ef4cb..585128d7a 100644 --- a/src/app/qbs/parser/commandlineoption.h +++ b/src/app/qbs/parser/commandlineoption.h @@ -40,6 +40,7 @@ class CommandLineOption public: enum Type { FileOptionType, + BuildDirectoryOptionType, LogLevelOptionType, VerboseOptionType, QuietOptionType, JobsOptionType, KeepGoingOptionType, @@ -87,6 +88,22 @@ private: QString m_projectFilePath; }; +class BuildDirectoryOption : public CommandLineOption +{ +public: + QString projectBuildDirectory() const { return m_projectBuildDirectory; } + static QString magicProjectString(); + +private: + QString description(CommandType command) const; + QString shortRepresentation() const; + QString longRepresentation() const; + void doParse(const QString &representation, QStringList &input); + +private: + QString m_projectBuildDirectory; +}; + class CountingOption : public CommandLineOption { public: diff --git a/src/app/qbs/parser/commandlineoptionpool.cpp b/src/app/qbs/parser/commandlineoptionpool.cpp index a7a0d7ab7..d675700d8 100644 --- a/src/app/qbs/parser/commandlineoptionpool.cpp +++ b/src/app/qbs/parser/commandlineoptionpool.cpp @@ -43,6 +43,9 @@ CommandLineOption *CommandLineOptionPool::getOption(CommandLineOption::Type type case CommandLineOption::FileOptionType: option = new FileOption; break; + case CommandLineOption::BuildDirectoryOptionType: + option = new BuildDirectoryOption; + break; case CommandLineOption::LogLevelOptionType: option = new LogLevelOption; break; @@ -101,6 +104,11 @@ FileOption *CommandLineOptionPool::fileOption() const return static_cast<FileOption *>(getOption(CommandLineOption::FileOptionType)); } +BuildDirectoryOption *CommandLineOptionPool::buildDirectoryOption() const +{ + return static_cast<BuildDirectoryOption *>(getOption(CommandLineOption::BuildDirectoryOptionType)); +} + LogLevelOption *CommandLineOptionPool::logLevelOption() const { return static_cast<LogLevelOption *>(getOption(CommandLineOption::LogLevelOptionType)); diff --git a/src/app/qbs/parser/commandlineoptionpool.h b/src/app/qbs/parser/commandlineoptionpool.h index 46c36a9d9..ccb5b0421 100644 --- a/src/app/qbs/parser/commandlineoptionpool.h +++ b/src/app/qbs/parser/commandlineoptionpool.h @@ -42,6 +42,7 @@ public: CommandLineOption *getOption(CommandLineOption::Type type) const; FileOption *fileOption() const; + BuildDirectoryOption *buildDirectoryOption() const; LogLevelOption *logLevelOption() const; VerboseOption *verboseOption() const; QuietOption *quietOption() const; diff --git a/src/app/qbs/parser/commandlineparser.cpp b/src/app/qbs/parser/commandlineparser.cpp index 40c0fa3e2..46d1e6173 100644 --- a/src/app/qbs/parser/commandlineparser.cpp +++ b/src/app/qbs/parser/commandlineparser.cpp @@ -69,6 +69,7 @@ public: QString generalHelp() const; void setupProjectFile(); + void setupBuildDirectory(); void setupProgress(); void setupLogLevel(); void setupBuildOptions(); @@ -81,6 +82,7 @@ public: Settings *settings; Command *command; QString projectFilePath; + QString projectBuildDirectory; BuildOptions buildOptions; CommandLineOptionPool optionPool; CommandPool commandPool; @@ -129,6 +131,11 @@ QString CommandLineParser::projectFilePath() const return d->projectFilePath; } +QString CommandLineParser::projectBuildDirectory() const +{ + return d->projectBuildDirectory; +} + BuildOptions CommandLineParser::buildOptions() const { return d->buildOptions; @@ -351,6 +358,7 @@ void CommandLineParser::CommandLineParserPrivate::doParse() return; setupProjectFile(); + setupBuildDirectory(); setupProgress(); setupLogLevel(); setupBuildOptions(); @@ -464,6 +472,27 @@ void CommandLineParser::CommandLineParserPrivate::setupProjectFile() qbsDebug() << "Using project file '" << QDir::toNativeSeparators(projectFilePath) << "'."; } +void CommandLineParser::CommandLineParserPrivate::setupBuildDirectory() +{ + projectBuildDirectory = optionPool.buildDirectoryOption()->projectBuildDirectory(); + if (projectBuildDirectory.isEmpty()) { + projectBuildDirectory = Preferences(settings).defaultBuildDirectory(); + if (projectBuildDirectory.isEmpty()) { + qbsDebug() << "No project build directory given; using current directory."; + projectBuildDirectory = QDir::currentPath(); + } else { + qbsDebug() << "No project build directory given; using directory from preferences."; + } + } + + QDir dir(QFileInfo(projectFilePath).path()); + projectBuildDirectory.replace(optionPool.buildDirectoryOption()->magicProjectString(), + dir.dirName()); + + if (!QFileInfo(projectBuildDirectory).isAbsolute()) + projectBuildDirectory = QDir::currentPath() + QLatin1Char('/') + projectBuildDirectory; +} + void CommandLineParser::CommandLineParserPrivate::setupBuildOptions() { buildOptions.setDryRun(dryRun()); diff --git a/src/app/qbs/parser/commandlineparser.h b/src/app/qbs/parser/commandlineparser.h index 16994437c..e6a0dded7 100644 --- a/src/app/qbs/parser/commandlineparser.h +++ b/src/app/qbs/parser/commandlineparser.h @@ -54,6 +54,7 @@ public: QString commandName() const; QString commandDescription() const; QString projectFilePath() const; + QString projectBuildDirectory() const; BuildOptions buildOptions() const; CleanOptions cleanOptions() const; InstallOptions installOptions() const; |