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:
Brad King
2024-11-05 09:50:04 -05:00
parent dade821948
commit 58a90857f0
4 changed files with 39 additions and 18 deletions

View File

@@ -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;
}

View File

@@ -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(

View File

@@ -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

View File

@@ -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;