1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
10 #include <cm3p/json/value.h>
12 #include "cmCMakePresetsGraph.h"
13 #include "cmJSONHelpers.h"
14 #include "cmSystemTools.h"
16 #define CHECK_OK(expr) \
18 auto _result = expr; \
19 if (_result != true) \
23 namespace cmCMakePresetsGraphInternal
{
24 enum class ExpandMacroResult
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
,
46 ExpandMacroResult
ExpandMacro(std::string
& out
,
47 const std::string
& macroNamespace
,
48 const std::string
& macroName
,
49 MacroExpanderVector
const& macroExpanders
,
53 class cmCMakePresetsGraph::Condition
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
;
71 BaseMacroExpander(const cmCMakePresetsGraph
& graph
)
75 BaseMacroExpander(const cmCMakePresetsGraph
& graph
, const std::string
& file
)
80 ExpandMacroResult
operator()(const std::string
& macroNamespace
,
81 const std::string
& macroName
,
82 std::string
& macroOut
,
83 int version
) const override
;
87 class PresetMacroExpander
: public MacroExpander
89 cmCMakePresetsGraph
const& Graph
;
93 PresetMacroExpander(const cmCMakePresetsGraph
& graph
, const T
& 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") {
117 return ExpandMacroResult::Error
;
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
137 bool IsNull() const override
{ return true; }
140 class ConstCondition
: public cmCMakePresetsGraph::Condition
143 bool Evaluate(MacroExpanderVector
const& /*expanders*/, int /*version*/,
144 cm::optional
<bool>& out
) const override
153 class EqualsCondition
: public cmCMakePresetsGraph::Condition
156 bool Evaluate(MacroExpanderVector
const& expanders
, int version
,
157 cm::optional
<bool>& out
) const override
;
163 class InListCondition
: public cmCMakePresetsGraph::Condition
166 bool Evaluate(MacroExpanderVector
const& expanders
, int version
,
167 cm::optional
<bool>& out
) const override
;
170 std::vector
<std::string
> List
;
173 class MatchesCondition
: public cmCMakePresetsGraph::Condition
176 bool Evaluate(MacroExpanderVector
const& expanders
, int version
,
177 cm::optional
<bool>& out
) const override
;
183 class AnyAllOfCondition
: public cmCMakePresetsGraph::Condition
186 bool Evaluate(MacroExpanderVector
const& expanders
, int version
,
187 cm::optional
<bool>& out
) const override
;
189 std::vector
<std::unique_ptr
<Condition
>> Conditions
;
193 class NotCondition
: public cmCMakePresetsGraph::Condition
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
,
205 bool PresetNameHelper(std::string
& out
, const Json::Value
* value
,
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
,
221 bool PresetVectorIntHelper(std::vector
<int>& out
, const Json::Value
* value
,
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
,
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();