/src/CMake/Source/cmCMakePresetsGraph.cxx
Line | Count | Source |
1 | | /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
2 | | file LICENSE.rst or https://cmake.org/licensing for details. */ |
3 | | #include "cmCMakePresetsGraph.h" |
4 | | |
5 | | #include <algorithm> |
6 | | #include <cassert> |
7 | | #include <cstddef> |
8 | | #include <functional> |
9 | | #include <iomanip> |
10 | | #include <iostream> |
11 | | #include <iterator> |
12 | | #include <utility> |
13 | | |
14 | | #include <cm/memory> |
15 | | #include <cm/string_view> |
16 | | |
17 | | #include "cmsys/RegularExpression.hxx" |
18 | | |
19 | | #include "cmCMakePresetsErrors.h" |
20 | | #include "cmCMakePresetsGraphInternal.h" |
21 | | #include "cmStringAlgorithms.h" |
22 | | #include "cmSystemTools.h" |
23 | | |
24 | | #define CHECK_EXPAND(out, field, expanders, version) \ |
25 | 212k | do { \ |
26 | 212k | switch (ExpandMacros(field, expanders, version)) { \ |
27 | 3.31k | case ExpandMacroResult::Error: \ |
28 | 3.31k | return false; \ |
29 | 675 | case ExpandMacroResult::Ignore: \ |
30 | 675 | out.reset(); \ |
31 | 675 | return true; \ |
32 | 28.2k | case ExpandMacroResult::Defer: \ |
33 | 28.2k | CM_FALLTHROUGH; \ |
34 | 208k | case ExpandMacroResult::Ok: \ |
35 | 208k | break; \ |
36 | 212k | } \ |
37 | 212k | } while (false) |
38 | | |
39 | | namespace { |
40 | | enum class CycleStatus |
41 | | { |
42 | | Unvisited, |
43 | | InProgress, |
44 | | Verified, |
45 | | }; |
46 | | |
47 | | using ConfigurePreset = cmCMakePresetsGraph::ConfigurePreset; |
48 | | using BuildPreset = cmCMakePresetsGraph::BuildPreset; |
49 | | using TestPreset = cmCMakePresetsGraph::TestPreset; |
50 | | using PackagePreset = cmCMakePresetsGraph::PackagePreset; |
51 | | using WorkflowPreset = cmCMakePresetsGraph::WorkflowPreset; |
52 | | template <typename T> |
53 | | using PresetPair = cmCMakePresetsGraph::PresetPair<T>; |
54 | | using ExpandMacroResult = cmCMakePresetsGraphInternal::ExpandMacroResult; |
55 | | using MacroExpander = cmCMakePresetsGraphInternal::MacroExpander; |
56 | | using MacroExpanderVector = cmCMakePresetsGraphInternal::MacroExpanderVector; |
57 | | using BaseMacroExpander = cmCMakePresetsGraphInternal::BaseMacroExpander; |
58 | | template <typename T> |
59 | | using PresetMacroExpander = |
60 | | cmCMakePresetsGraphInternal::PresetMacroExpander<T>; |
61 | | template <typename T> |
62 | | using ImmediateMacroExpander = |
63 | | cmCMakePresetsGraphInternal::ImmediateMacroExpander<T>; |
64 | | using cmCMakePresetsGraphInternal::ExpandMacros; |
65 | | |
66 | | bool gSkipNewLine = true; |
67 | | |
68 | | char const* WorkflowStepTypeToString(WorkflowPreset::WorkflowStep::Type type) |
69 | 1.86k | { |
70 | 1.86k | switch (type) { |
71 | 1.06k | case WorkflowPreset::WorkflowStep::Type::Configure: |
72 | 1.06k | return "configure"; |
73 | 408 | case WorkflowPreset::WorkflowStep::Type::Build: |
74 | 408 | return "build"; |
75 | 327 | case WorkflowPreset::WorkflowStep::Type::Test: |
76 | 327 | return "test"; |
77 | 66 | case WorkflowPreset::WorkflowStep::Type::Package: |
78 | 66 | return "package"; |
79 | 1.86k | } |
80 | 0 | return ""; |
81 | 1.86k | } |
82 | | |
83 | | void InheritString(std::string& child, std::string const& parent) |
84 | 92.7k | { |
85 | 92.7k | if (child.empty()) { |
86 | 77.9k | child = parent; |
87 | 77.9k | } |
88 | 92.7k | } |
89 | | |
90 | | template <typename T> |
91 | | void InheritOptionalValue(cm::optional<T>& child, |
92 | | cm::optional<T> const& parent) |
93 | 69.7k | { |
94 | 69.7k | if (!child) { |
95 | 69.7k | child = parent; |
96 | 69.7k | } |
97 | 69.7k | } cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<bool>(std::__1::optional<bool>&, std::__1::optional<bool> const&) Line | Count | Source | 93 | 46.5k | { | 94 | 46.5k | if (!child) { | 95 | 46.5k | child = parent; | 96 | 46.5k | } | 97 | 46.5k | } |
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TraceEnableMode>(std::__1::optional<cmCMakePresetsGraph::TraceEnableMode>&, std::__1::optional<cmCMakePresetsGraph::TraceEnableMode> const&) Line | Count | Source | 93 | 11.5k | { | 94 | 11.5k | if (!child) { | 95 | 11.5k | child = parent; | 96 | 11.5k | } | 97 | 11.5k | } |
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmTraceEnums::TraceOutputFormat>(std::__1::optional<cmTraceEnums::TraceOutputFormat>&, std::__1::optional<cmTraceEnums::TraceOutputFormat> const&) Line | Count | Source | 93 | 11.5k | { | 94 | 11.5k | if (!child) { | 95 | 11.5k | child = parent; | 96 | 11.5k | } | 97 | 11.5k | } |
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<unsigned int>(std::__1::optional<unsigned int>&, std::__1::optional<unsigned int> const&) Line | Count | Source | 93 | 93 | { | 94 | 93 | if (!child) { | 95 | 93 | child = parent; | 96 | 93 | } | 97 | 93 | } |
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TestPreset::OutputOptions::VerbosityEnum>(std::__1::optional<cmCMakePresetsGraph::TestPreset::OutputOptions::VerbosityEnum>&, std::__1::optional<cmCMakePresetsGraph::TestPreset::OutputOptions::VerbosityEnum> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<int>(std::__1::optional<int>&, std::__1::optional<int> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCTestTypes::TruncationMode>(std::__1::optional<cmCTestTypes::TruncationMode>&, std::__1::optional<cmCTestTypes::TruncationMode> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TestPreset::IncludeOptions::IndexOptions>(std::__1::optional<cmCMakePresetsGraph::TestPreset::IncludeOptions::IndexOptions>&, std::__1::optional<cmCMakePresetsGraph::TestPreset::IncludeOptions::IndexOptions> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TestPreset::ExcludeOptions::FixturesOptions>(std::__1::optional<cmCMakePresetsGraph::TestPreset::ExcludeOptions::FixturesOptions>&, std::__1::optional<cmCMakePresetsGraph::TestPreset::ExcludeOptions::FixturesOptions> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<std::__1::optional<unsigned int> >(std::__1::optional<std::__1::optional<unsigned int> >&, std::__1::optional<std::__1::optional<unsigned int> > const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TestPreset::ExecutionOptions::ShowOnlyEnum>(std::__1::optional<cmCMakePresetsGraph::TestPreset::ExecutionOptions::ShowOnlyEnum>&, std::__1::optional<cmCMakePresetsGraph::TestPreset::ExecutionOptions::ShowOnlyEnum> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TestPreset::ExecutionOptions::RepeatOptions>(std::__1::optional<cmCMakePresetsGraph::TestPreset::ExecutionOptions::RepeatOptions>&, std::__1::optional<cmCMakePresetsGraph::TestPreset::ExecutionOptions::RepeatOptions> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TestPreset::ExecutionOptions::NoTestsActionEnum>(std::__1::optional<cmCMakePresetsGraph::TestPreset::ExecutionOptions::NoTestsActionEnum>&, std::__1::optional<cmCMakePresetsGraph::TestPreset::ExecutionOptions::NoTestsActionEnum> const&) |
98 | | |
99 | | template <typename T> |
100 | | void InheritVector(std::vector<T>& child, std::vector<T> const& parent) |
101 | 11.8k | { |
102 | 11.8k | if (child.empty()) { |
103 | 11.8k | child = parent; |
104 | 11.8k | } |
105 | 11.8k | } |
106 | | |
107 | | template <typename K, typename V> |
108 | | void InheritMap(std::map<K, V>& child, std::map<K, V> const& parent) |
109 | 46.3k | { |
110 | 46.3k | for (auto const& item : parent) { |
111 | 18.2k | child.insert(item); |
112 | 18.2k | } |
113 | 46.3k | } cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritMap<cmDiagnostics::DiagnosticCategory, bool>(std::__1::map<cmDiagnostics::DiagnosticCategory, bool, std::__1::less<cmDiagnostics::DiagnosticCategory>, std::__1::allocator<std::__1::pair<cmDiagnostics::DiagnosticCategory const, bool> > >&, std::__1::map<cmDiagnostics::DiagnosticCategory, bool, std::__1::less<cmDiagnostics::DiagnosticCategory>, std::__1::allocator<std::__1::pair<cmDiagnostics::DiagnosticCategory const, bool> > > const&) Line | Count | Source | 109 | 23.0k | { | 110 | 23.0k | for (auto const& item : parent) { | 111 | 0 | child.insert(item); | 112 | 0 | } | 113 | 23.0k | } |
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritMap<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::optional<cmCMakePresetsGraph::CacheVariable> >(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::optional<cmCMakePresetsGraph::CacheVariable>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::optional<cmCMakePresetsGraph::CacheVariable> > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::optional<cmCMakePresetsGraph::CacheVariable>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::optional<cmCMakePresetsGraph::CacheVariable> > > > const&) Line | Count | Source | 109 | 11.5k | { | 110 | 11.5k | for (auto const& item : parent) { | 111 | 10.4k | child.insert(item); | 112 | 10.4k | } | 113 | 11.5k | } |
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritMap<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&) cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritMap<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > > const&) Line | Count | Source | 109 | 11.7k | { | 110 | 11.7k | for (auto const& item : parent) { | 111 | 7.79k | child.insert(item); | 112 | 7.79k | } | 113 | 11.7k | } |
|
114 | | |
115 | | /** |
116 | | * Check preset inheritance for cycles (using a DAG check algorithm) while |
117 | | * also bubbling up fields through the inheritance hierarchy, then verify |
118 | | * that each preset has the required fields, either directly or through |
119 | | * inheritance. |
120 | | */ |
121 | | template <typename T> |
122 | | bool VisitPreset( |
123 | | T& preset, |
124 | | std::map<std::string, cmCMakePresetsGraph::PresetPair<T>>& presets, |
125 | | std::map<std::string, CycleStatus> cycleStatus, cmCMakePresetsGraph& graph) |
126 | 65.9k | { |
127 | 65.9k | switch (cycleStatus[preset.Name]) { |
128 | 18 | case CycleStatus::InProgress: |
129 | 18 | cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE( |
130 | 18 | preset.Name, preset.kind(), &graph.parseState); |
131 | 18 | return false; |
132 | 0 | case CycleStatus::Verified: |
133 | 0 | return true; |
134 | 65.9k | default: |
135 | 65.9k | break; |
136 | 65.9k | } |
137 | | |
138 | 65.9k | cycleStatus[preset.Name] = CycleStatus::InProgress; |
139 | | |
140 | 65.9k | if (preset.Environment.count("") != 0) { |
141 | 15 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
142 | 15 | preset.Name, preset.kind(), &graph.parseState, |
143 | 15 | "Empty environment variable names are not allowed"); |
144 | 15 | return false; |
145 | 15 | } |
146 | | |
147 | 65.9k | bool result = preset.VisitPresetBeforeInherit(); |
148 | 65.9k | if (!result) { |
149 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
150 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); |
151 | 0 | return false; |
152 | 0 | } |
153 | | |
154 | 65.9k | for (auto const& i : preset.Inherits) { |
155 | 13.5k | auto parent = presets.find(i); |
156 | 13.5k | if (parent == presets.end()) { |
157 | 1.67k | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
158 | 1.67k | preset.Name, preset.kind(), &graph.parseState, |
159 | 1.67k | cmStrCat("Could not find inherited preset \"", i, "\"")); |
160 | 1.67k | return false; |
161 | 1.67k | } |
162 | | |
163 | 11.8k | auto& parentPreset = parent->second.Unexpanded; |
164 | 11.8k | if (!preset.OriginFile->ReachableFiles.count(parentPreset.OriginFile)) { |
165 | 0 | cmCMakePresetsErrors::INHERITED_PRESET_UNREACHABLE_FROM_FILE( |
166 | 0 | preset.Name, i, preset.kind(), &graph.parseState); |
167 | 0 | return false; |
168 | 0 | } |
169 | | |
170 | 11.8k | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { |
171 | 114 | return false; |
172 | 114 | } |
173 | | |
174 | 11.7k | result = preset.VisitPresetInherit(parentPreset); |
175 | 11.7k | if (!result) { |
176 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
177 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); |
178 | 0 | return false; |
179 | 0 | } |
180 | | |
181 | 11.7k | InheritMap(preset.Environment, parentPreset.Environment); |
182 | | |
183 | 11.7k | if (!preset.ConditionEvaluator) { |
184 | 11.7k | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; |
185 | 11.7k | } |
186 | 11.7k | } |
187 | | |
188 | 64.1k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { |
189 | 0 | preset.ConditionEvaluator.reset(); |
190 | 0 | } |
191 | | |
192 | 64.1k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), |
193 | 64.1k | &graph.parseState); |
194 | 64.1k | if (!result) { |
195 | 1.60k | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
196 | 1.60k | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); |
197 | 1.60k | return false; |
198 | 1.60k | } |
199 | | |
200 | 62.5k | cycleStatus[preset.Name] = CycleStatus::Verified; |
201 | 62.5k | return true; |
202 | 64.1k | } cmCMakePresetsGraph.cxx:bool (anonymous namespace)::VisitPreset<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph::ConfigurePreset&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::ConfigurePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::ConfigurePreset> > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >, cmCMakePresetsGraph&) Line | Count | Source | 126 | 53.1k | { | 127 | 53.1k | switch (cycleStatus[preset.Name]) { | 128 | 12 | case CycleStatus::InProgress: | 129 | 12 | cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE( | 130 | 12 | preset.Name, preset.kind(), &graph.parseState); | 131 | 12 | return false; | 132 | 0 | case CycleStatus::Verified: | 133 | 0 | return true; | 134 | 53.1k | default: | 135 | 53.1k | break; | 136 | 53.1k | } | 137 | | | 138 | 53.1k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 53.1k | if (preset.Environment.count("") != 0) { | 141 | 6 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 142 | 6 | preset.Name, preset.kind(), &graph.parseState, | 143 | 6 | "Empty environment variable names are not allowed"); | 144 | 6 | return false; | 145 | 6 | } | 146 | | | 147 | 53.1k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 53.1k | if (!result) { | 149 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 150 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 151 | 0 | return false; | 152 | 0 | } | 153 | | | 154 | 53.1k | for (auto const& i : preset.Inherits) { | 155 | 12.3k | auto parent = presets.find(i); | 156 | 12.3k | if (parent == presets.end()) { | 157 | 774 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 158 | 774 | preset.Name, preset.kind(), &graph.parseState, | 159 | 774 | cmStrCat("Could not find inherited preset \"", i, "\"")); | 160 | 774 | return false; | 161 | 774 | } | 162 | | | 163 | 11.6k | auto& parentPreset = parent->second.Unexpanded; | 164 | 11.6k | if (!preset.OriginFile->ReachableFiles.count(parentPreset.OriginFile)) { | 165 | 0 | cmCMakePresetsErrors::INHERITED_PRESET_UNREACHABLE_FROM_FILE( | 166 | 0 | preset.Name, i, preset.kind(), &graph.parseState); | 167 | 0 | return false; | 168 | 0 | } | 169 | | | 170 | 11.6k | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { | 171 | 54 | return false; | 172 | 54 | } | 173 | | | 174 | 11.5k | result = preset.VisitPresetInherit(parentPreset); | 175 | 11.5k | if (!result) { | 176 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 177 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 178 | 0 | return false; | 179 | 0 | } | 180 | | | 181 | 11.5k | InheritMap(preset.Environment, parentPreset.Environment); | 182 | | | 183 | 11.5k | if (!preset.ConditionEvaluator) { | 184 | 11.5k | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; | 185 | 11.5k | } | 186 | 11.5k | } | 187 | | | 188 | 52.3k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 52.3k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 52.3k | &graph.parseState); | 194 | 52.3k | if (!result) { | 195 | 234 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 196 | 234 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 197 | 234 | return false; | 198 | 234 | } | 199 | | | 200 | 52.0k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 52.0k | return true; | 202 | 52.3k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::VisitPreset<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::BuildPreset&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset> > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >, cmCMakePresetsGraph&) Line | Count | Source | 126 | 4.95k | { | 127 | 4.95k | switch (cycleStatus[preset.Name]) { | 128 | 3 | case CycleStatus::InProgress: | 129 | 3 | cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE( | 130 | 3 | preset.Name, preset.kind(), &graph.parseState); | 131 | 3 | return false; | 132 | 0 | case CycleStatus::Verified: | 133 | 0 | return true; | 134 | 4.95k | default: | 135 | 4.95k | break; | 136 | 4.95k | } | 137 | | | 138 | 4.95k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 4.95k | if (preset.Environment.count("") != 0) { | 141 | 3 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 142 | 3 | preset.Name, preset.kind(), &graph.parseState, | 143 | 3 | "Empty environment variable names are not allowed"); | 144 | 3 | return false; | 145 | 3 | } | 146 | | | 147 | 4.95k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 4.95k | if (!result) { | 149 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 150 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 151 | 0 | return false; | 152 | 0 | } | 153 | | | 154 | 4.95k | for (auto const& i : preset.Inherits) { | 155 | 552 | auto parent = presets.find(i); | 156 | 552 | if (parent == presets.end()) { | 157 | 423 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 158 | 423 | preset.Name, preset.kind(), &graph.parseState, | 159 | 423 | cmStrCat("Could not find inherited preset \"", i, "\"")); | 160 | 423 | return false; | 161 | 423 | } | 162 | | | 163 | 129 | auto& parentPreset = parent->second.Unexpanded; | 164 | 129 | if (!preset.OriginFile->ReachableFiles.count(parentPreset.OriginFile)) { | 165 | 0 | cmCMakePresetsErrors::INHERITED_PRESET_UNREACHABLE_FROM_FILE( | 166 | 0 | preset.Name, i, preset.kind(), &graph.parseState); | 167 | 0 | return false; | 168 | 0 | } | 169 | | | 170 | 129 | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { | 171 | 36 | return false; | 172 | 36 | } | 173 | | | 174 | 93 | result = preset.VisitPresetInherit(parentPreset); | 175 | 93 | if (!result) { | 176 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 177 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 178 | 0 | return false; | 179 | 0 | } | 180 | | | 181 | 93 | InheritMap(preset.Environment, parentPreset.Environment); | 182 | | | 183 | 93 | if (!preset.ConditionEvaluator) { | 184 | 93 | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; | 185 | 93 | } | 186 | 93 | } | 187 | | | 188 | 4.49k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 4.49k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 4.49k | &graph.parseState); | 194 | 4.49k | if (!result) { | 195 | 438 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 196 | 438 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 197 | 438 | return false; | 198 | 438 | } | 199 | | | 200 | 4.05k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 4.05k | return true; | 202 | 4.49k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::VisitPreset<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::TestPreset&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset> > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >, cmCMakePresetsGraph&) Line | Count | Source | 126 | 3.73k | { | 127 | 3.73k | switch (cycleStatus[preset.Name]) { | 128 | 3 | case CycleStatus::InProgress: | 129 | 3 | cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE( | 130 | 3 | preset.Name, preset.kind(), &graph.parseState); | 131 | 3 | return false; | 132 | 0 | case CycleStatus::Verified: | 133 | 0 | return true; | 134 | 3.73k | default: | 135 | 3.73k | break; | 136 | 3.73k | } | 137 | | | 138 | 3.73k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 3.73k | if (preset.Environment.count("") != 0) { | 141 | 3 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 142 | 3 | preset.Name, preset.kind(), &graph.parseState, | 143 | 3 | "Empty environment variable names are not allowed"); | 144 | 3 | return false; | 145 | 3 | } | 146 | | | 147 | 3.72k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 3.72k | if (!result) { | 149 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 150 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 151 | 0 | return false; | 152 | 0 | } | 153 | | | 154 | 3.72k | for (auto const& i : preset.Inherits) { | 155 | 435 | auto parent = presets.find(i); | 156 | 435 | if (parent == presets.end()) { | 157 | 336 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 158 | 336 | preset.Name, preset.kind(), &graph.parseState, | 159 | 336 | cmStrCat("Could not find inherited preset \"", i, "\"")); | 160 | 336 | return false; | 161 | 336 | } | 162 | | | 163 | 99 | auto& parentPreset = parent->second.Unexpanded; | 164 | 99 | if (!preset.OriginFile->ReachableFiles.count(parentPreset.OriginFile)) { | 165 | 0 | cmCMakePresetsErrors::INHERITED_PRESET_UNREACHABLE_FROM_FILE( | 166 | 0 | preset.Name, i, preset.kind(), &graph.parseState); | 167 | 0 | return false; | 168 | 0 | } | 169 | | | 170 | 99 | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { | 171 | 18 | return false; | 172 | 18 | } | 173 | | | 174 | 81 | result = preset.VisitPresetInherit(parentPreset); | 175 | 81 | if (!result) { | 176 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 177 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 178 | 0 | return false; | 179 | 0 | } | 180 | | | 181 | 81 | InheritMap(preset.Environment, parentPreset.Environment); | 182 | | | 183 | 81 | if (!preset.ConditionEvaluator) { | 184 | 81 | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; | 185 | 81 | } | 186 | 81 | } | 187 | | | 188 | 3.37k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 3.37k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 3.37k | &graph.parseState); | 194 | 3.37k | if (!result) { | 195 | 444 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 196 | 444 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 197 | 444 | return false; | 198 | 444 | } | 199 | | | 200 | 2.93k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 2.93k | return true; | 202 | 3.37k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::VisitPreset<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::PackagePreset&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset> > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >, cmCMakePresetsGraph&) Line | Count | Source | 126 | 2.36k | { | 127 | 2.36k | switch (cycleStatus[preset.Name]) { | 128 | 0 | case CycleStatus::InProgress: | 129 | 0 | cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE( | 130 | 0 | preset.Name, preset.kind(), &graph.parseState); | 131 | 0 | return false; | 132 | 0 | case CycleStatus::Verified: | 133 | 0 | return true; | 134 | 2.36k | default: | 135 | 2.36k | break; | 136 | 2.36k | } | 137 | | | 138 | 2.36k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 2.36k | if (preset.Environment.count("") != 0) { | 141 | 3 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 142 | 3 | preset.Name, preset.kind(), &graph.parseState, | 143 | 3 | "Empty environment variable names are not allowed"); | 144 | 3 | return false; | 145 | 3 | } | 146 | | | 147 | 2.36k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 2.36k | if (!result) { | 149 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 150 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 151 | 0 | return false; | 152 | 0 | } | 153 | | | 154 | 2.36k | for (auto const& i : preset.Inherits) { | 155 | 147 | auto parent = presets.find(i); | 156 | 147 | if (parent == presets.end()) { | 157 | 141 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 158 | 141 | preset.Name, preset.kind(), &graph.parseState, | 159 | 141 | cmStrCat("Could not find inherited preset \"", i, "\"")); | 160 | 141 | return false; | 161 | 141 | } | 162 | | | 163 | 6 | auto& parentPreset = parent->second.Unexpanded; | 164 | 6 | if (!preset.OriginFile->ReachableFiles.count(parentPreset.OriginFile)) { | 165 | 0 | cmCMakePresetsErrors::INHERITED_PRESET_UNREACHABLE_FROM_FILE( | 166 | 0 | preset.Name, i, preset.kind(), &graph.parseState); | 167 | 0 | return false; | 168 | 0 | } | 169 | | | 170 | 6 | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { | 171 | 6 | return false; | 172 | 6 | } | 173 | | | 174 | 0 | result = preset.VisitPresetInherit(parentPreset); | 175 | 0 | if (!result) { | 176 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 177 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 178 | 0 | return false; | 179 | 0 | } | 180 | | | 181 | 0 | InheritMap(preset.Environment, parentPreset.Environment); | 182 | |
| 183 | 0 | if (!preset.ConditionEvaluator) { | 184 | 0 | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; | 185 | 0 | } | 186 | 0 | } | 187 | | | 188 | 2.21k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 2.21k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 2.21k | &graph.parseState); | 194 | 2.21k | if (!result) { | 195 | 492 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 196 | 492 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 197 | 492 | return false; | 198 | 492 | } | 199 | | | 200 | 1.72k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 1.72k | return true; | 202 | 2.21k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::VisitPreset<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph::WorkflowPreset&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::WorkflowPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::WorkflowPreset> > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >, cmCMakePresetsGraph&) Line | Count | Source | 126 | 1.74k | { | 127 | 1.74k | switch (cycleStatus[preset.Name]) { | 128 | 0 | case CycleStatus::InProgress: | 129 | 0 | cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE( | 130 | 0 | preset.Name, preset.kind(), &graph.parseState); | 131 | 0 | return false; | 132 | 0 | case CycleStatus::Verified: | 133 | 0 | return true; | 134 | 1.74k | default: | 135 | 1.74k | break; | 136 | 1.74k | } | 137 | | | 138 | 1.74k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 1.74k | if (preset.Environment.count("") != 0) { | 141 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 142 | 0 | preset.Name, preset.kind(), &graph.parseState, | 143 | 0 | "Empty environment variable names are not allowed"); | 144 | 0 | return false; | 145 | 0 | } | 146 | | | 147 | 1.74k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 1.74k | if (!result) { | 149 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 150 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 151 | 0 | return false; | 152 | 0 | } | 153 | | | 154 | 1.74k | for (auto const& i : preset.Inherits) { | 155 | 0 | auto parent = presets.find(i); | 156 | 0 | if (parent == presets.end()) { | 157 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 158 | 0 | preset.Name, preset.kind(), &graph.parseState, | 159 | 0 | cmStrCat("Could not find inherited preset \"", i, "\"")); | 160 | 0 | return false; | 161 | 0 | } | 162 | | | 163 | 0 | auto& parentPreset = parent->second.Unexpanded; | 164 | 0 | if (!preset.OriginFile->ReachableFiles.count(parentPreset.OriginFile)) { | 165 | 0 | cmCMakePresetsErrors::INHERITED_PRESET_UNREACHABLE_FROM_FILE( | 166 | 0 | preset.Name, i, preset.kind(), &graph.parseState); | 167 | 0 | return false; | 168 | 0 | } | 169 | | | 170 | 0 | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { | 171 | 0 | return false; | 172 | 0 | } | 173 | | | 174 | 0 | result = preset.VisitPresetInherit(parentPreset); | 175 | 0 | if (!result) { | 176 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 177 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 178 | 0 | return false; | 179 | 0 | } | 180 | | | 181 | 0 | InheritMap(preset.Environment, parentPreset.Environment); | 182 | |
| 183 | 0 | if (!preset.ConditionEvaluator) { | 184 | 0 | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; | 185 | 0 | } | 186 | 0 | } | 187 | | | 188 | 1.74k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 1.74k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 1.74k | &graph.parseState); | 194 | 1.74k | if (!result) { | 195 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 196 | 0 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 197 | 0 | return false; | 198 | 0 | } | 199 | | | 200 | 1.74k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 1.74k | return true; | 202 | 1.74k | } |
|
203 | | |
204 | | template <typename T> |
205 | | bool ComputePresetInheritance( |
206 | | std::map<std::string, cmCMakePresetsGraph::PresetPair<T>>& presets, |
207 | | cmCMakePresetsGraph& graph) |
208 | 68.8k | { |
209 | 68.8k | std::map<std::string, CycleStatus> cycleStatus; |
210 | 73.4k | for (auto const& it : presets) { |
211 | 73.4k | cycleStatus[it.first] = CycleStatus::Unvisited; |
212 | 73.4k | } |
213 | | |
214 | 68.8k | for (auto& it : presets) { |
215 | 54.1k | auto& preset = it.second.Unexpanded; |
216 | 54.1k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { |
217 | 3.31k | return false; |
218 | 3.31k | } |
219 | 54.1k | } |
220 | | |
221 | 65.5k | return true; |
222 | 68.8k | } cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ComputePresetInheritance<cmCMakePresetsGraph::ConfigurePreset>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::ConfigurePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::ConfigurePreset> > > >&, cmCMakePresetsGraph&) Line | Count | Source | 208 | 15.5k | { | 209 | 15.5k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 44.2k | for (auto const& it : presets) { | 211 | 44.2k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 44.2k | } | 213 | | | 214 | 41.5k | for (auto& it : presets) { | 215 | 41.5k | auto& preset = it.second.Unexpanded; | 216 | 41.5k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 1.02k | return false; | 218 | 1.02k | } | 219 | 41.5k | } | 220 | | | 221 | 14.5k | return true; | 222 | 15.5k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ComputePresetInheritance<cmCMakePresetsGraph::BuildPreset>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset> > > >&, cmCMakePresetsGraph&) Line | Count | Source | 208 | 14.5k | { | 209 | 14.5k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 14.5k | for (auto const& it : presets) { | 211 | 10.0k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 10.0k | } | 213 | | | 214 | 14.5k | for (auto& it : presets) { | 215 | 4.83k | auto& preset = it.second.Unexpanded; | 216 | 4.83k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 867 | return false; | 218 | 867 | } | 219 | 4.83k | } | 220 | | | 221 | 13.6k | return true; | 222 | 14.5k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ComputePresetInheritance<cmCMakePresetsGraph::TestPreset>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset> > > >&, cmCMakePresetsGraph&) Line | Count | Source | 208 | 13.6k | { | 209 | 13.6k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 13.6k | for (auto const& it : presets) { | 211 | 9.95k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 9.95k | } | 213 | | | 214 | 13.6k | for (auto& it : presets) { | 215 | 3.63k | auto& preset = it.second.Unexpanded; | 216 | 3.63k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 786 | return false; | 218 | 786 | } | 219 | 3.63k | } | 220 | | | 221 | 12.8k | return true; | 222 | 13.6k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ComputePresetInheritance<cmCMakePresetsGraph::PackagePreset>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset> > > >&, cmCMakePresetsGraph&) Line | Count | Source | 208 | 12.8k | { | 209 | 12.8k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 12.8k | for (auto const& it : presets) { | 211 | 7.39k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 7.39k | } | 213 | | | 214 | 12.8k | for (auto& it : presets) { | 215 | 2.36k | auto& preset = it.second.Unexpanded; | 216 | 2.36k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 636 | return false; | 218 | 636 | } | 219 | 2.36k | } | 220 | | | 221 | 12.2k | return true; | 222 | 12.8k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ComputePresetInheritance<cmCMakePresetsGraph::WorkflowPreset>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::WorkflowPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::WorkflowPreset> > > >&, cmCMakePresetsGraph&) Line | Count | Source | 208 | 12.2k | { | 209 | 12.2k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 12.2k | for (auto const& it : presets) { | 211 | 1.74k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 1.74k | } | 213 | | | 214 | 12.2k | for (auto& it : presets) { | 215 | 1.74k | auto& preset = it.second.Unexpanded; | 216 | 1.74k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 0 | return false; | 218 | 0 | } | 219 | 1.74k | } | 220 | | | 221 | 12.2k | return true; | 222 | 12.2k | } |
|
223 | | |
224 | | constexpr char const* ValidPrefixes[] = { |
225 | | "", |
226 | | "env", |
227 | | "penv", |
228 | | "vendor", |
229 | | }; |
230 | | |
231 | | bool PrefixesValidMacroNamespace(std::string const& str) |
232 | 1.18M | { |
233 | 1.18M | return std::any_of( |
234 | 1.18M | std::begin(ValidPrefixes), std::end(ValidPrefixes), |
235 | 3.71M | [&str](char const* prefix) -> bool { return cmHasPrefix(prefix, str); }); |
236 | 1.18M | } |
237 | | |
238 | | bool IsValidMacroNamespace(std::string const& str) |
239 | 519k | { |
240 | 519k | return std::any_of( |
241 | 519k | std::begin(ValidPrefixes), std::end(ValidPrefixes), |
242 | 651k | [&str](char const* prefix) -> bool { return str == prefix; }); |
243 | 519k | } |
244 | | |
245 | | ExpandMacroResult VisitEnv(std::string& value, CycleStatus& status, |
246 | | MacroExpanderVector const& macroExpanders, |
247 | | int version); |
248 | | template <typename T> |
249 | | class EnvironmentMacroExpander : public MacroExpander |
250 | | { |
251 | | std::map<std::string, CycleStatus>& EnvCycles; |
252 | | cm::optional<T>& Out; |
253 | | MacroExpanderVector& MacroExpanders; |
254 | | |
255 | | public: |
256 | | EnvironmentMacroExpander(MacroExpanderVector& macroExpanders, |
257 | | cm::optional<T>& out, |
258 | | std::map<std::string, CycleStatus>& envCycles) |
259 | 37.6k | : EnvCycles(envCycles) |
260 | 37.6k | , Out(out) |
261 | 37.6k | , MacroExpanders(macroExpanders) |
262 | 37.6k | { |
263 | 37.6k | } cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::BuildPreset>::EnvironmentMacroExpander(std::__1::vector<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> >, std::__1::allocator<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> > > >&, std::__1::optional<cmCMakePresetsGraph::BuildPreset>&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >&) Line | Count | Source | 259 | 1.80k | : EnvCycles(envCycles) | 260 | 1.80k | , Out(out) | 261 | 1.80k | , MacroExpanders(macroExpanders) | 262 | 1.80k | { | 263 | 1.80k | } |
cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::TestPreset>::EnvironmentMacroExpander(std::__1::vector<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> >, std::__1::allocator<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> > > >&, std::__1::optional<cmCMakePresetsGraph::TestPreset>&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >&) Line | Count | Source | 259 | 1.10k | : EnvCycles(envCycles) | 260 | 1.10k | , Out(out) | 261 | 1.10k | , MacroExpanders(macroExpanders) | 262 | 1.10k | { | 263 | 1.10k | } |
cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::PackagePreset>::EnvironmentMacroExpander(std::__1::vector<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> >, std::__1::allocator<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> > > >&, std::__1::optional<cmCMakePresetsGraph::PackagePreset>&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >&) Line | Count | Source | 259 | 975 | : EnvCycles(envCycles) | 260 | 975 | , Out(out) | 261 | 975 | , MacroExpanders(macroExpanders) | 262 | 975 | { | 263 | 975 | } |
cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::ConfigurePreset>::EnvironmentMacroExpander(std::__1::vector<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> >, std::__1::allocator<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> > > >&, std::__1::optional<cmCMakePresetsGraph::ConfigurePreset>&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >&) Line | Count | Source | 259 | 33.6k | : EnvCycles(envCycles) | 260 | 33.6k | , Out(out) | 261 | 33.6k | , MacroExpanders(macroExpanders) | 262 | 33.6k | { | 263 | 33.6k | } |
cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::WorkflowPreset>::EnvironmentMacroExpander(std::__1::vector<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> >, std::__1::allocator<std::__1::unique_ptr<cmCMakePresetsGraphInternal::MacroExpander, std::__1::default_delete<cmCMakePresetsGraphInternal::MacroExpander> > > >&, std::__1::optional<cmCMakePresetsGraph::WorkflowPreset>&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (anonymous namespace)::CycleStatus, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, (anonymous namespace)::CycleStatus> > >&) Line | Count | Source | 259 | 39 | : EnvCycles(envCycles) | 260 | 39 | , Out(out) | 261 | 39 | , MacroExpanders(macroExpanders) | 262 | 39 | { | 263 | 39 | } |
|
264 | | ExpandMacroResult operator()(std::string const& macroNamespace, |
265 | | std::string const& macroName, |
266 | | std::string& macroOut, |
267 | | int version) const override |
268 | 101k | { |
269 | 101k | if (macroNamespace == "env" && !macroName.empty() && Out) { |
270 | 87.6k | auto v = Out->Environment.find(macroName); |
271 | 87.6k | if (v != Out->Environment.end() && v->second) { |
272 | 393 | auto e = |
273 | 393 | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); |
274 | 393 | if (e != ExpandMacroResult::Ok) { |
275 | 6 | return e; |
276 | 6 | } |
277 | 387 | macroOut += *v->second; |
278 | 387 | return ExpandMacroResult::Ok; |
279 | 393 | } |
280 | 87.6k | } |
281 | | |
282 | 101k | if (macroNamespace == "env" || macroNamespace == "penv") { |
283 | 97.2k | if (macroName.empty()) { |
284 | 15 | return ExpandMacroResult::Error; |
285 | 15 | } |
286 | 97.2k | if (cm::optional<std::string> value = |
287 | 97.2k | cmSystemTools::GetEnvVar(macroName)) { |
288 | 63.2k | macroOut += *value; |
289 | 63.2k | } |
290 | 97.2k | return ExpandMacroResult::Ok; |
291 | 97.2k | } |
292 | | |
293 | 4.22k | return ExpandMacroResult::Ignore; |
294 | 101k | } cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::BuildPreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const Line | Count | Source | 268 | 24.6k | { | 269 | 24.6k | if (macroNamespace == "env" && !macroName.empty() && Out) { | 270 | 22.5k | auto v = Out->Environment.find(macroName); | 271 | 22.5k | if (v != Out->Environment.end() && v->second) { | 272 | 0 | auto e = | 273 | 0 | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); | 274 | 0 | if (e != ExpandMacroResult::Ok) { | 275 | 0 | return e; | 276 | 0 | } | 277 | 0 | macroOut += *v->second; | 278 | 0 | return ExpandMacroResult::Ok; | 279 | 0 | } | 280 | 22.5k | } | 281 | | | 282 | 24.6k | if (macroNamespace == "env" || macroNamespace == "penv") { | 283 | 24.1k | if (macroName.empty()) { | 284 | 6 | return ExpandMacroResult::Error; | 285 | 6 | } | 286 | 24.1k | if (cm::optional<std::string> value = | 287 | 24.1k | cmSystemTools::GetEnvVar(macroName)) { | 288 | 15.4k | macroOut += *value; | 289 | 15.4k | } | 290 | 24.1k | return ExpandMacroResult::Ok; | 291 | 24.1k | } | 292 | | | 293 | 432 | return ExpandMacroResult::Ignore; | 294 | 24.6k | } |
cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::TestPreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const Line | Count | Source | 268 | 9.63k | { | 269 | 9.63k | if (macroNamespace == "env" && !macroName.empty() && Out) { | 270 | 8.95k | auto v = Out->Environment.find(macroName); | 271 | 8.95k | if (v != Out->Environment.end() && v->second) { | 272 | 0 | auto e = | 273 | 0 | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); | 274 | 0 | if (e != ExpandMacroResult::Ok) { | 275 | 0 | return e; | 276 | 0 | } | 277 | 0 | macroOut += *v->second; | 278 | 0 | return ExpandMacroResult::Ok; | 279 | 0 | } | 280 | 8.95k | } | 281 | | | 282 | 9.63k | if (macroNamespace == "env" || macroNamespace == "penv") { | 283 | 9.61k | if (macroName.empty()) { | 284 | 0 | return ExpandMacroResult::Error; | 285 | 0 | } | 286 | 9.61k | if (cm::optional<std::string> value = | 287 | 9.61k | cmSystemTools::GetEnvVar(macroName)) { | 288 | 5.97k | macroOut += *value; | 289 | 5.97k | } | 290 | 9.61k | return ExpandMacroResult::Ok; | 291 | 9.61k | } | 292 | | | 293 | 15 | return ExpandMacroResult::Ignore; | 294 | 9.63k | } |
cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::PackagePreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const Line | Count | Source | 268 | 9.75k | { | 269 | 9.75k | if (macroNamespace == "env" && !macroName.empty() && Out) { | 270 | 9.06k | auto v = Out->Environment.find(macroName); | 271 | 9.06k | if (v != Out->Environment.end() && v->second) { | 272 | 0 | auto e = | 273 | 0 | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); | 274 | 0 | if (e != ExpandMacroResult::Ok) { | 275 | 0 | return e; | 276 | 0 | } | 277 | 0 | macroOut += *v->second; | 278 | 0 | return ExpandMacroResult::Ok; | 279 | 0 | } | 280 | 9.06k | } | 281 | | | 282 | 9.75k | if (macroNamespace == "env" || macroNamespace == "penv") { | 283 | 9.73k | if (macroName.empty()) { | 284 | 0 | return ExpandMacroResult::Error; | 285 | 0 | } | 286 | 9.73k | if (cm::optional<std::string> value = | 287 | 9.73k | cmSystemTools::GetEnvVar(macroName)) { | 288 | 6.03k | macroOut += *value; | 289 | 6.03k | } | 290 | 9.73k | return ExpandMacroResult::Ok; | 291 | 9.73k | } | 292 | | | 293 | 18 | return ExpandMacroResult::Ignore; | 294 | 9.75k | } |
cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::ConfigurePreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const Line | Count | Source | 268 | 57.8k | { | 269 | 57.8k | if (macroNamespace == "env" && !macroName.empty() && Out) { | 270 | 47.0k | auto v = Out->Environment.find(macroName); | 271 | 47.0k | if (v != Out->Environment.end() && v->second) { | 272 | 393 | auto e = | 273 | 393 | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); | 274 | 393 | if (e != ExpandMacroResult::Ok) { | 275 | 6 | return e; | 276 | 6 | } | 277 | 387 | macroOut += *v->second; | 278 | 387 | return ExpandMacroResult::Ok; | 279 | 393 | } | 280 | 47.0k | } | 281 | | | 282 | 57.5k | if (macroNamespace == "env" || macroNamespace == "penv") { | 283 | 53.7k | if (macroName.empty()) { | 284 | 9 | return ExpandMacroResult::Error; | 285 | 9 | } | 286 | 53.7k | if (cm::optional<std::string> value = | 287 | 53.7k | cmSystemTools::GetEnvVar(macroName)) { | 288 | 35.7k | macroOut += *value; | 289 | 35.7k | } | 290 | 53.7k | return ExpandMacroResult::Ok; | 291 | 53.7k | } | 292 | | | 293 | 3.75k | return ExpandMacroResult::Ignore; | 294 | 57.5k | } |
Unexecuted instantiation: cmCMakePresetsGraph.cxx:(anonymous namespace)::EnvironmentMacroExpander<cmCMakePresetsGraph::WorkflowPreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const |
295 | | }; |
296 | | |
297 | | bool CheckExpandMacros(ConfigurePreset const& preset, |
298 | | cm::optional<ConfigurePreset>& out, |
299 | | MacroExpanderVector const& macroExpanders, |
300 | | cmCMakePresetsGraph const* graph = nullptr) |
301 | 80.0k | { |
302 | 80.0k | int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version; |
303 | | |
304 | 80.0k | std::string binaryDir = preset.BinaryDir; |
305 | 80.0k | CHECK_EXPAND(out, binaryDir, macroExpanders, version); |
306 | | |
307 | 78.8k | if (!binaryDir.empty()) { |
308 | 26.8k | if (graph) { |
309 | 10.8k | if (!cmSystemTools::FileIsFullPath(binaryDir)) { |
310 | 5.95k | binaryDir = cmStrCat(graph->SourceDir, '/', binaryDir); |
311 | 5.95k | } |
312 | 10.8k | out->BinaryDir = cmSystemTools::CollapseFullPath(binaryDir); |
313 | 10.8k | cmSystemTools::ConvertToUnixSlashes(out->BinaryDir); |
314 | 16.0k | } else { |
315 | | // Defer path normalization until the graph is merged, but store the |
316 | | // intermediate result. |
317 | 16.0k | out->BinaryDir = binaryDir; |
318 | 16.0k | } |
319 | 26.8k | } |
320 | | |
321 | 78.8k | if (!preset.InstallDir.empty()) { |
322 | 7.89k | std::string installDir = preset.InstallDir; |
323 | 7.89k | CHECK_EXPAND(out, installDir, macroExpanders, version); |
324 | | |
325 | 6.97k | if (graph) { |
326 | 3.25k | if (!cmSystemTools::FileIsFullPath(installDir)) { |
327 | 2.59k | installDir = cmStrCat(graph->SourceDir, '/', installDir); |
328 | 2.59k | } |
329 | 3.25k | out->InstallDir = cmSystemTools::CollapseFullPath(installDir); |
330 | 3.25k | cmSystemTools::ConvertToUnixSlashes(out->InstallDir); |
331 | 3.72k | } else { |
332 | | // Defer path normalization until the graph is merged, but store the |
333 | | // intermediate result. |
334 | 3.72k | out->InstallDir = installDir; |
335 | 3.72k | } |
336 | 6.97k | } |
337 | | |
338 | 77.8k | if (!preset.ToolchainFile.empty()) { |
339 | 4.59k | std::string toolchain = preset.ToolchainFile; |
340 | 4.59k | CHECK_EXPAND(out, toolchain, macroExpanders, version); |
341 | 4.52k | out->ToolchainFile = toolchain; |
342 | 4.52k | } |
343 | | |
344 | 77.8k | if (!preset.GraphVizFile.empty()) { |
345 | 57 | std::string graphVizFile = preset.GraphVizFile; |
346 | 57 | CHECK_EXPAND(out, graphVizFile, macroExpanders, version); |
347 | 54 | out->GraphVizFile = graphVizFile; |
348 | 54 | } |
349 | | |
350 | 77.8k | for (auto& variable : out->CacheVariables) { |
351 | 19.3k | if (variable.second) { |
352 | 19.2k | CHECK_EXPAND(out, variable.second->Value, macroExpanders, version); |
353 | 19.2k | } |
354 | 19.3k | } |
355 | | |
356 | 77.0k | return true; |
357 | 77.8k | } |
358 | | |
359 | | bool CheckExpandMacros(BuildPreset const& preset, |
360 | | cm::optional<BuildPreset>& out, |
361 | | MacroExpanderVector const& macroExpanders, |
362 | | cmCMakePresetsGraph const* graph = nullptr) |
363 | 13.5k | { |
364 | 13.5k | int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version; |
365 | | |
366 | 21.7k | for (auto& target : out->Targets) { |
367 | 21.7k | CHECK_EXPAND(out, target, macroExpanders, version); |
368 | 21.7k | } |
369 | | |
370 | 13.0k | for (auto& nativeToolOption : out->NativeToolOptions) { |
371 | 0 | CHECK_EXPAND(out, nativeToolOption, macroExpanders, version); |
372 | 0 | } |
373 | | |
374 | 13.0k | return true; |
375 | 13.0k | } |
376 | | |
377 | | bool CheckExpandMacros(TestPreset const& preset, cm::optional<TestPreset>& out, |
378 | | MacroExpanderVector const& macroExpanders, |
379 | | cmCMakePresetsGraph const* graph = nullptr) |
380 | 14.0k | { |
381 | 14.0k | int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version; |
382 | | |
383 | 14.0k | for (auto& overwrite : out->OverwriteConfigurationFile) { |
384 | 0 | CHECK_EXPAND(out, overwrite, macroExpanders, version); |
385 | 0 | } |
386 | | |
387 | 14.0k | if (out->Output) { |
388 | 0 | CHECK_EXPAND(out, out->Output->OutputLogFile, macroExpanders, version); |
389 | 0 | CHECK_EXPAND(out, out->Output->OutputJUnitFile, macroExpanders, version); |
390 | 0 | } |
391 | | |
392 | 14.0k | if (out->Filter) { |
393 | 0 | if (out->Filter->Include) { |
394 | 0 | CHECK_EXPAND(out, out->Filter->Include->Name, macroExpanders, version); |
395 | 0 | CHECK_EXPAND(out, out->Filter->Include->Label, macroExpanders, version); |
396 | | |
397 | 0 | if (out->Filter->Include->Index) { |
398 | 0 | CHECK_EXPAND(out, out->Filter->Include->Index->IndexFile, |
399 | 0 | macroExpanders, version); |
400 | 0 | } |
401 | 0 | } |
402 | | |
403 | 0 | if (out->Filter->Exclude) { |
404 | 0 | CHECK_EXPAND(out, out->Filter->Exclude->Name, macroExpanders, version); |
405 | 0 | CHECK_EXPAND(out, out->Filter->Exclude->Label, macroExpanders, version); |
406 | | |
407 | 0 | if (out->Filter->Exclude->Fixtures) { |
408 | 0 | CHECK_EXPAND(out, out->Filter->Exclude->Fixtures->Any, macroExpanders, |
409 | 0 | version); |
410 | 0 | CHECK_EXPAND(out, out->Filter->Exclude->Fixtures->Setup, |
411 | 0 | macroExpanders, version); |
412 | 0 | CHECK_EXPAND(out, out->Filter->Exclude->Fixtures->Cleanup, |
413 | 0 | macroExpanders, version); |
414 | 0 | } |
415 | 0 | } |
416 | 0 | } |
417 | | |
418 | 14.0k | if (out->Execution) { |
419 | 6 | CHECK_EXPAND(out, out->Execution->ResourceSpecFile, macroExpanders, |
420 | 6 | version); |
421 | 6 | } |
422 | | |
423 | 14.0k | return true; |
424 | 14.0k | } |
425 | | |
426 | | bool CheckExpandMacros(PackagePreset const& preset, |
427 | | cm::optional<PackagePreset>& out, |
428 | | MacroExpanderVector const& macroExpanders, |
429 | | cmCMakePresetsGraph const* graph = nullptr) |
430 | 11.5k | { |
431 | 11.5k | int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version; |
432 | | |
433 | 11.5k | for (auto& variable : out->Variables) { |
434 | 0 | CHECK_EXPAND(out, variable.second, macroExpanders, version); |
435 | 0 | } |
436 | | |
437 | 11.5k | CHECK_EXPAND(out, out->ConfigFile, macroExpanders, version); |
438 | 11.5k | CHECK_EXPAND(out, out->PackageName, macroExpanders, version); |
439 | 11.5k | CHECK_EXPAND(out, out->PackageVersion, macroExpanders, version); |
440 | 11.5k | CHECK_EXPAND(out, out->PackageDirectory, macroExpanders, version); |
441 | 11.5k | CHECK_EXPAND(out, out->VendorName, macroExpanders, version); |
442 | | |
443 | 11.5k | return true; |
444 | 11.5k | } |
445 | | |
446 | | bool CheckExpandMacros(WorkflowPreset const& /*preset*/, |
447 | | cm::optional<WorkflowPreset>& /*out*/, |
448 | | MacroExpanderVector const& /*macroExpanders*/, |
449 | | cmCMakePresetsGraph const* /*graph*/ = nullptr) |
450 | 1.95k | { |
451 | 1.95k | return true; |
452 | 1.95k | } |
453 | | |
454 | | template <typename T> |
455 | | bool ExpandMacros(cmCMakePresetsGraph* graph, T const& preset, |
456 | | cm::optional<T>& out) |
457 | 37.6k | { |
458 | 37.6k | out.emplace(preset); |
459 | | |
460 | 37.6k | std::map<std::string, CycleStatus> envCycles; |
461 | 37.6k | for (auto const& v : out->Environment) { |
462 | 15.5k | envCycles[v.first] = CycleStatus::Unvisited; |
463 | 15.5k | } |
464 | | |
465 | 37.6k | MacroExpanderVector macroExpanders{}; |
466 | | |
467 | 37.6k | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); |
468 | 37.6k | macroExpanders.push_back( |
469 | 37.6k | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); |
470 | 37.6k | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( |
471 | 37.6k | macroExpanders, out, envCycles)); |
472 | | |
473 | 37.6k | for (auto& v : out->Environment) { |
474 | 14.7k | if (v.second) { |
475 | 14.5k | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, |
476 | 14.5k | graph->GetVersion(preset))) { |
477 | 393 | case ExpandMacroResult::Error: |
478 | 393 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
479 | 393 | preset.Name, preset.kind(), &graph->parseState, |
480 | 393 | "Invalid macro expansion"); |
481 | 393 | return false; |
482 | 141 | case ExpandMacroResult::Ignore: |
483 | 141 | out.reset(); |
484 | 141 | return true; |
485 | 0 | case ExpandMacroResult::Defer: |
486 | 0 | CM_FALLTHROUGH; |
487 | 14.0k | case ExpandMacroResult::Ok: |
488 | 14.0k | break; |
489 | 14.5k | } |
490 | 14.5k | } |
491 | 14.7k | } |
492 | | |
493 | 37.0k | if (preset.ConditionEvaluator) { |
494 | 4.59k | cm::optional<bool> result; |
495 | 4.59k | if (!preset.ConditionEvaluator->Evaluate( |
496 | 4.59k | macroExpanders, graph->GetVersion(preset), result)) { |
497 | 831 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
498 | 831 | preset.Name, preset.kind(), &graph->parseState, "Invalid condition"); |
499 | 831 | return false; |
500 | 831 | } |
501 | 3.76k | if (!result) { |
502 | 51 | out.reset(); |
503 | 51 | return true; |
504 | 51 | } |
505 | 3.71k | out->ConditionResult = *result; |
506 | 3.71k | } |
507 | | |
508 | 36.1k | return CheckExpandMacros(preset, out, macroExpanders, graph); |
509 | 37.0k | } cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::BuildPreset const&, std::__1::optional<cmCMakePresetsGraph::BuildPreset>&) Line | Count | Source | 457 | 1.80k | { | 458 | 1.80k | out.emplace(preset); | 459 | | | 460 | 1.80k | std::map<std::string, CycleStatus> envCycles; | 461 | 1.80k | for (auto const& v : out->Environment) { | 462 | 1.23k | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 1.23k | } | 464 | | | 465 | 1.80k | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 1.80k | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 1.80k | macroExpanders.push_back( | 469 | 1.80k | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 1.80k | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 1.80k | macroExpanders, out, envCycles)); | 472 | | | 473 | 1.80k | for (auto& v : out->Environment) { | 474 | 1.22k | if (v.second) { | 475 | 1.18k | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, | 476 | 1.18k | graph->GetVersion(preset))) { | 477 | 0 | case ExpandMacroResult::Error: | 478 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 479 | 0 | preset.Name, preset.kind(), &graph->parseState, | 480 | 0 | "Invalid macro expansion"); | 481 | 0 | return false; | 482 | 15 | case ExpandMacroResult::Ignore: | 483 | 15 | out.reset(); | 484 | 15 | return true; | 485 | 0 | case ExpandMacroResult::Defer: | 486 | 0 | CM_FALLTHROUGH; | 487 | 1.17k | case ExpandMacroResult::Ok: | 488 | 1.17k | break; | 489 | 1.18k | } | 490 | 1.18k | } | 491 | 1.22k | } | 492 | | | 493 | 1.78k | if (preset.ConditionEvaluator) { | 494 | 0 | cm::optional<bool> result; | 495 | 0 | if (!preset.ConditionEvaluator->Evaluate( | 496 | 0 | macroExpanders, graph->GetVersion(preset), result)) { | 497 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 498 | 0 | preset.Name, preset.kind(), &graph->parseState, "Invalid condition"); | 499 | 0 | return false; | 500 | 0 | } | 501 | 0 | if (!result) { | 502 | 0 | out.reset(); | 503 | 0 | return true; | 504 | 0 | } | 505 | 0 | out->ConditionResult = *result; | 506 | 0 | } | 507 | | | 508 | 1.78k | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 1.78k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::TestPreset const&, std::__1::optional<cmCMakePresetsGraph::TestPreset>&) Line | Count | Source | 457 | 1.10k | { | 458 | 1.10k | out.emplace(preset); | 459 | | | 460 | 1.10k | std::map<std::string, CycleStatus> envCycles; | 461 | 1.22k | for (auto const& v : out->Environment) { | 462 | 1.22k | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 1.22k | } | 464 | | | 465 | 1.10k | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 1.10k | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 1.10k | macroExpanders.push_back( | 469 | 1.10k | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 1.10k | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 1.10k | macroExpanders, out, envCycles)); | 472 | | | 473 | 1.22k | for (auto& v : out->Environment) { | 474 | 1.22k | if (v.second) { | 475 | 1.18k | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, | 476 | 1.18k | graph->GetVersion(preset))) { | 477 | 0 | case ExpandMacroResult::Error: | 478 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 479 | 0 | preset.Name, preset.kind(), &graph->parseState, | 480 | 0 | "Invalid macro expansion"); | 481 | 0 | return false; | 482 | 15 | case ExpandMacroResult::Ignore: | 483 | 15 | out.reset(); | 484 | 15 | return true; | 485 | 0 | case ExpandMacroResult::Defer: | 486 | 0 | CM_FALLTHROUGH; | 487 | 1.16k | case ExpandMacroResult::Ok: | 488 | 1.16k | break; | 489 | 1.18k | } | 490 | 1.18k | } | 491 | 1.22k | } | 492 | | | 493 | 1.09k | if (preset.ConditionEvaluator) { | 494 | 0 | cm::optional<bool> result; | 495 | 0 | if (!preset.ConditionEvaluator->Evaluate( | 496 | 0 | macroExpanders, graph->GetVersion(preset), result)) { | 497 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 498 | 0 | preset.Name, preset.kind(), &graph->parseState, "Invalid condition"); | 499 | 0 | return false; | 500 | 0 | } | 501 | 0 | if (!result) { | 502 | 0 | out.reset(); | 503 | 0 | return true; | 504 | 0 | } | 505 | 0 | out->ConditionResult = *result; | 506 | 0 | } | 507 | | | 508 | 1.09k | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 1.09k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::PackagePreset const&, std::__1::optional<cmCMakePresetsGraph::PackagePreset>&) Line | Count | Source | 457 | 975 | { | 458 | 975 | out.emplace(preset); | 459 | | | 460 | 975 | std::map<std::string, CycleStatus> envCycles; | 461 | 1.28k | for (auto const& v : out->Environment) { | 462 | 1.28k | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 1.28k | } | 464 | | | 465 | 975 | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 975 | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 975 | macroExpanders.push_back( | 469 | 975 | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 975 | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 975 | macroExpanders, out, envCycles)); | 472 | | | 473 | 1.27k | for (auto& v : out->Environment) { | 474 | 1.27k | if (v.second) { | 475 | 1.23k | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, | 476 | 1.23k | graph->GetVersion(preset))) { | 477 | 0 | case ExpandMacroResult::Error: | 478 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 479 | 0 | preset.Name, preset.kind(), &graph->parseState, | 480 | 0 | "Invalid macro expansion"); | 481 | 0 | return false; | 482 | 18 | case ExpandMacroResult::Ignore: | 483 | 18 | out.reset(); | 484 | 18 | return true; | 485 | 0 | case ExpandMacroResult::Defer: | 486 | 0 | CM_FALLTHROUGH; | 487 | 1.22k | case ExpandMacroResult::Ok: | 488 | 1.22k | break; | 489 | 1.23k | } | 490 | 1.23k | } | 491 | 1.27k | } | 492 | | | 493 | 957 | if (preset.ConditionEvaluator) { | 494 | 0 | cm::optional<bool> result; | 495 | 0 | if (!preset.ConditionEvaluator->Evaluate( | 496 | 0 | macroExpanders, graph->GetVersion(preset), result)) { | 497 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 498 | 0 | preset.Name, preset.kind(), &graph->parseState, "Invalid condition"); | 499 | 0 | return false; | 500 | 0 | } | 501 | 0 | if (!result) { | 502 | 0 | out.reset(); | 503 | 0 | return true; | 504 | 0 | } | 505 | 0 | out->ConditionResult = *result; | 506 | 0 | } | 507 | | | 508 | 957 | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 957 | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::ConfigurePreset const&, std::__1::optional<cmCMakePresetsGraph::ConfigurePreset>&) Line | Count | Source | 457 | 33.6k | { | 458 | 33.6k | out.emplace(preset); | 459 | | | 460 | 33.6k | std::map<std::string, CycleStatus> envCycles; | 461 | 33.6k | for (auto const& v : out->Environment) { | 462 | 11.8k | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 11.8k | } | 464 | | | 465 | 33.6k | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 33.6k | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 33.6k | macroExpanders.push_back( | 469 | 33.6k | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 33.6k | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 33.6k | macroExpanders, out, envCycles)); | 472 | | | 473 | 33.6k | for (auto& v : out->Environment) { | 474 | 11.0k | if (v.second) { | 475 | 10.9k | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, | 476 | 10.9k | graph->GetVersion(preset))) { | 477 | 393 | case ExpandMacroResult::Error: | 478 | 393 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 479 | 393 | preset.Name, preset.kind(), &graph->parseState, | 480 | 393 | "Invalid macro expansion"); | 481 | 393 | return false; | 482 | 93 | case ExpandMacroResult::Ignore: | 483 | 93 | out.reset(); | 484 | 93 | return true; | 485 | 0 | case ExpandMacroResult::Defer: | 486 | 0 | CM_FALLTHROUGH; | 487 | 10.4k | case ExpandMacroResult::Ok: | 488 | 10.4k | break; | 489 | 10.9k | } | 490 | 10.9k | } | 491 | 11.0k | } | 492 | | | 493 | 33.2k | if (preset.ConditionEvaluator) { | 494 | 4.59k | cm::optional<bool> result; | 495 | 4.59k | if (!preset.ConditionEvaluator->Evaluate( | 496 | 4.59k | macroExpanders, graph->GetVersion(preset), result)) { | 497 | 831 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 498 | 831 | preset.Name, preset.kind(), &graph->parseState, "Invalid condition"); | 499 | 831 | return false; | 500 | 831 | } | 501 | 3.76k | if (!result) { | 502 | 51 | out.reset(); | 503 | 51 | return true; | 504 | 51 | } | 505 | 3.71k | out->ConditionResult = *result; | 506 | 3.71k | } | 507 | | | 508 | 32.3k | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 33.2k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::WorkflowPreset const&, std::__1::optional<cmCMakePresetsGraph::WorkflowPreset>&) Line | Count | Source | 457 | 39 | { | 458 | 39 | out.emplace(preset); | 459 | | | 460 | 39 | std::map<std::string, CycleStatus> envCycles; | 461 | 39 | for (auto const& v : out->Environment) { | 462 | 0 | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 0 | } | 464 | | | 465 | 39 | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 39 | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 39 | macroExpanders.push_back( | 469 | 39 | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 39 | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 39 | macroExpanders, out, envCycles)); | 472 | | | 473 | 39 | for (auto& v : out->Environment) { | 474 | 0 | if (v.second) { | 475 | 0 | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, | 476 | 0 | graph->GetVersion(preset))) { | 477 | 0 | case ExpandMacroResult::Error: | 478 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 479 | 0 | preset.Name, preset.kind(), &graph->parseState, | 480 | 0 | "Invalid macro expansion"); | 481 | 0 | return false; | 482 | 0 | case ExpandMacroResult::Ignore: | 483 | 0 | out.reset(); | 484 | 0 | return true; | 485 | 0 | case ExpandMacroResult::Defer: | 486 | 0 | CM_FALLTHROUGH; | 487 | 0 | case ExpandMacroResult::Ok: | 488 | 0 | break; | 489 | 0 | } | 490 | 0 | } | 491 | 0 | } | 492 | | | 493 | 39 | if (preset.ConditionEvaluator) { | 494 | 0 | cm::optional<bool> result; | 495 | 0 | if (!preset.ConditionEvaluator->Evaluate( | 496 | 0 | macroExpanders, graph->GetVersion(preset), result)) { | 497 | 0 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 498 | 0 | preset.Name, preset.kind(), &graph->parseState, "Invalid condition"); | 499 | 0 | return false; | 500 | 0 | } | 501 | 0 | if (!result) { | 502 | 0 | out.reset(); | 503 | 0 | return true; | 504 | 0 | } | 505 | 0 | out->ConditionResult = *result; | 506 | 0 | } | 507 | | | 508 | 39 | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 39 | } |
|
510 | | |
511 | | ExpandMacroResult VisitEnv(std::string& value, CycleStatus& status, |
512 | | MacroExpanderVector const& macroExpanders, |
513 | | int version) |
514 | 14.9k | { |
515 | 14.9k | if (status == CycleStatus::Verified) { |
516 | 387 | return ExpandMacroResult::Ok; |
517 | 387 | } |
518 | 14.5k | if (status == CycleStatus::InProgress) { |
519 | 3 | return ExpandMacroResult::Error; |
520 | 3 | } |
521 | | |
522 | 14.5k | status = CycleStatus::InProgress; |
523 | 14.5k | auto e = ExpandMacros(value, macroExpanders, version); |
524 | 14.5k | if (e != ExpandMacroResult::Ok) { |
525 | 537 | return e; |
526 | 537 | } |
527 | 14.0k | status = CycleStatus::Verified; |
528 | 14.0k | return ExpandMacroResult::Ok; |
529 | 14.5k | } |
530 | | |
531 | | struct PresetListEntry |
532 | | { |
533 | | cmCMakePresetsGraph::Preset const* Preset; |
534 | | cm::optional<std::string> UnavailableReason; |
535 | | }; |
536 | | |
537 | | void PrintPresets(std::vector<PresetListEntry> const& presets) |
538 | 0 | { |
539 | 0 | if (presets.empty()) { |
540 | 0 | return; |
541 | 0 | } |
542 | | |
543 | 0 | auto presetWithLongestName = std::max_element( |
544 | 0 | presets.begin(), presets.end(), |
545 | 0 | [](PresetListEntry const& a, PresetListEntry const& b) { |
546 | 0 | return a.Preset->Name.length() < b.Preset->Name.length(); |
547 | 0 | }); |
548 | 0 | auto longestLength = presetWithLongestName->Preset->Name.length(); |
549 | |
|
550 | 0 | for (auto entryIt = presets.begin(); entryIt != presets.end(); ++entryIt) { |
551 | 0 | auto const& entry = *entryIt; |
552 | 0 | auto const* preset = entry.Preset; |
553 | 0 | std::string name = cmStrCat(" \"", preset->Name, '"'); |
554 | 0 | if (!preset->DisplayName.empty()) { |
555 | 0 | int const width = static_cast<int>(longestLength + name.length() - |
556 | 0 | preset->Name.length()); |
557 | 0 | std::cout << std::left << std::setw(width) << name << " - " |
558 | 0 | << preset->DisplayName << '\n'; |
559 | 0 | } else { |
560 | 0 | std::cout << name << '\n'; |
561 | 0 | } |
562 | 0 | if (entry.UnavailableReason) { |
563 | 0 | std::cout << " Unavailable: " << *entry.UnavailableReason << '\n'; |
564 | 0 | if (entryIt + 1 != presets.end()) { |
565 | 0 | std::cout << '\n'; |
566 | 0 | } |
567 | 0 | } |
568 | 0 | } |
569 | 0 | } |
570 | | |
571 | | template <typename PresetType> |
572 | | cm::optional<std::string> GetUnavailableReason( |
573 | | cmCMakePresetsGraph::PresetPair<PresetType> const& preset) |
574 | 0 | { |
575 | 0 | if (preset.Unexpanded.Hidden) { |
576 | 0 | return "hidden"; |
577 | 0 | } |
578 | 0 | if (!preset.Expanded) { |
579 | | // Expansion errors abort preset loading. A missing expanded preset means |
580 | | // expansion was ignored, such as for an unsupported vendor macro. |
581 | 0 | return "unsupported macro expansion"; |
582 | 0 | } |
583 | 0 | if (!preset.Expanded->ConditionResult) { |
584 | 0 | auto const& condition = preset.Expanded->ConditionEvaluator; |
585 | 0 | return cmStrCat("condition evaluated to false", |
586 | 0 | !condition || condition->ConditionJson.empty() |
587 | 0 | ? "" |
588 | 0 | : cmStrCat(": ", condition->ConditionJson)); |
589 | 0 | } |
590 | 0 | return cm::nullopt; |
591 | 0 | } Unexecuted instantiation: cmCMakePresetsGraph.cxx:std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (anonymous namespace)::GetUnavailableReason<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::ConfigurePreset> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (anonymous namespace)::GetUnavailableReason<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (anonymous namespace)::GetUnavailableReason<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (anonymous namespace)::GetUnavailableReason<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset> const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (anonymous namespace)::GetUnavailableReason<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::WorkflowPreset> const&) |
592 | | |
593 | | template <typename PresetType> |
594 | | cm::optional<std::string> GetUnavailableReason( |
595 | | std::string const& name, |
596 | | std::map<std::string, PresetPair<PresetType>> const& presets) |
597 | 0 | { |
598 | 0 | auto const preset = presets.find(name); |
599 | 0 | if (preset == presets.end()) { |
600 | 0 | return cmStrCat(PresetType::kind(), " preset \"", name, |
601 | 0 | "\" does not exist"); |
602 | 0 | } |
603 | 0 | auto reason = GetUnavailableReason(preset->second); |
604 | 0 | if (!reason) { |
605 | 0 | return cm::nullopt; |
606 | 0 | } |
607 | 0 | return cmStrCat(PresetType::kind(), " preset \"", name, "\": ", *reason); |
608 | 0 | } Unexecuted instantiation: cmCMakePresetsGraph.cxx:std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (anonymous namespace)::GetUnavailableReason<cmCMakePresetsGraph::BuildPreset>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset> > > > const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (anonymous namespace)::GetUnavailableReason<cmCMakePresetsGraph::TestPreset>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset> > > > const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (anonymous namespace)::GetUnavailableReason<cmCMakePresetsGraph::PackagePreset>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset> > > > const&) |
609 | | |
610 | | cm::optional<std::string> GetUnavailableReason( |
611 | | std::string const& name, |
612 | | std::map<std::string, PresetPair<ConfigurePreset>> const& presets, |
613 | | cmCMakePresetsGraph::ConfigurePresetUsabilityCheck const& |
614 | | additionalUsabilityCheck) |
615 | 0 | { |
616 | 0 | auto const preset = presets.find(name); |
617 | 0 | if (preset == presets.end()) { |
618 | 0 | return cmStrCat("configure preset \"", name, "\" does not exist"); |
619 | 0 | } |
620 | 0 | auto reason = GetUnavailableReason(preset->second); |
621 | 0 | if (!reason && additionalUsabilityCheck) { |
622 | 0 | assert(preset->second.Expanded); |
623 | 0 | reason = additionalUsabilityCheck(*preset->second.Expanded); |
624 | 0 | } |
625 | 0 | if (!reason) { |
626 | 0 | return cm::nullopt; |
627 | 0 | } |
628 | 0 | return cmStrCat("configure preset \"", name, "\": ", *reason); |
629 | 0 | } |
630 | | |
631 | | template <typename PresetType, typename UsabilityCheck> |
632 | | void PrintPresetList( |
633 | | cmCMakePresetsGraph const* const graph, |
634 | | std::map<std::string, cmCMakePresetsGraph::PresetPair<PresetType>> |
635 | | cmCMakePresetsGraph::*data, |
636 | | std::vector<std::string> cmCMakePresetsGraph::*index, |
637 | | cmCMakePresetsGraph::PresetListMode mode, |
638 | | UsabilityCheck const& additionalUsabilityCheck) |
639 | 0 | { |
640 | 0 | std::vector<PresetListEntry> presets; |
641 | 0 | presets.reserve((graph->*index).size()); |
642 | 0 | for (auto const& name : graph->*index) { |
643 | 0 | auto const& preset = (graph->*data).at(name); |
644 | 0 | if (preset.Unexpanded.Hidden) { |
645 | 0 | continue; |
646 | 0 | } |
647 | 0 | auto reason = GetUnavailableReason(preset); |
648 | 0 | if (!reason) { |
649 | 0 | assert(preset.Expanded); |
650 | 0 | reason = additionalUsabilityCheck(*preset.Expanded); |
651 | 0 | } |
652 | 0 | if (mode == cmCMakePresetsGraph::PresetListMode::Defined || !reason) { |
653 | 0 | presets.push_back({ &preset.Unexpanded, std::move(reason) }); |
654 | 0 | } |
655 | 0 | } |
656 | |
|
657 | 0 | if (!presets.empty()) { |
658 | 0 | std::cout << (gSkipNewLine ? "" : "\n") |
659 | 0 | << (mode == cmCMakePresetsGraph::PresetListMode::Defined |
660 | 0 | ? "Defined " |
661 | 0 | : "Available ") |
662 | 0 | << PresetType::kind() << " presets:\n\n"; |
663 | 0 | gSkipNewLine = false; |
664 | 0 | PrintPresets(presets); |
665 | 0 | } |
666 | 0 | } Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::ConfigurePreset, cmCMakePresetsGraph::PrintConfigurePresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0>(cmCMakePresetsGraph const*, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::ConfigurePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::ConfigurePreset> > > > cmCMakePresetsGraph::*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > cmCMakePresetsGraph::*, cmCMakePresetsGraph::PresetListMode, cmCMakePresetsGraph::PrintConfigurePresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0 const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::BuildPreset, cmCMakePresetsGraph::PrintBuildPresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0>(cmCMakePresetsGraph const*, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset> > > > cmCMakePresetsGraph::*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > cmCMakePresetsGraph::*, cmCMakePresetsGraph::PresetListMode, cmCMakePresetsGraph::PrintBuildPresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0 const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::TestPreset, cmCMakePresetsGraph::PrintTestPresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0>(cmCMakePresetsGraph const*, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset> > > > cmCMakePresetsGraph::*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > cmCMakePresetsGraph::*, cmCMakePresetsGraph::PresetListMode, cmCMakePresetsGraph::PrintTestPresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0 const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::PackagePreset, cmCMakePresetsGraph::PrintPackagePresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0>(cmCMakePresetsGraph const*, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset> > > > cmCMakePresetsGraph::*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > cmCMakePresetsGraph::*, cmCMakePresetsGraph::PresetListMode, cmCMakePresetsGraph::PrintPackagePresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0 const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::PackagePreset, cmCMakePresetsGraph::PrintPackagePresetList(std::__1::function<bool (cmCMakePresetsGraph::PackagePreset const&)> const&, cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0>(cmCMakePresetsGraph const*, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset> > > > cmCMakePresetsGraph::*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > cmCMakePresetsGraph::*, cmCMakePresetsGraph::PresetListMode, cmCMakePresetsGraph::PrintPackagePresetList(std::__1::function<bool (cmCMakePresetsGraph::PackagePreset const&)> const&, cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0 const&) Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::WorkflowPreset, cmCMakePresetsGraph::PrintWorkflowPresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0>(cmCMakePresetsGraph const*, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::WorkflowPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::WorkflowPreset> > > > cmCMakePresetsGraph::*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > cmCMakePresetsGraph::*, cmCMakePresetsGraph::PresetListMode, cmCMakePresetsGraph::PrintWorkflowPresetList(cmCMakePresetsGraph::PresetListMode, std::__1::function<std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (cmCMakePresetsGraph::ConfigurePreset const&)> const&) const::$_0 const&) |
667 | | } |
668 | | |
669 | | template <typename T> |
670 | | bool cmCMakePresetsGraphInternal::ExpandImmediateMacros(T& preset) |
671 | 84.8k | { |
672 | 84.8k | MacroExpanderVector macroExpanders{}; |
673 | 84.8k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); |
674 | 84.8k | cm::optional<T> out = preset; |
675 | 84.8k | bool result = CheckExpandMacros(preset, out, macroExpanders); |
676 | 84.8k | if (out.has_value()) { |
677 | 84.8k | preset = out.value(); |
678 | 84.8k | }; |
679 | 84.8k | return result; |
680 | 84.8k | } bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph::ConfigurePreset&) Line | Count | Source | 671 | 47.7k | { | 672 | 47.7k | MacroExpanderVector macroExpanders{}; | 673 | 47.7k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 47.7k | cm::optional<T> out = preset; | 675 | 47.7k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 47.7k | if (out.has_value()) { | 677 | 47.7k | preset = out.value(); | 678 | 47.7k | }; | 679 | 47.7k | return result; | 680 | 47.7k | } |
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::BuildPreset&) Line | Count | Source | 671 | 11.7k | { | 672 | 11.7k | MacroExpanderVector macroExpanders{}; | 673 | 11.7k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 11.7k | cm::optional<T> out = preset; | 675 | 11.7k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 11.7k | if (out.has_value()) { | 677 | 11.7k | preset = out.value(); | 678 | 11.7k | }; | 679 | 11.7k | return result; | 680 | 11.7k | } |
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::TestPreset&) Line | Count | Source | 671 | 12.9k | { | 672 | 12.9k | MacroExpanderVector macroExpanders{}; | 673 | 12.9k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 12.9k | cm::optional<T> out = preset; | 675 | 12.9k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 12.9k | if (out.has_value()) { | 677 | 12.9k | preset = out.value(); | 678 | 12.9k | }; | 679 | 12.9k | return result; | 680 | 12.9k | } |
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::PackagePreset&) Line | Count | Source | 671 | 10.6k | { | 672 | 10.6k | MacroExpanderVector macroExpanders{}; | 673 | 10.6k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 10.6k | cm::optional<T> out = preset; | 675 | 10.6k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 10.6k | if (out.has_value()) { | 677 | 10.6k | preset = out.value(); | 678 | 10.6k | }; | 679 | 10.6k | return result; | 680 | 10.6k | } |
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph::WorkflowPreset&) Line | Count | Source | 671 | 1.91k | { | 672 | 1.91k | MacroExpanderVector macroExpanders{}; | 673 | 1.91k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 1.91k | cm::optional<T> out = preset; | 675 | 1.91k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 1.91k | if (out.has_value()) { | 677 | 1.91k | preset = out.value(); | 678 | 1.91k | }; | 679 | 1.91k | return result; | 680 | 1.91k | } |
|
681 | | |
682 | | template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros< |
683 | | ConfigurePreset>(ConfigurePreset&); |
684 | | template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<BuildPreset>( |
685 | | BuildPreset&); |
686 | | template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<TestPreset>( |
687 | | TestPreset&); |
688 | | template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros< |
689 | | PackagePreset>(PackagePreset&); |
690 | | template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros< |
691 | | WorkflowPreset>(WorkflowPreset&); |
692 | | |
693 | | ExpandMacroResult cmCMakePresetsGraphInternal::ExpandMacros( |
694 | | std::string& out, MacroExpanderVector const& macroExpanders, int version) |
695 | 229k | { |
696 | 229k | std::string result; |
697 | 229k | std::string macroNamespace; |
698 | 229k | std::string macroName; |
699 | | |
700 | 229k | enum class State |
701 | 229k | { |
702 | 229k | Default, |
703 | 229k | MacroNamespace, |
704 | 229k | MacroName, |
705 | 229k | } state = State::Default; |
706 | | |
707 | 80.7M | for (auto c : out) { |
708 | 80.7M | switch (state) { |
709 | 69.6M | case State::Default: |
710 | 69.6M | if (c == '$') { |
711 | 869k | state = State::MacroNamespace; |
712 | 68.7M | } else { |
713 | 68.7M | result += c; |
714 | 68.7M | } |
715 | 69.6M | break; |
716 | | |
717 | 1.70M | case State::MacroNamespace: |
718 | 1.70M | if (c == '{') { |
719 | 519k | if (IsValidMacroNamespace(macroNamespace)) { |
720 | 517k | state = State::MacroName; |
721 | 517k | } else { |
722 | 1.35k | result += '$'; |
723 | 1.35k | result += macroNamespace; |
724 | 1.35k | result += '{'; |
725 | 1.35k | macroNamespace.clear(); |
726 | 1.35k | state = State::Default; |
727 | 1.35k | } |
728 | 1.18M | } else { |
729 | 1.18M | macroNamespace += c; |
730 | 1.18M | if (!PrefixesValidMacroNamespace(macroNamespace)) { |
731 | 350k | result += '$'; |
732 | 350k | result += macroNamespace; |
733 | 350k | macroNamespace.clear(); |
734 | 350k | state = State::Default; |
735 | 350k | } |
736 | 1.18M | } |
737 | 1.70M | break; |
738 | | |
739 | 9.43M | case State::MacroName: |
740 | 9.43M | if (c == '}') { |
741 | 517k | auto e = ExpandMacro(result, macroNamespace, macroName, |
742 | 517k | macroExpanders, version); |
743 | 517k | if (e != ExpandMacroResult::Ok) { |
744 | 32.6k | return e; |
745 | 32.6k | } |
746 | 484k | macroNamespace.clear(); |
747 | 484k | macroName.clear(); |
748 | 484k | state = State::Default; |
749 | 8.92M | } else { |
750 | 8.92M | macroName += c; |
751 | 8.92M | } |
752 | 9.40M | break; |
753 | 80.7M | } |
754 | 80.7M | } |
755 | | |
756 | 196k | switch (state) { |
757 | 196k | case State::Default: |
758 | 196k | break; |
759 | 261 | case State::MacroNamespace: |
760 | 261 | result += '$'; |
761 | 261 | result += macroNamespace; |
762 | 261 | break; |
763 | 285 | case State::MacroName: |
764 | 285 | return ExpandMacroResult::Error; |
765 | 196k | } |
766 | | |
767 | 196k | out = std::move(result); |
768 | 196k | return ExpandMacroResult::Ok; |
769 | 196k | } |
770 | | |
771 | | ExpandMacroResult cmCMakePresetsGraphInternal::ExpandMacro( |
772 | | std::string& out, std::string const& macroNamespace, |
773 | | std::string const& macroName, MacroExpanderVector const& macroExpanders, |
774 | | int version) |
775 | 517k | { |
776 | 898k | for (auto const& macroExpander : macroExpanders) { |
777 | 898k | auto result = (*macroExpander)(macroNamespace, macroName, out, version); |
778 | 898k | if (result != ExpandMacroResult::Ignore) { |
779 | 512k | return result; |
780 | 512k | } |
781 | 898k | } |
782 | | |
783 | 4.38k | if (macroNamespace == "vendor") { |
784 | 819 | return ExpandMacroResult::Ignore; |
785 | 819 | } |
786 | | |
787 | 3.56k | return ExpandMacroResult::Error; |
788 | 4.38k | } |
789 | | |
790 | | namespace { |
791 | | template <typename T> |
792 | | bool SetupWorkflowConfigurePreset(T const& preset, |
793 | | ConfigurePreset const*& configurePreset, |
794 | | char const*, std::string const&, |
795 | | cmJSONState* state) |
796 | 381 | { |
797 | 381 | if (preset.ConfigurePreset != configurePreset->Name) { |
798 | 3 | cmCMakePresetsErrors::WORKFLOW_STEP_CONFIGURE_PRESET_MISMATCH( |
799 | 3 | preset.kind(), preset.Name, preset.ConfigurePreset, |
800 | 3 | configurePreset->Name, state); |
801 | 3 | return false; |
802 | 3 | } |
803 | 378 | return true; |
804 | 381 | } cmCMakePresetsGraph.cxx:bool (anonymous namespace)::SetupWorkflowConfigurePreset<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::BuildPreset const&, cmCMakePresetsGraph::ConfigurePreset const*&, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cmJSONState*) Line | Count | Source | 796 | 273 | { | 797 | 273 | if (preset.ConfigurePreset != configurePreset->Name) { | 798 | 3 | cmCMakePresetsErrors::WORKFLOW_STEP_CONFIGURE_PRESET_MISMATCH( | 799 | 3 | preset.kind(), preset.Name, preset.ConfigurePreset, | 800 | 3 | configurePreset->Name, state); | 801 | 3 | return false; | 802 | 3 | } | 803 | 270 | return true; | 804 | 273 | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::SetupWorkflowConfigurePreset<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::TestPreset const&, cmCMakePresetsGraph::ConfigurePreset const*&, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cmJSONState*) Line | Count | Source | 796 | 69 | { | 797 | 69 | if (preset.ConfigurePreset != configurePreset->Name) { | 798 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_CONFIGURE_PRESET_MISMATCH( | 799 | 0 | preset.kind(), preset.Name, preset.ConfigurePreset, | 800 | 0 | configurePreset->Name, state); | 801 | 0 | return false; | 802 | 0 | } | 803 | 69 | return true; | 804 | 69 | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::SetupWorkflowConfigurePreset<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::PackagePreset const&, cmCMakePresetsGraph::ConfigurePreset const*&, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cmJSONState*) Line | Count | Source | 796 | 39 | { | 797 | 39 | if (preset.ConfigurePreset != configurePreset->Name) { | 798 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_CONFIGURE_PRESET_MISMATCH( | 799 | 0 | preset.kind(), preset.Name, preset.ConfigurePreset, | 800 | 0 | configurePreset->Name, state); | 801 | 0 | return false; | 802 | 0 | } | 803 | 39 | return true; | 804 | 39 | } |
|
805 | | |
806 | | template <> |
807 | | bool SetupWorkflowConfigurePreset<ConfigurePreset>( |
808 | | ConfigurePreset const& preset, ConfigurePreset const*& configurePreset, |
809 | | char const*, std::string const&, cmJSONState*) |
810 | 420 | { |
811 | 420 | configurePreset = &preset; |
812 | 420 | return true; |
813 | 420 | } |
814 | | |
815 | | template <typename T> |
816 | | bool TryReachPresetFromWorkflow( |
817 | | WorkflowPreset const& origin, |
818 | | std::map<std::string, PresetPair<T>> const& presets, std::string const& name, |
819 | | char const* workflowStepType, ConfigurePreset const*& configurePreset, |
820 | | cmJSONState* state) |
821 | 1.80k | { |
822 | 1.80k | auto it = presets.find(name); |
823 | 1.80k | if (it == presets.end()) { |
824 | 1.00k | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, |
825 | 1.00k | state); |
826 | 1.00k | return false; |
827 | 1.00k | } |
828 | 801 | if (!origin.OriginFile->ReachableFiles.count( |
829 | 801 | it->second.Unexpanded.OriginFile)) { |
830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, |
831 | 0 | name, state); |
832 | 0 | return false; |
833 | 0 | } |
834 | 801 | return SetupWorkflowConfigurePreset<T>( |
835 | 801 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); |
836 | 801 | } cmCMakePresetsGraph.cxx:bool (anonymous namespace)::TryReachPresetFromWorkflow<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph::WorkflowPreset const&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::ConfigurePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::ConfigurePreset> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*) Line | Count | Source | 821 | 1.05k | { | 822 | 1.05k | auto it = presets.find(name); | 823 | 1.05k | if (it == presets.end()) { | 824 | 636 | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, | 825 | 636 | state); | 826 | 636 | return false; | 827 | 636 | } | 828 | 420 | if (!origin.OriginFile->ReachableFiles.count( | 829 | 420 | it->second.Unexpanded.OriginFile)) { | 830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, | 831 | 0 | name, state); | 832 | 0 | return false; | 833 | 0 | } | 834 | 420 | return SetupWorkflowConfigurePreset<T>( | 835 | 420 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); | 836 | 420 | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::TryReachPresetFromWorkflow<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::WorkflowPreset const&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*) Line | Count | Source | 821 | 408 | { | 822 | 408 | auto it = presets.find(name); | 823 | 408 | if (it == presets.end()) { | 824 | 135 | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, | 825 | 135 | state); | 826 | 135 | return false; | 827 | 135 | } | 828 | 273 | if (!origin.OriginFile->ReachableFiles.count( | 829 | 273 | it->second.Unexpanded.OriginFile)) { | 830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, | 831 | 0 | name, state); | 832 | 0 | return false; | 833 | 0 | } | 834 | 273 | return SetupWorkflowConfigurePreset<T>( | 835 | 273 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); | 836 | 273 | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::TryReachPresetFromWorkflow<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::WorkflowPreset const&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*) Line | Count | Source | 821 | 282 | { | 822 | 282 | auto it = presets.find(name); | 823 | 282 | if (it == presets.end()) { | 824 | 213 | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, | 825 | 213 | state); | 826 | 213 | return false; | 827 | 213 | } | 828 | 69 | if (!origin.OriginFile->ReachableFiles.count( | 829 | 69 | it->second.Unexpanded.OriginFile)) { | 830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, | 831 | 0 | name, state); | 832 | 0 | return false; | 833 | 0 | } | 834 | 69 | return SetupWorkflowConfigurePreset<T>( | 835 | 69 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); | 836 | 69 | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::TryReachPresetFromWorkflow<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::WorkflowPreset const&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*) Line | Count | Source | 821 | 63 | { | 822 | 63 | auto it = presets.find(name); | 823 | 63 | if (it == presets.end()) { | 824 | 24 | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, | 825 | 24 | state); | 826 | 24 | return false; | 827 | 24 | } | 828 | 39 | if (!origin.OriginFile->ReachableFiles.count( | 829 | 39 | it->second.Unexpanded.OriginFile)) { | 830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, | 831 | 0 | name, state); | 832 | 0 | return false; | 833 | 0 | } | 834 | 39 | return SetupWorkflowConfigurePreset<T>( | 835 | 39 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); | 836 | 39 | } |
|
837 | | } |
838 | | |
839 | | ExpandMacroResult BaseMacroExpander::operator()( |
840 | | std::string const& macroNamespace, std::string const& macroName, |
841 | | std::string& macroOut, int version) const |
842 | 487k | { |
843 | 487k | if (macroNamespace.empty()) { |
844 | 387k | if (macroName == "sourceDir") { |
845 | 36.3k | macroOut += Graph.SourceDir; |
846 | 36.3k | return ExpandMacroResult::Ok; |
847 | 36.3k | } |
848 | 350k | if (macroName == "sourceParentDir") { |
849 | 54.3k | macroOut += cmSystemTools::GetParentDirectory(Graph.SourceDir); |
850 | 54.3k | return ExpandMacroResult::Ok; |
851 | 54.3k | } |
852 | 296k | if (macroName == "sourceDirName") { |
853 | 18.0k | macroOut += cmSystemTools::GetFilenameName(Graph.SourceDir); |
854 | 18.0k | return ExpandMacroResult::Ok; |
855 | 18.0k | } |
856 | 278k | if (macroName == "dollar") { |
857 | 40.3k | macroOut += '$'; |
858 | 40.3k | return ExpandMacroResult::Ok; |
859 | 40.3k | } |
860 | 237k | if (macroName == "hostSystemName") { |
861 | 7.95k | if (version < 3) { |
862 | 9 | return ExpandMacroResult::Error; |
863 | 9 | } |
864 | 7.94k | macroOut += cmSystemTools::GetSystemName(); |
865 | 7.94k | return ExpandMacroResult::Ok; |
866 | 7.95k | } |
867 | | // Enable fileDir macro expansion for non-preset expanders |
868 | 230k | if (macroName == "fileDir" && File) { |
869 | 41.0k | if (version < 4) { |
870 | 0 | return ExpandMacroResult::Error; |
871 | 0 | } |
872 | 41.0k | macroOut += cmSystemTools::GetParentDirectory(File.value()); |
873 | 41.0k | return ExpandMacroResult::Ok; |
874 | 41.0k | } |
875 | 189k | if (macroName == "pathListSep") { |
876 | 10.4k | if (version < 5) { |
877 | 9 | return ExpandMacroResult::Error; |
878 | 9 | } |
879 | 10.4k | macroOut += cmSystemTools::GetSystemPathlistSeparator(); |
880 | 10.4k | return ExpandMacroResult::Ok; |
881 | 10.4k | } |
882 | 189k | } |
883 | | |
884 | 279k | return ExpandMacroResult::Ignore; |
885 | 487k | } |
886 | | |
887 | | bool cmCMakePresetsGraphInternal::EqualsCondition::Evaluate( |
888 | | MacroExpanderVector const& expanders, int version, |
889 | | cm::optional<bool>& out) const |
890 | 1.98k | { |
891 | 1.98k | std::string lhs = this->Lhs; |
892 | 1.98k | CHECK_EXPAND(out, lhs, expanders, version); |
893 | | |
894 | 1.88k | std::string rhs = this->Rhs; |
895 | 1.88k | CHECK_EXPAND(out, rhs, expanders, version); |
896 | | |
897 | 1.86k | out = (lhs == rhs); |
898 | 1.86k | return true; |
899 | 1.88k | } |
900 | | |
901 | | bool cmCMakePresetsGraphInternal::InListCondition::Evaluate( |
902 | | MacroExpanderVector const& expanders, int version, |
903 | | cm::optional<bool>& out) const |
904 | 3.46k | { |
905 | 3.46k | std::string str = this->String; |
906 | 3.46k | CHECK_EXPAND(out, str, expanders, version); |
907 | | |
908 | 4.08k | for (auto item : this->List) { |
909 | 4.08k | CHECK_EXPAND(out, item, expanders, version); |
910 | 4.08k | if (str == item) { |
911 | 3.13k | out = true; |
912 | 3.13k | return true; |
913 | 3.13k | } |
914 | 4.08k | } |
915 | | |
916 | 288 | out = false; |
917 | 288 | return true; |
918 | 3.42k | } |
919 | | |
920 | | bool cmCMakePresetsGraphInternal::MatchesCondition::Evaluate( |
921 | | MacroExpanderVector const& expanders, int version, |
922 | | cm::optional<bool>& out) const |
923 | 5.09k | { |
924 | 5.09k | std::string str = this->String; |
925 | 5.09k | CHECK_EXPAND(out, str, expanders, version); |
926 | 4.76k | std::string regexStr = this->Regex; |
927 | 4.76k | CHECK_EXPAND(out, regexStr, expanders, version); |
928 | | |
929 | 4.71k | cmsys::RegularExpression regex; |
930 | 4.71k | if (!regex.compile(regexStr)) { |
931 | 342 | return false; |
932 | 342 | } |
933 | | |
934 | 4.37k | out = regex.find(str); |
935 | 4.37k | return true; |
936 | 4.71k | } |
937 | | |
938 | | bool cmCMakePresetsGraphInternal::AnyAllOfCondition::Evaluate( |
939 | | MacroExpanderVector const& expanders, int version, |
940 | | cm::optional<bool>& out) const |
941 | 4.23k | { |
942 | 10.7k | for (auto const& condition : this->Conditions) { |
943 | 10.7k | cm::optional<bool> result; |
944 | 10.7k | if (!condition->Evaluate(expanders, version, result)) { |
945 | 831 | out.reset(); |
946 | 831 | return false; |
947 | 831 | } |
948 | | |
949 | 9.93k | if (!result) { |
950 | 51 | out.reset(); |
951 | 51 | return true; |
952 | 51 | } |
953 | | |
954 | 9.87k | if (result == this->StopValue) { |
955 | 3.13k | out = result; |
956 | 3.13k | return true; |
957 | 3.13k | } |
958 | 9.87k | } |
959 | | |
960 | 216 | out = !this->StopValue; |
961 | 216 | return true; |
962 | 4.23k | } |
963 | | |
964 | | bool cmCMakePresetsGraphInternal::NotCondition::Evaluate( |
965 | | MacroExpanderVector const& expanders, int version, |
966 | | cm::optional<bool>& out) const |
967 | 210 | { |
968 | 210 | out.reset(); |
969 | 210 | if (!this->SubCondition->Evaluate(expanders, version, out)) { |
970 | 0 | out.reset(); |
971 | 0 | return false; |
972 | 0 | } |
973 | 210 | if (out) { |
974 | 210 | *out = !*out; |
975 | 210 | } |
976 | 210 | return true; |
977 | 210 | } |
978 | | |
979 | | bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetInherit( |
980 | | cmCMakePresetsGraph::Preset const& parentPreset) |
981 | 11.5k | { |
982 | 11.5k | auto& preset = *this; |
983 | 11.5k | ConfigurePreset const& parent = |
984 | 11.5k | static_cast<ConfigurePreset const&>(parentPreset); |
985 | 11.5k | InheritString(preset.Generator, parent.Generator); |
986 | 11.5k | InheritString(preset.Architecture, parent.Architecture); |
987 | 11.5k | InheritString(preset.Toolset, parent.Toolset); |
988 | 11.5k | if (!preset.ArchitectureStrategy) { |
989 | 11.5k | preset.ArchitectureStrategy = parent.ArchitectureStrategy; |
990 | 11.5k | } |
991 | 11.5k | if (!preset.ToolsetStrategy) { |
992 | 11.5k | preset.ToolsetStrategy = parent.ToolsetStrategy; |
993 | 11.5k | } |
994 | 11.5k | InheritString(preset.BinaryDir, parent.BinaryDir); |
995 | 11.5k | InheritString(preset.InstallDir, parent.InstallDir); |
996 | 11.5k | InheritString(preset.ToolchainFile, parent.ToolchainFile); |
997 | 11.5k | InheritString(preset.GraphVizFile, parent.GraphVizFile); |
998 | 11.5k | InheritMap(preset.Warnings, parent.Warnings); |
999 | 11.5k | InheritMap(preset.Errors, parent.Errors); |
1000 | 11.5k | InheritOptionalValue(preset.WarnSystemVars, parent.WarnSystemVars); |
1001 | 11.5k | InheritMap(preset.CacheVariables, parent.CacheVariables); |
1002 | 11.5k | InheritOptionalValue(preset.DebugOutput, parent.DebugOutput); |
1003 | 11.5k | InheritOptionalValue(preset.DebugTryCompile, parent.DebugTryCompile); |
1004 | 11.5k | InheritOptionalValue(preset.DebugFind, parent.DebugFind); |
1005 | 11.5k | InheritOptionalValue(preset.TraceMode, parent.TraceMode); |
1006 | 11.5k | InheritOptionalValue(preset.TraceFormat, parent.TraceFormat); |
1007 | 11.5k | InheritVector(preset.TraceSource, parent.TraceSource); |
1008 | 11.5k | InheritString(preset.TraceRedirect, parent.TraceRedirect); |
1009 | | |
1010 | 11.5k | return true; |
1011 | 11.5k | } |
1012 | | |
1013 | | bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetBeforeInherit() |
1014 | 53.1k | { |
1015 | 53.1k | auto& preset = *this; |
1016 | 53.1k | if (preset.Environment.count("") != 0) { |
1017 | 0 | this->ErrorDetail = |
1018 | 0 | "Empty environment variable names are not allowed in configure presets"; |
1019 | 0 | return false; |
1020 | 0 | } |
1021 | | |
1022 | 53.1k | return true; |
1023 | 53.1k | } |
1024 | | |
1025 | | bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetAfterInherit( |
1026 | | int version, cmJSONState* state) |
1027 | 52.3k | { |
1028 | 52.3k | auto& preset = *this; |
1029 | 52.3k | if (!preset.Hidden) { |
1030 | 40.4k | if (version < 3) { |
1031 | 1.92k | if (preset.Generator.empty()) { |
1032 | 204 | cmCMakePresetsErrors::PRESET_MISSING_FIELD(preset.Name, "generator", |
1033 | 204 | state); |
1034 | 204 | return false; |
1035 | 204 | } |
1036 | 1.72k | if (preset.BinaryDir.empty()) { |
1037 | 27 | cmCMakePresetsErrors::PRESET_MISSING_FIELD(preset.Name, "binaryDir", |
1038 | 27 | state); |
1039 | 27 | return false; |
1040 | 27 | } |
1041 | 1.72k | } |
1042 | | |
1043 | 40.1k | for (auto const& w : preset.Warnings) { |
1044 | 0 | auto const ei = preset.Errors.find(w.first); |
1045 | 0 | if (ei != preset.Errors.end()) { |
1046 | 0 | if (w.second == false && ei->second == true) { |
1047 | 0 | cm::string_view const diagnostic = |
1048 | 0 | version < 12 && w.first == cmDiagnostics::CMD_AUTHOR |
1049 | 0 | ? cm::string_view{ "dev" } |
1050 | 0 | : cmCMakePresetsGraphInternal::GetDiagnosticJSONName(w.first); |
1051 | 0 | this->ErrorDetail = cmStrCat("\"errors.", diagnostic, |
1052 | 0 | "\" is enabled while \"warnings.", |
1053 | 0 | diagnostic, "\" is disabled"); |
1054 | 0 | return false; |
1055 | 0 | } |
1056 | 0 | } |
1057 | 0 | } |
1058 | | |
1059 | 40.1k | if (preset.CacheVariables.count("") != 0) { |
1060 | 3 | this->ErrorDetail = "Empty cache variable names are not allowed"; |
1061 | 3 | return false; |
1062 | 3 | } |
1063 | 40.1k | } |
1064 | | |
1065 | 52.0k | return true; |
1066 | 52.3k | } |
1067 | | |
1068 | | bool cmCMakePresetsGraph::BuildPreset::VisitPresetInherit( |
1069 | | cmCMakePresetsGraph::Preset const& parentPreset) |
1070 | 93 | { |
1071 | 93 | auto& preset = *this; |
1072 | 93 | BuildPreset const& parent = static_cast<BuildPreset const&>(parentPreset); |
1073 | | |
1074 | 93 | InheritString(preset.ConfigurePreset, parent.ConfigurePreset); |
1075 | 93 | InheritOptionalValue(preset.InheritConfigureEnvironment, |
1076 | 93 | parent.InheritConfigureEnvironment); |
1077 | 93 | InheritOptionalValue(preset.Jobs, parent.Jobs); |
1078 | 93 | InheritVector(preset.Targets, parent.Targets); |
1079 | 93 | InheritString(preset.Configuration, parent.Configuration); |
1080 | 93 | InheritOptionalValue(preset.CleanFirst, parent.CleanFirst); |
1081 | 93 | InheritOptionalValue(preset.Verbose, parent.Verbose); |
1082 | 93 | InheritVector(preset.NativeToolOptions, parent.NativeToolOptions); |
1083 | 93 | if (!preset.ResolvePackageReferences) { |
1084 | 93 | preset.ResolvePackageReferences = parent.ResolvePackageReferences; |
1085 | 93 | } |
1086 | | |
1087 | 93 | return true; |
1088 | 93 | } |
1089 | | |
1090 | | bool cmCMakePresetsGraph::BuildPreset::VisitPresetAfterInherit( |
1091 | | int /* version */, cmJSONState* /*stat*/) |
1092 | 4.49k | { |
1093 | 4.49k | if (!this->Hidden && this->ConfigurePreset.empty()) { |
1094 | 438 | this->ErrorDetail = "Build presets must either be hidden or have an " |
1095 | 438 | "associated configure preset"; |
1096 | 438 | return false; |
1097 | 438 | } |
1098 | 4.05k | return true; |
1099 | 4.49k | } |
1100 | | |
1101 | | bool cmCMakePresetsGraph::TestPreset::VisitPresetInherit( |
1102 | | cmCMakePresetsGraph::Preset const& parentPreset) |
1103 | 81 | { |
1104 | 81 | auto& preset = *this; |
1105 | 81 | TestPreset const& parent = static_cast<TestPreset const&>(parentPreset); |
1106 | | |
1107 | 81 | InheritString(preset.ConfigurePreset, parent.ConfigurePreset); |
1108 | 81 | InheritOptionalValue(preset.InheritConfigureEnvironment, |
1109 | 81 | parent.InheritConfigureEnvironment); |
1110 | 81 | InheritString(preset.Configuration, parent.Configuration); |
1111 | 81 | InheritVector(preset.OverwriteConfigurationFile, |
1112 | 81 | parent.OverwriteConfigurationFile); |
1113 | | |
1114 | 81 | if (parent.Output) { |
1115 | 0 | if (preset.Output) { |
1116 | 0 | auto& output = preset.Output.value(); |
1117 | 0 | auto const& parentOutput = parent.Output.value(); |
1118 | 0 | InheritOptionalValue(output.ShortProgress, parentOutput.ShortProgress); |
1119 | 0 | InheritOptionalValue(output.Verbosity, parentOutput.Verbosity); |
1120 | 0 | InheritOptionalValue(output.Debug, parentOutput.Debug); |
1121 | 0 | InheritOptionalValue(output.OutputOnFailure, |
1122 | 0 | parentOutput.OutputOnFailure); |
1123 | 0 | InheritOptionalValue(output.Quiet, parentOutput.Quiet); |
1124 | 0 | InheritString(output.OutputLogFile, parentOutput.OutputLogFile); |
1125 | 0 | InheritString(output.OutputJUnitFile, parentOutput.OutputJUnitFile); |
1126 | 0 | InheritOptionalValue(output.LabelSummary, parentOutput.LabelSummary); |
1127 | 0 | InheritOptionalValue(output.SubprojectSummary, |
1128 | 0 | parentOutput.SubprojectSummary); |
1129 | 0 | InheritOptionalValue(output.MaxPassedTestOutputSize, |
1130 | 0 | parentOutput.MaxPassedTestOutputSize); |
1131 | 0 | InheritOptionalValue(output.MaxFailedTestOutputSize, |
1132 | 0 | parentOutput.MaxFailedTestOutputSize); |
1133 | 0 | InheritOptionalValue(output.TestOutputTruncation, |
1134 | 0 | parentOutput.TestOutputTruncation); |
1135 | 0 | InheritOptionalValue(output.MaxTestNameWidth, |
1136 | 0 | parentOutput.MaxTestNameWidth); |
1137 | 0 | } else { |
1138 | 0 | preset.Output = parent.Output; |
1139 | 0 | } |
1140 | 0 | } |
1141 | | |
1142 | 81 | if (parent.Filter) { |
1143 | 0 | if (parent.Filter->Include) { |
1144 | 0 | if (preset.Filter && preset.Filter->Include) { |
1145 | 0 | auto& include = *preset.Filter->Include; |
1146 | 0 | auto const& parentInclude = *parent.Filter->Include; |
1147 | 0 | InheritString(include.Name, parentInclude.Name); |
1148 | 0 | InheritString(include.Label, parentInclude.Label); |
1149 | 0 | InheritOptionalValue(include.Index, parentInclude.Index); |
1150 | 0 | } else { |
1151 | 0 | if (!preset.Filter) { |
1152 | 0 | preset.Filter.emplace(); |
1153 | 0 | } |
1154 | 0 | preset.Filter->Include = parent.Filter->Include; |
1155 | 0 | } |
1156 | 0 | } |
1157 | |
|
1158 | 0 | if (parent.Filter->Exclude) { |
1159 | 0 | if (preset.Filter && preset.Filter->Exclude) { |
1160 | 0 | auto& exclude = *preset.Filter->Exclude; |
1161 | 0 | auto const& parentExclude = *parent.Filter->Exclude; |
1162 | 0 | InheritString(exclude.Name, parentExclude.Name); |
1163 | 0 | InheritString(exclude.Label, parentExclude.Label); |
1164 | 0 | InheritOptionalValue(exclude.Fixtures, parentExclude.Fixtures); |
1165 | 0 | } else { |
1166 | 0 | if (!preset.Filter) { |
1167 | 0 | preset.Filter.emplace(); |
1168 | 0 | } |
1169 | 0 | preset.Filter->Exclude = parent.Filter->Exclude; |
1170 | 0 | } |
1171 | 0 | } |
1172 | 0 | } |
1173 | | |
1174 | 81 | if (parent.Execution) { |
1175 | 0 | if (preset.Execution) { |
1176 | 0 | auto& execution = *preset.Execution; |
1177 | 0 | auto const& parentExecution = *parent.Execution; |
1178 | 0 | InheritOptionalValue(execution.StopOnFailure, |
1179 | 0 | parentExecution.StopOnFailure); |
1180 | 0 | InheritOptionalValue(execution.EnableFailover, |
1181 | 0 | parentExecution.EnableFailover); |
1182 | 0 | InheritOptionalValue(execution.Jobs, parentExecution.Jobs); |
1183 | 0 | InheritString(execution.ResourceSpecFile, |
1184 | 0 | parentExecution.ResourceSpecFile); |
1185 | 0 | InheritOptionalValue(execution.TestLoad, parentExecution.TestLoad); |
1186 | 0 | InheritOptionalValue(execution.ShowOnly, parentExecution.ShowOnly); |
1187 | 0 | InheritOptionalValue(execution.Repeat, parentExecution.Repeat); |
1188 | 0 | InheritOptionalValue(execution.InteractiveDebugging, |
1189 | 0 | parentExecution.InteractiveDebugging); |
1190 | 0 | InheritOptionalValue(execution.ScheduleRandom, |
1191 | 0 | parentExecution.ScheduleRandom); |
1192 | 0 | InheritOptionalValue(execution.Timeout, parentExecution.Timeout); |
1193 | 0 | InheritOptionalValue(execution.NoTestsAction, |
1194 | 0 | parentExecution.NoTestsAction); |
1195 | 0 | InheritVector(execution.TestPassthroughArguments, |
1196 | 0 | parentExecution.TestPassthroughArguments); |
1197 | 0 | } else { |
1198 | 0 | preset.Execution = parent.Execution; |
1199 | 0 | } |
1200 | 0 | } |
1201 | | |
1202 | 81 | return true; |
1203 | 81 | } |
1204 | | |
1205 | | bool cmCMakePresetsGraph::TestPreset::VisitPresetAfterInherit( |
1206 | | int /* version */, cmJSONState* /*state*/) |
1207 | 3.37k | { |
1208 | 3.37k | if (!this->Hidden && this->ConfigurePreset.empty()) { |
1209 | 444 | this->ErrorDetail = "Test presets must either be hidden or have an " |
1210 | 444 | "associated configure preset"; |
1211 | 444 | return false; |
1212 | 444 | } |
1213 | 2.93k | return true; |
1214 | 3.37k | } |
1215 | | |
1216 | | bool cmCMakePresetsGraph::PackagePreset::VisitPresetInherit( |
1217 | | cmCMakePresetsGraph::Preset const& parentPreset) |
1218 | 0 | { |
1219 | 0 | auto& preset = *this; |
1220 | 0 | PackagePreset const& parent = |
1221 | 0 | static_cast<PackagePreset const&>(parentPreset); |
1222 | |
|
1223 | 0 | InheritString(preset.ConfigurePreset, parent.ConfigurePreset); |
1224 | 0 | InheritOptionalValue(preset.InheritConfigureEnvironment, |
1225 | 0 | parent.InheritConfigureEnvironment); |
1226 | 0 | InheritVector(preset.Generators, parent.Generators); |
1227 | 0 | InheritVector(preset.Configurations, parent.Configurations); |
1228 | 0 | InheritMap(preset.Variables, parent.Variables); |
1229 | 0 | InheritOptionalValue(preset.DebugOutput, parent.DebugOutput); |
1230 | 0 | InheritOptionalValue(preset.VerboseOutput, parent.VerboseOutput); |
1231 | 0 | InheritString(preset.PackageName, parent.PackageName); |
1232 | 0 | InheritString(preset.PackageVersion, parent.PackageVersion); |
1233 | 0 | InheritString(preset.PackageDirectory, parent.PackageDirectory); |
1234 | 0 | InheritString(preset.VendorName, parent.VendorName); |
1235 | |
|
1236 | 0 | return true; |
1237 | 0 | } |
1238 | | |
1239 | | bool cmCMakePresetsGraph::PackagePreset::VisitPresetAfterInherit( |
1240 | | int /* version */, cmJSONState* /*state*/) |
1241 | 2.21k | { |
1242 | 2.21k | if (!this->Hidden && this->ConfigurePreset.empty()) { |
1243 | 492 | this->ErrorDetail = "Package presets must either be hidden or have an " |
1244 | 492 | "associated configure preset"; |
1245 | 492 | return false; |
1246 | 492 | } |
1247 | 1.72k | return true; |
1248 | 2.21k | } |
1249 | | |
1250 | | bool cmCMakePresetsGraph::WorkflowPreset::VisitPresetInherit( |
1251 | | cmCMakePresetsGraph::Preset const& /*parentPreset*/) |
1252 | 0 | { |
1253 | 0 | return true; |
1254 | 0 | } |
1255 | | |
1256 | | bool cmCMakePresetsGraph::WorkflowPreset::VisitPresetAfterInherit( |
1257 | | int /* version */, cmJSONState* /*state*/) |
1258 | 1.74k | { |
1259 | 1.74k | return true; |
1260 | 1.74k | } |
1261 | | |
1262 | | std::string cmCMakePresetsGraph::GetFilename(std::string const& sourceDir) |
1263 | 16.4k | { |
1264 | 16.4k | return cmStrCat(sourceDir, "/CMakePresets.json"); |
1265 | 16.4k | } |
1266 | | |
1267 | | std::string cmCMakePresetsGraph::GetUserFilename(std::string const& sourceDir) |
1268 | 22.5k | { |
1269 | 22.5k | return cmStrCat(sourceDir, "/CMakeUserPresets.json"); |
1270 | 22.5k | } |
1271 | | |
1272 | | bool cmCMakePresetsGraph::ReadProjectPresets(std::string const& sourceDir, |
1273 | | std::string const& presetsFile, |
1274 | | ReadOption readFilesOption) |
1275 | 33.7k | { |
1276 | 33.7k | this->SourceDir = cmSystemTools::CollapseFullPath(sourceDir); |
1277 | 33.7k | this->ClearPresets(); |
1278 | | |
1279 | 33.7k | if (!this->ReadProjectPresetsInternal(presetsFile, readFilesOption)) { |
1280 | 27.0k | this->ClearPresets(); |
1281 | 27.0k | return false; |
1282 | 27.0k | } |
1283 | | |
1284 | 6.74k | return true; |
1285 | 33.7k | } |
1286 | | |
1287 | | std::string cmCMakePresetsGraph::GetGeneratorForPreset( |
1288 | | std::string const& presetName) const |
1289 | 83.6k | { |
1290 | 83.6k | auto configurePresetName = presetName; |
1291 | | |
1292 | 83.6k | auto buildPresetIterator = this->BuildPresets.find(presetName); |
1293 | 83.6k | if (buildPresetIterator != this->BuildPresets.end()) { |
1294 | 14.3k | configurePresetName = |
1295 | 14.3k | buildPresetIterator->second.Unexpanded.ConfigurePreset; |
1296 | 69.3k | } else { |
1297 | 69.3k | auto testPresetIterator = this->TestPresets.find(presetName); |
1298 | 69.3k | if (testPresetIterator != this->TestPresets.end()) { |
1299 | 7.95k | configurePresetName = |
1300 | 7.95k | testPresetIterator->second.Unexpanded.ConfigurePreset; |
1301 | 7.95k | } |
1302 | 69.3k | } |
1303 | | |
1304 | 83.6k | auto configurePresetIterator = |
1305 | 83.6k | this->ConfigurePresets.find(configurePresetName); |
1306 | 83.6k | if (configurePresetIterator != this->ConfigurePresets.end()) { |
1307 | 76.1k | return configurePresetIterator->second.Unexpanded.Generator; |
1308 | 76.1k | } |
1309 | | |
1310 | | // This should only happen if the preset is hidden |
1311 | | // or (for build or test presets) if ConfigurePreset is invalid. |
1312 | 7.52k | return {}; |
1313 | 83.6k | } |
1314 | | |
1315 | | template <typename T> |
1316 | | bool cmCMakePresetsGraph::ResolveDependentPresets( |
1317 | | std::map<std::string, PresetPair<T>>& presets) |
1318 | 24.5k | { |
1319 | 24.5k | for (auto& it : presets) { |
1320 | 4.37k | if (!it.second.Unexpanded.Hidden) { |
1321 | 4.37k | auto const configurePreset = |
1322 | 4.37k | this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset); |
1323 | 4.37k | if (configurePreset == this->ConfigurePresets.end()) { |
1324 | 492 | cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND( |
1325 | 492 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, |
1326 | 492 | &this->parseState); |
1327 | 492 | return false; |
1328 | 492 | } |
1329 | 3.88k | if (!it.second.Unexpanded.OriginFile->ReachableFiles.count( |
1330 | 3.88k | configurePreset->second.Unexpanded.OriginFile)) { |
1331 | 0 | cmCMakePresetsErrors::CONFIGURE_PRESET_UNREACHABLE_FROM_FILE( |
1332 | 0 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, |
1333 | 0 | &this->parseState); |
1334 | 0 | return false; |
1335 | 0 | } |
1336 | 3.88k | if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) { |
1337 | 3.88k | it.second.Unexpanded.Environment.insert( |
1338 | 3.88k | configurePreset->second.Unexpanded.Environment.begin(), |
1339 | 3.88k | configurePreset->second.Unexpanded.Environment.end()); |
1340 | 3.88k | } |
1341 | 3.88k | } |
1342 | 3.88k | if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) { |
1343 | 447 | cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first, |
1344 | 447 | &this->parseState); |
1345 | 447 | return false; |
1346 | 447 | } |
1347 | 3.88k | } |
1348 | 23.6k | return true; |
1349 | 24.5k | } bool cmCMakePresetsGraph::ResolveDependentPresets<cmCMakePresetsGraph::BuildPreset>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::BuildPreset> > > >&) Line | Count | Source | 1318 | 8.75k | { | 1319 | 8.75k | for (auto& it : presets) { | 1320 | 2.16k | if (!it.second.Unexpanded.Hidden) { | 1321 | 2.16k | auto const configurePreset = | 1322 | 2.16k | this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset); | 1323 | 2.16k | if (configurePreset == this->ConfigurePresets.end()) { | 1324 | 360 | cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND( | 1325 | 360 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, | 1326 | 360 | &this->parseState); | 1327 | 360 | return false; | 1328 | 360 | } | 1329 | 1.80k | if (!it.second.Unexpanded.OriginFile->ReachableFiles.count( | 1330 | 1.80k | configurePreset->second.Unexpanded.OriginFile)) { | 1331 | 0 | cmCMakePresetsErrors::CONFIGURE_PRESET_UNREACHABLE_FROM_FILE( | 1332 | 0 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, | 1333 | 0 | &this->parseState); | 1334 | 0 | return false; | 1335 | 0 | } | 1336 | 1.80k | if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) { | 1337 | 1.80k | it.second.Unexpanded.Environment.insert( | 1338 | 1.80k | configurePreset->second.Unexpanded.Environment.begin(), | 1339 | 1.80k | configurePreset->second.Unexpanded.Environment.end()); | 1340 | 1.80k | } | 1341 | 1.80k | } | 1342 | 1.80k | if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) { | 1343 | 447 | cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first, | 1344 | 447 | &this->parseState); | 1345 | 447 | return false; | 1346 | 447 | } | 1347 | 1.80k | } | 1348 | 7.94k | return true; | 1349 | 8.75k | } |
bool cmCMakePresetsGraph::ResolveDependentPresets<cmCMakePresetsGraph::TestPreset>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::TestPreset> > > >&) Line | Count | Source | 1318 | 7.94k | { | 1319 | 7.94k | for (auto& it : presets) { | 1320 | 1.21k | if (!it.second.Unexpanded.Hidden) { | 1321 | 1.21k | auto const configurePreset = | 1322 | 1.21k | this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset); | 1323 | 1.21k | if (configurePreset == this->ConfigurePresets.end()) { | 1324 | 108 | cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND( | 1325 | 108 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, | 1326 | 108 | &this->parseState); | 1327 | 108 | return false; | 1328 | 108 | } | 1329 | 1.10k | if (!it.second.Unexpanded.OriginFile->ReachableFiles.count( | 1330 | 1.10k | configurePreset->second.Unexpanded.OriginFile)) { | 1331 | 0 | cmCMakePresetsErrors::CONFIGURE_PRESET_UNREACHABLE_FROM_FILE( | 1332 | 0 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, | 1333 | 0 | &this->parseState); | 1334 | 0 | return false; | 1335 | 0 | } | 1336 | 1.10k | if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) { | 1337 | 1.10k | it.second.Unexpanded.Environment.insert( | 1338 | 1.10k | configurePreset->second.Unexpanded.Environment.begin(), | 1339 | 1.10k | configurePreset->second.Unexpanded.Environment.end()); | 1340 | 1.10k | } | 1341 | 1.10k | } | 1342 | 1.10k | if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) { | 1343 | 0 | cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first, | 1344 | 0 | &this->parseState); | 1345 | 0 | return false; | 1346 | 0 | } | 1347 | 1.10k | } | 1348 | 7.83k | return true; | 1349 | 7.94k | } |
bool cmCMakePresetsGraph::ResolveDependentPresets<cmCMakePresetsGraph::PackagePreset>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, cmCMakePresetsGraph::PresetPair<cmCMakePresetsGraph::PackagePreset> > > >&) Line | Count | Source | 1318 | 7.83k | { | 1319 | 7.83k | for (auto& it : presets) { | 1320 | 999 | if (!it.second.Unexpanded.Hidden) { | 1321 | 999 | auto const configurePreset = | 1322 | 999 | this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset); | 1323 | 999 | if (configurePreset == this->ConfigurePresets.end()) { | 1324 | 24 | cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND( | 1325 | 24 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, | 1326 | 24 | &this->parseState); | 1327 | 24 | return false; | 1328 | 24 | } | 1329 | 975 | if (!it.second.Unexpanded.OriginFile->ReachableFiles.count( | 1330 | 975 | configurePreset->second.Unexpanded.OriginFile)) { | 1331 | 0 | cmCMakePresetsErrors::CONFIGURE_PRESET_UNREACHABLE_FROM_FILE( | 1332 | 0 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, | 1333 | 0 | &this->parseState); | 1334 | 0 | return false; | 1335 | 0 | } | 1336 | 975 | if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) { | 1337 | 975 | it.second.Unexpanded.Environment.insert( | 1338 | 975 | configurePreset->second.Unexpanded.Environment.begin(), | 1339 | 975 | configurePreset->second.Unexpanded.Environment.end()); | 1340 | 975 | } | 1341 | 975 | } | 1342 | 975 | if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) { | 1343 | 0 | cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first, | 1344 | 0 | &this->parseState); | 1345 | 0 | return false; | 1346 | 0 | } | 1347 | 975 | } | 1348 | 7.81k | return true; | 1349 | 7.83k | } |
|
1350 | | |
1351 | | template bool |
1352 | | cmCMakePresetsGraph::ResolveDependentPresets<cmCMakePresetsGraph::BuildPreset>( |
1353 | | std::map<std::string, PresetPair<cmCMakePresetsGraph::BuildPreset>>&); |
1354 | | |
1355 | | template bool |
1356 | | cmCMakePresetsGraph::ResolveDependentPresets<cmCMakePresetsGraph::TestPreset>( |
1357 | | std::map<std::string, PresetPair<cmCMakePresetsGraph::TestPreset>>&); |
1358 | | |
1359 | | template bool cmCMakePresetsGraph::ResolveDependentPresets< |
1360 | | cmCMakePresetsGraph::PackagePreset>( |
1361 | | std::map<std::string, PresetPair<cmCMakePresetsGraph::PackagePreset>>&); |
1362 | | |
1363 | | bool cmCMakePresetsGraph::ReadProjectPresetsInternal( |
1364 | | std::string const& presetsFile, ReadOption readFilesOption) |
1365 | 33.7k | { |
1366 | 33.7k | bool haveOneFile = false; |
1367 | | |
1368 | 33.7k | File* file; |
1369 | 33.7k | std::string filename; |
1370 | 33.7k | std::vector<File*> inProgressFiles; |
1371 | 33.7k | if (!presetsFile.empty()) { |
1372 | 11.2k | filename = presetsFile; |
1373 | 11.2k | if (cmSystemTools::FileExists(filename)) { |
1374 | 11.2k | if (!this->ReadJSONFile(filename, RootType::Any, ReadReason::Root, |
1375 | 11.2k | inProgressFiles, file, this->errors)) { |
1376 | 6.06k | return false; |
1377 | 6.06k | } |
1378 | 5.18k | haveOneFile = true; |
1379 | 5.18k | } |
1380 | 22.5k | } else { |
1381 | 22.5k | filename = GetUserFilename(this->SourceDir); |
1382 | 22.5k | if (cmSystemTools::FileExists(filename)) { |
1383 | 11.2k | if (!this->ReadJSONFile(filename, RootType::User, ReadReason::Root, |
1384 | 11.2k | inProgressFiles, file, this->errors)) { |
1385 | 6.06k | return false; |
1386 | 6.06k | } |
1387 | 5.18k | haveOneFile = true; |
1388 | 11.2k | } else { |
1389 | 11.2k | filename = GetFilename(this->SourceDir); |
1390 | 11.2k | if (cmSystemTools::FileExists(filename)) { |
1391 | 11.2k | if (!this->ReadJSONFile(filename, RootType::Project, ReadReason::Root, |
1392 | 11.2k | inProgressFiles, file, this->errors)) { |
1393 | 6.06k | return false; |
1394 | 6.06k | } |
1395 | 5.18k | haveOneFile = true; |
1396 | 5.18k | } |
1397 | 11.2k | } |
1398 | 22.5k | } |
1399 | 33.7k | assert(inProgressFiles.empty()); |
1400 | | |
1401 | 15.5k | if (!haveOneFile) { |
1402 | 0 | if (readFilesOption == ReadOption::AllowNoFiles) { |
1403 | 0 | return true; |
1404 | 0 | } |
1405 | 0 | cmCMakePresetsErrors::FILE_NOT_FOUND(filename, &this->parseState); |
1406 | 0 | return false; |
1407 | 0 | } |
1408 | | |
1409 | 15.5k | bool result = ComputePresetInheritance(this->ConfigurePresets, *this) && |
1410 | 14.5k | ComputePresetInheritance(this->BuildPresets, *this) && |
1411 | 13.6k | ComputePresetInheritance(this->TestPresets, *this) && |
1412 | 12.8k | ComputePresetInheritance(this->PackagePresets, *this) && |
1413 | 12.2k | ComputePresetInheritance(this->WorkflowPresets, *this); |
1414 | 15.5k | if (!result) { |
1415 | 3.31k | return false; |
1416 | 3.31k | } |
1417 | | |
1418 | 33.6k | for (auto& it : this->ConfigurePresets) { |
1419 | 33.6k | if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) { |
1420 | 3.48k | cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first, |
1421 | 3.48k | &this->parseState); |
1422 | 3.48k | return false; |
1423 | 3.48k | } |
1424 | 33.6k | } |
1425 | | |
1426 | 8.75k | if (!ResolveDependentPresets(this->BuildPresets) || |
1427 | 7.94k | !ResolveDependentPresets(this->TestPresets) || |
1428 | 7.83k | !ResolveDependentPresets(this->PackagePresets)) { |
1429 | 939 | return false; |
1430 | 939 | } |
1431 | | |
1432 | 7.81k | for (auto& it : this->WorkflowPresets) { |
1433 | 1.11k | using Type = WorkflowPreset::WorkflowStep::Type; |
1434 | | |
1435 | 1.11k | ConfigurePreset const* configurePreset = nullptr; |
1436 | 1.86k | for (auto const& step : it.second.Unexpanded.Steps) { |
1437 | 1.86k | char const* const stepType = WorkflowStepTypeToString(step.PresetType); |
1438 | 1.86k | if (!configurePreset && step.PresetType != Type::Configure) { |
1439 | 48 | cmCMakePresetsErrors::FIRST_WORKFLOW_STEP_NOT_CONFIGURE( |
1440 | 48 | stepType, step.PresetName, &this->parseState); |
1441 | 48 | return false; |
1442 | 48 | } |
1443 | 1.81k | if (configurePreset && step.PresetType == Type::Configure) { |
1444 | 6 | cmCMakePresetsErrors::CONFIGURE_WORKFLOW_STEP_NOT_FIRST( |
1445 | 6 | stepType, step.PresetName, &this->parseState); |
1446 | 6 | return false; |
1447 | 6 | } |
1448 | | |
1449 | 1.80k | switch (step.PresetType) { |
1450 | 1.05k | case Type::Configure: |
1451 | 1.05k | result = TryReachPresetFromWorkflow( |
1452 | 1.05k | it.second.Unexpanded, this->ConfigurePresets, step.PresetName, |
1453 | 1.05k | stepType, configurePreset, &this->parseState); |
1454 | 1.05k | break; |
1455 | 408 | case Type::Build: |
1456 | 408 | result = TryReachPresetFromWorkflow( |
1457 | 408 | it.second.Unexpanded, this->BuildPresets, step.PresetName, |
1458 | 408 | stepType, configurePreset, &this->parseState); |
1459 | 408 | break; |
1460 | 282 | case Type::Test: |
1461 | 282 | result = TryReachPresetFromWorkflow( |
1462 | 282 | it.second.Unexpanded, this->TestPresets, step.PresetName, stepType, |
1463 | 282 | configurePreset, &this->parseState); |
1464 | 282 | break; |
1465 | 63 | case Type::Package: |
1466 | 63 | result = TryReachPresetFromWorkflow( |
1467 | 63 | it.second.Unexpanded, this->PackagePresets, step.PresetName, |
1468 | 63 | stepType, configurePreset, &this->parseState); |
1469 | 63 | break; |
1470 | 1.80k | } |
1471 | 1.80k | if (!result) { |
1472 | 1.01k | return false; |
1473 | 1.01k | } |
1474 | 1.80k | } |
1475 | | |
1476 | 48 | if (!configurePreset) { |
1477 | 9 | cmCMakePresetsErrors::NO_WORKFLOW_STEPS(it.first, &this->parseState); |
1478 | 9 | return false; |
1479 | 9 | } |
1480 | | |
1481 | 39 | if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) { |
1482 | 0 | cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first, |
1483 | 0 | &this->parseState); |
1484 | 0 | return false; |
1485 | 0 | } |
1486 | 39 | } |
1487 | | |
1488 | 6.74k | return true; |
1489 | 7.81k | } |
1490 | | |
1491 | | void cmCMakePresetsGraph::ClearPresets() |
1492 | 60.7k | { |
1493 | 60.7k | this->ConfigurePresets.clear(); |
1494 | 60.7k | this->BuildPresets.clear(); |
1495 | 60.7k | this->TestPresets.clear(); |
1496 | 60.7k | this->PackagePresets.clear(); |
1497 | 60.7k | this->WorkflowPresets.clear(); |
1498 | | |
1499 | 60.7k | this->ConfigurePresetOrder.clear(); |
1500 | 60.7k | this->BuildPresetOrder.clear(); |
1501 | 60.7k | this->TestPresetOrder.clear(); |
1502 | 60.7k | this->PackagePresetOrder.clear(); |
1503 | 60.7k | this->WorkflowPresetOrder.clear(); |
1504 | | |
1505 | 60.7k | this->Files.clear(); |
1506 | 60.7k | } |
1507 | | |
1508 | | void cmCMakePresetsGraph::PrintConfigurePresetList( |
1509 | | PresetListMode mode, |
1510 | | ConfigurePresetUsabilityCheck const& usabilityCheck) const |
1511 | 0 | { |
1512 | 0 | auto check = [&usabilityCheck]( |
1513 | 0 | ConfigurePreset const& preset) -> cm::optional<std::string> { |
1514 | 0 | if (!usabilityCheck) { |
1515 | 0 | return cm::nullopt; |
1516 | 0 | } |
1517 | 0 | return usabilityCheck(preset); |
1518 | 0 | }; |
1519 | 0 | PrintPresetList<ConfigurePreset>( |
1520 | 0 | this, &cmCMakePresetsGraph::ConfigurePresets, |
1521 | 0 | &cmCMakePresetsGraph::ConfigurePresetOrder, mode, check); |
1522 | 0 | } |
1523 | | |
1524 | | void cmCMakePresetsGraph::PrintBuildPresetList( |
1525 | | PresetListMode mode, |
1526 | | ConfigurePresetUsabilityCheck const& configureUsabilityCheck) const |
1527 | 0 | { |
1528 | 0 | auto usabilityCheck = [this, |
1529 | 0 | &configureUsabilityCheck](BuildPreset const& preset) { |
1530 | 0 | return GetUnavailableReason(preset.ConfigurePreset, this->ConfigurePresets, |
1531 | 0 | configureUsabilityCheck); |
1532 | 0 | }; |
1533 | 0 | PrintPresetList<BuildPreset>(this, &cmCMakePresetsGraph::BuildPresets, |
1534 | 0 | &cmCMakePresetsGraph::BuildPresetOrder, mode, |
1535 | 0 | usabilityCheck); |
1536 | 0 | } |
1537 | | |
1538 | | void cmCMakePresetsGraph::PrintTestPresetList( |
1539 | | PresetListMode mode, |
1540 | | ConfigurePresetUsabilityCheck const& configureUsabilityCheck) const |
1541 | 0 | { |
1542 | 0 | auto usabilityCheck = [this, |
1543 | 0 | &configureUsabilityCheck](TestPreset const& preset) { |
1544 | 0 | return GetUnavailableReason(preset.ConfigurePreset, this->ConfigurePresets, |
1545 | 0 | configureUsabilityCheck); |
1546 | 0 | }; |
1547 | 0 | PrintPresetList<TestPreset>(this, &cmCMakePresetsGraph::TestPresets, |
1548 | 0 | &cmCMakePresetsGraph::TestPresetOrder, mode, |
1549 | 0 | usabilityCheck); |
1550 | 0 | } |
1551 | | |
1552 | | void cmCMakePresetsGraph::PrintPackagePresetList( |
1553 | | PresetListMode mode, |
1554 | | ConfigurePresetUsabilityCheck const& configureUsabilityCheck) const |
1555 | 0 | { |
1556 | 0 | auto usabilityCheck = [this, &configureUsabilityCheck]( |
1557 | 0 | PackagePreset const& preset) { |
1558 | 0 | return GetUnavailableReason(preset.ConfigurePreset, this->ConfigurePresets, |
1559 | 0 | configureUsabilityCheck); |
1560 | 0 | }; |
1561 | 0 | PrintPresetList<PackagePreset>(this, &cmCMakePresetsGraph::PackagePresets, |
1562 | 0 | &cmCMakePresetsGraph::PackagePresetOrder, |
1563 | 0 | mode, usabilityCheck); |
1564 | 0 | } |
1565 | | |
1566 | | void cmCMakePresetsGraph::PrintPackagePresetList( |
1567 | | std::function<bool(PackagePreset const&)> const& packageGeneratorsPresent, |
1568 | | PresetListMode mode, |
1569 | | ConfigurePresetUsabilityCheck const& configureUsabilityCheck) const |
1570 | 0 | { |
1571 | 0 | auto usabilityCheck = [this, &packageGeneratorsPresent, |
1572 | 0 | &configureUsabilityCheck]( |
1573 | 0 | PackagePreset const& preset) { |
1574 | 0 | auto configureReason = GetUnavailableReason( |
1575 | 0 | preset.ConfigurePreset, this->ConfigurePresets, configureUsabilityCheck); |
1576 | 0 | if (configureReason) { |
1577 | 0 | return configureReason; |
1578 | 0 | } |
1579 | 0 | cm::optional<std::string> generatorReason; |
1580 | 0 | if (!packageGeneratorsPresent(preset)) { |
1581 | 0 | generatorReason = "one or more package generators are not available"; |
1582 | 0 | } |
1583 | 0 | return generatorReason; |
1584 | 0 | }; |
1585 | 0 | PrintPresetList<PackagePreset>(this, &cmCMakePresetsGraph::PackagePresets, |
1586 | 0 | &cmCMakePresetsGraph::PackagePresetOrder, |
1587 | 0 | mode, usabilityCheck); |
1588 | 0 | } |
1589 | | |
1590 | | void cmCMakePresetsGraph::PrintWorkflowPresetList( |
1591 | | PresetListMode mode, |
1592 | | ConfigurePresetUsabilityCheck const& configureUsabilityCheck) const |
1593 | 0 | { |
1594 | 0 | auto usabilityCheck = [this, &configureUsabilityCheck]( |
1595 | 0 | WorkflowPreset const& preset) { |
1596 | 0 | return this->GetWorkflowUnavailableReason(preset, configureUsabilityCheck); |
1597 | 0 | }; |
1598 | 0 | PrintPresetList<WorkflowPreset>(this, &cmCMakePresetsGraph::WorkflowPresets, |
1599 | 0 | &cmCMakePresetsGraph::WorkflowPresetOrder, |
1600 | 0 | mode, usabilityCheck); |
1601 | 0 | } |
1602 | | |
1603 | | cm::optional<std::string> cmCMakePresetsGraph::GetWorkflowUnavailableReason( |
1604 | | WorkflowPreset const& preset, |
1605 | | ConfigurePresetUsabilityCheck const& configureUsabilityCheck) const |
1606 | 0 | { |
1607 | 0 | using Type = WorkflowPreset::WorkflowStep::Type; |
1608 | |
|
1609 | 0 | std::size_t stepNumber = 0; |
1610 | 0 | for (auto const& step : preset.Steps) { |
1611 | 0 | ++stepNumber; |
1612 | 0 | cm::optional<std::string> reason; |
1613 | 0 | switch (step.PresetType) { |
1614 | 0 | case Type::Configure: |
1615 | 0 | reason = GetUnavailableReason(step.PresetName, this->ConfigurePresets, |
1616 | 0 | configureUsabilityCheck); |
1617 | 0 | break; |
1618 | 0 | case Type::Build: |
1619 | 0 | reason = GetUnavailableReason(step.PresetName, this->BuildPresets); |
1620 | 0 | break; |
1621 | 0 | case Type::Test: |
1622 | 0 | reason = GetUnavailableReason(step.PresetName, this->TestPresets); |
1623 | 0 | break; |
1624 | 0 | case Type::Package: |
1625 | 0 | reason = GetUnavailableReason(step.PresetName, this->PackagePresets); |
1626 | 0 | break; |
1627 | 0 | } |
1628 | 0 | if (reason) { |
1629 | 0 | return cmStrCat("step ", stepNumber, ": ", *reason); |
1630 | 0 | } |
1631 | 0 | } |
1632 | 0 | return cm::nullopt; |
1633 | 0 | } |