forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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,
|
||||
|
@@ -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 };
|
||||
|
||||
|
@@ -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*>;
|
||||
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
|
||||
|
@@ -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
|
||||
|
@@ -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();
|
||||
|
@@ -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
|
||||
|
@@ -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); });
|
||||
});
|
||||
|
@@ -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,7 +440,7 @@ static McuAbstractTargetFactory::Ptr createFactory(bool isLegacy)
|
||||
return result;
|
||||
}
|
||||
|
||||
QPair<Targets, Packages> targetsFromDescriptions(const QList<McuTargetDescription> &descriptions,
|
||||
McuSdkRepository targetsFromDescriptions(const QList<McuTargetDescription> &descriptions,
|
||||
bool isLegacy)
|
||||
{
|
||||
Targets mcuTargets;
|
||||
@@ -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,
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -24,8 +24,8 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include "mcutarget.h"
|
||||
#include "mcupackage.h"
|
||||
#include "mcukitmanager.h"
|
||||
#include "mcupackage.h"
|
||||
#include "mcusupportplugin.h"
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
@@ -38,7 +38,7 @@ McuTarget::McuTarget(const QVersionNumber &qulVersion,
|
||||
const Platform &platform,
|
||||
OS os,
|
||||
const Packages &packages,
|
||||
const McuToolChainPackage *toolChainPackage,
|
||||
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;
|
||||
}
|
||||
|
@@ -64,13 +64,13 @@ public:
|
||||
const Platform &platform,
|
||||
OS os,
|
||||
const Packages &packages,
|
||||
const McuToolChainPackage *toolChainPackage,
|
||||
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
|
||||
|
||||
|
@@ -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),
|
||||
packages.unite(targetPackages);
|
||||
mcuTargets.append(McuTargetPtr{
|
||||
new McuTarget{QVersionNumber::fromString(desc.qulVersion),
|
||||
platform,
|
||||
deduceOperatingSystem(desc),
|
||||
targetPackages,
|
||||
new McuToolChainPackage{{}, {}, {}, {}, {}},
|
||||
colorDepth});
|
||||
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;
|
||||
|
@@ -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,
|
||||
McuPackagePtr{
|
||||
createFreeRTOSSourcesPackage(desc.freeRTOS.envVar,
|
||||
boardSdkDefaultPath,
|
||||
desc.freeRTOS.boardSdkSubDir));
|
||||
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),
|
||||
mcuTargets.push_back(McuTargetPtr{new McuTarget{QVersionNumber::fromString(desc.qulVersion),
|
||||
platform,
|
||||
deduceOperatingSystem(desc),
|
||||
required3rdPartyPkgs,
|
||||
tcPkg,
|
||||
colorDepth});
|
||||
colorDepth}});
|
||||
}
|
||||
return {mcuTargets, packages};
|
||||
}
|
||||
|
||||
McuTargetFactoryLegacy::AdditionalPackages McuTargetFactoryLegacy::getAdditionalPackages() const
|
||||
McuAbstractTargetFactory::AdditionalPackages McuTargetFactoryLegacy::getAdditionalPackages() const
|
||||
{
|
||||
return {tcPkgs, vendorPkgs};
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -96,34 +96,34 @@ void McuSupportTest::test_parseCmakeEntries()
|
||||
void McuSupportTest::test_addNewKit()
|
||||
{
|
||||
const QString cmakeVar = "CMAKE_SDK";
|
||||
McuPackage sdkPackage{"sdk", // label
|
||||
McuPackagePtr sdkPackage{new McuPackage{"sdk", // label
|
||||
{}, // defaultPath
|
||||
{}, // detectionPath
|
||||
"sdk", // settingsKey
|
||||
cmakeVar, // cmake var
|
||||
{}}; // env var
|
||||
{}}}; // env var
|
||||
ProjectExplorer::Kit kit;
|
||||
|
||||
McuToolChainPackage
|
||||
toolchainPackage{{}, // label
|
||||
McuToolChainPackagePtr toolchainPackage{
|
||||
new McuToolChainPackage{{}, // label
|
||||
{}, // defaultPath
|
||||
{}, // detectionPath
|
||||
{}, // settingsKey
|
||||
McuToolChainPackage::ToolChainType::Unsupported, // toolchain type
|
||||
{}, // cmake var name
|
||||
{}}; // env 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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user