diff options
-rw-r--r-- | src/app/qbs/commandlinefrontend.cpp | 50 | ||||
-rw-r--r-- | src/app/qbs/commandlinefrontend.h | 2 | ||||
-rw-r--r-- | src/app/qbs/parser/commandlineparser.cpp | 20 | ||||
-rw-r--r-- | src/lib/api/runenvironment.cpp | 6 | ||||
-rw-r--r-- | src/lib/language/language.cpp | 1 | ||||
-rw-r--r-- | src/lib/tools/preferences.cpp | 16 | ||||
-rw-r--r-- | src/lib/tools/preferences.h | 3 |
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 |