From f08fe165ab586e6142eb3d6187e7e10087cd2bcf Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 7 May 2020 12:38:28 +0200 Subject: McuSupport: Read supported targets from SDK .json files ... Replace the current hard-coded list of supported (non-Desktop) targets. Task-number: UL-2012 Change-Id: I65851d11eea9f62635d56c42788caeae8a77a4f3 Reviewed-by: Eike Ziller --- src/plugins/mcusupport/mcusupportoptions.cpp | 6 +- src/plugins/mcusupport/mcusupportsdk.cpp | 222 +++++++++++++++++---------- src/plugins/mcusupport/mcusupportsdk.h | 9 +- 3 files changed, 148 insertions(+), 89 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 2ce44293b7..894eb9cb4c 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -61,7 +61,7 @@ namespace McuSupport { namespace Internal { -static const int KIT_VERSION = 3; // Bumps up whenever details in Kit creation change +static const int KIT_VERSION = 4; // Bumps up whenever details in Kit creation change static QString packagePathFromSettings(const QString &settingsKey, const QString &defaultPath = {}) { @@ -441,14 +441,14 @@ void McuSupportOptions::deletePackagesAndTargets() const QVersionNumber &McuSupportOptions::supportedQulVersion() { - static const QVersionNumber v({1, 1, 0}); + static const QVersionNumber v({1, 1}); return v; } void McuSupportOptions::setQulDir(const Utils::FilePath &dir) { deletePackagesAndTargets(); - Sdk::hardcodedTargetsAndPackages(dir, &packages, &mcuTargets); + Sdk::targetsAndPackages(dir, &packages, &mcuTargets); //packages.append(qtForMCUsSdkPackage); for (auto package : packages) { connect(package, &McuPackage::changed, [this](){ diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index bd57cd5c50..42e59f80c9 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -27,10 +27,17 @@ #include "mcusupportoptions.h" #include "mcusupportsdk.h" +#include #include #include #include +#include +#include +#include +#include +#include +#include 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 *packages, - QVector *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 stmEvalPackages = { - armGccPackage, stm32CubeProgrammerPackage}; - QVector nxpEvalPackages = { - armGccPackage, mcuXpressoIdePackage}; - QVector renesasEvalPackages = { - ghsToolchainPackage, rglPackage}; - QVector 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 &packages; - McuToolChainPackage *toolchainPackage; - McuPackage *freeRTOSPackage; - const QVector 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 colorDepths; + QString toolchainId; + QString boardSdkEnvVar; + QString freeRTOSEnvVar; +}; + +static QVector targetsFromDescriptions(const QList &descriptions, + QVector *packages) +{ + const QHash tcPkgs = { + {{"armgcc"}, createArmGccPackage()}, + {{"greenhills"}, createGhsToolchainPackage()}, + {{"desktop"}, createDesktopToolChainPackage()}, + }; + + const QHash 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 required3rdPartyPackages = target.packages; + QHash freeRTOSPkgs; + QVector 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 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 >( + 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 >( + 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 *packages, + QVector *mcuTargets) +{ + QList 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 diff --git a/src/plugins/mcusupport/mcusupportsdk.h b/src/plugins/mcusupport/mcusupportsdk.h index 444855b881..1cc2adadc7 100644 --- a/src/plugins/mcusupport/mcusupportsdk.h +++ b/src/plugins/mcusupport/mcusupportsdk.h @@ -27,6 +27,10 @@ #include +namespace Utils { +class FilePath; +} + namespace McuSupport { namespace Internal { class McuPackage; @@ -36,9 +40,8 @@ namespace Sdk { McuPackage *createQtForMCUsPackage(); -// Legacy: List of targets supported by Qt for MCUs 1.0 -void hardcodedTargetsAndPackages(const Utils::FilePath &qulDir, - QVector *packages, QVector *mcuTargets); +void targetsAndPackages(const Utils::FilePath &qulDir, + QVector *packages, QVector *mcuTargets); } // namespace Sdk } // namespace Internal -- cgit v1.2.3