Coverage Report

Created: 2026-04-29 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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 <functional>
8
#include <iomanip>
9
#include <iostream>
10
#include <iterator>
11
#include <utility>
12
13
#include <cm/memory>
14
15
#include "cmsys/RegularExpression.hxx"
16
17
#include "cmCMakePresetsErrors.h"
18
#include "cmCMakePresetsGraphInternal.h"
19
#include "cmStringAlgorithms.h"
20
#include "cmSystemTools.h"
21
22
#define CHECK_EXPAND(out, field, expanders, version)                          \
23
0
  do {                                                                        \
24
0
    switch (ExpandMacros(field, expanders, version)) {                        \
25
0
      case ExpandMacroResult::Error:                                          \
26
0
        return false;                                                         \
27
0
      case ExpandMacroResult::Ignore:                                         \
28
0
        out.reset();                                                          \
29
0
        return true;                                                          \
30
0
      case ExpandMacroResult::Defer:                                          \
31
0
        CM_FALLTHROUGH;                                                       \
32
0
      case ExpandMacroResult::Ok:                                             \
33
0
        break;                                                                \
34
0
    }                                                                         \
35
0
  } while (false)
36
37
namespace {
38
enum class CycleStatus
39
{
40
  Unvisited,
41
  InProgress,
42
  Verified,
43
};
44
45
using ConfigurePreset = cmCMakePresetsGraph::ConfigurePreset;
46
using BuildPreset = cmCMakePresetsGraph::BuildPreset;
47
using TestPreset = cmCMakePresetsGraph::TestPreset;
48
using PackagePreset = cmCMakePresetsGraph::PackagePreset;
49
using WorkflowPreset = cmCMakePresetsGraph::WorkflowPreset;
50
template <typename T>
51
using PresetPair = cmCMakePresetsGraph::PresetPair<T>;
52
using ExpandMacroResult = cmCMakePresetsGraphInternal::ExpandMacroResult;
53
using MacroExpander = cmCMakePresetsGraphInternal::MacroExpander;
54
using MacroExpanderVector = cmCMakePresetsGraphInternal::MacroExpanderVector;
55
using BaseMacroExpander = cmCMakePresetsGraphInternal::BaseMacroExpander;
56
template <typename T>
57
using PresetMacroExpander =
58
  cmCMakePresetsGraphInternal::PresetMacroExpander<T>;
59
template <typename T>
60
using ImmediateMacroExpander =
61
  cmCMakePresetsGraphInternal::ImmediateMacroExpander<T>;
62
using cmCMakePresetsGraphInternal::ExpandMacros;
63
64
bool gSkipNewLine = true;
65
66
void InheritString(std::string& child, std::string const& parent)
67
0
{
68
0
  if (child.empty()) {
69
0
    child = parent;
70
0
  }
71
0
}
72
73
template <typename T>
74
void InheritOptionalValue(cm::optional<T>& child,
75
                          cm::optional<T> const& parent)
76
0
{
77
0
  if (!child) {
78
0
    child = parent;
79
0
  }
80
0
}
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<bool>(std::__1::optional<bool>&, std::__1::optional<bool> const&)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TraceEnableMode>(std::__1::optional<cmCMakePresetsGraph::TraceEnableMode>&, std::__1::optional<cmCMakePresetsGraph::TraceEnableMode> const&)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmTraceEnums::TraceOutputFormat>(std::__1::optional<cmTraceEnums::TraceOutputFormat>&, std::__1::optional<cmTraceEnums::TraceOutputFormat> const&)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<unsigned int>(std::__1::optional<unsigned int>&, std::__1::optional<unsigned int> const&)
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&)
81
82
template <typename T>
83
void InheritVector(std::vector<T>& child, std::vector<T> const& parent)
84
0
{
85
0
  if (child.empty()) {
86
0
    child = parent;
87
0
  }
88
0
}
89
90
template <typename K, typename V>
91
void InheritMap(std::map<K, V>& child, std::map<K, V> const& parent)
92
0
{
93
0
  for (auto const& item : parent) {
94
0
    child.insert(item);
95
0
  }
96
0
}
Unexecuted instantiation: 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&)
Unexecuted instantiation: 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&)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritMap<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&)
Unexecuted instantiation: 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&)
97
98
/**
99
 * Check preset inheritance for cycles (using a DAG check algorithm) while
100
 * also bubbling up fields through the inheritance hierarchy, then verify
101
 * that each preset has the required fields, either directly or through
102
 * inheritance.
103
 */
104
template <typename T>
105
bool VisitPreset(
106
  T& preset,
107
  std::map<std::string, cmCMakePresetsGraph::PresetPair<T>>& presets,
108
  std::map<std::string, CycleStatus> cycleStatus, cmCMakePresetsGraph& graph)
109
0
{
110
0
  switch (cycleStatus[preset.Name]) {
111
0
    case CycleStatus::InProgress:
112
0
      cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE(preset.Name,
113
0
                                                      &graph.parseState);
114
0
      return false;
115
0
    case CycleStatus::Verified:
116
0
      return true;
117
0
    default:
118
0
      break;
119
0
  }
120
121
0
  cycleStatus[preset.Name] = CycleStatus::InProgress;
122
123
0
  if (preset.Environment.count("") != 0) {
124
0
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(preset.Name, &graph.parseState);
125
0
    return false;
126
0
  }
127
128
0
  bool result = preset.VisitPresetBeforeInherit();
129
0
  if (!result) {
130
0
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(preset.Name, &graph.parseState);
131
0
    return false;
132
0
  }
133
134
0
  for (auto const& i : preset.Inherits) {
135
0
    auto parent = presets.find(i);
136
0
    if (parent == presets.end()) {
137
0
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(preset.Name,
138
0
                                                 &graph.parseState);
139
0
      return false;
140
0
    }
141
142
0
    auto& parentPreset = parent->second.Unexpanded;
143
0
    if (!preset.OriginFile->ReachableFiles.count(parentPreset.OriginFile)) {
144
0
      cmCMakePresetsErrors::INHERITED_PRESET_UNREACHABLE_FROM_FILE(
145
0
        preset.Name, &graph.parseState);
146
0
      return false;
147
0
    }
148
149
0
    if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) {
150
0
      return false;
151
0
    }
152
153
0
    result = preset.VisitPresetInherit(parentPreset);
154
0
    if (!result) {
155
0
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(preset.Name,
156
0
                                                 &graph.parseState);
157
0
      return false;
158
0
    }
159
160
0
    InheritMap(preset.Environment, parentPreset.Environment);
161
162
0
    if (!preset.ConditionEvaluator) {
163
0
      preset.ConditionEvaluator = parentPreset.ConditionEvaluator;
164
0
    }
165
0
  }
166
167
0
  if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) {
168
0
    preset.ConditionEvaluator.reset();
169
0
  }
170
171
0
  result = preset.VisitPresetAfterInherit(graph.GetVersion(preset),
172
0
                                          &graph.parseState);
173
0
  if (!result) {
174
0
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(preset.Name, &graph.parseState);
175
0
    return false;
176
0
  }
177
178
0
  cycleStatus[preset.Name] = CycleStatus::Verified;
179
0
  return true;
180
0
}
Unexecuted instantiation: 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&)
Unexecuted instantiation: 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&)
Unexecuted instantiation: 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&)
Unexecuted instantiation: 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&)
Unexecuted instantiation: 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&)
181
182
template <typename T>
183
bool ComputePresetInheritance(
184
  std::map<std::string, cmCMakePresetsGraph::PresetPair<T>>& presets,
185
  cmCMakePresetsGraph& graph)
186
0
{
187
0
  std::map<std::string, CycleStatus> cycleStatus;
188
0
  for (auto const& it : presets) {
189
0
    cycleStatus[it.first] = CycleStatus::Unvisited;
190
0
  }
191
192
0
  for (auto& it : presets) {
193
0
    auto& preset = it.second.Unexpanded;
194
0
    if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) {
195
0
      return false;
196
0
    }
197
0
  }
198
199
0
  return true;
200
0
}
Unexecuted instantiation: 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&)
Unexecuted instantiation: 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&)
Unexecuted instantiation: 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&)
Unexecuted instantiation: 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&)
Unexecuted instantiation: 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&)
201
202
constexpr char const* ValidPrefixes[] = {
203
  "",
204
  "env",
205
  "penv",
206
  "vendor",
207
};
208
209
bool PrefixesValidMacroNamespace(std::string const& str)
210
0
{
211
0
  return std::any_of(
212
0
    std::begin(ValidPrefixes), std::end(ValidPrefixes),
213
0
    [&str](char const* prefix) -> bool { return cmHasPrefix(prefix, str); });
214
0
}
215
216
bool IsValidMacroNamespace(std::string const& str)
217
0
{
218
0
  return std::any_of(
219
0
    std::begin(ValidPrefixes), std::end(ValidPrefixes),
220
0
    [&str](char const* prefix) -> bool { return str == prefix; });
221
0
}
222
223
ExpandMacroResult VisitEnv(std::string& value, CycleStatus& status,
224
                           MacroExpanderVector const& macroExpanders,
225
                           int version);
226
template <typename T>
227
class EnvironmentMacroExpander : public MacroExpander
228
{
229
  std::map<std::string, CycleStatus>& EnvCycles;
230
  cm::optional<T>& Out;
231
  MacroExpanderVector& MacroExpanders;
232
233
public:
234
  EnvironmentMacroExpander(MacroExpanderVector& macroExpanders,
235
                           cm::optional<T>& out,
236
                           std::map<std::string, CycleStatus>& envCycles)
237
0
    : EnvCycles(envCycles)
238
0
    , Out(out)
239
0
    , MacroExpanders(macroExpanders)
240
0
  {
241
0
  }
Unexecuted instantiation: 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> > >&)
Unexecuted instantiation: 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> > >&)
Unexecuted instantiation: 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> > >&)
Unexecuted instantiation: 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> > >&)
Unexecuted instantiation: 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> > >&)
242
  ExpandMacroResult operator()(std::string const& macroNamespace,
243
                               std::string const& macroName,
244
                               std::string& macroOut,
245
                               int version) const override
246
0
  {
247
0
    if (macroNamespace == "env" && !macroName.empty() && Out) {
248
0
      auto v = Out->Environment.find(macroName);
249
0
      if (v != Out->Environment.end() && v->second) {
250
0
        auto e =
251
0
          VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version);
252
0
        if (e != ExpandMacroResult::Ok) {
253
0
          return e;
254
0
        }
255
0
        macroOut += *v->second;
256
0
        return ExpandMacroResult::Ok;
257
0
      }
258
0
    }
259
260
0
    if (macroNamespace == "env" || macroNamespace == "penv") {
261
0
      if (macroName.empty()) {
262
0
        return ExpandMacroResult::Error;
263
0
      }
264
0
      if (cm::optional<std::string> value =
265
0
            cmSystemTools::GetEnvVar(macroName)) {
266
0
        macroOut += *value;
267
0
      }
268
0
      return ExpandMacroResult::Ok;
269
0
    }
270
271
0
    return ExpandMacroResult::Ignore;
272
0
  }
Unexecuted instantiation: 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
Unexecuted instantiation: 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
Unexecuted instantiation: 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
Unexecuted instantiation: 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
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
273
};
274
275
bool CheckExpandMacros(ConfigurePreset const& preset,
276
                       cm::optional<ConfigurePreset>& out,
277
                       MacroExpanderVector const& macroExpanders,
278
                       cmCMakePresetsGraph const* graph = nullptr)
279
0
{
280
0
  int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version;
281
282
0
  std::string binaryDir = preset.BinaryDir;
283
0
  CHECK_EXPAND(out, binaryDir, macroExpanders, version);
284
285
0
  if (!binaryDir.empty()) {
286
0
    if (graph) {
287
0
      if (!cmSystemTools::FileIsFullPath(binaryDir)) {
288
0
        binaryDir = cmStrCat(graph->SourceDir, '/', binaryDir);
289
0
      }
290
0
      out->BinaryDir = cmSystemTools::CollapseFullPath(binaryDir);
291
0
      cmSystemTools::ConvertToUnixSlashes(out->BinaryDir);
292
0
    } else {
293
      // Defer path normalization until the graph is merged, but store the
294
      // intermediate result.
295
0
      out->BinaryDir = binaryDir;
296
0
    }
297
0
  }
298
299
0
  if (!preset.InstallDir.empty()) {
300
0
    std::string installDir = preset.InstallDir;
301
0
    CHECK_EXPAND(out, installDir, macroExpanders, version);
302
303
0
    if (graph) {
304
0
      if (!cmSystemTools::FileIsFullPath(installDir)) {
305
0
        installDir = cmStrCat(graph->SourceDir, '/', installDir);
306
0
      }
307
0
      out->InstallDir = cmSystemTools::CollapseFullPath(installDir);
308
0
      cmSystemTools::ConvertToUnixSlashes(out->InstallDir);
309
0
    } else {
310
      // Defer path normalization until the graph is merged, but store the
311
      // intermediate result.
312
0
      out->InstallDir = installDir;
313
0
    }
314
0
  }
315
316
0
  if (!preset.ToolchainFile.empty()) {
317
0
    std::string toolchain = preset.ToolchainFile;
318
0
    CHECK_EXPAND(out, toolchain, macroExpanders, version);
319
0
    out->ToolchainFile = toolchain;
320
0
  }
321
322
0
  if (!preset.GraphVizFile.empty()) {
323
0
    std::string graphVizFile = preset.GraphVizFile;
324
0
    CHECK_EXPAND(out, graphVizFile, macroExpanders, version);
325
0
    out->GraphVizFile = graphVizFile;
326
0
  }
327
328
0
  for (auto& variable : out->CacheVariables) {
329
0
    if (variable.second) {
330
0
      CHECK_EXPAND(out, variable.second->Value, macroExpanders, version);
331
0
    }
332
0
  }
333
334
0
  return true;
335
0
}
336
337
bool CheckExpandMacros(BuildPreset const& preset,
338
                       cm::optional<BuildPreset>& out,
339
                       MacroExpanderVector const& macroExpanders,
340
                       cmCMakePresetsGraph const* graph = nullptr)
341
0
{
342
0
  int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version;
343
344
0
  for (auto& target : out->Targets) {
345
0
    CHECK_EXPAND(out, target, macroExpanders, version);
346
0
  }
347
348
0
  for (auto& nativeToolOption : out->NativeToolOptions) {
349
0
    CHECK_EXPAND(out, nativeToolOption, macroExpanders, version);
350
0
  }
351
352
0
  return true;
353
0
}
354
355
bool CheckExpandMacros(TestPreset const& preset, cm::optional<TestPreset>& out,
356
                       MacroExpanderVector const& macroExpanders,
357
                       cmCMakePresetsGraph const* graph = nullptr)
358
0
{
359
0
  int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version;
360
361
0
  for (auto& overwrite : out->OverwriteConfigurationFile) {
362
0
    CHECK_EXPAND(out, overwrite, macroExpanders, version);
363
0
  }
364
365
0
  if (out->Output) {
366
0
    CHECK_EXPAND(out, out->Output->OutputLogFile, macroExpanders, version);
367
0
    CHECK_EXPAND(out, out->Output->OutputJUnitFile, macroExpanders, version);
368
0
  }
369
370
0
  if (out->Filter) {
371
0
    if (out->Filter->Include) {
372
0
      CHECK_EXPAND(out, out->Filter->Include->Name, macroExpanders, version);
373
0
      CHECK_EXPAND(out, out->Filter->Include->Label, macroExpanders, version);
374
375
0
      if (out->Filter->Include->Index) {
376
0
        CHECK_EXPAND(out, out->Filter->Include->Index->IndexFile,
377
0
                     macroExpanders, version);
378
0
      }
379
0
    }
380
381
0
    if (out->Filter->Exclude) {
382
0
      CHECK_EXPAND(out, out->Filter->Exclude->Name, macroExpanders, version);
383
0
      CHECK_EXPAND(out, out->Filter->Exclude->Label, macroExpanders, version);
384
385
0
      if (out->Filter->Exclude->Fixtures) {
386
0
        CHECK_EXPAND(out, out->Filter->Exclude->Fixtures->Any, macroExpanders,
387
0
                     version);
388
0
        CHECK_EXPAND(out, out->Filter->Exclude->Fixtures->Setup,
389
0
                     macroExpanders, version);
390
0
        CHECK_EXPAND(out, out->Filter->Exclude->Fixtures->Cleanup,
391
0
                     macroExpanders, version);
392
0
      }
393
0
    }
394
0
  }
395
396
0
  if (out->Execution) {
397
0
    CHECK_EXPAND(out, out->Execution->ResourceSpecFile, macroExpanders,
398
0
                 version);
399
0
  }
400
401
0
  return true;
402
0
}
403
404
bool CheckExpandMacros(PackagePreset const& preset,
405
                       cm::optional<PackagePreset>& out,
406
                       MacroExpanderVector const& macroExpanders,
407
                       cmCMakePresetsGraph const* graph = nullptr)
408
0
{
409
0
  int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version;
410
411
0
  for (auto& variable : out->Variables) {
412
0
    CHECK_EXPAND(out, variable.second, macroExpanders, version);
413
0
  }
414
415
0
  CHECK_EXPAND(out, out->ConfigFile, macroExpanders, version);
416
0
  CHECK_EXPAND(out, out->PackageName, macroExpanders, version);
417
0
  CHECK_EXPAND(out, out->PackageVersion, macroExpanders, version);
418
0
  CHECK_EXPAND(out, out->PackageDirectory, macroExpanders, version);
419
0
  CHECK_EXPAND(out, out->VendorName, macroExpanders, version);
420
421
0
  return true;
422
0
}
423
424
bool CheckExpandMacros(WorkflowPreset const& /*preset*/,
425
                       cm::optional<WorkflowPreset>& /*out*/,
426
                       MacroExpanderVector const& /*macroExpanders*/,
427
                       cmCMakePresetsGraph const* /*graph*/ = nullptr)
428
0
{
429
0
  return true;
430
0
}
431
432
template <typename T>
433
bool ExpandMacros(cmCMakePresetsGraph* graph, T const& preset,
434
                  cm::optional<T>& out)
435
0
{
436
0
  out.emplace(preset);
437
438
0
  std::map<std::string, CycleStatus> envCycles;
439
0
  for (auto const& v : out->Environment) {
440
0
    envCycles[v.first] = CycleStatus::Unvisited;
441
0
  }
442
443
0
  MacroExpanderVector macroExpanders{};
444
445
0
  macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph));
446
0
  macroExpanders.push_back(
447
0
    cm::make_unique<PresetMacroExpander<T>>(*graph, preset));
448
0
  macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>(
449
0
    macroExpanders, out, envCycles));
450
451
0
  for (auto& v : out->Environment) {
452
0
    if (v.second) {
453
0
      switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders,
454
0
                       graph->GetVersion(preset))) {
455
0
        case ExpandMacroResult::Error:
456
0
          cmCMakePresetsErrors::INVALID_PRESET_NAMED(preset.Name,
457
0
                                                     &graph->parseState);
458
0
          return false;
459
0
        case ExpandMacroResult::Ignore:
460
0
          out.reset();
461
0
          return true;
462
0
        case ExpandMacroResult::Defer:
463
0
          CM_FALLTHROUGH;
464
0
        case ExpandMacroResult::Ok:
465
0
          break;
466
0
      }
467
0
    }
468
0
  }
469
470
0
  if (preset.ConditionEvaluator) {
471
0
    cm::optional<bool> result;
472
0
    if (!preset.ConditionEvaluator->Evaluate(
473
0
          macroExpanders, graph->GetVersion(preset), result)) {
474
0
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(preset.Name,
475
0
                                                 &graph->parseState);
476
0
      return false;
477
0
    }
478
0
    if (!result) {
479
0
      out.reset();
480
0
      return true;
481
0
    }
482
0
    out->ConditionResult = *result;
483
0
  }
484
485
0
  return CheckExpandMacros(preset, out, macroExpanders, graph);
486
0
}
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::ConfigurePreset const&, std::__1::optional<cmCMakePresetsGraph::ConfigurePreset>&)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::BuildPreset const&, std::__1::optional<cmCMakePresetsGraph::BuildPreset>&)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::TestPreset const&, std::__1::optional<cmCMakePresetsGraph::TestPreset>&)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::PackagePreset const&, std::__1::optional<cmCMakePresetsGraph::PackagePreset>&)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::WorkflowPreset const&, std::__1::optional<cmCMakePresetsGraph::WorkflowPreset>&)
487
488
ExpandMacroResult VisitEnv(std::string& value, CycleStatus& status,
489
                           MacroExpanderVector const& macroExpanders,
490
                           int version)
491
0
{
492
0
  if (status == CycleStatus::Verified) {
493
0
    return ExpandMacroResult::Ok;
494
0
  }
495
0
  if (status == CycleStatus::InProgress) {
496
0
    return ExpandMacroResult::Error;
497
0
  }
498
499
0
  status = CycleStatus::InProgress;
500
0
  auto e = ExpandMacros(value, macroExpanders, version);
501
0
  if (e != ExpandMacroResult::Ok) {
502
0
    return e;
503
0
  }
504
0
  status = CycleStatus::Verified;
505
0
  return ExpandMacroResult::Ok;
506
0
}
507
508
void PrintPresets(
509
  std::vector<cmCMakePresetsGraph::Preset const*> const& presets)
510
0
{
511
0
  if (presets.empty()) {
512
0
    return;
513
0
  }
514
515
0
  auto presetWithLongestName =
516
0
    std::max_element(presets.begin(), presets.end(),
517
0
                     [](cmCMakePresetsGraph::Preset const* a,
518
0
                        cmCMakePresetsGraph::Preset const* b) {
519
0
                       return a->Name.length() < b->Name.length();
520
0
                     });
521
0
  auto longestLength = (*presetWithLongestName)->Name.length();
522
523
0
  for (auto const* preset : presets) {
524
0
    std::string name = cmStrCat("  \"", preset->Name, '"');
525
0
    if (!preset->DisplayName.empty()) {
526
0
      int const width = static_cast<int>(longestLength + name.length() -
527
0
                                         preset->Name.length());
528
0
      std::cout << std::left << std::setw(width) << name << " - "
529
0
                << preset->DisplayName << '\n';
530
0
    } else {
531
0
      std::cout << name << '\n';
532
0
    }
533
0
  }
534
0
}
535
536
struct AlwaysTrue
537
{
538
  template <typename T>
539
  constexpr bool operator()(T const&) const noexcept
540
0
  {
541
0
    return true;
542
0
  }
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::AlwaysTrue::operator()<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph::ConfigurePreset const&) const
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::AlwaysTrue::operator()<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::BuildPreset const&) const
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::AlwaysTrue::operator()<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::TestPreset const&) const
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::AlwaysTrue::operator()<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::PackagePreset const&) const
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::AlwaysTrue::operator()<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph::WorkflowPreset const&) const
543
};
544
545
template <typename PresetType, typename Filter = AlwaysTrue>
546
void PrintPresetList(
547
  cmCMakePresetsGraph const* const graph,
548
  std::map<std::string, cmCMakePresetsGraph::PresetPair<PresetType>>
549
    cmCMakePresetsGraph::*data,
550
  std::vector<std::string> cmCMakePresetsGraph::*index, Filter filter = {})
551
0
{
552
0
  std::vector<cmCMakePresetsGraph::Preset const*> presets;
553
0
  presets.reserve((graph->*index).size());
554
0
  for (auto const& p : graph->*index) {
555
0
    auto const& preset = (graph->*data).at(p);
556
0
    if (!preset.Unexpanded.Hidden && preset.Expanded &&
557
0
        preset.Expanded->ConditionResult && filter(preset.Unexpanded)) {
558
0
      presets.push_back(
559
0
        static_cast<cmCMakePresetsGraph::Preset const*>(&preset.Unexpanded));
560
0
    }
561
0
  }
562
563
0
  if (!presets.empty()) {
564
0
    std::cout << (gSkipNewLine ? "" : "\n") << "Available "
565
0
              << PresetType::kind() << " presets:\n\n";
566
0
    gSkipNewLine = false;
567
0
    PrintPresets(presets);
568
0
  }
569
0
}
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::ConfigurePreset, (anonymous namespace)::AlwaysTrue>(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::*, (anonymous namespace)::AlwaysTrue)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::ConfigurePreset, std::__1::function<bool (cmCMakePresetsGraph::ConfigurePreset const&)> >(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::*, std::__1::function<bool (cmCMakePresetsGraph::ConfigurePreset const&)>)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::BuildPreset, (anonymous namespace)::AlwaysTrue>(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::*, (anonymous namespace)::AlwaysTrue)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::TestPreset, (anonymous namespace)::AlwaysTrue>(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::*, (anonymous namespace)::AlwaysTrue)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::PackagePreset, (anonymous namespace)::AlwaysTrue>(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::*, (anonymous namespace)::AlwaysTrue)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::PackagePreset, std::__1::function<bool (cmCMakePresetsGraph::PackagePreset const&)> >(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::*, std::__1::function<bool (cmCMakePresetsGraph::PackagePreset const&)>)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::PrintPresetList<cmCMakePresetsGraph::WorkflowPreset, (anonymous namespace)::AlwaysTrue>(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::*, (anonymous namespace)::AlwaysTrue)
570
}
571
572
template <typename T>
573
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros(T& preset)
574
0
{
575
0
  MacroExpanderVector macroExpanders{};
576
0
  macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset));
577
0
  cm::optional<T> out = preset;
578
0
  bool result = CheckExpandMacros(preset, out, macroExpanders);
579
0
  if (out.has_value()) {
580
0
    preset = out.value();
581
0
  };
582
0
  return result;
583
0
}
Unexecuted instantiation: bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph::ConfigurePreset&)
Unexecuted instantiation: bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::BuildPreset&)
Unexecuted instantiation: bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::TestPreset&)
Unexecuted instantiation: bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::PackagePreset&)
Unexecuted instantiation: bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph::WorkflowPreset&)
584
585
template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<
586
  ConfigurePreset>(ConfigurePreset&);
587
template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<BuildPreset>(
588
  BuildPreset&);
589
template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<TestPreset>(
590
  TestPreset&);
591
template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<
592
  PackagePreset>(PackagePreset&);
593
template bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<
594
  WorkflowPreset>(WorkflowPreset&);
595
596
ExpandMacroResult cmCMakePresetsGraphInternal::ExpandMacros(
597
  std::string& out, MacroExpanderVector const& macroExpanders, int version)
598
0
{
599
0
  std::string result;
600
0
  std::string macroNamespace;
601
0
  std::string macroName;
602
603
0
  enum class State
604
0
  {
605
0
    Default,
606
0
    MacroNamespace,
607
0
    MacroName,
608
0
  } state = State::Default;
609
610
0
  for (auto c : out) {
611
0
    switch (state) {
612
0
      case State::Default:
613
0
        if (c == '$') {
614
0
          state = State::MacroNamespace;
615
0
        } else {
616
0
          result += c;
617
0
        }
618
0
        break;
619
620
0
      case State::MacroNamespace:
621
0
        if (c == '{') {
622
0
          if (IsValidMacroNamespace(macroNamespace)) {
623
0
            state = State::MacroName;
624
0
          } else {
625
0
            result += '$';
626
0
            result += macroNamespace;
627
0
            result += '{';
628
0
            macroNamespace.clear();
629
0
            state = State::Default;
630
0
          }
631
0
        } else {
632
0
          macroNamespace += c;
633
0
          if (!PrefixesValidMacroNamespace(macroNamespace)) {
634
0
            result += '$';
635
0
            result += macroNamespace;
636
0
            macroNamespace.clear();
637
0
            state = State::Default;
638
0
          }
639
0
        }
640
0
        break;
641
642
0
      case State::MacroName:
643
0
        if (c == '}') {
644
0
          auto e = ExpandMacro(result, macroNamespace, macroName,
645
0
                               macroExpanders, version);
646
0
          if (e != ExpandMacroResult::Ok) {
647
0
            return e;
648
0
          }
649
0
          macroNamespace.clear();
650
0
          macroName.clear();
651
0
          state = State::Default;
652
0
        } else {
653
0
          macroName += c;
654
0
        }
655
0
        break;
656
0
    }
657
0
  }
658
659
0
  switch (state) {
660
0
    case State::Default:
661
0
      break;
662
0
    case State::MacroNamespace:
663
0
      result += '$';
664
0
      result += macroNamespace;
665
0
      break;
666
0
    case State::MacroName:
667
0
      return ExpandMacroResult::Error;
668
0
  }
669
670
0
  out = std::move(result);
671
0
  return ExpandMacroResult::Ok;
672
0
}
673
674
ExpandMacroResult cmCMakePresetsGraphInternal::ExpandMacro(
675
  std::string& out, std::string const& macroNamespace,
676
  std::string const& macroName, MacroExpanderVector const& macroExpanders,
677
  int version)
678
0
{
679
0
  for (auto const& macroExpander : macroExpanders) {
680
0
    auto result = (*macroExpander)(macroNamespace, macroName, out, version);
681
0
    if (result != ExpandMacroResult::Ignore) {
682
0
      return result;
683
0
    }
684
0
  }
685
686
0
  if (macroNamespace == "vendor") {
687
0
    return ExpandMacroResult::Ignore;
688
0
  }
689
690
0
  return ExpandMacroResult::Error;
691
0
}
692
693
namespace {
694
template <typename T>
695
bool SetupWorkflowConfigurePreset(T const& preset,
696
                                  ConfigurePreset const*& configurePreset,
697
                                  cmJSONState* state)
698
0
{
699
0
  if (preset.ConfigurePreset != configurePreset->Name) {
700
0
    cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(configurePreset->Name, state);
701
0
    return false;
702
0
  }
703
0
  return true;
704
0
}
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::SetupWorkflowConfigurePreset<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::BuildPreset const&, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::SetupWorkflowConfigurePreset<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::TestPreset const&, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*)
Unexecuted instantiation: cmCMakePresetsGraph.cxx:bool (anonymous namespace)::SetupWorkflowConfigurePreset<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::PackagePreset const&, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*)
705
706
template <>
707
bool SetupWorkflowConfigurePreset<ConfigurePreset>(
708
  ConfigurePreset const& preset, ConfigurePreset const*& configurePreset,
709
  cmJSONState*)
710
0
{
711
0
  configurePreset = &preset;
712
0
  return true;
713
0
}
714
715
template <typename T>
716
bool TryReachPresetFromWorkflow(
717
  WorkflowPreset const& origin,
718
  std::map<std::string, PresetPair<T>> const& presets, std::string const& name,
719
  ConfigurePreset const*& configurePreset, cmJSONState* state)
720
0
{
721
0
  auto it = presets.find(name);
722
0
  if (it == presets.end()) {
723
0
    cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(name, state);
724
0
    return false;
725
0
  }
726
0
  if (!origin.OriginFile->ReachableFiles.count(
727
0
        it->second.Unexpanded.OriginFile)) {
728
0
    cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(name, state);
729
0
    return false;
730
0
  }
731
0
  return SetupWorkflowConfigurePreset<T>(it->second.Unexpanded,
732
0
                                         configurePreset, state);
733
0
}
Unexecuted instantiation: 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&, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*)
Unexecuted instantiation: 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&, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*)
Unexecuted instantiation: 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&, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*)
Unexecuted instantiation: 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&, cmCMakePresetsGraph::ConfigurePreset const*&, cmJSONState*)
734
}
735
736
ExpandMacroResult BaseMacroExpander::operator()(
737
  std::string const& macroNamespace, std::string const& macroName,
738
  std::string& macroOut, int version) const
739
0
{
740
0
  if (macroNamespace.empty()) {
741
0
    if (macroName == "sourceDir") {
742
0
      macroOut += Graph.SourceDir;
743
0
      return ExpandMacroResult::Ok;
744
0
    }
745
0
    if (macroName == "sourceParentDir") {
746
0
      macroOut += cmSystemTools::GetParentDirectory(Graph.SourceDir);
747
0
      return ExpandMacroResult::Ok;
748
0
    }
749
0
    if (macroName == "sourceDirName") {
750
0
      macroOut += cmSystemTools::GetFilenameName(Graph.SourceDir);
751
0
      return ExpandMacroResult::Ok;
752
0
    }
753
0
    if (macroName == "dollar") {
754
0
      macroOut += '$';
755
0
      return ExpandMacroResult::Ok;
756
0
    }
757
0
    if (macroName == "hostSystemName") {
758
0
      if (version < 3) {
759
0
        return ExpandMacroResult::Error;
760
0
      }
761
0
      macroOut += cmSystemTools::GetSystemName();
762
0
      return ExpandMacroResult::Ok;
763
0
    }
764
    // Enable fileDir macro expansion for non-preset expanders
765
0
    if (macroName == "fileDir" && File) {
766
0
      if (version < 4) {
767
0
        return ExpandMacroResult::Error;
768
0
      }
769
0
      macroOut += cmSystemTools::GetParentDirectory(File.value());
770
0
      return ExpandMacroResult::Ok;
771
0
    }
772
0
    if (macroName == "pathListSep") {
773
0
      if (version < 5) {
774
0
        return ExpandMacroResult::Error;
775
0
      }
776
0
      macroOut += cmSystemTools::GetSystemPathlistSeparator();
777
0
      return ExpandMacroResult::Ok;
778
0
    }
779
0
  }
780
781
0
  return ExpandMacroResult::Ignore;
782
0
}
783
784
bool cmCMakePresetsGraphInternal::EqualsCondition::Evaluate(
785
  MacroExpanderVector const& expanders, int version,
786
  cm::optional<bool>& out) const
787
0
{
788
0
  std::string lhs = this->Lhs;
789
0
  CHECK_EXPAND(out, lhs, expanders, version);
790
791
0
  std::string rhs = this->Rhs;
792
0
  CHECK_EXPAND(out, rhs, expanders, version);
793
794
0
  out = (lhs == rhs);
795
0
  return true;
796
0
}
797
798
bool cmCMakePresetsGraphInternal::InListCondition::Evaluate(
799
  MacroExpanderVector const& expanders, int version,
800
  cm::optional<bool>& out) const
801
0
{
802
0
  std::string str = this->String;
803
0
  CHECK_EXPAND(out, str, expanders, version);
804
805
0
  for (auto item : this->List) {
806
0
    CHECK_EXPAND(out, item, expanders, version);
807
0
    if (str == item) {
808
0
      out = true;
809
0
      return true;
810
0
    }
811
0
  }
812
813
0
  out = false;
814
0
  return true;
815
0
}
816
817
bool cmCMakePresetsGraphInternal::MatchesCondition::Evaluate(
818
  MacroExpanderVector const& expanders, int version,
819
  cm::optional<bool>& out) const
820
0
{
821
0
  std::string str = this->String;
822
0
  CHECK_EXPAND(out, str, expanders, version);
823
0
  std::string regexStr = this->Regex;
824
0
  CHECK_EXPAND(out, regexStr, expanders, version);
825
826
0
  cmsys::RegularExpression regex;
827
0
  if (!regex.compile(regexStr)) {
828
0
    return false;
829
0
  }
830
831
0
  out = regex.find(str);
832
0
  return true;
833
0
}
834
835
bool cmCMakePresetsGraphInternal::AnyAllOfCondition::Evaluate(
836
  MacroExpanderVector const& expanders, int version,
837
  cm::optional<bool>& out) const
838
0
{
839
0
  for (auto const& condition : this->Conditions) {
840
0
    cm::optional<bool> result;
841
0
    if (!condition->Evaluate(expanders, version, result)) {
842
0
      out.reset();
843
0
      return false;
844
0
    }
845
846
0
    if (!result) {
847
0
      out.reset();
848
0
      return true;
849
0
    }
850
851
0
    if (result == this->StopValue) {
852
0
      out = result;
853
0
      return true;
854
0
    }
855
0
  }
856
857
0
  out = !this->StopValue;
858
0
  return true;
859
0
}
860
861
bool cmCMakePresetsGraphInternal::NotCondition::Evaluate(
862
  MacroExpanderVector const& expanders, int version,
863
  cm::optional<bool>& out) const
864
0
{
865
0
  out.reset();
866
0
  if (!this->SubCondition->Evaluate(expanders, version, out)) {
867
0
    out.reset();
868
0
    return false;
869
0
  }
870
0
  if (out) {
871
0
    *out = !*out;
872
0
  }
873
0
  return true;
874
0
}
875
876
bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetInherit(
877
  cmCMakePresetsGraph::Preset const& parentPreset)
878
0
{
879
0
  auto& preset = *this;
880
0
  ConfigurePreset const& parent =
881
0
    static_cast<ConfigurePreset const&>(parentPreset);
882
0
  InheritString(preset.Generator, parent.Generator);
883
0
  InheritString(preset.Architecture, parent.Architecture);
884
0
  InheritString(preset.Toolset, parent.Toolset);
885
0
  if (!preset.ArchitectureStrategy) {
886
0
    preset.ArchitectureStrategy = parent.ArchitectureStrategy;
887
0
  }
888
0
  if (!preset.ToolsetStrategy) {
889
0
    preset.ToolsetStrategy = parent.ToolsetStrategy;
890
0
  }
891
0
  InheritString(preset.BinaryDir, parent.BinaryDir);
892
0
  InheritString(preset.InstallDir, parent.InstallDir);
893
0
  InheritString(preset.ToolchainFile, parent.ToolchainFile);
894
0
  InheritString(preset.GraphVizFile, parent.GraphVizFile);
895
0
  InheritMap(preset.Warnings, parent.Warnings);
896
0
  InheritMap(preset.Errors, parent.Errors);
897
0
  InheritOptionalValue(preset.WarnSystemVars, parent.WarnSystemVars);
898
0
  InheritMap(preset.CacheVariables, parent.CacheVariables);
899
0
  InheritOptionalValue(preset.DebugOutput, parent.DebugOutput);
900
0
  InheritOptionalValue(preset.DebugTryCompile, parent.DebugTryCompile);
901
0
  InheritOptionalValue(preset.DebugFind, parent.DebugFind);
902
0
  InheritOptionalValue(preset.TraceMode, parent.TraceMode);
903
0
  InheritOptionalValue(preset.TraceFormat, parent.TraceFormat);
904
0
  InheritVector(preset.TraceSource, parent.TraceSource);
905
0
  InheritString(preset.TraceRedirect, parent.TraceRedirect);
906
907
0
  return true;
908
0
}
909
910
bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetBeforeInherit()
911
0
{
912
0
  auto& preset = *this;
913
0
  if (preset.Environment.count("") != 0) {
914
0
    return false;
915
0
  }
916
917
0
  return true;
918
0
}
919
920
bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetAfterInherit(
921
  int version, cmJSONState* state)
922
0
{
923
0
  auto& preset = *this;
924
0
  if (!preset.Hidden) {
925
0
    if (version < 3) {
926
0
      if (preset.Generator.empty()) {
927
0
        cmCMakePresetsErrors::PRESET_MISSING_FIELD(preset.Name, "generator",
928
0
                                                   state);
929
0
        return false;
930
0
      }
931
0
      if (preset.BinaryDir.empty()) {
932
0
        cmCMakePresetsErrors::PRESET_MISSING_FIELD(preset.Name, "binaryDir",
933
0
                                                   state);
934
0
        return false;
935
0
      }
936
0
    }
937
938
0
    for (auto const& w : preset.Warnings) {
939
0
      auto const ei = preset.Errors.find(w.first);
940
0
      if (ei != preset.Errors.end()) {
941
0
        if (w.second == false && ei->second == true) {
942
0
          return false;
943
0
        }
944
0
      }
945
0
    }
946
947
0
    if (preset.CacheVariables.count("") != 0) {
948
0
      return false;
949
0
    }
950
0
  }
951
952
0
  return true;
953
0
}
954
955
bool cmCMakePresetsGraph::BuildPreset::VisitPresetInherit(
956
  cmCMakePresetsGraph::Preset const& parentPreset)
957
0
{
958
0
  auto& preset = *this;
959
0
  BuildPreset const& parent = static_cast<BuildPreset const&>(parentPreset);
960
961
0
  InheritString(preset.ConfigurePreset, parent.ConfigurePreset);
962
0
  InheritOptionalValue(preset.InheritConfigureEnvironment,
963
0
                       parent.InheritConfigureEnvironment);
964
0
  InheritOptionalValue(preset.Jobs, parent.Jobs);
965
0
  InheritVector(preset.Targets, parent.Targets);
966
0
  InheritString(preset.Configuration, parent.Configuration);
967
0
  InheritOptionalValue(preset.CleanFirst, parent.CleanFirst);
968
0
  InheritOptionalValue(preset.Verbose, parent.Verbose);
969
0
  InheritVector(preset.NativeToolOptions, parent.NativeToolOptions);
970
0
  if (!preset.ResolvePackageReferences) {
971
0
    preset.ResolvePackageReferences = parent.ResolvePackageReferences;
972
0
  }
973
974
0
  return true;
975
0
}
976
977
bool cmCMakePresetsGraph::BuildPreset::VisitPresetAfterInherit(
978
  int /* version */, cmJSONState* /*stat*/)
979
0
{
980
0
  return this->Hidden || !this->ConfigurePreset.empty();
981
0
}
982
983
bool cmCMakePresetsGraph::TestPreset::VisitPresetInherit(
984
  cmCMakePresetsGraph::Preset const& parentPreset)
985
0
{
986
0
  auto& preset = *this;
987
0
  TestPreset const& parent = static_cast<TestPreset const&>(parentPreset);
988
989
0
  InheritString(preset.ConfigurePreset, parent.ConfigurePreset);
990
0
  InheritOptionalValue(preset.InheritConfigureEnvironment,
991
0
                       parent.InheritConfigureEnvironment);
992
0
  InheritString(preset.Configuration, parent.Configuration);
993
0
  InheritVector(preset.OverwriteConfigurationFile,
994
0
                parent.OverwriteConfigurationFile);
995
996
0
  if (parent.Output) {
997
0
    if (preset.Output) {
998
0
      auto& output = preset.Output.value();
999
0
      auto const& parentOutput = parent.Output.value();
1000
0
      InheritOptionalValue(output.ShortProgress, parentOutput.ShortProgress);
1001
0
      InheritOptionalValue(output.Verbosity, parentOutput.Verbosity);
1002
0
      InheritOptionalValue(output.Debug, parentOutput.Debug);
1003
0
      InheritOptionalValue(output.OutputOnFailure,
1004
0
                           parentOutput.OutputOnFailure);
1005
0
      InheritOptionalValue(output.Quiet, parentOutput.Quiet);
1006
0
      InheritString(output.OutputLogFile, parentOutput.OutputLogFile);
1007
0
      InheritString(output.OutputJUnitFile, parentOutput.OutputJUnitFile);
1008
0
      InheritOptionalValue(output.LabelSummary, parentOutput.LabelSummary);
1009
0
      InheritOptionalValue(output.SubprojectSummary,
1010
0
                           parentOutput.SubprojectSummary);
1011
0
      InheritOptionalValue(output.MaxPassedTestOutputSize,
1012
0
                           parentOutput.MaxPassedTestOutputSize);
1013
0
      InheritOptionalValue(output.MaxFailedTestOutputSize,
1014
0
                           parentOutput.MaxFailedTestOutputSize);
1015
0
      InheritOptionalValue(output.TestOutputTruncation,
1016
0
                           parentOutput.TestOutputTruncation);
1017
0
      InheritOptionalValue(output.MaxTestNameWidth,
1018
0
                           parentOutput.MaxTestNameWidth);
1019
0
    } else {
1020
0
      preset.Output = parent.Output;
1021
0
    }
1022
0
  }
1023
1024
0
  if (parent.Filter) {
1025
0
    if (parent.Filter->Include) {
1026
0
      if (preset.Filter && preset.Filter->Include) {
1027
0
        auto& include = *preset.Filter->Include;
1028
0
        auto const& parentInclude = *parent.Filter->Include;
1029
0
        InheritString(include.Name, parentInclude.Name);
1030
0
        InheritString(include.Label, parentInclude.Label);
1031
0
        InheritOptionalValue(include.Index, parentInclude.Index);
1032
0
      } else {
1033
0
        if (!preset.Filter) {
1034
0
          preset.Filter.emplace();
1035
0
        }
1036
0
        preset.Filter->Include = parent.Filter->Include;
1037
0
      }
1038
0
    }
1039
1040
0
    if (parent.Filter->Exclude) {
1041
0
      if (preset.Filter && preset.Filter->Exclude) {
1042
0
        auto& exclude = *preset.Filter->Exclude;
1043
0
        auto const& parentExclude = *parent.Filter->Exclude;
1044
0
        InheritString(exclude.Name, parentExclude.Name);
1045
0
        InheritString(exclude.Label, parentExclude.Label);
1046
0
        InheritOptionalValue(exclude.Fixtures, parentExclude.Fixtures);
1047
0
      } else {
1048
0
        if (!preset.Filter) {
1049
0
          preset.Filter.emplace();
1050
0
        }
1051
0
        preset.Filter->Exclude = parent.Filter->Exclude;
1052
0
      }
1053
0
    }
1054
0
  }
1055
1056
0
  if (parent.Execution) {
1057
0
    if (preset.Execution) {
1058
0
      auto& execution = *preset.Execution;
1059
0
      auto const& parentExecution = *parent.Execution;
1060
0
      InheritOptionalValue(execution.StopOnFailure,
1061
0
                           parentExecution.StopOnFailure);
1062
0
      InheritOptionalValue(execution.EnableFailover,
1063
0
                           parentExecution.EnableFailover);
1064
0
      InheritOptionalValue(execution.Jobs, parentExecution.Jobs);
1065
0
      InheritString(execution.ResourceSpecFile,
1066
0
                    parentExecution.ResourceSpecFile);
1067
0
      InheritOptionalValue(execution.TestLoad, parentExecution.TestLoad);
1068
0
      InheritOptionalValue(execution.ShowOnly, parentExecution.ShowOnly);
1069
0
      InheritOptionalValue(execution.Repeat, parentExecution.Repeat);
1070
0
      InheritOptionalValue(execution.InteractiveDebugging,
1071
0
                           parentExecution.InteractiveDebugging);
1072
0
      InheritOptionalValue(execution.ScheduleRandom,
1073
0
                           parentExecution.ScheduleRandom);
1074
0
      InheritOptionalValue(execution.Timeout, parentExecution.Timeout);
1075
0
      InheritOptionalValue(execution.NoTestsAction,
1076
0
                           parentExecution.NoTestsAction);
1077
0
      InheritVector(execution.TestPassthroughArguments,
1078
0
                    parentExecution.TestPassthroughArguments);
1079
0
    } else {
1080
0
      preset.Execution = parent.Execution;
1081
0
    }
1082
0
  }
1083
1084
0
  return true;
1085
0
}
1086
1087
bool cmCMakePresetsGraph::TestPreset::VisitPresetAfterInherit(
1088
  int /* version */, cmJSONState* /*state*/)
1089
0
{
1090
0
  return this->Hidden || !this->ConfigurePreset.empty();
1091
0
}
1092
1093
bool cmCMakePresetsGraph::PackagePreset::VisitPresetInherit(
1094
  cmCMakePresetsGraph::Preset const& parentPreset)
1095
0
{
1096
0
  auto& preset = *this;
1097
0
  PackagePreset const& parent =
1098
0
    static_cast<PackagePreset const&>(parentPreset);
1099
1100
0
  InheritString(preset.ConfigurePreset, parent.ConfigurePreset);
1101
0
  InheritOptionalValue(preset.InheritConfigureEnvironment,
1102
0
                       parent.InheritConfigureEnvironment);
1103
0
  InheritVector(preset.Generators, parent.Generators);
1104
0
  InheritVector(preset.Configurations, parent.Configurations);
1105
0
  InheritMap(preset.Variables, parent.Variables);
1106
0
  InheritOptionalValue(preset.DebugOutput, parent.DebugOutput);
1107
0
  InheritOptionalValue(preset.VerboseOutput, parent.VerboseOutput);
1108
0
  InheritString(preset.PackageName, parent.PackageName);
1109
0
  InheritString(preset.PackageVersion, parent.PackageVersion);
1110
0
  InheritString(preset.PackageDirectory, parent.PackageDirectory);
1111
0
  InheritString(preset.VendorName, parent.VendorName);
1112
1113
0
  return true;
1114
0
}
1115
1116
bool cmCMakePresetsGraph::PackagePreset::VisitPresetAfterInherit(
1117
  int /* version */, cmJSONState* /*state*/)
1118
0
{
1119
0
  return this->Hidden || !this->ConfigurePreset.empty();
1120
0
}
1121
1122
bool cmCMakePresetsGraph::WorkflowPreset::VisitPresetInherit(
1123
  cmCMakePresetsGraph::Preset const& /*parentPreset*/)
1124
0
{
1125
0
  return true;
1126
0
}
1127
1128
bool cmCMakePresetsGraph::WorkflowPreset::VisitPresetAfterInherit(
1129
  int /* version */, cmJSONState* /*state*/)
1130
0
{
1131
0
  return true;
1132
0
}
1133
1134
std::string cmCMakePresetsGraph::GetFilename(std::string const& sourceDir)
1135
0
{
1136
0
  return cmStrCat(sourceDir, "/CMakePresets.json");
1137
0
}
1138
1139
std::string cmCMakePresetsGraph::GetUserFilename(std::string const& sourceDir)
1140
0
{
1141
0
  return cmStrCat(sourceDir, "/CMakeUserPresets.json");
1142
0
}
1143
1144
bool cmCMakePresetsGraph::ReadProjectPresets(std::string const& sourceDir,
1145
                                             bool allowNoFiles)
1146
0
{
1147
0
  this->SourceDir = cmSystemTools::CollapseFullPath(sourceDir);
1148
0
  this->ClearPresets();
1149
1150
0
  if (!this->ReadProjectPresetsInternal(allowNoFiles)) {
1151
0
    this->ClearPresets();
1152
0
    return false;
1153
0
  }
1154
1155
0
  return true;
1156
0
}
1157
1158
std::string cmCMakePresetsGraph::GetGeneratorForPreset(
1159
  std::string const& presetName) const
1160
0
{
1161
0
  auto configurePresetName = presetName;
1162
1163
0
  auto buildPresetIterator = this->BuildPresets.find(presetName);
1164
0
  if (buildPresetIterator != this->BuildPresets.end()) {
1165
0
    configurePresetName =
1166
0
      buildPresetIterator->second.Unexpanded.ConfigurePreset;
1167
0
  } else {
1168
0
    auto testPresetIterator = this->TestPresets.find(presetName);
1169
0
    if (testPresetIterator != this->TestPresets.end()) {
1170
0
      configurePresetName =
1171
0
        testPresetIterator->second.Unexpanded.ConfigurePreset;
1172
0
    }
1173
0
  }
1174
1175
0
  auto configurePresetIterator =
1176
0
    this->ConfigurePresets.find(configurePresetName);
1177
0
  if (configurePresetIterator != this->ConfigurePresets.end()) {
1178
0
    return configurePresetIterator->second.Unexpanded.Generator;
1179
0
  }
1180
1181
  // This should only happen if the preset is hidden
1182
  // or (for build or test presets) if ConfigurePreset is invalid.
1183
0
  return {};
1184
0
}
1185
1186
bool cmCMakePresetsGraph::ReadProjectPresetsInternal(bool allowNoFiles)
1187
0
{
1188
0
  bool haveOneFile = false;
1189
1190
0
  File* file;
1191
0
  std::string filename = GetUserFilename(this->SourceDir);
1192
0
  std::vector<File*> inProgressFiles;
1193
0
  if (cmSystemTools::FileExists(filename)) {
1194
0
    if (!this->ReadJSONFile(filename, RootType::User, ReadReason::Root,
1195
0
                            inProgressFiles, file, this->errors)) {
1196
0
      return false;
1197
0
    }
1198
0
    haveOneFile = true;
1199
0
  } else {
1200
0
    filename = GetFilename(this->SourceDir);
1201
0
    if (cmSystemTools::FileExists(filename)) {
1202
0
      if (!this->ReadJSONFile(filename, RootType::Project, ReadReason::Root,
1203
0
                              inProgressFiles, file, this->errors)) {
1204
0
        return false;
1205
0
      }
1206
0
      haveOneFile = true;
1207
0
    }
1208
0
  }
1209
0
  assert(inProgressFiles.empty());
1210
1211
0
  if (!haveOneFile) {
1212
0
    if (allowNoFiles) {
1213
0
      return true;
1214
0
    }
1215
0
    cmCMakePresetsErrors::FILE_NOT_FOUND(filename, &this->parseState);
1216
0
    return false;
1217
0
  }
1218
1219
0
  bool result = ComputePresetInheritance(this->ConfigurePresets, *this) &&
1220
0
    ComputePresetInheritance(this->BuildPresets, *this) &&
1221
0
    ComputePresetInheritance(this->TestPresets, *this) &&
1222
0
    ComputePresetInheritance(this->PackagePresets, *this) &&
1223
0
    ComputePresetInheritance(this->WorkflowPresets, *this);
1224
0
  if (!result) {
1225
0
    return false;
1226
0
  }
1227
1228
0
  for (auto& it : this->ConfigurePresets) {
1229
0
    if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) {
1230
0
      cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first,
1231
0
                                                    &this->parseState);
1232
0
      return false;
1233
0
    }
1234
0
  }
1235
1236
0
  for (auto& it : this->BuildPresets) {
1237
0
    if (!it.second.Unexpanded.Hidden) {
1238
0
      auto const configurePreset =
1239
0
        this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset);
1240
0
      if (configurePreset == this->ConfigurePresets.end()) {
1241
0
        cmCMakePresetsErrors::INVALID_CONFIGURE_PRESET(it.first,
1242
0
                                                       &this->parseState);
1243
0
        return false;
1244
0
      }
1245
0
      if (!it.second.Unexpanded.OriginFile->ReachableFiles.count(
1246
0
            configurePreset->second.Unexpanded.OriginFile)) {
1247
0
        cmCMakePresetsErrors::CONFIGURE_PRESET_UNREACHABLE_FROM_FILE(
1248
0
          it.first, &this->parseState);
1249
0
        return false;
1250
0
      }
1251
1252
0
      if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) {
1253
0
        it.second.Unexpanded.Environment.insert(
1254
0
          configurePreset->second.Unexpanded.Environment.begin(),
1255
0
          configurePreset->second.Unexpanded.Environment.end());
1256
0
      }
1257
0
    }
1258
1259
0
    if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) {
1260
0
      cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first,
1261
0
                                                    &this->parseState);
1262
0
      return false;
1263
0
    }
1264
0
  }
1265
1266
0
  for (auto& it : this->TestPresets) {
1267
0
    if (!it.second.Unexpanded.Hidden) {
1268
0
      auto const configurePreset =
1269
0
        this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset);
1270
0
      if (configurePreset == this->ConfigurePresets.end()) {
1271
0
        cmCMakePresetsErrors::INVALID_CONFIGURE_PRESET(it.first,
1272
0
                                                       &this->parseState);
1273
0
        return false;
1274
0
      }
1275
0
      if (!it.second.Unexpanded.OriginFile->ReachableFiles.count(
1276
0
            configurePreset->second.Unexpanded.OriginFile)) {
1277
0
        cmCMakePresetsErrors::CONFIGURE_PRESET_UNREACHABLE_FROM_FILE(
1278
0
          it.first, &this->parseState);
1279
0
        return false;
1280
0
      }
1281
1282
0
      if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) {
1283
0
        it.second.Unexpanded.Environment.insert(
1284
0
          configurePreset->second.Unexpanded.Environment.begin(),
1285
0
          configurePreset->second.Unexpanded.Environment.end());
1286
0
      }
1287
0
    }
1288
1289
0
    if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) {
1290
0
      cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first,
1291
0
                                                    &this->parseState);
1292
0
      return false;
1293
0
    }
1294
0
  }
1295
1296
0
  for (auto& it : this->PackagePresets) {
1297
0
    if (!it.second.Unexpanded.Hidden) {
1298
0
      auto const configurePreset =
1299
0
        this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset);
1300
0
      if (configurePreset == this->ConfigurePresets.end()) {
1301
0
        cmCMakePresetsErrors::INVALID_CONFIGURE_PRESET(it.first,
1302
0
                                                       &this->parseState);
1303
0
        return false;
1304
0
      }
1305
0
      if (!it.second.Unexpanded.OriginFile->ReachableFiles.count(
1306
0
            configurePreset->second.Unexpanded.OriginFile)) {
1307
0
        cmCMakePresetsErrors::CONFIGURE_PRESET_UNREACHABLE_FROM_FILE(
1308
0
          it.first, &this->parseState);
1309
0
        return false;
1310
0
      }
1311
1312
0
      if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) {
1313
0
        it.second.Unexpanded.Environment.insert(
1314
0
          configurePreset->second.Unexpanded.Environment.begin(),
1315
0
          configurePreset->second.Unexpanded.Environment.end());
1316
0
      }
1317
0
    }
1318
1319
0
    if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) {
1320
0
      cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first,
1321
0
                                                    &this->parseState);
1322
0
      return false;
1323
0
    }
1324
0
  }
1325
1326
0
  for (auto& it : this->WorkflowPresets) {
1327
0
    using Type = WorkflowPreset::WorkflowStep::Type;
1328
1329
0
    ConfigurePreset const* configurePreset = nullptr;
1330
0
    for (auto const& step : it.second.Unexpanded.Steps) {
1331
0
      if (!configurePreset && step.PresetType != Type::Configure) {
1332
0
        cmCMakePresetsErrors::FIRST_WORKFLOW_STEP_NOT_CONFIGURE(
1333
0
          step.PresetName, &this->parseState);
1334
0
        return false;
1335
0
      }
1336
0
      if (configurePreset && step.PresetType == Type::Configure) {
1337
0
        cmCMakePresetsErrors::CONFIGURE_WORKFLOW_STEP_NOT_FIRST(
1338
0
          step.PresetName, &this->parseState);
1339
0
        return false;
1340
0
      }
1341
1342
0
      switch (step.PresetType) {
1343
0
        case Type::Configure:
1344
0
          result = TryReachPresetFromWorkflow(
1345
0
            it.second.Unexpanded, this->ConfigurePresets, step.PresetName,
1346
0
            configurePreset, &this->parseState);
1347
0
          break;
1348
0
        case Type::Build:
1349
0
          result = TryReachPresetFromWorkflow(
1350
0
            it.second.Unexpanded, this->BuildPresets, step.PresetName,
1351
0
            configurePreset, &this->parseState);
1352
0
          break;
1353
0
        case Type::Test:
1354
0
          result = TryReachPresetFromWorkflow(
1355
0
            it.second.Unexpanded, this->TestPresets, step.PresetName,
1356
0
            configurePreset, &this->parseState);
1357
0
          break;
1358
0
        case Type::Package:
1359
0
          result = TryReachPresetFromWorkflow(
1360
0
            it.second.Unexpanded, this->PackagePresets, step.PresetName,
1361
0
            configurePreset, &this->parseState);
1362
0
          break;
1363
0
      }
1364
0
      if (!result) {
1365
0
        return false;
1366
0
      }
1367
0
    }
1368
1369
0
    if (!configurePreset) {
1370
0
      cmCMakePresetsErrors::NO_WORKFLOW_STEPS(it.first, &this->parseState);
1371
0
      return false;
1372
0
    }
1373
1374
0
    if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) {
1375
0
      cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first,
1376
0
                                                    &this->parseState);
1377
0
      return false;
1378
0
    }
1379
0
  }
1380
1381
0
  return true;
1382
0
}
1383
1384
void cmCMakePresetsGraph::ClearPresets()
1385
0
{
1386
0
  this->ConfigurePresets.clear();
1387
0
  this->BuildPresets.clear();
1388
0
  this->TestPresets.clear();
1389
0
  this->PackagePresets.clear();
1390
0
  this->WorkflowPresets.clear();
1391
1392
0
  this->ConfigurePresetOrder.clear();
1393
0
  this->BuildPresetOrder.clear();
1394
0
  this->TestPresetOrder.clear();
1395
0
  this->PackagePresetOrder.clear();
1396
0
  this->WorkflowPresetOrder.clear();
1397
1398
0
  this->Files.clear();
1399
0
}
1400
1401
void cmCMakePresetsGraph::PrintConfigurePresetList() const
1402
0
{
1403
0
  PrintPresetList<ConfigurePreset>(this,
1404
0
                                   &cmCMakePresetsGraph::ConfigurePresets,
1405
0
                                   &cmCMakePresetsGraph::ConfigurePresetOrder);
1406
0
}
1407
1408
void cmCMakePresetsGraph::PrintConfigurePresetList(
1409
  std::function<bool(ConfigurePreset const&)> const& filter) const
1410
0
{
1411
0
  PrintPresetList<ConfigurePreset>(
1412
0
    this, &cmCMakePresetsGraph::ConfigurePresets,
1413
0
    &cmCMakePresetsGraph::ConfigurePresetOrder, filter);
1414
0
}
1415
1416
void cmCMakePresetsGraph::PrintBuildPresetList() const
1417
0
{
1418
0
  PrintPresetList<BuildPreset>(this, &cmCMakePresetsGraph::BuildPresets,
1419
0
                               &cmCMakePresetsGraph::BuildPresetOrder);
1420
0
}
1421
1422
void cmCMakePresetsGraph::PrintTestPresetList() const
1423
0
{
1424
0
  PrintPresetList<TestPreset>(this, &cmCMakePresetsGraph::TestPresets,
1425
0
                              &cmCMakePresetsGraph::TestPresetOrder);
1426
0
}
1427
1428
void cmCMakePresetsGraph::PrintPackagePresetList() const
1429
0
{
1430
0
  PrintPresetList<PackagePreset>(this, &cmCMakePresetsGraph::PackagePresets,
1431
0
                                 &cmCMakePresetsGraph::PackagePresetOrder);
1432
0
}
1433
1434
void cmCMakePresetsGraph::PrintPackagePresetList(
1435
  std::function<bool(PackagePreset const&)> const& filter) const
1436
0
{
1437
0
  PrintPresetList<PackagePreset>(this, &cmCMakePresetsGraph::PackagePresets,
1438
0
                                 &cmCMakePresetsGraph::PackagePresetOrder,
1439
0
                                 filter);
1440
0
}
1441
1442
void cmCMakePresetsGraph::PrintWorkflowPresetList() const
1443
0
{
1444
0
  PrintPresetList<WorkflowPreset>(this, &cmCMakePresetsGraph::WorkflowPresets,
1445
0
                                  &cmCMakePresetsGraph::WorkflowPresetOrder);
1446
0
}
1447
1448
void cmCMakePresetsGraph::PrintAllPresets() const
1449
0
{
1450
0
  this->PrintConfigurePresetList();
1451
0
  this->PrintBuildPresetList();
1452
0
  this->PrintTestPresetList();
1453
0
  this->PrintPackagePresetList();
1454
0
  this->PrintWorkflowPresetList();
1455
0
}