CMakePM: Expand CMake preset macros also for environment vars

This fixes the case when a CMake variable (CMAKE_PREFIX_PATH) would
reference an environment variable (qt_path) that would contain a CMake
preset macro (${sourceDir}/../qt_install).

Fixes: QTCREATORBUG-28606
Change-Id: Ib6239b13782b2ea854969547af46c3fe82a061f4
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Cristian Adam
2023-03-10 20:11:59 +01:00
parent d154388f27
commit 05d9742a96
2 changed files with 21 additions and 5 deletions

View File

@@ -154,7 +154,9 @@ FilePaths CMakeProjectImporter::importCandidates()
} }
static CMakeConfig configurationFromPresetProbe( static CMakeConfig configurationFromPresetProbe(
const FilePath &importPath, const PresetsDetails::ConfigurePreset &configurePreset) const FilePath &importPath,
const FilePath &sourceDirectory,
const PresetsDetails::ConfigurePreset &configurePreset)
{ {
const FilePath cmakeListTxt = importPath / "CMakeLists.txt"; const FilePath cmakeListTxt = importPath / "CMakeLists.txt";
cmakeListTxt.writeFileContents(QByteArray("cmake_minimum_required(VERSION 3.15)\n" cmakeListTxt.writeFileContents(QByteArray("cmake_minimum_required(VERSION 3.15)\n"
@@ -169,7 +171,7 @@ static CMakeConfig configurationFromPresetProbe(
const FilePath cmakeExecutable = FilePath::fromString(configurePreset.cmakeExecutable.value()); const FilePath cmakeExecutable = FilePath::fromString(configurePreset.cmakeExecutable.value());
Environment env = cmakeExecutable.deviceEnvironment(); Environment env = cmakeExecutable.deviceEnvironment();
CMakePresets::Macros::expand(configurePreset, env, importPath); CMakePresets::Macros::expand(configurePreset, env, sourceDirectory);
env.setupEnglishOutput(); env.setupEnglishOutput();
cmake.setEnvironment(env); cmake.setEnvironment(env);
@@ -208,9 +210,14 @@ static CMakeConfig configurationFromPresetProbe(
: CMakeConfig(); : CMakeConfig();
auto expandCacheValue = auto expandCacheValue =
[configurePreset, env, importPath, cache](const QString &key) -> QString { [configurePreset, env, sourceDirectory, cache](const QString &key) -> QString {
QString result = cache.stringValueOf(key.toUtf8()); QString result = cache.stringValueOf(key.toUtf8());
CMakePresets::Macros::expand(configurePreset, env, importPath, result); CMakePresets::Macros::expand(configurePreset, env, sourceDirectory, result);
// all usages involve file paths, so make sure they are cleaned up
const FilePaths paths = transform(result.split(";"), &FilePath::fromUserInput);
result = transform(paths, &FilePath::path).join(";");
return result; return result;
}; };
@@ -665,7 +672,7 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
if (cache.valueOf("CMAKE_C_COMPILER").isEmpty() if (cache.valueOf("CMAKE_C_COMPILER").isEmpty()
&& cache.valueOf("CMAKE_CXX_COMPILER").isEmpty()) { && cache.valueOf("CMAKE_CXX_COMPILER").isEmpty()) {
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
config = configurationFromPresetProbe(importPath, configurePreset); config = configurationFromPresetProbe(importPath, projectDirectory(), configurePreset);
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
if (!configurePreset.generator) { if (!configurePreset.generator) {

View File

@@ -144,6 +144,9 @@ void expand(const PresetType &preset,
return env.value(macroName); return env.value(macroName);
}); });
// Make sure to expand the CMake macros also for environment variables
expandAllButEnv(preset, sourceDirectory, value);
if (append) if (append)
env.appendOrSet(key, value, sep); env.appendOrSet(key, value, sep);
else else
@@ -182,6 +185,9 @@ void expand(const PresetType &preset,
return QString("${%1}").arg(macroName); 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, operation)); envItems.emplace_back(Utils::EnvironmentItem(key, value, operation));
} }
} }
@@ -202,6 +208,9 @@ void expand(const PresetType &preset,
value = expandMacroEnv("penv", value, [env](const QString &macroName) { value = expandMacroEnv("penv", value, [env](const QString &macroName) {
return env.value(macroName); return env.value(macroName);
}); });
// Make sure to expand the CMake macros also for environment variables
expandAllButEnv(preset, sourceDirectory, value);
} }
void updateToolchainFile( void updateToolchainFile(