mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-05 13:50:10 -05:00
Merge topic 'preset-includes-macro-expansion'
f552ba6e6dpresets: add support for macro expansion to includes1df24df01fpresets: Fix encoding of env/penv macro expansion on Windows Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !8255
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cstdlib>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
@@ -49,6 +48,7 @@ template <typename T>
|
||||
using PresetPair = cmCMakePresetsGraph::PresetPair<T>;
|
||||
using ExpandMacroResult = cmCMakePresetsGraphInternal::ExpandMacroResult;
|
||||
using MacroExpander = cmCMakePresetsGraphInternal::MacroExpander;
|
||||
using cmCMakePresetsGraphInternal::ExpandMacros;
|
||||
|
||||
void InheritString(std::string& child, const std::string& parent)
|
||||
{
|
||||
@@ -204,14 +204,6 @@ bool IsValidMacroNamespace(const std::string& str)
|
||||
ExpandMacroResult VisitEnv(std::string& value, CycleStatus& status,
|
||||
const std::vector<MacroExpander>& macroExpanders,
|
||||
int version);
|
||||
ExpandMacroResult ExpandMacros(
|
||||
std::string& out, const std::vector<MacroExpander>& macroExpanders,
|
||||
int version);
|
||||
ExpandMacroResult ExpandMacro(std::string& out,
|
||||
const std::string& macroNamespace,
|
||||
const std::string& macroName,
|
||||
const std::vector<MacroExpander>& macroExpanders,
|
||||
int version);
|
||||
|
||||
bool ExpandMacros(const cmCMakePresetsGraph& graph,
|
||||
const ConfigurePreset& preset,
|
||||
@@ -448,9 +440,9 @@ bool ExpandMacros(cmCMakePresetsGraph& graph, const T& preset,
|
||||
if (macroName.empty()) {
|
||||
return ExpandMacroResult::Error;
|
||||
}
|
||||
const char* value = std::getenv(macroName.c_str());
|
||||
if (value) {
|
||||
result += value;
|
||||
if (cm::optional<std::string> value =
|
||||
cmSystemTools::GetEnvVar(macroName)) {
|
||||
result += *value;
|
||||
}
|
||||
return ExpandMacroResult::Ok;
|
||||
}
|
||||
@@ -515,8 +507,9 @@ ExpandMacroResult VisitEnv(std::string& value, CycleStatus& status,
|
||||
status = CycleStatus::Verified;
|
||||
return ExpandMacroResult::Ok;
|
||||
}
|
||||
}
|
||||
|
||||
ExpandMacroResult ExpandMacros(
|
||||
ExpandMacroResult cmCMakePresetsGraphInternal::ExpandMacros(
|
||||
std::string& out, const std::vector<MacroExpander>& macroExpanders,
|
||||
int version)
|
||||
{
|
||||
@@ -595,11 +588,10 @@ ExpandMacroResult ExpandMacros(
|
||||
return ExpandMacroResult::Ok;
|
||||
}
|
||||
|
||||
ExpandMacroResult ExpandMacro(std::string& out,
|
||||
const std::string& macroNamespace,
|
||||
const std::string& macroName,
|
||||
const std::vector<MacroExpander>& macroExpanders,
|
||||
int version)
|
||||
ExpandMacroResult cmCMakePresetsGraphInternal::ExpandMacro(
|
||||
std::string& out, const std::string& macroNamespace,
|
||||
const std::string& macroName,
|
||||
const std::vector<MacroExpander>& macroExpanders, int version)
|
||||
{
|
||||
for (auto const& macroExpander : macroExpanders) {
|
||||
auto result = macroExpander(macroNamespace, macroName, out, version);
|
||||
@@ -615,6 +607,7 @@ ExpandMacroResult ExpandMacro(std::string& out,
|
||||
return ExpandMacroResult::Error;
|
||||
}
|
||||
|
||||
namespace {
|
||||
template <typename T>
|
||||
bool SetupWorkflowConfigurePreset(const T& preset,
|
||||
const ConfigurePreset*& configurePreset,
|
||||
|
||||
@@ -28,6 +28,16 @@ enum class ExpandMacroResult
|
||||
|
||||
using MacroExpander = std::function<ExpandMacroResult(
|
||||
const std::string&, const std::string&, std::string&, int version)>;
|
||||
|
||||
ExpandMacroResult ExpandMacros(
|
||||
std::string& out, const std::vector<MacroExpander>& macroExpanders,
|
||||
int version);
|
||||
|
||||
ExpandMacroResult ExpandMacro(std::string& out,
|
||||
const std::string& macroNamespace,
|
||||
const std::string& macroName,
|
||||
const std::vector<MacroExpander>& macroExpanders,
|
||||
int version);
|
||||
}
|
||||
|
||||
class cmCMakePresetsGraph::Condition
|
||||
|
||||
@@ -33,6 +33,9 @@ using PackagePreset = cmCMakePresetsGraph::PackagePreset;
|
||||
using WorkflowPreset = cmCMakePresetsGraph::WorkflowPreset;
|
||||
using ArchToolsetStrategy = cmCMakePresetsGraph::ArchToolsetStrategy;
|
||||
using JSONHelperBuilder = cmJSONHelperBuilder;
|
||||
using ExpandMacroResult = cmCMakePresetsGraphInternal::ExpandMacroResult;
|
||||
using MacroExpander = cmCMakePresetsGraphInternal::MacroExpander;
|
||||
using cmCMakePresetsGraphInternal::ExpandMacros;
|
||||
|
||||
constexpr int MIN_VERSION = 1;
|
||||
constexpr int MAX_VERSION = 7;
|
||||
@@ -688,7 +691,39 @@ bool cmCMakePresetsGraph::ReadJSONFile(const std::string& filename,
|
||||
return true;
|
||||
};
|
||||
|
||||
for (auto include : presets.Include) {
|
||||
std::vector<MacroExpander> macroExpanders;
|
||||
|
||||
MacroExpander environmentMacroExpander =
|
||||
[](const std::string& macroNamespace, const std::string& macroName,
|
||||
std::string& expanded, int /*version*/) -> ExpandMacroResult {
|
||||
if (macroNamespace == "penv") {
|
||||
if (macroName.empty()) {
|
||||
return ExpandMacroResult::Error;
|
||||
}
|
||||
if (cm::optional<std::string> value =
|
||||
cmSystemTools::GetEnvVar(macroName)) {
|
||||
expanded += *value;
|
||||
}
|
||||
return ExpandMacroResult::Ok;
|
||||
}
|
||||
|
||||
return ExpandMacroResult::Ignore;
|
||||
};
|
||||
|
||||
macroExpanders.push_back(environmentMacroExpander);
|
||||
|
||||
for (Json::ArrayIndex i = 0; i < presets.Include.size(); ++i) {
|
||||
auto include = presets.Include[i];
|
||||
|
||||
// Support for macro expansion in includes added in version 7
|
||||
if (v >= 7) {
|
||||
if (ExpandMacros(include, macroExpanders, v) != ExpandMacroResult::Ok) {
|
||||
cmCMakePresetErrors::INVALID_INCLUDE(&root["include"][i],
|
||||
&this->parseState);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cmSystemTools::FileIsFullPath(include)) {
|
||||
auto directory = cmSystemTools::GetFilenamePath(filename);
|
||||
include = cmStrCat(directory, '/', include);
|
||||
|
||||
Reference in New Issue
Block a user