diff options
author | Cristian Adam <cristian.adam@qt.io> | 2022-10-18 17:56:26 +0200 |
---|---|---|
committer | Cristian Adam <cristian.adam@qt.io> | 2022-10-21 13:09:20 +0000 |
commit | 430ff621aa203bb13242e91a8892c757480a3a64 (patch) | |
tree | b63bfab197302ed287f1f48e11c4ada908789b6c | |
parent | 7e60e6197a707221cc3b09e5b458bb635c314623 (diff) |
CMakePM: Use parent environment for $env{macro} expansion
Now the code takes into consideration the parent environment for
$env{macro} alongside the "environment" presets values.
Task-number: QTCREATORBUG-24555
Change-Id: I644618b0a6f866fd65a4109ee63b1f5bfcd4164d
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
-rw-r--r-- | src/plugins/cmakeprojectmanager/presetsmacros.cpp | 33 | ||||
-rw-r--r-- | tests/manual/cmakepresets/CMakePresets.json | 6 |
2 files changed, 29 insertions, 10 deletions
diff --git a/src/plugins/cmakeprojectmanager/presetsmacros.cpp b/src/plugins/cmakeprojectmanager/presetsmacros.cpp index 1220444cbfb..1a7b884ca9d 100644 --- a/src/plugins/cmakeprojectmanager/presetsmacros.cpp +++ b/src/plugins/cmakeprojectmanager/presetsmacros.cpp @@ -99,13 +99,33 @@ static QString expandMacroEnv(const QString ¯oPrefix, return result; } +static QHash<QString, QString> getEnvCombined( + const std::optional<QHash<QString, QString>> &optPresetEnv, const Utils::Environment &env) +{ + QHash<QString, QString> result; + + for (auto it = env.constBegin(); it != env.constEnd(); ++it) { + if (it.value().second) + result.insert(it.key().name, it.value().first); + } + + if (!optPresetEnv) + return result; + + QHash<QString, QString> presetEnv = optPresetEnv.value(); + for (auto it = presetEnv.constKeyValueBegin(); it != presetEnv.constKeyValueEnd(); ++it) { + result[it->first] = it->second; + } + + return result; +} + template<class PresetType> void expand(const PresetType &preset, Utils::Environment &env, const Utils::FilePath &sourceDirectory) { - const QHash<QString, QString> presetEnv = preset.environment ? preset.environment.value() - : QHash<QString, QString>(); + const QHash<QString, QString> presetEnv = getEnvCombined(preset.environment, env); for (auto it = presetEnv.constKeyValueBegin(); it != presetEnv.constKeyValueEnd(); ++it) { const QString key = it->first; QString value = it->second; @@ -143,14 +163,15 @@ void expand(const PresetType &preset, { const QHash<QString, QString> presetEnv = preset.environment ? preset.environment.value() : QHash<QString, QString>(); - for (auto it = presetEnv.constKeyValueBegin(); it != presetEnv.constKeyValueEnd(); ++it) { const QString key = it->first; QString value = it->second; expandAllButEnv(preset, sourceDirectory, value); value = expandMacroEnv("env", value, [presetEnv](const QString ¯oName) { - return presetEnv.value(macroName); + if (presetEnv.contains(macroName)) + return presetEnv.value(macroName); + return QString("${%1}").arg(macroName); }); auto operation = Utils::EnvironmentItem::Operation::SetEnabled; @@ -178,9 +199,7 @@ void expand(const PresetType &preset, { expandAllButEnv(preset, sourceDirectory, value); - const QHash<QString, QString> presetEnv = preset.environment ? preset.environment.value() - : QHash<QString, QString>(); - + const QHash<QString, QString> presetEnv = getEnvCombined(preset.environment, env); value = expandMacroEnv("env", value, [presetEnv](const QString ¯oName) { return presetEnv.value(macroName); }); diff --git a/tests/manual/cmakepresets/CMakePresets.json b/tests/manual/cmakepresets/CMakePresets.json index e4fd4feeae9..8f0ef76f8fc 100644 --- a/tests/manual/cmakepresets/CMakePresets.json +++ b/tests/manual/cmakepresets/CMakePresets.json @@ -75,8 +75,8 @@ "VCToolsVersion": "14.29.30133", "WindowsSDKVersion" : "10.0.22000.0", "VCArch": "x64", - "VCToolsInstallDir": "$penv{ProgramFiles(x86)}/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/$env{VCToolsVersion}", - "WindowsSdkDir" : "$penv{ProgramFiles(x86)}/Windows Kits/10", + "VCToolsInstallDir": "$env{ProgramFiles(x86)}/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/$env{VCToolsVersion}", + "WindowsSdkDir" : "$env{ProgramFiles(x86)}/Windows Kits/10", "WindowsSdkIncVerDir": "$env{WindowsSdkDir}/Include/$env{WindowsSDKVersion}", "WindowsSdkLibVerDir": "$env{WindowsSdkDir}/Lib/$env{WindowsSDKVersion}", @@ -90,7 +90,7 @@ "displayName": "Linux GCC", "generator": "Ninja", "binaryDir": "${sourceDir}/build-${presetName}", - "toolchainFile" : "$penv{HOME}/Qt/6.3.2/gcc_64/lib/cmake/Qt6/qt.toolchain.cmake", + "toolchainFile" : "$env{HOME}/Qt/6.3.2/gcc_64/lib/cmake/Qt6/qt.toolchain.cmake", "condition" : { "type": "equals", "lhs": "${hostSystemName}", |