forked from qt-creator/qt-creator
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:
@@ -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};
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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",
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user