/* 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 #include #include #include #include // 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, , , , )` // 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_STRICT, 13) \ SELECT(ACTION, Ignore, CMD_STRICT, CMD_INSTALL_ABSOLUTE_DESTINATION, 12) \ SELECT(ACTION, Ignore, CMD_STRICT, CMD_NON_TARGET_DIRECTIVE, 13) \ 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(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 GetDiagnosticAction( cm::string_view name); //! Convert a string category into an identifier static cm::optional GetDiagnosticCategory( cm::string_view name); /** Represent a set of diagnostic category actions. */ struct DiagnosticMap : public std::array { DiagnosticMap() : array{} {}; }; }; using cmDiagnosticCategory = cmDiagnostics::DiagnosticCategory; using cmDiagnosticAction = cmDiagnostics::DiagnosticAction;