From fd761cd79056659f55ffe600cac499044a96e74c Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 12 May 2016 17:23:03 +0200 Subject: CMake: Warn if kit settings are overridden by the project Change-Id: I8f01b267f27617d6561124d173ac2e5ae5b9f4d6 Reviewed-by: Tim Jenssen --- .../cmakebuildconfiguration.cpp | 29 ++++++++++++++++ .../cmakeprojectmanager/cmakebuildconfiguration.h | 4 +++ .../cmakebuildsettingswidget.cpp | 39 +++++++++++++++++----- .../cmakeprojectmanager/cmakebuildsettingswidget.h | 3 ++ .../cmakeprojectmanager/cmakeconfigitem.cpp | 10 ++++++ src/plugins/cmakeprojectmanager/cmakeconfigitem.h | 3 +- 6 files changed, 79 insertions(+), 9 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 57f8c36303..d6d274d956 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -300,6 +300,22 @@ static CMakeConfig removeDuplicates(const CMakeConfig &config) void CMakeBuildConfiguration::setCMakeConfiguration(const CMakeConfig &config) { m_configuration = removeDuplicates(config); + + const Kit *k = target()->kit(); + CMakeConfig kitConfig = CMakeConfigurationKitInformation::configuration(k); + bool hasKitOverride = false; + foreach (const CMakeConfigItem &i, m_configuration) { + const QString b = CMakeConfigItem::expandedValueOf(k, i.key, kitConfig); + if (!b.isNull() && i.expandedValue(k) != b) { + hasKitOverride = true; + break; + } + } + + if (hasKitOverride) + setWarning(tr("CMake Configuration set by the Kit was overridden in the project.")); + else + setWarning(QString()); } CMakeConfig CMakeBuildConfiguration::cmakeConfiguration() const @@ -316,11 +332,24 @@ void CMakeBuildConfiguration::setError(const QString &message) emit errorOccured(m_error); } +void CMakeBuildConfiguration::setWarning(const QString &message) +{ + if (m_warning == message) + return; + m_warning = message; + emit warningOccured(m_warning); +} + QString CMakeBuildConfiguration::error() const { return m_error; } +QString CMakeBuildConfiguration::warning() const +{ + return m_warning; +} + ProjectExplorer::NamedWidget *CMakeBuildConfiguration::createConfigWidget() { return new CMakeBuildSettingsWidget(this); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 01a6910240..fa59e677a4 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -68,6 +68,7 @@ public: CMakeConfig cmakeConfiguration() const; QString error() const; + QString warning() const; BuildDirManager *buildDirManager() const; @@ -83,6 +84,7 @@ public: signals: void errorOccured(const QString &message); + void warningOccured(const QString &message); void parsingStarted(); void dataAvailable(); @@ -97,9 +99,11 @@ private: void setCurrentCMakeConfiguration(const QList &items); void setError(const QString &message); + void setWarning(const QString &message); CMakeConfig m_configuration; QString m_error; + QString m_warning; mutable QList m_completeConfigurationCache; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp index 1fa335b8bd..2e1eae5709 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp @@ -108,6 +108,17 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) boxLayout->addWidget(m_errorMessageLabel); mainLayout->addLayout(boxLayout, row, 0, 1, 3, Qt::AlignHCenter); + ++row; + m_warningLabel = new QLabel; + m_warningLabel->setPixmap(Core::Icons::WARNING.pixmap()); + m_warningLabel->setVisible(false); + m_warningMessageLabel = new QLabel; + m_warningMessageLabel->setVisible(false); + auto boxLayout2 = new QHBoxLayout; + boxLayout2->addWidget(m_warningLabel); + boxLayout2->addWidget(m_warningMessageLabel); + mainLayout->addLayout(boxLayout2, row, 0, 1, 3, Qt::AlignHCenter); + ++row; mainLayout->addItem(new QSpacerItem(20, 10), row, 0); @@ -161,6 +172,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) updateAdvancedCheckBox(); setError(bc->error()); + setWarning(bc->warning()); connect(project, &CMakeProject::parsingStarted, this, [this]() { updateButtonState(); @@ -203,22 +215,33 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) }); connect(bc, &CMakeBuildConfiguration::errorOccured, this, &CMakeBuildSettingsWidget::setError); + connect(bc, &CMakeBuildConfiguration::warningOccured, this, &CMakeBuildSettingsWidget::setWarning); } void CMakeBuildSettingsWidget::setError(const QString &message) { - bool showWarning = !message.isEmpty(); - m_errorLabel->setVisible(showWarning); + bool showError = !message.isEmpty(); + m_errorLabel->setVisible(showError); m_errorLabel->setToolTip(message); - m_errorMessageLabel->setVisible(showWarning); + m_errorMessageLabel->setVisible(showError); m_errorMessageLabel->setText(message); m_errorMessageLabel->setToolTip(message); - m_configView->setVisible(!showWarning); - m_editButton->setVisible(!showWarning); - m_resetButton->setVisible(!showWarning); - m_showAdvancedCheckBox->setVisible(!showWarning); - m_reconfigureButton->setVisible(!showWarning); + m_configView->setVisible(!showError); + m_editButton->setVisible(!showError); + m_resetButton->setVisible(!showError); + m_showAdvancedCheckBox->setVisible(!showError); + m_reconfigureButton->setVisible(!showError); +} + +void CMakeBuildSettingsWidget::setWarning(const QString &message) +{ + bool showWarning = !message.isEmpty(); + m_warningLabel->setVisible(showWarning); + m_warningLabel->setToolTip(message); + m_warningMessageLabel->setVisible(showWarning); + m_warningMessageLabel->setText(message); + m_warningMessageLabel->setToolTip(message); } void CMakeBuildSettingsWidget::updateButtonState() diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h index af09ac323e..3ea2b984f5 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h @@ -54,6 +54,7 @@ public: CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc); void setError(const QString &message); + void setWarning(const QString &message); private: void updateButtonState(); @@ -70,7 +71,9 @@ private: QPushButton *m_reconfigureButton; QTimer m_showProgressTimer; QLabel *m_errorLabel; + QLabel *m_warningLabel; QLabel *m_errorMessageLabel; + QLabel *m_warningMessageLabel; }; } // namespace Internal diff --git a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp index 65d55bc217..85b442fc64 100644 --- a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp @@ -63,6 +63,16 @@ QByteArray CMakeConfigItem::valueOf(const QByteArray &key, const QList &input) +{ + for (auto it = input.constBegin(); it != input.constEnd(); ++it) { + if (it->key == key) + return it->expandedValue(k); + } + return QString(); +} + QString CMakeConfigItem::expandedValue(const ProjectExplorer::Kit *k) const { return k->macroExpander()->expand(QString::fromUtf8(value)); diff --git a/src/plugins/cmakeprojectmanager/cmakeconfigitem.h b/src/plugins/cmakeprojectmanager/cmakeconfigitem.h index 86cfc17971..616bbb4fc2 100644 --- a/src/plugins/cmakeprojectmanager/cmakeconfigitem.h +++ b/src/plugins/cmakeprojectmanager/cmakeconfigitem.h @@ -43,7 +43,8 @@ public: CMakeConfigItem(const QByteArray &k, const QByteArray &v); static QByteArray valueOf(const QByteArray &key, const QList &input); - + static QString expandedValueOf(const ProjectExplorer::Kit *k, const QByteArray &key, + const QList &input); bool isNull() const { return key.isEmpty(); } QString expandedValue(const ProjectExplorer::Kit *k) const; -- cgit v1.2.1