McuSupport: Automatic memory management for mcu sdk

Fix crash while automatically restoring kits during startup.
Change packages container to set to avoid duplicates.
Use RAII for McuSdkRepository.

Change-Id: I4b3f4156f0bc770c8a5ea8a171b1f22f6ffb8f96
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Piotr Mućko
2022-03-28 16:42:51 +02:00
parent 652f130fae
commit a3fbfac814
19 changed files with 229 additions and 265 deletions

View File

@@ -45,6 +45,8 @@ public:
ValidPackage
};
virtual ~McuAbstractPackage() = default;
virtual QString label() const = 0;
virtual const QString &cmakeVariableName() const = 0;
virtual const QString &environmentVariableName() const = 0;

View File

@@ -34,9 +34,6 @@
namespace McuSupport::Internal {
class McuAbstractPackage;
class McuToolChainPackage;
namespace Sdk {
struct McuTargetDescription;
@@ -44,11 +41,11 @@ class McuAbstractTargetFactory
{
public:
using Ptr = std::unique_ptr<McuAbstractTargetFactory>;
~McuAbstractTargetFactory() = default;
virtual ~McuAbstractTargetFactory() = default;
virtual QPair<Targets, Packages> createTargets(const McuTargetDescription &) = 0;
using AdditionalPackages
= QPair<QHash<QString, McuToolChainPackage *>, QHash<QString, McuAbstractPackage *>>;
= QPair<QHash<QString, McuToolChainPackagePtr>, QHash<QString, McuPackagePtr>>;
virtual AdditionalPackages getAdditionalPackages() const { return {}; }
}; // struct McuAbstractTargetFactory
} // namespace Sdk

View File

@@ -81,7 +81,7 @@ static const int KIT_VERSION = 9; // Bumps up whenever details in Kit creation c
class McuKitFactory
{
public:
static void setKitToolchains(Kit *k, const McuToolChainPackage *tcPackage)
static void setKitToolchains(Kit *k, const McuToolChainPackagePtr &tcPackage)
{
switch (tcPackage->toolchainType()) {
case McuToolChainPackage::ToolChainType::Unsupported:
@@ -143,7 +143,7 @@ public:
k->setIrrelevantAspects(irrelevant);
}
static void setKitDebugger(Kit *k, const McuToolChainPackage *tcPackage)
static void setKitDebugger(Kit *k, const McuToolChainPackagePtr &tcPackage)
{
if (tcPackage->isDesktopToolchain()) {
// Qt Creator seems to be smart enough to deduce the right Kit debugger from the ToolChain
@@ -184,16 +184,16 @@ public:
static void setKitDependencies(Kit *k,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage)
const McuPackagePtr &qtForMCUsSdkPackage)
{
NameValueItems dependencies;
auto processPackage = [&dependencies](const McuAbstractPackage *package) {
auto processPackage = [&dependencies](const McuPackagePtr &package) {
const auto cmakeVariableName = package->cmakeVariableName();
if (!cmakeVariableName.isEmpty())
dependencies.append({cmakeVariableName, package->detectionPath().toUserOutput()});
};
for (auto package : mcuTarget->packages())
for (const auto &package : mcuTarget->packages())
processPackage(package);
processPackage(qtForMCUsSdkPackage);
@@ -206,7 +206,7 @@ public:
static void setKitEnvironment(Kit *k,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage)
const McuPackagePtr &qtForMCUsSdkPackage)
{
EnvironmentItems changes;
QStringList pathAdditions; // clazy:exclude=inefficient-qlist-soft
@@ -218,12 +218,12 @@ public:
&& !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi())
pathAdditions.append(qtForMCUsSdkPackage->path().pathAppended("bin").toUserOutput());
auto processPackage = [&pathAdditions](const McuAbstractPackage *package) {
auto processPackage = [&pathAdditions](const McuPackagePtr &package) {
if (package->isAddToSystemPath())
pathAdditions.append(package->path().toUserOutput());
};
for (auto package : mcuTarget->packages())
for (const auto &package : mcuTarget->packages())
processPackage(package);
processPackage(qtForMCUsSdkPackage);
@@ -241,7 +241,7 @@ public:
static void setKitCMakeOptions(Kit *k,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage)
const McuPackagePtr &qtForMCUsSdkPackage)
{
using namespace CMakeProjectManager;
auto configMap = cMakeConfigToMap(CMakeConfigurationKitAspect::configuration(k));
@@ -298,7 +298,7 @@ public:
}
}
auto processPackage = [&configMap](const McuAbstractPackage *package) {
auto processPackage = [&configMap](const McuPackagePtr &package) {
if (!package->cmakeVariableName().isEmpty())
configMap.insert(package->cmakeVariableName().toUtf8(),
package->path().toUserOutput().toUtf8());
@@ -321,9 +321,9 @@ public:
}; // class McuKitFactory
// Construct kit
Kit *newKit(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk)
Kit *newKit(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdk)
{
const auto init = [mcuTarget, qtForMCUsSdk](Kit *k) {
const auto init = [&mcuTarget, qtForMCUsSdk](Kit *k) {
KitGuard kitGuard(k);
McuKitFactory::setKitProperties(generateKitNameFromTarget(mcuTarget),
@@ -348,7 +348,7 @@ Kit *newKit(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk)
// Kit Information
QString generateKitNameFromTarget(const McuTarget *mcuTarget)
{
const McuToolChainPackage *tcPkg = mcuTarget->toolChainPackage();
McuToolChainPackagePtr tcPkg = mcuTarget->toolChainPackage();
const QString compilerName = tcPkg && !tcPkg->isDesktopToolchain()
? QString::fromLatin1(" (%1)").arg(
tcPkg->toolChainName().toUpper())
@@ -389,7 +389,7 @@ static FilePath kitDependencyPath(const Kit *kit, const QString &variableName)
// Kit Information
bool kitIsUpToDate(const Kit *kit,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage)
const McuPackagePtr &qtForMCUsSdkPackage)
{
return kitQulVersion(kit) == mcuTarget->qulVersion()
&& kitDependencyPath(kit, qtForMCUsSdkPackage->cmakeVariableName()).toUserOutput()
@@ -414,18 +414,17 @@ QList<Kit *> existingKits(const McuTarget *mcuTarget)
}
// Queries
QList<Kit *> matchingKits(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdkPackage)
QList<Kit *> matchingKits(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdkPackage)
{
return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) {
return Utils::filtered(existingKits(mcuTarget), [&mcuTarget, qtForMCUsSdkPackage](Kit *kit) {
return kitIsUpToDate(kit, mcuTarget, qtForMCUsSdkPackage);
});
}
// Queries
QList<Kit *> upgradeableKits(const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage)
QList<Kit *> upgradeableKits(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdkPackage)
{
return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) {
return Utils::filtered(existingKits(mcuTarget), [&mcuTarget, qtForMCUsSdkPackage](Kit *kit) {
return !kitIsUpToDate(kit, mcuTarget, qtForMCUsSdkPackage);
});
}
@@ -433,10 +432,10 @@ QList<Kit *> upgradeableKits(const McuTarget *mcuTarget,
// Queries
QList<Kit *> kitsWithMismatchedDependencies(const McuTarget *mcuTarget)
{
return Utils::filtered(existingKits(mcuTarget), [mcuTarget](Kit *kit) {
return Utils::filtered(existingKits(mcuTarget), [&mcuTarget](Kit *kit) {
const auto entries = Utils::NameValueDictionary(
McuDependenciesKitAspect::configuration(kit));
return Utils::anyOf(mcuTarget->packages(), [&entries](const McuAbstractPackage *package) {
return Utils::anyOf(mcuTarget->packages(), [&entries](const McuPackagePtr &package) {
const QString cmakeVariableName = package->cmakeVariableName();
return !cmakeVariableName.isEmpty()
&& entries.value(cmakeVariableName) != package->path().toUserOutput();
@@ -456,7 +455,7 @@ QList<Kit *> outdatedKits()
// Maintenance
void createAutomaticKits()
{
auto qtForMCUsPackage = Sdk::createQtForMCUsPackage();
McuPackagePtr qtForMCUsPackage{Sdk::createQtForMCUsPackage()};
const auto createKits = [qtForMCUsPackage]() {
if (McuSupportOptions::automaticKitCreationFromSettings()) {
@@ -501,34 +500,29 @@ void createAutomaticKits()
}
FilePath dir = qtForMCUsPackage->path();
McuSdkRepository repo;
Sdk::targetsAndPackages(dir, &repo);
McuSdkRepository repo{Sdk::targetsAndPackages(dir)};
bool needsUpgrade = false;
for (const auto &target : qAsConst(repo.mcuTargets)) {
// if kit already exists, skip
if (!matchingKits(target, qtForMCUsPackage).empty())
if (!matchingKits(target.get(), qtForMCUsPackage).empty())
continue;
if (!upgradeableKits(target, qtForMCUsPackage).empty()) {
if (!upgradeableKits(target.get(), qtForMCUsPackage).empty()) {
// if kit exists but wrong version/path
needsUpgrade = true;
} else {
// if no kits for this target, create
if (target->isValid())
newKit(target, qtForMCUsPackage);
newKit(target.get(), qtForMCUsPackage);
target->printPackageProblems();
}
}
repo.deletePackagesAndTargets();
if (needsUpgrade)
McuSupportPlugin::askUserAboutMcuSupportKitsUpgrade();
}
};
createKits();
delete qtForMCUsPackage;
}
// Maintenance
@@ -541,18 +535,17 @@ void upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption)
if (upgradeOption == UpgradeOption::Ignore)
return;
auto qtForMCUsPackage = Sdk::createQtForMCUsPackage();
McuPackagePtr qtForMCUsPackage{Sdk::createQtForMCUsPackage()};
auto dir = qtForMCUsPackage->path();
McuSdkRepository repo;
Sdk::targetsAndPackages(dir, &repo);
McuSdkRepository repo{Sdk::targetsAndPackages(dir)};
for (const auto &target : qAsConst(repo.mcuTargets)) {
if (!matchingKits(target, qtForMCUsPackage).empty())
if (!matchingKits(target.get(), qtForMCUsPackage).empty())
// already up-to-date
continue;
const auto kits = upgradeableKits(target, qtForMCUsPackage);
const auto kits = upgradeableKits(target.get(), qtForMCUsPackage);
if (!kits.empty()) {
if (upgradeOption == UpgradeOption::Replace) {
for (auto existingKit : kits)
@@ -560,13 +553,10 @@ void upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption)
}
if (target->isValid())
newKit(target, qtForMCUsPackage);
newKit(target.get(), qtForMCUsPackage);
target->printPackageProblems();
}
}
repo.deletePackagesAndTargets();
delete qtForMCUsPackage;
}
// Maintenance
@@ -574,7 +564,7 @@ void upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption)
// button is available if SDK version changed
void upgradeKitInPlace(ProjectExplorer::Kit *kit,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdk)
const McuPackagePtr &qtForMCUsSdk)
{
McuKitFactory::setKitProperties(generateKitNameFromTarget(mcuTarget),
kit,
@@ -590,24 +580,23 @@ void upgradeKitInPlace(ProjectExplorer::Kit *kit,
// update the corresponding cmake variables in all existing kits
void updatePathsInExistingKits()
{
auto qtForMCUsPackage = Sdk::createQtForMCUsPackage();
McuPackagePtr qtForMCUsPackage{Sdk::createQtForMCUsPackage()};
FilePath dir = qtForMCUsPackage->path();
McuSdkRepository repo;
Sdk::targetsAndPackages(dir, &repo);
McuSdkRepository repo{Sdk::targetsAndPackages(dir)};
for (const auto &target : qAsConst(repo.mcuTargets)) {
if (target->isValid()) {
for (auto *kit : kitsWithMismatchedDependencies(target)) {
for (auto *kit : kitsWithMismatchedDependencies(target.get())) {
auto changes = cMakeConfigToMap(CMakeConfigurationKitAspect::configuration(kit));
const auto updateForPackage = [&changes](const McuAbstractPackage *package) {
const auto updateForPackage = [&changes](const McuPackagePtr &package) {
if (!package->cmakeVariableName().isEmpty() && package->isValidStatus()) {
changes.insert(package->cmakeVariableName().toUtf8(),
package->path().toUserOutput().toUtf8());
}
};
for (auto package : target->packages()) {
for (const auto &package : target->packages()) {
updateForPackage(package);
}
updateForPackage(qtForMCUsPackage);
@@ -618,9 +607,6 @@ void updatePathsInExistingKits()
}
}
}
repo.deletePackagesAndTargets();
delete qtForMCUsPackage;
}
// Maintenance
@@ -679,23 +665,19 @@ void fixExistingKits()
}
// Fix kit dependencies for known targets
auto qtForMCUsPackage = Sdk::createQtForMCUsPackage();
McuPackagePtr qtForMCUsPackage{Sdk::createQtForMCUsPackage()};
qtForMCUsPackage->updateStatus();
if (qtForMCUsPackage->isValidStatus()) {
FilePath dir = qtForMCUsPackage->path();
McuSdkRepository repo;
Sdk::targetsAndPackages(dir, &repo);
McuSdkRepository repo{Sdk::targetsAndPackages(dir)};
for (const auto &target : qAsConst(repo.mcuTargets))
for (auto kit : existingKits(target)) {
for (auto kit : existingKits(target.get())) {
if (McuDependenciesKitAspect::dependencies(kit).isEmpty()) {
McuKitFactory::setKitCMakeOptions(kit, target, qtForMCUsPackage);
McuKitFactory::setKitDependencies(kit, target, qtForMCUsPackage);
McuKitFactory::setKitCMakeOptions(kit, target.get(), qtForMCUsPackage);
McuKitFactory::setKitDependencies(kit, target.get(), qtForMCUsPackage);
}
}
repo.deletePackagesAndTargets();
}
delete qtForMCUsPackage;
}
// Maintenance
@@ -707,4 +689,4 @@ void removeOutdatedKits()
}
} // namespace McuKitManager
} // namespace McuSupport::Internal
} // namespace McuSupport::Internal

View File

@@ -35,8 +35,7 @@ namespace ProjectExplorer {
class Kit;
} // namespace ProjectExplorer
namespace McuSupport {
namespace Internal {
namespace McuSupport::Internal {
class McuAbstractPackage;
class McuTarget;
@@ -45,21 +44,21 @@ namespace McuKitManager {
enum class UpgradeOption { Ignore, Keep, Replace };
// Kit Factory
ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk);
ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdk);
// Kit information
QString generateKitNameFromTarget(const McuTarget *mcuTarget);
QVersionNumber kitQulVersion(const ProjectExplorer::Kit *kit);
bool kitIsUpToDate(const ProjectExplorer::Kit *kit,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage);
const McuPackagePtr &qtForMCUsSdkPackage);
// Queries
QList<ProjectExplorer::Kit *> existingKits(const McuTarget *mcuTarget);
QList<ProjectExplorer::Kit *> matchingKits(const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage);
const McuPackagePtr &qtForMCUsSdkPackage);
QList<ProjectExplorer::Kit *> upgradeableKits(const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdkPackage);
const McuPackagePtr &qtForMCUsSdkPackage);
QList<ProjectExplorer::Kit *> kitsWithMismatchedDependencies(const McuTarget *mcuTarget);
QList<ProjectExplorer::Kit *> outdatedKits();
@@ -68,7 +67,7 @@ void createAutomaticKits();
void upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption);
void upgradeKitInPlace(ProjectExplorer::Kit *kit,
const McuTarget *mcuTarget,
const McuAbstractPackage *qtForMCUsSdk);
const McuPackagePtr &qtForMCUsSdk);
// Fixing kits:
void updatePathsInExistingKits();
@@ -78,7 +77,6 @@ void fixExistingKits();
void removeOutdatedKits();
} // namespace McuKitManager
} // namespace Internal
} // namespace McuSupport
} // namespace McuSupport::Internal
Q_DECLARE_METATYPE(McuSupport::Internal::McuKitManager::UpgradeOption)

View File

@@ -239,10 +239,7 @@ bool McuPackage::writeToSettings() const
QWidget *McuPackage::widget()
{
if (m_widget)
return m_widget;
m_widget = new QWidget;
auto *widget = new QWidget;
m_fileChooser = new PathChooser;
m_fileChooser->lineEdit()->setButtonIcon(FancyLineEdit::Right, Icons::RESET.icon());
m_fileChooser->lineEdit()->setButtonVisible(FancyLineEdit::Right, true);
@@ -250,7 +247,7 @@ QWidget *McuPackage::widget()
m_fileChooser->setFilePath(m_defaultPath);
});
auto layout = new QGridLayout(m_widget);
auto layout = new QGridLayout(widget);
layout->setContentsMargins(0, 0, 0, 0);
m_infoLabel = new InfoLabel();
@@ -277,7 +274,7 @@ QWidget *McuPackage::widget()
});
updateStatus();
return m_widget;
return widget;
}
McuToolChainPackage::McuToolChainPackage(const QString &label,

View File

@@ -64,6 +64,8 @@ public:
const bool addToPath = false,
const Utils::FilePath &relativePathModifier = Utils::FilePath());
~McuPackage() override = default;
QString label() const override;
const QString &cmakeVariableName() const override;
const QString &environmentVariableName() const override;
@@ -89,7 +91,6 @@ private:
void updatePath();
void updateStatusUi();
QWidget *m_widget = nullptr;
Utils::PathChooser *m_fileChooser = nullptr;
Utils::InfoLabel *m_infoLabel = nullptr;
@@ -113,6 +114,7 @@ private:
class McuToolChainPackage : public McuPackage
{
Q_OBJECT
public:
enum class ToolChainType { IAR, KEIL, MSVC, GCC, ArmGcc, GHS, GHSArm, Unsupported };

View File

@@ -25,9 +25,10 @@
#pragma once
#include <QtGlobal>
#include <QList>
#include <QSharedPointer>
#include <QVersionNumber>
#include <QtGlobal>
#if defined(MCUSUPPORT_LIBRARY)
#define MCUSUPPORTSHARED_EXPORT Q_DECL_EXPORT
@@ -39,9 +40,14 @@ namespace McuSupport::Internal {
class McuTarget;
class McuAbstractPackage;
class McuToolChainPackage;
using Targets = QList<McuTarget*>;
using Packages = QList<McuAbstractPackage*>;
static const QVersionNumber legacyVersion {2, 0, 0};
using McuPackagePtr = QSharedPointer<McuAbstractPackage>;
using McuToolChainPackagePtr = QSharedPointer<McuToolChainPackage>;
using McuTargetPtr = QSharedPointer<McuTarget>;
}
using Targets = QList<McuTargetPtr>;
using Packages = QSet<McuPackagePtr>;
static const QVersionNumber legacyVersion{2, 0, 0};
} // namespace McuSupport::Internal

View File

@@ -45,38 +45,28 @@
#include <QMessageBox>
#include <QPushButton>
using CMakeProjectManager::CMakeConfigItem;
using CMakeProjectManager::CMakeConfigurationKitAspect;
using namespace ProjectExplorer;
using namespace Utils;
namespace McuSupport {
namespace Internal {
namespace McuSupport::Internal {
void McuSdkRepository::deletePackagesAndTargets()
{
qDeleteAll(packages);
packages.clear();
mcuTargets.clear();
namespace {
const QString automaticKitCreationSettingsKey = QLatin1String(Constants::SETTINGS_GROUP) + '/'
+ QLatin1String(
Constants::SETTINGS_KEY_AUTOMATIC_KIT_CREATION);
}
McuSupportOptions::McuSupportOptions(QObject *parent)
: QObject(parent)
, qtForMCUsSdkPackage(Sdk::createQtForMCUsPackage())
{
connect(qtForMCUsSdkPackage,
connect(qtForMCUsSdkPackage.get(),
&McuAbstractPackage::changed,
this,
&McuSupportOptions::populatePackagesAndTargets);
m_automaticKitCreation = automaticKitCreationFromSettings();
}
McuSupportOptions::~McuSupportOptions()
{
deletePackagesAndTargets();
delete qtForMCUsSdkPackage;
}
void McuSupportOptions::populatePackagesAndTargets()
{
setQulDir(qtForMCUsSdkPackage->path());
@@ -129,12 +119,16 @@ const QVersionNumber &McuSupportOptions::minimalQulVersion()
void McuSupportOptions::setQulDir(const FilePath &dir)
{
deletePackagesAndTargets();
qtForMCUsSdkPackage->updateStatus();
if (qtForMCUsSdkPackage->isValidStatus())
Sdk::targetsAndPackages(dir, &sdkRepository);
sdkRepository = Sdk::targetsAndPackages(dir);
else
sdkRepository = McuSdkRepository{};
for (const auto &package : qAsConst(sdkRepository.packages))
connect(package, &McuAbstractPackage::changed, this, &McuSupportOptions::packagesChanged);
connect(package.get(),
&McuAbstractPackage::changed,
this,
&McuSupportOptions::packagesChanged);
emit packagesChanged();
}
@@ -167,19 +161,14 @@ McuKitManager::UpgradeOption McuSupportOptions::askForKitUpgrades()
return McuKitManager::UpgradeOption::Ignore;
}
void McuSupportOptions::deletePackagesAndTargets()
{
sdkRepository.deletePackagesAndTargets();
}
void McuSupportOptions::checkUpgradeableKits()
{
if (!qtForMCUsSdkPackage->isValidStatus() || sdkRepository.mcuTargets.size() == 0)
if (!qtForMCUsSdkPackage->isValidStatus() || sdkRepository.mcuTargets.isEmpty())
return;
if (Utils::anyOf(sdkRepository.mcuTargets, [this](const McuTarget *target) {
return !McuKitManager::upgradeableKits(target, this->qtForMCUsSdkPackage).empty()
&& McuKitManager::matchingKits(target, this->qtForMCUsSdkPackage).empty();
if (Utils::anyOf(sdkRepository.mcuTargets, [this](const McuTargetPtr &target) {
return !McuKitManager::upgradeableKits(target.get(), this->qtForMCUsSdkPackage).empty()
&& McuKitManager::matchingKits(target.get(), this->qtForMCUsSdkPackage).empty();
}))
McuKitManager::upgradeKitsByCreatingNewPackage(askForKitUpgrades());
}
@@ -203,20 +192,15 @@ void McuSupportOptions::setAutomaticKitCreationEnabled(const bool enabled)
void McuSupportOptions::writeGeneralSettings() const
{
const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/'
+ QLatin1String(Constants::SETTINGS_KEY_AUTOMATIC_KIT_CREATION);
QSettings *settings = Core::ICore::settings(QSettings::UserScope);
settings->setValue(key, m_automaticKitCreation);
settings->setValue(automaticKitCreationSettingsKey, m_automaticKitCreation);
}
bool McuSupportOptions::automaticKitCreationFromSettings()
{
QSettings *settings = Core::ICore::settings(QSettings::UserScope);
const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/'
+ QLatin1String(Constants::SETTINGS_KEY_AUTOMATIC_KIT_CREATION);
const bool automaticKitCreation = settings->value(key, true).toBool();
const bool automaticKitCreation = settings->value(automaticKitCreationSettingsKey, true).toBool();
return automaticKitCreation;
}
} // namespace Internal
} // namespace McuSupport
} // namespace McuSupport::Internal

View File

@@ -51,23 +51,21 @@ namespace Internal {
class McuAbstractPackage;
class McuSdkRepository
class McuSdkRepository final
{
public:
Packages packages;
Targets mcuTargets;
void deletePackagesAndTargets();
Packages packages;
};
class McuSupportOptions : public QObject
class McuSupportOptions final : public QObject
{
Q_OBJECT
public:
explicit McuSupportOptions(QObject *parent = nullptr);
~McuSupportOptions() override;
McuAbstractPackage *qtForMCUsSdkPackage = nullptr;
McuPackagePtr qtForMCUsSdkPackage{nullptr};
McuSdkRepository sdkRepository;
void setQulDir(const Utils::FilePath &dir);
@@ -90,8 +88,6 @@ public:
static bool automaticKitCreationFromSettings();
private:
void deletePackagesAndTargets();
bool m_automaticKitCreation = true;
signals:
void packagesChanged();

View File

@@ -51,8 +51,7 @@
#include <QPushButton>
#include <QVBoxLayout>
namespace McuSupport {
namespace Internal {
namespace McuSupport::Internal {
class McuSupportOptionsWidget : public Core::IOptionsPageWidget
{
@@ -63,7 +62,7 @@ public:
void updateStatus();
void showMcuTargetPackages();
McuTarget *currentMcuTarget() const;
McuTargetPtr currentMcuTarget() const;
private:
void apply() final;
@@ -73,8 +72,8 @@ private:
QString m_armGccPath;
McuSupportOptions m_options;
QMap<McuPackage *, QWidget *> m_packageWidgets;
QMap<McuTarget *, QWidget *> m_mcuTargetPacketWidgets;
QMap<McuPackagePtr, QWidget *> m_packageWidgets;
QMap<McuTargetPtr, QWidget *> m_mcuTargetPacketWidgets;
QFormLayout *m_packagesLayout = nullptr;
QGroupBox *m_qtForMCUsSdkGroupBox = nullptr;
QGroupBox *m_packagesGroupBox = nullptr;
@@ -123,7 +122,7 @@ McuSupportOptionsWidget::McuSupportOptionsWidget()
&QComboBox::currentTextChanged,
this,
&McuSupportOptionsWidget::showMcuTargetPackages);
connect(m_options.qtForMCUsSdkPackage,
connect(m_options.qtForMCUsSdkPackage.get(),
&McuAbstractPackage::changed,
this,
&McuSupportOptionsWidget::populateMcuTargetsComboBox);
@@ -161,17 +160,17 @@ McuSupportOptionsWidget::McuSupportOptionsWidget()
m_kitCreationPushButton = new QPushButton(tr("Create Kit"));
m_kitCreationPushButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
connect(m_kitCreationPushButton, &QPushButton::clicked, this, [this] {
McuKitManager::newKit(currentMcuTarget(), m_options.qtForMCUsSdkPackage);
McuKitManager::newKit(currentMcuTarget().get(), 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 :
McuKitManager::upgradeableKits(currentMcuTarget(), m_options.qtForMCUsSdkPackage))
for (auto kit : McuKitManager::upgradeableKits(currentMcuTarget().get(),
m_options.qtForMCUsSdkPackage))
McuKitManager::upgradeKitInPlace(kit,
currentMcuTarget(),
currentMcuTarget().get(),
m_options.qtForMCUsSdkPackage);
updateStatus();
});
@@ -191,7 +190,7 @@ McuSupportOptionsWidget::McuSupportOptionsWidget()
void McuSupportOptionsWidget::updateStatus()
{
const McuTarget *mcuTarget = currentMcuTarget();
const McuTargetPtr mcuTarget = currentMcuTarget();
const bool cMakeAvailable = !CMakeProjectManager::CMakeToolManager::cmakeTools().isEmpty();
@@ -222,11 +221,12 @@ void McuSupportOptionsWidget::updateStatus()
m_kitCreationPushButton->setVisible(mcuTargetValid);
m_kitUpdatePushButton->setVisible(mcuTargetValid);
if (mcuTargetValid) {
const bool hasMatchingKits
= !McuKitManager::matchingKits(mcuTarget, m_options.qtForMCUsSdkPackage).isEmpty();
const bool hasMatchingKits = !McuKitManager::matchingKits(mcuTarget.get(),
m_options.qtForMCUsSdkPackage)
.isEmpty();
const bool hasUpgradeableKits
= !hasMatchingKits
&& !McuKitManager::upgradeableKits(mcuTarget, m_options.qtForMCUsSdkPackage)
&& !McuKitManager::upgradeableKits(mcuTarget.get(), m_options.qtForMCUsSdkPackage)
.isEmpty();
m_kitCreationPushButton->setEnabled(!hasMatchingKits);
@@ -263,7 +263,7 @@ void McuSupportOptionsWidget::updateStatus()
void McuSupportOptionsWidget::showMcuTargetPackages()
{
const McuTarget *mcuTarget = currentMcuTarget();
McuTargetPtr mcuTarget = currentMcuTarget();
if (!mcuTarget)
return;
@@ -273,7 +273,7 @@ void McuSupportOptionsWidget::showMcuTargetPackages()
row.fieldItem->widget()->hide();
}
for (auto package : qAsConst(m_options.sdkRepository.packages)) {
for (const auto &package : qAsConst(m_options.sdkRepository.packages)) {
QWidget *packageWidget = package->widget();
if (!mcuTarget->packages().contains(package))
continue;
@@ -284,12 +284,14 @@ void McuSupportOptionsWidget::showMcuTargetPackages()
updateStatus();
}
McuTarget *McuSupportOptionsWidget::currentMcuTarget() const
McuTargetPtr McuSupportOptionsWidget::currentMcuTarget() const
{
const int mcuTargetIndex = m_mcuTargetsComboBox->currentIndex();
return (mcuTargetIndex == -1 || m_options.sdkRepository.mcuTargets.isEmpty())
? nullptr
: m_options.sdkRepository.mcuTargets.at(mcuTargetIndex);
McuTargetPtr target{nullptr};
if (mcuTargetIndex != -1 && !m_options.sdkRepository.mcuTargets.isEmpty())
target = m_options.sdkRepository.mcuTargets.at(mcuTargetIndex);
return target;
}
void McuSupportOptionsWidget::showEvent(QShowEvent *event)
@@ -318,8 +320,8 @@ void McuSupportOptionsWidget::populateMcuTargetsComboBox()
m_options.populatePackagesAndTargets();
m_mcuTargetsComboBox->clear();
m_mcuTargetsComboBox->addItems(
Utils::transform<QStringList>(m_options.sdkRepository.mcuTargets, [](McuTarget *t) {
return McuKitManager::generateKitNameFromTarget(t);
Utils::transform<QStringList>(m_options.sdkRepository.mcuTargets, [](const McuTargetPtr &t) {
return McuKitManager::generateKitNameFromTarget(t.get());
}));
updateStatus();
}
@@ -332,5 +334,4 @@ McuSupportOptionsPage::McuSupportOptionsPage()
setWidgetCreator([] { return new McuSupportOptionsWidget; });
}
} // namespace Internal
} // namespace McuSupport
} // namespace McuSupport::Internal

View File

@@ -25,10 +25,10 @@
#include "mcusupportplugin.h"
#include "mcukitinformation.h"
#include "mcukitmanager.h"
#include "mcusupportconstants.h"
#include "mcusupportdevice.h"
#include "mcusupportoptions.h"
#include "mcukitmanager.h"
#include "mcusupportoptionspage.h"
#include "mcusupportrunconfiguration.h"
@@ -52,6 +52,10 @@
using namespace Core;
using namespace ProjectExplorer;
namespace {
constexpr char setupMcuSupportKits[]{"SetupMcuSupportKits"};
}
namespace McuSupport {
namespace Internal {
@@ -114,8 +118,6 @@ void McuSupportPlugin::extensionsInitialized()
void McuSupportPlugin::askUserAboutMcuSupportKitsSetup()
{
const char setupMcuSupportKits[] = "SetupMcuSupportKits";
if (!ICore::infoBar()->canInfoBeAdded(setupMcuSupportKits)
|| McuSupportOptions::qulDirFromSettings().isEmpty()
|| !McuKitManager::existingKits(nullptr).isEmpty())
@@ -126,7 +128,7 @@ void McuSupportPlugin::askUserAboutMcuSupportKitsSetup()
"To do it later, select Options > Devices > MCU."),
Utils::InfoBarEntry::GlobalSuppression::Enabled);
// clazy:excludeall=connect-3arg-lambda
info.addCustomButton(tr("Create Kits for Qt for MCUs"), [setupMcuSupportKits] {
info.addCustomButton(tr("Create Kits for Qt for MCUs"), [] {
ICore::infoBar()->removeInfo(setupMcuSupportKits);
QTimer::singleShot(0, []() { ICore::showOptionsDialog(Constants::SETTINGS_ID); });
});

View File

@@ -52,7 +52,6 @@
#include <QJsonObject>
#include <QVariant>
#include <ciso646>
#include <memory>
using namespace Utils;
@@ -416,22 +415,22 @@ static McuAbstractTargetFactory::Ptr createFactory(bool isLegacy)
{
McuAbstractTargetFactory::Ptr result;
if (isLegacy) {
static const QHash<QString, McuToolChainPackage *> tcPkgs = {
{{"armgcc"}, createArmGccToolchainPackage()},
{{"greenhills"}, createGhsToolchainPackage()},
{{"iar"}, createIarToolChainPackage()},
{{"msvc"}, createMsvcToolChainPackage()},
{{"gcc"}, createGccToolChainPackage()},
{{"arm-greenhills"}, createGhsArmToolchainPackage()},
static const QHash<QString, McuToolChainPackagePtr> tcPkgs = {
{{"armgcc"}, McuToolChainPackagePtr{createArmGccToolchainPackage()}},
{{"greenhills"}, McuToolChainPackagePtr{createGhsToolchainPackage()}},
{{"iar"}, McuToolChainPackagePtr{createIarToolChainPackage()}},
{{"msvc"}, McuToolChainPackagePtr{createMsvcToolChainPackage()}},
{{"gcc"}, McuToolChainPackagePtr{createGccToolChainPackage()}},
{{"arm-greenhills"}, McuToolChainPackagePtr{createGhsArmToolchainPackage()}},
};
// Note: the vendor name (the key of the hash) is case-sensitive. It has to match the "platformVendor" key in the
// json file.
static const QHash<QString, McuAbstractPackage *> vendorPkgs = {
{{"ST"}, createStm32CubeProgrammerPackage()},
{{"NXP"}, createMcuXpressoIdePackage()},
{{"CYPRESS"}, createCypressProgrammerPackage()},
{{"RENESAS"}, createRenesasProgrammerPackage()},
static const QHash<QString, McuPackagePtr> vendorPkgs = {
{{"ST"}, McuPackagePtr{createStm32CubeProgrammerPackage()}},
{{"NXP"}, McuPackagePtr{createMcuXpressoIdePackage()}},
{{"CYPRESS"}, McuPackagePtr{createCypressProgrammerPackage()}},
{{"RENESAS"}, McuPackagePtr{createRenesasProgrammerPackage()}},
};
result = std::make_unique<McuTargetFactoryLegacy>(tcPkgs, vendorPkgs);
@@ -441,8 +440,8 @@ static McuAbstractTargetFactory::Ptr createFactory(bool isLegacy)
return result;
}
QPair<Targets, Packages> targetsFromDescriptions(const QList<McuTargetDescription> &descriptions,
bool isLegacy)
McuSdkRepository targetsFromDescriptions(const QList<McuTargetDescription> &descriptions,
bool isLegacy)
{
Targets mcuTargets;
Packages mcuPackages;
@@ -451,19 +450,19 @@ QPair<Targets, Packages> targetsFromDescriptions(const QList<McuTargetDescriptio
for (const McuTargetDescription &desc : descriptions) {
auto [targets, packages] = targetFactory->createTargets(desc);
mcuTargets.append(targets);
mcuPackages.append(packages);
mcuPackages.unite(packages);
}
if (isLegacy) {
auto [toolchainPkgs, vendorPkgs]{targetFactory->getAdditionalPackages()};
for (McuAbstractPackage *package : toolchainPkgs) {
mcuPackages.append(package);
for (McuToolChainPackagePtr &package : toolchainPkgs) {
mcuPackages.insert(package);
}
for (McuAbstractPackage *package : vendorPkgs) {
mcuPackages.append(package);
for (McuPackagePtr &package : vendorPkgs) {
mcuPackages.insert(package);
}
}
return {mcuTargets, mcuPackages};
return McuSdkRepository{mcuTargets, mcuPackages};
}
Utils::FilePath kitsPath(const Utils::FilePath &dir)
@@ -587,7 +586,7 @@ bool checkDeprecatedSdkError(const Utils::FilePath &qulDir, QString &message)
return false;
}
void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo)
McuSdkRepository targetsAndPackages(const Utils::FilePath &dir)
{
QList<McuTargetDescription> descriptions;
@@ -637,26 +636,23 @@ void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo)
printMessage(McuTarget::tr("No valid kit descriptions found at %1.")
.arg(kitsPath(dir).toUserOutput()),
true);
return;
return McuSdkRepository{};
} else {
QString deprecationMessage;
if (checkDeprecatedSdkError(dir, deprecationMessage)) {
printMessage(deprecationMessage, true);
return;
return McuSdkRepository{};
}
}
}
const auto tmpTargetLists = targetsFromDescriptions(descriptions, isLegacy);
repo->mcuTargets = tmpTargetLists.first;
repo->packages = tmpTargetLists.second;
McuSdkRepository repo = targetsFromDescriptions(descriptions, isLegacy);
// Keep targets sorted lexicographically
std::sort(repo->mcuTargets.begin(),
repo->mcuTargets.end(),
[](const McuTarget *lhs, const McuTarget *rhs) {
return McuKitManager::generateKitNameFromTarget(lhs)
< McuKitManager::generateKitNameFromTarget(rhs);
});
Utils::sort(repo.mcuTargets, [](const McuTargetPtr &lhs, const McuTargetPtr &rhs) {
return McuKitManager::generateKitNameFromTarget(lhs.get())
< McuKitManager::generateKitNameFromTarget(rhs.get());
});
return repo;
}
FilePath packagePathFromSettings(const QString &settingsKey,

View File

@@ -29,7 +29,6 @@
#include <utils/filepath.h>
#include <QPair>
#include <QSettings>
namespace McuSupport::Internal {
@@ -49,10 +48,10 @@ McuAbstractPackage *createQtForMCUsPackage();
bool checkDeprecatedSdkError(const Utils::FilePath &qulDir, QString &message);
void targetsAndPackages(const Utils::FilePath &qulDir, McuSdkRepository *repo);
McuSdkRepository targetsAndPackages(const Utils::FilePath &qulDir);
McuTargetDescription parseDescriptionJson(const QByteArray &);
QPair<Targets, Packages> targetsFromDescriptions(const QList<McuTargetDescription> &, bool isLegacy);
McuSdkRepository targetsFromDescriptions(const QList<McuTargetDescription> &, bool isLegacy);
Utils::FilePath kitsPath(const Utils::FilePath &dir);

View File

@@ -24,8 +24,8 @@
****************************************************************************/
#include "mcutarget.h"
#include "mcupackage.h"
#include "mcukitmanager.h"
#include "mcupackage.h"
#include "mcusupportplugin.h"
#include <utils/algorithm.h>
@@ -37,8 +37,8 @@ namespace McuSupport::Internal {
McuTarget::McuTarget(const QVersionNumber &qulVersion,
const Platform &platform,
OS os,
const Packages& packages,
const McuToolChainPackage *toolChainPackage,
const Packages &packages,
const McuToolChainPackagePtr &toolChainPackage,
int colorDepth)
: m_qulVersion(qulVersion)
, m_platform(platform)
@@ -48,12 +48,12 @@ McuTarget::McuTarget(const QVersionNumber &qulVersion,
, m_colorDepth(colorDepth)
{}
const Packages &McuTarget::packages() const
Packages McuTarget::packages() const
{
return m_packages;
}
const McuToolChainPackage *McuTarget::toolChainPackage() const
McuToolChainPackagePtr McuTarget::toolChainPackage() const
{
return m_toolChainPackage;
}
@@ -63,14 +63,14 @@ McuTarget::OS McuTarget::os() const
return m_os;
}
const McuTarget::Platform &McuTarget::platform() const
McuTarget::Platform McuTarget::platform() const
{
return m_platform;
}
bool McuTarget::isValid() const
{
return Utils::allOf(packages(), [](McuAbstractPackage *package) {
return Utils::allOf(packages(), [](const McuPackagePtr &package) {
package->updateStatus();
return package->isValidStatus();
});
@@ -95,7 +95,7 @@ void McuTarget::printPackageProblems() const
}
}
const QVersionNumber &McuTarget::qulVersion() const
QVersionNumber McuTarget::qulVersion() const
{
return m_qulVersion;
}

View File

@@ -63,14 +63,14 @@ public:
McuTarget(const QVersionNumber &qulVersion,
const Platform &platform,
OS os,
const Packages& packages,
const McuToolChainPackage *toolChainPackage,
const Packages &packages,
const McuToolChainPackagePtr &toolChainPackage,
int colorDepth = UnspecifiedColorDepth);
const QVersionNumber &qulVersion() const;
const Packages &packages() const;
const McuToolChainPackage *toolChainPackage() const;
const Platform &platform() const;
QVersionNumber qulVersion() const;
Packages packages() const;
McuToolChainPackagePtr toolChainPackage() const;
Platform platform() const;
OS os() const;
int colorDepth() const;
bool isValid() const;
@@ -81,7 +81,7 @@ private:
const Platform m_platform;
const OS m_os;
const Packages m_packages;
const McuToolChainPackage* m_toolChainPackage;
McuToolChainPackagePtr m_toolChainPackage;
const int m_colorDepth;
}; // class McuTarget

View File

@@ -43,13 +43,15 @@ QPair<Targets, Packages> McuTargetFactory::createTargets(const McuTargetDescript
{desc.platform.id, desc.platform.name, desc.platform.vendor});
Packages targetPackages = createPackages(desc);
packages.append(targetPackages);
mcuTargets.append(new McuTarget{QVersionNumber::fromString(desc.qulVersion),
platform,
deduceOperatingSystem(desc),
targetPackages,
new McuToolChainPackage{{}, {}, {}, {}, {}},
colorDepth});
packages.unite(targetPackages);
mcuTargets.append(McuTargetPtr{
new McuTarget{QVersionNumber::fromString(desc.qulVersion),
platform,
deduceOperatingSystem(desc),
targetPackages,
McuToolChainPackagePtr{new McuToolChainPackage{
{}, {}, {}, {}, McuToolChainPackage::ToolChainType::Unsupported}},
colorDepth}});
}
return {mcuTargets, packages};
}
@@ -69,14 +71,14 @@ Packages McuTargetFactory::createPackages(const McuTargetDescription &desc)
QList<PackageDescription> packageDescriptions = aggregatePackageEntries(desc);
for (const PackageDescription &pkgDesc : packageDescriptions) {
packages.append(new McuPackage{
packages.insert(McuPackagePtr{new McuPackage{
pkgDesc.label,
pkgDesc.defaultPath,
pkgDesc.validationPath,
pkgDesc.setting,
pkgDesc.cmakeVar,
pkgDesc.envVar,
});
}});
}
return packages;

View File

@@ -38,67 +38,68 @@ namespace McuSupport::Internal::Sdk {
QPair<Targets, Packages> McuTargetFactoryLegacy::createTargets(const McuTargetDescription &desc)
{
QHash<QString, McuAbstractPackage *> boardSdkPkgs;
QHash<QString, McuAbstractPackage *> freeRTOSPkgs;
QHash<QString, McuPackagePtr> boardSdkPkgs;
QHash<QString, McuPackagePtr> freeRTOSPkgs;
Targets mcuTargets;
Packages packages;
McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchain.id);
McuToolChainPackagePtr tcPkg = tcPkgs.value(desc.toolchain.id);
if (tcPkg) {
tcPkg->setVersions(desc.toolchain.versions);
} else {
tcPkg = createUnsupportedToolChainPackage();
tcPkg.reset(createUnsupportedToolChainPackage());
}
for (int colorDepth : desc.platform.colorDepths) {
Packages required3rdPartyPkgs;
// Desktop toolchains don't need any additional settings
if (tcPkg && !tcPkg->isDesktopToolchain()
&& tcPkg->toolchainType() != McuToolChainPackage::ToolChainType::Unsupported) {
required3rdPartyPkgs.append(tcPkg);
required3rdPartyPkgs.insert(tcPkg);
}
// Add setting specific to platform IDE.
if (vendorPkgs.contains(desc.platform.vendor)) {
required3rdPartyPkgs.append(vendorPkgs.value(desc.platform.vendor));
required3rdPartyPkgs.insert(vendorPkgs.value(desc.platform.vendor));
}
// Board SDK specific settings
Utils::FilePath boardSdkDefaultPath;
if (!desc.boardSdk.envVar.isEmpty()) {
if (!boardSdkPkgs.contains(desc.boardSdk.envVar)) {
McuAbstractPackage *boardSdkPkg = createBoardSdkPackage(desc);
McuPackagePtr boardSdkPkg{createBoardSdkPackage(desc)};
boardSdkPkgs.insert(desc.boardSdk.envVar, boardSdkPkg);
}
McuAbstractPackage *boardSdkPkg{boardSdkPkgs.value(desc.boardSdk.envVar)};
McuPackagePtr boardSdkPkg{boardSdkPkgs.value(desc.boardSdk.envVar)};
boardSdkPkg->setVersions(desc.boardSdk.versions);
boardSdkDefaultPath = boardSdkPkg->defaultPath();
required3rdPartyPkgs.append(boardSdkPkg);
required3rdPartyPkgs.insert(boardSdkPkg);
}
// Free RTOS specific settings.
if (!desc.freeRTOS.envVar.isEmpty()) {
if (!freeRTOSPkgs.contains(desc.freeRTOS.envVar)) {
freeRTOSPkgs.insert(desc.freeRTOS.envVar,
createFreeRTOSSourcesPackage(desc.freeRTOS.envVar,
boardSdkDefaultPath,
desc.freeRTOS.boardSdkSubDir));
McuPackagePtr{
createFreeRTOSSourcesPackage(desc.freeRTOS.envVar,
boardSdkDefaultPath,
desc.freeRTOS.boardSdkSubDir)});
}
required3rdPartyPkgs.append(freeRTOSPkgs.value(desc.freeRTOS.envVar));
required3rdPartyPkgs.insert(freeRTOSPkgs.value(desc.freeRTOS.envVar));
}
packages.append(required3rdPartyPkgs);
packages.unite(required3rdPartyPkgs);
const McuTarget::Platform platform(
{desc.platform.id, desc.platform.name, desc.platform.vendor});
mcuTargets.push_back(new McuTarget{QVersionNumber::fromString(desc.qulVersion),
platform,
deduceOperatingSystem(desc),
required3rdPartyPkgs,
tcPkg,
colorDepth});
mcuTargets.push_back(McuTargetPtr{new McuTarget{QVersionNumber::fromString(desc.qulVersion),
platform,
deduceOperatingSystem(desc),
required3rdPartyPkgs,
tcPkg,
colorDepth}});
}
return {mcuTargets, packages};
}
McuTargetFactoryLegacy::AdditionalPackages McuTargetFactoryLegacy::getAdditionalPackages() const
McuAbstractTargetFactory::AdditionalPackages McuTargetFactoryLegacy::getAdditionalPackages() const
{
return {tcPkgs, vendorPkgs};
}

View File

@@ -35,20 +35,18 @@ namespace McuSupport::Internal::Sdk {
class McuTargetFactoryLegacy : public McuAbstractTargetFactory
{
public:
McuTargetFactoryLegacy(const QHash<QString, McuToolChainPackage *> &tcPkgs,
const QHash<QString, McuAbstractPackage *> &vendorPkgs)
McuTargetFactoryLegacy(const QHash<QString, McuToolChainPackagePtr> &tcPkgs,
const QHash<QString, McuPackagePtr> &vendorPkgs)
: tcPkgs(tcPkgs)
, vendorPkgs(vendorPkgs)
{}
QPair<Targets, Packages> createTargets(const McuTargetDescription &) override;
using AdditionalPackages
= QPair<QHash<QString, McuToolChainPackage *>, QHash<QString, McuAbstractPackage *>>;
AdditionalPackages getAdditionalPackages() const override;
private:
const QHash<QString, McuToolChainPackage *> tcPkgs;
const QHash<QString, McuAbstractPackage *> vendorPkgs;
const QHash<QString, McuToolChainPackagePtr> tcPkgs;
const QHash<QString, McuPackagePtr> vendorPkgs;
}; // struct McuTargetFactoryLegacy
} // namespace McuSupport::Internal::Sdk

View File

@@ -96,34 +96,34 @@ void McuSupportTest::test_parseCmakeEntries()
void McuSupportTest::test_addNewKit()
{
const QString cmakeVar = "CMAKE_SDK";
McuPackage sdkPackage{"sdk", // label
{}, // defaultPath
{}, // detectionPath
"sdk", // settingsKey
cmakeVar, // cmake var
{}}; // env var
McuPackagePtr sdkPackage{new McuPackage{"sdk", // label
{}, // defaultPath
{}, // detectionPath
"sdk", // settingsKey
cmakeVar, // cmake var
{}}}; // env var
ProjectExplorer::Kit kit;
McuToolChainPackage
toolchainPackage{{}, // label
{}, // defaultPath
{}, // detectionPath
{}, // settingsKey
McuToolChainPackage::ToolChainType::Unsupported, // toolchain type
{}, // cmake var name
{}}; // env var name
McuToolChainPackagePtr toolchainPackage{
new McuToolChainPackage{{}, // label
{}, // defaultPath
{}, // detectionPath
{}, // settingsKey
McuToolChainPackage::ToolChainType::Unsupported, // toolchain type
{}, // cmake var name
{}}}; // env var name
const McuTarget::Platform platform{id, name, vendor};
McuTarget mcuTarget{currentQulVersion, // version
platform, // platform
McuTarget::OS::FreeRTOS, // os
{&sdkPackage}, // packages
&toolchainPackage}; // toolchain packages
{sdkPackage}, // packages
toolchainPackage}; // toolchain packages
auto &kitManager{*KitManager::instance()};
QSignalSpy kitAddedSpy(&kitManager, &KitManager::kitAdded);
auto *newKit{McuKitManager::newKit(&mcuTarget, &sdkPackage)};
auto *newKit{McuKitManager::newKit(&mcuTarget, sdkPackage)};
QVERIFY(newKit != nullptr);
QCOMPARE(kitAddedSpy.count(), 1);
@@ -265,10 +265,11 @@ void McuSupportTest::test_createTargetsTheNewWay()
Sdk::McuTargetFactory targetFactory{};
const auto [targets, packages]{targetFactory.createTargets(description)};
QVERIFY(not targets.empty());
QCOMPARE(targets.at(0)->colorDepth(), colorDepth);
const auto &tgtPackages{targets.at(0)->packages()};
const McuTargetPtr target{*targets.constBegin()};
QCOMPARE(target->colorDepth(), colorDepth);
const auto &tgtPackages{target->packages()};
QVERIFY(not tgtPackages.empty());
const auto rtosPackage{tgtPackages.first()};
const auto rtosPackage{*tgtPackages.constBegin()};
QCOMPARE(rtosPackage->environmentVariableName(), nxp1064FreeRtosEnvVar);
}