diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 7d58dbf466c..16a36bebd94 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -607,7 +607,9 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarg (qulDir + "/lib/cmake/Qul/QulGenerators.cmake").toUtf8())); config.append(CMakeConfigItem("QUL_PLATFORM", mcuTarget->qulPlatform().toUtf8())); - if (mcuTarget->os() == McuTarget::OS::FreeRTOS) + + if (mcuTarget->qulVersion() <= QVersionNumber{1,3} // OS variable was removed in Qul 1.4 + && mcuTarget->os() == McuTarget::OS::FreeRTOS) config.append(CMakeConfigItem("OS", "FreeRTOS")); if (mcuTarget->colorDepth() >= 0) config.append(CMakeConfigItem("QUL_COLOR_DEPTH", @@ -627,8 +629,12 @@ static void setKitQtVersionOptions(ProjectExplorer::Kit *k) QString McuSupportOptions::kitName(const McuTarget *mcuTarget) { - const QString os = QLatin1String(mcuTarget->os() - == McuTarget::OS::FreeRTOS ? " FreeRTOS" : ""); + QString os; + if (mcuTarget->qulVersion() <= QVersionNumber{1,3} && mcuTarget->os() == McuTarget::OS::FreeRTOS) { + // Starting from Qul 1.4 each OS is a separate platform + os = QLatin1String(" FreeRTOS"); + } + const QString colorDepth = mcuTarget->colorDepth() > 0 ? QString::fromLatin1(" %1bpp").arg(mcuTarget->colorDepth()) : ""; @@ -637,8 +643,12 @@ QString McuSupportOptions::kitName(const McuTarget *mcuTarget) mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop ? "Desktop" : mcuTarget->qulPlatform(); - return QString::fromLatin1("Qt for MCUs %1 - %2%3%4") - .arg(mcuTarget->qulVersion().toString(), targetName, os, colorDepth); + return QString::fromLatin1("Qt for MCUs %1.%2 - %3%4%5") + .arg(QString::number(mcuTarget->qulVersion().majorVersion()), + QString::number(mcuTarget->qulVersion().minorVersion()), + targetName, + os, + colorDepth); } QList McuSupportOptions::existingKits(const McuTarget *mcuTarget) diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index e72760151e4..8c824dec8e9 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -150,7 +150,6 @@ static McuPackage *createRGLPackage() static McuPackage *createStm32CubeProgrammerPackage() { - QString defaultPath = QDir::homePath(); if (Utils::HostOsInfo::isWindowsHost()) { const QString programPath = @@ -204,14 +203,18 @@ static McuPackage *createMcuXpressoIdePackage() static McuPackage *createBoardSdkPackage(const QString &envVar) { - const QString envVarPrefix = envVar.chopped(strlen("_SDK_PATH")); + auto postfixPos = envVar.indexOf("_SDK_PATH"); + if (postfixPos < 0) { + postfixPos = envVar.indexOf("_DIR"); + } + const QString sdkName = postfixPos > 0 ? envVar.left(postfixPos) : envVar; const QString defaultPath = qEnvironmentVariableIsSet(envVar.toLatin1()) ? qEnvironmentVariable(envVar.toLatin1()) : QDir::homePath(); auto result = new McuPackage( - QString::fromLatin1("MCU SDK (%1)").arg(envVarPrefix), + QString::fromLatin1("MCU SDK (%1)").arg(sdkName), defaultPath, {}, envVar); @@ -254,34 +257,42 @@ struct McuTargetDescription QString freeRTOSBoardSdkSubDir; }; -static QVector targetsFromDescriptions(const QList &descriptions, - QVector *packages) +struct McuTargetFactory { - const QHash tcPkgs = { - {{"armgcc"}, createArmGccPackage()}, - {{"greenhills"}, createGhsToolchainPackage()}, - {{"desktop"}, createDesktopToolChainPackage()}, - }; + McuTargetFactory(const QHash &tcPkgs, + const QHash &vendorPkgs) + : tcPkgs(tcPkgs) + , vendorPkgs(vendorPkgs) + {} - const QHash vendorPkgs = { - {{"ST"}, createStm32CubeProgrammerPackage()}, - {{"NXP"}, createMcuXpressoIdePackage()}, - {{"Renesas"}, createRGLPackage()} - }; - - QHash boardSdkPkgs; - QHash freeRTOSPkgs; - QVector mcuTargets; - - for (const auto &desc : descriptions) { - McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchainId); - if (desc.toolchainId == "desktop") { - auto mcuTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion), - desc.platformVendor, desc.platform, - McuTarget::OS::Desktop, {}, tcPkg); - mcuTargets.append(mcuTarget); - continue; + QVector createTargets(const McuTargetDescription& description) + { + if (description.toolchainId == "desktop") { + return createDesktopTargets(description); } + auto qulVersion = QVersionNumber::fromString(description.qulVersion); + if (qulVersion <= QVersionNumber({1,3})) { + // There was a platform backends related refactoring in Qul 1.4 + // This requires different processing of McuTargetDescriptions + return createMcuTargetsLegacy(description); + } + return createMcuTargets(description); + } + + QVector getMcuPackages() const + { + QVector packages; + packages.append(boardSdkPkgs.values().toVector()); + packages.append(freeRTOSPkgs.values().toVector()); + return packages; + } + +protected: + // Implementation for Qul version <= 1.3 + QVector createMcuTargetsLegacy(const McuTargetDescription& desc) + { + QVector mcuTargets; + auto tcPkg = tcPkgs.value(desc.toolchainId); for (auto os : {McuTarget::OS::BareMetal, McuTarget::OS::FreeRTOS}) { for (int colorDepth : desc.colorDepths) { QVector required3rdPartyPkgs = { @@ -319,13 +330,93 @@ static QVector targetsFromDescriptions(const QList createMcuTargets(const McuTargetDescription& desc) + { + QVector mcuTargets; + auto tcPkg = tcPkgs.value(desc.toolchainId); + for (int colorDepth : desc.colorDepths) { + QVector required3rdPartyPkgs = { + vendorPkgs.value(desc.platformVendor), tcPkg + }; + QString boardSdkDefaultPath; + if (!desc.boardSdkEnvVar.isEmpty() + && desc.boardSdkEnvVar != "RGL_DIR") { // Already included in vendorPkgs + if (!boardSdkPkgs.contains(desc.boardSdkEnvVar)) { + auto boardSdkPkg = createBoardSdkPackage(desc.boardSdkEnvVar); + boardSdkPkgs.insert(desc.boardSdkEnvVar, boardSdkPkg); + } + auto boardSdkPkg = boardSdkPkgs.value(desc.boardSdkEnvVar); + boardSdkDefaultPath = boardSdkPkg->defaultPath(); + required3rdPartyPkgs.append(boardSdkPkg); + } + + auto os = McuTarget::OS::BareMetal; + if (!desc.freeRTOSEnvVar.isEmpty()) { + os = McuTarget::OS::FreeRTOS; + if (!freeRTOSPkgs.contains(desc.freeRTOSEnvVar)) { + freeRTOSPkgs.insert(desc.freeRTOSEnvVar, createFreeRTOSSourcesPackage( + desc.freeRTOSEnvVar, boardSdkDefaultPath, + desc.freeRTOSBoardSdkSubDir)); + } + required3rdPartyPkgs.append(freeRTOSPkgs.value(desc.freeRTOSEnvVar)); + } + + auto mcuTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion), + desc.platformVendor, desc.platform, os, + required3rdPartyPkgs, tcPkg); + mcuTarget->setColorDepth(colorDepth); + mcuTargets.append(mcuTarget); + } + return mcuTargets; + } + + QVector createDesktopTargets(const McuTargetDescription& desc) + { + auto tcPkg = tcPkgs.value(desc.toolchainId); + auto desktopTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion), + desc.platformVendor, desc.platform, + McuTarget::OS::Desktop, {}, tcPkg); + return { desktopTarget }; + } + +private: + const QHash &tcPkgs; + const QHash &vendorPkgs; + + QHash boardSdkPkgs; + QHash freeRTOSPkgs; +}; + +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()} + }; + + McuTargetFactory targetFactory(tcPkgs, vendorPkgs); + QVector mcuTargets; + + for (const auto &desc : descriptions) { + auto newTargets = targetFactory.createTargets(desc); + mcuTargets.append(newTargets); } packages->append(Utils::transform >( tcPkgs.values(), [&](McuToolChainPackage *tcPkg) { return tcPkg; })); packages->append(vendorPkgs.values().toVector()); - packages->append(boardSdkPkgs.values().toVector()); - packages->append(freeRTOSPkgs.values().toVector()); + packages->append(targetFactory.getMcuPackages()); return mcuTargets; }