From d66b791df1452f2fc7b619b4ec15c22d089e72fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Mu=C4=87ko?= Date: Wed, 24 Aug 2022 15:17:09 +0200 Subject: [PATCH] McuSupport: Use MacroExpander for variables evaluation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change format of variables to qtcreator's internal: From $Qul_DIR to %{Env:Qul_DIR}. Change-Id: I3838593b979a0a9b7d85e77114b1b129e1a128da Reviewed-by: Dawid Śliwa Reviewed-by: Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcutargetfactory.cpp | 37 ++++++------------- .../mcusupport/test/armgcc_nxp_1050_json.h | 5 ++- .../armgcc_nxp_mimxrt1170_evk_freertos_json.h | 6 +-- .../test/armgcc_stm32f769i_freertos_json.h | 7 ++-- .../test/armgcc_stm32h750b_metal_json.h | 7 ++-- .../mcusupport/test/msvc_desktop_json.h | 2 +- src/plugins/mcusupport/test/unittest.cpp | 15 +++++--- 7 files changed, 35 insertions(+), 44 deletions(-) diff --git a/src/plugins/mcusupport/mcutargetfactory.cpp b/src/plugins/mcusupport/mcutargetfactory.cpp index f21470a689a..416ee025f47 100644 --- a/src/plugins/mcusupport/mcutargetfactory.cpp +++ b/src/plugins/mcusupport/mcutargetfactory.cpp @@ -10,6 +10,7 @@ #include "mcutargetdescription.h" #include +#include #include #include @@ -45,32 +46,16 @@ McuPackageVersionDetector *createVersionDetection(const VersionDetection &versio versionDetection.isFile); } -static void evaluateVariables(McuTarget &target) +static void expandVariables(Packages &packages) { - const static QRegularExpression variableRegex{R"(\${*\w+}*)", - QRegularExpression::CaseInsensitiveOption}; - - for (const auto &package : target.packages()) { - const QRegularExpressionMatch match{variableRegex.match(package->path().toString())}; - if (!match.hasMatch()) - continue; - const QString variable{match.captured(0).remove(0, 1)}; - - McuPackagePtr packageDefiningVariable{ - Utils::findOrDefault(target.packages(), [variable](const McuPackagePtr &pkg) { - return pkg->cmakeVariableName() == variable - || pkg->environmentVariableName() == variable; - })}; - - if (packageDefiningVariable == nullptr) // nothing provides the variable - continue; - - const auto evaluatedPath{Utils::FilePath::fromUserInput( - package->path().toString().replace(match.capturedStart(), - match.capturedLength(), - packageDefiningVariable->path().toString()))}; - package->setPath(evaluatedPath); + Utils::MacroExpander macroExpander; + for (const auto &package : packages) { + macroExpander.registerVariable(package->cmakeVariableName().toLocal8Bit(), + package->label(), + [package] { return package->path().toString(); }); } + for (const auto &package : packages) + package->setPath(macroExpander.expand(package->path())); } McuTargetFactory::McuTargetFactory(const SettingsHandler::Ptr &settingsHandler) @@ -96,6 +81,9 @@ QPair McuTargetFactory::createTargets(const McuTargetDescript McuToolChainPackagePtr toolchainPtr{toolchain}; targetPackages.insert({toolchainPtr}); targetPackages.unite({toolchainFile}); + + expandVariables(targetPackages); + packages.unite(targetPackages); McuTargetPtr target{new McuTarget{QVersionNumber::fromString(desc.qulVersion), @@ -106,7 +94,6 @@ QPair McuTargetFactory::createTargets(const McuTargetDescript toolchainFile, colorDepth}}; - evaluateVariables(*target); mcuTargets.append(target); } return {mcuTargets, packages}; diff --git a/src/plugins/mcusupport/test/armgcc_nxp_1050_json.h b/src/plugins/mcusupport/test/armgcc_nxp_1050_json.h index d11f57ca945..aba5d68ddc7 100644 --- a/src/plugins/mcusupport/test/armgcc_nxp_1050_json.h +++ b/src/plugins/mcusupport/test/armgcc_nxp_1050_json.h @@ -21,6 +21,7 @@ constexpr auto armgcc_nxp_1050_json = R"({ "type": "path", "cmakeVar": "Qul_ROOT", "envVar": "Qul_DIR", + "setting": "QtForMCUsSdk", "optional": false }, { @@ -29,7 +30,7 @@ constexpr auto armgcc_nxp_1050_json = R"({ "type": "path", "cmakeVar": "MCUXPRESSO_IDE_PATH", "defaultValue": { - "windows": "$ROOT/nxp/MCUXpressoIDE*", + "windows": "%{Env:ROOT}/nxp/MCUXpressoIDE*", "unix": "/usr/local/mcuxpressoide/" }, "optional": false @@ -59,7 +60,7 @@ constexpr auto armgcc_nxp_1050_json = R"({ "label": "CMake Toolchain File", "cmakeVar": "CMAKE_TOOLCHAIN_FILE", "type": "file", - "defaultValue": "/opt/qtformcu/2.2/lib/cmake/Qul/toolchain/armgcc.cmake", + "defaultValue": "%{Qul_ROOT}/lib/cmake/Qul/toolchain/armgcc.cmake", "visible": false, "optional": false } diff --git a/src/plugins/mcusupport/test/armgcc_nxp_mimxrt1170_evk_freertos_json.h b/src/plugins/mcusupport/test/armgcc_nxp_mimxrt1170_evk_freertos_json.h index c0266163676..4e22805e168 100644 --- a/src/plugins/mcusupport/test/armgcc_nxp_mimxrt1170_evk_freertos_json.h +++ b/src/plugins/mcusupport/test/armgcc_nxp_mimxrt1170_evk_freertos_json.h @@ -28,7 +28,7 @@ constexpr auto armgcc_nxp_mimxrt1170_evk_freertos_json = R"({ "type": "path", "cmakeVar": "MCUXPRESSO_IDE_PATH", "defaultValue": { - "windows": "$ROOT/nxp/MCUXpressoIDE*", + "windows": "%{Env:ROOT}/nxp/MCUXpressoIDE*", "unix": "/usr/local/mcuxpressoide/" }, "optional": false @@ -56,7 +56,7 @@ constexpr auto armgcc_nxp_mimxrt1170_evk_freertos_json = R"({ "description": "CMake Toolchain File", "cmakeVar": "CMAKE_TOOLCHAIN_FILE", "type": "file", - "defaultValue": "/opt/qtformcu/2.2//lib/cmake/Qul/toolchain/armgcc.cmake", + "defaultValue": "%{Qul_ROOT}//lib/cmake/Qul/toolchain/armgcc.cmake", "visible": false, "optional": false } @@ -83,7 +83,7 @@ constexpr auto armgcc_nxp_mimxrt1170_evk_freertos_json = R"({ "id": "NXP_FREERTOS_DIR", "description": "FreeRTOS SDK for MIMXRT1170-EVK", "cmakeVar": "FREERTOS_DIR", - "defaultValue": "$QUL_BOARD_SDK_DIR/rtos/freertos/freertos_kernel", + "defaultValue": "%{QUL_BOARD_SDK_DIR}/rtos/freertos/freertos_kernel", "type": "path", "optional": false } diff --git a/src/plugins/mcusupport/test/armgcc_stm32f769i_freertos_json.h b/src/plugins/mcusupport/test/armgcc_stm32f769i_freertos_json.h index e38e4addb99..0cf570513a2 100644 --- a/src/plugins/mcusupport/test/armgcc_stm32f769i_freertos_json.h +++ b/src/plugins/mcusupport/test/armgcc_stm32f769i_freertos_json.h @@ -14,13 +14,12 @@ constexpr auto armgcc_stm32f769i_freertos_json = R"({ ], "pathEntries": [ { - "id": "STM32CubeProgrammer_PATH", "id": "STM32CubeProgrammer_PATH", "label": "STM32CubeProgrammer", "type": "path", "defaultValue": { - "windows": "$PROGRAMSANDFILES/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", - "unix": "$HOME/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" + "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", + "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, "optional": false } @@ -62,7 +61,7 @@ constexpr auto armgcc_stm32f769i_freertos_json = R"({ "label": "CMake Toolchain File", "cmakeVar": "CMAKE_TOOLCHAIN_FILE", "type": "file", - "defaultValue": "$Qul_ROOT//lib/cmake/Qul/toolchain/armgcc.cmake", + "defaultValue": "%{Qul_ROOT}//lib/cmake/Qul/toolchain/armgcc.cmake", "visible": false, "optional": false } diff --git a/src/plugins/mcusupport/test/armgcc_stm32h750b_metal_json.h b/src/plugins/mcusupport/test/armgcc_stm32h750b_metal_json.h index a730cd5db98..3dec08a2bd8 100644 --- a/src/plugins/mcusupport/test/armgcc_stm32h750b_metal_json.h +++ b/src/plugins/mcusupport/test/armgcc_stm32h750b_metal_json.h @@ -18,8 +18,8 @@ constexpr auto armgcc_stm32h750b_metal_json = R"({ "label": "STM32CubeProgrammer", "type": "path", "defaultValue": { - "windows": "$PROGRAMSANDFILES/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", - "unix": "$HOME/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" + "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", + "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, "optional": false } @@ -30,6 +30,7 @@ constexpr auto armgcc_stm32h750b_metal_json = R"({ "id": "Qul_DIR", "label": "Qt for MCUs SDK", "type": "path", + "setting": "QtForMCUsSdk", "cmakeVar": "Qul_ROOT", "optional": false } @@ -59,7 +60,7 @@ constexpr auto armgcc_stm32h750b_metal_json = R"({ "label": "CMake Toolchain File", "cmakeVar": "CMAKE_TOOLCHAIN_FILE", "type": "file", - "defaultValue": "/opt/qtformcu/2.2//lib/cmake/Qul/toolchain/armgcc.cmake", + "defaultValue": "%{Qul_ROOT}//lib/cmake/Qul/toolchain/armgcc.cmake", "visible": false, "optional": false } diff --git a/src/plugins/mcusupport/test/msvc_desktop_json.h b/src/plugins/mcusupport/test/msvc_desktop_json.h index 9bcebcebc48..9214a999265 100644 --- a/src/plugins/mcusupport/test/msvc_desktop_json.h +++ b/src/plugins/mcusupport/test/msvc_desktop_json.h @@ -19,7 +19,7 @@ constexpr auto msvc_desktop_json = R"({ ], "cmakeEntries": [ { - "id": "Qul_DIR", + "envVar": "Qul_DIR", "label": "Qt for MCUs SDK", "type": "path", "cmakeVar": "Qul_ROOT", diff --git a/src/plugins/mcusupport/test/unittest.cpp b/src/plugins/mcusupport/test/unittest.cpp index 46a5def7a5f..cb641b04d49 100644 --- a/src/plugins/mcusupport/test/unittest.cpp +++ b/src/plugins/mcusupport/test/unittest.cpp @@ -82,7 +82,8 @@ const char armGccSuffix[]{"bin/arm-none-eabi-g++"}; const char armGccToolchainFilePath[]{"/opt/toolchain/armgcc.cmake"}; const char armGccToolchainFileDefaultPath[]{ "/opt/qtformcu/2.2/lib/cmake/Qul/toolchain/armgcc.cmake"}; -const char armGccToolchainFilePathWithVariable[]{"$Qul_ROOT/lib/cmake/Qul/toolchain/armgcc.cmake"}; +const char armGccToolchainFilePathWithVariable[]{ + "%{Qul_ROOT}/lib/cmake/Qul/toolchain/armgcc.cmake"}; const char armGccVersion[]{"9.3.1"}; const char armGccNewVersion[]{"10.3.1"}; const char msvcVersion[]{"14.29"}; @@ -407,18 +408,18 @@ void McuSupportTest::test_parseToolchainFromJSON_data() //TODO(me): Add ghs nxp 1064 nxp 1070. QTest::newRow("armgcc_nxp_1050_json") << armgcc_nxp_1050_json << armGccEnvVar << armGccLabel - << armGccToolchainFileDefaultPath << armGcc; + << armGccToolchainFilePathWithVariable << armGcc; QTest::newRow("armgcc_stm32f769i_freertos_json") << armgcc_stm32f769i_freertos_json << armGccEnvVar << armGccLabel << armGccToolchainFilePathWithVariable << armGcc; QTest::newRow("armgcc_stm32h750b_metal_json") << armgcc_stm32h750b_metal_json << armGccEnvVar << armGccLabel - << armGccToolchainFileDefaultPath << armGcc; + << armGccToolchainFilePathWithVariable << armGcc; QTest::newRow("armgcc_nxp_mimxrt1170_evk_freertos_json") << armgcc_nxp_mimxrt1170_evk_freertos_json << armGccEnvVar << armGccLabel - << armGccToolchainFileDefaultPath << armGcc; + << armGccToolchainFilePathWithVariable << armGcc; QTest::newRow("iar_stm32f469i_metal_json") << iar_stm32f469i_metal_json << iarEnvVar << iarLabel << iarToolchainFileDefaultPath << iar; @@ -1227,8 +1228,9 @@ void McuSupportTest::test_resolveEnvironmentVariablesInDefaultPath() QVERIFY(qputenv(QUL_ENV_VAR, qtForMcuSdkPath)); QCOMPARE(qEnvironmentVariable(QUL_ENV_VAR), qtForMcuSdkPath); + const QString qulEnvVariable = QString("%{Env:") + QUL_ENV_VAR + "}"; toochainFileDescription.defaultPath = FilePath::fromUserInput( - QString{"$"} + QUL_ENV_VAR + "/lib/cmake/Qul/toolchain/iar.cmake"); + qulEnvVariable + "/lib/cmake/Qul/toolchain/iar.cmake"); targetDescription.toolchain.file = toochainFileDescription; auto [targets, packages] = targetFactory.createTargets(targetDescription, qtForMcuSdkPath); @@ -1256,8 +1258,9 @@ void McuSupportTest::test_resolveEnvironmentVariablesInDefaultPath() void McuSupportTest::test_resolveCmakeVariablesInDefaultPath() { + const QString qulCmakeVariable = QString("%{") + QUL_CMAKE_VAR + "}"; toochainFileDescription.defaultPath = FilePath::fromUserInput( - QString{"$"} + QUL_CMAKE_VAR + "/lib/cmake/Qul/toolchain/iar.cmake"); + qulCmakeVariable + "/lib/cmake/Qul/toolchain/iar.cmake"); targetDescription.toolchain.file = toochainFileDescription; auto [targets, packages] = targetFactory.createTargets(targetDescription, qtForMcuSdkPath);