CMakePM: expand macros for all configure cacheVariables

Fixes: QTCREATORBUG-28982
Change-Id: Iabbf39b815ed7477a9d272a320308f320a31adbc
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Cristian Adam
2023-03-31 19:53:45 +02:00
parent 8304f3c576
commit 45faec05e5
4 changed files with 61 additions and 22 deletions

View File

@@ -98,7 +98,9 @@ Internal::PresetsData CMakeProject::combinePresets(Internal::PresetsData &cmakeP
auto resolveInherits = [](auto &presetsHash, auto &presetsList) { auto resolveInherits = [](auto &presetsHash, auto &presetsList) {
Utils::sort(presetsList, [](const auto &left, const auto &right) { Utils::sort(presetsList, [](const auto &left, const auto &right) {
if (!left.inherits || left.inherits.value().contains(right.name)) const bool sameInheritance = left.inherits && right.inherits
&& left.inherits.value() == right.inherits.value();
if (!left.inherits || left.inherits.value().contains(right.name) || sameInheritance)
return false; return false;
return true; return true;
}); });

View File

@@ -209,23 +209,11 @@ static CMakeConfig configurationFromPresetProbe(
? configurePreset.cacheVariables.value() ? configurePreset.cacheVariables.value()
: CMakeConfig(); : CMakeConfig();
auto expandCacheValue = const QString cmakeMakeProgram = cache.stringValueOf("CMAKE_MAKE_PROGRAM");
[configurePreset, env, sourceDirectory, cache](const QString &key) -> QString { const QString toolchainFile = cache.stringValueOf("CMAKE_TOOLCHAIN_FILE");
QString result = cache.stringValueOf(key.toUtf8()); const QString prefixPath = cache.stringValueOf("CMAKE_PREFIX_PATH");
CMakePresets::Macros::expand(configurePreset, env, sourceDirectory, result); const QString findRootPath = cache.stringValueOf("CMAKE_FIND_ROOT_PATH");
const QString qtHostPath = cache.stringValueOf("QT_HOST_PATH");
// 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;
};
const QString cmakeMakeProgram = expandCacheValue("CMAKE_MAKE_PROGRAM");
const QString toolchainFile = expandCacheValue("CMAKE_TOOLCHAIN_FILE");
const QString prefixPath = expandCacheValue("CMAKE_PREFIX_PATH");
const QString findRootPath = expandCacheValue("CMAKE_FIND_ROOT_PATH");
const QString qtHostPath = expandCacheValue("QT_HOST_PATH");
if (!cmakeMakeProgram.isEmpty()) { if (!cmakeMakeProgram.isEmpty()) {
args.emplace_back( args.emplace_back(
@@ -662,6 +650,8 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
projectDirectory(), projectDirectory(),
data->buildDirectory); data->buildDirectory);
CMakePresets::Macros::updateCacheVariables(configurePreset, env, projectDirectory());
const CMakeConfig cache = configurePreset.cacheVariables const CMakeConfig cache = configurePreset.cacheVariables
? configurePreset.cacheVariables.value() ? configurePreset.cacheVariables.value()
: CMakeConfig(); : CMakeConfig();
@@ -710,10 +700,7 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
data->cmakePresetDefaultConfigHash data->cmakePresetDefaultConfigHash
= CMakeConfigurationKitAspect::computeDefaultConfigHash(config, data->cmakeBinary); = CMakeConfigurationKitAspect::computeDefaultConfigHash(config, data->cmakeBinary);
QString cmakeBuildType = QString::fromUtf8(cache.valueOf("CMAKE_BUILD_TYPE")); QByteArrayList buildConfigurationTypes = {cache.valueOf("CMAKE_BUILD_TYPE")};
CMakePresets::Macros::expand(configurePreset, env, projectDirectory(), cmakeBuildType);
QByteArrayList buildConfigurationTypes = {cmakeBuildType.toUtf8()};
if (buildConfigurationTypes.front().isEmpty()) { if (buildConfigurationTypes.front().isEmpty()) {
buildConfigurationTypes.clear(); buildConfigurationTypes.clear();
QByteArray buildConfigurationTypesString = cache.valueOf("CMAKE_CONFIGURATION_TYPES"); QByteArray buildConfigurationTypesString = cache.valueOf("CMAKE_CONFIGURATION_TYPES");

View File

@@ -4,6 +4,7 @@
#include "presetsmacros.h" #include "presetsmacros.h"
#include "presetsparser.h" #include "presetsparser.h"
#include <utils/algorithm.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/filepath.h> #include <utils/filepath.h>
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
@@ -304,6 +305,47 @@ void updateInstallDir(PresetsDetails::ConfigurePreset &configurePreset,
} }
void updateCacheVariables(PresetsDetails::ConfigurePreset &configurePreset,
const Utils::Environment &env,
const Utils::FilePath &sourceDirectory)
{
using namespace Utils;
if (!configurePreset.cacheVariables)
return;
CMakeConfig cache = configurePreset.cacheVariables.value();
static const QSet<QByteArray> pathKeys{"CMAKE_C_COMPILER",
"CMAKE_CXX_COMPILER",
"CMAKE_PREFIX_PATH",
"CMAKE_FIND_ROOT_PATH",
"CMAKE_MAKE_PROGRAM",
"CMAKE_TOOLCHAIN_FILE",
"QT_HOST_PATH",
"QT_QMAKE_EXECUTABLE",
"CMAKE_SYSROOT"};
auto expandCacheValue =
[configurePreset, env, sourceDirectory, cache](const QByteArray &key) {
QString result = cache.stringValueOf(key);
CMakePresets::Macros::expand(configurePreset, env, sourceDirectory, result);
if (pathKeys.contains(key)) {
const FilePaths paths = transform(result.split(";"), &FilePath::fromUserInput);
result = transform(paths, &FilePath::path).join(";");
}
return result.toUtf8();
};
for (auto &item : cache)
item.value = expandCacheValue(item.key);
configurePreset.cacheVariables = cache;
}
template<class PresetType> template<class PresetType>
void expandConditionValues(const PresetType &preset, void expandConditionValues(const PresetType &preset,
const Utils::Environment &env, const Utils::Environment &env,

View File

@@ -60,6 +60,14 @@ void updateToolchainFile(PresetsDetails::ConfigurePreset &configurePreset,
void updateInstallDir(PresetsDetails::ConfigurePreset &configurePreset, void updateInstallDir(PresetsDetails::ConfigurePreset &configurePreset,
const Utils::Environment &env, const Utils::Environment &env,
const Utils::FilePath &sourceDirectory); const Utils::FilePath &sourceDirectory);
/**
* Updates the cacheVariables parameter of the configurePreset with the expanded prameter values.
* Including macro expansion and relative paths resolving.
*/
void updateCacheVariables(PresetsDetails::ConfigurePreset &configurePreset,
const Utils::Environment &env,
const Utils::FilePath &sourceDirectory);
/** /**
* Expands the condition values and then evaluates the condition object of the preset and returns * Expands the condition values and then evaluates the condition object of the preset and returns
* the boolean result. * the boolean result.