mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-10 17:14:10 +00:00
Replace duplicated inline preset lookup/validation logic in cmake.cxx,
cmCTest.cxx, and cpack.cxx with a shared ResolvePreset<T> template
method on cmCMakePresetsGraph.
Use the PresetType::kind() static method introduced in commit
0f3347bb27 (cmCMakePresetsGraph: generalize printing presets of
different types) to derive error message strings, replacing the
runtime presetType string parameter with a template parameter.
Error messages for configure presets now consistently include
"configure" in the preset type (e.g., "No such configure preset")
matching the pattern used by build, test, and package presets.
117 lines
4.0 KiB
C++
117 lines
4.0 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#include <cassert>
|
|
#include <map>
|
|
#include <string>
|
|
|
|
#include <cm/optional>
|
|
|
|
#include "cmCMakePresetsGraph.h"
|
|
#include "cmStringAlgorithms.h"
|
|
|
|
template <class T>
|
|
cmCMakePresetsGraph::PresetResolveResult<T> cmCMakePresetsGraph::ResolvePreset(
|
|
std::string const& presetName,
|
|
std::map<std::string, PresetPair<T>> const& presets) const
|
|
{
|
|
using Result = PresetResolveResult<T>;
|
|
Result result;
|
|
|
|
auto presetPair = presets.find(presetName);
|
|
if (presetPair == presets.end()) {
|
|
result.StatusCode = Result::Status::NotFound;
|
|
result.ErrorPresetName = presetName;
|
|
return result;
|
|
}
|
|
if (presetPair->second.Unexpanded.Hidden) {
|
|
result.StatusCode = Result::Status::Hidden;
|
|
result.ErrorPresetName = presetName;
|
|
return result;
|
|
}
|
|
if (!presetPair->second.Expanded) {
|
|
result.StatusCode = Result::Status::InvalidMacroExpansion;
|
|
result.ErrorPresetName = presetName;
|
|
return result;
|
|
}
|
|
if (!presetPair->second.Expanded->ConditionResult) {
|
|
result.StatusCode = Result::Status::Disabled;
|
|
result.ErrorPresetName = presetName;
|
|
return result;
|
|
}
|
|
|
|
result.Preset = &*presetPair->second.Expanded;
|
|
return result;
|
|
}
|
|
|
|
// Explicit template instantiations
|
|
template cmCMakePresetsGraph::PresetResolveResult<
|
|
cmCMakePresetsGraph::ConfigurePreset>
|
|
cmCMakePresetsGraph::ResolvePreset(
|
|
std::string const&,
|
|
std::map<std::string,
|
|
PresetPair<cmCMakePresetsGraph::ConfigurePreset>> const&) const;
|
|
|
|
template cmCMakePresetsGraph::PresetResolveResult<
|
|
cmCMakePresetsGraph::BuildPreset>
|
|
cmCMakePresetsGraph::ResolvePreset(
|
|
std::string const&,
|
|
std::map<std::string, PresetPair<cmCMakePresetsGraph::BuildPreset>> const&)
|
|
const;
|
|
|
|
template cmCMakePresetsGraph::PresetResolveResult<
|
|
cmCMakePresetsGraph::TestPreset>
|
|
cmCMakePresetsGraph::ResolvePreset(
|
|
std::string const&,
|
|
std::map<std::string, PresetPair<cmCMakePresetsGraph::TestPreset>> const&)
|
|
const;
|
|
|
|
template cmCMakePresetsGraph::PresetResolveResult<
|
|
cmCMakePresetsGraph::PackagePreset>
|
|
cmCMakePresetsGraph::ResolvePreset(
|
|
std::string const&,
|
|
std::map<std::string, PresetPair<cmCMakePresetsGraph::PackagePreset>> const&)
|
|
const;
|
|
|
|
template <class T>
|
|
cm::optional<std::string> cmCMakePresetsGraph::FormatPresetError(
|
|
PresetResolveStatus status, std::string const& errorPresetName,
|
|
std::string const& directory)
|
|
{
|
|
using Status = PresetResolveStatus;
|
|
switch (status) {
|
|
case Status::NotFound:
|
|
return cmStrCat("No such ", T::kind(), " preset in ", directory, ": \"",
|
|
errorPresetName, '"');
|
|
case Status::Hidden:
|
|
return cmStrCat("Cannot use hidden ", T::kind(), " preset in ",
|
|
directory, ": \"", errorPresetName, '"');
|
|
case Status::InvalidMacroExpansion:
|
|
return cmStrCat("Could not evaluate ", T::kind(), " preset \"",
|
|
errorPresetName, "\": Invalid macro expansion");
|
|
case Status::Disabled:
|
|
return cmStrCat("Cannot use disabled ", T::kind(), " preset in ",
|
|
directory, ": \"", errorPresetName, '"');
|
|
case Status::Success:
|
|
return cm::nullopt;
|
|
}
|
|
assert(false && "Unreachable.");
|
|
return cm::nullopt;
|
|
}
|
|
|
|
// Explicit template instantiations for FormatPresetError
|
|
template cm::optional<std::string>
|
|
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::ConfigurePreset>(
|
|
PresetResolveStatus, std::string const&, std::string const&);
|
|
|
|
template cm::optional<std::string>
|
|
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::BuildPreset>(
|
|
PresetResolveStatus, std::string const&, std::string const&);
|
|
|
|
template cm::optional<std::string>
|
|
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::TestPreset>(
|
|
PresetResolveStatus, std::string const&, std::string const&);
|
|
|
|
template cm::optional<std::string>
|
|
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::PackagePreset>(
|
|
PresetResolveStatus, std::string const&, std::string const&);
|