forked from qt-creator/qt-creator
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:
@@ -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) {
|
||||||
|
|||||||
@@ -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 ¯oName) {
|
value = expandMacroEnv("penv", value, [env](const QString ¯oName) {
|
||||||
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(
|
||||||
|
|||||||
Reference in New Issue
Block a user