diff --git a/src/plugins/mcusupport/CMakeLists.txt b/src/plugins/mcusupport/CMakeLists.txt index b40b82443fa..39567605a69 100644 --- a/src/plugins/mcusupport/CMakeLists.txt +++ b/src/plugins/mcusupport/CMakeLists.txt @@ -12,12 +12,14 @@ add_qtc_plugin(McuSupport mcusupportoptionspage.cpp mcusupportoptionspage.h mcupackage.cpp mcupackage.h mcutarget.cpp mcutarget.h + mcutargetfactorylegacy.cpp mcutargetfactorylegacy.h mcutargetfactory.cpp mcutargetfactory.h mcusupportplugin.cpp mcusupportplugin.h mcusupportsdk.cpp mcusupportsdk.h mcusupportrunconfiguration.cpp mcusupportrunconfiguration.h mcusupportversiondetection.cpp mcusupportversiondetection.h mcutargetdescription.h + mcuhelpers.cpp mcuhelpers.h ) add_subdirectory(test) diff --git a/src/plugins/mcusupport/mcuabstracttargetfactory.h b/src/plugins/mcusupport/mcuabstracttargetfactory.h new file mode 100644 index 00000000000..1f4b66893a1 --- /dev/null +++ b/src/plugins/mcusupport/mcuabstracttargetfactory.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "mcusupport_global.h" + +#include +#include + +#include + +namespace McuSupport::Internal { + +class McuAbstractPackage; +class McuToolChainPackage; + +namespace Sdk { +struct McuTargetDescription; + +class McuAbstractTargetFactory +{ +public: + using Ptr = std::unique_ptr; + ~McuAbstractTargetFactory() = default; + + virtual QPair createTargets(const McuTargetDescription &) = 0; + using AdditionalPackages + = QPair, QHash>; + virtual AdditionalPackages getAdditionalPackages() const { return {}; } +}; // struct McuAbstractTargetFactory +} // namespace Sdk +} // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcuhelpers.cpp b/src/plugins/mcusupport/mcuhelpers.cpp new file mode 100644 index 00000000000..04b15cd2fd1 --- /dev/null +++ b/src/plugins/mcusupport/mcuhelpers.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "mcuhelpers.h" +#include "mcutargetdescription.h" + +namespace McuSupport { + +Internal::McuTarget::OS deduceOperatingSystem(const Internal::Sdk::McuTargetDescription &desc) +{ + using OS = Internal::McuTarget::OS; + using TargetType = Internal::Sdk::McuTargetDescription::TargetType; + if (desc.platform.type == TargetType::Desktop) + return OS::Desktop; + else if (!desc.freeRTOS.envVar.isEmpty()) + return OS::FreeRTOS; + return OS::BareMetal; +} + +} //namespace McuSupport diff --git a/src/plugins/mcusupport/mcuhelpers.h b/src/plugins/mcusupport/mcuhelpers.h new file mode 100644 index 00000000000..f70b6c33ade --- /dev/null +++ b/src/plugins/mcusupport/mcuhelpers.h @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "mcutarget.h" + +#include + +namespace McuSupport { + +namespace Internal::Sdk { +struct McuTargetDescription; +} + +Internal::McuTarget::OS deduceOperatingSystem(const Internal::Sdk::McuTargetDescription &); + +}; // namespace McuSupport diff --git a/src/plugins/mcusupport/mcukitmanager.h b/src/plugins/mcusupport/mcukitmanager.h index 64eefff3efa..e4dedc8c560 100644 --- a/src/plugins/mcusupport/mcukitmanager.h +++ b/src/plugins/mcusupport/mcukitmanager.h @@ -29,8 +29,6 @@ #include #include -#include -#include #include namespace ProjectExplorer { @@ -41,7 +39,6 @@ namespace McuSupport { namespace Internal { class McuAbstractPackage; -class McuToolChainPackage; class McuTarget; namespace McuKitManager { diff --git a/src/plugins/mcusupport/mcupackage.h b/src/plugins/mcusupport/mcupackage.h index 91068f786ec..027dd01c132 100644 --- a/src/plugins/mcusupport/mcupackage.h +++ b/src/plugins/mcusupport/mcupackage.h @@ -64,8 +64,6 @@ 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; diff --git a/src/plugins/mcusupport/mcusupport.qbs b/src/plugins/mcusupport/mcusupport.qbs index e20751ab592..f62b39c3d24 100644 --- a/src/plugins/mcusupport/mcusupport.qbs +++ b/src/plugins/mcusupport/mcusupport.qbs @@ -25,6 +25,10 @@ QtcPlugin { "mcutarget.h", "mcutargetfactory.cpp", "mcutargetfactory.h", + "mcutargetfactorylegacy.cpp", + "mcutargetfactorylegacy.h", + "mcutargetfactory.cpp", + "mcutargetfactory.h", "mcusupport.qrc", "mcusupport_global.h", "mcusupportconstants.h", @@ -46,7 +50,9 @@ QtcPlugin { "mcusupportversiondetection.h", "mcutargetdescription.h", "mcukitinformation.cpp", - "mcukitinformation.h" + "mcukitinformation.h", + "mcuhelpers.h", + "mcuhelpers.cpp", ] Group { diff --git a/src/plugins/mcusupport/mcusupport_global.h b/src/plugins/mcusupport/mcusupport_global.h index fd92f43c9c6..6b2c6a5a981 100644 --- a/src/plugins/mcusupport/mcusupport_global.h +++ b/src/plugins/mcusupport/mcusupport_global.h @@ -26,9 +26,22 @@ #pragma once #include +#include +#include #if defined(MCUSUPPORT_LIBRARY) #define MCUSUPPORTSHARED_EXPORT Q_DECL_EXPORT #else #define MCUSUPPORTSHARED_EXPORT Q_DECL_IMPORT #endif + +namespace McuSupport::Internal { + +class McuTarget; +class McuAbstractPackage; + +using Targets = QList; +using Packages = QList; +static const QVersionNumber legacyVersion {2, 0, 0}; + +} diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index aedfb74440a..b721cab550b 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -25,13 +25,13 @@ #include "mcusupportoptions.h" -#include "mcupackage.h" -#include "mcutarget.h" -#include "mcukitmanager.h" #include "mcukitinformation.h" +#include "mcukitmanager.h" +#include "mcupackage.h" #include "mcusupportconstants.h" -#include "mcusupportsdk.h" #include "mcusupportplugin.h" +#include "mcusupportsdk.h" +#include "mcutarget.h" #include #include @@ -57,7 +57,6 @@ void McuSdkRepository::deletePackagesAndTargets() { qDeleteAll(packages); packages.clear(); - qDeleteAll(mcuTargets); mcuTargets.clear(); } @@ -125,8 +124,7 @@ void McuSupportOptions::registerExamples() const QVersionNumber &McuSupportOptions::minimalQulVersion() { - static const QVersionNumber v({2, 0}); - return v; + return legacyVersion; } void McuSupportOptions::setQulDir(const FilePath &dir) @@ -176,7 +174,7 @@ void McuSupportOptions::deletePackagesAndTargets() void McuSupportOptions::checkUpgradeableKits() { - if (!qtForMCUsSdkPackage->isValidStatus() || sdkRepository.mcuTargets.length() == 0) + if (!qtForMCUsSdkPackage->isValidStatus() || sdkRepository.mcuTargets.size() == 0) return; if (Utils::anyOf(sdkRepository.mcuTargets, [this](const McuTarget *target) { diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index 144462a064d..e14c883ae72 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -25,12 +25,12 @@ #pragma once -#include -#include "mcusupport_global.h" #include "mcukitmanager.h" +#include "mcusupport_global.h" + +#include #include -#include #include QT_FORWARD_DECLARE_CLASS(QWidget) @@ -50,15 +50,11 @@ namespace McuSupport { namespace Internal { class McuAbstractPackage; -class McuToolChainPackage; -class McuTarget; -class McuSdkRepository +struct McuSdkRepository { -public: - QVector packages; - QVector mcuTargets; - + Packages packages; + Targets mcuTargets; void deletePackagesAndTargets(); }; @@ -91,6 +87,7 @@ public: void setAutomaticKitCreationEnabled(const bool enabled); void writeGeneralSettings() const; static bool automaticKitCreationFromSettings(); + private: void deletePackagesAndTargets(); @@ -99,6 +96,5 @@ signals: void packagesChanged(); }; - } // namespace Internal } // namespace McuSupport diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 3229759df80..e3a0a962d84 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -146,8 +146,7 @@ McuSupportOptionsWidget::McuSupportOptionsWidget() m_kitAutomaticCreationCheckBox = new QCheckBox( tr("Automatically create kits for all available targets on start")); connect(m_kitAutomaticCreationCheckBox, &QCheckBox::stateChanged, this, [this](int state) { - m_options.setAutomaticKitCreationEnabled( - state == Qt::CheckState::Checked); + m_options.setAutomaticKitCreationEnabled(state == Qt::CheckState::Checked); }); mainLayout->addWidget(m_kitAutomaticCreationCheckBox); } @@ -171,7 +170,9 @@ McuSupportOptionsWidget::McuSupportOptionsWidget() connect(m_kitUpdatePushButton, &QPushButton::clicked, this, [this] { for (auto kit : McuKitManager::upgradeableKits(currentMcuTarget(), m_options.qtForMCUsSdkPackage)) - McuKitManager::upgradeKitInPlace(kit, currentMcuTarget(), m_options.qtForMCUsSdkPackage); + McuKitManager::upgradeKitInPlace(kit, + currentMcuTarget(), + m_options.qtForMCUsSdkPackage); updateStatus(); }); vLayout->addWidget(m_kitCreationPushButton); @@ -223,9 +224,10 @@ void McuSupportOptionsWidget::updateStatus() if (mcuTargetValid) { const bool hasMatchingKits = !McuKitManager::matchingKits(mcuTarget, m_options.qtForMCUsSdkPackage).isEmpty(); - const bool hasUpgradeableKits = !hasMatchingKits && - !McuKitManager::upgradeableKits( - mcuTarget, m_options.qtForMCUsSdkPackage).isEmpty(); + const bool hasUpgradeableKits + = !hasMatchingKits + && !McuKitManager::upgradeableKits(mcuTarget, m_options.qtForMCUsSdkPackage) + .isEmpty(); m_kitCreationPushButton->setEnabled(!hasMatchingKits); m_kitUpdatePushButton->setEnabled(hasUpgradeableKits); @@ -316,8 +318,9 @@ void McuSupportOptionsWidget::populateMcuTargetsComboBox() m_options.populatePackagesAndTargets(); m_mcuTargetsComboBox->clear(); m_mcuTargetsComboBox->addItems( - Utils::transform(m_options.sdkRepository.mcuTargets, - [](McuTarget *t) { return McuKitManager::generateKitNameFromTarget(t); })); + Utils::transform(m_options.sdkRepository.mcuTargets, [](McuTarget *t) { + return McuKitManager::generateKitNameFromTarget(t); + })); updateStatus(); } diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index 06a85db3de3..dfc6e4a0f74 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -33,6 +33,7 @@ #include "mcutarget.h" #include "mcutargetdescription.h" #include "mcutargetfactory.h" +#include "mcutargetfactorylegacy.h" #include #include @@ -50,12 +51,20 @@ #include #include +#include +#include + using namespace Utils; namespace McuSupport { namespace Internal { namespace Sdk { +namespace { +const char CMAKE_ENTRIES[]{"cmakeEntries"}; +const char ID[]{"id"}; +} // namespace + static FilePath findInProgramFiles(const QString &folder) { for (auto envVar : {"ProgramFiles", "ProgramFiles(x86)", "ProgramW6432"}) { @@ -68,14 +77,14 @@ static FilePath findInProgramFiles(const QString &folder) return {}; } -McuPackage *createQtForMCUsPackage() +McuAbstractPackage *createQtForMCUsPackage() { return new McuPackage(McuPackage::tr("Qt for MCUs SDK"), - FileUtils::homePath(), // defaultPath - FilePath("bin/qmltocpp").withExecutableSuffix(), // detectionPath - Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK, // settingsKey - QStringLiteral("Qul_ROOT"), // cmakeVarName - QStringLiteral("Qul_DIR")); // envVarName + FileUtils::homePath(), // defaultPath + FilePath("bin/qmltocpp").withExecutableSuffix(), // detectionPath + Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK, // settingsKey + QStringLiteral("Qul_ROOT"), // cmakeVarName + QStringLiteral("Qul_DIR")); // envVarName } static McuPackageVersionDetector *generatePackageVersionDetector(const QString &envVar) @@ -95,11 +104,10 @@ static McuPackageVersionDetector *generatePackageVersionDetector(const QString & return nullptr; } - /// Create the McuPackage by checking the "boardSdk" property in the JSON file for the board. /// The name of the environment variable pointing to the the SDK for the board will be defined in the "envVar" property /// inside the "boardSdk". -McuPackage *createBoardSdkPackage(const McuTargetDescription &desc) +McuAbstractPackage *createBoardSdkPackage(const McuTargetDescription &desc) { const auto generateSdkName = [](const QString &envVar) { qsizetype postfixPos = envVar.indexOf("_SDK_PATH"); @@ -137,9 +145,9 @@ McuPackage *createBoardSdkPackage(const McuTargetDescription &desc) versionDetector); } -McuPackage *createFreeRTOSSourcesPackage(const QString &envVar, - const FilePath &boardSdkDir, - const QString &freeRTOSBoardSdkSubDir) +McuAbstractPackage *createFreeRTOSSourcesPackage(const QString &envVar, + const FilePath &boardSdkDir, + const QString &freeRTOSBoardSdkSubDir) { const QString envVarPrefix = envVar.chopped(int(strlen("_FREERTOS_DIR"))); @@ -152,14 +160,13 @@ McuPackage *createFreeRTOSSourcesPackage(const QString &envVar, return new McuPackage(QString::fromLatin1("FreeRTOS Sources (%1)").arg(envVarPrefix), defaultPath, {}, // detection path - QString::fromLatin1("FreeRTOSSourcePackage_%1").arg(envVarPrefix), // settings key - "FREERTOS_DIR", // cmake var - envVar, // env var + QString::fromLatin1("FreeRTOSSourcePackage_%1") + .arg(envVarPrefix), // settings key + "FREERTOS_DIR", // cmake var + envVar, // env var "https://freertos.org"); // download url - } - McuToolChainPackage *createUnsupportedToolChainPackage() { return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::ToolChainType::Unsupported); @@ -202,10 +209,10 @@ static McuToolChainPackage *createArmGccToolchainPackage() return new McuToolChainPackage(McuPackage::tr("GNU Arm Embedded Toolchain"), defaultPath, detectionPath, - "GNUArmEmbeddedToolchain", // settingsKey + "GNUArmEmbeddedToolchain", // settingsKey McuToolChainPackage::ToolChainType::ArmGcc, // toolchainType - "QUL_TARGET_TOOLCHAIN_DIR", // cmake var - envVar, // env var + "QUL_TARGET_TOOLCHAIN_DIR", // cmake var + envVar, // env var versionDetector); } @@ -222,11 +229,11 @@ static McuToolChainPackage *createGhsToolchainPackage() return new McuToolChainPackage("Green Hills Compiler", defaultPath, - FilePath("ccv850").withExecutableSuffix(), // detectionPath - "GHSToolchain", // settingsKey - McuToolChainPackage::ToolChainType::GHS, // toolchainType - "QUL_TARGET_TOOLCHAIN_DIR", // cmake var - envVar, // env var + FilePath("ccv850").withExecutableSuffix(), // detectionPath + "GHSToolchain", // settingsKey + McuToolChainPackage::ToolChainType::GHS, // toolchainType + "QUL_TARGET_TOOLCHAIN_DIR", // cmake var + envVar, // env var versionDetector); } @@ -243,11 +250,11 @@ static McuToolChainPackage *createGhsArmToolchainPackage() return new McuToolChainPackage("Green Hills Compiler for ARM", defaultPath, - FilePath("cxarm").withExecutableSuffix(), // detectionPath - "GHSArmToolchain", // settingsKey + FilePath("cxarm").withExecutableSuffix(), // detectionPath + "GHSArmToolchain", // settingsKey McuToolChainPackage::ToolChainType::GHSArm, // toolchainType - "QUL_TARGET_TOOLCHAIN_DIR", // cmake var - envVar, // env var + "QUL_TARGET_TOOLCHAIN_DIR", // cmake var + envVar, // env var versionDetector); } @@ -278,10 +285,10 @@ static McuToolChainPackage *createIarToolChainPackage() return new McuToolChainPackage("IAR ARM Compiler", defaultPath, detectionPath, - "IARToolchain", // settings key + "IARToolchain", // settings key McuToolChainPackage::ToolChainType::IAR, // toolchainType - "QUL_TARGET_TOOLCHAIN_DIR", // cmake var - envVar, // env var + "QUL_TARGET_TOOLCHAIN_DIR", // cmake var + envVar, // env var versionDetector); } @@ -299,24 +306,22 @@ static McuPackage *createStm32CubeProgrammerPackage() defaultPath = programPath; } - const FilePath detectionPath = FilePath::fromString( - QLatin1String(Utils::HostOsInfo::isWindowsHost() - ? "/bin/STM32_Programmer_CLI.exe" - : "/bin/STM32_Programmer.sh") - ); + const FilePath detectionPath = FilePath::fromString( + QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "/bin/STM32_Programmer_CLI.exe" + : "/bin/STM32_Programmer.sh")); auto result = new McuPackage(McuPackage::tr("STM32CubeProgrammer"), defaultPath, detectionPath, "Stm32CubeProgrammer", - {}, // cmake var - {}, // env var + {}, // cmake var + {}, // env var "https://www.st.com/en/development-tools/stm32cubeprog.html", // download url nullptr, // version detector - true, // add to path - "/bin" // relative path modifier - ); + true, // add to path + "/bin" // relative path modifier + ); return result; } @@ -345,9 +350,10 @@ static McuPackage *createMcuXpressoIdePackage() return new McuPackage("MCUXpresso IDE", defaultPath, - FilePath("ide/binaries/crt_emu_cm_redlink").withExecutableSuffix(), // detection path - "MCUXpressoIDE", // settings key - "MCUXPRESSO_IDE_PATH", // cmake var + FilePath("ide/binaries/crt_emu_cm_redlink") + .withExecutableSuffix(), // detection path + "MCUXpressoIDE", // settings key + "MCUXPRESSO_IDE_PATH", // cmake var envVar, "https://www.nxp.com/mcuxpresso/ide"); // download url } @@ -373,9 +379,9 @@ static McuPackage *createCypressProgrammerPackage() auto result = new McuPackage("Cypress Auto Flash Utility", defaultPath, FilePath("/bin/openocd").withExecutableSuffix(), - "CypressAutoFlashUtil", // settings key + "CypressAutoFlashUtil", // settings key "INFINEON_AUTO_FLASH_UTILITY_DIR", // cmake var - envVar); // env var + envVar); // env var return result; } @@ -400,51 +406,64 @@ static McuPackage *createRenesasProgrammerPackage() auto result = new McuPackage("Renesas Flash Programmer", defaultPath, FilePath("rfp-cli").withExecutableSuffix(), - "RenesasFlashProgrammer", // settings key + "RenesasFlashProgrammer", // settings key "RENESAS_FLASH_PROGRAMMER_PATH", // cmake var - envVar); // env var + envVar); // env var return result; } -QVector targetsFromDescriptions(const QList &descriptions, - QVector *packages) +static McuAbstractTargetFactory::Ptr createFactory(bool isLegacy) { - const QHash tcPkgs = { - {{"armgcc"}, createArmGccToolchainPackage()}, - {{"greenhills"}, createGhsToolchainPackage()}, - {{"iar"}, createIarToolChainPackage()}, - {{"msvc"}, createMsvcToolChainPackage()}, - {{"gcc"}, createGccToolChainPackage()}, - {{"arm-greenhills"}, createGhsArmToolchainPackage()}, - }; + McuAbstractTargetFactory::Ptr result; + if (isLegacy) { + static const QHash tcPkgs = { + {{"armgcc"}, createArmGccToolchainPackage()}, + {{"greenhills"}, createGhsToolchainPackage()}, + {{"iar"}, createIarToolChainPackage()}, + {{"msvc"}, createMsvcToolChainPackage()}, + {{"gcc"}, createGccToolChainPackage()}, + {{"arm-greenhills"}, createGhsArmToolchainPackage()}, + }; - // Note: the vendor name (the key of the hash) is case-sensitive. It has to match the "platformVendor" key in the - // json file. - const QHash vendorPkgs = { - {{"ST"}, createStm32CubeProgrammerPackage()}, - {{"NXP"}, createMcuXpressoIdePackage()}, - {{"CYPRESS"}, createCypressProgrammerPackage()}, - {{"RENESAS"}, createRenesasProgrammerPackage()}, - }; + // 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 vendorPkgs = { + {{"ST"}, createStm32CubeProgrammerPackage()}, + {{"NXP"}, createMcuXpressoIdePackage()}, + {{"CYPRESS"}, createCypressProgrammerPackage()}, + {{"RENESAS"}, createRenesasProgrammerPackage()}, + }; - McuTargetFactory targetFactory(tcPkgs, vendorPkgs); - QVector mcuTargets; + result = std::make_unique(tcPkgs, vendorPkgs); + } else { + result = std::make_unique(); + } + return result; +} - for (const auto &desc : descriptions) { - auto newTargets = targetFactory.createTargets(desc); - mcuTargets.append(newTargets); +QPair targetsFromDescriptions(const QList &descriptions, + bool isLegacy) +{ + Targets mcuTargets; + Packages mcuPackages; + + McuAbstractTargetFactory::Ptr targetFactory = createFactory(isLegacy); + for (const McuTargetDescription &desc : descriptions) { + auto [targets, packages] = targetFactory->createTargets(desc); + mcuTargets.append(targets); + mcuPackages.append(packages); } - packages->append( - Utils::transform>(tcPkgs.values(), - [&](McuToolChainPackage *tcPkg) { - return tcPkg; - })); - for (auto *package : vendorPkgs) - packages->append(package); - packages->append(targetFactory.getMcuPackages()); - - return mcuTargets; + if (isLegacy) { + auto [toolchainPkgs, vendorPkgs]{targetFactory->getAdditionalPackages()}; + for (McuAbstractPackage *package : toolchainPkgs) { + mcuPackages.emplace_back(package); + } + for (McuAbstractPackage *package : vendorPkgs) { + mcuPackages.emplace_back(package); + } + } + return {mcuTargets, mcuPackages}; } Utils::FilePath kitsPath(const Utils::FilePath &dir) @@ -458,6 +477,24 @@ static QFileInfoList targetDescriptionFiles(const Utils::FilePath &dir) return kitsDir.entryInfoList(); } +static QList parsePackages(const QJsonArray &cmakeEntries) +{ + QList result; + for (const auto& cmakeEntryRef : cmakeEntries) { + const QJsonObject cmakeEntry{cmakeEntryRef.toObject()}; + result.push_back({cmakeEntry[ID].toString(), + cmakeEntry["envVar"].toString(), + cmakeEntry["cmakeVar"].toString(), + cmakeEntry["description"].toString(), + cmakeEntry["setting"].toString(), + FilePath::fromString(cmakeEntry["defaultValue"].toString()), + FilePath::fromString(cmakeEntry["validation"].toString()), + {}, + false}); + } + return result; +} + McuTargetDescription parseDescriptionJson(const QByteArray &data) { const QJsonDocument document = QJsonDocument::fromJson(data); @@ -469,6 +506,11 @@ McuTargetDescription parseDescriptionJson(const QByteArray &data) const QJsonObject boardSdk = target.value("boardSdk").toObject(); const QJsonObject freeRTOS = target.value("freeRTOS").toObject(); + QJsonArray cmakeEntries = freeRTOS.value(CMAKE_ENTRIES).toArray(); + cmakeEntries.append(toolchain.value(CMAKE_ENTRIES).toArray()); + cmakeEntries.append(boardSdk.value(CMAKE_ENTRIES).toArray()); + const QList freeRtosEntries = parsePackages(cmakeEntries); + const QVariantList toolchainVersions = toolchain.value("versions").toArray().toVariantList(); const auto toolchainVersionsList = Utils::transform(toolchainVersions, [&](const QVariant &version) { @@ -497,30 +539,26 @@ McuTargetDescription parseDescriptionJson(const QByteArray &data) platformName == "Desktop" ? McuTargetDescription::TargetType::Desktop : McuTargetDescription::TargetType::MCU, }, - { - toolchain.value("id").toString(), - toolchainVersionsList, - }, + {toolchain.value("id").toString(), toolchainVersionsList, {}}, { boardSdk.value("name").toString(), boardSdk.value("defaultPath").toString(), boardSdk.value("envVar").toString(), boardSdkVersionsList, + {}, }, { freeRTOS.value("envVar").toString(), freeRTOS.value("boardSdkSubDir").toString(), + freeRtosEntries, }}; } // https://doc.qt.io/qtcreator/creator-developing-mcu.html#supported-qt-for-mcus-sdks static const QString legacySupportVersionFor(const QString &sdkVersion) { - static const QHash oldSdkQtcRequiredVersion = { - {{"1.0"}, {"4.11.x"}}, - {{"1.1"}, {"4.12.0 or 4.12.1"}}, - {{"1.2"}, {"4.12.2 or 4.12.3"}} - }; + static const QHash oldSdkQtcRequiredVersion + = {{{"1.0"}, {"4.11.x"}}, {{"1.1"}, {"4.12.0 or 4.12.1"}}, {{"1.2"}, {"4.12.2 or 4.12.3"}}}; if (oldSdkQtcRequiredVersion.contains(sdkVersion)) return oldSdkQtcRequiredVersion.value(sdkVersion); @@ -553,6 +591,8 @@ void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo) { QList descriptions; + bool isLegacy = false; + auto descriptionFiles = targetDescriptionFiles(dir); for (const QFileInfo &fileInfo : descriptionFiles) { QFile file(fileInfo.absoluteFilePath()); @@ -569,7 +609,12 @@ void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo) false); continue; } - if (QVersionNumber::fromString(desc.qulVersion) < McuSupportOptions::minimalQulVersion()) { + + const auto qulVersion{QVersionNumber::fromString(desc.qulVersion)}; + if (qulVersion == McuSupportOptions::minimalQulVersion()) + isLegacy = true; + + if (qulVersion < McuSupportOptions::minimalQulVersion()) { const QString legacyVersion = legacySupportVersionFor(desc.qulVersion); const QString qtcSupportText = !legacyVersion.isEmpty() @@ -601,14 +646,14 @@ void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo) } } } - - repo->mcuTargets.append(targetsFromDescriptions(descriptions, &(repo->packages))); + std::tie(repo->mcuTargets, repo->packages) = 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); + return McuKitManager::generateKitNameFromTarget(lhs) + < McuKitManager::generateKitNameFromTarget(rhs); }); } diff --git a/src/plugins/mcusupport/mcusupportsdk.h b/src/plugins/mcusupport/mcusupportsdk.h index 1f4594d7aff..ee084664b7d 100644 --- a/src/plugins/mcusupport/mcusupportsdk.h +++ b/src/plugins/mcusupport/mcusupportsdk.h @@ -25,19 +25,19 @@ #pragma once +#include "mcusupport_global.h" + #include +#include #include -#include -namespace McuSupport { -namespace Internal { +namespace McuSupport::Internal { constexpr int MAX_COMPATIBILITY_VERSION{1}; class McuSdkRepository; class McuAbstractPackage; -class McuPackage; class McuToolChainPackage; class McuTarget; @@ -45,15 +45,14 @@ namespace Sdk { struct McuTargetDescription; -McuPackage *createQtForMCUsPackage(); +McuAbstractPackage *createQtForMCUsPackage(); bool checkDeprecatedSdkError(const Utils::FilePath &qulDir, QString &message); void targetsAndPackages(const Utils::FilePath &qulDir, McuSdkRepository *repo); McuTargetDescription parseDescriptionJson(const QByteArray &); -QVector targetsFromDescriptions(const QList &, - QVector *); +QPair targetsFromDescriptions(const QList &, bool isLegacy); Utils::FilePath kitsPath(const Utils::FilePath &dir); @@ -62,11 +61,10 @@ Utils::FilePath packagePathFromSettings(const QString &settingsKey, const Utils::FilePath &defaultPath); McuToolChainPackage *createUnsupportedToolChainPackage(); -McuPackage *createBoardSdkPackage(const McuTargetDescription &desc); -McuPackage *createFreeRTOSSourcesPackage(const QString &envVar, - const Utils::FilePath &boardSdkDir, - const QString &freeRTOSBoardSdkSubDir); +McuAbstractPackage *createBoardSdkPackage(const McuTargetDescription &desc); +McuAbstractPackage *createFreeRTOSSourcesPackage(const QString &envVar, + const Utils::FilePath &boardSdkDir, + const QString &freeRTOSBoardSdkSubDir); } // namespace Sdk -} // namespace Internal -} // namespace McuSupport +} // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcutarget.cpp b/src/plugins/mcusupport/mcutarget.cpp index 2110cd4c1d8..bf151b0bac2 100644 --- a/src/plugins/mcusupport/mcutarget.cpp +++ b/src/plugins/mcusupport/mcutarget.cpp @@ -37,7 +37,7 @@ namespace McuSupport::Internal { McuTarget::McuTarget(const QVersionNumber &qulVersion, const Platform &platform, OS os, - const QVector &packages, + const Packages& packages, const McuToolChainPackage *toolChainPackage, int colorDepth) : m_qulVersion(qulVersion) @@ -48,7 +48,7 @@ McuTarget::McuTarget(const QVersionNumber &qulVersion, , m_colorDepth(colorDepth) {} -const QVector &McuTarget::packages() const +const Packages &McuTarget::packages() const { return m_packages; } diff --git a/src/plugins/mcusupport/mcutarget.h b/src/plugins/mcusupport/mcutarget.h index fbfbd2d6055..602451a7790 100644 --- a/src/plugins/mcusupport/mcutarget.h +++ b/src/plugins/mcusupport/mcutarget.h @@ -25,6 +25,9 @@ #pragma once +#include "mcupackage.h" +#include "mcusupport_global.h" + #include #include @@ -39,7 +42,6 @@ class InfoLabel; namespace McuSupport::Internal { -class McuAbstractPackage; class McuToolChainPackage; class McuTarget : public QObject @@ -61,12 +63,12 @@ public: McuTarget(const QVersionNumber &qulVersion, const Platform &platform, OS os, - const QVector &packages, + const Packages& packages, const McuToolChainPackage *toolChainPackage, int colorDepth = UnspecifiedColorDepth); const QVersionNumber &qulVersion() const; - const QVector &packages() const; + const Packages &packages() const; const McuToolChainPackage *toolChainPackage() const; const Platform &platform() const; OS os() const; @@ -78,10 +80,9 @@ private: const QVersionNumber m_qulVersion; const Platform m_platform; const OS m_os; - const QVector m_packages; - const McuToolChainPackage *m_toolChainPackage; + const Packages m_packages; + const McuToolChainPackage* m_toolChainPackage; const int m_colorDepth; }; // class McuTarget - } // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcutargetdescription.h b/src/plugins/mcusupport/mcutargetdescription.h index ab0699574ad..f1d54eb53de 100644 --- a/src/plugins/mcusupport/mcutargetdescription.h +++ b/src/plugins/mcusupport/mcutargetdescription.h @@ -25,12 +25,27 @@ #pragma once +#include #include #include #include +#include namespace McuSupport::Internal::Sdk { +struct PackageDescription +{ + QString label; + QString envVar; + QString cmakeVar; + QString description; + QString setting; + Utils::FilePath defaultPath; + Utils::FilePath validationPath; + QList versions; + bool shouldAddToSystemPath; +}; //struct PackageDescription + struct McuTargetDescription { enum class TargetType { MCU, Desktop }; @@ -49,6 +64,7 @@ struct McuTargetDescription { QString id; QStringList versions; + QList packages; } toolchain; struct { @@ -56,11 +72,13 @@ struct McuTargetDescription QString defaultPath; QString envVar; QStringList versions; + QList packages; } boardSdk; struct { QString envVar; QString boardSdkSubDir; + QList packages; } freeRTOS; }; diff --git a/src/plugins/mcusupport/mcutargetfactory.cpp b/src/plugins/mcusupport/mcutargetfactory.cpp index d3f171bff30..a01def4f8f5 100644 --- a/src/plugins/mcusupport/mcutargetfactory.cpp +++ b/src/plugins/mcusupport/mcutargetfactory.cpp @@ -24,91 +24,62 @@ ****************************************************************************/ #include "mcutargetfactory.h" +#include "mcuhelpers.h" #include "mcupackage.h" -#include "mcusupportsdk.h" -#include "mcusupportversiondetection.h" #include "mcutarget.h" #include "mcutargetdescription.h" -#include #include namespace McuSupport::Internal::Sdk { -using namespace Utils; - -QVector McuTargetFactory::getMcuPackages() const +QPair McuTargetFactory::createTargets(const McuTargetDescription &desc) { - QVector packages; - for (auto *package : qAsConst(boardSdkPkgs)) - packages.append(package); - for (auto *package : qAsConst(freeRTOSPkgs)) - packages.append(package); + Targets mcuTargets; + Packages packages; + + for (int colorDepth : desc.platform.colorDepths) { + const McuTarget::Platform platform( + {desc.platform.id, desc.platform.name, desc.platform.vendor}); + + Packages targetPackages = createPackages(desc); + packages.append(targetPackages); + mcuTargets.emplace_back(new McuTarget{QVersionNumber::fromString(desc.qulVersion), + platform, + deduceOperatingSystem(desc), + targetPackages, + new McuToolChainPackage{{}, {}, {}, {}, {}}, + colorDepth}); + } + return {mcuTargets, packages}; +} + +QList aggregatePackageEntries(const McuTargetDescription &desc) +{ + QList result; + result.append(desc.boardSdk.packages); + result.append(desc.freeRTOS.packages); + result.append(desc.toolchain.packages); + return result; +} + +Packages McuTargetFactory::createPackages(const McuTargetDescription &desc) +{ + Packages packages; + QList packageDescriptions = aggregatePackageEntries(desc); + + for (const PackageDescription &pkgDesc : packageDescriptions) { + packages.emplace_back(new McuPackage{ + pkgDesc.label, + pkgDesc.defaultPath, + pkgDesc.validationPath, + pkgDesc.setting, + pkgDesc.cmakeVar, + pkgDesc.envVar, + }); + } + return packages; } -QVector McuTargetFactory::createTargets(const McuTargetDescription &desc) -{ - // OS deduction - const auto os = [&] { - if (desc.platform.type == McuTargetDescription::TargetType::Desktop) - return McuTarget::OS::Desktop; - else if (!desc.freeRTOS.envVar.isEmpty()) - return McuTarget::OS::FreeRTOS; - return McuTarget::OS::BareMetal; - }(); - - QVector mcuTargets; - McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchain.id); - if (tcPkg) - tcPkg->setVersions(desc.toolchain.versions); - else - tcPkg = createUnsupportedToolChainPackage(); - for (int colorDepth : desc.platform.colorDepths) { - QVector required3rdPartyPkgs; - // Desktop toolchains don't need any additional settings - if (tcPkg && !tcPkg->isDesktopToolchain() - && tcPkg->toolchainType() != McuToolChainPackage::ToolChainType::Unsupported) - required3rdPartyPkgs.append(tcPkg); - - // Add setting specific to platform IDE - if (vendorPkgs.contains(desc.platform.vendor)) - required3rdPartyPkgs.push_back(vendorPkgs.value(desc.platform.vendor)); - - // Board SDK specific settings - FilePath boardSdkDefaultPath; - if (!desc.boardSdk.envVar.isEmpty()) { - if (!boardSdkPkgs.contains(desc.boardSdk.envVar)) { - auto boardSdkPkg = createBoardSdkPackage(desc); - boardSdkPkgs.insert(desc.boardSdk.envVar, boardSdkPkg); - } - auto boardSdkPkg = boardSdkPkgs.value(desc.boardSdk.envVar); - boardSdkPkg->setVersions(desc.boardSdk.versions); - boardSdkDefaultPath = boardSdkPkg->defaultPath(); - required3rdPartyPkgs.append(boardSdkPkg); - } - - // Free RTOS specific settings - if (!desc.freeRTOS.envVar.isEmpty()) { - if (!freeRTOSPkgs.contains(desc.freeRTOS.envVar)) { - freeRTOSPkgs.insert(desc.freeRTOS.envVar, - createFreeRTOSSourcesPackage(desc.freeRTOS.envVar, - boardSdkDefaultPath, - desc.freeRTOS.boardSdkSubDir)); - } - required3rdPartyPkgs.append(freeRTOSPkgs.value(desc.freeRTOS.envVar)); - } - - const McuTarget::Platform platform( - {desc.platform.id, desc.platform.name, desc.platform.vendor}); - auto mcuTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion), - platform, - os, - required3rdPartyPkgs, - tcPkg, - colorDepth); - mcuTargets.append(mcuTarget); - } - return mcuTargets; -} } // namespace McuSupport::Internal::Sdk diff --git a/src/plugins/mcusupport/mcutargetfactory.h b/src/plugins/mcusupport/mcutargetfactory.h index 1143a9145e2..64b771ecc63 100644 --- a/src/plugins/mcusupport/mcutargetfactory.h +++ b/src/plugins/mcusupport/mcutargetfactory.h @@ -25,39 +25,15 @@ #pragma once -#include -#include +#include "mcuabstracttargetfactory.h" -namespace McuSupport::Internal { +namespace McuSupport::Internal::Sdk { -class McuAbstractPackage; -class McuPackage; -class McuTarget; -class McuToolChainPackage; - -namespace Sdk { - -struct McuTargetDescription; - -class McuTargetFactory +class McuTargetFactory : public McuAbstractTargetFactory { public: - McuTargetFactory(const QHash &tcPkgs, - const QHash &vendorPkgs) - : tcPkgs(tcPkgs) - , vendorPkgs(vendorPkgs) - {} - - QVector createTargets(const McuTargetDescription &description); - QVector getMcuPackages() const; - -private: - const QHash &tcPkgs; - const QHash &vendorPkgs; - - QHash boardSdkPkgs; - QHash freeRTOSPkgs; + QPair createTargets(const McuTargetDescription &) override; + Packages createPackages(const McuTargetDescription &); }; // struct McuTargetFactory -} // namespace Sdk -} // namespace McuSupport::Internal +} // namespace McuSupport::Internal::Sdk diff --git a/src/plugins/mcusupport/mcutargetfactorylegacy.cpp b/src/plugins/mcusupport/mcutargetfactorylegacy.cpp new file mode 100644 index 00000000000..e1dfe80f6a2 --- /dev/null +++ b/src/plugins/mcusupport/mcutargetfactorylegacy.cpp @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "mcutargetfactorylegacy.h" +#include "mcuhelpers.h" +#include "mcupackage.h" +#include "mcusupportsdk.h" +#include "mcusupportversiondetection.h" +#include "mcutarget.h" +#include "mcutargetdescription.h" + +#include +#include + +namespace McuSupport::Internal::Sdk { + +QPair McuTargetFactoryLegacy::createTargets(const McuTargetDescription &desc) +{ + QHash boardSdkPkgs; + QHash freeRTOSPkgs; + Targets mcuTargets; + Packages packages; + McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchain.id); + if (tcPkg) { + tcPkg->setVersions(desc.toolchain.versions); + } else { + tcPkg = 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.emplace_back(tcPkg); + } + + // Add setting specific to platform IDE. + if (vendorPkgs.contains(desc.platform.vendor)) { + required3rdPartyPkgs.emplace_back(vendorPkgs.value(desc.platform.vendor)); + } + + // Board SDK specific settings + Utils::FilePath boardSdkDefaultPath; + if (!desc.boardSdk.envVar.isEmpty()) { + if (!boardSdkPkgs.contains(desc.boardSdk.envVar)) { + const McuAbstractPackage *boardSdkPkg = createBoardSdkPackage(desc); + boardSdkPkgs.emplace(desc.boardSdk.envVar, boardSdkPkg); + } + McuAbstractPackage *boardSdkPkg{boardSdkPkgs.value(desc.boardSdk.envVar)}; + boardSdkPkg->setVersions(desc.boardSdk.versions); + boardSdkDefaultPath = boardSdkPkg->defaultPath(); + required3rdPartyPkgs.emplace_back(boardSdkPkg); + } + + // Free RTOS specific settings. + if (!desc.freeRTOS.envVar.isEmpty()) { + if (!freeRTOSPkgs.contains(desc.freeRTOS.envVar)) { + freeRTOSPkgs.emplace(desc.freeRTOS.envVar, + createFreeRTOSSourcesPackage(desc.freeRTOS.envVar, + boardSdkDefaultPath, + desc.freeRTOS.boardSdkSubDir)); + } + required3rdPartyPkgs.emplace_back(freeRTOSPkgs.value(desc.freeRTOS.envVar)); + } + + packages.append(required3rdPartyPkgs); + const McuTarget::Platform platform( + {desc.platform.id, desc.platform.name, desc.platform.vendor}); + mcuTargets.push_back(new McuTarget{QVersionNumber::fromString(desc.qulVersion), + platform, + deduceOperatingSystem(desc), + required3rdPartyPkgs, + tcPkg, + colorDepth}); + } + return {mcuTargets, packages}; +} + +McuTargetFactoryLegacy::AdditionalPackages McuTargetFactoryLegacy::getAdditionalPackages() const +{ + return {tcPkgs, vendorPkgs}; +} +} // namespace McuSupport::Internal::Sdk diff --git a/src/plugins/mcusupport/mcutargetfactorylegacy.h b/src/plugins/mcusupport/mcutargetfactorylegacy.h new file mode 100644 index 00000000000..ab6626c289d --- /dev/null +++ b/src/plugins/mcusupport/mcutargetfactorylegacy.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "mcuabstracttargetfactory.h" + +#include +#include + +namespace McuSupport::Internal::Sdk { + +class McuTargetFactoryLegacy : public McuAbstractTargetFactory +{ +public: + McuTargetFactoryLegacy(const QHash &tcPkgs, + const QHash &vendorPkgs) + : tcPkgs(tcPkgs) + , vendorPkgs(vendorPkgs) + {} + + QPair createTargets(const McuTargetDescription &) override; + using AdditionalPackages + = QPair, QHash>; + AdditionalPackages getAdditionalPackages() const override; + +private: + const QHash tcPkgs; + const QHash vendorPkgs; +}; // struct McuTargetFactoryLegacy + +} // namespace McuSupport::Internal::Sdk diff --git a/src/plugins/mcusupport/test/armgcc_nxp_1050_json.h b/src/plugins/mcusupport/test/armgcc_nxp_1050_json.h index 81c15d6bdc6..93d437f9485 100644 --- a/src/plugins/mcusupport/test/armgcc_nxp_1050_json.h +++ b/src/plugins/mcusupport/test/armgcc_nxp_1050_json.h @@ -36,7 +36,7 @@ constexpr auto armgcc_nxp_1050_json = R"({ ], "pathEntries": [], "environmentEntries": [], - "cmakeCacheEntries": [ + "cmakeEntries": [ { "id": "Qul_DIR", "description": "Qt for MCUs SDK", @@ -62,7 +62,7 @@ constexpr auto armgcc_nxp_1050_json = R"({ "versions": [ "9.3.1" ], - "cmakeCacheEntries": [ + "cmakeEntries": [ { "id": "ARMGCC_DIR", "description": "GNU Arm Embedded Toolchain", @@ -86,7 +86,7 @@ constexpr auto armgcc_nxp_1050_json = R"({ "versions": [ "2.10.0" ], - "cmakeCacheEntries": [ + "cmakeEntries": [ { "id": "NXP_SDK_DIR", "description": "Board SDK for MIMXRT1050-EVK", @@ -98,7 +98,7 @@ constexpr auto armgcc_nxp_1050_json = R"({ }, "freeRTOS": { "envVar": "IMXRT1050_FREERTOS_DIR", - "cmakeCacheEntries": [ + "cmakeEntries": [ { "id": "NXP_FREERTOS_DIR", "description": "FreeRTOS SDK for MIMXRT1050-EVK", diff --git a/src/plugins/mcusupport/test/armgcc_nxp_1064_json.h b/src/plugins/mcusupport/test/armgcc_nxp_1064_json.h index f03911f405c..30db08faa19 100644 --- a/src/plugins/mcusupport/test/armgcc_nxp_1064_json.h +++ b/src/plugins/mcusupport/test/armgcc_nxp_1064_json.h @@ -29,13 +29,14 @@ constexpr auto armgcc_nxp_1064_json = R"({ "compatVersion": "1", "qulVersion": "2.0.0", "boardSdk": { - "cmakeCacheEntries": [ + "cmakeEntries": [ { "cmakeOptionName": "QUL_BOARD_SDK_DIR", "description": "Board SDK for MIMXRT1064-EVK", "id": "NXP_SDK_DIR", "optional": false, - "type": "path" + "type": "path", + "versions": ["2.10.0"] } ], "envVar": "EVK_MIMXRT1064_SDK_PATH", @@ -43,10 +44,12 @@ constexpr auto armgcc_nxp_1064_json = R"({ }, "compatVersion": "1", "freeRTOS": { - "cmakeCacheEntries": [ + "cmakeEntries": [ { - "cmakeOptionName": "FREERTOS_DIR", + "envVar": "IMXRT1064_FREERTOS_DIR", + "cmakeVar": "FREERTOS_DIR", "defaultValue": "$QUL_BOARD_SDK_DIR/rtos/freertos/freertos_kernel", + "label": "FreeRTOS Sources (IMXRT1064) ", "description": "FreeRTOS SDK for MIMXRT1064-EVK", "id": "NXP_FREERTOS_DIR", "optional": false, @@ -56,7 +59,7 @@ constexpr auto armgcc_nxp_1064_json = R"({ "envVar": "IMXRT1064_FREERTOS_DIR" }, "platform": { - "cmakeCacheEntries": [ + "cmakeEntries": [ { "cmakeOptionName": "Qul_ROOT", "description": "Qt for MCUs SDK", @@ -80,7 +83,7 @@ constexpr auto armgcc_nxp_1064_json = R"({ }, "qulVersion": "2.0.0", "toolchain": { - "cmakeCacheEntries": [ + "cmakeEntries": [ { "cmakeOptionName": "QUL_TARGET_TOOLCHAIN_DIR", "description": "IAR ARM Compiler", diff --git a/src/plugins/mcusupport/test/iar_stm32f469i_metal_json.h b/src/plugins/mcusupport/test/iar_stm32f469i_metal_json.h index 6a738729cae..708d9e569ab 100644 --- a/src/plugins/mcusupport/test/iar_stm32f469i_metal_json.h +++ b/src/plugins/mcusupport/test/iar_stm32f469i_metal_json.h @@ -47,7 +47,7 @@ constexpr auto iar_stm32f469i_metal_json = R"({ } ], "environmentEntries": [], - "cmakeCacheEntries": [ + "cmakeEntries": [ { "id": "Qul_DIR", "description": "Qt for MCUs SDK", @@ -62,7 +62,7 @@ constexpr auto iar_stm32f469i_metal_json = R"({ "versions": [ "8.50.9" ], - "cmakeCacheEntries": [ + "cmakeEntries": [ { "id": "IARToolchain", "envVar": "IAR_ARM_COMPILER_DIR", @@ -87,7 +87,7 @@ constexpr auto iar_stm32f469i_metal_json = R"({ "versions": [ "1.25.0" ], - "cmakeCacheEntries": [ + "cmakeEntries": [ { "id": "ST_SDK_DIR", "description": "Board SDK for STM32F469I-Discovery", diff --git a/src/plugins/mcusupport/test/unittest.cpp b/src/plugins/mcusupport/test/unittest.cpp index 3c5816df3a6..deeda8576f3 100644 --- a/src/plugins/mcusupport/test/unittest.cpp +++ b/src/plugins/mcusupport/test/unittest.cpp @@ -29,10 +29,13 @@ #include "armgcc_stm32f769i_freertos_json.h" #include "armgcc_stm32h750b_metal_json.h" #include "iar_stm32f469i_metal_json.h" +#include "mcuhelpers.h" #include "mcukitmanager.h" #include "mcusupportconstants.h" #include "mcusupportsdk.h" #include "mcutargetdescription.h" +#include "mcutargetfactory.h" +#include "mcutargetfactorylegacy.h" #include #include @@ -42,35 +45,35 @@ #include #include #include + #include #include namespace McuSupport::Internal::Test { +namespace { // clazy:excludeall=non-pod-global-static -static const QString nxp1050FreeRtosEnvVar{"IMXRT1050_FREERTOS_DIR"}; -static const QString nxp1064FreeRtosEnvVar{"IMXRT1064_FREERTOS_DIR"}; -static const QString nxp1170FreeRtosEnvVar{"EVK_MIMXRT1170_FREERTOS_PATH"}; -static const QString stm32f7FreeRtosEnvVar{"STM32F7_FREERTOS_DIR"}; -static const QString stm32f7{"STM32F7"}; -static const QString nxp1170{"EVK_MIMXRT1170"}; -static const QString nxp1050{"IMXRT1050"}; -static const QString nxp1064{"IMXRT1064"}; - -static const QStringList jsonFiles{QString::fromUtf8(armgcc_nxp_1050_json), - QString::fromUtf8(armgcc_nxp_1064_json)}; +const QString freeRtosCMakeVar{"FREERTOS_DIR"}; +const QString nxp1050FreeRtosEnvVar{"IMXRT1050_FREERTOS_DIR"}; +const QString nxp1064FreeRtosEnvVar{"IMXRT1064_FREERTOS_DIR"}; +const QString nxp1170FreeRtosEnvVar{"EVK_MIMXRT1170_FREERTOS_PATH"}; +const QString stm32f7FreeRtosEnvVar{"STM32F7_FREERTOS_DIR"}; +const QString stm32f7{"STM32F7"}; +const QString nxp1170{"EVK_MIMXRT1170_"}; +const QString nxp1050{"IMXRT1050"}; +const QString nxp1064{"IMXRT1064"}; +const QStringList jsonFiles{armgcc_nxp_1050_json, armgcc_nxp_1064_json}; +constexpr bool RUN_LEGACY{true}; +constexpr int colorDepth{32}; +const QString id{"id"}; +} // namespace using CMakeProjectManager::CMakeConfigItem; using CMakeProjectManager::CMakeConfigurationKitAspect; -using ProjectExplorer::EnvironmentKitAspect; using ProjectExplorer::KitManager; -using testing::Return; -using testing::ReturnRef; using Utils::FilePath; -void McuSupportTest::initTestCase() -{ -} +void McuSupportTest::initTestCase() {} void McuSupportTest::test_parseBasicInfoFromJson() { @@ -80,31 +83,40 @@ void McuSupportTest::test_parseBasicInfoFromJson() QVERIFY(description.freeRTOS.boardSdkSubDir.isEmpty()); } +void McuSupportTest::test_parseCmakeEntries() +{ + const auto description{Sdk::parseDescriptionJson(armgcc_nxp_1064_json)}; + + QVERIFY(not description.freeRTOS.packages.isEmpty()); + auto &freeRtosPackage = description.freeRTOS.packages[0]; + QCOMPARE(freeRtosPackage.envVar, nxp1064FreeRtosEnvVar); +} + void McuSupportTest::test_addNewKit() { const QString cmakeVar = "CMAKE_SDK"; - McuPackage sdkPackage{"sdk", // label - {}, // defaultPath - {}, // detectionPath - "sdk", // settingsKey + McuPackage sdkPackage{"sdk", // label + {}, // defaultPath + {}, // detectionPath + "sdk", // settingsKey cmakeVar, // cmake var - {}}; // env var - Kit kit; + {}}; // env var + ProjectExplorer::Kit kit; - McuToolChainPackage toolchainPackage{ - {}, // label - {}, // defaultPath - {}, // detectionPath - {}, // settingsKey - McuToolChainPackage::ToolChainType::Unsupported, // toolchain type - {}, // cmake var name - {}}; // env var name + McuToolChainPackage + toolchainPackage{{}, // label + {}, // defaultPath + {}, // detectionPath + {}, // settingsKey + McuToolChainPackage::ToolChainType::Unsupported, // toolchain type + {}, // cmake var name + {}}; // env var name const McuTarget::Platform platform{id, name, vendor}; - McuTarget mcuTarget{currentQulVersion, // version - platform, // platform + McuTarget mcuTarget{currentQulVersion, // version + platform, // platform McuTarget::OS::FreeRTOS, // os - {&sdkPackage}, // packages - &toolchainPackage}; // toolchain packages + {&sdkPackage}, // packages + &toolchainPackage}; // toolchain packages auto &kitManager{*KitManager::instance()}; @@ -115,15 +127,17 @@ void McuSupportTest::test_addNewKit() QCOMPARE(kitAddedSpy.count(), 1); QList arguments = kitAddedSpy.takeFirst(); - auto *createdKit = qvariant_cast(arguments.at(0)); + auto *createdKit = qvariant_cast(arguments.at(0)); QVERIFY(createdKit != nullptr); QCOMPARE(createdKit, newKit); const auto config = CMakeConfigurationKitAspect::configuration(newKit); QVERIFY(config.size() > 0); - QVERIFY(Utils::indexOf(config.toVector(), [&cmakeVar](const CMakeConfigItem &item) { - return item.key == cmakeVar.toUtf8(); - }) != -1); + QVERIFY(Utils::indexOf(config.toVector(), + [&cmakeVar](const CMakeConfigItem &item) { + return item.key == cmakeVar.toUtf8(); + }) + != -1); } void McuSupportTest::test_createPackagesWithCorrespondingSettings_data() @@ -164,9 +178,8 @@ void McuSupportTest::test_createPackagesWithCorrespondingSettings_data() void McuSupportTest::test_createPackagesWithCorrespondingSettings() { QFETCH(QString, json); - const auto description = Sdk::parseDescriptionJson(json.toLocal8Bit()); - QVector packages; - const auto targets = Sdk::targetsFromDescriptions({description}, &packages); + const Sdk::McuTargetDescription description = Sdk::parseDescriptionJson(json.toLocal8Bit()); + const auto [targets, packages]{Sdk::targetsFromDescriptions({description}, RUN_LEGACY)}; Q_UNUSED(targets); QSet settings = Utils::transform>(packages, [](const auto &package) { @@ -176,4 +189,111 @@ void McuSupportTest::test_createPackagesWithCorrespondingSettings() QVERIFY(settings.contains(expectedSettings)); } +void McuSupportTest::test_createFreeRtosPackageWithCorrectSetting_data() +{ + QTest::addColumn("freeRtosEnvVar"); + QTest::addColumn("expectedSettingsKey"); + + QTest::newRow("nxp1050") << nxp1050FreeRtosEnvVar + << QString{Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1050); + QTest::newRow("nxp1064") << nxp1064FreeRtosEnvVar + << QString{Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064); + QTest::newRow("nxp1170") << nxp1170FreeRtosEnvVar + << QString{Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1170); + QTest::newRow("stm32f7") << stm32f7FreeRtosEnvVar + << QString{Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(stm32f7); +} + +//TODO(piotr.mucko): Enable when mcutargetfactory is delivered. +void McuSupportTest::test_createFreeRtosPackageWithCorrectSetting() +{ + // Sdk::targetsAndPackages(jsonFile, &mcuSdkRepo); + // + // QVector mcuPackages; + // auto mcuTargets = Sdk::targetsFromDescriptions({description}, &mcuPackages); + // QVERIFY(mcuPackages contains freertos package) + // QVERIFY(freertos package is not empty & has proper value) + + // McuSupportOptions mcuSuportOptions{}; + // mcuSuportOptions.createAutomaticKits(); + + QFETCH(QString, freeRtosEnvVar); + QFETCH(QString, expectedSettingsKey); + + auto *package{Sdk::createFreeRTOSSourcesPackage(freeRtosEnvVar, FilePath{}, QString{})}; + QVERIFY(package != nullptr); + + QCOMPARE(package->settingsKey(), expectedSettingsKey); + + // QVERIFY(freertos package is not empty & has proper value) + // static McuPackage *createFreeRTOSSourcesPackage(const QString &envVar, + // const FilePath &boardSdkDir, + // const QString &freeRTOSBoardSdkSubDir) + // createFreeRtosPackage + // verify that package's setting is Package_FreeRTOSSourcePackage_IMXRT1064. + //TODO(me): write settings + // auto *freeRtosPackage + // = new McuPackage; + // freeRtosPackage->writeToSettings(); + //TODO(me): verify that setting is the same as in 2.0.0 +} + +void McuSupportTest::test_createTargetsTheNewWay_data() {} + +void McuSupportTest::test_createTargetsTheNewWay() +{ + Sdk::PackageDescription packageDescription{id, + nxp1064FreeRtosEnvVar, + freeRtosCMakeVar, + "setting", + "Freertos directory", + "/opt/freertos/1064", + "", + {}, + true}; + + Sdk::McuTargetDescription description{ + "2.0.1", + "2", + {id, "", "", {colorDepth}, Sdk::McuTargetDescription::TargetType::MCU}, + {}, // toolchain + {}, // boardSDK + {"", "", {packageDescription}}, //freertos + }; + + 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()}; + QVERIFY(not tgtPackages.empty()); + const auto rtosPackage{tgtPackages.first()}; + QCOMPARE(rtosPackage->environmentVariableName(), nxp1064FreeRtosEnvVar); +} + +void McuSupportTest::test_createPackages() +{ + Sdk::PackageDescription packageDescription{id, + nxp1064FreeRtosEnvVar, + freeRtosCMakeVar, + "Freertos directory", + "setting", + "/opt/freertos/1064", + "", + {}, + true}; + Sdk::McuTargetDescription targetDescription{ + "2.0.1", + "2", + {id, id, id, {colorDepth}, Sdk::McuTargetDescription::TargetType::MCU}, + {}, // toolchain + {}, // boardSDK + {"", "", {packageDescription}}, //freertos + }; + + Sdk::McuTargetFactory targetFactory; + const auto packages{targetFactory.createPackages(targetDescription)}; + QVERIFY(not packages.empty()); +} + } // namespace McuSupport::Internal::Test diff --git a/src/plugins/mcusupport/test/unittest.h b/src/plugins/mcusupport/test/unittest.h index 86463b3ad1b..54fbf6e5f14 100644 --- a/src/plugins/mcusupport/test/unittest.h +++ b/src/plugins/mcusupport/test/unittest.h @@ -43,8 +43,6 @@ namespace McuSupport::Internal::Test { -using ProjectExplorer::Kit; - class McuSupportTest : public QObject { Q_OBJECT @@ -56,6 +54,12 @@ private slots: void test_parseBasicInfoFromJson(); void test_createPackagesWithCorrespondingSettings(); void test_createPackagesWithCorrespondingSettings_data(); + void test_createFreeRtosPackageWithCorrectSetting_data(); + void test_createFreeRtosPackageWithCorrectSetting(); + void test_createTargetsTheNewWay_data(); + void test_createTargetsTheNewWay(); + void test_createPackages(); + void test_parseCmakeEntries(); private: QVersionNumber currentQulVersion{2, 0}; @@ -67,7 +71,6 @@ private: const QString freeRtosEnvVar{"EVK_MIMXRT1170_FREERTOS_PATH"}; const QString freeRtosCmakeVar{"FREERTOS_DIR"}; const QString defaultfreeRtosPath{"/opt/freertos/default"}; - }; // class McuSupportTest } // namespace McuSupport::Internal::Test