aboutsummaryrefslogtreecommitdiffstats
path: root/src/app
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@petroules.com>2013-11-20 17:09:41 -0500
committerJake Petroules <jake.petroules@petroules.com>2013-11-26 16:13:35 +0100
commitdbb39fc1fce3686a5161d68e89e96086fc664556 (patch)
tree7651a5a1e885805eaec99105abcaf61bd865667f /src/app
parentd7656eef2decad018759cae7f18c4e66c3a688bf (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.cpp2
-rw-r--r--src/app/qbs/parser/command.cpp4
-rw-r--r--src/app/qbs/parser/commandlineoption.cpp33
-rw-r--r--src/app/qbs/parser/commandlineoption.h17
-rw-r--r--src/app/qbs/parser/commandlineoptionpool.cpp8
-rw-r--r--src/app/qbs/parser/commandlineoptionpool.h1
-rw-r--r--src/app/qbs/parser/commandlineparser.cpp29
-rw-r--r--src/app/qbs/parser/commandlineparser.h1
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;