mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
In debug builds, we assert and abort to give more useful crashes for development (i.e., instead of triggering UB). Otherwise, we get the optimization benefits of `unreachable()` (or the older platform-specific fallbacks per `cm/utility`).
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 <map>
|
|
#include <string>
|
|
|
|
#include <cm/optional>
|
|
|
|
#include "cmCMakePresetsGraph.h"
|
|
#include "cmStringAlgorithms.h"
|
|
#include "cmUnreachable.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;
|
|
}
|
|
CM_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&);
|