From d6cc05f0ea6999dc1b3052b331c315afcb3bc0d5 Mon Sep 17 00:00:00 2001 From: Christiaan Janssen Date: Wed, 31 Mar 2021 16:47:22 +0200 Subject: [PATCH] McuSupport: fix manual creation of kits Kits are marked as 'manual', so that user has individual control of each one. 'Remove' button replaced with 'Update' button for manual update. Task-number: QTCREATORBUG-25259 Change-Id: Iadf5f2da3ef7bee7fb051516ffda7fcefe8b56d8 Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportoptions.cpp | 102 +++++++++--------- src/plugins/mcusupport/mcusupportoptions.h | 7 +- .../mcusupport/mcusupportoptionspage.cpp | 40 ++++--- 3 files changed, 82 insertions(+), 67 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index f8d9a795fec..96747c36eb3 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -680,7 +680,7 @@ static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mc k->setValue(KIT_MCUTARGET_KITVERSION_KEY, KIT_VERSION); k->setValue(KIT_MCUTARGET_OS_KEY, static_cast(mcuTarget->os())); k->setValue(KIT_MCUTARGET_TOOCHAIN_KEY, mcuTarget->toolChainPackage()->toolChainName()); - k->setAutoDetected(true); + k->setAutoDetected(false); k->makeSticky(); if (mcuTarget->toolChainPackage()->isDesktopToolchain()) k->setDeviceTypeForIcon(DEVICE_TYPE); @@ -893,12 +893,11 @@ QString McuSupportOptions::kitName(const McuTarget *mcuTarget) compilerName); } -QList McuSupportOptions::existingKits(const McuTarget *mcuTarget, bool autoDetectedOnly) +QList McuSupportOptions::existingKits(const McuTarget *mcuTarget) { using namespace Constants; - return Utils::filtered(KitManager::kits(), [mcuTarget, autoDetectedOnly](Kit *kit) { - return (!autoDetectedOnly || kit->isAutoDetected()) - && kit->value(KIT_MCUTARGET_KITVERSION_KEY) == KIT_VERSION + return Utils::filtered(KitManager::kits(), [mcuTarget](Kit *kit) { + return kit->value(KIT_MCUTARGET_KITVERSION_KEY) == KIT_VERSION && (!mcuTarget || ( kit->value(KIT_MCUTARGET_VENDOR_KEY) == mcuTarget->platform().vendor && kit->value(KIT_MCUTARGET_MODEL_KEY) == mcuTarget->platform().name @@ -911,9 +910,23 @@ QList McuSupportOptions::existingKits(const McuTarget *mcuTarget, bool au }); } +QList McuSupportOptions::matchingKits(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdkPackage) +{ + return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) { + return kitUpToDate(kit, mcuTarget, qtForMCUsSdkPackage); + }); +} + +QList McuSupportOptions::upgradeableKits(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdkPackage) +{ + return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) { + return !kitUpToDate(kit, mcuTarget, qtForMCUsSdkPackage); + }); +} + QList McuSupportOptions::kitsWithMismatchedDependencies(const McuTarget *mcuTarget) { - return Utils::filtered(existingKits(mcuTarget, false), [mcuTarget](Kit *kit) { + return Utils::filtered(existingKits(mcuTarget), [mcuTarget](Kit *kit) { const auto environment = Utils::NameValueDictionary( Utils::NameValueItem::toStringList( EnvironmentKitAspect::environmentChanges(kit))); @@ -927,8 +940,7 @@ QList McuSupportOptions::kitsWithMismatchedDependencies(const McuTarget * QList McuSupportOptions::outdatedKits() { return Utils::filtered(KitManager::kits(), [](Kit *kit) { - return kit->isAutoDetected() - && !kit->value(Constants::KIT_MCUTARGET_VENDOR_KEY).isNull() + return !kit->value(Constants::KIT_MCUTARGET_VENDOR_KEY).isNull() && kit->value(Constants::KIT_MCUTARGET_KITVERSION_KEY) != KIT_VERSION; }); } @@ -969,7 +981,7 @@ void printMessage(const QString &message, bool important) Core::MessageManager::writeSilently(displayMessage); } -QVersionNumber kitQulVersion(const Kit *kit) +QVersionNumber McuSupportOptions::kitQulVersion(const Kit *kit) { return QVersionNumber::fromString( kit->value(McuSupport::Constants::KIT_MCUTARGET_SDKVERSION_KEY) @@ -985,6 +997,13 @@ QString kitDependencyPath(const Kit *kit, const QString &variableName) return QString(); } +bool McuSupportOptions::kitUpToDate(const Kit *kit, const McuTarget *mcuTarget, + const McuPackage *qtForMCUsSdkPackage) +{ + return kitQulVersion(kit) == mcuTarget->qulVersion() && + kitDependencyPath(kit, qtForMCUsSdkPackage->environmentVariableName()) == qtForMCUsSdkPackage->path(); +} + McuSupportOptions::UpgradeOption McuSupportOptions::askForKitUpgrades() { QMessageBox upgradePopup(Core::ICore::dialogParent()); @@ -1052,15 +1071,10 @@ void McuSupportOptions::createAutomaticKits() bool needsUpgrade = false; for (auto target: qAsConst(mcuTargets)) { - const auto kitsForTarget = existingKits(target, false); - if (Utils::anyOf(kitsForTarget, [&target, &qtForMCUsPackage](const Kit *kit) { - return kitQulVersion(kit) == target->qulVersion() && - kitDependencyPath(kit, qtForMCUsPackage->environmentVariableName()) == qtForMCUsPackage->path(); - })) { - // if kit already exists, skip + // if kit already exists, skip + if (!matchingKits(target, qtForMCUsPackage).empty()) continue; - } - if (!kitsForTarget.empty()) { + if (!upgradeableKits(target, qtForMCUsPackage).empty()) { // if kit exists but wrong version/path needsUpgrade = true; } else { @@ -1088,22 +1102,10 @@ void McuSupportOptions::checkUpgradeableKits() if (!qtForMCUsSdkPackage->validStatus() || mcuTargets.length() == 0) return; - const auto performCheck = [this]() { - const QString envVar = qtForMCUsSdkPackage->environmentVariableName(); - const QString path = qtForMCUsSdkPackage->path(); - for (auto target: qAsConst(this->mcuTargets)) { - const auto kitsForTarget = existingKits(target, false); - if (!kitsForTarget.empty() && - Utils::allOf(kitsForTarget, [&target, &envVar, &path](const Kit *kit) { - return kitQulVersion(kit) != target->qulVersion() || - kitDependencyPath(kit,envVar) != path; + if (Utils::anyOf(mcuTargets, [this](const McuTarget *target) { + return !upgradeableKits(target, this->qtForMCUsSdkPackage).empty() && + matchingKits(target, this->qtForMCUsSdkPackage).empty(); })) - return true; - } - return false; - }; - - if (performCheck()) upgradeKits(askForKitUpgrades()); } @@ -1119,29 +1121,16 @@ void McuSupportOptions::upgradeKits(UpgradeOption upgradeOption) QVector mcuTargets; Sdk::targetsAndPackages(dir, &packages, &mcuTargets); - const QString envVar = qtForMCUsPackage->environmentVariableName(); - const QString path = qtForMCUsPackage->path(); - for (auto target: qAsConst(mcuTargets)) { - const auto kitsForTarget = existingKits(target, false); - if (Utils::anyOf(kitsForTarget, [&target, &envVar, &path](const Kit *kit) { - return kitQulVersion(kit) == target->qulVersion() && kitDependencyPath(kit, envVar) == path; - })) { + if (!matchingKits(target, qtForMCUsPackage).empty()) // already up-to-date continue; - } - if (!kitsForTarget.empty()) { - for (auto existingKit : kitsForTarget) { - switch (upgradeOption) { - case Keep: - existingKit->setAutoDetected(false); - break; - case Replace: + + const auto kits = upgradeableKits(target, qtForMCUsPackage); + if (!kits.empty()) { + if (upgradeOption == Replace) + for (auto existingKit : kits) KitManager::deregisterKit(existingKit); - break; - default: break; - } - } if (target->isValid()) newKit(target, qtForMCUsPackage); @@ -1154,6 +1143,13 @@ void McuSupportOptions::upgradeKits(UpgradeOption upgradeOption) delete qtForMCUsPackage; } +void McuSupportOptions::upgradeKitInPlace(ProjectExplorer::Kit *kit, const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdk) +{ + setKitProperties(kitName(mcuTarget), kit, mcuTarget, qtForMCUsSdk->path()); + setKitEnvironment(kit, mcuTarget, qtForMCUsSdk); + setKitDependencies(kit, mcuTarget, qtForMCUsSdk); +} + void McuSupportOptions::fixKitsDependencies() { auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); @@ -1184,6 +1180,10 @@ void McuSupportOptions::fixExistingKits() if (!kit->hasValue(Constants::KIT_MCUTARGET_KITVERSION_KEY) ) continue; + if (kit->isAutoDetected()) { + kit->setAutoDetected(false); + } + // Check if the MCU kits are flagged as supplying a QtQuick import path, in order // to tell the QMLJS code-model that it won't need to add a fall-back import // path. diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index 7fec323da40..597df6a7c15 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -222,7 +222,9 @@ public: static QString kitName(const McuTarget* mcuTarget); - static QList existingKits(const McuTarget *mcuTarget, bool autoDetectedOnly = true); + static QList existingKits(const McuTarget *mcuTarget); + static QList matchingKits(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdkPackage); + static QList upgradeableKits(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdkPackage); static QList kitsWithMismatchedDependencies(const McuTarget *mcuTarget); static QList outdatedKits(); static void removeOutdatedKits(); @@ -230,6 +232,7 @@ public: static void createAutomaticKits(); static UpgradeOption askForKitUpgrades(); static void upgradeKits(UpgradeOption upgradeOption); + static void upgradeKitInPlace(ProjectExplorer::Kit *kit, const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdk); static void fixKitsDependencies(); void checkUpgradeableKits(); static void fixExistingKits(); @@ -239,6 +242,8 @@ public: static const QVersionNumber &minimalQulVersion(); + static QVersionNumber kitQulVersion(const ProjectExplorer::Kit *kit); + static bool kitUpToDate(const ProjectExplorer::Kit *kit, const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdkPackage); private: void deletePackagesAndTargets(); diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 8e5697b3669..9ccffd63e01 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -83,7 +83,7 @@ private: Utils::InfoLabel *m_statusInfoLabel = nullptr; Utils::InfoLabel *m_mcuTargetsInfoLabel = nullptr; QPushButton *m_kitCreationPushButton = nullptr; - QPushButton *m_kitRemovalPushButton = nullptr; + QPushButton *m_kitUpdatePushButton = nullptr; }; McuSupportOptionsWidget::McuSupportOptionsWidget() @@ -157,15 +157,15 @@ McuSupportOptionsWidget::McuSupportOptionsWidget() McuSupportOptions::registerQchFiles(); updateStatus(); }); - m_kitRemovalPushButton = new QPushButton(tr("Remove Kit")); - m_kitRemovalPushButton->setSizePolicy(m_kitCreationPushButton->sizePolicy()); - connect(m_kitRemovalPushButton, &QPushButton::clicked, this, [this] { - for (auto existingKit : McuSupportOptions::existingKits(currentMcuTarget())) - ProjectExplorer::KitManager::deregisterKit(existingKit); + m_kitUpdatePushButton = new QPushButton(tr("Update Kit")); + m_kitUpdatePushButton->setSizePolicy(m_kitCreationPushButton->sizePolicy()); + connect(m_kitUpdatePushButton, &QPushButton::clicked, this, [this] { + for (auto kit: McuSupportOptions::upgradeableKits(currentMcuTarget(), m_options.qtForMCUsSdkPackage)) + m_options.upgradeKitInPlace(kit, currentMcuTarget(), m_options.qtForMCUsSdkPackage); updateStatus(); }); vLayout->addWidget(m_kitCreationPushButton); - vLayout->addWidget(m_kitRemovalPushButton); + vLayout->addWidget(m_kitUpdatePushButton); } mainLayout->addStretch(); @@ -207,17 +207,27 @@ void McuSupportOptionsWidget::updateStatus() if (mcuTarget) { const bool mcuTargetValid = mcuTarget->isValid(); m_kitCreationPushButton->setVisible(mcuTargetValid); - m_kitRemovalPushButton->setVisible(mcuTargetValid); + m_kitUpdatePushButton->setVisible(mcuTargetValid); if (mcuTargetValid) { - const bool mcuTargetKitExists = !McuSupportOptions::existingKits(mcuTarget).isEmpty(); - m_kitCreationInfoLabel->setType(mcuTargetKitExists + const bool hasMatchingKits = !McuSupportOptions::matchingKits( + mcuTarget, m_options.qtForMCUsSdkPackage).isEmpty(); + const bool hasUpgradeableKits = !hasMatchingKits && + !McuSupportOptions::upgradeableKits( + mcuTarget, m_options.qtForMCUsSdkPackage).isEmpty(); + + m_kitCreationPushButton->setEnabled(!hasMatchingKits); + m_kitUpdatePushButton->setEnabled(hasUpgradeableKits); + + m_kitCreationInfoLabel->setType(!hasMatchingKits ? Utils::InfoLabel::Information : Utils::InfoLabel::Ok); - m_kitCreationInfoLabel->setText(mcuTargetKitExists - ? tr("A kit for the selected target exists.") - : tr("A kit for the selected target can be created.")); - m_kitCreationPushButton->setEnabled(!mcuTargetKitExists); - m_kitRemovalPushButton->setEnabled(mcuTargetKitExists); + + m_kitCreationInfoLabel->setText( + hasMatchingKits ? + tr("A kit for the selected target and SDK version already exists.") + : hasUpgradeableKits ? + tr("Kits for a different SDK version exist.") + : tr("A kit for the selected target can be created.")); } else { m_kitCreationInfoLabel->setType(Utils::InfoLabel::NotOk); m_kitCreationInfoLabel->setText("Provide the package paths in order to create a kit "