McuSupport: Use MacroExpander for variables evaluation

Change format of variables to qtcreator's internal:
From $Qul_DIR to %{Env:Qul_DIR}.

Change-Id: I3838593b979a0a9b7d85e77114b1b129e1a128da
Reviewed-by: Dawid Śliwa <dawid.sliwa@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Piotr Mućko
2022-08-24 15:17:09 +02:00
parent dd2d05a772
commit d66b791df1
7 changed files with 35 additions and 44 deletions

View File

@@ -10,6 +10,7 @@
#include "mcutargetdescription.h" #include "mcutargetdescription.h"
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/macroexpander.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QVersionNumber> #include <QVersionNumber>
@@ -45,32 +46,16 @@ McuPackageVersionDetector *createVersionDetection(const VersionDetection &versio
versionDetection.isFile); versionDetection.isFile);
} }
static void evaluateVariables(McuTarget &target) static void expandVariables(Packages &packages)
{ {
const static QRegularExpression variableRegex{R"(\${*\w+}*)", Utils::MacroExpander macroExpander;
QRegularExpression::CaseInsensitiveOption}; for (const auto &package : packages) {
macroExpander.registerVariable(package->cmakeVariableName().toLocal8Bit(),
for (const auto &package : target.packages()) { package->label(),
const QRegularExpressionMatch match{variableRegex.match(package->path().toString())}; [package] { return 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);
} }
for (const auto &package : packages)
package->setPath(macroExpander.expand(package->path()));
} }
McuTargetFactory::McuTargetFactory(const SettingsHandler::Ptr &settingsHandler) McuTargetFactory::McuTargetFactory(const SettingsHandler::Ptr &settingsHandler)
@@ -96,6 +81,9 @@ QPair<Targets, Packages> McuTargetFactory::createTargets(const McuTargetDescript
McuToolChainPackagePtr toolchainPtr{toolchain}; McuToolChainPackagePtr toolchainPtr{toolchain};
targetPackages.insert({toolchainPtr}); targetPackages.insert({toolchainPtr});
targetPackages.unite({toolchainFile}); targetPackages.unite({toolchainFile});
expandVariables(targetPackages);
packages.unite(targetPackages); packages.unite(targetPackages);
McuTargetPtr target{new McuTarget{QVersionNumber::fromString(desc.qulVersion), McuTargetPtr target{new McuTarget{QVersionNumber::fromString(desc.qulVersion),
@@ -106,7 +94,6 @@ QPair<Targets, Packages> McuTargetFactory::createTargets(const McuTargetDescript
toolchainFile, toolchainFile,
colorDepth}}; colorDepth}};
evaluateVariables(*target);
mcuTargets.append(target); mcuTargets.append(target);
} }
return {mcuTargets, packages}; return {mcuTargets, packages};

View File

@@ -21,6 +21,7 @@ constexpr auto armgcc_nxp_1050_json = R"({
"type": "path", "type": "path",
"cmakeVar": "Qul_ROOT", "cmakeVar": "Qul_ROOT",
"envVar": "Qul_DIR", "envVar": "Qul_DIR",
"setting": "QtForMCUsSdk",
"optional": false "optional": false
}, },
{ {
@@ -29,7 +30,7 @@ constexpr auto armgcc_nxp_1050_json = R"({
"type": "path", "type": "path",
"cmakeVar": "MCUXPRESSO_IDE_PATH", "cmakeVar": "MCUXPRESSO_IDE_PATH",
"defaultValue": { "defaultValue": {
"windows": "$ROOT/nxp/MCUXpressoIDE*", "windows": "%{Env:ROOT}/nxp/MCUXpressoIDE*",
"unix": "/usr/local/mcuxpressoide/" "unix": "/usr/local/mcuxpressoide/"
}, },
"optional": false "optional": false
@@ -59,7 +60,7 @@ constexpr auto armgcc_nxp_1050_json = R"({
"label": "CMake Toolchain File", "label": "CMake Toolchain File",
"cmakeVar": "CMAKE_TOOLCHAIN_FILE", "cmakeVar": "CMAKE_TOOLCHAIN_FILE",
"type": "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, "visible": false,
"optional": false "optional": false
} }

View File

@@ -28,7 +28,7 @@ constexpr auto armgcc_nxp_mimxrt1170_evk_freertos_json = R"({
"type": "path", "type": "path",
"cmakeVar": "MCUXPRESSO_IDE_PATH", "cmakeVar": "MCUXPRESSO_IDE_PATH",
"defaultValue": { "defaultValue": {
"windows": "$ROOT/nxp/MCUXpressoIDE*", "windows": "%{Env:ROOT}/nxp/MCUXpressoIDE*",
"unix": "/usr/local/mcuxpressoide/" "unix": "/usr/local/mcuxpressoide/"
}, },
"optional": false "optional": false
@@ -56,7 +56,7 @@ constexpr auto armgcc_nxp_mimxrt1170_evk_freertos_json = R"({
"description": "CMake Toolchain File", "description": "CMake Toolchain File",
"cmakeVar": "CMAKE_TOOLCHAIN_FILE", "cmakeVar": "CMAKE_TOOLCHAIN_FILE",
"type": "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, "visible": false,
"optional": false "optional": false
} }
@@ -83,7 +83,7 @@ constexpr auto armgcc_nxp_mimxrt1170_evk_freertos_json = R"({
"id": "NXP_FREERTOS_DIR", "id": "NXP_FREERTOS_DIR",
"description": "FreeRTOS SDK for MIMXRT1170-EVK", "description": "FreeRTOS SDK for MIMXRT1170-EVK",
"cmakeVar": "FREERTOS_DIR", "cmakeVar": "FREERTOS_DIR",
"defaultValue": "$QUL_BOARD_SDK_DIR/rtos/freertos/freertos_kernel", "defaultValue": "%{QUL_BOARD_SDK_DIR}/rtos/freertos/freertos_kernel",
"type": "path", "type": "path",
"optional": false "optional": false
} }

View File

@@ -14,13 +14,12 @@ constexpr auto armgcc_stm32f769i_freertos_json = R"({
], ],
"pathEntries": [ "pathEntries": [
{ {
"id": "STM32CubeProgrammer_PATH",
"id": "STM32CubeProgrammer_PATH", "id": "STM32CubeProgrammer_PATH",
"label": "STM32CubeProgrammer", "label": "STM32CubeProgrammer",
"type": "path", "type": "path",
"defaultValue": { "defaultValue": {
"windows": "$PROGRAMSANDFILES/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/",
"unix": "$HOME/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/"
}, },
"optional": false "optional": false
} }
@@ -62,7 +61,7 @@ constexpr auto armgcc_stm32f769i_freertos_json = R"({
"label": "CMake Toolchain File", "label": "CMake Toolchain File",
"cmakeVar": "CMAKE_TOOLCHAIN_FILE", "cmakeVar": "CMAKE_TOOLCHAIN_FILE",
"type": "file", "type": "file",
"defaultValue": "$Qul_ROOT//lib/cmake/Qul/toolchain/armgcc.cmake", "defaultValue": "%{Qul_ROOT}//lib/cmake/Qul/toolchain/armgcc.cmake",
"visible": false, "visible": false,
"optional": false "optional": false
} }

View File

@@ -18,8 +18,8 @@ constexpr auto armgcc_stm32h750b_metal_json = R"({
"label": "STM32CubeProgrammer", "label": "STM32CubeProgrammer",
"type": "path", "type": "path",
"defaultValue": { "defaultValue": {
"windows": "$PROGRAMSANDFILES/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/",
"unix": "$HOME/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/"
}, },
"optional": false "optional": false
} }
@@ -30,6 +30,7 @@ constexpr auto armgcc_stm32h750b_metal_json = R"({
"id": "Qul_DIR", "id": "Qul_DIR",
"label": "Qt for MCUs SDK", "label": "Qt for MCUs SDK",
"type": "path", "type": "path",
"setting": "QtForMCUsSdk",
"cmakeVar": "Qul_ROOT", "cmakeVar": "Qul_ROOT",
"optional": false "optional": false
} }
@@ -59,7 +60,7 @@ constexpr auto armgcc_stm32h750b_metal_json = R"({
"label": "CMake Toolchain File", "label": "CMake Toolchain File",
"cmakeVar": "CMAKE_TOOLCHAIN_FILE", "cmakeVar": "CMAKE_TOOLCHAIN_FILE",
"type": "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, "visible": false,
"optional": false "optional": false
} }

View File

@@ -19,7 +19,7 @@ constexpr auto msvc_desktop_json = R"({
], ],
"cmakeEntries": [ "cmakeEntries": [
{ {
"id": "Qul_DIR", "envVar": "Qul_DIR",
"label": "Qt for MCUs SDK", "label": "Qt for MCUs SDK",
"type": "path", "type": "path",
"cmakeVar": "Qul_ROOT", "cmakeVar": "Qul_ROOT",

View File

@@ -82,7 +82,8 @@ const char armGccSuffix[]{"bin/arm-none-eabi-g++"};
const char armGccToolchainFilePath[]{"/opt/toolchain/armgcc.cmake"}; const char armGccToolchainFilePath[]{"/opt/toolchain/armgcc.cmake"};
const char armGccToolchainFileDefaultPath[]{ const char armGccToolchainFileDefaultPath[]{
"/opt/qtformcu/2.2/lib/cmake/Qul/toolchain/armgcc.cmake"}; "/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 armGccVersion[]{"9.3.1"};
const char armGccNewVersion[]{"10.3.1"}; const char armGccNewVersion[]{"10.3.1"};
const char msvcVersion[]{"14.29"}; const char msvcVersion[]{"14.29"};
@@ -407,18 +408,18 @@ void McuSupportTest::test_parseToolchainFromJSON_data()
//TODO(me): Add ghs nxp 1064 nxp 1070. //TODO(me): Add ghs nxp 1064 nxp 1070.
QTest::newRow("armgcc_nxp_1050_json") << armgcc_nxp_1050_json << armGccEnvVar << armGccLabel QTest::newRow("armgcc_nxp_1050_json") << armgcc_nxp_1050_json << armGccEnvVar << armGccLabel
<< armGccToolchainFileDefaultPath << armGcc; << armGccToolchainFilePathWithVariable << armGcc;
QTest::newRow("armgcc_stm32f769i_freertos_json") QTest::newRow("armgcc_stm32f769i_freertos_json")
<< armgcc_stm32f769i_freertos_json << armGccEnvVar << armGccLabel << armgcc_stm32f769i_freertos_json << armGccEnvVar << armGccLabel
<< armGccToolchainFilePathWithVariable << armGcc; << armGccToolchainFilePathWithVariable << armGcc;
QTest::newRow("armgcc_stm32h750b_metal_json") QTest::newRow("armgcc_stm32h750b_metal_json")
<< armgcc_stm32h750b_metal_json << armGccEnvVar << armGccLabel << armgcc_stm32h750b_metal_json << armGccEnvVar << armGccLabel
<< armGccToolchainFileDefaultPath << armGcc; << armGccToolchainFilePathWithVariable << armGcc;
QTest::newRow("armgcc_nxp_mimxrt1170_evk_freertos_json") QTest::newRow("armgcc_nxp_mimxrt1170_evk_freertos_json")
<< armgcc_nxp_mimxrt1170_evk_freertos_json << armGccEnvVar << armGccLabel << armgcc_nxp_mimxrt1170_evk_freertos_json << armGccEnvVar << armGccLabel
<< armGccToolchainFileDefaultPath << armGcc; << armGccToolchainFilePathWithVariable << armGcc;
QTest::newRow("iar_stm32f469i_metal_json") QTest::newRow("iar_stm32f469i_metal_json")
<< iar_stm32f469i_metal_json << iarEnvVar << iarLabel << iarToolchainFileDefaultPath << iar; << iar_stm32f469i_metal_json << iarEnvVar << iarLabel << iarToolchainFileDefaultPath << iar;
@@ -1227,8 +1228,9 @@ void McuSupportTest::test_resolveEnvironmentVariablesInDefaultPath()
QVERIFY(qputenv(QUL_ENV_VAR, qtForMcuSdkPath)); QVERIFY(qputenv(QUL_ENV_VAR, qtForMcuSdkPath));
QCOMPARE(qEnvironmentVariable(QUL_ENV_VAR), qtForMcuSdkPath); QCOMPARE(qEnvironmentVariable(QUL_ENV_VAR), qtForMcuSdkPath);
const QString qulEnvVariable = QString("%{Env:") + QUL_ENV_VAR + "}";
toochainFileDescription.defaultPath = FilePath::fromUserInput( 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; targetDescription.toolchain.file = toochainFileDescription;
auto [targets, packages] = targetFactory.createTargets(targetDescription, qtForMcuSdkPath); auto [targets, packages] = targetFactory.createTargets(targetDescription, qtForMcuSdkPath);
@@ -1256,8 +1258,9 @@ void McuSupportTest::test_resolveEnvironmentVariablesInDefaultPath()
void McuSupportTest::test_resolveCmakeVariablesInDefaultPath() void McuSupportTest::test_resolveCmakeVariablesInDefaultPath()
{ {
const QString qulCmakeVariable = QString("%{") + QUL_CMAKE_VAR + "}";
toochainFileDescription.defaultPath = FilePath::fromUserInput( 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; targetDescription.toolchain.file = toochainFileDescription;
auto [targets, packages] = targetFactory.createTargets(targetDescription, qtForMcuSdkPath); auto [targets, packages] = targetFactory.createTargets(targetDescription, qtForMcuSdkPath);