From e99fbf4100aa467c69c0d93ca59d0d88a51739bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Germain?= Date: Tue, 21 Apr 2026 10:10:02 -0700 Subject: [PATCH] Presets: Extract ResolvePreset utility for preset resolution Replace duplicated inline preset lookup/validation logic in cmake.cxx, cmCTest.cxx, and cpack.cxx with a shared ResolvePreset template method on cmCMakePresetsGraph. Use the PresetType::kind() static method introduced in commit 0f3347bb27 (cmCMakePresetsGraph: generalize printing presets of different types) to derive error message strings, replacing the runtime presetType string parameter with a template parameter. Error messages for configure presets now consistently include "configure" in the preset type (e.g., "No such configure preset") matching the pattern used by build, test, and package presets. --- Source/CMakeLists.txt | 1 + Source/CPack/cpack.cxx | 41 ++----- Source/CTest/cmCTestConfigureCommand.cxx | 64 +++------- Source/cmCMakePresetsGraph.h | 86 +++++++++++++ Source/cmCMakePresetsGraphResolve.cxx | 116 ++++++++++++++++++ Source/cmCTest.cxx | 35 ++---- Source/cmake.cxx | 78 ++++-------- .../CMakePresets/ListPresetsHidden-stderr.txt | 2 +- .../ListPresetsNoSuchPreset-stderr.txt | 2 +- .../CMakePresets/NoPresets-stderr.txt | 2 +- .../CMakePresets/NoSuchPreset-stderr.txt | 2 +- .../CMakePresets/SimpleFalse-stderr.txt | 3 +- .../CMakePresets/UseHiddenPreset-stderr.txt | 2 +- .../CMakePresets/VendorMacro-stderr.txt | 2 +- 14 files changed, 271 insertions(+), 165 deletions(-) create mode 100644 Source/cmCMakePresetsGraphResolve.cxx diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 76449a89ae..e7a0aef7d9 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -136,6 +136,7 @@ add_library( cmCMakePresetsGraphReadJSONPackagePresets.cxx cmCMakePresetsGraphReadJSONTestPresets.cxx cmCMakePresetsGraphReadJSONWorkflowPresets.cxx + cmCMakePresetsGraphResolve.cxx cmCMakeString.hxx cmCMakeString.cxx cmCommandLineArgument.h diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx index 1149fb2a95..a7ed74bcba 100644 --- a/Source/CPack/cpack.cxx +++ b/Source/CPack/cpack.cxx @@ -276,41 +276,20 @@ int main(int argc, char const* const* argv) return 0; } - auto presetPair = presetsGraph.PackagePresets.find(preset); - if (presetPair == presetsGraph.PackagePresets.end()) { - cmCPack_Log(&log, cmCPackLog::LOG_ERROR, - "No such package preset in " << workingDirectory << ": \"" - << preset << "\"\n"); + auto resolveResult = + presetsGraph.ResolvePreset(preset, presetsGraph.PackagePresets); + auto resolveError = cmCMakePresetsGraph::FormatPresetError< + cmCMakePresetsGraph::PackagePreset>(resolveResult.StatusCode, + resolveResult.ErrorPresetName, + workingDirectory); + if (resolveError) { + cmCPack_Log(&log, cmCPackLog::LOG_ERROR, *resolveError << "\n"); presetsGraph.PrintPackagePresetList(presetGeneratorsPresent); return 1; } + auto const* expandedPreset = resolveResult.Preset; - if (presetPair->second.Unexpanded.Hidden) { - cmCPack_Log(&log, cmCPackLog::LOG_ERROR, - "Cannot use hidden package preset in " - << workingDirectory << ": \"" << preset << "\"\n"); - presetsGraph.PrintPackagePresetList(presetGeneratorsPresent); - return 1; - } - - auto const& expandedPreset = presetPair->second.Expanded; - if (!expandedPreset) { - cmCPack_Log(&log, cmCPackLog::LOG_ERROR, - "Could not evaluate package preset \"" - << preset << "\": Invalid macro expansion\n"); - presetsGraph.PrintPackagePresetList(presetGeneratorsPresent); - return 1; - } - - if (!expandedPreset->ConditionResult) { - cmCPack_Log(&log, cmCPackLog::LOG_ERROR, - "Cannot use disabled package preset in " - << workingDirectory << ": \"" << preset << "\"\n"); - presetsGraph.PrintPackagePresetList(presetGeneratorsPresent); - return 1; - } - - if (!presetGeneratorsPresent(presetPair->second.Unexpanded)) { + if (!presetGeneratorsPresent(*expandedPreset)) { cmCPack_Log(&log, cmCPackLog::LOG_ERROR, "Cannot use preset"); presetsGraph.PrintPackagePresetList(presetGeneratorsPresent); return 1; diff --git a/Source/CTest/cmCTestConfigureCommand.cxx b/Source/CTest/cmCTestConfigureCommand.cxx index 024cc7b1b5..bede3b1d16 100644 --- a/Source/CTest/cmCTestConfigureCommand.cxx +++ b/Source/CTest/cmCTestConfigureCommand.cxx @@ -4,10 +4,8 @@ #include #include -#include #include #include -#include #include #include @@ -36,48 +34,6 @@ using ConfigurePreset = cmCMakePresetsGraph::ConfigurePreset; namespace { -cm::optional LoadPreset(cmExecutionStatus& status, - std::string sourceDirectory, - std::string presetName) -{ - // Load a configure preset after verifying its existence and validity. - cmCMakePresetsGraph presetsGraph; - if (!presetsGraph.ReadProjectPresets(sourceDirectory)) { - status.SetError( - cmStrCat("Could not read presets from \"", sourceDirectory, - "\": ", presetsGraph.parseState.GetErrorMessage())); - return cm::nullopt; - } - - auto preset = presetsGraph.ConfigurePresets.find(presetName); - if (preset == presetsGraph.ConfigurePresets.end()) { - status.SetError(cmStrCat("No such preset in ", sourceDirectory, ": \"", - presetName, '"')); - return cm::nullopt; - } - - if (preset->second.Unexpanded.Hidden) { - status.SetError(cmStrCat("Cannot use hidden preset in ", sourceDirectory, - ": \"", presetName, '"')); - return cm::nullopt; - } - - auto const& expandedPreset = preset->second.Expanded; - if (!expandedPreset) { - status.SetError(cmStrCat("Could not evaluate preset \"", presetName, - "\": Invalid macro expansion.")); - return cm::nullopt; - } - - if (!expandedPreset->ConditionResult) { - status.SetError( - cmStrCat("Cannot use disabled preset \"", presetName, "\".")); - return cm::nullopt; - } - - return expandedPreset; -} - bool ConstructConfigureCommand(cmExecutionStatus& status, cmMakefile& mf, std::string const sourceDirectory, std::string const buildDirectory, @@ -107,11 +63,27 @@ bool ConstructConfigureCommand(cmExecutionStatus& status, cmMakefile& mf, bool presetProvidesGenerator = false; if (!presetName.empty()) { - auto expandedPreset = LoadPreset(status, sourceDirectory, presetName); - if (!expandedPreset) { + cmCMakePresetsGraph presetsGraph; + if (!presetsGraph.ReadProjectPresets(sourceDirectory)) { + status.SetError( + cmStrCat("Could not read presets from \"", sourceDirectory, + "\": ", presetsGraph.parseState.GetErrorMessage())); return false; } + auto resolveResult = + presetsGraph.ResolvePreset(presetName, presetsGraph.ConfigurePresets); + auto resolveError = + cmCMakePresetsGraph::FormatPresetError( + resolveResult.StatusCode, resolveResult.ErrorPresetName, + sourceDirectory); + if (resolveError) { + status.SetError(*resolveError); + return false; + } + + auto const* expandedPreset = resolveResult.Preset; + configureCommand += " \"--preset\""; configureCommand += " \""; configureCommand += presetName; diff --git a/Source/cmCMakePresetsGraph.h b/Source/cmCMakePresetsGraph.h index 7ee529f933..209fd647ca 100644 --- a/Source/cmCMakePresetsGraph.h +++ b/Source/cmCMakePresetsGraph.h @@ -401,6 +401,38 @@ public: cm::optional Expanded; }; + enum class PresetResolveStatus + { + Success, + NotFound, + Hidden, + InvalidMacroExpansion, + Disabled, + }; + + // Result type for preset resolution + template + struct PresetResolveResult + { + using Status = PresetResolveStatus; + + Status StatusCode = Status::Success; + std::string ErrorPresetName; + T const* Preset = nullptr; + }; + + template + PresetResolveResult ResolvePreset( + std::string const& presetName, + std::map> const& presets) const; + + // Returns an error message for a preset resolve status, + // or cm::nullopt on Success. + template + static cm::optional FormatPresetError( + PresetResolveStatus status, std::string const& errorPresetName, + std::string const& directory); + std::map> ConfigurePresets; std::map> BuildPresets; std::map> TestPresets; @@ -459,3 +491,57 @@ private: static std::string GetFilename(std::string const& sourceDir); static std::string GetUserFilename(std::string const& sourceDir); }; + +extern template cmCMakePresetsGraph::PresetResolveResult< + cmCMakePresetsGraph::ConfigurePreset> +cmCMakePresetsGraph::ResolvePreset( + std::string const&, + std::map> const&) const; + +extern template cmCMakePresetsGraph::PresetResolveResult< + cmCMakePresetsGraph::BuildPreset> +cmCMakePresetsGraph::ResolvePreset( + std::string const&, + std::map< + std::string, + cmCMakePresetsGraph::PresetPair> const&) + const; + +extern template cmCMakePresetsGraph::PresetResolveResult< + cmCMakePresetsGraph::TestPreset> +cmCMakePresetsGraph::ResolvePreset( + std::string const&, + std::map< + std::string, + cmCMakePresetsGraph::PresetPair> const&) + const; + +extern template cmCMakePresetsGraph::PresetResolveResult< + cmCMakePresetsGraph::PackagePreset> +cmCMakePresetsGraph::ResolvePreset( + std::string const&, + std::map> const&) const; + +extern template cm::optional +cmCMakePresetsGraph::FormatPresetError( + cmCMakePresetsGraph::PresetResolveStatus, std::string const&, + std::string const&); + +extern template cm::optional +cmCMakePresetsGraph::FormatPresetError( + cmCMakePresetsGraph::PresetResolveStatus, std::string const&, + std::string const&); + +extern template cm::optional +cmCMakePresetsGraph::FormatPresetError( + cmCMakePresetsGraph::PresetResolveStatus, std::string const&, + std::string const&); + +extern template cm::optional +cmCMakePresetsGraph::FormatPresetError( + cmCMakePresetsGraph::PresetResolveStatus, std::string const&, + std::string const&); diff --git a/Source/cmCMakePresetsGraphResolve.cxx b/Source/cmCMakePresetsGraphResolve.cxx new file mode 100644 index 0000000000..c024a25c80 --- /dev/null +++ b/Source/cmCMakePresetsGraphResolve.cxx @@ -0,0 +1,116 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file LICENSE.rst or https://cmake.org/licensing for details. */ +#include +#include +#include + +#include + +#include "cmCMakePresetsGraph.h" +#include "cmStringAlgorithms.h" + +template +cmCMakePresetsGraph::PresetResolveResult cmCMakePresetsGraph::ResolvePreset( + std::string const& presetName, + std::map> const& presets) const +{ + using Result = PresetResolveResult; + Result result; + + auto presetPair = presets.find(presetName); + if (presetPair == presets.end()) { + result.StatusCode = Result::Status::NotFound; + result.ErrorPresetName = presetName; + return result; + } + if (presetPair->second.Unexpanded.Hidden) { + result.StatusCode = Result::Status::Hidden; + result.ErrorPresetName = presetName; + return result; + } + if (!presetPair->second.Expanded) { + result.StatusCode = Result::Status::InvalidMacroExpansion; + result.ErrorPresetName = presetName; + return result; + } + if (!presetPair->second.Expanded->ConditionResult) { + result.StatusCode = Result::Status::Disabled; + result.ErrorPresetName = presetName; + return result; + } + + result.Preset = &*presetPair->second.Expanded; + return result; +} + +// Explicit template instantiations +template cmCMakePresetsGraph::PresetResolveResult< + cmCMakePresetsGraph::ConfigurePreset> +cmCMakePresetsGraph::ResolvePreset( + std::string const&, + std::map> const&) const; + +template cmCMakePresetsGraph::PresetResolveResult< + cmCMakePresetsGraph::BuildPreset> +cmCMakePresetsGraph::ResolvePreset( + std::string const&, + std::map> const&) + const; + +template cmCMakePresetsGraph::PresetResolveResult< + cmCMakePresetsGraph::TestPreset> +cmCMakePresetsGraph::ResolvePreset( + std::string const&, + std::map> const&) + const; + +template cmCMakePresetsGraph::PresetResolveResult< + cmCMakePresetsGraph::PackagePreset> +cmCMakePresetsGraph::ResolvePreset( + std::string const&, + std::map> const&) + const; + +template +cm::optional cmCMakePresetsGraph::FormatPresetError( + PresetResolveStatus status, std::string const& errorPresetName, + std::string const& directory) +{ + using Status = PresetResolveStatus; + switch (status) { + case Status::NotFound: + return cmStrCat("No such ", T::kind(), " preset in ", directory, ": \"", + errorPresetName, '"'); + case Status::Hidden: + return cmStrCat("Cannot use hidden ", T::kind(), " preset in ", + directory, ": \"", errorPresetName, '"'); + case Status::InvalidMacroExpansion: + return cmStrCat("Could not evaluate ", T::kind(), " preset \"", + errorPresetName, "\": Invalid macro expansion"); + case Status::Disabled: + return cmStrCat("Cannot use disabled ", T::kind(), " preset in ", + directory, ": \"", errorPresetName, '"'); + case Status::Success: + return cm::nullopt; + } + assert(false && "Unreachable."); + return cm::nullopt; +} + +// Explicit template instantiations for FormatPresetError +template cm::optional +cmCMakePresetsGraph::FormatPresetError( + PresetResolveStatus, std::string const&, std::string const&); + +template cm::optional +cmCMakePresetsGraph::FormatPresetError( + PresetResolveStatus, std::string const&, std::string const&); + +template cm::optional +cmCMakePresetsGraph::FormatPresetError( + PresetResolveStatus, std::string const&, std::string const&); + +template cm::optional +cmCMakePresetsGraph::FormatPresetError( + PresetResolveStatus, std::string const&, std::string const&); diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 705a5bd5b6..e57bd9df68 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -1520,35 +1520,18 @@ bool cmCTest::SetArgsFromPreset(std::string const& presetName, return true; } - auto presetPair = settingsFile.TestPresets.find(presetName); - if (presetPair == settingsFile.TestPresets.end()) { - cmSystemTools::Error(cmStrCat("No such test preset in ", workingDirectory, - ": \"", presetName, '"')); - settingsFile.PrintTestPresetList(); - return false; - } - - if (presetPair->second.Unexpanded.Hidden) { - cmSystemTools::Error(cmStrCat("Cannot use hidden test preset in ", - workingDirectory, ": \"", presetName, '"')); - settingsFile.PrintTestPresetList(); - return false; - } - - auto const& expandedPreset = presetPair->second.Expanded; - if (!expandedPreset) { - cmSystemTools::Error(cmStrCat("Could not evaluate test preset \"", - presetName, "\": Invalid macro expansion")); - settingsFile.PrintTestPresetList(); - return false; - } - - if (!expandedPreset->ConditionResult) { - cmSystemTools::Error(cmStrCat("Cannot use disabled test preset in ", - workingDirectory, ": \"", presetName, '"')); + auto resolveResult = + settingsFile.ResolvePreset(presetName, settingsFile.TestPresets); + auto resolveError = + cmCMakePresetsGraph::FormatPresetError( + resolveResult.StatusCode, resolveResult.ErrorPresetName, + workingDirectory); + if (resolveError) { + cmSystemTools::Error(*resolveError); settingsFile.PrintTestPresetList(); return false; } + auto const* expandedPreset = resolveResult.Preset; auto configurePresetPair = settingsFile.ConfigurePresets.find(expandedPreset->ConfigurePreset); diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 3598518cd0..363167db37 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -2035,33 +2035,22 @@ bool cmake::SetArgsFromPreset(std::string const& presetName, return false; } - auto preset = presetsGraph.ConfigurePresets.find(presetName); - if (preset == presetsGraph.ConfigurePresets.end()) { - cmSystemTools::Error(cmStrCat("No such preset in ", - this->GetHomeDirectory(), ": \"", presetName, - '"')); - this->PrintPresetList(presetsGraph); - return false; - } - if (preset->second.Unexpanded.Hidden) { - cmSystemTools::Error(cmStrCat("Cannot use hidden preset in ", - this->GetHomeDirectory(), ": \"", presetName, - '"')); - this->PrintPresetList(presetsGraph); - return false; - } - auto const& expandedPreset = preset->second.Expanded; - if (!expandedPreset) { - cmSystemTools::Error(cmStrCat("Could not evaluate preset \"", - preset->second.Unexpanded.Name, - "\": Invalid macro expansion")); - return false; - } - if (!expandedPreset->ConditionResult) { - cmSystemTools::Error(cmStrCat("Could not use disabled preset \"", - preset->second.Unexpanded.Name, '"')); + auto resolveResult = + presetsGraph.ResolvePreset(presetName, presetsGraph.ConfigurePresets); + using ConfigurePreset = cmCMakePresetsGraph::ConfigurePreset; + using S = cmCMakePresetsGraph::PresetResolveStatus; + auto resolveError = cmCMakePresetsGraph::FormatPresetError( + resolveResult.StatusCode, resolveResult.ErrorPresetName, + this->GetHomeDirectory()); + if (resolveError) { + cmSystemTools::Error(*resolveError); + if (resolveResult.StatusCode == S::NotFound || + resolveResult.StatusCode == S::Hidden) { + this->PrintPresetList(presetsGraph); + } return false; } + auto const* expandedPreset = resolveResult.Preset; if (!this->State->IsCacheLoaded() && !haveBinaryDirArg && !expandedPreset->BinaryDir.empty()) { @@ -3926,39 +3915,18 @@ int cmake::Build(cmBuildArgs buildArgs, std::vector targets, return 0; } - auto presetPair = settingsFile.BuildPresets.find(presetName); - if (presetPair == settingsFile.BuildPresets.end()) { - cmSystemTools::Error(cmStrCat("No such build preset in ", - this->GetHomeDirectory(), ": \"", - presetName, '"')); - settingsFile.PrintBuildPresetList(); - return 1; - } - - if (presetPair->second.Unexpanded.Hidden) { - cmSystemTools::Error(cmStrCat("Cannot use hidden build preset in ", - this->GetHomeDirectory(), ": \"", - presetName, '"')); - settingsFile.PrintBuildPresetList(); - return 1; - } - - auto const& expandedPreset = presetPair->second.Expanded; - if (!expandedPreset) { - cmSystemTools::Error(cmStrCat("Could not evaluate build preset \"", - presetName, - "\": Invalid macro expansion")); - settingsFile.PrintBuildPresetList(); - return 1; - } - - if (!expandedPreset->ConditionResult) { - cmSystemTools::Error(cmStrCat("Cannot use disabled build preset in ", - this->GetHomeDirectory(), ": \"", - presetName, '"')); + auto resolveResult = + settingsFile.ResolvePreset(presetName, settingsFile.BuildPresets); + auto resolveError = + cmCMakePresetsGraph::FormatPresetError( + resolveResult.StatusCode, resolveResult.ErrorPresetName, + this->GetHomeDirectory()); + if (resolveError) { + cmSystemTools::Error(*resolveError); settingsFile.PrintBuildPresetList(); return 1; } + auto const* expandedPreset = resolveResult.Preset; auto configurePresetPair = settingsFile.ConfigurePresets.find(expandedPreset->ConfigurePreset); diff --git a/Tests/RunCMake/CMakePresets/ListPresetsHidden-stderr.txt b/Tests/RunCMake/CMakePresets/ListPresetsHidden-stderr.txt index 1403814221..5ccf749005 100644 --- a/Tests/RunCMake/CMakePresets/ListPresetsHidden-stderr.txt +++ b/Tests/RunCMake/CMakePresets/ListPresetsHidden-stderr.txt @@ -1,2 +1,2 @@ -^CMake Error: Cannot use hidden preset in [^ +^CMake Error: Cannot use hidden configure preset in [^ ]*/Tests/RunCMake/CMakePresets/ListPresetsHidden: "ListPresetsHidden"$ diff --git a/Tests/RunCMake/CMakePresets/ListPresetsNoSuchPreset-stderr.txt b/Tests/RunCMake/CMakePresets/ListPresetsNoSuchPreset-stderr.txt index eea1b99c13..1c9c30a725 100644 --- a/Tests/RunCMake/CMakePresets/ListPresetsNoSuchPreset-stderr.txt +++ b/Tests/RunCMake/CMakePresets/ListPresetsNoSuchPreset-stderr.txt @@ -1,2 +1,2 @@ -^CMake Error: No such preset in [^ +^CMake Error: No such configure preset in [^ ]*/Tests/RunCMake/CMakePresets/ListPresetsNoSuchPreset: "ListPresetsNoSuchPreset"$ diff --git a/Tests/RunCMake/CMakePresets/NoPresets-stderr.txt b/Tests/RunCMake/CMakePresets/NoPresets-stderr.txt index 5ff3d3339a..0f38dca641 100644 --- a/Tests/RunCMake/CMakePresets/NoPresets-stderr.txt +++ b/Tests/RunCMake/CMakePresets/NoPresets-stderr.txt @@ -1,2 +1,2 @@ -^CMake Error: No such preset in [^ +^CMake Error: No such configure preset in [^ ]*/Tests/RunCMake/CMakePresets/NoPresets: "NoPresets"$ diff --git a/Tests/RunCMake/CMakePresets/NoSuchPreset-stderr.txt b/Tests/RunCMake/CMakePresets/NoSuchPreset-stderr.txt index 9a2d0d5bdb..ce95657d58 100644 --- a/Tests/RunCMake/CMakePresets/NoSuchPreset-stderr.txt +++ b/Tests/RunCMake/CMakePresets/NoSuchPreset-stderr.txt @@ -1,2 +1,2 @@ -^CMake Error: No such preset in [^ +^CMake Error: No such configure preset in [^ ]*/Tests/RunCMake/CMakePresets/NoSuchPreset: "NoSuchPreset"$ diff --git a/Tests/RunCMake/CMakePresets/SimpleFalse-stderr.txt b/Tests/RunCMake/CMakePresets/SimpleFalse-stderr.txt index 6a9a7dea2a..ea53102dbb 100644 --- a/Tests/RunCMake/CMakePresets/SimpleFalse-stderr.txt +++ b/Tests/RunCMake/CMakePresets/SimpleFalse-stderr.txt @@ -1 +1,2 @@ -^CMake Error: Could not use disabled preset "SimpleFalse"$ +^CMake Error: Cannot use disabled configure preset in [^ +]*/Tests/RunCMake/CMakePresets/SimpleFalse: "SimpleFalse"$ diff --git a/Tests/RunCMake/CMakePresets/UseHiddenPreset-stderr.txt b/Tests/RunCMake/CMakePresets/UseHiddenPreset-stderr.txt index 45b4cd4acc..9ccad062fa 100644 --- a/Tests/RunCMake/CMakePresets/UseHiddenPreset-stderr.txt +++ b/Tests/RunCMake/CMakePresets/UseHiddenPreset-stderr.txt @@ -1,2 +1,2 @@ -^CMake Error: Cannot use hidden preset in [^ +^CMake Error: Cannot use hidden configure preset in [^ ]*/Tests/RunCMake/CMakePresets/UseHiddenPreset: "UseHiddenPreset"$ diff --git a/Tests/RunCMake/CMakePresets/VendorMacro-stderr.txt b/Tests/RunCMake/CMakePresets/VendorMacro-stderr.txt index 2e9801909b..3d9c60e9eb 100644 --- a/Tests/RunCMake/CMakePresets/VendorMacro-stderr.txt +++ b/Tests/RunCMake/CMakePresets/VendorMacro-stderr.txt @@ -1 +1 @@ -^CMake Error: Could not evaluate preset "VendorMacro": Invalid macro expansion$ +^CMake Error: Could not evaluate configure preset "VendorMacro": Invalid macro expansion$