McuSupport: Make hardcoded target list "semi data-driven"

This change pushes the hard-coded list a bit towards a "data-driven"
approach. That way, the planned switch to the .json files based apporach
(see UL-2012) becomes less of a change.

Some target entries are added to match the current target list in Qt
for MCUs packages.

If we don't manage to get the .json-based target listing in place, this
could even serve as fall-back.

Task-number: UL-2012
Change-Id: If39e5d581ac19468b6f52ed221ec2d39bfab9f80
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Alessandro Portale
2020-03-18 03:17:35 +01:00
parent ff6dd4dc2e
commit 7675296fcf
5 changed files with 92 additions and 40 deletions

View File

@@ -334,16 +334,22 @@ McuSupportOptions::McuSupportOptions(QObject *parent)
: QObject(parent)
, qtForMCUsSdkPackage(Sdk::createQtForMCUsPackage())
{
Sdk::hardcodedTargetsAndPackages(qtForMCUsSdkPackage, &packages, &mcuTargets);
packages.append(qtForMCUsSdkPackage);
for (auto package : packages)
connect(package, &McuPackage::changed, [this](){
emit changed();
});
connect(qtForMCUsSdkPackage, &McuPackage::changed,
this, &McuSupportOptions::populatePackagesAndTargets);
}
McuSupportOptions::~McuSupportOptions()
{
deletePackagesAndTargets();
delete qtForMCUsSdkPackage;
}
void McuSupportOptions::populatePackagesAndTargets()
{
setQulDir(Utils::FilePath::fromUserInput(qtForMCUsSdkPackage->path()));
}
void McuSupportOptions::deletePackagesAndTargets()
{
qDeleteAll(packages);
packages.clear();
@@ -351,6 +357,19 @@ McuSupportOptions::~McuSupportOptions()
mcuTargets.clear();
}
void McuSupportOptions::setQulDir(const Utils::FilePath &dir)
{
deletePackagesAndTargets();
Sdk::hardcodedTargetsAndPackages(dir, &packages, &mcuTargets);
//packages.append(qtForMCUsSdkPackage);
for (auto package : packages) {
connect(package, &McuPackage::changed, [this](){
emit changed();
});
}
emit changed();
}
static bool mcuTargetIsDesktop(const McuTarget* mcuTarget)
{
return mcuTarget->qulPlatform() == "Qt";

View File

@@ -35,6 +35,7 @@ class Id;
}
namespace Utils {
class FilePath;
class PathChooser;
class InfoLabel;
}
@@ -158,10 +159,16 @@ public:
QVector<McuTarget*> mcuTargets;
McuPackage *qtForMCUsSdkPackage = nullptr;
void setQulDir(const Utils::FilePath &dir);
QString kitName(const McuTarget* mcuTarget) const;
QList<ProjectExplorer::Kit *> existingKits(const McuTarget *mcuTargt);
ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget);
void populatePackagesAndTargets();
private:
void deletePackagesAndTargets();
signals:
void changed();

View File

@@ -62,6 +62,7 @@ public:
private:
void apply() final;
void populateMcuTargetsComboBox();
void showEvent(QShowEvent *event) final;
QString m_armGccPath;
@@ -108,14 +109,12 @@ McuSupportOptionsWidget::McuSupportOptionsWidget()
m_mcuTargetsGroupBox->setFlat(true);
mainLayout->addWidget(m_mcuTargetsGroupBox);
m_mcuTargetsComboBox = new QComboBox;
m_mcuTargetsComboBox->addItems(
Utils::transform<QStringList>(m_options.mcuTargets, [this](McuTarget *t){
return m_options.kitName(t);
}));
auto layout = new QVBoxLayout(m_mcuTargetsGroupBox);
layout->addWidget(m_mcuTargetsComboBox);
connect(m_mcuTargetsComboBox, &QComboBox::currentTextChanged,
this, &McuSupportOptionsWidget::showMcuTargetPackages);
connect(m_options.qtForMCUsSdkPackage, &McuPackage::changed,
this, &McuSupportOptionsWidget::populateMcuTargetsComboBox);
}
{
@@ -147,15 +146,13 @@ McuSupportOptionsWidget::McuSupportOptionsWidget()
void McuSupportOptionsWidget::updateStatus()
{
const McuTarget *mcuTarget = currentMcuTarget();
if (!mcuTarget)
return;
const bool cMakeAvailable = !CMakeProjectManager::CMakeToolManager::cmakeTools().isEmpty();
// Page elements
{
m_qtForMCUsSdkGroupBox->setVisible(cMakeAvailable);
const bool ready = cMakeAvailable &&
const bool ready = cMakeAvailable && mcuTarget &&
m_options.qtForMCUsSdkPackage->status() == McuPackage::ValidPackage;
m_mcuTargetsGroupBox->setVisible(ready);
m_packagesGroupBox->setVisible(ready && !mcuTarget->packages().isEmpty());
@@ -163,7 +160,7 @@ void McuSupportOptionsWidget::updateStatus()
}
// Kit creation status
{
if (mcuTarget) {
const bool mcuTargetValid = mcuTarget->isValid();
m_kitCreationInfoLabel->setType(mcuTargetValid ? Utils::InfoLabel::Ok
: Utils::InfoLabel::NotOk);
@@ -213,13 +210,15 @@ void McuSupportOptionsWidget::showMcuTargetPackages()
McuTarget *McuSupportOptionsWidget::currentMcuTarget() const
{
const int mcuTargetIndex = m_mcuTargetsComboBox->currentIndex();
return m_options.mcuTargets.isEmpty() ? nullptr : m_options.mcuTargets.at(mcuTargetIndex);
return (mcuTargetIndex == -1 || m_options.mcuTargets.isEmpty())
? nullptr
: m_options.mcuTargets.at(mcuTargetIndex);
}
void McuSupportOptionsWidget::showEvent(QShowEvent *event)
{
Q_UNUSED(event)
updateStatus();
populateMcuTargetsComboBox();
}
void McuSupportOptionsWidget::apply()
@@ -241,6 +240,17 @@ void McuSupportOptionsWidget::apply()
m_options.newKit(mcuTarget);
}
void McuSupportOptionsWidget::populateMcuTargetsComboBox()
{
m_options.populatePackagesAndTargets();
m_mcuTargetsComboBox->clear();
m_mcuTargetsComboBox->addItems(
Utils::transform<QStringList>(m_options.mcuTargets, [this](McuTarget *t){
return m_options.kitName(t);
}));
updateStatus();
}
McuSupportOptionsPage::McuSupportOptionsPage()
{
setId(Core::Id(Constants::SETTINGS_ID));

View File

@@ -158,8 +158,8 @@ static McuPackage *createSeggerJLinkPackage()
return result;
}
void hardcodedTargetsAndPackages(const McuPackage* qtForMCUsSdkPackage,
QVector<McuPackage *> *packages, QVector<McuTarget *> *mcuTargets)
void hardcodedTargetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage *> *packages,
QVector<McuTarget *> *mcuTargets)
{
McuToolChainPackage* armGccPackage = Sdk::createArmGccPackage();
McuPackage* stm32CubeFwF7SdkPackage = Sdk::createStm32CubeFwF7SdkPackage();
@@ -171,6 +171,8 @@ void hardcodedTargetsAndPackages(const McuPackage* qtForMCUsSdkPackage,
armGccPackage, stm32CubeProgrammerPackage};
QVector<McuPackage*> nxpEvalPackages = {
armGccPackage, seggerJLinkPackage};
QVector<McuPackage*> renesasEvalPackages = {
armGccPackage, seggerJLinkPackage};
QVector<McuPackage*> desktopPackages = {};
*packages = {
armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage,
@@ -179,29 +181,43 @@ void hardcodedTargetsAndPackages(const McuPackage* qtForMCUsSdkPackage,
const QString vendorStm = "STM";
const QString vendorNxp = "NXP";
const QString vendorQt = "Qt";
const QString vendorRenesas = "Renesas";
// STM
auto mcuTarget = new McuTarget(vendorStm, "STM32F7508-DISCOVERY", stmEvalPackages,
armGccPackage);
mcuTarget->setColorDepth(32);
mcuTargets->append(mcuTarget);
const struct {
const QString &vendor;
const QString qulPlatform;
const QVector<McuPackage*> &packages;
McuToolChainPackage *toolchainPackage;
const QVector<int> colorDepths;
} targets[] = {
{vendorNxp, "MIMXRT1050-EVK", nxpEvalPackages, armGccPackage, {16}},
{vendorNxp, "MIMXRT1064-EVK", nxpEvalPackages, armGccPackage, {16}},
{vendorQt, "Qt", desktopPackages, nullptr, {32}},
{vendorRenesas, "RH850-D1M1A", renesasEvalPackages, armGccPackage, {32}},
{vendorStm, "STM32F469I-DISCOVERY", stmEvalPackages, armGccPackage, {24}},
{vendorStm, "STM32F7508-DISCOVERY", stmEvalPackages, armGccPackage, {32, 16}},
{vendorStm, "STM32F769I-DISCOVERY", stmEvalPackages, armGccPackage, {32}},
{vendorStm, "STM32H750B-DISCOVERY", stmEvalPackages, armGccPackage, {32}},
{vendorStm, "STM32L4R9I-DISCOVERY", stmEvalPackages, armGccPackage, {24}},
{vendorStm, "STM32L4R9I-EVAL", stmEvalPackages, armGccPackage, {24}}
};
mcuTarget = new McuTarget(vendorStm, "STM32F7508-DISCOVERY", stmEvalPackages, armGccPackage);
mcuTarget->setColorDepth(16);
mcuTargets->append(mcuTarget);
mcuTarget = new McuTarget(vendorStm, "STM32F769I-DISCOVERY", stmEvalPackages, armGccPackage);
mcuTargets->append(mcuTarget);
// NXP
mcuTarget = new McuTarget(vendorNxp, "MIMXRT1050-EVK", nxpEvalPackages, armGccPackage);
mcuTargets->append(mcuTarget);
// Desktop (Qt)
mcuTarget = new McuTarget(vendorQt, "Qt", desktopPackages, nullptr);
mcuTarget->setColorDepth(32);
const QString QulTargetTemplate =
dir.toString() + "/lib/cmake/Qul/QulTargets/QulTargets_%1_%2.cmake";
for (auto target : targets) {
for (int colorDepth : target.colorDepths) {
const QString QulTarget =
QulTargetTemplate.arg(target.qulPlatform, QString::number(colorDepth));
if (!Utils::FilePath::fromUserInput(QulTarget).exists())
continue;
auto mcuTarget = new McuTarget(target.vendor, target.qulPlatform, target.packages,
target.toolchainPackage);
if (target.colorDepths.count() > 1)
mcuTarget->setColorDepth(colorDepth);
mcuTargets->append(mcuTarget);
}
}
}
} // namespace Sdk
} // namespace Internal

View File

@@ -37,7 +37,7 @@ namespace Sdk {
McuPackage *createQtForMCUsPackage();
// Legacy: List of targets supported by Qt for MCUs 1.0
void hardcodedTargetsAndPackages(const McuPackage* const qtForMCUsSdkPackage,
void hardcodedTargetsAndPackages(const Utils::FilePath &qulDir,
QVector<McuPackage*> *packages, QVector<McuTarget*> *mcuTargets);
} // namespace Sdk