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 <utils/algorithm.h>
#include <utils/macroexpander.h>
#include <utils/qtcassert.h>
#include <QVersionNumber>
@@ -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<Targets, Packages> 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<Targets, Packages> McuTargetFactory::createTargets(const McuTargetDescript
toolchainFile,
colorDepth}};
evaluateVariables(*target);
mcuTargets.append(target);
}
return {mcuTargets, packages};

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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",

View File

@@ -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);