aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/mcusupport/mcusupportsdk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/mcusupport/mcusupportsdk.cpp')
-rw-r--r--src/plugins/mcusupport/mcusupportsdk.cpp222
1 files changed, 139 insertions, 83 deletions
diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp
index bd57cd5c50..757d919315 100644
--- a/src/plugins/mcusupport/mcusupportsdk.cpp
+++ b/src/plugins/mcusupport/mcusupportsdk.cpp
@@ -27,10 +27,17 @@
#include "mcusupportoptions.h"
#include "mcusupportsdk.h"
+#include <utils/algorithm.h>
#include <utils/hostosinfo.h>
#include <utils/fileutils.h>
#include <QDir>
+#include <QDirIterator>
+#include <QHash>
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QVariant>
namespace McuSupport {
namespace Internal {
@@ -220,9 +227,9 @@ static McuPackage *createMcuXpressoIdePackage()
return result;
}
-static McuPackage *createFreeRTOSSourcesPackage(const QString &envVarPrefix)
+static McuPackage *createFreeRTOSSourcesPackage(const QString &envVar)
{
- const QString envVar = envVarPrefix + "_FREERTOS_DIR";
+ const QString envVarPrefix = envVar.chopped(strlen("_FREERTOS_DIR"));
const QString defaultPath =
qEnvironmentVariableIsSet(envVar.toLatin1()) ?
@@ -238,98 +245,147 @@ static McuPackage *createFreeRTOSSourcesPackage(const QString &envVarPrefix)
return result;
}
-void hardcodedTargetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage *> *packages,
- QVector<McuTarget *> *mcuTargets)
+struct McuTargetDescription
{
- McuToolChainPackage* armGccPackage = Sdk::createArmGccPackage();
- McuToolChainPackage *ghsToolchainPackage = createGhsToolchainPackage();
- McuToolChainPackage* desktopToolChainPackage = createDesktopToolChainPackage();
- McuPackage* stm32CubeFwF7SdkPackage = Sdk::createStm32CubeFwF7SdkPackage();
- McuPackage* stm32CubeProgrammerPackage = Sdk::createStm32CubeProgrammerPackage();
- McuPackage* evkbImxrt1050SdkPackage = Sdk::createEvkbImxrt1050SdkPackage();
- McuPackage *mcuXpressoIdePackage = createMcuXpressoIdePackage();
- McuPackage *rglPackage = createRGLPackage();
- McuPackage *freeRTOSSTM32F7Package = createFreeRTOSSourcesPackage("STM32F7");
- McuPackage *freeRTOSIMXRT1050Package = createFreeRTOSSourcesPackage("IMXRT1050");
- McuPackage *freeRTOSIMXRT1064Package = createFreeRTOSSourcesPackage("IMXRT1064");
-
- QVector<McuPackage*> stmEvalPackages = {
- armGccPackage, stm32CubeProgrammerPackage};
- QVector<McuPackage*> nxpEvalPackages = {
- armGccPackage, mcuXpressoIdePackage};
- QVector<McuPackage*> renesasEvalPackages = {
- ghsToolchainPackage, rglPackage};
- QVector<McuPackage*> desktopPackages = {};
- *packages = {
- armGccPackage, desktopToolChainPackage, ghsToolchainPackage,
- stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage,
- mcuXpressoIdePackage, rglPackage,
- freeRTOSSTM32F7Package, freeRTOSIMXRT1050Package, freeRTOSIMXRT1064Package};
-
- const QString vendorStm = "STM";
- const QString vendorNxp = "NXP";
- const QString vendorQt = "Qt";
- const QString vendorRenesas = "Renesas";
-
- const struct {
- const QString &vendor;
- const QString qulPlatform;
- const QVector<McuPackage*> &packages;
- McuToolChainPackage *toolchainPackage;
- McuPackage *freeRTOSPackage;
- const QVector<int> colorDepths;
- } targets[] = {
- {vendorNxp, {"MIMXRT1050-EVK"}, nxpEvalPackages, armGccPackage,
- freeRTOSIMXRT1050Package, {16}},
- {vendorNxp, {"MIMXRT1064-EVK"}, nxpEvalPackages, armGccPackage,
- freeRTOSIMXRT1064Package, {16}},
- {vendorQt, {"Qt"}, desktopPackages, desktopToolChainPackage,
- nullptr, {32}},
- {vendorRenesas, {"RH850-D1M1A"}, renesasEvalPackages, ghsToolchainPackage,
- nullptr, {32}},
- {vendorStm, {"STM32F469I-DISCOVERY"}, stmEvalPackages, armGccPackage,
- nullptr, {24}},
- {vendorStm, {"STM32F7508-DISCOVERY"}, stmEvalPackages, armGccPackage,
- freeRTOSSTM32F7Package, {32, 16}},
- {vendorStm, {"STM32F769I-DISCOVERY"}, stmEvalPackages, armGccPackage,
- freeRTOSSTM32F7Package, {32}},
- {vendorStm, {"STM32H750B-DISCOVERY"}, stmEvalPackages, armGccPackage,
- nullptr, {32}},
- {vendorStm, {"STM32L4R9I-DISCOVERY"}, stmEvalPackages, armGccPackage,
- nullptr, {24}},
- {vendorStm, {"STM32L4R9I-EVAL"}, stmEvalPackages, armGccPackage,
- nullptr, {24}}
+ QString qulVersion;
+ QString platform;
+ QString platformVendor;
+ QVector<int> colorDepths;
+ QString toolchainId;
+ QString boardSdkEnvVar;
+ QString freeRTOSEnvVar;
+};
+
+static QVector<McuTarget *> targetsFromDescriptions(const QList<McuTargetDescription> &descriptions,
+ QVector<McuPackage *> *packages)
+{
+ const QHash<QString, McuToolChainPackage *> tcPkgs = {
+ {{"armgcc"}, createArmGccPackage()},
+ {{"greenhills"}, createGhsToolchainPackage()},
+ {{"desktop"}, createDesktopToolChainPackage()},
+ };
+
+ const QHash<QString, McuPackage *> vendorPkgs = {
+ {{"ST"}, createStm32CubeProgrammerPackage()},
+ {{"NXP"}, createMcuXpressoIdePackage()},
+ {{"Renesas"}, createRGLPackage()}
};
- const QString QulTargetTemplate =
- dir.toString() + "/lib/cmake/Qul/QulTargets/QulTargets_%1_%2.cmake";
- for (const auto target : targets) {
- for (auto os : {McuTarget::OS::Desktop, McuTarget::OS::BareMetal,
- McuTarget::OS::FreeRTOS}) {
- for (int colorDepth : target.colorDepths) {
- QVector<McuPackage*> required3rdPartyPackages = target.packages;
+ QHash<QString, McuPackage *> freeRTOSPkgs;
+ QVector<McuTarget *> mcuTargets;
+
+ for (auto desc : descriptions) {
+ McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchainId);
+ if (desc.toolchainId == "desktop") {
+ auto mcuTarget = new McuTarget(desc.platformVendor, desc.platform,
+ McuTarget::OS::Desktop, {}, tcPkg);
+ mcuTargets.append(mcuTarget);
+ continue;
+ }
+ for (auto os : {McuTarget::OS::BareMetal, McuTarget::OS::FreeRTOS}) {
+ for (int colorDepth : desc.colorDepths) {
+ QVector<McuPackage*> required3rdPartyPkgs = {
+ vendorPkgs.value(desc.platformVendor), tcPkg
+ };
if (os == McuTarget::OS::FreeRTOS) {
- if (target.freeRTOSPackage)
- required3rdPartyPackages.append(target.freeRTOSPackage);
- else
+ if (desc.freeRTOSEnvVar.isEmpty()) {
continue;
- } else if (os == McuTarget::OS::Desktop && target.toolchainPackage->type()
- != McuToolChainPackage::TypeDesktop) {
- continue;
+ } else {
+ if (!freeRTOSPkgs.contains(desc.freeRTOSEnvVar)) {
+ auto freeRTOSPkg = createFreeRTOSSourcesPackage(desc.freeRTOSEnvVar);
+ freeRTOSPkgs.insert(desc.freeRTOSEnvVar, freeRTOSPkg);
+ }
+ required3rdPartyPkgs.append(freeRTOSPkgs.value(desc.freeRTOSEnvVar));
+ }
}
- 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, os,
- required3rdPartyPackages, target.toolchainPackage);
- if (target.colorDepths.count() > 1)
+ auto mcuTarget = new McuTarget(desc.platformVendor, desc.platform, os,
+ required3rdPartyPkgs, tcPkg);
+ if (desc.colorDepths.count() > 1)
mcuTarget->setColorDepth(colorDepth);
- mcuTargets->append(mcuTarget);
+ mcuTargets.append(mcuTarget);
}
}
}
+
+ packages->append(Utils::transform<QVector<McuPackage *> >(
+ tcPkgs.values(), [&](McuToolChainPackage *tcPkg) { return tcPkg; }));
+ packages->append(vendorPkgs.values().toVector());
+ packages->append(freeRTOSPkgs.values().toVector());
+
+ return mcuTargets;
+}
+
+static QFileInfoList targetDescriptionFiles(const Utils::FilePath &dir)
+{
+ // Workaround for UL-2390: Instead of "./kits/", walk through "./lib/cmake/Qul/boards/"
+ QFileInfoList result;
+ QDirIterator it(dir.toString() + "/lib/cmake/Qul/boards/", {QLatin1String("*.json")},
+ QDir::Files, QDirIterator::Subdirectories);
+ while (it.hasNext())
+ result.append(it.next());
+ return result;
+}
+
+static QString freeRTOSEnvVarForPlatform(const QString &platform)
+{
+ if (platform == "STM32F769I-DISCOVERY" || platform == "STM32F7508-DISCOVERY")
+ return {"STM32F7_FREERTOS_DIR"};
+ else if (platform == "MIMXRT1050-EVK")
+ return {"IMXRT1050_FREERTOS_DIR"};
+ else if (platform == "MIMXRT1064-EVK")
+ return {"IMXRT1064_FREERTOS_DIR"};
+
+ return {};
+}
+
+static McuTargetDescription parseDescriptionJson(const QByteArray &data)
+{
+ const QJsonDocument document = QJsonDocument::fromJson(data);
+ const QJsonObject target = document.object();
+ const QJsonObject toolchain = target.value("toolchain").toObject();
+ const QJsonObject boardSdk = target.value("boardSdk").toObject();
+
+ const QString platform = target.value("platform").toString();
+
+ const QVariantList colorDepths = target.value("colorDepths").toArray().toVariantList();
+ const auto colorDepthsVector = Utils::transform<QVector<int> >(
+ colorDepths, [&](const QVariant &colorDepth) { return colorDepth.toInt(); });
+
+ return {
+ target.value("qulVersion").toString(),
+ platform,
+ target.value("platformVendor").toString(),
+ colorDepthsVector,
+ toolchain.value("id").toString(),
+ boardSdk.value("boardSdkEnvVar").toString(),
+ freeRTOSEnvVarForPlatform(platform) // Workaround for UL-2514: Missing FreeRTOS information
+ };
+}
+
+void targetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage *> *packages,
+ QVector<McuTarget *> *mcuTargets)
+{
+ QList<McuTargetDescription> descriptions;
+
+ for (const QFileInfo &fileInfo : targetDescriptionFiles(dir)) {
+ QFile file(fileInfo.absoluteFilePath());
+ if (!file.open(QFile::ReadOnly))
+ continue;
+ const McuTargetDescription desc = parseDescriptionJson(file.readAll());
+ if (!McuSupportOptions::supportedQulVersion()
+ .isPrefixOf(QVersionNumber::fromString(desc.qulVersion)))
+ continue;
+ descriptions.append(desc);
+ }
+
+ if (!descriptions.isEmpty()) {
+ // Workaround for missing JSON file for Desktop target:
+ descriptions.prepend({McuSupportOptions::supportedQulVersion().toString(),
+ {"Qt"}, {"Qt"}, {32}, {"desktop"}, {}, {}});
+
+ mcuTargets->append(targetsFromDescriptions(descriptions, packages));
+ }
}
} // namespace Sdk