/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 | 310k | do { \ |
26 | 310k | switch (ExpandMacros(field, expanders, version)) { \ |
27 | 2.71k | case ExpandMacroResult::Error: \ |
28 | 2.71k | return false; \ |
29 | 768 | case ExpandMacroResult::Ignore: \ |
30 | 768 | out.reset(); \ |
31 | 768 | return true; \ |
32 | 28.9k | case ExpandMacroResult::Defer: \ |
33 | 28.9k | CM_FALLTHROUGH; \ |
34 | 306k | case ExpandMacroResult::Ok: \ |
35 | 306k | break; \ |
36 | 310k | } \ |
37 | 310k | } 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.38k | { |
70 | 1.38k | switch (type) { |
71 | 888 | case WorkflowPreset::WorkflowStep::Type::Configure: |
72 | 888 | return "configure"; |
73 | 201 | case WorkflowPreset::WorkflowStep::Type::Build: |
74 | 201 | return "build"; |
75 | 117 | case WorkflowPreset::WorkflowStep::Type::Test: |
76 | 117 | return "test"; |
77 | 183 | case WorkflowPreset::WorkflowStep::Type::Package: |
78 | 183 | return "package"; |
79 | 1.38k | } |
80 | 0 | return ""; |
81 | 1.38k | } |
82 | | |
83 | | void InheritString(std::string& child, std::string const& parent) |
84 | 163k | { |
85 | 163k | if (child.empty()) { |
86 | 138k | child = parent; |
87 | 138k | } |
88 | 163k | } |
89 | | |
90 | | template <typename T> |
91 | | void InheritOptionalValue(cm::optional<T>& child, |
92 | | cm::optional<T> const& parent) |
93 | 124k | { |
94 | 124k | if (!child) { |
95 | 124k | child = parent; |
96 | 124k | } |
97 | 124k | } cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<bool>(std::__1::optional<bool>&, std::__1::optional<bool> const&) Line | Count | Source | 93 | 84.3k | { | 94 | 84.3k | if (!child) { | 95 | 84.3k | child = parent; | 96 | 84.3k | } | 97 | 84.3k | } |
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TraceEnableMode>(std::__1::optional<cmCMakePresetsGraph::TraceEnableMode>&, std::__1::optional<cmCMakePresetsGraph::TraceEnableMode> const&) Line | Count | Source | 93 | 19.5k | { | 94 | 19.5k | if (!child) { | 95 | 19.5k | child = parent; | 96 | 19.5k | } | 97 | 19.5k | } |
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmTraceEnums::TraceOutputFormat>(std::__1::optional<cmTraceEnums::TraceOutputFormat>&, std::__1::optional<cmTraceEnums::TraceOutputFormat> const&) Line | Count | Source | 93 | 19.5k | { | 94 | 19.5k | if (!child) { | 95 | 19.5k | child = parent; | 96 | 19.5k | } | 97 | 19.5k | } |
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<unsigned int>(std::__1::optional<unsigned int>&, std::__1::optional<unsigned int> const&) Line | Count | Source | 93 | 1.27k | { | 94 | 1.27k | if (!child) { | 95 | 1.27k | child = parent; | 96 | 1.27k | } | 97 | 1.27k | } |
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 | 24.0k | { |
102 | 24.0k | if (child.empty()) { |
103 | 24.0k | child = parent; |
104 | 24.0k | } |
105 | 24.0k | } |
106 | | |
107 | | template <typename K, typename V> |
108 | | void InheritMap(std::map<K, V>& child, std::map<K, V> const& parent) |
109 | 81.3k | { |
110 | 81.3k | for (auto const& item : parent) { |
111 | 65.1k | child.insert(item); |
112 | 65.1k | } |
113 | 81.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 | 39.0k | { | 110 | 39.0k | for (auto const& item : parent) { | 111 | 0 | child.insert(item); | 112 | 0 | } | 113 | 39.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 | 19.5k | { | 110 | 41.6k | for (auto const& item : parent) { | 111 | 41.6k | child.insert(item); | 112 | 41.6k | } | 113 | 19.5k | } |
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&) Line | Count | Source | 109 | 441 | { | 110 | 441 | for (auto const& item : parent) { | 111 | 0 | child.insert(item); | 112 | 0 | } | 113 | 441 | } |
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 | 22.3k | { | 110 | 23.5k | for (auto const& item : parent) { | 111 | 23.5k | child.insert(item); | 112 | 23.5k | } | 113 | 22.3k | } |
|
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 | 84.4k | { |
127 | 84.4k | switch (cycleStatus[preset.Name]) { |
128 | 30 | case CycleStatus::InProgress: |
129 | 30 | cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE( |
130 | 30 | preset.Name, preset.kind(), &graph.parseState); |
131 | 30 | return false; |
132 | 0 | case CycleStatus::Verified: |
133 | 0 | return true; |
134 | 84.4k | default: |
135 | 84.4k | break; |
136 | 84.4k | } |
137 | | |
138 | 84.4k | cycleStatus[preset.Name] = CycleStatus::InProgress; |
139 | | |
140 | 84.4k | if (preset.Environment.count("") != 0) { |
141 | 18 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
142 | 18 | preset.Name, preset.kind(), &graph.parseState, |
143 | 18 | "Empty environment variable names are not allowed"); |
144 | 18 | return false; |
145 | 18 | } |
146 | | |
147 | 84.3k | bool result = preset.VisitPresetBeforeInherit(); |
148 | 84.3k | 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 | 84.3k | for (auto const& i : preset.Inherits) { |
155 | 24.5k | auto parent = presets.find(i); |
156 | 24.5k | if (parent == presets.end()) { |
157 | 2.10k | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
158 | 2.10k | preset.Name, preset.kind(), &graph.parseState, |
159 | 2.10k | cmStrCat("Could not find inherited preset \"", i, '"')); |
160 | 2.10k | return false; |
161 | 2.10k | } |
162 | | |
163 | 22.4k | auto& parentPreset = parent->second.Unexpanded; |
164 | 22.4k | 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 | 22.4k | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { |
171 | 132 | return false; |
172 | 132 | } |
173 | | |
174 | 22.3k | result = preset.VisitPresetInherit(parentPreset); |
175 | 22.3k | 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 | 22.3k | InheritMap(preset.Environment, parentPreset.Environment); |
182 | | |
183 | 22.3k | if (!preset.ConditionEvaluator) { |
184 | 22.2k | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; |
185 | 22.2k | } |
186 | 22.3k | } |
187 | | |
188 | 82.1k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { |
189 | 0 | preset.ConditionEvaluator.reset(); |
190 | 0 | } |
191 | | |
192 | 82.1k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), |
193 | 82.1k | &graph.parseState); |
194 | 82.1k | if (!result) { |
195 | 2.82k | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
196 | 2.82k | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); |
197 | 2.82k | return false; |
198 | 2.82k | } |
199 | | |
200 | 79.3k | cycleStatus[preset.Name] = CycleStatus::Verified; |
201 | 79.3k | return true; |
202 | 82.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 | 66.3k | { | 127 | 66.3k | switch (cycleStatus[preset.Name]) { | 128 | 9 | case CycleStatus::InProgress: | 129 | 9 | cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE( | 130 | 9 | preset.Name, preset.kind(), &graph.parseState); | 131 | 9 | return false; | 132 | 0 | case CycleStatus::Verified: | 133 | 0 | return true; | 134 | 66.3k | default: | 135 | 66.3k | break; | 136 | 66.3k | } | 137 | | | 138 | 66.3k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 66.3k | if (preset.Environment.count("") != 0) { | 141 | 9 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 142 | 9 | preset.Name, preset.kind(), &graph.parseState, | 143 | 9 | "Empty environment variable names are not allowed"); | 144 | 9 | return false; | 145 | 9 | } | 146 | | | 147 | 66.3k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 66.3k | 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 | 66.3k | for (auto const& i : preset.Inherits) { | 155 | 20.2k | auto parent = presets.find(i); | 156 | 20.2k | if (parent == presets.end()) { | 157 | 684 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 158 | 684 | preset.Name, preset.kind(), &graph.parseState, | 159 | 684 | cmStrCat("Could not find inherited preset \"", i, '"')); | 160 | 684 | return false; | 161 | 684 | } | 162 | | | 163 | 19.5k | auto& parentPreset = parent->second.Unexpanded; | 164 | 19.5k | 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 | 19.5k | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { | 171 | 24 | return false; | 172 | 24 | } | 173 | | | 174 | 19.5k | result = preset.VisitPresetInherit(parentPreset); | 175 | 19.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 | 19.5k | InheritMap(preset.Environment, parentPreset.Environment); | 182 | | | 183 | 19.5k | if (!preset.ConditionEvaluator) { | 184 | 19.4k | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; | 185 | 19.4k | } | 186 | 19.5k | } | 187 | | | 188 | 65.6k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 65.6k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 65.6k | &graph.parseState); | 194 | 65.6k | if (!result) { | 195 | 552 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 196 | 552 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 197 | 552 | return false; | 198 | 552 | } | 199 | | | 200 | 65.1k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 65.1k | return true; | 202 | 65.6k | } |
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 | 7.23k | { | 127 | 7.23k | switch (cycleStatus[preset.Name]) { | 128 | 15 | case CycleStatus::InProgress: | 129 | 15 | cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE( | 130 | 15 | preset.Name, preset.kind(), &graph.parseState); | 131 | 15 | return false; | 132 | 0 | case CycleStatus::Verified: | 133 | 0 | return true; | 134 | 7.21k | default: | 135 | 7.21k | break; | 136 | 7.23k | } | 137 | | | 138 | 7.21k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 7.21k | 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 | 7.21k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 7.21k | 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 | 7.21k | for (auto const& i : preset.Inherits) { | 155 | 1.83k | auto parent = presets.find(i); | 156 | 1.83k | if (parent == presets.end()) { | 157 | 504 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 158 | 504 | preset.Name, preset.kind(), &graph.parseState, | 159 | 504 | cmStrCat("Could not find inherited preset \"", i, '"')); | 160 | 504 | return false; | 161 | 504 | } | 162 | | | 163 | 1.33k | auto& parentPreset = parent->second.Unexpanded; | 164 | 1.33k | 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 | 1.33k | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { | 171 | 54 | return false; | 172 | 54 | } | 173 | | | 174 | 1.27k | result = preset.VisitPresetInherit(parentPreset); | 175 | 1.27k | 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 | 1.27k | InheritMap(preset.Environment, parentPreset.Environment); | 182 | | | 183 | 1.27k | if (!preset.ConditionEvaluator) { | 184 | 1.25k | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; | 185 | 1.25k | } | 186 | 1.27k | } | 187 | | | 188 | 6.65k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 6.65k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 6.65k | &graph.parseState); | 194 | 6.65k | if (!result) { | 195 | 717 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 196 | 717 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 197 | 717 | return false; | 198 | 717 | } | 199 | | | 200 | 5.94k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 5.94k | return true; | 202 | 6.65k | } |
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 | 5.55k | { | 127 | 5.55k | 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 | 5.55k | default: | 135 | 5.55k | break; | 136 | 5.55k | } | 137 | | | 138 | 5.55k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 5.55k | 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 | 5.54k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 5.54k | 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 | 5.54k | for (auto const& i : preset.Inherits) { | 155 | 1.60k | auto parent = presets.find(i); | 156 | 1.60k | if (parent == presets.end()) { | 157 | 471 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 158 | 471 | preset.Name, preset.kind(), &graph.parseState, | 159 | 471 | cmStrCat("Could not find inherited preset \"", i, '"')); | 160 | 471 | return false; | 161 | 471 | } | 162 | | | 163 | 1.13k | auto& parentPreset = parent->second.Unexpanded; | 164 | 1.13k | 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 | 1.13k | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { | 171 | 21 | return false; | 172 | 21 | } | 173 | | | 174 | 1.11k | result = preset.VisitPresetInherit(parentPreset); | 175 | 1.11k | 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 | 1.11k | InheritMap(preset.Environment, parentPreset.Environment); | 182 | | | 183 | 1.11k | if (!preset.ConditionEvaluator) { | 184 | 1.08k | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; | 185 | 1.08k | } | 186 | 1.11k | } | 187 | | | 188 | 5.05k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 5.05k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 5.05k | &graph.parseState); | 194 | 5.05k | if (!result) { | 195 | 891 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 196 | 891 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 197 | 891 | return false; | 198 | 891 | } | 199 | | | 200 | 4.16k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 4.16k | return true; | 202 | 5.05k | } |
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 | 3.86k | { | 127 | 3.86k | 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.86k | default: | 135 | 3.86k | break; | 136 | 3.86k | } | 137 | | | 138 | 3.86k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 3.86k | 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.86k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 3.86k | 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.86k | for (auto const& i : preset.Inherits) { | 155 | 921 | auto parent = presets.find(i); | 156 | 921 | if (parent == presets.end()) { | 157 | 447 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 158 | 447 | preset.Name, preset.kind(), &graph.parseState, | 159 | 447 | cmStrCat("Could not find inherited preset \"", i, '"')); | 160 | 447 | return false; | 161 | 447 | } | 162 | | | 163 | 474 | auto& parentPreset = parent->second.Unexpanded; | 164 | 474 | 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 | 474 | if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) { | 171 | 33 | return false; | 172 | 33 | } | 173 | | | 174 | 441 | result = preset.VisitPresetInherit(parentPreset); | 175 | 441 | 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 | 441 | InheritMap(preset.Environment, parentPreset.Environment); | 182 | | | 183 | 441 | if (!preset.ConditionEvaluator) { | 184 | 438 | preset.ConditionEvaluator = parentPreset.ConditionEvaluator; | 185 | 438 | } | 186 | 441 | } | 187 | | | 188 | 3.38k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 3.38k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 3.38k | &graph.parseState); | 194 | 3.38k | if (!result) { | 195 | 660 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 196 | 660 | preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail); | 197 | 660 | return false; | 198 | 660 | } | 199 | | | 200 | 2.72k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 2.72k | return true; | 202 | 3.38k | } |
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.41k | { | 127 | 1.41k | 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.41k | default: | 135 | 1.41k | break; | 136 | 1.41k | } | 137 | | | 138 | 1.41k | cycleStatus[preset.Name] = CycleStatus::InProgress; | 139 | | | 140 | 1.41k | 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.41k | bool result = preset.VisitPresetBeforeInherit(); | 148 | 1.41k | 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.41k | 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.41k | if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) { | 189 | 0 | preset.ConditionEvaluator.reset(); | 190 | 0 | } | 191 | | | 192 | 1.41k | result = preset.VisitPresetAfterInherit(graph.GetVersion(preset), | 193 | 1.41k | &graph.parseState); | 194 | 1.41k | 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.41k | cycleStatus[preset.Name] = CycleStatus::Verified; | 201 | 1.41k | return true; | 202 | 1.41k | } |
|
203 | | |
204 | | template <typename T> |
205 | | bool ComputePresetInheritance( |
206 | | std::map<std::string, cmCMakePresetsGraph::PresetPair<T>>& presets, |
207 | | cmCMakePresetsGraph& graph) |
208 | 86.5k | { |
209 | 86.5k | std::map<std::string, CycleStatus> cycleStatus; |
210 | 97.3k | for (auto const& it : presets) { |
211 | 97.3k | cycleStatus[it.first] = CycleStatus::Unvisited; |
212 | 97.3k | } |
213 | | |
214 | 86.5k | for (auto& it : presets) { |
215 | 61.9k | auto& preset = it.second.Unexpanded; |
216 | 61.9k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { |
217 | 4.97k | return false; |
218 | 4.97k | } |
219 | 61.9k | } |
220 | | |
221 | 81.6k | return true; |
222 | 86.5k | } 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 | 19.8k | { | 209 | 19.8k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 51.1k | for (auto const& it : presets) { | 211 | 51.1k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 51.1k | } | 213 | | | 214 | 46.8k | for (auto& it : presets) { | 215 | 46.8k | auto& preset = it.second.Unexpanded; | 216 | 46.8k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 1.25k | return false; | 218 | 1.25k | } | 219 | 46.8k | } | 220 | | | 221 | 18.5k | return true; | 222 | 19.8k | } |
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 | 18.5k | { | 209 | 18.5k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 18.5k | for (auto const& it : presets) { | 211 | 15.7k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 15.7k | } | 213 | | | 214 | 18.5k | for (auto& it : presets) { | 215 | 5.90k | auto& preset = it.second.Unexpanded; | 216 | 5.90k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 1.23k | return false; | 218 | 1.23k | } | 219 | 5.90k | } | 220 | | | 221 | 17.3k | return true; | 222 | 18.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 | 17.3k | { | 209 | 17.3k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 17.3k | for (auto const& it : presets) { | 211 | 15.3k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 15.3k | } | 213 | | | 214 | 17.3k | for (auto& it : presets) { | 215 | 4.41k | auto& preset = it.second.Unexpanded; | 216 | 4.41k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 1.36k | return false; | 218 | 1.36k | } | 219 | 4.41k | } | 220 | | | 221 | 15.9k | return true; | 222 | 17.3k | } |
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 | 15.9k | { | 209 | 15.9k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 15.9k | for (auto const& it : presets) { | 211 | 13.6k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 13.6k | } | 213 | | | 214 | 15.9k | for (auto& it : presets) { | 215 | 3.39k | auto& preset = it.second.Unexpanded; | 216 | 3.39k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 1.11k | return false; | 218 | 1.11k | } | 219 | 3.39k | } | 220 | | | 221 | 14.8k | return true; | 222 | 15.9k | } |
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 | 14.8k | { | 209 | 14.8k | std::map<std::string, CycleStatus> cycleStatus; | 210 | 14.8k | for (auto const& it : presets) { | 211 | 1.41k | cycleStatus[it.first] = CycleStatus::Unvisited; | 212 | 1.41k | } | 213 | | | 214 | 14.8k | for (auto& it : presets) { | 215 | 1.41k | auto& preset = it.second.Unexpanded; | 216 | 1.41k | if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) { | 217 | 0 | return false; | 218 | 0 | } | 219 | 1.41k | } | 220 | | | 221 | 14.8k | return true; | 222 | 14.8k | } |
|
223 | | |
224 | | constexpr char const* ValidPrefixes[] = { |
225 | | "", |
226 | | "env", |
227 | | "penv", |
228 | | "vendor", |
229 | | }; |
230 | | |
231 | | bool PrefixesValidMacroNamespace(std::string const& str) |
232 | 959k | { |
233 | 959k | return std::any_of( |
234 | 959k | std::begin(ValidPrefixes), std::end(ValidPrefixes), |
235 | 2.96M | [&str](char const* prefix) -> bool { return cmHasPrefix(prefix, str); }); |
236 | 959k | } |
237 | | |
238 | | bool IsValidMacroNamespace(std::string const& str) |
239 | 486k | { |
240 | 486k | return std::any_of( |
241 | 486k | std::begin(ValidPrefixes), std::end(ValidPrefixes), |
242 | 670k | [&str](char const* prefix) -> bool { return str == prefix; }); |
243 | 486k | } |
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 | 42.4k | : EnvCycles(envCycles) |
260 | 42.4k | , Out(out) |
261 | 42.4k | , MacroExpanders(macroExpanders) |
262 | 42.4k | { |
263 | 42.4k | } 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.84k | : EnvCycles(envCycles) | 260 | 1.84k | , Out(out) | 261 | 1.84k | , MacroExpanders(macroExpanders) | 262 | 1.84k | { | 263 | 1.84k | } |
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.03k | : EnvCycles(envCycles) | 260 | 1.03k | , Out(out) | 261 | 1.03k | , MacroExpanders(macroExpanders) | 262 | 1.03k | { | 263 | 1.03k | } |
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 | 1.05k | : EnvCycles(envCycles) | 260 | 1.05k | , Out(out) | 261 | 1.05k | , MacroExpanders(macroExpanders) | 262 | 1.05k | { | 263 | 1.05k | } |
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 | 38.4k | : EnvCycles(envCycles) | 260 | 38.4k | , Out(out) | 261 | 38.4k | , MacroExpanders(macroExpanders) | 262 | 38.4k | { | 263 | 38.4k | } |
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 | 15 | : EnvCycles(envCycles) | 260 | 15 | , Out(out) | 261 | 15 | , MacroExpanders(macroExpanders) | 262 | 15 | { | 263 | 15 | } |
|
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 | 65.7k | auto v = Out->Environment.find(macroName); |
271 | 65.7k | if (v != Out->Environment.end() && v->second) { |
272 | 4.14k | auto e = |
273 | 4.14k | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); |
274 | 4.14k | if (e != ExpandMacroResult::Ok) { |
275 | 6 | return e; |
276 | 6 | } |
277 | 4.14k | macroOut += *v->second; |
278 | 4.14k | return ExpandMacroResult::Ok; |
279 | 4.14k | } |
280 | 65.7k | } |
281 | | |
282 | 97.2k | if (macroNamespace == "env" || macroNamespace == "penv") { |
283 | 93.8k | if (macroName.empty()) { |
284 | 12 | return ExpandMacroResult::Error; |
285 | 12 | } |
286 | 93.8k | if (cm::optional<std::string> value = |
287 | 93.8k | cmSystemTools::GetEnvVar(macroName)) { |
288 | 36.2k | macroOut += *value; |
289 | 36.2k | } |
290 | 93.8k | return ExpandMacroResult::Ok; |
291 | 93.8k | } |
292 | | |
293 | 3.39k | return ExpandMacroResult::Ignore; |
294 | 97.2k | } 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 | 14.3k | { | 269 | 14.3k | if (macroNamespace == "env" && !macroName.empty() && Out) { | 270 | 8.99k | auto v = Out->Environment.find(macroName); | 271 | 8.99k | if (v != Out->Environment.end() && v->second) { | 272 | 24 | auto e = | 273 | 24 | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); | 274 | 24 | if (e != ExpandMacroResult::Ok) { | 275 | 0 | return e; | 276 | 0 | } | 277 | 24 | macroOut += *v->second; | 278 | 24 | return ExpandMacroResult::Ok; | 279 | 24 | } | 280 | 8.99k | } | 281 | | | 282 | 14.3k | if (macroNamespace == "env" || macroNamespace == "penv") { | 283 | 13.9k | if (macroName.empty()) { | 284 | 3 | return ExpandMacroResult::Error; | 285 | 3 | } | 286 | 13.9k | if (cm::optional<std::string> value = | 287 | 13.9k | cmSystemTools::GetEnvVar(macroName)) { | 288 | 4.47k | macroOut += *value; | 289 | 4.47k | } | 290 | 13.9k | return ExpandMacroResult::Ok; | 291 | 13.9k | } | 292 | | | 293 | 375 | return ExpandMacroResult::Ignore; | 294 | 14.3k | } |
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 | 16.1k | { | 269 | 16.1k | if (macroNamespace == "env" && !macroName.empty() && Out) { | 270 | 9.76k | auto v = Out->Environment.find(macroName); | 271 | 9.76k | if (v != Out->Environment.end() && v->second) { | 272 | 66 | auto e = | 273 | 66 | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); | 274 | 66 | if (e != ExpandMacroResult::Ok) { | 275 | 0 | return e; | 276 | 0 | } | 277 | 66 | macroOut += *v->second; | 278 | 66 | return ExpandMacroResult::Ok; | 279 | 66 | } | 280 | 9.76k | } | 281 | | | 282 | 16.1k | if (macroNamespace == "env" || macroNamespace == "penv") { | 283 | 16.1k | if (macroName.empty()) { | 284 | 0 | return ExpandMacroResult::Error; | 285 | 0 | } | 286 | 16.1k | if (cm::optional<std::string> value = | 287 | 16.1k | cmSystemTools::GetEnvVar(macroName)) { | 288 | 7.32k | macroOut += *value; | 289 | 7.32k | } | 290 | 16.1k | return ExpandMacroResult::Ok; | 291 | 16.1k | } | 292 | | | 293 | 3 | return ExpandMacroResult::Ignore; | 294 | 16.1k | } |
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 | 19.5k | { | 269 | 19.5k | if (macroNamespace == "env" && !macroName.empty() && Out) { | 270 | 12.3k | auto v = Out->Environment.find(macroName); | 271 | 12.3k | if (v != Out->Environment.end() && v->second) { | 272 | 63 | auto e = | 273 | 63 | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); | 274 | 63 | if (e != ExpandMacroResult::Ok) { | 275 | 0 | return e; | 276 | 0 | } | 277 | 63 | macroOut += *v->second; | 278 | 63 | return ExpandMacroResult::Ok; | 279 | 63 | } | 280 | 12.3k | } | 281 | | | 282 | 19.5k | if (macroNamespace == "env" || macroNamespace == "penv") { | 283 | 19.5k | if (macroName.empty()) { | 284 | 0 | return ExpandMacroResult::Error; | 285 | 0 | } | 286 | 19.5k | if (cm::optional<std::string> value = | 287 | 19.5k | cmSystemTools::GetEnvVar(macroName)) { | 288 | 8.10k | macroOut += *value; | 289 | 8.10k | } | 290 | 19.5k | return ExpandMacroResult::Ok; | 291 | 19.5k | } | 292 | | | 293 | 6 | return ExpandMacroResult::Ignore; | 294 | 19.5k | } |
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 | 51.2k | { | 269 | 51.2k | if (macroNamespace == "env" && !macroName.empty() && Out) { | 270 | 34.6k | auto v = Out->Environment.find(macroName); | 271 | 34.6k | if (v != Out->Environment.end() && v->second) { | 272 | 3.99k | auto e = | 273 | 3.99k | VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version); | 274 | 3.99k | if (e != ExpandMacroResult::Ok) { | 275 | 6 | return e; | 276 | 6 | } | 277 | 3.98k | macroOut += *v->second; | 278 | 3.98k | return ExpandMacroResult::Ok; | 279 | 3.99k | } | 280 | 34.6k | } | 281 | | | 282 | 47.2k | if (macroNamespace == "env" || macroNamespace == "penv") { | 283 | 44.2k | if (macroName.empty()) { | 284 | 9 | return ExpandMacroResult::Error; | 285 | 9 | } | 286 | 44.2k | if (cm::optional<std::string> value = | 287 | 44.2k | cmSystemTools::GetEnvVar(macroName)) { | 288 | 16.3k | macroOut += *value; | 289 | 16.3k | } | 290 | 44.2k | return ExpandMacroResult::Ok; | 291 | 44.2k | } | 292 | | | 293 | 3.01k | return ExpandMacroResult::Ignore; | 294 | 47.2k | } |
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 | 92.2k | { |
302 | 92.2k | int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version; |
303 | | |
304 | 92.2k | std::string binaryDir = preset.BinaryDir; |
305 | 92.2k | CHECK_EXPAND(out, binaryDir, macroExpanders, version); |
306 | | |
307 | 90.6k | if (!binaryDir.empty()) { |
308 | 21.4k | if (graph) { |
309 | 9.48k | if (!cmSystemTools::FileIsFullPath(binaryDir)) { |
310 | 6.09k | binaryDir = cmStrCat(graph->SourceDir, '/', std::move(binaryDir)); |
311 | 6.09k | } |
312 | 9.48k | out->BinaryDir = cmSystemTools::CollapseFullPath(binaryDir); |
313 | 9.48k | cmSystemTools::ConvertToUnixSlashes(out->BinaryDir); |
314 | 11.9k | } else { |
315 | | // Defer path normalization until the graph is merged, but store the |
316 | | // intermediate result. |
317 | 11.9k | out->BinaryDir = binaryDir; |
318 | 11.9k | } |
319 | 21.4k | } |
320 | | |
321 | 90.6k | if (!preset.InstallDir.empty()) { |
322 | 3.89k | std::string installDir = preset.InstallDir; |
323 | 3.89k | CHECK_EXPAND(out, installDir, macroExpanders, version); |
324 | | |
325 | 3.55k | if (graph) { |
326 | 2.06k | if (!cmSystemTools::FileIsFullPath(installDir)) { |
327 | 1.23k | installDir = cmStrCat(graph->SourceDir, '/', std::move(installDir)); |
328 | 1.23k | } |
329 | 2.06k | out->InstallDir = cmSystemTools::CollapseFullPath(installDir); |
330 | 2.06k | cmSystemTools::ConvertToUnixSlashes(out->InstallDir); |
331 | 2.06k | } else { |
332 | | // Defer path normalization until the graph is merged, but store the |
333 | | // intermediate result. |
334 | 1.49k | out->InstallDir = installDir; |
335 | 1.49k | } |
336 | 3.55k | } |
337 | | |
338 | 90.3k | if (!preset.ToolchainFile.empty()) { |
339 | 2.49k | std::string toolchain = preset.ToolchainFile; |
340 | 2.49k | CHECK_EXPAND(out, toolchain, macroExpanders, version); |
341 | 2.39k | out->ToolchainFile = toolchain; |
342 | 2.39k | } |
343 | | |
344 | 90.2k | if (!preset.GraphVizFile.empty()) { |
345 | 561 | std::string graphVizFile = preset.GraphVizFile; |
346 | 561 | CHECK_EXPAND(out, graphVizFile, macroExpanders, version); |
347 | 507 | out->GraphVizFile = graphVizFile; |
348 | 507 | } |
349 | | |
350 | 90.1k | for (auto& variable : out->CacheVariables) { |
351 | 29.7k | if (variable.second) { |
352 | 29.3k | CHECK_EXPAND(out, variable.second->Value, macroExpanders, version); |
353 | 29.3k | } |
354 | 29.7k | } |
355 | | |
356 | 89.6k | return true; |
357 | 90.1k | } |
358 | | |
359 | | bool CheckExpandMacros(BuildPreset const& preset, |
360 | | cm::optional<BuildPreset>& out, |
361 | | MacroExpanderVector const& macroExpanders, |
362 | | cmCMakePresetsGraph const* graph = nullptr) |
363 | 19.5k | { |
364 | 19.5k | int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version; |
365 | | |
366 | 38.1k | for (auto& target : out->Targets) { |
367 | 38.1k | CHECK_EXPAND(out, target, macroExpanders, version); |
368 | 38.1k | } |
369 | | |
370 | 19.0k | for (auto& nativeToolOption : out->NativeToolOptions) { |
371 | 0 | CHECK_EXPAND(out, nativeToolOption, macroExpanders, version); |
372 | 0 | } |
373 | | |
374 | 19.0k | return true; |
375 | 19.0k | } |
376 | | |
377 | | bool CheckExpandMacros(TestPreset const& preset, cm::optional<TestPreset>& out, |
378 | | MacroExpanderVector const& macroExpanders, |
379 | | cmCMakePresetsGraph const* graph = nullptr) |
380 | 17.8k | { |
381 | 17.8k | int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version; |
382 | | |
383 | 17.8k | for (auto& overwrite : out->OverwriteConfigurationFile) { |
384 | 0 | CHECK_EXPAND(out, overwrite, macroExpanders, version); |
385 | 0 | } |
386 | | |
387 | 17.8k | 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 | 17.8k | 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 | 17.8k | if (out->Execution) { |
419 | 75 | CHECK_EXPAND(out, out->Execution->ResourceSpecFile, macroExpanders, |
420 | 75 | version); |
421 | 75 | } |
422 | | |
423 | 17.8k | return true; |
424 | 17.8k | } |
425 | | |
426 | | bool CheckExpandMacros(PackagePreset const& preset, |
427 | | cm::optional<PackagePreset>& out, |
428 | | MacroExpanderVector const& macroExpanders, |
429 | | cmCMakePresetsGraph const* graph = nullptr) |
430 | 17.2k | { |
431 | 17.2k | int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version; |
432 | | |
433 | 17.2k | for (auto& variable : out->Variables) { |
434 | 0 | CHECK_EXPAND(out, variable.second, macroExpanders, version); |
435 | 0 | } |
436 | | |
437 | 17.2k | CHECK_EXPAND(out, out->ConfigFile, macroExpanders, version); |
438 | 17.2k | CHECK_EXPAND(out, out->PackageName, macroExpanders, version); |
439 | 17.2k | CHECK_EXPAND(out, out->PackageVersion, macroExpanders, version); |
440 | 17.2k | CHECK_EXPAND(out, out->PackageDirectory, macroExpanders, version); |
441 | 17.2k | CHECK_EXPAND(out, out->VendorName, macroExpanders, version); |
442 | | |
443 | 17.2k | return true; |
444 | 17.2k | } |
445 | | |
446 | | bool CheckExpandMacros(WorkflowPreset const& /*preset*/, |
447 | | cm::optional<WorkflowPreset>& /*out*/, |
448 | | MacroExpanderVector const& /*macroExpanders*/, |
449 | | cmCMakePresetsGraph const* /*graph*/ = nullptr) |
450 | 1.52k | { |
451 | 1.52k | return true; |
452 | 1.52k | } |
453 | | |
454 | | template <typename T> |
455 | | bool ExpandMacros(cmCMakePresetsGraph* graph, T const& preset, |
456 | | cm::optional<T>& out) |
457 | 42.4k | { |
458 | 42.4k | out.emplace(preset); |
459 | | |
460 | 42.4k | std::map<std::string, CycleStatus> envCycles; |
461 | 42.4k | for (auto const& v : out->Environment) { |
462 | 22.6k | envCycles[v.first] = CycleStatus::Unvisited; |
463 | 22.6k | } |
464 | | |
465 | 42.4k | MacroExpanderVector macroExpanders{}; |
466 | | |
467 | 42.4k | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); |
468 | 42.4k | macroExpanders.push_back( |
469 | 42.4k | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); |
470 | 42.4k | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( |
471 | 42.4k | macroExpanders, out, envCycles)); |
472 | | |
473 | 42.4k | for (auto& v : out->Environment) { |
474 | 21.7k | if (v.second) { |
475 | 18.6k | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, |
476 | 18.6k | graph->GetVersion(preset))) { |
477 | 216 | case ExpandMacroResult::Error: |
478 | 216 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
479 | 216 | preset.Name, preset.kind(), &graph->parseState, |
480 | 216 | "Invalid macro expansion"); |
481 | 216 | return false; |
482 | 99 | case ExpandMacroResult::Ignore: |
483 | 99 | out.reset(); |
484 | 99 | return true; |
485 | 0 | case ExpandMacroResult::Defer: |
486 | 0 | CM_FALLTHROUGH; |
487 | 18.2k | case ExpandMacroResult::Ok: |
488 | 18.2k | break; |
489 | 18.6k | } |
490 | 18.6k | } |
491 | 21.7k | } |
492 | | |
493 | 42.1k | if (preset.ConditionEvaluator) { |
494 | 6.78k | cm::optional<bool> result; |
495 | 6.78k | if (!preset.ConditionEvaluator->Evaluate( |
496 | 6.78k | macroExpanders, graph->GetVersion(preset), result)) { |
497 | 507 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( |
498 | 507 | preset.Name, preset.kind(), &graph->parseState, "Invalid condition"); |
499 | 507 | return false; |
500 | 507 | } |
501 | 6.27k | if (!result) { |
502 | 207 | out.reset(); |
503 | 207 | return true; |
504 | 207 | } |
505 | 6.06k | out->ConditionResult = *result; |
506 | 6.06k | } |
507 | | |
508 | 41.3k | return CheckExpandMacros(preset, out, macroExpanders, graph); |
509 | 42.1k | } cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::BuildPreset const&, std::__1::optional<cmCMakePresetsGraph::BuildPreset>&) Line | Count | Source | 457 | 1.84k | { | 458 | 1.84k | out.emplace(preset); | 459 | | | 460 | 1.84k | std::map<std::string, CycleStatus> envCycles; | 461 | 1.84k | for (auto const& v : out->Environment) { | 462 | 1.42k | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 1.42k | } | 464 | | | 465 | 1.84k | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 1.84k | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 1.84k | macroExpanders.push_back( | 469 | 1.84k | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 1.84k | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 1.84k | macroExpanders, out, envCycles)); | 472 | | | 473 | 1.84k | for (auto& v : out->Environment) { | 474 | 1.42k | if (v.second) { | 475 | 948 | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, | 476 | 948 | 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 | 3 | case ExpandMacroResult::Ignore: | 483 | 3 | out.reset(); | 484 | 3 | return true; | 485 | 0 | case ExpandMacroResult::Defer: | 486 | 0 | CM_FALLTHROUGH; | 487 | 945 | case ExpandMacroResult::Ok: | 488 | 945 | break; | 489 | 948 | } | 490 | 948 | } | 491 | 1.42k | } | 492 | | | 493 | 1.83k | if (preset.ConditionEvaluator) { | 494 | 6 | cm::optional<bool> result; | 495 | 6 | if (!preset.ConditionEvaluator->Evaluate( | 496 | 6 | 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 | 6 | if (!result) { | 502 | 0 | out.reset(); | 503 | 0 | return true; | 504 | 0 | } | 505 | 6 | out->ConditionResult = *result; | 506 | 6 | } | 507 | | | 508 | 1.83k | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 1.83k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::TestPreset const&, std::__1::optional<cmCMakePresetsGraph::TestPreset>&) Line | Count | Source | 457 | 1.03k | { | 458 | 1.03k | out.emplace(preset); | 459 | | | 460 | 1.03k | std::map<std::string, CycleStatus> envCycles; | 461 | 1.47k | for (auto const& v : out->Environment) { | 462 | 1.47k | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 1.47k | } | 464 | | | 465 | 1.03k | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 1.03k | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 1.03k | macroExpanders.push_back( | 469 | 1.03k | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 1.03k | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 1.03k | macroExpanders, out, envCycles)); | 472 | | | 473 | 1.47k | for (auto& v : out->Environment) { | 474 | 1.47k | if (v.second) { | 475 | 1.03k | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, | 476 | 1.03k | 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 | 3 | case ExpandMacroResult::Ignore: | 483 | 3 | out.reset(); | 484 | 3 | return true; | 485 | 0 | case ExpandMacroResult::Defer: | 486 | 0 | CM_FALLTHROUGH; | 487 | 1.03k | case ExpandMacroResult::Ok: | 488 | 1.03k | break; | 489 | 1.03k | } | 490 | 1.03k | } | 491 | 1.47k | } | 492 | | | 493 | 1.03k | 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.03k | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 1.03k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::PackagePreset const&, std::__1::optional<cmCMakePresetsGraph::PackagePreset>&) Line | Count | Source | 457 | 1.05k | { | 458 | 1.05k | out.emplace(preset); | 459 | | | 460 | 1.05k | std::map<std::string, CycleStatus> envCycles; | 461 | 1.72k | for (auto const& v : out->Environment) { | 462 | 1.72k | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 1.72k | } | 464 | | | 465 | 1.05k | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 1.05k | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 1.05k | macroExpanders.push_back( | 469 | 1.05k | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 1.05k | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 1.05k | macroExpanders, out, envCycles)); | 472 | | | 473 | 1.72k | for (auto& v : out->Environment) { | 474 | 1.72k | if (v.second) { | 475 | 1.24k | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, | 476 | 1.24k | 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 | 6 | case ExpandMacroResult::Ignore: | 483 | 6 | out.reset(); | 484 | 6 | return true; | 485 | 0 | case ExpandMacroResult::Defer: | 486 | 0 | CM_FALLTHROUGH; | 487 | 1.24k | case ExpandMacroResult::Ok: | 488 | 1.24k | break; | 489 | 1.24k | } | 490 | 1.24k | } | 491 | 1.72k | } | 492 | | | 493 | 1.04k | 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.04k | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 1.04k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::ConfigurePreset const&, std::__1::optional<cmCMakePresetsGraph::ConfigurePreset>&) Line | Count | Source | 457 | 38.4k | { | 458 | 38.4k | out.emplace(preset); | 459 | | | 460 | 38.4k | std::map<std::string, CycleStatus> envCycles; | 461 | 38.4k | for (auto const& v : out->Environment) { | 462 | 18.0k | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 18.0k | } | 464 | | | 465 | 38.4k | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 38.4k | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 38.4k | macroExpanders.push_back( | 469 | 38.4k | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 38.4k | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 38.4k | macroExpanders, out, envCycles)); | 472 | | | 473 | 38.4k | for (auto& v : out->Environment) { | 474 | 17.1k | if (v.second) { | 475 | 15.3k | switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders, | 476 | 15.3k | graph->GetVersion(preset))) { | 477 | 216 | case ExpandMacroResult::Error: | 478 | 216 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 479 | 216 | preset.Name, preset.kind(), &graph->parseState, | 480 | 216 | "Invalid macro expansion"); | 481 | 216 | return false; | 482 | 87 | case ExpandMacroResult::Ignore: | 483 | 87 | out.reset(); | 484 | 87 | return true; | 485 | 0 | case ExpandMacroResult::Defer: | 486 | 0 | CM_FALLTHROUGH; | 487 | 15.0k | case ExpandMacroResult::Ok: | 488 | 15.0k | break; | 489 | 15.3k | } | 490 | 15.3k | } | 491 | 17.1k | } | 492 | | | 493 | 38.1k | if (preset.ConditionEvaluator) { | 494 | 6.77k | cm::optional<bool> result; | 495 | 6.77k | if (!preset.ConditionEvaluator->Evaluate( | 496 | 6.77k | macroExpanders, graph->GetVersion(preset), result)) { | 497 | 507 | cmCMakePresetsErrors::INVALID_PRESET_NAMED( | 498 | 507 | preset.Name, preset.kind(), &graph->parseState, "Invalid condition"); | 499 | 507 | return false; | 500 | 507 | } | 501 | 6.27k | if (!result) { | 502 | 207 | out.reset(); | 503 | 207 | return true; | 504 | 207 | } | 505 | 6.06k | out->ConditionResult = *result; | 506 | 6.06k | } | 507 | | | 508 | 37.4k | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 38.1k | } |
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::WorkflowPreset const&, std::__1::optional<cmCMakePresetsGraph::WorkflowPreset>&) Line | Count | Source | 457 | 15 | { | 458 | 15 | out.emplace(preset); | 459 | | | 460 | 15 | std::map<std::string, CycleStatus> envCycles; | 461 | 15 | for (auto const& v : out->Environment) { | 462 | 0 | envCycles[v.first] = CycleStatus::Unvisited; | 463 | 0 | } | 464 | | | 465 | 15 | MacroExpanderVector macroExpanders{}; | 466 | | | 467 | 15 | macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph)); | 468 | 15 | macroExpanders.push_back( | 469 | 15 | cm::make_unique<PresetMacroExpander<T>>(*graph, preset)); | 470 | 15 | macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>( | 471 | 15 | macroExpanders, out, envCycles)); | 472 | | | 473 | 15 | 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 | 15 | 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 | 15 | return CheckExpandMacros(preset, out, macroExpanders, graph); | 509 | 15 | } |
|
510 | | |
511 | | ExpandMacroResult VisitEnv(std::string& value, CycleStatus& status, |
512 | | MacroExpanderVector const& macroExpanders, |
513 | | int version) |
514 | 22.7k | { |
515 | 22.7k | if (status == CycleStatus::Verified) { |
516 | 4.14k | return ExpandMacroResult::Ok; |
517 | 4.14k | } |
518 | 18.6k | if (status == CycleStatus::InProgress) { |
519 | 3 | return ExpandMacroResult::Error; |
520 | 3 | } |
521 | | |
522 | 18.6k | status = CycleStatus::InProgress; |
523 | 18.6k | auto e = ExpandMacros(value, macroExpanders, version); |
524 | 18.6k | if (e != ExpandMacroResult::Ok) { |
525 | 318 | return e; |
526 | 318 | } |
527 | 18.2k | status = CycleStatus::Verified; |
528 | 18.2k | return ExpandMacroResult::Ok; |
529 | 18.6k | } |
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 | 106k | { |
672 | 106k | MacroExpanderVector macroExpanders{}; |
673 | 106k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); |
674 | 106k | cm::optional<T> out = preset; |
675 | 106k | bool result = CheckExpandMacros(preset, out, macroExpanders); |
676 | 106k | if (out.has_value()) { |
677 | 106k | preset = out.value(); |
678 | 106k | }; |
679 | 106k | return result; |
680 | 106k | } bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph::ConfigurePreset&) Line | Count | Source | 671 | 54.8k | { | 672 | 54.8k | MacroExpanderVector macroExpanders{}; | 673 | 54.8k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 54.8k | cm::optional<T> out = preset; | 675 | 54.8k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 54.8k | if (out.has_value()) { | 677 | 54.8k | preset = out.value(); | 678 | 54.8k | }; | 679 | 54.8k | return result; | 680 | 54.8k | } |
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::BuildPreset&) Line | Count | Source | 671 | 17.6k | { | 672 | 17.6k | MacroExpanderVector macroExpanders{}; | 673 | 17.6k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 17.6k | cm::optional<T> out = preset; | 675 | 17.6k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 17.6k | if (out.has_value()) { | 677 | 17.6k | preset = out.value(); | 678 | 17.6k | }; | 679 | 17.6k | return result; | 680 | 17.6k | } |
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::TestPreset&) Line | Count | Source | 671 | 16.7k | { | 672 | 16.7k | MacroExpanderVector macroExpanders{}; | 673 | 16.7k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 16.7k | cm::optional<T> out = preset; | 675 | 16.7k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 16.7k | if (out.has_value()) { | 677 | 16.7k | preset = out.value(); | 678 | 16.7k | }; | 679 | 16.7k | return result; | 680 | 16.7k | } |
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::PackagePreset&) Line | Count | Source | 671 | 16.2k | { | 672 | 16.2k | MacroExpanderVector macroExpanders{}; | 673 | 16.2k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 16.2k | cm::optional<T> out = preset; | 675 | 16.2k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 16.2k | if (out.has_value()) { | 677 | 16.2k | preset = out.value(); | 678 | 16.2k | }; | 679 | 16.2k | return result; | 680 | 16.2k | } |
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph::WorkflowPreset&) Line | Count | Source | 671 | 1.50k | { | 672 | 1.50k | MacroExpanderVector macroExpanders{}; | 673 | 1.50k | macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset)); | 674 | 1.50k | cm::optional<T> out = preset; | 675 | 1.50k | bool result = CheckExpandMacros(preset, out, macroExpanders); | 676 | 1.50k | if (out.has_value()) { | 677 | 1.50k | preset = out.value(); | 678 | 1.50k | }; | 679 | 1.50k | return result; | 680 | 1.50k | } |
|
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 | 333k | { |
696 | 333k | std::string result; |
697 | 333k | std::string macroNamespace; |
698 | 333k | std::string macroName; |
699 | | |
700 | 333k | enum class State |
701 | 333k | { |
702 | 333k | Default, |
703 | 333k | MacroNamespace, |
704 | 333k | MacroName, |
705 | 333k | } state = State::Default; |
706 | | |
707 | 40.9M | for (auto c : out) { |
708 | 40.9M | switch (state) { |
709 | 30.7M | case State::Default: |
710 | 30.7M | if (c == '$') { |
711 | 755k | state = State::MacroNamespace; |
712 | 30.0M | } else { |
713 | 30.0M | result += c; |
714 | 30.0M | } |
715 | 30.7M | break; |
716 | | |
717 | 1.44M | case State::MacroNamespace: |
718 | 1.44M | if (c == '{') { |
719 | 486k | if (IsValidMacroNamespace(macroNamespace)) { |
720 | 483k | state = State::MacroName; |
721 | 483k | } else { |
722 | 3.55k | result += '$'; |
723 | 3.55k | result += macroNamespace; |
724 | 3.55k | result += '{'; |
725 | 3.55k | macroNamespace.clear(); |
726 | 3.55k | state = State::Default; |
727 | 3.55k | } |
728 | 959k | } else { |
729 | 959k | macroNamespace += c; |
730 | 959k | if (!PrefixesValidMacroNamespace(macroNamespace)) { |
731 | 267k | result += '$'; |
732 | 267k | result += macroNamespace; |
733 | 267k | macroNamespace.clear(); |
734 | 267k | state = State::Default; |
735 | 267k | } |
736 | 959k | } |
737 | 1.44M | break; |
738 | | |
739 | 8.76M | case State::MacroName: |
740 | 8.76M | if (c == '}') { |
741 | 482k | auto e = ExpandMacro(result, macroNamespace, macroName, |
742 | 482k | macroExpanders, version); |
743 | 482k | if (e != ExpandMacroResult::Ok) { |
744 | 32.9k | return e; |
745 | 32.9k | } |
746 | 449k | macroNamespace.clear(); |
747 | 449k | macroName.clear(); |
748 | 449k | state = State::Default; |
749 | 8.28M | } else { |
750 | 8.28M | macroName += c; |
751 | 8.28M | } |
752 | 8.72M | break; |
753 | 40.9M | } |
754 | 40.9M | } |
755 | | |
756 | 300k | switch (state) { |
757 | 298k | case State::Default: |
758 | 298k | break; |
759 | 1.32k | case State::MacroNamespace: |
760 | 1.32k | result += '$'; |
761 | 1.32k | result += macroNamespace; |
762 | 1.32k | break; |
763 | 366 | case State::MacroName: |
764 | 366 | return ExpandMacroResult::Error; |
765 | 300k | } |
766 | | |
767 | 300k | out = std::move(result); |
768 | 300k | return ExpandMacroResult::Ok; |
769 | 300k | } |
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 | 482k | { |
776 | 845k | for (auto const& macroExpander : macroExpanders) { |
777 | 845k | auto result = (*macroExpander)(macroNamespace, macroName, out, version); |
778 | 845k | if (result != ExpandMacroResult::Ignore) { |
779 | 478k | return result; |
780 | 478k | } |
781 | 845k | } |
782 | | |
783 | 3.92k | if (macroNamespace == "vendor") { |
784 | 873 | return ExpandMacroResult::Ignore; |
785 | 873 | } |
786 | | |
787 | 3.05k | return ExpandMacroResult::Error; |
788 | 3.92k | } |
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 | 96 | { |
797 | 96 | if (preset.ConfigurePreset != configurePreset->Name) { |
798 | 6 | cmCMakePresetsErrors::WORKFLOW_STEP_CONFIGURE_PRESET_MISMATCH( |
799 | 6 | preset.kind(), preset.Name, preset.ConfigurePreset, |
800 | 6 | configurePreset->Name, state); |
801 | 6 | return false; |
802 | 6 | } |
803 | 90 | return true; |
804 | 96 | } 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 | 54 | { | 797 | 54 | 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 | 51 | return true; | 804 | 54 | } |
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 | 27 | { | 797 | 27 | 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 | 24 | return true; | 804 | 27 | } |
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 | 15 | { | 797 | 15 | 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 | 15 | return true; | 804 | 15 | } |
|
805 | | |
806 | | template <> |
807 | | bool SetupWorkflowConfigurePreset<ConfigurePreset>( |
808 | | ConfigurePreset const& preset, ConfigurePreset const*& configurePreset, |
809 | | char const*, std::string const&, cmJSONState*) |
810 | 297 | { |
811 | 297 | configurePreset = &preset; |
812 | 297 | return true; |
813 | 297 | } |
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.24k | { |
822 | 1.24k | auto it = presets.find(name); |
823 | 1.24k | if (it == presets.end()) { |
824 | 849 | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, |
825 | 849 | state); |
826 | 849 | return false; |
827 | 849 | } |
828 | 393 | if (!origin.OriginFile->ReachableFiles.count( |
829 | 393 | it->second.Unexpanded.OriginFile)) { |
830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, |
831 | 0 | name, state); |
832 | 0 | return false; |
833 | 0 | } |
834 | 393 | return SetupWorkflowConfigurePreset<T>( |
835 | 393 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); |
836 | 393 | } 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 | 879 | { | 822 | 879 | auto it = presets.find(name); | 823 | 879 | if (it == presets.end()) { | 824 | 582 | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, | 825 | 582 | state); | 826 | 582 | return false; | 827 | 582 | } | 828 | 297 | if (!origin.OriginFile->ReachableFiles.count( | 829 | 297 | it->second.Unexpanded.OriginFile)) { | 830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, | 831 | 0 | name, state); | 832 | 0 | return false; | 833 | 0 | } | 834 | 297 | return SetupWorkflowConfigurePreset<T>( | 835 | 297 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); | 836 | 297 | } |
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 | 198 | { | 822 | 198 | auto it = presets.find(name); | 823 | 198 | if (it == presets.end()) { | 824 | 144 | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, | 825 | 144 | state); | 826 | 144 | return false; | 827 | 144 | } | 828 | 54 | if (!origin.OriginFile->ReachableFiles.count( | 829 | 54 | it->second.Unexpanded.OriginFile)) { | 830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, | 831 | 0 | name, state); | 832 | 0 | return false; | 833 | 0 | } | 834 | 54 | return SetupWorkflowConfigurePreset<T>( | 835 | 54 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); | 836 | 54 | } |
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 | 42 | { | 822 | 42 | auto it = presets.find(name); | 823 | 42 | if (it == presets.end()) { | 824 | 15 | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, | 825 | 15 | state); | 826 | 15 | return false; | 827 | 15 | } | 828 | 27 | if (!origin.OriginFile->ReachableFiles.count( | 829 | 27 | it->second.Unexpanded.OriginFile)) { | 830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, | 831 | 0 | name, state); | 832 | 0 | return false; | 833 | 0 | } | 834 | 27 | return SetupWorkflowConfigurePreset<T>( | 835 | 27 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); | 836 | 27 | } |
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 | 123 | { | 822 | 123 | auto it = presets.find(name); | 823 | 123 | if (it == presets.end()) { | 824 | 108 | cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name, | 825 | 108 | state); | 826 | 108 | return false; | 827 | 108 | } | 828 | 15 | if (!origin.OriginFile->ReachableFiles.count( | 829 | 15 | it->second.Unexpanded.OriginFile)) { | 830 | 0 | cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType, | 831 | 0 | name, state); | 832 | 0 | return false; | 833 | 0 | } | 834 | 15 | return SetupWorkflowConfigurePreset<T>( | 835 | 15 | it->second.Unexpanded, configurePreset, workflowStepType, name, state); | 836 | 15 | } |
|
837 | | } |
838 | | |
839 | | ExpandMacroResult BaseMacroExpander::operator()( |
840 | | std::string const& macroNamespace, std::string const& macroName, |
841 | | std::string& macroOut, int version) const |
842 | 449k | { |
843 | 449k | if (macroNamespace.empty()) { |
844 | 333k | if (macroName == "sourceDir") { |
845 | 15.1k | macroOut += Graph.SourceDir; |
846 | 15.1k | return ExpandMacroResult::Ok; |
847 | 15.1k | } |
848 | 317k | if (macroName == "sourceParentDir") { |
849 | 10.0k | macroOut += cmSystemTools::GetParentDirectory(Graph.SourceDir); |
850 | 10.0k | return ExpandMacroResult::Ok; |
851 | 10.0k | } |
852 | 307k | if (macroName == "sourceDirName") { |
853 | 7.01k | macroOut += cmSystemTools::GetFilenameName(Graph.SourceDir); |
854 | 7.01k | return ExpandMacroResult::Ok; |
855 | 7.01k | } |
856 | 300k | if (macroName == "dollar") { |
857 | 15.2k | macroOut += '$'; |
858 | 15.2k | return ExpandMacroResult::Ok; |
859 | 15.2k | } |
860 | 285k | if (macroName == "hostSystemName") { |
861 | 3.92k | if (version < 3) { |
862 | 3 | return ExpandMacroResult::Error; |
863 | 3 | } |
864 | 3.91k | macroOut += cmSystemTools::GetSystemName(); |
865 | 3.91k | return ExpandMacroResult::Ok; |
866 | 3.92k | } |
867 | | // Enable fileDir macro expansion for non-preset expanders |
868 | 281k | if (macroName == "fileDir" && File) { |
869 | 133k | if (version < 4) { |
870 | 0 | return ExpandMacroResult::Error; |
871 | 0 | } |
872 | 133k | macroOut += cmSystemTools::GetParentDirectory(File.value()); |
873 | 133k | return ExpandMacroResult::Ok; |
874 | 133k | } |
875 | 147k | if (macroName == "pathListSep") { |
876 | 2.92k | if (version < 5) { |
877 | 12 | return ExpandMacroResult::Error; |
878 | 12 | } |
879 | 2.91k | macroOut += cmSystemTools::GetSystemPathlistSeparator(); |
880 | 2.91k | return ExpandMacroResult::Ok; |
881 | 2.92k | } |
882 | 147k | } |
883 | | |
884 | 261k | return ExpandMacroResult::Ignore; |
885 | 449k | } |
886 | | |
887 | | bool cmCMakePresetsGraphInternal::EqualsCondition::Evaluate( |
888 | | MacroExpanderVector const& expanders, int version, |
889 | | cm::optional<bool>& out) const |
890 | 1.07k | { |
891 | 1.07k | std::string lhs = this->Lhs; |
892 | 1.07k | CHECK_EXPAND(out, lhs, expanders, version); |
893 | | |
894 | 1.03k | std::string rhs = this->Rhs; |
895 | 1.03k | CHECK_EXPAND(out, rhs, expanders, version); |
896 | | |
897 | 1.01k | out = (lhs == rhs); |
898 | 1.01k | return true; |
899 | 1.03k | } |
900 | | |
901 | | bool cmCMakePresetsGraphInternal::InListCondition::Evaluate( |
902 | | MacroExpanderVector const& expanders, int version, |
903 | | cm::optional<bool>& out) const |
904 | 5.65k | { |
905 | 5.65k | std::string str = this->String; |
906 | 5.65k | CHECK_EXPAND(out, str, expanders, version); |
907 | | |
908 | 19.0k | for (auto item : this->List) { |
909 | 19.0k | CHECK_EXPAND(out, item, expanders, version); |
910 | 19.0k | if (str == item) { |
911 | 4.92k | out = true; |
912 | 4.92k | return true; |
913 | 4.92k | } |
914 | 19.0k | } |
915 | | |
916 | 630 | out = false; |
917 | 630 | return true; |
918 | 5.61k | } |
919 | | |
920 | | bool cmCMakePresetsGraphInternal::MatchesCondition::Evaluate( |
921 | | MacroExpanderVector const& expanders, int version, |
922 | | cm::optional<bool>& out) const |
923 | 15.1k | { |
924 | 15.1k | std::string str = this->String; |
925 | 15.1k | CHECK_EXPAND(out, str, expanders, version); |
926 | 15.0k | std::string regexStr = this->Regex; |
927 | 15.0k | CHECK_EXPAND(out, regexStr, expanders, version); |
928 | | |
929 | 14.9k | cmsys::RegularExpression regex; |
930 | 14.9k | if (!regex.compile(regexStr)) { |
931 | 321 | return false; |
932 | 321 | } |
933 | | |
934 | 14.6k | out = regex.find(str); |
935 | 14.6k | return true; |
936 | 14.9k | } |
937 | | |
938 | | bool cmCMakePresetsGraphInternal::AnyAllOfCondition::Evaluate( |
939 | | MacroExpanderVector const& expanders, int version, |
940 | | cm::optional<bool>& out) const |
941 | 6.51k | { |
942 | 22.4k | for (auto const& condition : this->Conditions) { |
943 | 22.4k | cm::optional<bool> result; |
944 | 22.4k | if (!condition->Evaluate(expanders, version, result)) { |
945 | 540 | out.reset(); |
946 | 540 | return false; |
947 | 540 | } |
948 | | |
949 | 21.9k | if (!result) { |
950 | 207 | out.reset(); |
951 | 207 | return true; |
952 | 207 | } |
953 | | |
954 | 21.7k | if (result == this->StopValue) { |
955 | 5.06k | out = result; |
956 | 5.06k | return true; |
957 | 5.06k | } |
958 | 21.7k | } |
959 | | |
960 | 702 | out = !this->StopValue; |
961 | 702 | return true; |
962 | 6.51k | } |
963 | | |
964 | | bool cmCMakePresetsGraphInternal::NotCondition::Evaluate( |
965 | | MacroExpanderVector const& expanders, int version, |
966 | | cm::optional<bool>& out) const |
967 | 702 | { |
968 | 702 | out.reset(); |
969 | 702 | if (!this->SubCondition->Evaluate(expanders, version, out)) { |
970 | 0 | out.reset(); |
971 | 0 | return false; |
972 | 0 | } |
973 | 702 | if (out) { |
974 | 702 | *out = !*out; |
975 | 702 | } |
976 | 702 | return true; |
977 | 702 | } |
978 | | |
979 | | bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetInherit( |
980 | | cmCMakePresetsGraph::Preset const& parentPreset) |
981 | 19.5k | { |
982 | 19.5k | auto& preset = *this; |
983 | 19.5k | ConfigurePreset const& parent = |
984 | 19.5k | static_cast<ConfigurePreset const&>(parentPreset); |
985 | 19.5k | InheritString(preset.Generator, parent.Generator); |
986 | 19.5k | InheritString(preset.Architecture, parent.Architecture); |
987 | 19.5k | InheritString(preset.Toolset, parent.Toolset); |
988 | 19.5k | if (!preset.ArchitectureStrategy) { |
989 | 19.5k | preset.ArchitectureStrategy = parent.ArchitectureStrategy; |
990 | 19.5k | } |
991 | 19.5k | if (!preset.ToolsetStrategy) { |
992 | 19.5k | preset.ToolsetStrategy = parent.ToolsetStrategy; |
993 | 19.5k | } |
994 | 19.5k | InheritString(preset.BinaryDir, parent.BinaryDir); |
995 | 19.5k | InheritString(preset.InstallDir, parent.InstallDir); |
996 | 19.5k | InheritString(preset.ToolchainFile, parent.ToolchainFile); |
997 | 19.5k | InheritString(preset.GraphVizFile, parent.GraphVizFile); |
998 | 19.5k | InheritMap(preset.Warnings, parent.Warnings); |
999 | 19.5k | InheritMap(preset.Errors, parent.Errors); |
1000 | 19.5k | InheritOptionalValue(preset.WarnSystemVars, parent.WarnSystemVars); |
1001 | 19.5k | InheritMap(preset.CacheVariables, parent.CacheVariables); |
1002 | 19.5k | InheritOptionalValue(preset.DebugOutput, parent.DebugOutput); |
1003 | 19.5k | InheritOptionalValue(preset.DebugTryCompile, parent.DebugTryCompile); |
1004 | 19.5k | InheritOptionalValue(preset.DebugFind, parent.DebugFind); |
1005 | 19.5k | InheritOptionalValue(preset.TraceMode, parent.TraceMode); |
1006 | 19.5k | InheritOptionalValue(preset.TraceFormat, parent.TraceFormat); |
1007 | 19.5k | InheritVector(preset.TraceSource, parent.TraceSource); |
1008 | 19.5k | InheritString(preset.TraceRedirect, parent.TraceRedirect); |
1009 | | |
1010 | 19.5k | return true; |
1011 | 19.5k | } |
1012 | | |
1013 | | bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetBeforeInherit() |
1014 | 66.3k | { |
1015 | 66.3k | auto& preset = *this; |
1016 | 66.3k | 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 | 66.3k | return true; |
1023 | 66.3k | } |
1024 | | |
1025 | | bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetAfterInherit( |
1026 | | int version, cmJSONState* state) |
1027 | 65.6k | { |
1028 | 65.6k | auto& preset = *this; |
1029 | 65.6k | if (!preset.Hidden) { |
1030 | 46.4k | if (version < 3) { |
1031 | 4.41k | if (preset.Generator.empty()) { |
1032 | 456 | cmCMakePresetsErrors::PRESET_MISSING_FIELD(preset.Name, "generator", |
1033 | 456 | state); |
1034 | 456 | return false; |
1035 | 456 | } |
1036 | 3.96k | if (preset.BinaryDir.empty()) { |
1037 | 90 | cmCMakePresetsErrors::PRESET_MISSING_FIELD(preset.Name, "binaryDir", |
1038 | 90 | state); |
1039 | 90 | return false; |
1040 | 90 | } |
1041 | 3.96k | } |
1042 | | |
1043 | 45.9k | 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 | 45.9k | if (preset.CacheVariables.count("") != 0) { |
1060 | 6 | this->ErrorDetail = "Empty cache variable names are not allowed"; |
1061 | 6 | return false; |
1062 | 6 | } |
1063 | 45.9k | } |
1064 | | |
1065 | 65.1k | return true; |
1066 | 65.6k | } |
1067 | | |
1068 | | bool cmCMakePresetsGraph::BuildPreset::VisitPresetInherit( |
1069 | | cmCMakePresetsGraph::Preset const& parentPreset) |
1070 | 1.27k | { |
1071 | 1.27k | auto& preset = *this; |
1072 | 1.27k | BuildPreset const& parent = static_cast<BuildPreset const&>(parentPreset); |
1073 | | |
1074 | 1.27k | InheritString(preset.ConfigurePreset, parent.ConfigurePreset); |
1075 | 1.27k | InheritOptionalValue(preset.InheritConfigureEnvironment, |
1076 | 1.27k | parent.InheritConfigureEnvironment); |
1077 | 1.27k | InheritOptionalValue(preset.Jobs, parent.Jobs); |
1078 | 1.27k | InheritVector(preset.Targets, parent.Targets); |
1079 | 1.27k | InheritString(preset.Configuration, parent.Configuration); |
1080 | 1.27k | InheritOptionalValue(preset.CleanFirst, parent.CleanFirst); |
1081 | 1.27k | InheritOptionalValue(preset.Verbose, parent.Verbose); |
1082 | 1.27k | InheritVector(preset.NativeToolOptions, parent.NativeToolOptions); |
1083 | 1.27k | if (!preset.ResolvePackageReferences) { |
1084 | 1.27k | preset.ResolvePackageReferences = parent.ResolvePackageReferences; |
1085 | 1.27k | } |
1086 | | |
1087 | 1.27k | return true; |
1088 | 1.27k | } |
1089 | | |
1090 | | bool cmCMakePresetsGraph::BuildPreset::VisitPresetAfterInherit( |
1091 | | int /* version */, cmJSONState* /*stat*/) |
1092 | 6.65k | { |
1093 | 6.65k | if (!this->Hidden && this->ConfigurePreset.empty()) { |
1094 | 717 | this->ErrorDetail = "Build presets must either be hidden or have an " |
1095 | 717 | "associated configure preset"; |
1096 | 717 | return false; |
1097 | 717 | } |
1098 | 5.94k | return true; |
1099 | 6.65k | } |
1100 | | |
1101 | | bool cmCMakePresetsGraph::TestPreset::VisitPresetInherit( |
1102 | | cmCMakePresetsGraph::Preset const& parentPreset) |
1103 | 1.11k | { |
1104 | 1.11k | auto& preset = *this; |
1105 | 1.11k | TestPreset const& parent = static_cast<TestPreset const&>(parentPreset); |
1106 | | |
1107 | 1.11k | InheritString(preset.ConfigurePreset, parent.ConfigurePreset); |
1108 | 1.11k | InheritOptionalValue(preset.InheritConfigureEnvironment, |
1109 | 1.11k | parent.InheritConfigureEnvironment); |
1110 | 1.11k | InheritString(preset.Configuration, parent.Configuration); |
1111 | 1.11k | InheritVector(preset.OverwriteConfigurationFile, |
1112 | 1.11k | parent.OverwriteConfigurationFile); |
1113 | | |
1114 | 1.11k | 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 | 1.11k | 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 | 1.11k | if (parent.Execution) { |
1175 | 384 | 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 | 384 | } else { |
1198 | 384 | preset.Execution = parent.Execution; |
1199 | 384 | } |
1200 | 384 | } |
1201 | | |
1202 | 1.11k | return true; |
1203 | 1.11k | } |
1204 | | |
1205 | | bool cmCMakePresetsGraph::TestPreset::VisitPresetAfterInherit( |
1206 | | int /* version */, cmJSONState* /*state*/) |
1207 | 5.05k | { |
1208 | 5.05k | if (!this->Hidden && this->ConfigurePreset.empty()) { |
1209 | 891 | this->ErrorDetail = "Test presets must either be hidden or have an " |
1210 | 891 | "associated configure preset"; |
1211 | 891 | return false; |
1212 | 891 | } |
1213 | 4.16k | return true; |
1214 | 5.05k | } |
1215 | | |
1216 | | bool cmCMakePresetsGraph::PackagePreset::VisitPresetInherit( |
1217 | | cmCMakePresetsGraph::Preset const& parentPreset) |
1218 | 441 | { |
1219 | 441 | auto& preset = *this; |
1220 | 441 | PackagePreset const& parent = |
1221 | 441 | static_cast<PackagePreset const&>(parentPreset); |
1222 | | |
1223 | 441 | InheritString(preset.ConfigurePreset, parent.ConfigurePreset); |
1224 | 441 | InheritOptionalValue(preset.InheritConfigureEnvironment, |
1225 | 441 | parent.InheritConfigureEnvironment); |
1226 | 441 | InheritVector(preset.Generators, parent.Generators); |
1227 | 441 | InheritVector(preset.Configurations, parent.Configurations); |
1228 | 441 | InheritMap(preset.Variables, parent.Variables); |
1229 | 441 | InheritOptionalValue(preset.DebugOutput, parent.DebugOutput); |
1230 | 441 | InheritOptionalValue(preset.VerboseOutput, parent.VerboseOutput); |
1231 | 441 | InheritString(preset.PackageName, parent.PackageName); |
1232 | 441 | InheritString(preset.PackageVersion, parent.PackageVersion); |
1233 | 441 | InheritString(preset.PackageDirectory, parent.PackageDirectory); |
1234 | 441 | InheritString(preset.VendorName, parent.VendorName); |
1235 | | |
1236 | 441 | return true; |
1237 | 441 | } |
1238 | | |
1239 | | bool cmCMakePresetsGraph::PackagePreset::VisitPresetAfterInherit( |
1240 | | int /* version */, cmJSONState* /*state*/) |
1241 | 3.38k | { |
1242 | 3.38k | if (!this->Hidden && this->ConfigurePreset.empty()) { |
1243 | 660 | this->ErrorDetail = "Package presets must either be hidden or have an " |
1244 | 660 | "associated configure preset"; |
1245 | 660 | return false; |
1246 | 660 | } |
1247 | 2.72k | return true; |
1248 | 3.38k | } |
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.41k | { |
1259 | 1.41k | return true; |
1260 | 1.41k | } |
1261 | | |
1262 | | std::string cmCMakePresetsGraph::GetFilename(std::string const& sourceDir) |
1263 | 21.2k | { |
1264 | 21.2k | return cmStrCat(sourceDir, "/CMakePresets.json"); |
1265 | 21.2k | } |
1266 | | |
1267 | | std::string cmCMakePresetsGraph::GetUserFilename(std::string const& sourceDir) |
1268 | 29.2k | { |
1269 | 29.2k | return cmStrCat(sourceDir, "/CMakeUserPresets.json"); |
1270 | 29.2k | } |
1271 | | |
1272 | | bool cmCMakePresetsGraph::ReadProjectPresets(std::string const& sourceDir, |
1273 | | std::string const& presetsFile, |
1274 | | ReadOption readFilesOption) |
1275 | 43.8k | { |
1276 | 43.8k | this->SourceDir = cmSystemTools::CollapseFullPath(sourceDir); |
1277 | 43.8k | this->ClearPresets(); |
1278 | | |
1279 | 43.8k | if (!this->ReadProjectPresetsInternal(presetsFile, readFilesOption)) { |
1280 | 34.1k | this->ClearPresets(); |
1281 | 34.1k | return false; |
1282 | 34.1k | } |
1283 | | |
1284 | 9.69k | return true; |
1285 | 43.8k | } |
1286 | | |
1287 | | std::string cmCMakePresetsGraph::GetGeneratorForPreset( |
1288 | | std::string const& presetName) const |
1289 | 96.8k | { |
1290 | 96.8k | auto configurePresetName = presetName; |
1291 | | |
1292 | 96.8k | auto buildPresetIterator = this->BuildPresets.find(presetName); |
1293 | 96.8k | if (buildPresetIterator != this->BuildPresets.end()) { |
1294 | 7.56k | configurePresetName = |
1295 | 7.56k | buildPresetIterator->second.Unexpanded.ConfigurePreset; |
1296 | 89.2k | } else { |
1297 | 89.2k | auto testPresetIterator = this->TestPresets.find(presetName); |
1298 | 89.2k | if (testPresetIterator != this->TestPresets.end()) { |
1299 | 9.22k | configurePresetName = |
1300 | 9.22k | testPresetIterator->second.Unexpanded.ConfigurePreset; |
1301 | 9.22k | } |
1302 | 89.2k | } |
1303 | | |
1304 | 96.8k | auto configurePresetIterator = |
1305 | 96.8k | this->ConfigurePresets.find(configurePresetName); |
1306 | 96.8k | if (configurePresetIterator != this->ConfigurePresets.end()) { |
1307 | 88.4k | return configurePresetIterator->second.Unexpanded.Generator; |
1308 | 88.4k | } |
1309 | | |
1310 | | // This should only happen if the preset is hidden |
1311 | | // or (for build or test presets) if ConfigurePreset is invalid. |
1312 | 8.42k | return {}; |
1313 | 96.8k | } |
1314 | | |
1315 | | template <typename T> |
1316 | | bool cmCMakePresetsGraph::ResolveDependentPresets( |
1317 | | std::map<std::string, PresetPair<T>>& presets) |
1318 | 34.1k | { |
1319 | 34.1k | for (auto& it : presets) { |
1320 | 4.97k | if (!it.second.Unexpanded.Hidden) { |
1321 | 4.96k | auto const configurePreset = |
1322 | 4.96k | this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset); |
1323 | 4.96k | if (configurePreset == this->ConfigurePresets.end()) { |
1324 | 1.04k | cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND( |
1325 | 1.04k | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, |
1326 | 1.04k | &this->parseState); |
1327 | 1.04k | return false; |
1328 | 1.04k | } |
1329 | 3.92k | if (!it.second.Unexpanded.OriginFile->ReachableFiles.count( |
1330 | 3.92k | 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.92k | if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) { |
1337 | 3.92k | it.second.Unexpanded.Environment.insert( |
1338 | 3.92k | configurePreset->second.Unexpanded.Environment.begin(), |
1339 | 3.92k | configurePreset->second.Unexpanded.Environment.end()); |
1340 | 3.92k | } |
1341 | 3.92k | } |
1342 | 3.93k | if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) { |
1343 | 432 | cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first, |
1344 | 432 | &this->parseState); |
1345 | 432 | return false; |
1346 | 432 | } |
1347 | 3.93k | } |
1348 | 32.6k | return true; |
1349 | 34.1k | } 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 | 12.1k | { | 1319 | 12.1k | for (auto& it : presets) { | 1320 | 2.53k | if (!it.second.Unexpanded.Hidden) { | 1321 | 2.53k | auto const configurePreset = | 1322 | 2.53k | this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset); | 1323 | 2.53k | if (configurePreset == this->ConfigurePresets.end()) { | 1324 | 696 | cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND( | 1325 | 696 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, | 1326 | 696 | &this->parseState); | 1327 | 696 | return false; | 1328 | 696 | } | 1329 | 1.83k | if (!it.second.Unexpanded.OriginFile->ReachableFiles.count( | 1330 | 1.83k | 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.83k | if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) { | 1337 | 1.83k | it.second.Unexpanded.Environment.insert( | 1338 | 1.83k | configurePreset->second.Unexpanded.Environment.begin(), | 1339 | 1.83k | configurePreset->second.Unexpanded.Environment.end()); | 1340 | 1.83k | } | 1341 | 1.83k | } | 1342 | 1.84k | if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) { | 1343 | 432 | cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first, | 1344 | 432 | &this->parseState); | 1345 | 432 | return false; | 1346 | 432 | } | 1347 | 1.84k | } | 1348 | 11.0k | return true; | 1349 | 12.1k | } |
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 | 11.0k | { | 1319 | 11.0k | 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 | 180 | cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND( | 1325 | 180 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, | 1326 | 180 | &this->parseState); | 1327 | 180 | return false; | 1328 | 180 | } | 1329 | 1.03k | if (!it.second.Unexpanded.OriginFile->ReachableFiles.count( | 1330 | 1.03k | 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.03k | if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) { | 1337 | 1.03k | it.second.Unexpanded.Environment.insert( | 1338 | 1.03k | configurePreset->second.Unexpanded.Environment.begin(), | 1339 | 1.03k | configurePreset->second.Unexpanded.Environment.end()); | 1340 | 1.03k | } | 1341 | 1.03k | } | 1342 | 1.03k | 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.03k | } | 1348 | 10.8k | return true; | 1349 | 11.0k | } |
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 | 10.8k | { | 1319 | 10.8k | 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 | 168 | cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND( | 1325 | 168 | it.first, T::kind(), it.second.Unexpanded.ConfigurePreset, | 1326 | 168 | &this->parseState); | 1327 | 168 | return false; | 1328 | 168 | } | 1329 | 1.04k | if (!it.second.Unexpanded.OriginFile->ReachableFiles.count( | 1330 | 1.04k | 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.04k | if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) { | 1337 | 1.04k | it.second.Unexpanded.Environment.insert( | 1338 | 1.04k | configurePreset->second.Unexpanded.Environment.begin(), | 1339 | 1.04k | configurePreset->second.Unexpanded.Environment.end()); | 1340 | 1.04k | } | 1341 | 1.04k | } | 1342 | 1.05k | 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.05k | } | 1348 | 10.7k | return true; | 1349 | 10.8k | } |
|
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 | 43.8k | { |
1366 | 43.8k | bool haveOneFile = false; |
1367 | | |
1368 | 43.8k | File* file; |
1369 | 43.8k | std::string filename; |
1370 | 43.8k | std::vector<File*> inProgressFiles; |
1371 | 43.8k | if (!presetsFile.empty()) { |
1372 | 14.6k | filename = presetsFile; |
1373 | 14.6k | if (cmSystemTools::FileExists(filename)) { |
1374 | 14.6k | if (!this->ReadJSONFile(filename, RootType::Any, ReadReason::Root, |
1375 | 14.6k | inProgressFiles, file, this->errors)) { |
1376 | 7.99k | return false; |
1377 | 7.99k | } |
1378 | 6.61k | haveOneFile = true; |
1379 | 6.61k | } |
1380 | 29.2k | } else { |
1381 | 29.2k | filename = GetUserFilename(this->SourceDir); |
1382 | 29.2k | if (cmSystemTools::FileExists(filename)) { |
1383 | 14.6k | if (!this->ReadJSONFile(filename, RootType::User, ReadReason::Root, |
1384 | 14.6k | inProgressFiles, file, this->errors)) { |
1385 | 7.99k | return false; |
1386 | 7.99k | } |
1387 | 6.61k | haveOneFile = true; |
1388 | 14.6k | } else { |
1389 | 14.6k | filename = GetFilename(this->SourceDir); |
1390 | 14.6k | if (cmSystemTools::FileExists(filename)) { |
1391 | 14.6k | if (!this->ReadJSONFile(filename, RootType::Project, ReadReason::Root, |
1392 | 14.6k | inProgressFiles, file, this->errors)) { |
1393 | 7.99k | return false; |
1394 | 7.99k | } |
1395 | 6.61k | haveOneFile = true; |
1396 | 6.61k | } |
1397 | 14.6k | } |
1398 | 29.2k | } |
1399 | 43.8k | assert(inProgressFiles.empty()); |
1400 | | |
1401 | 19.8k | 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 | 19.8k | bool result = ComputePresetInheritance(this->ConfigurePresets, *this) && |
1410 | 18.5k | ComputePresetInheritance(this->BuildPresets, *this) && |
1411 | 17.3k | ComputePresetInheritance(this->TestPresets, *this) && |
1412 | 15.9k | ComputePresetInheritance(this->PackagePresets, *this) && |
1413 | 14.8k | ComputePresetInheritance(this->WorkflowPresets, *this); |
1414 | 19.8k | if (!result) { |
1415 | 4.97k | return false; |
1416 | 4.97k | } |
1417 | | |
1418 | 38.4k | for (auto& it : this->ConfigurePresets) { |
1419 | 38.4k | if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) { |
1420 | 2.67k | cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first, |
1421 | 2.67k | &this->parseState); |
1422 | 2.67k | return false; |
1423 | 2.67k | } |
1424 | 38.4k | } |
1425 | | |
1426 | 12.1k | if (!ResolveDependentPresets(this->BuildPresets) || |
1427 | 11.0k | !ResolveDependentPresets(this->TestPresets) || |
1428 | 10.8k | !ResolveDependentPresets(this->PackagePresets)) { |
1429 | 1.47k | return false; |
1430 | 1.47k | } |
1431 | | |
1432 | 10.7k | for (auto& it : this->WorkflowPresets) { |
1433 | 1.02k | using Type = WorkflowPreset::WorkflowStep::Type; |
1434 | | |
1435 | 1.02k | ConfigurePreset const* configurePreset = nullptr; |
1436 | 1.38k | for (auto const& step : it.second.Unexpanded.Steps) { |
1437 | 1.38k | char const* const stepType = WorkflowStepTypeToString(step.PresetType); |
1438 | 1.38k | if (!configurePreset && step.PresetType != Type::Configure) { |
1439 | 138 | cmCMakePresetsErrors::FIRST_WORKFLOW_STEP_NOT_CONFIGURE( |
1440 | 138 | stepType, step.PresetName, &this->parseState); |
1441 | 138 | return false; |
1442 | 138 | } |
1443 | 1.25k | if (configurePreset && step.PresetType == Type::Configure) { |
1444 | 9 | cmCMakePresetsErrors::CONFIGURE_WORKFLOW_STEP_NOT_FIRST( |
1445 | 9 | stepType, step.PresetName, &this->parseState); |
1446 | 9 | return false; |
1447 | 9 | } |
1448 | | |
1449 | 1.24k | switch (step.PresetType) { |
1450 | 879 | case Type::Configure: |
1451 | 879 | result = TryReachPresetFromWorkflow( |
1452 | 879 | it.second.Unexpanded, this->ConfigurePresets, step.PresetName, |
1453 | 879 | stepType, configurePreset, &this->parseState); |
1454 | 879 | break; |
1455 | 198 | case Type::Build: |
1456 | 198 | result = TryReachPresetFromWorkflow( |
1457 | 198 | it.second.Unexpanded, this->BuildPresets, step.PresetName, |
1458 | 198 | stepType, configurePreset, &this->parseState); |
1459 | 198 | break; |
1460 | 42 | case Type::Test: |
1461 | 42 | result = TryReachPresetFromWorkflow( |
1462 | 42 | it.second.Unexpanded, this->TestPresets, step.PresetName, stepType, |
1463 | 42 | configurePreset, &this->parseState); |
1464 | 42 | break; |
1465 | 123 | case Type::Package: |
1466 | 123 | result = TryReachPresetFromWorkflow( |
1467 | 123 | it.second.Unexpanded, this->PackagePresets, step.PresetName, |
1468 | 123 | stepType, configurePreset, &this->parseState); |
1469 | 123 | break; |
1470 | 1.24k | } |
1471 | 1.24k | if (!result) { |
1472 | 855 | return false; |
1473 | 855 | } |
1474 | 1.24k | } |
1475 | | |
1476 | 27 | if (!configurePreset) { |
1477 | 12 | cmCMakePresetsErrors::NO_WORKFLOW_STEPS(it.first, &this->parseState); |
1478 | 12 | return false; |
1479 | 12 | } |
1480 | | |
1481 | 15 | 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 | 15 | } |
1487 | | |
1488 | 9.69k | return true; |
1489 | 10.7k | } |
1490 | | |
1491 | | void cmCMakePresetsGraph::ClearPresets() |
1492 | 77.9k | { |
1493 | 77.9k | this->ConfigurePresets.clear(); |
1494 | 77.9k | this->BuildPresets.clear(); |
1495 | 77.9k | this->TestPresets.clear(); |
1496 | 77.9k | this->PackagePresets.clear(); |
1497 | 77.9k | this->WorkflowPresets.clear(); |
1498 | | |
1499 | 77.9k | this->ConfigurePresetOrder.clear(); |
1500 | 77.9k | this->BuildPresetOrder.clear(); |
1501 | 77.9k | this->TestPresetOrder.clear(); |
1502 | 77.9k | this->PackagePresetOrder.clear(); |
1503 | 77.9k | this->WorkflowPresetOrder.clear(); |
1504 | | |
1505 | 77.9k | this->Files.clear(); |
1506 | 77.9k | } |
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 | } |