From d084b77e7e3809f124f3594118f338d36eac2e59 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 15 Aug 2024 12:07:00 +0200 Subject: [PATCH] CMakePM: Restrict CMake Presets macro evaluation for environment Only do the macro evaluation if the preset has an "environment" entry. Then only for the values present in the "environment" entry. This way we advert any accidental environment macro evaluation that would not be related to the preset. Change-Id: Iddbe24b32e0f1a80dd424e61e4c6b8317fe9bb58 Reviewed-by: Marcus Tillmanns --- .../cmakeprojectmanager/presetsmacros.cpp | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/presetsmacros.cpp b/src/plugins/cmakeprojectmanager/presetsmacros.cpp index 159e16f4551..8177d877352 100644 --- a/src/plugins/cmakeprojectmanager/presetsmacros.cpp +++ b/src/plugins/cmakeprojectmanager/presetsmacros.cpp @@ -131,18 +131,20 @@ static Environment getEnvCombined(const std::optional &optPresetEnv template void expand(const PresetType &preset, Environment &env, const FilePath &sourceDirectory) { - const Environment presetEnv = getEnvCombined(preset.environment, env); + if (!preset.environment) + return; + + const Environment combinedEnv = getEnvCombined(preset.environment, env); const Environment parentEnv = env; - presetEnv.forEachEntry([&](const QString &key, const QString &value_, bool enabled) { + preset.environment->forEachEntry([&](const QString &key, QString value, bool enabled) { if (!enabled) return; - QString value = value_; expandAllButEnv(preset, sourceDirectory, value); - value = expandMacroEnv("env", value, [presetEnv](const QString ¯oName) { - return presetEnv.value(macroName); + value = expandMacroEnv("env", value, [&combinedEnv](const QString ¯oName) { + return combinedEnv.value(macroName); }); - value = expandMacroEnv("penv", value, [parentEnv](const QString ¯oName) { + value = expandMacroEnv("penv", value, [&parentEnv](const QString ¯oName) { return parentEnv.value(macroName); }); @@ -156,27 +158,31 @@ void expand(const PresetType &preset, Environment &env, const FilePath &sourceDi template void expand(const PresetType &preset, EnvironmentItems &envItems, const FilePath &sourceDirectory) { - const Environment presetEnv = preset.environment ? *preset.environment : Environment(); - presetEnv.forEachEntry([&](const QString &key, const QString &value_, bool enabled) { - if (!enabled) - return; - QString value = value_; - expandAllButEnv(preset, sourceDirectory, value); - value = expandMacroEnv("env", value, [presetEnv](const QString ¯oName) { - if (presetEnv.hasKey(macroName)) - return presetEnv.value(macroName); - return QString("${%1}").arg(macroName); + if (!preset.environment) + return; + + preset.environment->forEachEntry( + [&preset, + &sourceDirectory, + &envItems](const QString &key, QString value, bool enabled) { + if (!enabled) + return; + expandAllButEnv(preset, sourceDirectory, value); + value = expandMacroEnv("env", value, [&preset](const QString ¯oName) { + if (preset.environment->hasKey(macroName)) + return preset.environment->value(macroName); + return QString("${%1}").arg(macroName); + }); + + value = expandMacroEnv("penv", value, [](const QString ¯oName) { + return QString("${%1}").arg(macroName); + }); + + // Make sure to expand the CMake macros also for environment variables + expandAllButEnv(preset, sourceDirectory, value); + + envItems.emplace_back(Utils::EnvironmentItem(key, value)); }); - - value = expandMacroEnv("penv", value, [](const QString ¯oName) { - return QString("${%1}").arg(macroName); - }); - - // Make sure to expand the CMake macros also for environment variables - expandAllButEnv(preset, sourceDirectory, value); - - envItems.emplace_back(Utils::EnvironmentItem(key, value)); - }); } template