mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-09 23:30:35 -06:00
cmPolicies: Simplify representation of removed policies
A policy that can be set defaults to `WARN` internally. A policy that has been removed always uses `NEW`. The `REQUIRED_IF_USED` and `REQUIRED_ALWAYS` states are not needed.
This commit is contained in:
@@ -4629,10 +4629,9 @@ bool cmMakefile::SetPolicy(const char* id, cmPolicies::PolicyStatus status)
|
||||
bool cmMakefile::SetPolicy(cmPolicies::PolicyID id,
|
||||
cmPolicies::PolicyStatus status)
|
||||
{
|
||||
// A REQUIRED_ALWAYS policy may be set only to NEW.
|
||||
if (status != cmPolicies::NEW &&
|
||||
cmPolicies::GetPolicyStatus(id) == cmPolicies::REQUIRED_ALWAYS) {
|
||||
std::string msg = cmPolicies::GetRequiredAlwaysPolicyError(id);
|
||||
// A removed policy may be set only to NEW.
|
||||
if (cmPolicies::IsRemoved(id) && status != cmPolicies::NEW) {
|
||||
std::string msg = cmPolicies::GetRemovedPolicyError(id);
|
||||
this->IssueMessage(MessageType::FATAL_ERROR, msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -57,6 +57,10 @@ static bool stringToId(const char* input, cmPolicies::PolicyID& pid)
|
||||
#define CM_FOR_EACH_POLICY_ID_DOC(POLICY) \
|
||||
CM_FOR_EACH_POLICY_TABLE(POLICY, CM_SELECT_ID_DOC)
|
||||
|
||||
#define CM_SELECT_ID_STATUS(F, A1, A2, A3, A4, A5, A6) F(A1, A6)
|
||||
#define CM_FOR_EACH_POLICY_ID_STATUS(POLICY) \
|
||||
CM_FOR_EACH_POLICY_TABLE(POLICY, CM_SELECT_ID_STATUS)
|
||||
|
||||
static const char* idToString(cmPolicies::PolicyID id)
|
||||
{
|
||||
switch (id) {
|
||||
@@ -119,6 +123,23 @@ static const char* idToShortDescription(cmPolicies::PolicyID id)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
namespace {
|
||||
cmPolicies::PolicyStatus idToStatus(cmPolicies::PolicyID id)
|
||||
{
|
||||
switch (id) {
|
||||
#define POLICY_CASE(ID, STATUS) \
|
||||
case cmPolicies::ID: \
|
||||
return cmPolicies::STATUS;
|
||||
// NOLINTNEXTLINE(bugprone-branch-clone)
|
||||
CM_FOR_EACH_POLICY_ID_STATUS(POLICY_CASE)
|
||||
#undef POLICY_CASE
|
||||
case cmPolicies::CMPCOUNT:
|
||||
break;
|
||||
}
|
||||
return cmPolicies::WARN;
|
||||
}
|
||||
}
|
||||
|
||||
static void DiagnoseAncientPolicies(
|
||||
std::vector<cmPolicies::PolicyID> const& ancient, unsigned int majorVer,
|
||||
unsigned int minorVer, unsigned int patchVer, cmMakefile* mf)
|
||||
@@ -284,7 +305,7 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile* mf, unsigned int majorVer,
|
||||
for (PolicyID pid = cmPolicies::CMP0000; pid != cmPolicies::CMPCOUNT;
|
||||
pid = static_cast<PolicyID>(pid + 1)) {
|
||||
if (isPolicyNewerThan(pid, majorVer, minorVer, patchVer)) {
|
||||
if (cmPolicies::GetPolicyStatus(pid) == cmPolicies::REQUIRED_ALWAYS) {
|
||||
if (cmPolicies::IsRemoved(pid)) {
|
||||
ancientPolicies.push_back(pid);
|
||||
} else {
|
||||
cmPolicies::PolicyStatus status = cmPolicies::WARN;
|
||||
@@ -377,14 +398,12 @@ std::string cmPolicies::GetRequiredPolicyError(cmPolicies::PolicyID id)
|
||||
"Run \"cmake --help-command cmake_policy\" for more information.");
|
||||
}
|
||||
|
||||
//! Get the default status for a policy
|
||||
cmPolicies::PolicyStatus cmPolicies::GetPolicyStatus(
|
||||
cmPolicies::PolicyID /*unused*/)
|
||||
bool cmPolicies::IsRemoved(cmPolicies::PolicyID id)
|
||||
{
|
||||
return cmPolicies::WARN;
|
||||
return idToStatus(id) == cmPolicies::NEW;
|
||||
}
|
||||
|
||||
std::string cmPolicies::GetRequiredAlwaysPolicyError(cmPolicies::PolicyID id)
|
||||
std::string cmPolicies::GetRemovedPolicyError(cmPolicies::PolicyID id)
|
||||
{
|
||||
std::string pid = idToString(id);
|
||||
return cmStrCat(
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
|
||||
class cmMakefile;
|
||||
|
||||
// Each policy has a short description, the version of CMake in which
|
||||
// it was introduced, and its default status. The status is WARN for
|
||||
// existing policies and NEW for removed policies.
|
||||
|
||||
#define CM_FOR_EACH_POLICY_TABLE(POLICY, SELECT) \
|
||||
SELECT(POLICY, CMP0000, \
|
||||
"A minimum required CMake version must be specified.", 2, 6, 0, \
|
||||
@@ -634,8 +638,8 @@ public:
|
||||
//! convert a string policy ID into a number
|
||||
static bool GetPolicyID(const char* id, /* out */ cmPolicies::PolicyID& pid);
|
||||
|
||||
//! Get the default status for a policy
|
||||
static cmPolicies::PolicyStatus GetPolicyStatus(cmPolicies::PolicyID id);
|
||||
//! Return whether a policy has been removed.
|
||||
static bool IsRemoved(cmPolicies::PolicyID id);
|
||||
|
||||
enum class WarnCompat
|
||||
{
|
||||
@@ -660,7 +664,7 @@ public:
|
||||
static std::string GetRequiredPolicyError(cmPolicies::PolicyID id);
|
||||
|
||||
//! return an error string for when a required policy is unspecified
|
||||
static std::string GetRequiredAlwaysPolicyError(cmPolicies::PolicyID id);
|
||||
static std::string GetRemovedPolicyError(cmPolicies::PolicyID id);
|
||||
|
||||
/** Represent a set of policy values. */
|
||||
struct PolicyMap
|
||||
|
||||
@@ -165,13 +165,12 @@ void cmStateSnapshot::SetPolicy(cmPolicies::PolicyID id,
|
||||
cmPolicies::PolicyStatus cmStateSnapshot::GetPolicy(cmPolicies::PolicyID id,
|
||||
bool parent_scope) const
|
||||
{
|
||||
cmPolicies::PolicyStatus status = cmPolicies::GetPolicyStatus(id);
|
||||
|
||||
if (status == cmPolicies::REQUIRED_ALWAYS ||
|
||||
status == cmPolicies::REQUIRED_IF_USED) {
|
||||
return status;
|
||||
if (cmPolicies::IsRemoved(id)) {
|
||||
return cmPolicies::NEW;
|
||||
}
|
||||
|
||||
cmPolicies::PolicyStatus status = cmPolicies::WARN;
|
||||
|
||||
cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType>::iterator dir =
|
||||
this->Position->BuildSystemDirectory;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user