diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 3291bf1f2b0..f8d9a795fec 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -226,11 +226,14 @@ void McuPackage::writeGeneralSettings() const settings->setValue(key, m_automaticKitCreation); } -void McuPackage::writeToSettings() const +bool McuPackage::writeToSettings() const { + const QString savedPath = packagePathFromSettings(m_settingsKey, QSettings::UserScope, m_defaultPath); const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/' + QLatin1String(Constants::SETTINGS_KEY_PACKAGE_PREFIX) + m_settingsKey; Core::ICore::settings()->setValueWithDefault(key, m_path, m_defaultPath); + + return savedPath != m_path; } void McuPackage::setRelativePathModifier(const QString &path) @@ -790,6 +793,27 @@ static void setKitDependencies(Kit *k, const McuTarget *mcuTarget, k->setIrrelevantAspects(irrelevant); } +static void updateKitEnvironment(Kit *k, const McuTarget *mcuTarget) +{ + EnvironmentItems changes = EnvironmentKitAspect::environmentChanges(k); + for (auto package : mcuTarget->packages()) { + const QString varName = package->environmentVariableName(); + if (!varName.isEmpty() && package->validStatus()) { + const int index = Utils::indexOf(changes, [varName](const EnvironmentItem &item) { + return item.name == varName; + }); + const EnvironmentItem item = {package->environmentVariableName(), + QDir::toNativeSeparators(package->path())}; + if (index != -1) + changes.replace(index, item); + else + changes.append(item); + } + } + + EnvironmentKitAspect::setEnvironmentChanges(k, changes); +} + static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const QString &qulDir) { using namespace CMakeProjectManager; @@ -887,6 +911,19 @@ QList McuSupportOptions::existingKits(const McuTarget *mcuTarget, bool au }); } +QList McuSupportOptions::kitsWithMismatchedDependencies(const McuTarget *mcuTarget) +{ + return Utils::filtered(existingKits(mcuTarget, false), [mcuTarget](Kit *kit) { + const auto environment = Utils::NameValueDictionary( + Utils::NameValueItem::toStringList( + EnvironmentKitAspect::environmentChanges(kit))); + return Utils::anyOf(mcuTarget->packages(), [&environment](const McuPackage *package) { + return !package->environmentVariableName().isEmpty() && + environment.value(package->environmentVariableName()) != QDir::toNativeSeparators(package->path()); + }); + }); +} + QList McuSupportOptions::outdatedKits() { return Utils::filtered(KitManager::kits(), [](Kit *kit) { @@ -1117,6 +1154,27 @@ void McuSupportOptions::upgradeKits(UpgradeOption upgradeOption) delete qtForMCUsPackage; } +void McuSupportOptions::fixKitsDependencies() +{ + auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); + + auto dir = FilePath::fromUserInput(qtForMCUsPackage->path()); + QVector packages; + QVector mcuTargets; + Sdk::targetsAndPackages(dir, &packages, &mcuTargets); + for (auto target: qAsConst(mcuTargets)) { + if (target->isValid()) { + for (auto kit : kitsWithMismatchedDependencies(target)) { + updateKitEnvironment(kit, target); + } + } + } + + qDeleteAll(packages); + qDeleteAll(mcuTargets); + delete qtForMCUsPackage; +} + /** * @brief Fix/update existing kits if needed */ diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index 3f44e215149..7fec323da40 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -86,7 +86,7 @@ public: void setAddToPath(bool addToPath); bool addToPath() const; void writeGeneralSettings() const; - void writeToSettings() const; + bool writeToSettings() const; void setRelativePathModifier(const QString &path); void setVersions(const QVector &versions); @@ -223,12 +223,14 @@ public: static QString kitName(const McuTarget* mcuTarget); static QList existingKits(const McuTarget *mcuTarget, bool autoDetectedOnly = true); + static QList kitsWithMismatchedDependencies(const McuTarget *mcuTarget); static QList outdatedKits(); static void removeOutdatedKits(); static ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdk); static void createAutomaticKits(); static UpgradeOption askForKitUpgrades(); static void upgradeKits(UpgradeOption upgradeOption); + static void fixKitsDependencies(); void checkUpgradeableKits(); static void fixExistingKits(); void populatePackagesAndTargets(); diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index dd56347c2ba..8e5697b3669 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -278,12 +278,17 @@ void McuSupportOptionsWidget::showEvent(QShowEvent *event) void McuSupportOptionsWidget::apply() { - m_options.qtForMCUsSdkPackage->writeGeneralSettings(); - m_options.qtForMCUsSdkPackage->writeToSettings(); - for (auto package : qAsConst(m_options.packages)) - package->writeToSettings(); + bool pathsChanged = false; - m_options.checkUpgradeableKits(); + m_options.qtForMCUsSdkPackage->writeGeneralSettings(); + pathsChanged |= m_options.qtForMCUsSdkPackage->writeToSettings(); + for (auto package : qAsConst(m_options.packages)) + pathsChanged |= package->writeToSettings(); + + if (pathsChanged) { + m_options.checkUpgradeableKits(); + m_options.fixKitsDependencies(); + } } void McuSupportOptionsWidget::populateMcuTargetsComboBox()