mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
Add new diagnostic categories CMD_POLICY and CMD_EXPERIMENTAL, both as children of CMD_AUTHOR. Use the former when issuing policy warnings. Use the latter when issuing experimental feature warnings.
115 lines
3.9 KiB
C++
115 lines
3.9 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <array>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
#include <cm/optional>
|
|
#include <cm/string_view>
|
|
|
|
// https://github.com/include-what-you-use/include-what-you-use/issues/1934
|
|
// IWYU pragma: no_forward_declare cmDiagnostics::DiagnosticAction
|
|
// IWYU pragma: no_forward_declare cmDiagnostics::DiagnosticCategory
|
|
|
|
// The list of diagnostic categories along with their associated data.
|
|
// Each entry is of the form:
|
|
// `SELECT(ACTION, <default>, <parent>, <name>, <preset-version>)`
|
|
// Entries MUST appear in the order that a depth-first enumeration would
|
|
// produce.
|
|
//
|
|
// When changing this table, Utilities/Scripts/regenerate-presets.py must be
|
|
// run to update the JSON schema for CMake presets. If the _TABLE macro name
|
|
// changes, said script will also need to be updated with the new name.
|
|
|
|
#define CM_FOR_EACH_DIAGNOSTIC_TABLE(ACTION, SELECT) \
|
|
SELECT(ACTION, Warn, CMD_NONE, CMD_AUTHOR, 12) \
|
|
SELECT(ACTION, Warn, CMD_AUTHOR, CMD_DEPRECATED, 1) \
|
|
SELECT(ACTION, Warn, CMD_AUTHOR, CMD_EXPERIMENTAL, 12) \
|
|
SELECT(ACTION, Ignore, CMD_AUTHOR, CMD_INSTALL_ABSOLUTE_DESTINATION, 12) \
|
|
SELECT(ACTION, Warn, CMD_AUTHOR, CMD_POLICY, 12) \
|
|
SELECT(ACTION, Ignore, CMD_NONE, CMD_UNINITIALIZED, 1) \
|
|
SELECT(ACTION, Warn, CMD_NONE, CMD_UNUSED_CLI, 1)
|
|
|
|
#define CM_SELECT_CATEGORY(F, D, P, C, V) F(C)
|
|
#define CM_FOR_EACH_DIAGNOSTIC_CATEGORY(ACTION) \
|
|
CM_FOR_EACH_DIAGNOSTIC_TABLE(ACTION, CM_SELECT_CATEGORY)
|
|
|
|
/** \class cmDiagnostics
|
|
* \brief Handles CMake diagnostic (warning) behavior
|
|
*
|
|
* See the cmake-diagnostics(7) manual for an overview of this class's purpose.
|
|
*/
|
|
class cmDiagnostics
|
|
{
|
|
public:
|
|
/// Action to take when a diagnostic is triggered
|
|
enum DiagnosticAction : std::uint8_t
|
|
{
|
|
Undefined = 0,
|
|
Ignore,
|
|
Warn,
|
|
SendError,
|
|
FatalError,
|
|
};
|
|
|
|
/// Diagnostic category identifiers
|
|
enum DiagnosticCategory : unsigned
|
|
{
|
|
CMD_NONE,
|
|
#define DIAGNOSTIC_ENUM(CATEGORY) CATEGORY,
|
|
CM_FOR_EACH_DIAGNOSTIC_CATEGORY(DIAGNOSTIC_ENUM)
|
|
#undef DIAGNOSTIC_ENUM
|
|
|
|
/** \brief Always the last entry.
|
|
*
|
|
* Used to determine the number of diagnostic categories. Also useful to
|
|
* avoid adding a comma the last diagnostic category when adding a new one.
|
|
*/
|
|
CMD_COUNT
|
|
};
|
|
constexpr static size_t CategoryCount = static_cast<size_t>(CMD_COUNT);
|
|
|
|
struct DiagnosticCategoryInformation
|
|
{
|
|
DiagnosticCategory Parent;
|
|
DiagnosticAction DefaultAction;
|
|
int PresetVersion;
|
|
};
|
|
|
|
constexpr static DiagnosticCategoryInformation
|
|
CategoryInfo[CategoryCount] = {
|
|
{ CMD_NONE, Undefined, 0 }, // CMD_NONE
|
|
#define DIAGNOSTIC_CATEGORY_INFO(F, D, P, C, V) { P, D, V },
|
|
CM_FOR_EACH_DIAGNOSTIC_TABLE(UNUSED, DIAGNOSTIC_CATEGORY_INFO)
|
|
#undef DIAGNOSTIC_CATEGORY_INFO
|
|
};
|
|
|
|
//! convert an action identifier into a string
|
|
static cm::string_view GetActionString(DiagnosticAction);
|
|
|
|
//! convert a category identifier into a string
|
|
static cm::string_view GetCategoryString(DiagnosticCategory);
|
|
|
|
//! Convert a string action into an identifier
|
|
static cm::optional<DiagnosticAction> GetDiagnosticAction(
|
|
cm::string_view name);
|
|
|
|
//! Convert a string category into an identifier
|
|
static cm::optional<DiagnosticCategory> GetDiagnosticCategory(
|
|
cm::string_view name);
|
|
|
|
/** Represent a set of diagnostic category actions. */
|
|
struct DiagnosticMap : public std::array<DiagnosticAction, CategoryCount>
|
|
{
|
|
DiagnosticMap()
|
|
: array{} {};
|
|
};
|
|
};
|
|
|
|
using cmDiagnosticCategory = cmDiagnostics::DiagnosticCategory;
|
|
using cmDiagnosticAction = cmDiagnostics::DiagnosticAction;
|