Coverage Report

Created: 2026-09-14 06:43

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
212k
  do {                                                                        \
26
212k
    switch (ExpandMacros(field, expanders, version)) {                        \
27
3.31k
      case ExpandMacroResult::Error:                                          \
28
3.31k
        return false;                                                         \
29
675
      case ExpandMacroResult::Ignore:                                         \
30
675
        out.reset();                                                          \
31
675
        return true;                                                          \
32
28.2k
      case ExpandMacroResult::Defer:                                          \
33
28.2k
        CM_FALLTHROUGH;                                                       \
34
208k
      case ExpandMacroResult::Ok:                                             \
35
208k
        break;                                                                \
36
212k
    }                                                                         \
37
212k
  } 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.86k
{
70
1.86k
  switch (type) {
71
1.06k
    case WorkflowPreset::WorkflowStep::Type::Configure:
72
1.06k
      return "configure";
73
408
    case WorkflowPreset::WorkflowStep::Type::Build:
74
408
      return "build";
75
327
    case WorkflowPreset::WorkflowStep::Type::Test:
76
327
      return "test";
77
66
    case WorkflowPreset::WorkflowStep::Type::Package:
78
66
      return "package";
79
1.86k
  }
80
0
  return "";
81
1.86k
}
82
83
void InheritString(std::string& child, std::string const& parent)
84
92.7k
{
85
92.7k
  if (child.empty()) {
86
77.9k
    child = parent;
87
77.9k
  }
88
92.7k
}
89
90
template <typename T>
91
void InheritOptionalValue(cm::optional<T>& child,
92
                          cm::optional<T> const& parent)
93
69.7k
{
94
69.7k
  if (!child) {
95
69.7k
    child = parent;
96
69.7k
  }
97
69.7k
}
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<bool>(std::__1::optional<bool>&, std::__1::optional<bool> const&)
Line
Count
Source
93
46.5k
{
94
46.5k
  if (!child) {
95
46.5k
    child = parent;
96
46.5k
  }
97
46.5k
}
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmCMakePresetsGraph::TraceEnableMode>(std::__1::optional<cmCMakePresetsGraph::TraceEnableMode>&, std::__1::optional<cmCMakePresetsGraph::TraceEnableMode> const&)
Line
Count
Source
93
11.5k
{
94
11.5k
  if (!child) {
95
11.5k
    child = parent;
96
11.5k
  }
97
11.5k
}
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<cmTraceEnums::TraceOutputFormat>(std::__1::optional<cmTraceEnums::TraceOutputFormat>&, std::__1::optional<cmTraceEnums::TraceOutputFormat> const&)
Line
Count
Source
93
11.5k
{
94
11.5k
  if (!child) {
95
11.5k
    child = parent;
96
11.5k
  }
97
11.5k
}
cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritOptionalValue<unsigned int>(std::__1::optional<unsigned int>&, std::__1::optional<unsigned int> const&)
Line
Count
Source
93
93
{
94
93
  if (!child) {
95
93
    child = parent;
96
93
  }
97
93
}
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
11.8k
{
102
11.8k
  if (child.empty()) {
103
11.8k
    child = parent;
104
11.8k
  }
105
11.8k
}
106
107
template <typename K, typename V>
108
void InheritMap(std::map<K, V>& child, std::map<K, V> const& parent)
109
46.3k
{
110
46.3k
  for (auto const& item : parent) {
111
18.2k
    child.insert(item);
112
18.2k
  }
113
46.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
23.0k
{
110
23.0k
  for (auto const& item : parent) {
111
0
    child.insert(item);
112
0
  }
113
23.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
11.5k
{
110
11.5k
  for (auto const& item : parent) {
111
10.4k
    child.insert(item);
112
10.4k
  }
113
11.5k
}
Unexecuted instantiation: cmCMakePresetsGraph.cxx:void (anonymous namespace)::InheritMap<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&)
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
11.7k
{
110
11.7k
  for (auto const& item : parent) {
111
7.79k
    child.insert(item);
112
7.79k
  }
113
11.7k
}
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
65.9k
{
127
65.9k
  switch (cycleStatus[preset.Name]) {
128
18
    case CycleStatus::InProgress:
129
18
      cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE(
130
18
        preset.Name, preset.kind(), &graph.parseState);
131
18
      return false;
132
0
    case CycleStatus::Verified:
133
0
      return true;
134
65.9k
    default:
135
65.9k
      break;
136
65.9k
  }
137
138
65.9k
  cycleStatus[preset.Name] = CycleStatus::InProgress;
139
140
65.9k
  if (preset.Environment.count("") != 0) {
141
15
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(
142
15
      preset.Name, preset.kind(), &graph.parseState,
143
15
      "Empty environment variable names are not allowed");
144
15
    return false;
145
15
  }
146
147
65.9k
  bool result = preset.VisitPresetBeforeInherit();
148
65.9k
  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
65.9k
  for (auto const& i : preset.Inherits) {
155
13.5k
    auto parent = presets.find(i);
156
13.5k
    if (parent == presets.end()) {
157
1.67k
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(
158
1.67k
        preset.Name, preset.kind(), &graph.parseState,
159
1.67k
        cmStrCat("Could not find inherited preset \"", i, "\""));
160
1.67k
      return false;
161
1.67k
    }
162
163
11.8k
    auto& parentPreset = parent->second.Unexpanded;
164
11.8k
    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
11.8k
    if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) {
171
114
      return false;
172
114
    }
173
174
11.7k
    result = preset.VisitPresetInherit(parentPreset);
175
11.7k
    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
11.7k
    InheritMap(preset.Environment, parentPreset.Environment);
182
183
11.7k
    if (!preset.ConditionEvaluator) {
184
11.7k
      preset.ConditionEvaluator = parentPreset.ConditionEvaluator;
185
11.7k
    }
186
11.7k
  }
187
188
64.1k
  if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) {
189
0
    preset.ConditionEvaluator.reset();
190
0
  }
191
192
64.1k
  result = preset.VisitPresetAfterInherit(graph.GetVersion(preset),
193
64.1k
                                          &graph.parseState);
194
64.1k
  if (!result) {
195
1.60k
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(
196
1.60k
      preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail);
197
1.60k
    return false;
198
1.60k
  }
199
200
62.5k
  cycleStatus[preset.Name] = CycleStatus::Verified;
201
62.5k
  return true;
202
64.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
53.1k
{
127
53.1k
  switch (cycleStatus[preset.Name]) {
128
12
    case CycleStatus::InProgress:
129
12
      cmCMakePresetsErrors::CYCLIC_PRESET_INHERITANCE(
130
12
        preset.Name, preset.kind(), &graph.parseState);
131
12
      return false;
132
0
    case CycleStatus::Verified:
133
0
      return true;
134
53.1k
    default:
135
53.1k
      break;
136
53.1k
  }
137
138
53.1k
  cycleStatus[preset.Name] = CycleStatus::InProgress;
139
140
53.1k
  if (preset.Environment.count("") != 0) {
141
6
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(
142
6
      preset.Name, preset.kind(), &graph.parseState,
143
6
      "Empty environment variable names are not allowed");
144
6
    return false;
145
6
  }
146
147
53.1k
  bool result = preset.VisitPresetBeforeInherit();
148
53.1k
  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
53.1k
  for (auto const& i : preset.Inherits) {
155
12.3k
    auto parent = presets.find(i);
156
12.3k
    if (parent == presets.end()) {
157
774
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(
158
774
        preset.Name, preset.kind(), &graph.parseState,
159
774
        cmStrCat("Could not find inherited preset \"", i, "\""));
160
774
      return false;
161
774
    }
162
163
11.6k
    auto& parentPreset = parent->second.Unexpanded;
164
11.6k
    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
11.6k
    if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) {
171
54
      return false;
172
54
    }
173
174
11.5k
    result = preset.VisitPresetInherit(parentPreset);
175
11.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
11.5k
    InheritMap(preset.Environment, parentPreset.Environment);
182
183
11.5k
    if (!preset.ConditionEvaluator) {
184
11.5k
      preset.ConditionEvaluator = parentPreset.ConditionEvaluator;
185
11.5k
    }
186
11.5k
  }
187
188
52.3k
  if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) {
189
0
    preset.ConditionEvaluator.reset();
190
0
  }
191
192
52.3k
  result = preset.VisitPresetAfterInherit(graph.GetVersion(preset),
193
52.3k
                                          &graph.parseState);
194
52.3k
  if (!result) {
195
234
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(
196
234
      preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail);
197
234
    return false;
198
234
  }
199
200
52.0k
  cycleStatus[preset.Name] = CycleStatus::Verified;
201
52.0k
  return true;
202
52.3k
}
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
4.95k
{
127
4.95k
  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
4.95k
    default:
135
4.95k
      break;
136
4.95k
  }
137
138
4.95k
  cycleStatus[preset.Name] = CycleStatus::InProgress;
139
140
4.95k
  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
4.95k
  bool result = preset.VisitPresetBeforeInherit();
148
4.95k
  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
4.95k
  for (auto const& i : preset.Inherits) {
155
552
    auto parent = presets.find(i);
156
552
    if (parent == presets.end()) {
157
423
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(
158
423
        preset.Name, preset.kind(), &graph.parseState,
159
423
        cmStrCat("Could not find inherited preset \"", i, "\""));
160
423
      return false;
161
423
    }
162
163
129
    auto& parentPreset = parent->second.Unexpanded;
164
129
    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
129
    if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) {
171
36
      return false;
172
36
    }
173
174
93
    result = preset.VisitPresetInherit(parentPreset);
175
93
    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
93
    InheritMap(preset.Environment, parentPreset.Environment);
182
183
93
    if (!preset.ConditionEvaluator) {
184
93
      preset.ConditionEvaluator = parentPreset.ConditionEvaluator;
185
93
    }
186
93
  }
187
188
4.49k
  if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) {
189
0
    preset.ConditionEvaluator.reset();
190
0
  }
191
192
4.49k
  result = preset.VisitPresetAfterInherit(graph.GetVersion(preset),
193
4.49k
                                          &graph.parseState);
194
4.49k
  if (!result) {
195
438
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(
196
438
      preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail);
197
438
    return false;
198
438
  }
199
200
4.05k
  cycleStatus[preset.Name] = CycleStatus::Verified;
201
4.05k
  return true;
202
4.49k
}
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
3.73k
{
127
3.73k
  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.73k
    default:
135
3.73k
      break;
136
3.73k
  }
137
138
3.73k
  cycleStatus[preset.Name] = CycleStatus::InProgress;
139
140
3.73k
  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.72k
  bool result = preset.VisitPresetBeforeInherit();
148
3.72k
  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.72k
  for (auto const& i : preset.Inherits) {
155
435
    auto parent = presets.find(i);
156
435
    if (parent == presets.end()) {
157
336
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(
158
336
        preset.Name, preset.kind(), &graph.parseState,
159
336
        cmStrCat("Could not find inherited preset \"", i, "\""));
160
336
      return false;
161
336
    }
162
163
99
    auto& parentPreset = parent->second.Unexpanded;
164
99
    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
99
    if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) {
171
18
      return false;
172
18
    }
173
174
81
    result = preset.VisitPresetInherit(parentPreset);
175
81
    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
81
    InheritMap(preset.Environment, parentPreset.Environment);
182
183
81
    if (!preset.ConditionEvaluator) {
184
81
      preset.ConditionEvaluator = parentPreset.ConditionEvaluator;
185
81
    }
186
81
  }
187
188
3.37k
  if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) {
189
0
    preset.ConditionEvaluator.reset();
190
0
  }
191
192
3.37k
  result = preset.VisitPresetAfterInherit(graph.GetVersion(preset),
193
3.37k
                                          &graph.parseState);
194
3.37k
  if (!result) {
195
444
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(
196
444
      preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail);
197
444
    return false;
198
444
  }
199
200
2.93k
  cycleStatus[preset.Name] = CycleStatus::Verified;
201
2.93k
  return true;
202
3.37k
}
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
2.36k
{
127
2.36k
  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
2.36k
    default:
135
2.36k
      break;
136
2.36k
  }
137
138
2.36k
  cycleStatus[preset.Name] = CycleStatus::InProgress;
139
140
2.36k
  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
2.36k
  bool result = preset.VisitPresetBeforeInherit();
148
2.36k
  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
2.36k
  for (auto const& i : preset.Inherits) {
155
147
    auto parent = presets.find(i);
156
147
    if (parent == presets.end()) {
157
141
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(
158
141
        preset.Name, preset.kind(), &graph.parseState,
159
141
        cmStrCat("Could not find inherited preset \"", i, "\""));
160
141
      return false;
161
141
    }
162
163
6
    auto& parentPreset = parent->second.Unexpanded;
164
6
    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
6
    if (!VisitPreset(parentPreset, presets, cycleStatus, graph)) {
171
6
      return false;
172
6
    }
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
2.21k
  if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) {
189
0
    preset.ConditionEvaluator.reset();
190
0
  }
191
192
2.21k
  result = preset.VisitPresetAfterInherit(graph.GetVersion(preset),
193
2.21k
                                          &graph.parseState);
194
2.21k
  if (!result) {
195
492
    cmCMakePresetsErrors::INVALID_PRESET_NAMED(
196
492
      preset.Name, preset.kind(), &graph.parseState, preset.ErrorDetail);
197
492
    return false;
198
492
  }
199
200
1.72k
  cycleStatus[preset.Name] = CycleStatus::Verified;
201
1.72k
  return true;
202
2.21k
}
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.74k
{
127
1.74k
  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.74k
    default:
135
1.74k
      break;
136
1.74k
  }
137
138
1.74k
  cycleStatus[preset.Name] = CycleStatus::InProgress;
139
140
1.74k
  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.74k
  bool result = preset.VisitPresetBeforeInherit();
148
1.74k
  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.74k
  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.74k
  if (preset.ConditionEvaluator && preset.ConditionEvaluator->IsNull()) {
189
0
    preset.ConditionEvaluator.reset();
190
0
  }
191
192
1.74k
  result = preset.VisitPresetAfterInherit(graph.GetVersion(preset),
193
1.74k
                                          &graph.parseState);
194
1.74k
  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.74k
  cycleStatus[preset.Name] = CycleStatus::Verified;
201
1.74k
  return true;
202
1.74k
}
203
204
template <typename T>
205
bool ComputePresetInheritance(
206
  std::map<std::string, cmCMakePresetsGraph::PresetPair<T>>& presets,
207
  cmCMakePresetsGraph& graph)
208
68.8k
{
209
68.8k
  std::map<std::string, CycleStatus> cycleStatus;
210
73.4k
  for (auto const& it : presets) {
211
73.4k
    cycleStatus[it.first] = CycleStatus::Unvisited;
212
73.4k
  }
213
214
68.8k
  for (auto& it : presets) {
215
54.1k
    auto& preset = it.second.Unexpanded;
216
54.1k
    if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) {
217
3.31k
      return false;
218
3.31k
    }
219
54.1k
  }
220
221
65.5k
  return true;
222
68.8k
}
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
15.5k
{
209
15.5k
  std::map<std::string, CycleStatus> cycleStatus;
210
44.2k
  for (auto const& it : presets) {
211
44.2k
    cycleStatus[it.first] = CycleStatus::Unvisited;
212
44.2k
  }
213
214
41.5k
  for (auto& it : presets) {
215
41.5k
    auto& preset = it.second.Unexpanded;
216
41.5k
    if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) {
217
1.02k
      return false;
218
1.02k
    }
219
41.5k
  }
220
221
14.5k
  return true;
222
15.5k
}
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
14.5k
{
209
14.5k
  std::map<std::string, CycleStatus> cycleStatus;
210
14.5k
  for (auto const& it : presets) {
211
10.0k
    cycleStatus[it.first] = CycleStatus::Unvisited;
212
10.0k
  }
213
214
14.5k
  for (auto& it : presets) {
215
4.83k
    auto& preset = it.second.Unexpanded;
216
4.83k
    if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) {
217
867
      return false;
218
867
    }
219
4.83k
  }
220
221
13.6k
  return true;
222
14.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
13.6k
{
209
13.6k
  std::map<std::string, CycleStatus> cycleStatus;
210
13.6k
  for (auto const& it : presets) {
211
9.95k
    cycleStatus[it.first] = CycleStatus::Unvisited;
212
9.95k
  }
213
214
13.6k
  for (auto& it : presets) {
215
3.63k
    auto& preset = it.second.Unexpanded;
216
3.63k
    if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) {
217
786
      return false;
218
786
    }
219
3.63k
  }
220
221
12.8k
  return true;
222
13.6k
}
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
12.8k
{
209
12.8k
  std::map<std::string, CycleStatus> cycleStatus;
210
12.8k
  for (auto const& it : presets) {
211
7.39k
    cycleStatus[it.first] = CycleStatus::Unvisited;
212
7.39k
  }
213
214
12.8k
  for (auto& it : presets) {
215
2.36k
    auto& preset = it.second.Unexpanded;
216
2.36k
    if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) {
217
636
      return false;
218
636
    }
219
2.36k
  }
220
221
12.2k
  return true;
222
12.8k
}
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
12.2k
{
209
12.2k
  std::map<std::string, CycleStatus> cycleStatus;
210
12.2k
  for (auto const& it : presets) {
211
1.74k
    cycleStatus[it.first] = CycleStatus::Unvisited;
212
1.74k
  }
213
214
12.2k
  for (auto& it : presets) {
215
1.74k
    auto& preset = it.second.Unexpanded;
216
1.74k
    if (!VisitPreset<T>(preset, presets, cycleStatus, graph)) {
217
0
      return false;
218
0
    }
219
1.74k
  }
220
221
12.2k
  return true;
222
12.2k
}
223
224
constexpr char const* ValidPrefixes[] = {
225
  "",
226
  "env",
227
  "penv",
228
  "vendor",
229
};
230
231
bool PrefixesValidMacroNamespace(std::string const& str)
232
1.18M
{
233
1.18M
  return std::any_of(
234
1.18M
    std::begin(ValidPrefixes), std::end(ValidPrefixes),
235
3.71M
    [&str](char const* prefix) -> bool { return cmHasPrefix(prefix, str); });
236
1.18M
}
237
238
bool IsValidMacroNamespace(std::string const& str)
239
519k
{
240
519k
  return std::any_of(
241
519k
    std::begin(ValidPrefixes), std::end(ValidPrefixes),
242
651k
    [&str](char const* prefix) -> bool { return str == prefix; });
243
519k
}
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
37.6k
    : EnvCycles(envCycles)
260
37.6k
    , Out(out)
261
37.6k
    , MacroExpanders(macroExpanders)
262
37.6k
  {
263
37.6k
  }
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.80k
    : EnvCycles(envCycles)
260
1.80k
    , Out(out)
261
1.80k
    , MacroExpanders(macroExpanders)
262
1.80k
  {
263
1.80k
  }
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.10k
    : EnvCycles(envCycles)
260
1.10k
    , Out(out)
261
1.10k
    , MacroExpanders(macroExpanders)
262
1.10k
  {
263
1.10k
  }
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
975
    : EnvCycles(envCycles)
260
975
    , Out(out)
261
975
    , MacroExpanders(macroExpanders)
262
975
  {
263
975
  }
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
33.6k
    : EnvCycles(envCycles)
260
33.6k
    , Out(out)
261
33.6k
    , MacroExpanders(macroExpanders)
262
33.6k
  {
263
33.6k
  }
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
39
    : EnvCycles(envCycles)
260
39
    , Out(out)
261
39
    , MacroExpanders(macroExpanders)
262
39
  {
263
39
  }
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
87.6k
      auto v = Out->Environment.find(macroName);
271
87.6k
      if (v != Out->Environment.end() && v->second) {
272
393
        auto e =
273
393
          VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version);
274
393
        if (e != ExpandMacroResult::Ok) {
275
6
          return e;
276
6
        }
277
387
        macroOut += *v->second;
278
387
        return ExpandMacroResult::Ok;
279
393
      }
280
87.6k
    }
281
282
101k
    if (macroNamespace == "env" || macroNamespace == "penv") {
283
97.2k
      if (macroName.empty()) {
284
15
        return ExpandMacroResult::Error;
285
15
      }
286
97.2k
      if (cm::optional<std::string> value =
287
97.2k
            cmSystemTools::GetEnvVar(macroName)) {
288
63.2k
        macroOut += *value;
289
63.2k
      }
290
97.2k
      return ExpandMacroResult::Ok;
291
97.2k
    }
292
293
4.22k
    return ExpandMacroResult::Ignore;
294
101k
  }
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
24.6k
  {
269
24.6k
    if (macroNamespace == "env" && !macroName.empty() && Out) {
270
22.5k
      auto v = Out->Environment.find(macroName);
271
22.5k
      if (v != Out->Environment.end() && v->second) {
272
0
        auto e =
273
0
          VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version);
274
0
        if (e != ExpandMacroResult::Ok) {
275
0
          return e;
276
0
        }
277
0
        macroOut += *v->second;
278
0
        return ExpandMacroResult::Ok;
279
0
      }
280
22.5k
    }
281
282
24.6k
    if (macroNamespace == "env" || macroNamespace == "penv") {
283
24.1k
      if (macroName.empty()) {
284
6
        return ExpandMacroResult::Error;
285
6
      }
286
24.1k
      if (cm::optional<std::string> value =
287
24.1k
            cmSystemTools::GetEnvVar(macroName)) {
288
15.4k
        macroOut += *value;
289
15.4k
      }
290
24.1k
      return ExpandMacroResult::Ok;
291
24.1k
    }
292
293
432
    return ExpandMacroResult::Ignore;
294
24.6k
  }
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
9.63k
  {
269
9.63k
    if (macroNamespace == "env" && !macroName.empty() && Out) {
270
8.95k
      auto v = Out->Environment.find(macroName);
271
8.95k
      if (v != Out->Environment.end() && v->second) {
272
0
        auto e =
273
0
          VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version);
274
0
        if (e != ExpandMacroResult::Ok) {
275
0
          return e;
276
0
        }
277
0
        macroOut += *v->second;
278
0
        return ExpandMacroResult::Ok;
279
0
      }
280
8.95k
    }
281
282
9.63k
    if (macroNamespace == "env" || macroNamespace == "penv") {
283
9.61k
      if (macroName.empty()) {
284
0
        return ExpandMacroResult::Error;
285
0
      }
286
9.61k
      if (cm::optional<std::string> value =
287
9.61k
            cmSystemTools::GetEnvVar(macroName)) {
288
5.97k
        macroOut += *value;
289
5.97k
      }
290
9.61k
      return ExpandMacroResult::Ok;
291
9.61k
    }
292
293
15
    return ExpandMacroResult::Ignore;
294
9.63k
  }
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
9.75k
  {
269
9.75k
    if (macroNamespace == "env" && !macroName.empty() && Out) {
270
9.06k
      auto v = Out->Environment.find(macroName);
271
9.06k
      if (v != Out->Environment.end() && v->second) {
272
0
        auto e =
273
0
          VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version);
274
0
        if (e != ExpandMacroResult::Ok) {
275
0
          return e;
276
0
        }
277
0
        macroOut += *v->second;
278
0
        return ExpandMacroResult::Ok;
279
0
      }
280
9.06k
    }
281
282
9.75k
    if (macroNamespace == "env" || macroNamespace == "penv") {
283
9.73k
      if (macroName.empty()) {
284
0
        return ExpandMacroResult::Error;
285
0
      }
286
9.73k
      if (cm::optional<std::string> value =
287
9.73k
            cmSystemTools::GetEnvVar(macroName)) {
288
6.03k
        macroOut += *value;
289
6.03k
      }
290
9.73k
      return ExpandMacroResult::Ok;
291
9.73k
    }
292
293
18
    return ExpandMacroResult::Ignore;
294
9.75k
  }
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
57.8k
  {
269
57.8k
    if (macroNamespace == "env" && !macroName.empty() && Out) {
270
47.0k
      auto v = Out->Environment.find(macroName);
271
47.0k
      if (v != Out->Environment.end() && v->second) {
272
393
        auto e =
273
393
          VisitEnv(*v->second, EnvCycles[macroName], MacroExpanders, version);
274
393
        if (e != ExpandMacroResult::Ok) {
275
6
          return e;
276
6
        }
277
387
        macroOut += *v->second;
278
387
        return ExpandMacroResult::Ok;
279
393
      }
280
47.0k
    }
281
282
57.5k
    if (macroNamespace == "env" || macroNamespace == "penv") {
283
53.7k
      if (macroName.empty()) {
284
9
        return ExpandMacroResult::Error;
285
9
      }
286
53.7k
      if (cm::optional<std::string> value =
287
53.7k
            cmSystemTools::GetEnvVar(macroName)) {
288
35.7k
        macroOut += *value;
289
35.7k
      }
290
53.7k
      return ExpandMacroResult::Ok;
291
53.7k
    }
292
293
3.75k
    return ExpandMacroResult::Ignore;
294
57.5k
  }
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
80.0k
{
302
80.0k
  int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version;
303
304
80.0k
  std::string binaryDir = preset.BinaryDir;
305
80.0k
  CHECK_EXPAND(out, binaryDir, macroExpanders, version);
306
307
78.8k
  if (!binaryDir.empty()) {
308
26.8k
    if (graph) {
309
10.8k
      if (!cmSystemTools::FileIsFullPath(binaryDir)) {
310
5.95k
        binaryDir = cmStrCat(graph->SourceDir, '/', binaryDir);
311
5.95k
      }
312
10.8k
      out->BinaryDir = cmSystemTools::CollapseFullPath(binaryDir);
313
10.8k
      cmSystemTools::ConvertToUnixSlashes(out->BinaryDir);
314
16.0k
    } else {
315
      // Defer path normalization until the graph is merged, but store the
316
      // intermediate result.
317
16.0k
      out->BinaryDir = binaryDir;
318
16.0k
    }
319
26.8k
  }
320
321
78.8k
  if (!preset.InstallDir.empty()) {
322
7.89k
    std::string installDir = preset.InstallDir;
323
7.89k
    CHECK_EXPAND(out, installDir, macroExpanders, version);
324
325
6.97k
    if (graph) {
326
3.25k
      if (!cmSystemTools::FileIsFullPath(installDir)) {
327
2.59k
        installDir = cmStrCat(graph->SourceDir, '/', installDir);
328
2.59k
      }
329
3.25k
      out->InstallDir = cmSystemTools::CollapseFullPath(installDir);
330
3.25k
      cmSystemTools::ConvertToUnixSlashes(out->InstallDir);
331
3.72k
    } else {
332
      // Defer path normalization until the graph is merged, but store the
333
      // intermediate result.
334
3.72k
      out->InstallDir = installDir;
335
3.72k
    }
336
6.97k
  }
337
338
77.8k
  if (!preset.ToolchainFile.empty()) {
339
4.59k
    std::string toolchain = preset.ToolchainFile;
340
4.59k
    CHECK_EXPAND(out, toolchain, macroExpanders, version);
341
4.52k
    out->ToolchainFile = toolchain;
342
4.52k
  }
343
344
77.8k
  if (!preset.GraphVizFile.empty()) {
345
57
    std::string graphVizFile = preset.GraphVizFile;
346
57
    CHECK_EXPAND(out, graphVizFile, macroExpanders, version);
347
54
    out->GraphVizFile = graphVizFile;
348
54
  }
349
350
77.8k
  for (auto& variable : out->CacheVariables) {
351
19.3k
    if (variable.second) {
352
19.2k
      CHECK_EXPAND(out, variable.second->Value, macroExpanders, version);
353
19.2k
    }
354
19.3k
  }
355
356
77.0k
  return true;
357
77.8k
}
358
359
bool CheckExpandMacros(BuildPreset const& preset,
360
                       cm::optional<BuildPreset>& out,
361
                       MacroExpanderVector const& macroExpanders,
362
                       cmCMakePresetsGraph const* graph = nullptr)
363
13.5k
{
364
13.5k
  int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version;
365
366
21.7k
  for (auto& target : out->Targets) {
367
21.7k
    CHECK_EXPAND(out, target, macroExpanders, version);
368
21.7k
  }
369
370
13.0k
  for (auto& nativeToolOption : out->NativeToolOptions) {
371
0
    CHECK_EXPAND(out, nativeToolOption, macroExpanders, version);
372
0
  }
373
374
13.0k
  return true;
375
13.0k
}
376
377
bool CheckExpandMacros(TestPreset const& preset, cm::optional<TestPreset>& out,
378
                       MacroExpanderVector const& macroExpanders,
379
                       cmCMakePresetsGraph const* graph = nullptr)
380
14.0k
{
381
14.0k
  int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version;
382
383
14.0k
  for (auto& overwrite : out->OverwriteConfigurationFile) {
384
0
    CHECK_EXPAND(out, overwrite, macroExpanders, version);
385
0
  }
386
387
14.0k
  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
14.0k
  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
14.0k
  if (out->Execution) {
419
6
    CHECK_EXPAND(out, out->Execution->ResourceSpecFile, macroExpanders,
420
6
                 version);
421
6
  }
422
423
14.0k
  return true;
424
14.0k
}
425
426
bool CheckExpandMacros(PackagePreset const& preset,
427
                       cm::optional<PackagePreset>& out,
428
                       MacroExpanderVector const& macroExpanders,
429
                       cmCMakePresetsGraph const* graph = nullptr)
430
11.5k
{
431
11.5k
  int version = graph ? graph->GetVersion(preset) : preset.OriginFile->Version;
432
433
11.5k
  for (auto& variable : out->Variables) {
434
0
    CHECK_EXPAND(out, variable.second, macroExpanders, version);
435
0
  }
436
437
11.5k
  CHECK_EXPAND(out, out->ConfigFile, macroExpanders, version);
438
11.5k
  CHECK_EXPAND(out, out->PackageName, macroExpanders, version);
439
11.5k
  CHECK_EXPAND(out, out->PackageVersion, macroExpanders, version);
440
11.5k
  CHECK_EXPAND(out, out->PackageDirectory, macroExpanders, version);
441
11.5k
  CHECK_EXPAND(out, out->VendorName, macroExpanders, version);
442
443
11.5k
  return true;
444
11.5k
}
445
446
bool CheckExpandMacros(WorkflowPreset const& /*preset*/,
447
                       cm::optional<WorkflowPreset>& /*out*/,
448
                       MacroExpanderVector const& /*macroExpanders*/,
449
                       cmCMakePresetsGraph const* /*graph*/ = nullptr)
450
1.95k
{
451
1.95k
  return true;
452
1.95k
}
453
454
template <typename T>
455
bool ExpandMacros(cmCMakePresetsGraph* graph, T const& preset,
456
                  cm::optional<T>& out)
457
37.6k
{
458
37.6k
  out.emplace(preset);
459
460
37.6k
  std::map<std::string, CycleStatus> envCycles;
461
37.6k
  for (auto const& v : out->Environment) {
462
15.5k
    envCycles[v.first] = CycleStatus::Unvisited;
463
15.5k
  }
464
465
37.6k
  MacroExpanderVector macroExpanders{};
466
467
37.6k
  macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph));
468
37.6k
  macroExpanders.push_back(
469
37.6k
    cm::make_unique<PresetMacroExpander<T>>(*graph, preset));
470
37.6k
  macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>(
471
37.6k
    macroExpanders, out, envCycles));
472
473
37.6k
  for (auto& v : out->Environment) {
474
14.7k
    if (v.second) {
475
14.5k
      switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders,
476
14.5k
                       graph->GetVersion(preset))) {
477
393
        case ExpandMacroResult::Error:
478
393
          cmCMakePresetsErrors::INVALID_PRESET_NAMED(
479
393
            preset.Name, preset.kind(), &graph->parseState,
480
393
            "Invalid macro expansion");
481
393
          return false;
482
141
        case ExpandMacroResult::Ignore:
483
141
          out.reset();
484
141
          return true;
485
0
        case ExpandMacroResult::Defer:
486
0
          CM_FALLTHROUGH;
487
14.0k
        case ExpandMacroResult::Ok:
488
14.0k
          break;
489
14.5k
      }
490
14.5k
    }
491
14.7k
  }
492
493
37.0k
  if (preset.ConditionEvaluator) {
494
4.59k
    cm::optional<bool> result;
495
4.59k
    if (!preset.ConditionEvaluator->Evaluate(
496
4.59k
          macroExpanders, graph->GetVersion(preset), result)) {
497
831
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(
498
831
        preset.Name, preset.kind(), &graph->parseState, "Invalid condition");
499
831
      return false;
500
831
    }
501
3.76k
    if (!result) {
502
51
      out.reset();
503
51
      return true;
504
51
    }
505
3.71k
    out->ConditionResult = *result;
506
3.71k
  }
507
508
36.1k
  return CheckExpandMacros(preset, out, macroExpanders, graph);
509
37.0k
}
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::BuildPreset const&, std::__1::optional<cmCMakePresetsGraph::BuildPreset>&)
Line
Count
Source
457
1.80k
{
458
1.80k
  out.emplace(preset);
459
460
1.80k
  std::map<std::string, CycleStatus> envCycles;
461
1.80k
  for (auto const& v : out->Environment) {
462
1.23k
    envCycles[v.first] = CycleStatus::Unvisited;
463
1.23k
  }
464
465
1.80k
  MacroExpanderVector macroExpanders{};
466
467
1.80k
  macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph));
468
1.80k
  macroExpanders.push_back(
469
1.80k
    cm::make_unique<PresetMacroExpander<T>>(*graph, preset));
470
1.80k
  macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>(
471
1.80k
    macroExpanders, out, envCycles));
472
473
1.80k
  for (auto& v : out->Environment) {
474
1.22k
    if (v.second) {
475
1.18k
      switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders,
476
1.18k
                       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
15
        case ExpandMacroResult::Ignore:
483
15
          out.reset();
484
15
          return true;
485
0
        case ExpandMacroResult::Defer:
486
0
          CM_FALLTHROUGH;
487
1.17k
        case ExpandMacroResult::Ok:
488
1.17k
          break;
489
1.18k
      }
490
1.18k
    }
491
1.22k
  }
492
493
1.78k
  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.78k
  return CheckExpandMacros(preset, out, macroExpanders, graph);
509
1.78k
}
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::TestPreset const&, std::__1::optional<cmCMakePresetsGraph::TestPreset>&)
Line
Count
Source
457
1.10k
{
458
1.10k
  out.emplace(preset);
459
460
1.10k
  std::map<std::string, CycleStatus> envCycles;
461
1.22k
  for (auto const& v : out->Environment) {
462
1.22k
    envCycles[v.first] = CycleStatus::Unvisited;
463
1.22k
  }
464
465
1.10k
  MacroExpanderVector macroExpanders{};
466
467
1.10k
  macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph));
468
1.10k
  macroExpanders.push_back(
469
1.10k
    cm::make_unique<PresetMacroExpander<T>>(*graph, preset));
470
1.10k
  macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>(
471
1.10k
    macroExpanders, out, envCycles));
472
473
1.22k
  for (auto& v : out->Environment) {
474
1.22k
    if (v.second) {
475
1.18k
      switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders,
476
1.18k
                       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
15
        case ExpandMacroResult::Ignore:
483
15
          out.reset();
484
15
          return true;
485
0
        case ExpandMacroResult::Defer:
486
0
          CM_FALLTHROUGH;
487
1.16k
        case ExpandMacroResult::Ok:
488
1.16k
          break;
489
1.18k
      }
490
1.18k
    }
491
1.22k
  }
492
493
1.09k
  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.09k
  return CheckExpandMacros(preset, out, macroExpanders, graph);
509
1.09k
}
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::PackagePreset const&, std::__1::optional<cmCMakePresetsGraph::PackagePreset>&)
Line
Count
Source
457
975
{
458
975
  out.emplace(preset);
459
460
975
  std::map<std::string, CycleStatus> envCycles;
461
1.28k
  for (auto const& v : out->Environment) {
462
1.28k
    envCycles[v.first] = CycleStatus::Unvisited;
463
1.28k
  }
464
465
975
  MacroExpanderVector macroExpanders{};
466
467
975
  macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph));
468
975
  macroExpanders.push_back(
469
975
    cm::make_unique<PresetMacroExpander<T>>(*graph, preset));
470
975
  macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>(
471
975
    macroExpanders, out, envCycles));
472
473
1.27k
  for (auto& v : out->Environment) {
474
1.27k
    if (v.second) {
475
1.23k
      switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders,
476
1.23k
                       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
18
        case ExpandMacroResult::Ignore:
483
18
          out.reset();
484
18
          return true;
485
0
        case ExpandMacroResult::Defer:
486
0
          CM_FALLTHROUGH;
487
1.22k
        case ExpandMacroResult::Ok:
488
1.22k
          break;
489
1.23k
      }
490
1.23k
    }
491
1.27k
  }
492
493
957
  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
957
  return CheckExpandMacros(preset, out, macroExpanders, graph);
509
957
}
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::ConfigurePreset const&, std::__1::optional<cmCMakePresetsGraph::ConfigurePreset>&)
Line
Count
Source
457
33.6k
{
458
33.6k
  out.emplace(preset);
459
460
33.6k
  std::map<std::string, CycleStatus> envCycles;
461
33.6k
  for (auto const& v : out->Environment) {
462
11.8k
    envCycles[v.first] = CycleStatus::Unvisited;
463
11.8k
  }
464
465
33.6k
  MacroExpanderVector macroExpanders{};
466
467
33.6k
  macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph));
468
33.6k
  macroExpanders.push_back(
469
33.6k
    cm::make_unique<PresetMacroExpander<T>>(*graph, preset));
470
33.6k
  macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>(
471
33.6k
    macroExpanders, out, envCycles));
472
473
33.6k
  for (auto& v : out->Environment) {
474
11.0k
    if (v.second) {
475
10.9k
      switch (VisitEnv(*v.second, envCycles[v.first], macroExpanders,
476
10.9k
                       graph->GetVersion(preset))) {
477
393
        case ExpandMacroResult::Error:
478
393
          cmCMakePresetsErrors::INVALID_PRESET_NAMED(
479
393
            preset.Name, preset.kind(), &graph->parseState,
480
393
            "Invalid macro expansion");
481
393
          return false;
482
93
        case ExpandMacroResult::Ignore:
483
93
          out.reset();
484
93
          return true;
485
0
        case ExpandMacroResult::Defer:
486
0
          CM_FALLTHROUGH;
487
10.4k
        case ExpandMacroResult::Ok:
488
10.4k
          break;
489
10.9k
      }
490
10.9k
    }
491
11.0k
  }
492
493
33.2k
  if (preset.ConditionEvaluator) {
494
4.59k
    cm::optional<bool> result;
495
4.59k
    if (!preset.ConditionEvaluator->Evaluate(
496
4.59k
          macroExpanders, graph->GetVersion(preset), result)) {
497
831
      cmCMakePresetsErrors::INVALID_PRESET_NAMED(
498
831
        preset.Name, preset.kind(), &graph->parseState, "Invalid condition");
499
831
      return false;
500
831
    }
501
3.76k
    if (!result) {
502
51
      out.reset();
503
51
      return true;
504
51
    }
505
3.71k
    out->ConditionResult = *result;
506
3.71k
  }
507
508
32.3k
  return CheckExpandMacros(preset, out, macroExpanders, graph);
509
33.2k
}
cmCMakePresetsGraph.cxx:bool (anonymous namespace)::ExpandMacros<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph*, cmCMakePresetsGraph::WorkflowPreset const&, std::__1::optional<cmCMakePresetsGraph::WorkflowPreset>&)
Line
Count
Source
457
39
{
458
39
  out.emplace(preset);
459
460
39
  std::map<std::string, CycleStatus> envCycles;
461
39
  for (auto const& v : out->Environment) {
462
0
    envCycles[v.first] = CycleStatus::Unvisited;
463
0
  }
464
465
39
  MacroExpanderVector macroExpanders{};
466
467
39
  macroExpanders.push_back(cm::make_unique<BaseMacroExpander>(*graph));
468
39
  macroExpanders.push_back(
469
39
    cm::make_unique<PresetMacroExpander<T>>(*graph, preset));
470
39
  macroExpanders.push_back(cm::make_unique<EnvironmentMacroExpander<T>>(
471
39
    macroExpanders, out, envCycles));
472
473
39
  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
39
  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
39
  return CheckExpandMacros(preset, out, macroExpanders, graph);
509
39
}
510
511
ExpandMacroResult VisitEnv(std::string& value, CycleStatus& status,
512
                           MacroExpanderVector const& macroExpanders,
513
                           int version)
514
14.9k
{
515
14.9k
  if (status == CycleStatus::Verified) {
516
387
    return ExpandMacroResult::Ok;
517
387
  }
518
14.5k
  if (status == CycleStatus::InProgress) {
519
3
    return ExpandMacroResult::Error;
520
3
  }
521
522
14.5k
  status = CycleStatus::InProgress;
523
14.5k
  auto e = ExpandMacros(value, macroExpanders, version);
524
14.5k
  if (e != ExpandMacroResult::Ok) {
525
537
    return e;
526
537
  }
527
14.0k
  status = CycleStatus::Verified;
528
14.0k
  return ExpandMacroResult::Ok;
529
14.5k
}
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
84.8k
{
672
84.8k
  MacroExpanderVector macroExpanders{};
673
84.8k
  macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset));
674
84.8k
  cm::optional<T> out = preset;
675
84.8k
  bool result = CheckExpandMacros(preset, out, macroExpanders);
676
84.8k
  if (out.has_value()) {
677
84.8k
    preset = out.value();
678
84.8k
  };
679
84.8k
  return result;
680
84.8k
}
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph::ConfigurePreset&)
Line
Count
Source
671
47.7k
{
672
47.7k
  MacroExpanderVector macroExpanders{};
673
47.7k
  macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset));
674
47.7k
  cm::optional<T> out = preset;
675
47.7k
  bool result = CheckExpandMacros(preset, out, macroExpanders);
676
47.7k
  if (out.has_value()) {
677
47.7k
    preset = out.value();
678
47.7k
  };
679
47.7k
  return result;
680
47.7k
}
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::BuildPreset>(cmCMakePresetsGraph::BuildPreset&)
Line
Count
Source
671
11.7k
{
672
11.7k
  MacroExpanderVector macroExpanders{};
673
11.7k
  macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset));
674
11.7k
  cm::optional<T> out = preset;
675
11.7k
  bool result = CheckExpandMacros(preset, out, macroExpanders);
676
11.7k
  if (out.has_value()) {
677
11.7k
    preset = out.value();
678
11.7k
  };
679
11.7k
  return result;
680
11.7k
}
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::TestPreset>(cmCMakePresetsGraph::TestPreset&)
Line
Count
Source
671
12.9k
{
672
12.9k
  MacroExpanderVector macroExpanders{};
673
12.9k
  macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset));
674
12.9k
  cm::optional<T> out = preset;
675
12.9k
  bool result = CheckExpandMacros(preset, out, macroExpanders);
676
12.9k
  if (out.has_value()) {
677
12.9k
    preset = out.value();
678
12.9k
  };
679
12.9k
  return result;
680
12.9k
}
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::PackagePreset>(cmCMakePresetsGraph::PackagePreset&)
Line
Count
Source
671
10.6k
{
672
10.6k
  MacroExpanderVector macroExpanders{};
673
10.6k
  macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset));
674
10.6k
  cm::optional<T> out = preset;
675
10.6k
  bool result = CheckExpandMacros(preset, out, macroExpanders);
676
10.6k
  if (out.has_value()) {
677
10.6k
    preset = out.value();
678
10.6k
  };
679
10.6k
  return result;
680
10.6k
}
bool cmCMakePresetsGraphInternal::ExpandImmediateMacros<cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph::WorkflowPreset&)
Line
Count
Source
671
1.91k
{
672
1.91k
  MacroExpanderVector macroExpanders{};
673
1.91k
  macroExpanders.push_back(cm::make_unique<ImmediateMacroExpander<T>>(preset));
674
1.91k
  cm::optional<T> out = preset;
675
1.91k
  bool result = CheckExpandMacros(preset, out, macroExpanders);
676
1.91k
  if (out.has_value()) {
677
1.91k
    preset = out.value();
678
1.91k
  };
679
1.91k
  return result;
680
1.91k
}
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
229k
{
696
229k
  std::string result;
697
229k
  std::string macroNamespace;
698
229k
  std::string macroName;
699
700
229k
  enum class State
701
229k
  {
702
229k
    Default,
703
229k
    MacroNamespace,
704
229k
    MacroName,
705
229k
  } state = State::Default;
706
707
80.7M
  for (auto c : out) {
708
80.7M
    switch (state) {
709
69.6M
      case State::Default:
710
69.6M
        if (c == '$') {
711
869k
          state = State::MacroNamespace;
712
68.7M
        } else {
713
68.7M
          result += c;
714
68.7M
        }
715
69.6M
        break;
716
717
1.70M
      case State::MacroNamespace:
718
1.70M
        if (c == '{') {
719
519k
          if (IsValidMacroNamespace(macroNamespace)) {
720
517k
            state = State::MacroName;
721
517k
          } else {
722
1.35k
            result += '$';
723
1.35k
            result += macroNamespace;
724
1.35k
            result += '{';
725
1.35k
            macroNamespace.clear();
726
1.35k
            state = State::Default;
727
1.35k
          }
728
1.18M
        } else {
729
1.18M
          macroNamespace += c;
730
1.18M
          if (!PrefixesValidMacroNamespace(macroNamespace)) {
731
350k
            result += '$';
732
350k
            result += macroNamespace;
733
350k
            macroNamespace.clear();
734
350k
            state = State::Default;
735
350k
          }
736
1.18M
        }
737
1.70M
        break;
738
739
9.43M
      case State::MacroName:
740
9.43M
        if (c == '}') {
741
517k
          auto e = ExpandMacro(result, macroNamespace, macroName,
742
517k
                               macroExpanders, version);
743
517k
          if (e != ExpandMacroResult::Ok) {
744
32.6k
            return e;
745
32.6k
          }
746
484k
          macroNamespace.clear();
747
484k
          macroName.clear();
748
484k
          state = State::Default;
749
8.92M
        } else {
750
8.92M
          macroName += c;
751
8.92M
        }
752
9.40M
        break;
753
80.7M
    }
754
80.7M
  }
755
756
196k
  switch (state) {
757
196k
    case State::Default:
758
196k
      break;
759
261
    case State::MacroNamespace:
760
261
      result += '$';
761
261
      result += macroNamespace;
762
261
      break;
763
285
    case State::MacroName:
764
285
      return ExpandMacroResult::Error;
765
196k
  }
766
767
196k
  out = std::move(result);
768
196k
  return ExpandMacroResult::Ok;
769
196k
}
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
517k
{
776
898k
  for (auto const& macroExpander : macroExpanders) {
777
898k
    auto result = (*macroExpander)(macroNamespace, macroName, out, version);
778
898k
    if (result != ExpandMacroResult::Ignore) {
779
512k
      return result;
780
512k
    }
781
898k
  }
782
783
4.38k
  if (macroNamespace == "vendor") {
784
819
    return ExpandMacroResult::Ignore;
785
819
  }
786
787
3.56k
  return ExpandMacroResult::Error;
788
4.38k
}
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
381
{
797
381
  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
378
  return true;
804
381
}
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
273
{
797
273
  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
270
  return true;
804
273
}
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
69
{
797
69
  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
69
  return true;
804
69
}
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
39
{
797
39
  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
39
  return true;
804
39
}
805
806
template <>
807
bool SetupWorkflowConfigurePreset<ConfigurePreset>(
808
  ConfigurePreset const& preset, ConfigurePreset const*& configurePreset,
809
  char const*, std::string const&, cmJSONState*)
810
420
{
811
420
  configurePreset = &preset;
812
420
  return true;
813
420
}
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.80k
{
822
1.80k
  auto it = presets.find(name);
823
1.80k
  if (it == presets.end()) {
824
1.00k
    cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name,
825
1.00k
                                                 state);
826
1.00k
    return false;
827
1.00k
  }
828
801
  if (!origin.OriginFile->ReachableFiles.count(
829
801
        it->second.Unexpanded.OriginFile)) {
830
0
    cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType,
831
0
                                                              name, state);
832
0
    return false;
833
0
  }
834
801
  return SetupWorkflowConfigurePreset<T>(
835
801
    it->second.Unexpanded, configurePreset, workflowStepType, name, state);
836
801
}
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
1.05k
{
822
1.05k
  auto it = presets.find(name);
823
1.05k
  if (it == presets.end()) {
824
636
    cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name,
825
636
                                                 state);
826
636
    return false;
827
636
  }
828
420
  if (!origin.OriginFile->ReachableFiles.count(
829
420
        it->second.Unexpanded.OriginFile)) {
830
0
    cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType,
831
0
                                                              name, state);
832
0
    return false;
833
0
  }
834
420
  return SetupWorkflowConfigurePreset<T>(
835
420
    it->second.Unexpanded, configurePreset, workflowStepType, name, state);
836
420
}
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
408
{
822
408
  auto it = presets.find(name);
823
408
  if (it == presets.end()) {
824
135
    cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name,
825
135
                                                 state);
826
135
    return false;
827
135
  }
828
273
  if (!origin.OriginFile->ReachableFiles.count(
829
273
        it->second.Unexpanded.OriginFile)) {
830
0
    cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType,
831
0
                                                              name, state);
832
0
    return false;
833
0
  }
834
273
  return SetupWorkflowConfigurePreset<T>(
835
273
    it->second.Unexpanded, configurePreset, workflowStepType, name, state);
836
273
}
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
282
{
822
282
  auto it = presets.find(name);
823
282
  if (it == presets.end()) {
824
213
    cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name,
825
213
                                                 state);
826
213
    return false;
827
213
  }
828
69
  if (!origin.OriginFile->ReachableFiles.count(
829
69
        it->second.Unexpanded.OriginFile)) {
830
0
    cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType,
831
0
                                                              name, state);
832
0
    return false;
833
0
  }
834
69
  return SetupWorkflowConfigurePreset<T>(
835
69
    it->second.Unexpanded, configurePreset, workflowStepType, name, state);
836
69
}
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
63
{
822
63
  auto it = presets.find(name);
823
63
  if (it == presets.end()) {
824
24
    cmCMakePresetsErrors::INVALID_WORKFLOW_STEPS(workflowStepType, name,
825
24
                                                 state);
826
24
    return false;
827
24
  }
828
39
  if (!origin.OriginFile->ReachableFiles.count(
829
39
        it->second.Unexpanded.OriginFile)) {
830
0
    cmCMakePresetsErrors::WORKFLOW_STEP_UNREACHABLE_FROM_FILE(workflowStepType,
831
0
                                                              name, state);
832
0
    return false;
833
0
  }
834
39
  return SetupWorkflowConfigurePreset<T>(
835
39
    it->second.Unexpanded, configurePreset, workflowStepType, name, state);
836
39
}
837
}
838
839
ExpandMacroResult BaseMacroExpander::operator()(
840
  std::string const& macroNamespace, std::string const& macroName,
841
  std::string& macroOut, int version) const
842
487k
{
843
487k
  if (macroNamespace.empty()) {
844
387k
    if (macroName == "sourceDir") {
845
36.3k
      macroOut += Graph.SourceDir;
846
36.3k
      return ExpandMacroResult::Ok;
847
36.3k
    }
848
350k
    if (macroName == "sourceParentDir") {
849
54.3k
      macroOut += cmSystemTools::GetParentDirectory(Graph.SourceDir);
850
54.3k
      return ExpandMacroResult::Ok;
851
54.3k
    }
852
296k
    if (macroName == "sourceDirName") {
853
18.0k
      macroOut += cmSystemTools::GetFilenameName(Graph.SourceDir);
854
18.0k
      return ExpandMacroResult::Ok;
855
18.0k
    }
856
278k
    if (macroName == "dollar") {
857
40.3k
      macroOut += '$';
858
40.3k
      return ExpandMacroResult::Ok;
859
40.3k
    }
860
237k
    if (macroName == "hostSystemName") {
861
7.95k
      if (version < 3) {
862
9
        return ExpandMacroResult::Error;
863
9
      }
864
7.94k
      macroOut += cmSystemTools::GetSystemName();
865
7.94k
      return ExpandMacroResult::Ok;
866
7.95k
    }
867
    // Enable fileDir macro expansion for non-preset expanders
868
230k
    if (macroName == "fileDir" && File) {
869
41.0k
      if (version < 4) {
870
0
        return ExpandMacroResult::Error;
871
0
      }
872
41.0k
      macroOut += cmSystemTools::GetParentDirectory(File.value());
873
41.0k
      return ExpandMacroResult::Ok;
874
41.0k
    }
875
189k
    if (macroName == "pathListSep") {
876
10.4k
      if (version < 5) {
877
9
        return ExpandMacroResult::Error;
878
9
      }
879
10.4k
      macroOut += cmSystemTools::GetSystemPathlistSeparator();
880
10.4k
      return ExpandMacroResult::Ok;
881
10.4k
    }
882
189k
  }
883
884
279k
  return ExpandMacroResult::Ignore;
885
487k
}
886
887
bool cmCMakePresetsGraphInternal::EqualsCondition::Evaluate(
888
  MacroExpanderVector const& expanders, int version,
889
  cm::optional<bool>& out) const
890
1.98k
{
891
1.98k
  std::string lhs = this->Lhs;
892
1.98k
  CHECK_EXPAND(out, lhs, expanders, version);
893
894
1.88k
  std::string rhs = this->Rhs;
895
1.88k
  CHECK_EXPAND(out, rhs, expanders, version);
896
897
1.86k
  out = (lhs == rhs);
898
1.86k
  return true;
899
1.88k
}
900
901
bool cmCMakePresetsGraphInternal::InListCondition::Evaluate(
902
  MacroExpanderVector const& expanders, int version,
903
  cm::optional<bool>& out) const
904
3.46k
{
905
3.46k
  std::string str = this->String;
906
3.46k
  CHECK_EXPAND(out, str, expanders, version);
907
908
4.08k
  for (auto item : this->List) {
909
4.08k
    CHECK_EXPAND(out, item, expanders, version);
910
4.08k
    if (str == item) {
911
3.13k
      out = true;
912
3.13k
      return true;
913
3.13k
    }
914
4.08k
  }
915
916
288
  out = false;
917
288
  return true;
918
3.42k
}
919
920
bool cmCMakePresetsGraphInternal::MatchesCondition::Evaluate(
921
  MacroExpanderVector const& expanders, int version,
922
  cm::optional<bool>& out) const
923
5.09k
{
924
5.09k
  std::string str = this->String;
925
5.09k
  CHECK_EXPAND(out, str, expanders, version);
926
4.76k
  std::string regexStr = this->Regex;
927
4.76k
  CHECK_EXPAND(out, regexStr, expanders, version);
928
929
4.71k
  cmsys::RegularExpression regex;
930
4.71k
  if (!regex.compile(regexStr)) {
931
342
    return false;
932
342
  }
933
934
4.37k
  out = regex.find(str);
935
4.37k
  return true;
936
4.71k
}
937
938
bool cmCMakePresetsGraphInternal::AnyAllOfCondition::Evaluate(
939
  MacroExpanderVector const& expanders, int version,
940
  cm::optional<bool>& out) const
941
4.23k
{
942
10.7k
  for (auto const& condition : this->Conditions) {
943
10.7k
    cm::optional<bool> result;
944
10.7k
    if (!condition->Evaluate(expanders, version, result)) {
945
831
      out.reset();
946
831
      return false;
947
831
    }
948
949
9.93k
    if (!result) {
950
51
      out.reset();
951
51
      return true;
952
51
    }
953
954
9.87k
    if (result == this->StopValue) {
955
3.13k
      out = result;
956
3.13k
      return true;
957
3.13k
    }
958
9.87k
  }
959
960
216
  out = !this->StopValue;
961
216
  return true;
962
4.23k
}
963
964
bool cmCMakePresetsGraphInternal::NotCondition::Evaluate(
965
  MacroExpanderVector const& expanders, int version,
966
  cm::optional<bool>& out) const
967
210
{
968
210
  out.reset();
969
210
  if (!this->SubCondition->Evaluate(expanders, version, out)) {
970
0
    out.reset();
971
0
    return false;
972
0
  }
973
210
  if (out) {
974
210
    *out = !*out;
975
210
  }
976
210
  return true;
977
210
}
978
979
bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetInherit(
980
  cmCMakePresetsGraph::Preset const& parentPreset)
981
11.5k
{
982
11.5k
  auto& preset = *this;
983
11.5k
  ConfigurePreset const& parent =
984
11.5k
    static_cast<ConfigurePreset const&>(parentPreset);
985
11.5k
  InheritString(preset.Generator, parent.Generator);
986
11.5k
  InheritString(preset.Architecture, parent.Architecture);
987
11.5k
  InheritString(preset.Toolset, parent.Toolset);
988
11.5k
  if (!preset.ArchitectureStrategy) {
989
11.5k
    preset.ArchitectureStrategy = parent.ArchitectureStrategy;
990
11.5k
  }
991
11.5k
  if (!preset.ToolsetStrategy) {
992
11.5k
    preset.ToolsetStrategy = parent.ToolsetStrategy;
993
11.5k
  }
994
11.5k
  InheritString(preset.BinaryDir, parent.BinaryDir);
995
11.5k
  InheritString(preset.InstallDir, parent.InstallDir);
996
11.5k
  InheritString(preset.ToolchainFile, parent.ToolchainFile);
997
11.5k
  InheritString(preset.GraphVizFile, parent.GraphVizFile);
998
11.5k
  InheritMap(preset.Warnings, parent.Warnings);
999
11.5k
  InheritMap(preset.Errors, parent.Errors);
1000
11.5k
  InheritOptionalValue(preset.WarnSystemVars, parent.WarnSystemVars);
1001
11.5k
  InheritMap(preset.CacheVariables, parent.CacheVariables);
1002
11.5k
  InheritOptionalValue(preset.DebugOutput, parent.DebugOutput);
1003
11.5k
  InheritOptionalValue(preset.DebugTryCompile, parent.DebugTryCompile);
1004
11.5k
  InheritOptionalValue(preset.DebugFind, parent.DebugFind);
1005
11.5k
  InheritOptionalValue(preset.TraceMode, parent.TraceMode);
1006
11.5k
  InheritOptionalValue(preset.TraceFormat, parent.TraceFormat);
1007
11.5k
  InheritVector(preset.TraceSource, parent.TraceSource);
1008
11.5k
  InheritString(preset.TraceRedirect, parent.TraceRedirect);
1009
1010
11.5k
  return true;
1011
11.5k
}
1012
1013
bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetBeforeInherit()
1014
53.1k
{
1015
53.1k
  auto& preset = *this;
1016
53.1k
  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
53.1k
  return true;
1023
53.1k
}
1024
1025
bool cmCMakePresetsGraph::ConfigurePreset::VisitPresetAfterInherit(
1026
  int version, cmJSONState* state)
1027
52.3k
{
1028
52.3k
  auto& preset = *this;
1029
52.3k
  if (!preset.Hidden) {
1030
40.4k
    if (version < 3) {
1031
1.92k
      if (preset.Generator.empty()) {
1032
204
        cmCMakePresetsErrors::PRESET_MISSING_FIELD(preset.Name, "generator",
1033
204
                                                   state);
1034
204
        return false;
1035
204
      }
1036
1.72k
      if (preset.BinaryDir.empty()) {
1037
27
        cmCMakePresetsErrors::PRESET_MISSING_FIELD(preset.Name, "binaryDir",
1038
27
                                                   state);
1039
27
        return false;
1040
27
      }
1041
1.72k
    }
1042
1043
40.1k
    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
40.1k
    if (preset.CacheVariables.count("") != 0) {
1060
3
      this->ErrorDetail = "Empty cache variable names are not allowed";
1061
3
      return false;
1062
3
    }
1063
40.1k
  }
1064
1065
52.0k
  return true;
1066
52.3k
}
1067
1068
bool cmCMakePresetsGraph::BuildPreset::VisitPresetInherit(
1069
  cmCMakePresetsGraph::Preset const& parentPreset)
1070
93
{
1071
93
  auto& preset = *this;
1072
93
  BuildPreset const& parent = static_cast<BuildPreset const&>(parentPreset);
1073
1074
93
  InheritString(preset.ConfigurePreset, parent.ConfigurePreset);
1075
93
  InheritOptionalValue(preset.InheritConfigureEnvironment,
1076
93
                       parent.InheritConfigureEnvironment);
1077
93
  InheritOptionalValue(preset.Jobs, parent.Jobs);
1078
93
  InheritVector(preset.Targets, parent.Targets);
1079
93
  InheritString(preset.Configuration, parent.Configuration);
1080
93
  InheritOptionalValue(preset.CleanFirst, parent.CleanFirst);
1081
93
  InheritOptionalValue(preset.Verbose, parent.Verbose);
1082
93
  InheritVector(preset.NativeToolOptions, parent.NativeToolOptions);
1083
93
  if (!preset.ResolvePackageReferences) {
1084
93
    preset.ResolvePackageReferences = parent.ResolvePackageReferences;
1085
93
  }
1086
1087
93
  return true;
1088
93
}
1089
1090
bool cmCMakePresetsGraph::BuildPreset::VisitPresetAfterInherit(
1091
  int /* version */, cmJSONState* /*stat*/)
1092
4.49k
{
1093
4.49k
  if (!this->Hidden && this->ConfigurePreset.empty()) {
1094
438
    this->ErrorDetail = "Build presets must either be hidden or have an "
1095
438
                        "associated configure preset";
1096
438
    return false;
1097
438
  }
1098
4.05k
  return true;
1099
4.49k
}
1100
1101
bool cmCMakePresetsGraph::TestPreset::VisitPresetInherit(
1102
  cmCMakePresetsGraph::Preset const& parentPreset)
1103
81
{
1104
81
  auto& preset = *this;
1105
81
  TestPreset const& parent = static_cast<TestPreset const&>(parentPreset);
1106
1107
81
  InheritString(preset.ConfigurePreset, parent.ConfigurePreset);
1108
81
  InheritOptionalValue(preset.InheritConfigureEnvironment,
1109
81
                       parent.InheritConfigureEnvironment);
1110
81
  InheritString(preset.Configuration, parent.Configuration);
1111
81
  InheritVector(preset.OverwriteConfigurationFile,
1112
81
                parent.OverwriteConfigurationFile);
1113
1114
81
  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
81
  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
81
  if (parent.Execution) {
1175
0
    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
0
    } else {
1198
0
      preset.Execution = parent.Execution;
1199
0
    }
1200
0
  }
1201
1202
81
  return true;
1203
81
}
1204
1205
bool cmCMakePresetsGraph::TestPreset::VisitPresetAfterInherit(
1206
  int /* version */, cmJSONState* /*state*/)
1207
3.37k
{
1208
3.37k
  if (!this->Hidden && this->ConfigurePreset.empty()) {
1209
444
    this->ErrorDetail = "Test presets must either be hidden or have an "
1210
444
                        "associated configure preset";
1211
444
    return false;
1212
444
  }
1213
2.93k
  return true;
1214
3.37k
}
1215
1216
bool cmCMakePresetsGraph::PackagePreset::VisitPresetInherit(
1217
  cmCMakePresetsGraph::Preset const& parentPreset)
1218
0
{
1219
0
  auto& preset = *this;
1220
0
  PackagePreset const& parent =
1221
0
    static_cast<PackagePreset const&>(parentPreset);
1222
1223
0
  InheritString(preset.ConfigurePreset, parent.ConfigurePreset);
1224
0
  InheritOptionalValue(preset.InheritConfigureEnvironment,
1225
0
                       parent.InheritConfigureEnvironment);
1226
0
  InheritVector(preset.Generators, parent.Generators);
1227
0
  InheritVector(preset.Configurations, parent.Configurations);
1228
0
  InheritMap(preset.Variables, parent.Variables);
1229
0
  InheritOptionalValue(preset.DebugOutput, parent.DebugOutput);
1230
0
  InheritOptionalValue(preset.VerboseOutput, parent.VerboseOutput);
1231
0
  InheritString(preset.PackageName, parent.PackageName);
1232
0
  InheritString(preset.PackageVersion, parent.PackageVersion);
1233
0
  InheritString(preset.PackageDirectory, parent.PackageDirectory);
1234
0
  InheritString(preset.VendorName, parent.VendorName);
1235
1236
0
  return true;
1237
0
}
1238
1239
bool cmCMakePresetsGraph::PackagePreset::VisitPresetAfterInherit(
1240
  int /* version */, cmJSONState* /*state*/)
1241
2.21k
{
1242
2.21k
  if (!this->Hidden && this->ConfigurePreset.empty()) {
1243
492
    this->ErrorDetail = "Package presets must either be hidden or have an "
1244
492
                        "associated configure preset";
1245
492
    return false;
1246
492
  }
1247
1.72k
  return true;
1248
2.21k
}
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.74k
{
1259
1.74k
  return true;
1260
1.74k
}
1261
1262
std::string cmCMakePresetsGraph::GetFilename(std::string const& sourceDir)
1263
16.4k
{
1264
16.4k
  return cmStrCat(sourceDir, "/CMakePresets.json");
1265
16.4k
}
1266
1267
std::string cmCMakePresetsGraph::GetUserFilename(std::string const& sourceDir)
1268
22.5k
{
1269
22.5k
  return cmStrCat(sourceDir, "/CMakeUserPresets.json");
1270
22.5k
}
1271
1272
bool cmCMakePresetsGraph::ReadProjectPresets(std::string const& sourceDir,
1273
                                             std::string const& presetsFile,
1274
                                             ReadOption readFilesOption)
1275
33.7k
{
1276
33.7k
  this->SourceDir = cmSystemTools::CollapseFullPath(sourceDir);
1277
33.7k
  this->ClearPresets();
1278
1279
33.7k
  if (!this->ReadProjectPresetsInternal(presetsFile, readFilesOption)) {
1280
27.0k
    this->ClearPresets();
1281
27.0k
    return false;
1282
27.0k
  }
1283
1284
6.74k
  return true;
1285
33.7k
}
1286
1287
std::string cmCMakePresetsGraph::GetGeneratorForPreset(
1288
  std::string const& presetName) const
1289
83.6k
{
1290
83.6k
  auto configurePresetName = presetName;
1291
1292
83.6k
  auto buildPresetIterator = this->BuildPresets.find(presetName);
1293
83.6k
  if (buildPresetIterator != this->BuildPresets.end()) {
1294
14.3k
    configurePresetName =
1295
14.3k
      buildPresetIterator->second.Unexpanded.ConfigurePreset;
1296
69.3k
  } else {
1297
69.3k
    auto testPresetIterator = this->TestPresets.find(presetName);
1298
69.3k
    if (testPresetIterator != this->TestPresets.end()) {
1299
7.95k
      configurePresetName =
1300
7.95k
        testPresetIterator->second.Unexpanded.ConfigurePreset;
1301
7.95k
    }
1302
69.3k
  }
1303
1304
83.6k
  auto configurePresetIterator =
1305
83.6k
    this->ConfigurePresets.find(configurePresetName);
1306
83.6k
  if (configurePresetIterator != this->ConfigurePresets.end()) {
1307
76.1k
    return configurePresetIterator->second.Unexpanded.Generator;
1308
76.1k
  }
1309
1310
  // This should only happen if the preset is hidden
1311
  // or (for build or test presets) if ConfigurePreset is invalid.
1312
7.52k
  return {};
1313
83.6k
}
1314
1315
template <typename T>
1316
bool cmCMakePresetsGraph::ResolveDependentPresets(
1317
  std::map<std::string, PresetPair<T>>& presets)
1318
24.5k
{
1319
24.5k
  for (auto& it : presets) {
1320
4.37k
    if (!it.second.Unexpanded.Hidden) {
1321
4.37k
      auto const configurePreset =
1322
4.37k
        this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset);
1323
4.37k
      if (configurePreset == this->ConfigurePresets.end()) {
1324
492
        cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND(
1325
492
          it.first, T::kind(), it.second.Unexpanded.ConfigurePreset,
1326
492
          &this->parseState);
1327
492
        return false;
1328
492
      }
1329
3.88k
      if (!it.second.Unexpanded.OriginFile->ReachableFiles.count(
1330
3.88k
            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.88k
      if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) {
1337
3.88k
        it.second.Unexpanded.Environment.insert(
1338
3.88k
          configurePreset->second.Unexpanded.Environment.begin(),
1339
3.88k
          configurePreset->second.Unexpanded.Environment.end());
1340
3.88k
      }
1341
3.88k
    }
1342
3.88k
    if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) {
1343
447
      cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first,
1344
447
                                                    &this->parseState);
1345
447
      return false;
1346
447
    }
1347
3.88k
  }
1348
23.6k
  return true;
1349
24.5k
}
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
8.75k
{
1319
8.75k
  for (auto& it : presets) {
1320
2.16k
    if (!it.second.Unexpanded.Hidden) {
1321
2.16k
      auto const configurePreset =
1322
2.16k
        this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset);
1323
2.16k
      if (configurePreset == this->ConfigurePresets.end()) {
1324
360
        cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND(
1325
360
          it.first, T::kind(), it.second.Unexpanded.ConfigurePreset,
1326
360
          &this->parseState);
1327
360
        return false;
1328
360
      }
1329
1.80k
      if (!it.second.Unexpanded.OriginFile->ReachableFiles.count(
1330
1.80k
            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.80k
      if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) {
1337
1.80k
        it.second.Unexpanded.Environment.insert(
1338
1.80k
          configurePreset->second.Unexpanded.Environment.begin(),
1339
1.80k
          configurePreset->second.Unexpanded.Environment.end());
1340
1.80k
      }
1341
1.80k
    }
1342
1.80k
    if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) {
1343
447
      cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first,
1344
447
                                                    &this->parseState);
1345
447
      return false;
1346
447
    }
1347
1.80k
  }
1348
7.94k
  return true;
1349
8.75k
}
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
7.94k
{
1319
7.94k
  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
108
        cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND(
1325
108
          it.first, T::kind(), it.second.Unexpanded.ConfigurePreset,
1326
108
          &this->parseState);
1327
108
        return false;
1328
108
      }
1329
1.10k
      if (!it.second.Unexpanded.OriginFile->ReachableFiles.count(
1330
1.10k
            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.10k
      if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) {
1337
1.10k
        it.second.Unexpanded.Environment.insert(
1338
1.10k
          configurePreset->second.Unexpanded.Environment.begin(),
1339
1.10k
          configurePreset->second.Unexpanded.Environment.end());
1340
1.10k
      }
1341
1.10k
    }
1342
1.10k
    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.10k
  }
1348
7.83k
  return true;
1349
7.94k
}
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
7.83k
{
1319
7.83k
  for (auto& it : presets) {
1320
999
    if (!it.second.Unexpanded.Hidden) {
1321
999
      auto const configurePreset =
1322
999
        this->ConfigurePresets.find(it.second.Unexpanded.ConfigurePreset);
1323
999
      if (configurePreset == this->ConfigurePresets.end()) {
1324
24
        cmCMakePresetsErrors::CONFIGURE_PRESET_NOT_FOUND(
1325
24
          it.first, T::kind(), it.second.Unexpanded.ConfigurePreset,
1326
24
          &this->parseState);
1327
24
        return false;
1328
24
      }
1329
975
      if (!it.second.Unexpanded.OriginFile->ReachableFiles.count(
1330
975
            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
975
      if (it.second.Unexpanded.InheritConfigureEnvironment.value_or(true)) {
1337
975
        it.second.Unexpanded.Environment.insert(
1338
975
          configurePreset->second.Unexpanded.Environment.begin(),
1339
975
          configurePreset->second.Unexpanded.Environment.end());
1340
975
      }
1341
975
    }
1342
975
    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
975
  }
1348
7.81k
  return true;
1349
7.83k
}
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
33.7k
{
1366
33.7k
  bool haveOneFile = false;
1367
1368
33.7k
  File* file;
1369
33.7k
  std::string filename;
1370
33.7k
  std::vector<File*> inProgressFiles;
1371
33.7k
  if (!presetsFile.empty()) {
1372
11.2k
    filename = presetsFile;
1373
11.2k
    if (cmSystemTools::FileExists(filename)) {
1374
11.2k
      if (!this->ReadJSONFile(filename, RootType::Any, ReadReason::Root,
1375
11.2k
                              inProgressFiles, file, this->errors)) {
1376
6.06k
        return false;
1377
6.06k
      }
1378
5.18k
      haveOneFile = true;
1379
5.18k
    }
1380
22.5k
  } else {
1381
22.5k
    filename = GetUserFilename(this->SourceDir);
1382
22.5k
    if (cmSystemTools::FileExists(filename)) {
1383
11.2k
      if (!this->ReadJSONFile(filename, RootType::User, ReadReason::Root,
1384
11.2k
                              inProgressFiles, file, this->errors)) {
1385
6.06k
        return false;
1386
6.06k
      }
1387
5.18k
      haveOneFile = true;
1388
11.2k
    } else {
1389
11.2k
      filename = GetFilename(this->SourceDir);
1390
11.2k
      if (cmSystemTools::FileExists(filename)) {
1391
11.2k
        if (!this->ReadJSONFile(filename, RootType::Project, ReadReason::Root,
1392
11.2k
                                inProgressFiles, file, this->errors)) {
1393
6.06k
          return false;
1394
6.06k
        }
1395
5.18k
        haveOneFile = true;
1396
5.18k
      }
1397
11.2k
    }
1398
22.5k
  }
1399
33.7k
  assert(inProgressFiles.empty());
1400
1401
15.5k
  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
15.5k
  bool result = ComputePresetInheritance(this->ConfigurePresets, *this) &&
1410
14.5k
    ComputePresetInheritance(this->BuildPresets, *this) &&
1411
13.6k
    ComputePresetInheritance(this->TestPresets, *this) &&
1412
12.8k
    ComputePresetInheritance(this->PackagePresets, *this) &&
1413
12.2k
    ComputePresetInheritance(this->WorkflowPresets, *this);
1414
15.5k
  if (!result) {
1415
3.31k
    return false;
1416
3.31k
  }
1417
1418
33.6k
  for (auto& it : this->ConfigurePresets) {
1419
33.6k
    if (!ExpandMacros(this, it.second.Unexpanded, it.second.Expanded)) {
1420
3.48k
      cmCMakePresetsErrors::INVALID_MACRO_EXPANSION(it.first,
1421
3.48k
                                                    &this->parseState);
1422
3.48k
      return false;
1423
3.48k
    }
1424
33.6k
  }
1425
1426
8.75k
  if (!ResolveDependentPresets(this->BuildPresets) ||
1427
7.94k
      !ResolveDependentPresets(this->TestPresets) ||
1428
7.83k
      !ResolveDependentPresets(this->PackagePresets)) {
1429
939
    return false;
1430
939
  }
1431
1432
7.81k
  for (auto& it : this->WorkflowPresets) {
1433
1.11k
    using Type = WorkflowPreset::WorkflowStep::Type;
1434
1435
1.11k
    ConfigurePreset const* configurePreset = nullptr;
1436
1.86k
    for (auto const& step : it.second.Unexpanded.Steps) {
1437
1.86k
      char const* const stepType = WorkflowStepTypeToString(step.PresetType);
1438
1.86k
      if (!configurePreset && step.PresetType != Type::Configure) {
1439
48
        cmCMakePresetsErrors::FIRST_WORKFLOW_STEP_NOT_CONFIGURE(
1440
48
          stepType, step.PresetName, &this->parseState);
1441
48
        return false;
1442
48
      }
1443
1.81k
      if (configurePreset && step.PresetType == Type::Configure) {
1444
6
        cmCMakePresetsErrors::CONFIGURE_WORKFLOW_STEP_NOT_FIRST(
1445
6
          stepType, step.PresetName, &this->parseState);
1446
6
        return false;
1447
6
      }
1448
1449
1.80k
      switch (step.PresetType) {
1450
1.05k
        case Type::Configure:
1451
1.05k
          result = TryReachPresetFromWorkflow(
1452
1.05k
            it.second.Unexpanded, this->ConfigurePresets, step.PresetName,
1453
1.05k
            stepType, configurePreset, &this->parseState);
1454
1.05k
          break;
1455
408
        case Type::Build:
1456
408
          result = TryReachPresetFromWorkflow(
1457
408
            it.second.Unexpanded, this->BuildPresets, step.PresetName,
1458
408
            stepType, configurePreset, &this->parseState);
1459
408
          break;
1460
282
        case Type::Test:
1461
282
          result = TryReachPresetFromWorkflow(
1462
282
            it.second.Unexpanded, this->TestPresets, step.PresetName, stepType,
1463
282
            configurePreset, &this->parseState);
1464
282
          break;
1465
63
        case Type::Package:
1466
63
          result = TryReachPresetFromWorkflow(
1467
63
            it.second.Unexpanded, this->PackagePresets, step.PresetName,
1468
63
            stepType, configurePreset, &this->parseState);
1469
63
          break;
1470
1.80k
      }
1471
1.80k
      if (!result) {
1472
1.01k
        return false;
1473
1.01k
      }
1474
1.80k
    }
1475
1476
48
    if (!configurePreset) {
1477
9
      cmCMakePresetsErrors::NO_WORKFLOW_STEPS(it.first, &this->parseState);
1478
9
      return false;
1479
9
    }
1480
1481
39
    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
39
  }
1487
1488
6.74k
  return true;
1489
7.81k
}
1490
1491
void cmCMakePresetsGraph::ClearPresets()
1492
60.7k
{
1493
60.7k
  this->ConfigurePresets.clear();
1494
60.7k
  this->BuildPresets.clear();
1495
60.7k
  this->TestPresets.clear();
1496
60.7k
  this->PackagePresets.clear();
1497
60.7k
  this->WorkflowPresets.clear();
1498
1499
60.7k
  this->ConfigurePresetOrder.clear();
1500
60.7k
  this->BuildPresetOrder.clear();
1501
60.7k
  this->TestPresetOrder.clear();
1502
60.7k
  this->PackagePresetOrder.clear();
1503
60.7k
  this->WorkflowPresetOrder.clear();
1504
1505
60.7k
  this->Files.clear();
1506
60.7k
}
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
}