mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-13 17:07:57 +00:00
Add `-Winstall-absolute-destination` diagnostic to warn or error when an install command has an absolute destination. This allow projects to enforce the best practice of not allowing absolute install DESTINATIONS.
109 lines
3.7 KiB
C++
109 lines
3.7 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_AUTHOR, CMD_INSTALL_ABSOLUTE_DESTINATION, 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 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;
|