From 58a90857f0cef67543dce9a983c8ce7cb9bbd5c3 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 5 Nov 2024 09:50:04 -0500 Subject: [PATCH] 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. --- Source/cmMakefile.cxx | 7 +++---- Source/cmPolicies.cxx | 31 +++++++++++++++++++++++++------ Source/cmPolicies.h | 10 +++++++--- Source/cmStateSnapshot.cxx | 9 ++++----- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index c6a831b29f..b41786cd74 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -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; } diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx index 3937300e73..df4fa94e69 100644 --- a/Source/cmPolicies.cxx +++ b/Source/cmPolicies.cxx @@ -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 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(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( diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index a684e4c721..62e4a2761a 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -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 diff --git a/Source/cmStateSnapshot.cxx b/Source/cmStateSnapshot.cxx index 6ee0225bf7..1485992352 100644 --- a/Source/cmStateSnapshot.cxx +++ b/Source/cmStateSnapshot.cxx @@ -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::iterator dir = this->Position->BuildSystemDirectory;