diff --git a/src/plugins/mcusupport/mcukitmanager.cpp b/src/plugins/mcusupport/mcukitmanager.cpp index ef7f9f2ed2a..ce846ffc708 100644 --- a/src/plugins/mcusupport/mcukitmanager.cpp +++ b/src/plugins/mcusupport/mcukitmanager.cpp @@ -80,6 +80,7 @@ public: case McuToolChainPackage::ToolChainType::KEIL: case McuToolChainPackage::ToolChainType::MSVC: case McuToolChainPackage::ToolChainType::GCC: + case McuToolChainPackage::ToolChainType::MinGW: case McuToolChainPackage::ToolChainType::ArmGcc: ToolChainKitAspect::setToolChain(k, tcPackage->toolChain( @@ -142,6 +143,7 @@ public: case McuToolChainPackage::ToolChainType::KEIL: case McuToolChainPackage::ToolChainType::MSVC: case McuToolChainPackage::ToolChainType::GCC: + case McuToolChainPackage::ToolChainType::MinGW: case McuToolChainPackage::ToolChainType::ArmGcc: { const QVariant debuggerId = tcPackage->debuggerId(); if (debuggerId.isValid()) { diff --git a/src/plugins/mcusupport/mcupackage.cpp b/src/plugins/mcusupport/mcupackage.cpp index 93310399ef1..f7f29ba4565 100644 --- a/src/plugins/mcusupport/mcupackage.cpp +++ b/src/plugins/mcusupport/mcupackage.cpp @@ -294,7 +294,8 @@ McuToolChainPackage::ToolChainType McuToolChainPackage::toolchainType() const bool McuToolChainPackage::isDesktopToolchain() const { - return m_type == ToolChainType::MSVC || m_type == ToolChainType::GCC; + return m_type == ToolChainType::MSVC || m_type == ToolChainType::GCC + || m_type == ToolChainType::MinGW; } ToolChain *McuToolChainPackage::msvcToolChain(Id language) @@ -320,6 +321,28 @@ ToolChain *McuToolChainPackage::gccToolChain(Id language) return toolChain; } +static ToolChain *mingwToolChain(const FilePath &path, Id language) +{ + ToolChain *toolChain = ToolChainManager::toolChain([&path, language](const ToolChain *t) { + // find a MinGW toolchain having the same path from registered toolchains + const Abi abi = t->targetAbi(); + return t->typeId() == ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID + && abi.architecture() == Abi::X86Architecture && abi.wordWidth() == 64 + && t->language() == language && t->compilerCommand() == path; + }); + if (!toolChain) { + // if there's no MinGW toolchain having the same path, + // a proper MinGW would be selected from the registered toolchains. + toolChain = ToolChainManager::toolChain([language](const ToolChain *t) { + const Abi abi = t->targetAbi(); + return t->typeId() == ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID + && abi.architecture() == Abi::X86Architecture && abi.wordWidth() == 64 + && t->language() == language; + }); + } + return toolChain; +} + static ToolChain *armGccToolChain(const FilePath &path, Id language) { ToolChain *toolChain = ToolChainManager::toolChain([&path, language](const ToolChain *t) { @@ -384,6 +407,12 @@ ToolChain *McuToolChainPackage::toolChain(Id language) const return msvcToolChain(language); case ToolChainType::GCC: return gccToolChain(language); + case ToolChainType::MinGW: { + const QLatin1String compilerName( + language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++"); + const FilePath compilerPath = (path() / "bin" / compilerName).withExecutableSuffix(); + return mingwToolChain(compilerPath, language); + } case ToolChainType::IAR: { const FilePath compiler = (path() / "/bin/iccarm").withExecutableSuffix(); return iarToolChain(compiler, language); @@ -414,6 +443,8 @@ QString McuToolChainPackage::toolChainName() const return QLatin1String("msvc"); case ToolChainType::GCC: return QLatin1String("gcc"); + case ToolChainType::MinGW: + return QLatin1String("mingw"); case ToolChainType::ArmGcc: return QLatin1String("armgcc"); case ToolChainType::IAR: diff --git a/src/plugins/mcusupport/mcupackage.h b/src/plugins/mcusupport/mcupackage.h index 631b514998b..7528bba91de 100644 --- a/src/plugins/mcusupport/mcupackage.h +++ b/src/plugins/mcusupport/mcupackage.h @@ -98,7 +98,7 @@ class McuToolChainPackage final : public McuPackage { Q_OBJECT public: - enum class ToolChainType { IAR, KEIL, MSVC, GCC, ArmGcc, GHS, GHSArm, Unsupported }; + enum class ToolChainType { IAR, KEIL, MSVC, GCC, ArmGcc, GHS, GHSArm, MinGW, Unsupported }; McuToolChainPackage(const SettingsHandler::Ptr &settingsHandler, const QString &label, diff --git a/src/plugins/mcusupport/mcutargetfactory.cpp b/src/plugins/mcusupport/mcutargetfactory.cpp index 91229bd2418..275a158e7f6 100644 --- a/src/plugins/mcusupport/mcutargetfactory.cpp +++ b/src/plugins/mcusupport/mcutargetfactory.cpp @@ -24,7 +24,8 @@ bool isToolchainDescriptionValid(const McuTargetDescription::Toolchain &t) bool isDesktopToolchain(McuToolChainPackage::ToolChainType type) { return type == McuToolChainPackage::ToolChainType::MSVC - || type == McuToolChainPackage::ToolChainType::GCC; + || type == McuToolChainPackage::ToolChainType::GCC + || type == McuToolChainPackage::ToolChainType::MinGW; } McuPackageVersionDetector *createVersionDetection(const VersionDetection &versionDetection) @@ -152,6 +153,7 @@ McuToolChainPackage *McuTargetFactory::createToolchain( {"keil", McuToolChainPackage::ToolChainType::KEIL}, {"msvc", McuToolChainPackage::ToolChainType::MSVC}, {"gcc", McuToolChainPackage::ToolChainType::GCC}, + {"mingw", McuToolChainPackage::ToolChainType::MinGW}, {"armgcc", McuToolChainPackage::ToolChainType::ArmGcc}, {"greenhills", McuToolChainPackage::ToolChainType::GHS}, {"arm-greenhills", McuToolChainPackage::ToolChainType::GHSArm}, diff --git a/src/plugins/mcusupport/test/mingw_desktop_json.h b/src/plugins/mcusupport/test/mingw_desktop_json.h new file mode 100644 index 00000000000..c8c94a4cdc8 --- /dev/null +++ b/src/plugins/mcusupport/test/mingw_desktop_json.h @@ -0,0 +1,29 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 + +#pragma once + +constexpr auto mingw_desktop_json = R"( +{ + "qulVersion": "2.3.0", + "compatVersion": "1", + "platform": { + "id": "Qt", + "platformName": "Desktop", + "vendor": "Qt", + "colorDepths": [ + 32 + ] + }, + "toolchain": { + "id": "mingw", + "versions": [ + "11.2.0" + ], + "compiler": { + "label": "MinGW Toolchain", + "defaultValue": "%{QT_TOOLS_DIR}/mingw1120_64" + } + } +} +)"; diff --git a/src/plugins/mcusupport/test/unittest.cpp b/src/plugins/mcusupport/test/unittest.cpp index 016b9eb7805..aa67124d68b 100644 --- a/src/plugins/mcusupport/test/unittest.cpp +++ b/src/plugins/mcusupport/test/unittest.cpp @@ -16,6 +16,7 @@ #include "iar_mimxrt1064_evk_freertos_json.h" #include "iar_stm32f469i_discovery_baremetal_json.h" #include "msvc_desktop_json.h" +#include "mingw_desktop_json.h" #include "mcuhelpers.h" #include "mcukitmanager.h" @@ -260,6 +261,17 @@ void verifyMsvcToolchain(const McuToolChainPackagePtr &msvcPackage, const QStrin QVERIFY(allOf(versions, [&](const QString &v) { return msvcPackage->versions().contains(v); })); } +void verifyMingwToolchain(const McuToolChainPackagePtr &mingwPackage, const QStringList &versions) +{ + QVERIFY(mingwPackage != nullptr); + QCOMPARE(mingwPackage->cmakeVariableName(), ""); + QCOMPARE(mingwPackage->environmentVariableName(), ""); + QCOMPARE(mingwPackage->toolchainType(), McuToolChainPackage::ToolChainType::MinGW); + QCOMPARE(mingwPackage->isDesktopToolchain(), true); + QCOMPARE(mingwPackage->toolChainName(), "mingw"); + QVERIFY(allOf(versions, [&](const QString &v) { return mingwPackage->versions().contains(v); })); +} + void verifyTargetToolchains(const Targets &targets, const QString &toolchainFilePath, const QString &toolchainFileDefaultPath, @@ -551,6 +563,13 @@ void McuSupportTest::test_createDesktopMsvcToolchain() verifyMsvcToolchain(msvcPackage, {}); } +void McuSupportTest::test_createDesktopMingwToolchain() +{ + const auto description = parseDescriptionJson(mingw_desktop_json); + McuToolChainPackagePtr mingwPackage{targetFactory.createToolchain(description.toolchain)}; + verifyMingwToolchain(mingwPackage, {"11.2.0"}); +} + void McuSupportTest::test_verifyManuallyCreatedArmGccToolchain() { verifyArmGccToolchain(armGccToolchainPackagePtr, {armGccVersion}); diff --git a/src/plugins/mcusupport/test/unittest.h b/src/plugins/mcusupport/test/unittest.h index 1752f52f1be..fae8fca93a7 100644 --- a/src/plugins/mcusupport/test/unittest.h +++ b/src/plugins/mcusupport/test/unittest.h @@ -51,6 +51,7 @@ private slots: void test_createDesktopGccToolchain(); void test_legacy_createDesktopMsvcToolchain(); void test_createDesktopMsvcToolchain(); + void test_createDesktopMingwToolchain(); void test_verifyManuallyCreatedArmGccToolchain(); void test_legacy_createArmGccToolchain(); void test_createArmGccToolchain_data();