mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-13 17:07:57 +00:00
Modify the script that generates the CMake presets schema to extract the list of available diagnostics from the `cmDiagnostics.h` header and generate the relevant properties. This information is combined with a partial set that remains in the YAML for those diagnostics whose definitions differ from what is easily generated. While these special cases will remain, the addition of new diagnostics should no longer require manual updates to the YAML. (The presets version log will still require manual updates.)
108 lines
3.6 KiB
C++
108 lines
3.6 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, 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 cmDiagnostic
|
|
* \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. */
|
|
using DiagnosticMap = std::array<DiagnosticAction, CategoryCount>;
|
|
};
|
|
|
|
using cmDiagnosticCategory = cmDiagnostics::DiagnosticCategory;
|
|
using cmDiagnosticAction = cmDiagnostics::DiagnosticAction;
|