McuSupport: Move kit methods out of McuSupportOptions

... and into McuKitManager

Task-number: QTCREATORBUG-26890
Change-Id: Ic5ed689458d3ef004ebb42a549c48a6326c2f45d
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Erik Verbruggen
2022-02-14 18:01:04 +01:00
committed by Christiaan Janssen
parent 01a0f41ed5
commit c755de0823
7 changed files with 116 additions and 99 deletions

View File

@@ -86,10 +86,6 @@ public:
const QString &environmentVariableName() const override;
signals:
void changed();
void statusChanged();
private:
void updatePath();
void updateStatusUi();

View File

@@ -307,13 +307,13 @@ void McuTarget::printPackageProblems() const
package->updateStatus();
if (!package->validStatus())
printMessage(tr("Error creating kit for target %1, package %2: %3")
.arg(McuSupportOptions::kitName(this),
.arg(McuKitManager::kitName(this),
package->label(),
package->statusText()),
true);
if (package->status() == McuAbstractPackage::Status::ValidPackageMismatchedVersion)
printMessage(tr("Warning creating kit for target %1, package %2: %3")
.arg(McuSupportOptions::kitName(this),
.arg(McuKitManager::kitName(this),
package->label(),
package->statusText()),
false);
@@ -412,9 +412,9 @@ void McuSupportOptions::setQulDir(const FilePath &dir)
if (qtForMCUsSdkPackage->validStatus())
Sdk::targetsAndPackages(dir, &sdkRepository);
for (const auto &package : qAsConst(sdkRepository.packages))
connect(package, &McuAbstractPackage::changed, this, &McuSupportOptions::changed);
connect(package, &McuAbstractPackage::changed, this, &McuSupportOptions::packagesChanged);
emit changed();
emit packagesChanged();
}
FilePath McuSupportOptions::qulDirFromSettings()
@@ -647,7 +647,7 @@ static void setKitCMakeOptions(Kit *k, const McuTarget *mcuTarget, const FilePat
if (!cMakeToolchainFile.exists()) {
printMessage(McuTarget::tr(
"Warning for target %1: missing CMake toolchain file expected at %2.")
.arg(McuSupportOptions::kitName(mcuTarget),
.arg(McuKitManager::kitName(mcuTarget),
cMakeToolchainFile.toUserOutput()),
false);
}
@@ -657,7 +657,7 @@ static void setKitCMakeOptions(Kit *k, const McuTarget *mcuTarget, const FilePat
config.append(CMakeConfigItem("QUL_GENERATORS", generatorsPath.toString().toUtf8()));
if (!generatorsPath.exists()) {
printMessage(McuTarget::tr("Warning for target %1: missing QulGenerators expected at %2.")
.arg(McuSupportOptions::kitName(mcuTarget), generatorsPath.toUserOutput()),
.arg(McuKitManager::kitName(mcuTarget), generatorsPath.toUserOutput()),
false);
}
@@ -687,7 +687,7 @@ static void setKitQtVersionOptions(Kit *k)
// else: auto-select a Qt version
}
QString McuSupportOptions::kitName(const McuTarget *mcuTarget)
QString McuKitManager::kitName(const McuTarget *mcuTarget)
{
const McuToolChainPackage *tcPkg = mcuTarget->toolChainPackage();
const QString compilerName = tcPkg && !tcPkg->isDesktopToolchain()
@@ -708,7 +708,7 @@ QString McuSupportOptions::kitName(const McuTarget *mcuTarget)
compilerName);
}
QList<Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTarget)
QList<Kit *> McuKitManager::existingKits(const McuTarget *mcuTarget)
{
using namespace Constants;
return Utils::filtered(KitManager::kits(), [mcuTarget](Kit *kit) {
@@ -724,23 +724,23 @@ QList<Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTarget)
});
}
QList<Kit *> McuSupportOptions::matchingKits(const McuTarget *mcuTarget,
QList<Kit *> McuKitManager::matchingKits(const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage)
{
return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) {
return kitUpToDate(kit, mcuTarget, qtForMCUsSdkPackage);
return kitIsUpToDate(kit, mcuTarget, qtForMCUsSdkPackage);
});
}
QList<Kit *> McuSupportOptions::upgradeableKits(const McuTarget *mcuTarget,
QList<Kit *> McuKitManager::upgradeableKits(const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage)
{
return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) {
return !kitUpToDate(kit, mcuTarget, qtForMCUsSdkPackage);
return !kitIsUpToDate(kit, mcuTarget, qtForMCUsSdkPackage);
});
}
QList<Kit *> McuSupportOptions::kitsWithMismatchedDependencies(const McuTarget *mcuTarget)
QList<Kit *> McuKitManager::kitsWithMismatchedDependencies(const McuTarget *mcuTarget)
{
return Utils::filtered(existingKits(mcuTarget), [mcuTarget](Kit *kit) {
const auto environment = Utils::NameValueDictionary(
@@ -754,7 +754,7 @@ QList<Kit *> McuSupportOptions::kitsWithMismatchedDependencies(const McuTarget *
});
}
QList<Kit *> McuSupportOptions::outdatedKits()
QList<Kit *> McuKitManager::outdatedKits()
{
return Utils::filtered(KitManager::kits(), [](Kit *kit) {
return !kit->value(Constants::KIT_MCUTARGET_VENDOR_KEY).isNull()
@@ -762,13 +762,13 @@ QList<Kit *> McuSupportOptions::outdatedKits()
});
}
void McuSupportOptions::removeOutdatedKits()
void McuKitManager::removeOutdatedKits()
{
for (auto kit : McuSupportOptions::outdatedKits())
for (auto kit : outdatedKits())
KitManager::deregisterKit(kit);
}
Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk)
Kit *McuKitManager::newKit(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk)
{
const auto init = [mcuTarget, qtForMCUsSdk](Kit *k) {
KitGuard kitGuard(k);
@@ -777,7 +777,7 @@ Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget, const McuAbstractPack
setKitDevice(k, mcuTarget);
setKitToolchains(k, mcuTarget->toolChainPackage());
setKitDebugger(k, mcuTarget->toolChainPackage());
setKitEnvironment(k, mcuTarget, qtForMCUsSdk);
McuSupportOptions::setKitEnvironment(k, mcuTarget, qtForMCUsSdk);
setKitDependencies(k, mcuTarget, qtForMCUsSdk);
setKitCMakeOptions(k, mcuTarget, qtForMCUsSdk->path());
setKitQtVersionOptions(k);
@@ -799,7 +799,7 @@ void printMessage(const QString &message, bool important)
Core::MessageManager::writeSilently(displayMessage);
}
QVersionNumber McuSupportOptions::kitQulVersion(const Kit *kit)
QVersionNumber McuKitManager::kitQulVersion(const Kit *kit)
{
return QVersionNumber::fromString(
kit->value(McuSupport::Constants::KIT_MCUTARGET_SDKVERSION_KEY).toString());
@@ -814,7 +814,7 @@ static FilePath kitDependencyPath(const Kit *kit, const QString &variableName)
return FilePath();
}
bool McuSupportOptions::kitUpToDate(const Kit *kit,
bool McuKitManager::kitIsUpToDate(const Kit *kit,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage)
{
@@ -828,7 +828,7 @@ void McuSupportOptions::deletePackagesAndTargets()
sdkRepository.deletePackagesAndTargets();
}
McuSupportOptions::UpgradeOption McuSupportOptions::askForKitUpgrades()
McuKitManager::UpgradeOption McuKitManager::askForKitUpgrades()
{
QMessageBox upgradePopup(Core::ICore::dialogParent());
upgradePopup.setStandardButtons(QMessageBox::Cancel);
@@ -841,15 +841,15 @@ McuSupportOptions::UpgradeOption McuSupportOptions::askForKitUpgrades()
upgradePopup.exec();
if (upgradePopup.clickedButton() == keepButton)
return Keep;
return UpgradeOption::Keep;
if (upgradePopup.clickedButton() == replaceButton)
return Replace;
return UpgradeOption::Replace;
return Ignore;
return UpgradeOption::Ignore;
}
void McuSupportOptions::createAutomaticKits()
void McuKitManager::createAutomaticKits()
{
auto qtForMCUsPackage = Sdk::createQtForMCUsPackage();
@@ -929,15 +929,15 @@ void McuSupportOptions::checkUpgradeableKits()
return;
if (Utils::anyOf(sdkRepository.mcuTargets, [this](const McuTarget *target) {
return !upgradeableKits(target, this->qtForMCUsSdkPackage).empty()
&& matchingKits(target, this->qtForMCUsSdkPackage).empty();
return !McuKitManager::upgradeableKits(target, this->qtForMCUsSdkPackage).empty()
&& McuKitManager::matchingKits(target, this->qtForMCUsSdkPackage).empty();
}))
upgradeKits(askForKitUpgrades());
McuKitManager::upgradeKitsByCreatingNewPackage(McuKitManager::askForKitUpgrades());
}
void McuSupportOptions::upgradeKits(UpgradeOption upgradeOption)
void McuKitManager::upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption)
{
if (upgradeOption == Ignore)
if (upgradeOption == UpgradeOption::Ignore)
return;
auto qtForMCUsPackage = Sdk::createQtForMCUsPackage();
@@ -947,15 +947,16 @@ void McuSupportOptions::upgradeKits(UpgradeOption upgradeOption)
Sdk::targetsAndPackages(dir, &repo);
for (const auto &target : qAsConst(repo.mcuTargets)) {
if (!matchingKits(target, qtForMCUsPackage).empty())
if (!McuKitManager::matchingKits(target, qtForMCUsPackage).empty())
// already up-to-date
continue;
const auto kits = upgradeableKits(target, qtForMCUsPackage);
const auto kits = McuKitManager::upgradeableKits(target, qtForMCUsPackage);
if (!kits.empty()) {
if (upgradeOption == Replace)
if (upgradeOption == UpgradeOption::Replace) {
for (auto existingKit : kits)
KitManager::deregisterKit(existingKit);
}
if (target->isValid())
newKit(target, qtForMCUsPackage);
@@ -967,16 +968,16 @@ void McuSupportOptions::upgradeKits(UpgradeOption upgradeOption)
delete qtForMCUsPackage;
}
void McuSupportOptions::upgradeKitInPlace(ProjectExplorer::Kit *kit,
void McuKitManager::upgradeKitInPlace(ProjectExplorer::Kit *kit,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdk)
{
setKitProperties(kitName(mcuTarget), kit, mcuTarget, qtForMCUsSdk->path());
setKitEnvironment(kit, mcuTarget, qtForMCUsSdk);
McuSupportOptions::setKitEnvironment(kit, mcuTarget, qtForMCUsSdk);
setKitDependencies(kit, mcuTarget, qtForMCUsSdk);
}
void McuSupportOptions::fixKitsDependencies()
void McuKitManager::fixKitsDependencies()
{
auto qtForMCUsPackage = Sdk::createQtForMCUsPackage();
@@ -986,7 +987,7 @@ void McuSupportOptions::fixKitsDependencies()
for (const auto &target : qAsConst(repo.mcuTargets)) {
if (target->isValid()) {
for (auto *kit : kitsWithMismatchedDependencies(target)) {
updateKitEnvironment(kit, target);
McuSupportOptions::updateKitEnvironment(kit, target);
}
}
}
@@ -998,7 +999,7 @@ void McuSupportOptions::fixKitsDependencies()
/**
* @brief Fix/update existing kits if needed
*/
void McuSupportOptions::fixExistingKits()
void McuKitManager::fixExistingKits()
{
for (Kit *kit : KitManager::kits()) {
if (!kit->hasValue(Constants::KIT_MCUTARGET_KITVERSION_KEY))

View File

@@ -26,6 +26,9 @@
#pragma once
#include <utils/environmentfwd.h>
#include "mcusupport_global.h"
#include <QCoreApplication>
#include <QObject>
#include <QVector>
#include <QVersionNumber>
@@ -106,8 +109,6 @@ class McuSupportOptions : public QObject
Q_OBJECT
public:
enum UpgradeOption { Ignore, Keep, Replace };
explicit McuSupportOptions(QObject *parent = nullptr);
~McuSupportOptions() override;
@@ -122,43 +123,60 @@ public:
static void remapQul2xCmakeVars(ProjectExplorer::Kit *, const Utils::EnvironmentItems &);
static Utils::FilePath qulDirFromSettings();
static QString kitName(const McuTarget *mcuTarget);
static void registerQchFiles();
static void registerExamples();
static const QVersionNumber &minimalQulVersion();
void checkUpgradeableKits();
void populatePackagesAndTargets();
private:
void deletePackagesAndTargets();
signals:
void packagesChanged();
};
class McuKitManager
{
Q_DECLARE_TR_FUNCTIONS(McuSupport::Internal::McuKitManager)
public:
enum class UpgradeOption {
Ignore,
Keep,
Replace
};
// Creating kits:
static ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk);
static void createAutomaticKits();
// Querying the kits:
static QList<ProjectExplorer::Kit *> existingKits(const McuTarget *mcuTarget);
static QList<ProjectExplorer::Kit *> matchingKits(const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage);
static QList<ProjectExplorer::Kit *> upgradeableKits(
const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdkPackage);
static QList<ProjectExplorer::Kit *> kitsWithMismatchedDependencies(const McuTarget *mcuTarget);
// Upgrading kits:
static UpgradeOption askForKitUpgrades();
static void upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption);
static void upgradeKitInPlace(ProjectExplorer::Kit *kit, const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk);
// Fixing kits:
static void fixKitsDependencies();
static void fixExistingKits();
// Outdated kits:
static QList<ProjectExplorer::Kit *> outdatedKits();
static void removeOutdatedKits();
static ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdk);
static void createAutomaticKits();
static UpgradeOption askForKitUpgrades();
static void upgradeKits(UpgradeOption upgradeOption);
static void upgradeKitInPlace(ProjectExplorer::Kit *kit,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdk);
static void fixKitsDependencies();
void checkUpgradeableKits();
static void fixExistingKits();
void populatePackagesAndTargets();
static void registerQchFiles();
static void registerExamples();
static const QVersionNumber &minimalQulVersion();
// Querying kits:
static QString kitName(const McuTarget* mcuTarget);
static QVersionNumber kitQulVersion(const ProjectExplorer::Kit *kit);
static bool kitUpToDate(const ProjectExplorer::Kit *kit,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage);
private:
void deletePackagesAndTargets();
signals:
void changed();
static bool kitIsUpToDate(const ProjectExplorer::Kit *kit, const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdkPackage);
};
} // namespace Internal

View File

@@ -160,16 +160,15 @@ McuSupportOptionsWidget::McuSupportOptionsWidget()
m_kitCreationPushButton = new QPushButton(tr("Create Kit"));
m_kitCreationPushButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
connect(m_kitCreationPushButton, &QPushButton::clicked, this, [this] {
McuSupportOptions::newKit(currentMcuTarget(), m_options.qtForMCUsSdkPackage);
McuKitManager::newKit(currentMcuTarget(), m_options.qtForMCUsSdkPackage);
McuSupportOptions::registerQchFiles();
updateStatus();
});
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);
for (auto kit: McuKitManager::upgradeableKits(currentMcuTarget(), m_options.qtForMCUsSdkPackage))
McuKitManager::upgradeKitInPlace(kit, currentMcuTarget(), m_options.qtForMCUsSdkPackage);
updateStatus();
});
vLayout->addWidget(m_kitCreationPushButton);
@@ -178,7 +177,10 @@ McuSupportOptionsWidget::McuSupportOptionsWidget()
mainLayout->addStretch();
connect(&m_options, &McuSupportOptions::changed, this, &McuSupportOptionsWidget::updateStatus);
connect(&m_options,
&McuSupportOptions::packagesChanged,
this,
&McuSupportOptionsWidget::updateStatus);
showMcuTargetPackages();
}
@@ -216,13 +218,11 @@ void McuSupportOptionsWidget::updateStatus()
m_kitCreationPushButton->setVisible(mcuTargetValid);
m_kitUpdatePushButton->setVisible(mcuTargetValid);
if (mcuTargetValid) {
const bool hasMatchingKits
= !McuSupportOptions::matchingKits(mcuTarget, m_options.qtForMCUsSdkPackage)
.isEmpty();
const bool hasUpgradeableKits
= !hasMatchingKits
&& !McuSupportOptions::upgradeableKits(mcuTarget, m_options.qtForMCUsSdkPackage)
.isEmpty();
const bool hasMatchingKits = !McuKitManager::matchingKits(
mcuTarget, m_options.qtForMCUsSdkPackage).isEmpty();
const bool hasUpgradeableKits = !hasMatchingKits &&
!McuKitManager::upgradeableKits(
mcuTarget, m_options.qtForMCUsSdkPackage).isEmpty();
m_kitCreationPushButton->setEnabled(!hasMatchingKits);
m_kitUpdatePushButton->setEnabled(hasUpgradeableKits);
@@ -305,7 +305,7 @@ void McuSupportOptionsWidget::apply()
if (pathsChanged) {
m_options.checkUpgradeableKits();
m_options.fixKitsDependencies();
McuKitManager::fixKitsDependencies();
}
}
@@ -314,8 +314,9 @@ void McuSupportOptionsWidget::populateMcuTargetsComboBox()
m_options.populatePackagesAndTargets();
m_mcuTargetsComboBox->clear();
m_mcuTargetsComboBox->addItems(
Utils::transform<QStringList>(m_options.sdkRepository.mcuTargets,
[](McuTarget *t) { return McuSupportOptions::kitName(t); }));
Utils::transform<QStringList>(m_options.sdkRepository.mcuTargets, [](McuTarget *t) {
return McuKitManager::kitName(t);
}));
updateStatus();
}

View File

@@ -93,9 +93,9 @@ void McuSupportPlugin::extensionsInitialized()
ProjectExplorer::DeviceManager::instance()->addDevice(McuSupportDevice::create());
connect(KitManager::instance(), &KitManager::kitsLoaded, []() {
McuSupportOptions::removeOutdatedKits();
McuSupportOptions::createAutomaticKits();
McuSupportOptions::fixExistingKits();
McuKitManager::removeOutdatedKits();
McuKitManager::createAutomaticKits();
McuKitManager::fixExistingKits();
McuSupportPlugin::askUserAboutMcuSupportKitsSetup();
});
}
@@ -106,7 +106,7 @@ void McuSupportPlugin::askUserAboutMcuSupportKitsSetup()
if (!ICore::infoBar()->canInfoBeAdded(setupMcuSupportKits)
|| McuSupportOptions::qulDirFromSettings().isEmpty()
|| !McuSupportOptions::existingKits(nullptr).isEmpty())
|| !McuKitManager::existingKits(nullptr).isEmpty())
return;
Utils::InfoBarEntry info(setupMcuSupportKits,
@@ -130,18 +130,19 @@ void McuSupportPlugin::askUserAboutMcuSupportKitsUpgrade()
Utils::InfoBarEntry info(upgradeMcuSupportKits,
tr("New version of Qt for MCUs detected. Upgrade existing Kits?"),
Utils::InfoBarEntry::GlobalSuppression::Enabled);
static McuKitManager::UpgradeOption selectedOption = McuKitManager::UpgradeOption::Keep;
static McuSupportOptions::UpgradeOption selectedOption;
const QStringList options = {tr("Create new kits"), tr("Replace existing kits")};
selectedOption = McuSupportOptions::UpgradeOption::Keep;
const QStringList options = { tr("Create new kits"), tr("Replace existing kits") };
info.setComboInfo(options, [options](const QString &selected) {
selectedOption = options.indexOf(selected) == 0 ? McuSupportOptions::UpgradeOption::Keep
: McuSupportOptions::UpgradeOption::Replace;
selectedOption = options.indexOf(selected) == 0 ? McuKitManager::UpgradeOption::Keep
: McuKitManager::UpgradeOption::Replace;
});
info.addCustomButton(tr("Proceed"), [upgradeMcuSupportKits] {
ICore::infoBar()->removeInfo(upgradeMcuSupportKits);
QTimer::singleShot(0, []() { McuSupportOptions::upgradeKits(selectedOption); });
QTimer::singleShot(0, []() {
McuKitManager::upgradeKitsByCreatingNewPackage(selectedOption);
});
});
ICore::infoBar()->addInfo(info);

View File

@@ -791,7 +791,7 @@ void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo)
std::sort(repo->mcuTargets.begin(),
repo->mcuTargets.end(),
[](const McuTarget *lhs, const McuTarget *rhs) {
return McuSupportOptions::kitName(lhs) < McuSupportOptions::kitName(rhs);
return McuKitManager::kitName(lhs) < McuKitManager::kitName(rhs);
});
}

View File

@@ -65,7 +65,7 @@ void McuSupportTest::test_addNewKit()
QSignalSpy kitAddedSpy(&kitManager, &KitManager::kitAdded);
auto *newKit{McuSupportOptions::newKit(&mcuTarget, &freeRtosPackage)};
auto *newKit{McuKitManager::newKit(&mcuTarget, &freeRtosPackage)};
QVERIFY(newKit != nullptr);
QCOMPARE(kitAddedSpy.count(), 1);