CMake Nightly Date Stamp
[kiteware-cmake.git] / Source / cmCMakePresetsGraphInternal.h
bloba67be21aedfa918a08f32f7f9805d15377637c3b
1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
3 #pragma once
5 #include <cstddef>
6 #include <memory>
7 #include <string>
8 #include <vector>
10 #include <cm3p/json/value.h>
12 #include "cmCMakePresetsGraph.h"
13 #include "cmJSONHelpers.h"
14 #include "cmSystemTools.h"
16 #define CHECK_OK(expr) \
17 do { \
18 auto _result = expr; \
19 if (_result != true) \
20 return _result; \
21 } while (false)
23 namespace cmCMakePresetsGraphInternal {
24 enum class ExpandMacroResult
26 Ok,
27 Ignore,
28 Error,
31 class MacroExpander
33 public:
34 virtual ExpandMacroResult operator()(const std::string& macroNamespace,
35 const std::string& macroName,
36 std::string& macroOut,
37 int version) const = 0;
38 virtual ~MacroExpander() = default;
40 using MacroExpanderVector = std::vector<std::unique_ptr<MacroExpander>>;
42 ExpandMacroResult ExpandMacros(std::string& out,
43 MacroExpanderVector const& macroExpanders,
44 int version);
46 ExpandMacroResult ExpandMacro(std::string& out,
47 const std::string& macroNamespace,
48 const std::string& macroName,
49 MacroExpanderVector const& macroExpanders,
50 int version);
53 class cmCMakePresetsGraph::Condition
55 public:
56 virtual ~Condition() = default;
58 virtual bool Evaluate(
59 const cmCMakePresetsGraphInternal::MacroExpanderVector& expanders,
60 int version, cm::optional<bool>& out) const = 0;
61 virtual bool IsNull() const { return false; }
64 namespace cmCMakePresetsGraphInternal {
65 class BaseMacroExpander : public MacroExpander
67 cmCMakePresetsGraph const& Graph;
68 cm::optional<std::string> File;
70 public:
71 BaseMacroExpander(const cmCMakePresetsGraph& graph)
72 : Graph(graph)
75 BaseMacroExpander(const cmCMakePresetsGraph& graph, const std::string& file)
76 : Graph(graph)
77 , File(file)
80 ExpandMacroResult operator()(const std::string& macroNamespace,
81 const std::string& macroName,
82 std::string& macroOut,
83 int version) const override;
86 template <class T>
87 class PresetMacroExpander : public MacroExpander
89 cmCMakePresetsGraph const& Graph;
90 T const& Preset;
92 public:
93 PresetMacroExpander(const cmCMakePresetsGraph& graph, const T& preset)
94 : Graph(graph)
95 , Preset(preset)
98 ExpandMacroResult operator()(const std::string& macroNamespace,
99 const std::string& macroName,
100 std::string& macroOut,
101 int version) const override
103 if (macroNamespace.empty()) {
104 if (macroName == "presetName") {
105 macroOut += Preset.Name;
106 return ExpandMacroResult::Ok;
108 if (macroName == "generator") {
109 // Generator only makes sense if preset is not hidden.
110 if (!Preset.Hidden) {
111 macroOut += Graph.GetGeneratorForPreset(Preset.Name);
113 return ExpandMacroResult::Ok;
115 if (macroName == "fileDir") {
116 if (version < 4) {
117 return ExpandMacroResult::Error;
119 macroOut +=
120 cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
121 return ExpandMacroResult::Ok;
124 return ExpandMacroResult::Ignore;
128 class NullCondition : public cmCMakePresetsGraph::Condition
130 bool Evaluate(MacroExpanderVector const& /*expanders*/, int /*version*/,
131 cm::optional<bool>& out) const override
133 out = true;
134 return true;
137 bool IsNull() const override { return true; }
140 class ConstCondition : public cmCMakePresetsGraph::Condition
142 public:
143 bool Evaluate(MacroExpanderVector const& /*expanders*/, int /*version*/,
144 cm::optional<bool>& out) const override
146 out = this->Value;
147 return true;
150 bool Value;
153 class EqualsCondition : public cmCMakePresetsGraph::Condition
155 public:
156 bool Evaluate(MacroExpanderVector const& expanders, int version,
157 cm::optional<bool>& out) const override;
159 std::string Lhs;
160 std::string Rhs;
163 class InListCondition : public cmCMakePresetsGraph::Condition
165 public:
166 bool Evaluate(MacroExpanderVector const& expanders, int version,
167 cm::optional<bool>& out) const override;
169 std::string String;
170 std::vector<std::string> List;
173 class MatchesCondition : public cmCMakePresetsGraph::Condition
175 public:
176 bool Evaluate(MacroExpanderVector const& expanders, int version,
177 cm::optional<bool>& out) const override;
179 std::string String;
180 std::string Regex;
183 class AnyAllOfCondition : public cmCMakePresetsGraph::Condition
185 public:
186 bool Evaluate(MacroExpanderVector const& expanders, int version,
187 cm::optional<bool>& out) const override;
189 std::vector<std::unique_ptr<Condition>> Conditions;
190 bool StopValue;
193 class NotCondition : public cmCMakePresetsGraph::Condition
195 public:
196 bool Evaluate(MacroExpanderVector const& expanders, int version,
197 cm::optional<bool>& out) const override;
199 std::unique_ptr<Condition> SubCondition;
202 bool PresetStringHelper(std::string& out, const Json::Value* value,
203 cmJSONState* state);
205 bool PresetNameHelper(std::string& out, const Json::Value* value,
206 cmJSONState* state);
208 bool PresetVectorStringHelper(std::vector<std::string>& out,
209 const Json::Value* value, cmJSONState* state);
211 bool PresetBoolHelper(bool& out, const Json::Value* value, cmJSONState* state);
213 bool PresetOptionalBoolHelper(cm::optional<bool>& out,
214 const Json::Value* value, cmJSONState* state);
216 bool PresetIntHelper(int& out, const Json::Value* value, cmJSONState* state);
218 bool PresetOptionalIntHelper(cm::optional<int>& out, const Json::Value* value,
219 cmJSONState* state);
221 bool PresetVectorIntHelper(std::vector<int>& out, const Json::Value* value,
222 cmJSONState* state);
224 bool ConfigurePresetsHelper(
225 std::vector<cmCMakePresetsGraph::ConfigurePreset>& out,
226 const Json::Value* value, cmJSONState* state);
228 bool BuildPresetsHelper(std::vector<cmCMakePresetsGraph::BuildPreset>& out,
229 const Json::Value* value, cmJSONState* state);
231 bool TestPresetsHelper(std::vector<cmCMakePresetsGraph::TestPreset>& out,
232 const Json::Value* value, cmJSONState* state);
234 bool PackagePresetsHelper(std::vector<cmCMakePresetsGraph::PackagePreset>& out,
235 const Json::Value* value, cmJSONState* state);
237 bool WorkflowPresetsHelper(
238 std::vector<cmCMakePresetsGraph::WorkflowPreset>& out,
239 const Json::Value* value, cmJSONState* state);
241 cmJSONHelper<std::nullptr_t> VendorHelper(const ErrorGenerator& error);
243 bool PresetConditionHelper(
244 std::shared_ptr<cmCMakePresetsGraph::Condition>& out,
245 const Json::Value* value, cmJSONState* state);
247 bool PresetVectorOneOrMoreStringHelper(std::vector<std::string>& out,
248 const Json::Value* value,
249 cmJSONState* state);
251 bool EnvironmentMapHelper(
252 std::map<std::string, cm::optional<std::string>>& out,
253 const Json::Value* value, cmJSONState* state);
255 cmJSONHelper<std::nullptr_t> SchemaHelper();