Coverage Report

Created: 2026-10-28 06:38

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