diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index 08e4c179373..06bc76a0ea4 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -94,6 +94,9 @@ QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id) connect(this, &QbsBuildConfiguration::qbsConfigurationChanged, this, &QbsBuildConfiguration::triggerReparseIfActive); + macroExpander()->registerVariable("CurrentBuild:QbsBuildRoot", tr("The qbs project build root"), + [this] { return buildDirectory().pathAppended(configurationName()).toUserOutput(); }); + m_buildSystem = new QbsBuildSystem(this); } @@ -304,7 +307,7 @@ public: bs = static_cast(m_qbsInstallStep->deployConfiguration() ->target()->activeBuildConfiguration())->qbsStep(); } - if (bs && bs->hasCustomInstallRoot()) + if (bs) return bs->installRoot(); return Utils::FilePath(); } diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 38f20db7328..d86a4c68d8e 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -227,7 +227,7 @@ QVariantMap QbsBuildStep::qbsConfiguration(VariableHandling variableHandling) co else config.remove(Constants::QBS_CONFIG_QUICK_DEBUG_KEY); if (variableHandling == ExpandVariables) { - const Utils::MacroExpander *expander = Utils::globalMacroExpander(); + const MacroExpander * const expander = buildConfiguration()->macroExpander(); for (auto it = config.begin(), end = config.end(); it != end; ++it) { const QString rawString = it.value().toString(); const QString expandedString = expander->expand(rawString); @@ -264,10 +264,10 @@ Utils::FilePath QbsBuildStep::installRoot(VariableHandling variableHandling) con qbsConfiguration(variableHandling).value(Constants::QBS_INSTALL_ROOT_KEY).toString(); if (!root.isNull()) return Utils::FilePath::fromString(root); - - const QbsBuildConfiguration * const bc - = static_cast(buildConfiguration()); - return bc->buildDirectory().pathAppended(bc->configurationName()).pathAppended("install-root"); + QString defaultInstallDir = QbsSettings::defaultInstallDirTemplate(); + if (variableHandling == VariableHandling::ExpandVariables) + defaultInstallDir = buildConfiguration()->macroExpander()->expand(defaultInstallDir); + return FilePath::fromString(defaultInstallDir); } int QbsBuildStep::maxJobs() const @@ -640,6 +640,9 @@ QbsBuildStepConfigWidget::QbsBuildStepConfigWidget(QbsBuildStep *step) : auto chooser = new Core::VariableChooser(this); chooser->addSupportedWidget(propertyEdit); chooser->addSupportedWidget(installDirChooser->lineEdit()); + chooser->addMacroExpanderProvider([step] { + return step->buildConfiguration()->macroExpander(); + }); propertyEdit->setValidationFunction([this](FancyLineEdit *edit, QString *errorMessage) { return validateProperties(edit, errorMessage); }); @@ -868,7 +871,7 @@ bool QbsBuildStepConfigWidget::validateProperties(Utils::FancyLineEdit *edit, QS } QList properties; - const Utils::MacroExpander *expander = Utils::globalMacroExpander(); + const MacroExpander * const expander = step()->buildConfiguration()->macroExpander(); foreach (const QString &rawArg, argList) { int pos = rawArg.indexOf(':'); if (pos > 0) { diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index c656a10575a..008cf06921c 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -35,6 +35,7 @@ #include "qbsprojectmanagerconstants.h" #include "qbsnodetreebuilder.h" #include "qbssession.h" +#include "qbssettings.h" #include #include @@ -592,6 +593,10 @@ void QbsBuildSystem::parseCurrentBuildConfiguration() } QVariantMap config = m_buildConfiguration->qbsConfiguration(); + if (!config.contains(Constants::QBS_INSTALL_ROOT_KEY)) { + config.insert(Constants::QBS_INSTALL_ROOT_KEY, m_buildConfiguration->macroExpander() + ->expand(QbsSettings::defaultInstallDirTemplate())); + } Environment env = m_buildConfiguration->environment(); QString dir = m_buildConfiguration->buildDirectory().toString(); diff --git a/src/plugins/qbsprojectmanager/qbssettings.cpp b/src/plugins/qbsprojectmanager/qbssettings.cpp index b79ceb9a6b5..649908c2219 100644 --- a/src/plugins/qbsprojectmanager/qbssettings.cpp +++ b/src/plugins/qbsprojectmanager/qbssettings.cpp @@ -46,11 +46,13 @@ namespace QbsProjectManager { namespace Internal { const char QBS_EXE_KEY[] = "QbsProjectManager/QbsExecutable"; +const char QBS_DEFAULT_INSTALL_DIR_KEY[] = "QbsProjectManager/DefaultInstallDir"; const char USE_CREATOR_SETTINGS_KEY[] = "QbsProjectManager/useCreatorDir"; static bool operator==(const QbsSettingsData &s1, const QbsSettingsData &s2) { return s1.qbsExecutableFilePath == s2.qbsExecutableFilePath + && s1.defaultInstallDirTemplate == s2.defaultInstallDirTemplate && s1.useCreatorSettings == s2.useCreatorSettings; } static bool operator!=(const QbsSettingsData &s1, const QbsSettingsData &s2) @@ -71,6 +73,11 @@ FilePath QbsSettings::qbsExecutableFilePath() return candidate; } +QString QbsSettings::defaultInstallDirTemplate() +{ + return instance().m_settings.defaultInstallDirTemplate; +} + bool QbsSettings::useCreatorSettingsDirForQbs() { return instance().m_settings.useCreatorSettings; @@ -105,6 +112,8 @@ void QbsSettings::loadSettings() { QSettings * const s = Core::ICore::settings(); m_settings.qbsExecutableFilePath = FilePath::fromString(s->value(QBS_EXE_KEY).toString()); + m_settings.defaultInstallDirTemplate = s->value(QBS_DEFAULT_INSTALL_DIR_KEY, + "%{CurrentBuild:QbsBuildRoot}").toString(); m_settings.useCreatorSettings = s->value(USE_CREATOR_SETTINGS_KEY, true).toBool(); } @@ -112,6 +121,7 @@ void QbsSettings::storeSettings() const { QSettings * const s = Core::ICore::settings(); s->setValue(QBS_EXE_KEY, m_settings.qbsExecutableFilePath.toString()); + s->setValue(QBS_DEFAULT_INSTALL_DIR_KEY, m_settings.defaultInstallDirTemplate); s->setValue(USE_CREATOR_SETTINGS_KEY, m_settings.useCreatorSettings); } @@ -123,6 +133,7 @@ public: { m_qbsExePathChooser.setExpectedKind(PathChooser::ExistingCommand); m_qbsExePathChooser.setFileName(QbsSettings::qbsExecutableFilePath()); + m_defaultInstallDirLineEdit.setText(QbsSettings::defaultInstallDirTemplate()); m_versionLabel.setText(getQbsVersion()); m_settingsDirCheckBox.setText(tr("Use %1 settings directory for Qbs") .arg(Core::Constants::IDE_DISPLAY_NAME)); @@ -131,6 +142,7 @@ public: const auto layout = new QFormLayout(this); layout->addRow(&m_settingsDirCheckBox); layout->addRow(tr("Path to qbs executable:"), &m_qbsExePathChooser); + layout->addRow(tr("Default installation directory:"), &m_defaultInstallDirLineEdit); layout->addRow(tr("Qbs version:"), &m_versionLabel); } @@ -139,6 +151,7 @@ public: QbsSettingsData settings; if (m_qbsExePathChooser.isValid()) settings.qbsExecutableFilePath = m_qbsExePathChooser.fileName(); + settings.defaultInstallDirTemplate = m_defaultInstallDirLineEdit.text(); settings.useCreatorSettings = m_settingsDirCheckBox.isChecked(); QbsSettings::setSettingsData(settings); } @@ -158,6 +171,7 @@ private: PathChooser m_qbsExePathChooser; QLabel m_versionLabel; QCheckBox m_settingsDirCheckBox; + FancyLineEdit m_defaultInstallDirLineEdit; }; QbsSettingsPage::QbsSettingsPage() diff --git a/src/plugins/qbsprojectmanager/qbssettings.h b/src/plugins/qbsprojectmanager/qbssettings.h index e636da65d35..024416db155 100644 --- a/src/plugins/qbsprojectmanager/qbssettings.h +++ b/src/plugins/qbsprojectmanager/qbssettings.h @@ -37,6 +37,7 @@ namespace Internal { class QbsSettingsData { public: Utils::FilePath qbsExecutableFilePath; + QString defaultInstallDirTemplate; bool useCreatorSettings = true; }; @@ -47,6 +48,7 @@ public: static QbsSettings &instance(); static Utils::FilePath qbsExecutableFilePath(); + static QString defaultInstallDirTemplate(); static bool useCreatorSettingsDirForQbs(); static QString qbsSettingsBaseDir();