QbsProjectManager: Let users provide a default install root

Fixes: QTCREATORBUG-12983
Change-Id: I016d298aaf8abc0d96267115225ab825bdd039e9
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2019-11-21 17:07:11 +01:00
parent fd8afd564f
commit 142d4ddb28
5 changed files with 34 additions and 7 deletions

View File

@@ -94,6 +94,9 @@ QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id)
connect(this, &QbsBuildConfiguration::qbsConfigurationChanged, connect(this, &QbsBuildConfiguration::qbsConfigurationChanged,
this, &QbsBuildConfiguration::triggerReparseIfActive); this, &QbsBuildConfiguration::triggerReparseIfActive);
macroExpander()->registerVariable("CurrentBuild:QbsBuildRoot", tr("The qbs project build root"),
[this] { return buildDirectory().pathAppended(configurationName()).toUserOutput(); });
m_buildSystem = new QbsBuildSystem(this); m_buildSystem = new QbsBuildSystem(this);
} }
@@ -304,7 +307,7 @@ public:
bs = static_cast<QbsBuildConfiguration *>(m_qbsInstallStep->deployConfiguration() bs = static_cast<QbsBuildConfiguration *>(m_qbsInstallStep->deployConfiguration()
->target()->activeBuildConfiguration())->qbsStep(); ->target()->activeBuildConfiguration())->qbsStep();
} }
if (bs && bs->hasCustomInstallRoot()) if (bs)
return bs->installRoot(); return bs->installRoot();
return Utils::FilePath(); return Utils::FilePath();
} }

View File

@@ -227,7 +227,7 @@ QVariantMap QbsBuildStep::qbsConfiguration(VariableHandling variableHandling) co
else else
config.remove(Constants::QBS_CONFIG_QUICK_DEBUG_KEY); config.remove(Constants::QBS_CONFIG_QUICK_DEBUG_KEY);
if (variableHandling == ExpandVariables) { 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) { for (auto it = config.begin(), end = config.end(); it != end; ++it) {
const QString rawString = it.value().toString(); const QString rawString = it.value().toString();
const QString expandedString = expander->expand(rawString); 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(); qbsConfiguration(variableHandling).value(Constants::QBS_INSTALL_ROOT_KEY).toString();
if (!root.isNull()) if (!root.isNull())
return Utils::FilePath::fromString(root); return Utils::FilePath::fromString(root);
QString defaultInstallDir = QbsSettings::defaultInstallDirTemplate();
const QbsBuildConfiguration * const bc if (variableHandling == VariableHandling::ExpandVariables)
= static_cast<QbsBuildConfiguration *>(buildConfiguration()); defaultInstallDir = buildConfiguration()->macroExpander()->expand(defaultInstallDir);
return bc->buildDirectory().pathAppended(bc->configurationName()).pathAppended("install-root"); return FilePath::fromString(defaultInstallDir);
} }
int QbsBuildStep::maxJobs() const int QbsBuildStep::maxJobs() const
@@ -640,6 +640,9 @@ QbsBuildStepConfigWidget::QbsBuildStepConfigWidget(QbsBuildStep *step) :
auto chooser = new Core::VariableChooser(this); auto chooser = new Core::VariableChooser(this);
chooser->addSupportedWidget(propertyEdit); chooser->addSupportedWidget(propertyEdit);
chooser->addSupportedWidget(installDirChooser->lineEdit()); chooser->addSupportedWidget(installDirChooser->lineEdit());
chooser->addMacroExpanderProvider([step] {
return step->buildConfiguration()->macroExpander();
});
propertyEdit->setValidationFunction([this](FancyLineEdit *edit, QString *errorMessage) { propertyEdit->setValidationFunction([this](FancyLineEdit *edit, QString *errorMessage) {
return validateProperties(edit, errorMessage); return validateProperties(edit, errorMessage);
}); });
@@ -868,7 +871,7 @@ bool QbsBuildStepConfigWidget::validateProperties(Utils::FancyLineEdit *edit, QS
} }
QList<Property> properties; QList<Property> properties;
const Utils::MacroExpander *expander = Utils::globalMacroExpander(); const MacroExpander * const expander = step()->buildConfiguration()->macroExpander();
foreach (const QString &rawArg, argList) { foreach (const QString &rawArg, argList) {
int pos = rawArg.indexOf(':'); int pos = rawArg.indexOf(':');
if (pos > 0) { if (pos > 0) {

View File

@@ -35,6 +35,7 @@
#include "qbsprojectmanagerconstants.h" #include "qbsprojectmanagerconstants.h"
#include "qbsnodetreebuilder.h" #include "qbsnodetreebuilder.h"
#include "qbssession.h" #include "qbssession.h"
#include "qbssettings.h"
#include <coreplugin/documentmanager.h> #include <coreplugin/documentmanager.h>
#include <coreplugin/icontext.h> #include <coreplugin/icontext.h>
@@ -592,6 +593,10 @@ void QbsBuildSystem::parseCurrentBuildConfiguration()
} }
QVariantMap config = m_buildConfiguration->qbsConfiguration(); 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(); Environment env = m_buildConfiguration->environment();
QString dir = m_buildConfiguration->buildDirectory().toString(); QString dir = m_buildConfiguration->buildDirectory().toString();

View File

@@ -46,11 +46,13 @@ namespace QbsProjectManager {
namespace Internal { namespace Internal {
const char QBS_EXE_KEY[] = "QbsProjectManager/QbsExecutable"; const char QBS_EXE_KEY[] = "QbsProjectManager/QbsExecutable";
const char QBS_DEFAULT_INSTALL_DIR_KEY[] = "QbsProjectManager/DefaultInstallDir";
const char USE_CREATOR_SETTINGS_KEY[] = "QbsProjectManager/useCreatorDir"; const char USE_CREATOR_SETTINGS_KEY[] = "QbsProjectManager/useCreatorDir";
static bool operator==(const QbsSettingsData &s1, const QbsSettingsData &s2) static bool operator==(const QbsSettingsData &s1, const QbsSettingsData &s2)
{ {
return s1.qbsExecutableFilePath == s2.qbsExecutableFilePath return s1.qbsExecutableFilePath == s2.qbsExecutableFilePath
&& s1.defaultInstallDirTemplate == s2.defaultInstallDirTemplate
&& s1.useCreatorSettings == s2.useCreatorSettings; && s1.useCreatorSettings == s2.useCreatorSettings;
} }
static bool operator!=(const QbsSettingsData &s1, const QbsSettingsData &s2) static bool operator!=(const QbsSettingsData &s1, const QbsSettingsData &s2)
@@ -71,6 +73,11 @@ FilePath QbsSettings::qbsExecutableFilePath()
return candidate; return candidate;
} }
QString QbsSettings::defaultInstallDirTemplate()
{
return instance().m_settings.defaultInstallDirTemplate;
}
bool QbsSettings::useCreatorSettingsDirForQbs() bool QbsSettings::useCreatorSettingsDirForQbs()
{ {
return instance().m_settings.useCreatorSettings; return instance().m_settings.useCreatorSettings;
@@ -105,6 +112,8 @@ void QbsSettings::loadSettings()
{ {
QSettings * const s = Core::ICore::settings(); QSettings * const s = Core::ICore::settings();
m_settings.qbsExecutableFilePath = FilePath::fromString(s->value(QBS_EXE_KEY).toString()); 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(); 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(); QSettings * const s = Core::ICore::settings();
s->setValue(QBS_EXE_KEY, m_settings.qbsExecutableFilePath.toString()); 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); s->setValue(USE_CREATOR_SETTINGS_KEY, m_settings.useCreatorSettings);
} }
@@ -123,6 +133,7 @@ public:
{ {
m_qbsExePathChooser.setExpectedKind(PathChooser::ExistingCommand); m_qbsExePathChooser.setExpectedKind(PathChooser::ExistingCommand);
m_qbsExePathChooser.setFileName(QbsSettings::qbsExecutableFilePath()); m_qbsExePathChooser.setFileName(QbsSettings::qbsExecutableFilePath());
m_defaultInstallDirLineEdit.setText(QbsSettings::defaultInstallDirTemplate());
m_versionLabel.setText(getQbsVersion()); m_versionLabel.setText(getQbsVersion());
m_settingsDirCheckBox.setText(tr("Use %1 settings directory for Qbs") m_settingsDirCheckBox.setText(tr("Use %1 settings directory for Qbs")
.arg(Core::Constants::IDE_DISPLAY_NAME)); .arg(Core::Constants::IDE_DISPLAY_NAME));
@@ -131,6 +142,7 @@ public:
const auto layout = new QFormLayout(this); const auto layout = new QFormLayout(this);
layout->addRow(&m_settingsDirCheckBox); layout->addRow(&m_settingsDirCheckBox);
layout->addRow(tr("Path to qbs executable:"), &m_qbsExePathChooser); layout->addRow(tr("Path to qbs executable:"), &m_qbsExePathChooser);
layout->addRow(tr("Default installation directory:"), &m_defaultInstallDirLineEdit);
layout->addRow(tr("Qbs version:"), &m_versionLabel); layout->addRow(tr("Qbs version:"), &m_versionLabel);
} }
@@ -139,6 +151,7 @@ public:
QbsSettingsData settings; QbsSettingsData settings;
if (m_qbsExePathChooser.isValid()) if (m_qbsExePathChooser.isValid())
settings.qbsExecutableFilePath = m_qbsExePathChooser.fileName(); settings.qbsExecutableFilePath = m_qbsExePathChooser.fileName();
settings.defaultInstallDirTemplate = m_defaultInstallDirLineEdit.text();
settings.useCreatorSettings = m_settingsDirCheckBox.isChecked(); settings.useCreatorSettings = m_settingsDirCheckBox.isChecked();
QbsSettings::setSettingsData(settings); QbsSettings::setSettingsData(settings);
} }
@@ -158,6 +171,7 @@ private:
PathChooser m_qbsExePathChooser; PathChooser m_qbsExePathChooser;
QLabel m_versionLabel; QLabel m_versionLabel;
QCheckBox m_settingsDirCheckBox; QCheckBox m_settingsDirCheckBox;
FancyLineEdit m_defaultInstallDirLineEdit;
}; };
QbsSettingsPage::QbsSettingsPage() QbsSettingsPage::QbsSettingsPage()

View File

@@ -37,6 +37,7 @@ namespace Internal {
class QbsSettingsData { class QbsSettingsData {
public: public:
Utils::FilePath qbsExecutableFilePath; Utils::FilePath qbsExecutableFilePath;
QString defaultInstallDirTemplate;
bool useCreatorSettings = true; bool useCreatorSettings = true;
}; };
@@ -47,6 +48,7 @@ public:
static QbsSettings &instance(); static QbsSettings &instance();
static Utils::FilePath qbsExecutableFilePath(); static Utils::FilePath qbsExecutableFilePath();
static QString defaultInstallDirTemplate();
static bool useCreatorSettingsDirForQbs(); static bool useCreatorSettingsDirForQbs();
static QString qbsSettingsBaseDir(); static QString qbsSettingsBaseDir();