From 924862093e6f23282d239a76e123d0a367b4ff49 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 1 Feb 2022 16:37:52 +0100 Subject: [PATCH] CMakePM: Apply Kit CMake configuration to Initial Configuration When the user changes or adds new CMake Kit parameters, the changes are reflected in the Initial Configuration. Change-Id: Icca1c76749c772e946ff250f94b7965cf7cf9ee8 Reviewed-by: Alessandro Portale --- .../cmakebuildconfiguration.cpp | 19 ++++++++-- .../cmakeprojectmanager/configmodel.cpp | 36 ++++++++++++++++--- src/plugins/cmakeprojectmanager/configmodel.h | 2 +- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 81ae3d0f2c8..0acbd3ddc27 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -765,12 +765,27 @@ void CMakeBuildSettingsWidget::updateFromKit() const Kit *k = m_buildConfiguration->kit(); const CMakeConfig config = CMakeConfigurationKitAspect::configuration(k); + // First the key value parameters ConfigModel::KitConfiguration configHash; for (const CMakeConfigItem &i : config) - configHash.insert(QString::fromUtf8(i.key), - qMakePair(QString::fromUtf8(i.value), i.expandedValue(k))); + configHash.insert(QString::fromUtf8(i.key), i); m_configModel->setConfigurationFromKit(configHash); + + // Then the additional parameters + const QStringList additionalKitCMake = ProcessArgs::splitArgs( + CMakeConfigurationKitAspect::additionalConfiguration(k)); + const QStringList additionalInitialCMake = ProcessArgs::splitArgs( + m_buildConfiguration->aspect()->value()); + + QStringList mergedArgumentList; + std::set_union(additionalInitialCMake.begin(), + additionalInitialCMake.end(), + additionalKitCMake.begin(), + additionalKitCMake.end(), + std::back_inserter(mergedArgumentList)); + m_buildConfiguration->aspect()->setValue( + ProcessArgs::joinArgs(mergedArgumentList)); } void CMakeBuildSettingsWidget::updateConfigurationStateIndex(int index) diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp index 4933c158f85..190ffbc9120 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.cpp +++ b/src/plugins/cmakeprojectmanager/configmodel.cpp @@ -96,9 +96,9 @@ void ConfigModel::appendConfiguration(const QString &key, internalItem.isUserNew = true; if (m_kitConfiguration.contains(key)) - internalItem.kitValue = isInitial ? m_kitConfiguration.value(key).first - : m_kitConfiguration.value(key).second; - + internalItem.kitValue = QString::fromUtf8( + isInitial ? m_kitConfiguration.value(key).value + : m_macroExpander->expand(m_kitConfiguration.value(key).value)); m_configuration.append(internalItem); setConfiguration(m_configuration); } @@ -111,12 +111,38 @@ void ConfigModel::setConfiguration(const QList &config) void ConfigModel::setConfigurationFromKit(const KitConfiguration &kitConfig) { m_kitConfiguration = kitConfig; + QHash initialConfig; + // Update the kit values for initial configuration keys for (InternalDataItem &i : m_configuration) { + if (!i.isInitial) + continue; if (m_kitConfiguration.contains(i.key)) - i.kitValue = i.isInitial ? m_kitConfiguration.value(i.key).first - : m_kitConfiguration.value(i.key).second; + i.kitValue = QString::fromUtf8(m_kitConfiguration.value(i.key).value); + initialConfig.insert(i.key, i); } + + // Add new initial configuration kit keys + for (const auto &ki : kitConfig) { + if (!initialConfig.contains(QString::fromUtf8(ki.key))) { + InternalDataItem i((DataItem(ki))); + i.isUserNew = true; + i.isInitial = true; + i.newValue = i.value; + i.kitValue = i.value; + m_configuration.append(i); + } + } + + // Remove kit values when the kit's keys are removed + for (const auto &i : initialConfig) { + if (!kitConfig.contains(i.key)) { + auto existing = std::find(m_configuration.begin(), m_configuration.end(), i); + if (existing != m_configuration.end()) + existing->kitValue.clear(); + } + } + setConfiguration(m_configuration); } diff --git a/src/plugins/cmakeprojectmanager/configmodel.h b/src/plugins/cmakeprojectmanager/configmodel.h index da702df40db..83e34d191b5 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.h +++ b/src/plugins/cmakeprojectmanager/configmodel.h @@ -146,7 +146,7 @@ public: void setInitialParametersConfiguration(const CMakeConfig &config); void setConfiguration(const QList &config); - using KitConfiguration = QHash>; + using KitConfiguration = QHash; void setConfigurationFromKit(const KitConfiguration &kitConfig); void flush();