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 <alessandro.portale@qt.io>
This commit is contained in:
Christiaan Janssen
2021-03-31 16:47:22 +02:00
committed by christiaan.janssen
parent af24cad00f
commit d6cc05f0ea
3 changed files with 82 additions and 67 deletions

View File

@@ -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_KITVERSION_KEY, KIT_VERSION);
k->setValue(KIT_MCUTARGET_OS_KEY, static_cast<int>(mcuTarget->os())); k->setValue(KIT_MCUTARGET_OS_KEY, static_cast<int>(mcuTarget->os()));
k->setValue(KIT_MCUTARGET_TOOCHAIN_KEY, mcuTarget->toolChainPackage()->toolChainName()); k->setValue(KIT_MCUTARGET_TOOCHAIN_KEY, mcuTarget->toolChainPackage()->toolChainName());
k->setAutoDetected(true); k->setAutoDetected(false);
k->makeSticky(); k->makeSticky();
if (mcuTarget->toolChainPackage()->isDesktopToolchain()) if (mcuTarget->toolChainPackage()->isDesktopToolchain())
k->setDeviceTypeForIcon(DEVICE_TYPE); k->setDeviceTypeForIcon(DEVICE_TYPE);
@@ -893,12 +893,11 @@ QString McuSupportOptions::kitName(const McuTarget *mcuTarget)
compilerName); compilerName);
} }
QList<Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTarget, bool autoDetectedOnly) QList<Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTarget)
{ {
using namespace Constants; using namespace Constants;
return Utils::filtered(KitManager::kits(), [mcuTarget, autoDetectedOnly](Kit *kit) { return Utils::filtered(KitManager::kits(), [mcuTarget](Kit *kit) {
return (!autoDetectedOnly || kit->isAutoDetected()) return kit->value(KIT_MCUTARGET_KITVERSION_KEY) == KIT_VERSION
&& kit->value(KIT_MCUTARGET_KITVERSION_KEY) == KIT_VERSION
&& (!mcuTarget || ( && (!mcuTarget || (
kit->value(KIT_MCUTARGET_VENDOR_KEY) == mcuTarget->platform().vendor kit->value(KIT_MCUTARGET_VENDOR_KEY) == mcuTarget->platform().vendor
&& kit->value(KIT_MCUTARGET_MODEL_KEY) == mcuTarget->platform().name && kit->value(KIT_MCUTARGET_MODEL_KEY) == mcuTarget->platform().name
@@ -911,9 +910,23 @@ QList<Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTarget, bool au
}); });
} }
QList<Kit *> McuSupportOptions::matchingKits(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdkPackage)
{
return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) {
return kitUpToDate(kit, mcuTarget, qtForMCUsSdkPackage);
});
}
QList<Kit *> McuSupportOptions::upgradeableKits(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdkPackage)
{
return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) {
return !kitUpToDate(kit, mcuTarget, qtForMCUsSdkPackage);
});
}
QList<Kit *> McuSupportOptions::kitsWithMismatchedDependencies(const McuTarget *mcuTarget) QList<Kit *> 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( const auto environment = Utils::NameValueDictionary(
Utils::NameValueItem::toStringList( Utils::NameValueItem::toStringList(
EnvironmentKitAspect::environmentChanges(kit))); EnvironmentKitAspect::environmentChanges(kit)));
@@ -927,8 +940,7 @@ QList<Kit *> McuSupportOptions::kitsWithMismatchedDependencies(const McuTarget *
QList<Kit *> McuSupportOptions::outdatedKits() QList<Kit *> McuSupportOptions::outdatedKits()
{ {
return Utils::filtered(KitManager::kits(), [](Kit *kit) { return Utils::filtered(KitManager::kits(), [](Kit *kit) {
return kit->isAutoDetected() return !kit->value(Constants::KIT_MCUTARGET_VENDOR_KEY).isNull()
&& !kit->value(Constants::KIT_MCUTARGET_VENDOR_KEY).isNull()
&& kit->value(Constants::KIT_MCUTARGET_KITVERSION_KEY) != KIT_VERSION; && kit->value(Constants::KIT_MCUTARGET_KITVERSION_KEY) != KIT_VERSION;
}); });
} }
@@ -969,7 +981,7 @@ void printMessage(const QString &message, bool important)
Core::MessageManager::writeSilently(displayMessage); Core::MessageManager::writeSilently(displayMessage);
} }
QVersionNumber kitQulVersion(const Kit *kit) QVersionNumber McuSupportOptions::kitQulVersion(const Kit *kit)
{ {
return QVersionNumber::fromString( return QVersionNumber::fromString(
kit->value(McuSupport::Constants::KIT_MCUTARGET_SDKVERSION_KEY) kit->value(McuSupport::Constants::KIT_MCUTARGET_SDKVERSION_KEY)
@@ -985,6 +997,13 @@ QString kitDependencyPath(const Kit *kit, const QString &variableName)
return QString(); 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() McuSupportOptions::UpgradeOption McuSupportOptions::askForKitUpgrades()
{ {
QMessageBox upgradePopup(Core::ICore::dialogParent()); QMessageBox upgradePopup(Core::ICore::dialogParent());
@@ -1052,15 +1071,10 @@ void McuSupportOptions::createAutomaticKits()
bool needsUpgrade = false; bool needsUpgrade = false;
for (auto target: qAsConst(mcuTargets)) { 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; continue;
} if (!upgradeableKits(target, qtForMCUsPackage).empty()) {
if (!kitsForTarget.empty()) {
// if kit exists but wrong version/path // if kit exists but wrong version/path
needsUpgrade = true; needsUpgrade = true;
} else { } else {
@@ -1088,22 +1102,10 @@ void McuSupportOptions::checkUpgradeableKits()
if (!qtForMCUsSdkPackage->validStatus() || mcuTargets.length() == 0) if (!qtForMCUsSdkPackage->validStatus() || mcuTargets.length() == 0)
return; return;
const auto performCheck = [this]() { if (Utils::anyOf(mcuTargets, [this](const McuTarget *target) {
const QString envVar = qtForMCUsSdkPackage->environmentVariableName(); return !upgradeableKits(target, this->qtForMCUsSdkPackage).empty() &&
const QString path = qtForMCUsSdkPackage->path(); matchingKits(target, this->qtForMCUsSdkPackage).empty();
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;
})) }))
return true;
}
return false;
};
if (performCheck())
upgradeKits(askForKitUpgrades()); upgradeKits(askForKitUpgrades());
} }
@@ -1119,29 +1121,16 @@ void McuSupportOptions::upgradeKits(UpgradeOption upgradeOption)
QVector<McuTarget*> mcuTargets; QVector<McuTarget*> mcuTargets;
Sdk::targetsAndPackages(dir, &packages, &mcuTargets); Sdk::targetsAndPackages(dir, &packages, &mcuTargets);
const QString envVar = qtForMCUsPackage->environmentVariableName();
const QString path = qtForMCUsPackage->path();
for (auto target: qAsConst(mcuTargets)) { for (auto target: qAsConst(mcuTargets)) {
const auto kitsForTarget = existingKits(target, false); if (!matchingKits(target, qtForMCUsPackage).empty())
if (Utils::anyOf(kitsForTarget, [&target, &envVar, &path](const Kit *kit) {
return kitQulVersion(kit) == target->qulVersion() && kitDependencyPath(kit, envVar) == path;
})) {
// already up-to-date // already up-to-date
continue; continue;
}
if (!kitsForTarget.empty()) { const auto kits = upgradeableKits(target, qtForMCUsPackage);
for (auto existingKit : kitsForTarget) { if (!kits.empty()) {
switch (upgradeOption) { if (upgradeOption == Replace)
case Keep: for (auto existingKit : kits)
existingKit->setAutoDetected(false);
break;
case Replace:
KitManager::deregisterKit(existingKit); KitManager::deregisterKit(existingKit);
break;
default: break;
}
}
if (target->isValid()) if (target->isValid())
newKit(target, qtForMCUsPackage); newKit(target, qtForMCUsPackage);
@@ -1154,6 +1143,13 @@ void McuSupportOptions::upgradeKits(UpgradeOption upgradeOption)
delete qtForMCUsPackage; 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() void McuSupportOptions::fixKitsDependencies()
{ {
auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); auto qtForMCUsPackage = Sdk::createQtForMCUsPackage();
@@ -1184,6 +1180,10 @@ void McuSupportOptions::fixExistingKits()
if (!kit->hasValue(Constants::KIT_MCUTARGET_KITVERSION_KEY) ) if (!kit->hasValue(Constants::KIT_MCUTARGET_KITVERSION_KEY) )
continue; continue;
if (kit->isAutoDetected()) {
kit->setAutoDetected(false);
}
// Check if the MCU kits are flagged as supplying a QtQuick import path, in order // 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 // to tell the QMLJS code-model that it won't need to add a fall-back import
// path. // path.

View File

@@ -222,7 +222,9 @@ public:
static QString kitName(const McuTarget* mcuTarget); static QString kitName(const McuTarget* mcuTarget);
static QList<ProjectExplorer::Kit *> existingKits(const McuTarget *mcuTarget, bool autoDetectedOnly = true); static QList<ProjectExplorer::Kit *> existingKits(const McuTarget *mcuTarget);
static QList<ProjectExplorer::Kit *> matchingKits(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdkPackage);
static QList<ProjectExplorer::Kit *> upgradeableKits(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdkPackage);
static QList<ProjectExplorer::Kit *> kitsWithMismatchedDependencies(const McuTarget *mcuTarget); static QList<ProjectExplorer::Kit *> kitsWithMismatchedDependencies(const McuTarget *mcuTarget);
static QList<ProjectExplorer::Kit *> outdatedKits(); static QList<ProjectExplorer::Kit *> outdatedKits();
static void removeOutdatedKits(); static void removeOutdatedKits();
@@ -230,6 +232,7 @@ public:
static void createAutomaticKits(); static void createAutomaticKits();
static UpgradeOption askForKitUpgrades(); static UpgradeOption askForKitUpgrades();
static void upgradeKits(UpgradeOption upgradeOption); static void upgradeKits(UpgradeOption upgradeOption);
static void upgradeKitInPlace(ProjectExplorer::Kit *kit, const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdk);
static void fixKitsDependencies(); static void fixKitsDependencies();
void checkUpgradeableKits(); void checkUpgradeableKits();
static void fixExistingKits(); static void fixExistingKits();
@@ -239,6 +242,8 @@ public:
static const QVersionNumber &minimalQulVersion(); 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: private:
void deletePackagesAndTargets(); void deletePackagesAndTargets();

View File

@@ -83,7 +83,7 @@ private:
Utils::InfoLabel *m_statusInfoLabel = nullptr; Utils::InfoLabel *m_statusInfoLabel = nullptr;
Utils::InfoLabel *m_mcuTargetsInfoLabel = nullptr; Utils::InfoLabel *m_mcuTargetsInfoLabel = nullptr;
QPushButton *m_kitCreationPushButton = nullptr; QPushButton *m_kitCreationPushButton = nullptr;
QPushButton *m_kitRemovalPushButton = nullptr; QPushButton *m_kitUpdatePushButton = nullptr;
}; };
McuSupportOptionsWidget::McuSupportOptionsWidget() McuSupportOptionsWidget::McuSupportOptionsWidget()
@@ -157,15 +157,15 @@ McuSupportOptionsWidget::McuSupportOptionsWidget()
McuSupportOptions::registerQchFiles(); McuSupportOptions::registerQchFiles();
updateStatus(); updateStatus();
}); });
m_kitRemovalPushButton = new QPushButton(tr("Remove Kit")); m_kitUpdatePushButton = new QPushButton(tr("Update Kit"));
m_kitRemovalPushButton->setSizePolicy(m_kitCreationPushButton->sizePolicy()); m_kitUpdatePushButton->setSizePolicy(m_kitCreationPushButton->sizePolicy());
connect(m_kitRemovalPushButton, &QPushButton::clicked, this, [this] { connect(m_kitUpdatePushButton, &QPushButton::clicked, this, [this] {
for (auto existingKit : McuSupportOptions::existingKits(currentMcuTarget())) for (auto kit: McuSupportOptions::upgradeableKits(currentMcuTarget(), m_options.qtForMCUsSdkPackage))
ProjectExplorer::KitManager::deregisterKit(existingKit); m_options.upgradeKitInPlace(kit, currentMcuTarget(), m_options.qtForMCUsSdkPackage);
updateStatus(); updateStatus();
}); });
vLayout->addWidget(m_kitCreationPushButton); vLayout->addWidget(m_kitCreationPushButton);
vLayout->addWidget(m_kitRemovalPushButton); vLayout->addWidget(m_kitUpdatePushButton);
} }
mainLayout->addStretch(); mainLayout->addStretch();
@@ -207,17 +207,27 @@ void McuSupportOptionsWidget::updateStatus()
if (mcuTarget) { if (mcuTarget) {
const bool mcuTargetValid = mcuTarget->isValid(); const bool mcuTargetValid = mcuTarget->isValid();
m_kitCreationPushButton->setVisible(mcuTargetValid); m_kitCreationPushButton->setVisible(mcuTargetValid);
m_kitRemovalPushButton->setVisible(mcuTargetValid); m_kitUpdatePushButton->setVisible(mcuTargetValid);
if (mcuTargetValid) { if (mcuTargetValid) {
const bool mcuTargetKitExists = !McuSupportOptions::existingKits(mcuTarget).isEmpty(); const bool hasMatchingKits = !McuSupportOptions::matchingKits(
m_kitCreationInfoLabel->setType(mcuTargetKitExists 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::Information
: Utils::InfoLabel::Ok); : Utils::InfoLabel::Ok);
m_kitCreationInfoLabel->setText(mcuTargetKitExists
? tr("A kit for the selected target exists.") 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.")); : tr("A kit for the selected target can be created."));
m_kitCreationPushButton->setEnabled(!mcuTargetKitExists);
m_kitRemovalPushButton->setEnabled(mcuTargetKitExists);
} else { } else {
m_kitCreationInfoLabel->setType(Utils::InfoLabel::NotOk); m_kitCreationInfoLabel->setType(Utils::InfoLabel::NotOk);
m_kitCreationInfoLabel->setText("Provide the package paths in order to create a kit " m_kitCreationInfoLabel->setText("Provide the package paths in order to create a kit "