aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/app/qbs/commandlinefrontend.cpp50
-rw-r--r--src/app/qbs/commandlinefrontend.h2
-rw-r--r--src/app/qbs/parser/commandlineparser.cpp20
-rw-r--r--src/lib/api/runenvironment.cpp6
-rw-r--r--src/lib/language/language.cpp1
-rw-r--r--src/lib/tools/preferences.cpp16
-rw-r--r--src/lib/tools/preferences.h3
7 files changed, 69 insertions, 29 deletions
diff --git a/src/app/qbs/commandlinefrontend.cpp b/src/app/qbs/commandlinefrontend.cpp
index 6e04223f4..7189a202b 100644
--- a/src/app/qbs/commandlinefrontend.cpp
+++ b/src/app/qbs/commandlinefrontend.cpp
@@ -31,6 +31,7 @@
#include "application.h"
#include "consoleprogressobserver.h"
#include "status.h"
+#include "parser/commandlineoption.h"
#include "../shared/logging/consolelogger.h"
#include <qbs.h>
@@ -121,9 +122,6 @@ void CommandLineFrontend::start()
+ QLatin1String("/../"));
SetupProjectParameters params;
params.setProjectFilePath(m_parser.projectFilePath());
- params.setBuildRoot(m_parser.projectBuildDirectory());
- params.setSearchPaths(Preferences(m_settings).searchPaths(qbsRootPath));
- params.setPluginPaths(Preferences(m_settings).pluginPaths(qbsRootPath));
params.setIgnoreDifferentProjectFilePath(m_parser.force());
params.setDryRun(m_parser.dryRun());
params.setLogElapsedTime(m_parser.logTime());
@@ -134,11 +132,19 @@ void CommandLineFrontend::start()
QVariantMap userConfig = buildConfig;
QString buildVariantKey = QLatin1String("qbs.buildVariant");
baseConfig.insert(buildVariantKey, userConfig.take(buildVariantKey));
+ QString profileName;
const QVariantMap::Iterator it = userConfig.find(QLatin1String("qbs.profile"));
if (it != userConfig.end()) {
+ profileName = it.value().toString();
baseConfig.insert(it.key(), it.value());
userConfig.erase(it);
}
+ if (profileName.isEmpty())
+ profileName = m_settings->defaultProfile();
+ const Preferences prefs(m_settings, profileName);
+ params.setSearchPaths(prefs.searchPaths(qbsRootPath));
+ params.setPluginPaths(prefs.pluginPaths(qbsRootPath));
+ params.setBuildRoot(buildDirectory(profileName));
params.setBuildConfiguration(baseConfig);
params.setOverriddenValues(userConfig);
const ErrorInfo err = params.expandBuildConfiguration(m_settings);
@@ -389,15 +395,49 @@ int CommandLineFrontend::runShell()
return runEnvironment.runShell();
}
+BuildOptions CommandLineFrontend::buildOptions(const Project &project) const
+{
+ BuildOptions options = m_parser.buildOptions();
+ if (options.maxJobCount() <= 0) {
+ const QVariantMap qbsProperties
+ = project.projectConfiguration().value(QLatin1String("qbs")).toMap();
+ const QString profileName = qbsProperties.value(QLatin1String("profile")).toString();
+ QBS_CHECK(!profileName.isEmpty());
+ options.setMaxJobCount(Preferences(m_settings, profileName).jobs());
+ }
+ return options;
+}
+
+QString CommandLineFrontend::buildDirectory(const QString &profileName) const
+{
+ QString buildDir = m_parser.projectBuildDirectory();
+ if (buildDir.isEmpty()) {
+ buildDir = Preferences(m_settings, profileName).defaultBuildDirectory();
+ if (buildDir.isEmpty()) {
+ qbsDebug() << "No project build directory given; using current directory.";
+ buildDir = QDir::currentPath();
+ } else {
+ qbsDebug() << "No project build directory given; using directory from preferences.";
+ }
+ }
+
+ QDir projectDir(QFileInfo(m_parser.projectFilePath()).path());
+ buildDir.replace(BuildDirectoryOption::magicProjectString(), projectDir.dirName());
+ if (!QFileInfo(buildDir).isAbsolute())
+ buildDir = QDir::currentPath() + QLatin1Char('/') + buildDir;
+ buildDir = QDir::cleanPath(buildDir);
+ return buildDir;
+}
+
void CommandLineFrontend::build()
{
if (m_parser.products().isEmpty()) {
foreach (const Project &project, m_projects)
- m_buildJobs << project.buildAllProducts(m_parser.buildOptions(), this);
+ m_buildJobs << project.buildAllProducts(buildOptions(project), this);
} else {
const ProductMap &products = productsToUse();
for (ProductMap::ConstIterator it = products.begin(); it != products.end(); ++it)
- m_buildJobs << it.key().buildSomeProducts(it.value(), m_parser.buildOptions(), this);
+ m_buildJobs << it.key().buildSomeProducts(it.value(), buildOptions(it.key()), this);
}
connectBuildJobs();
diff --git a/src/app/qbs/commandlinefrontend.h b/src/app/qbs/commandlinefrontend.h
index ba95792fd..75091aad7 100644
--- a/src/app/qbs/commandlinefrontend.h
+++ b/src/app/qbs/commandlinefrontend.h
@@ -86,6 +86,8 @@ private:
void connectJob(AbstractJob *job);
void checkForExactlyOneProduct();
void install();
+ BuildOptions buildOptions(const Project &project) const;
+ QString buildDirectory(const QString &profileName) const;
const CommandLineParser &m_parser;
Settings * const m_settings;
diff --git a/src/app/qbs/parser/commandlineparser.cpp b/src/app/qbs/parser/commandlineparser.cpp
index 235e4a4da..69f56e7dd 100644
--- a/src/app/qbs/parser/commandlineparser.cpp
+++ b/src/app/qbs/parser/commandlineparser.cpp
@@ -474,23 +474,6 @@ void CommandLineParser::CommandLineParserPrivate::setupProjectFile()
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;
- projectBuildDirectory = QDir::cleanPath(projectBuildDirectory);
}
void CommandLineParser::CommandLineParserPrivate::setupBuildOptions()
@@ -506,8 +489,7 @@ void CommandLineParser::CommandLineParserPrivate::setupBuildOptions()
buildOptions.setKeepGoing(optionPool.keepGoingOption()->enabled());
buildOptions.setForceTimestampCheck(optionPool.forceTimestampCheckOption()->enabled());
const JobsOption * jobsOption = optionPool.jobsOption();
- buildOptions.setMaxJobCount(jobsOption->jobCount() > 0
- ? jobsOption->jobCount() : Preferences(settings).jobs());
+ buildOptions.setMaxJobCount(jobsOption->jobCount());
buildOptions.setLogElapsedTime(logTime);
}
diff --git a/src/lib/api/runenvironment.cpp b/src/lib/api/runenvironment.cpp
index ed3500ade..43b5c5605 100644
--- a/src/lib/api/runenvironment.cpp
+++ b/src/lib/api/runenvironment.cpp
@@ -44,6 +44,7 @@
#include <QProcessEnvironment>
#include <QScopedPointer>
#include <QTemporaryFile>
+#include <QVariantMap>
#include <stdlib.h>
@@ -102,7 +103,10 @@ int RunEnvironment::runShell()
const QString prompt = environment.value(QLatin1String("PROMPT"));
command += QLatin1String(" /k prompt [qbs] ") + prompt;
} else {
- command = Preferences(d->settings).shell();
+ const QVariantMap qbsProps = d->resolvedProduct->topLevelProject()->buildConfiguration()
+ .value(QLatin1String("qbs")).toMap();
+ const QString profileName = qbsProps.value(QLatin1String("profile")).toString();
+ command = Preferences(d->settings, profileName).shell();
if (command.isEmpty())
command = environment.value(QLatin1String("SHELL"), QLatin1String("/bin/sh"));
diff --git a/src/lib/language/language.cpp b/src/lib/language/language.cpp
index c8e7dd7e5..92622787f 100644
--- a/src/lib/language/language.cpp
+++ b/src/lib/language/language.cpp
@@ -855,6 +855,7 @@ void TopLevelProject::load(PersistentPool &pool)
environment.insert(i.key(), i.value());
pool.stream() >> buildSystemFiles;
buildData.reset(pool.idLoad<ProjectBuildData>());
+ QBS_CHECK(buildData);
buildData->isDirty = false;
}
diff --git a/src/lib/tools/preferences.cpp b/src/lib/tools/preferences.cpp
index cd4d4b3ba..bdff7c67b 100644
--- a/src/lib/tools/preferences.cpp
+++ b/src/lib/tools/preferences.cpp
@@ -30,6 +30,7 @@
#include "buildoptions.h"
#include "hostosinfo.h"
+#include "profile.h"
#include "settings.h"
namespace qbs {
@@ -37,9 +38,11 @@ namespace qbs {
/*!
* \class Preferences
* \brief The \c Preferences class gives access to all general qbs preferences.
+ * If a non-empty \c profileName is given, the profile's preferences take precedence over global
+ * ones. Otherwise, the global preferences are used.
*/
-
-Preferences::Preferences(Settings *settings) : m_settings(settings)
+Preferences::Preferences(Settings *settings, const QString &profileName)
+ : m_settings(settings), m_profile(profileName)
{
}
@@ -109,7 +112,14 @@ QStringList Preferences::pluginPaths(const QString &qbsRootPath) const
QVariant Preferences::getPreference(const QString &key, const QVariant &defaultValue) const
{
- return m_settings->value(QLatin1String("preferences.") + key, defaultValue);
+ const QString fullKey = QLatin1String("preferences.") + key;
+ if (!m_profile.isEmpty()) {
+ const QVariant value = Profile(m_profile, m_settings).value(fullKey);
+ if (value.isValid())
+ return value;
+ }
+
+ return m_settings->value(fullKey, defaultValue);
}
QStringList Preferences::pathList(const QString &key, const QString &defaultValue) const
diff --git a/src/lib/tools/preferences.h b/src/lib/tools/preferences.h
index a2073d615..e5e6c9bb6 100644
--- a/src/lib/tools/preferences.h
+++ b/src/lib/tools/preferences.h
@@ -40,7 +40,7 @@ class Settings;
class QBS_EXPORT Preferences
{
public:
- explicit Preferences(Settings *settings);
+ explicit Preferences(Settings *settings, const QString &profileName = QString());
bool useColoredOutput() const;
int jobs() const;
@@ -54,6 +54,7 @@ private:
QStringList pathList(const QString &key, const QString &defaultValue) const;
Settings *m_settings;
+ QString m_profile;
};
} // namespace qbs