Преглед изворни кода

Merge topic 'user-policy-defaults'

a364daf Allow users to specify defaults for unset policies
8e45c11 Fix indentation in cmPolicies::ApplyPolicyVersion()
Brad King пре 15 година
родитељ
комит
d4ed72e3bb

+ 2 - 1
Source/cmCMakePolicyCommand.h

@@ -85,7 +85,8 @@ public:
       "given version of CMake.  "
       "All policies introduced in the specified version or earlier "
       "will be set to use NEW behavior.  "
-      "All policies introduced after the specified version will be unset.  "
+      "All policies introduced after the specified version will be unset "
+      "(unless variable CMAKE_POLICY_DEFAULT_CMP<NNNN> sets a default).  "
       "This effectively requests behavior preferred as of a given CMake "
       "version and tells newer CMake versions to warn about their new "
       "policies.  "

+ 19 - 0
Source/cmDocumentVariables.cxx

@@ -464,6 +464,25 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
 
   // Variables defined by cmake, that change the behavior
   // of cmake
+
+  cm->DefineProperty
+    ("CMAKE_POLICY_DEFAULT_CMP<NNNN>",  cmProperty::VARIABLE,
+     "Default for CMake Policy CMP<NNNN> when it is otherwise left unset.",
+     "Commands cmake_minimum_required(VERSION) and cmake_policy(VERSION) "
+     "by default leave policies introduced after the given version unset.  "
+     "Set CMAKE_POLICY_DEFAULT_CMP<NNNN> to OLD or NEW to specify the "
+     "default for policy CMP<NNNN>, where <NNNN> is the policy number."
+     "\n"
+     "This variable should not be set by a project in CMake code; "
+     "use cmake_policy(SET) instead.  "
+     "Users running CMake may set this variable in the cache "
+     "(e.g. -DCMAKE_POLICY_DEFAULT_CMP<NNNN>=<OLD|NEW>) "
+     "to set a policy not otherwise set by the project.  "
+     "Set to OLD to quiet a policy warning while using old behavior "
+     "or to NEW to try building the project with new behavior.",
+     false,
+     "Variables That Change Behavior");
+
     cm->DefineProperty
     ("CMAKE_FIND_LIBRARY_PREFIXES",  cmProperty::VARIABLE,
      "Prefixes to prepend when looking for libraries.",

+ 50 - 16
Source/cmPolicies.cxx

@@ -495,9 +495,9 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf,
   std::string ver = "2.4.0";
 
   if (version && strlen(version) > 0)
-  {
+    {
     ver = version;
-  }
+    }
 
   unsigned int majorVer = 2;
   unsigned int minorVer = 0;
@@ -556,29 +556,33 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf,
 
   // now loop over all the policies and set them as appropriate
   std::vector<cmPolicies::PolicyID> ancientPolicies;
-  std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i
-    = this->Policies.begin();
-  for (;i != this->Policies.end(); ++i)
-  {
-  if (i->second->IsPolicyNewerThan(majorVer,minorVer,patchVer,tweakVer))
+  for(std::map<cmPolicies::PolicyID,cmPolicy *>::iterator i
+                     = this->Policies.begin(); i != this->Policies.end(); ++i)
     {
-      if(i->second->Status == cmPolicies::REQUIRED_ALWAYS)
+    if (i->second->IsPolicyNewerThan(majorVer,minorVer,patchVer,tweakVer))
       {
+      if(i->second->Status == cmPolicies::REQUIRED_ALWAYS)
+        {
         ancientPolicies.push_back(i->first);
+        }
+      else
+        {
+        cmPolicies::PolicyStatus status = cmPolicies::WARN;
+        if(!this->GetPolicyDefault(mf, i->second->IDString, &status) ||
+           !mf->SetPolicy(i->second->ID, status))
+          {
+          return false;
+          }
+        }
       }
-      else if (!mf->SetPolicy(i->second->ID, cmPolicies::WARN))
-      {
-        return false;
-      }
-    }
     else
-    {
-      if (!mf->SetPolicy(i->second->ID, cmPolicies::NEW))
       {
+      if (!mf->SetPolicy(i->second->ID, cmPolicies::NEW))
+        {
         return false;
+        }
       }
     }
-  }
 
   // Make sure the project does not use any ancient policies.
   if(!ancientPolicies.empty())
@@ -592,6 +596,36 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf,
   return true;
 }
 
+//----------------------------------------------------------------------------
+bool cmPolicies::GetPolicyDefault(cmMakefile* mf, std::string const& policy,
+                                  cmPolicies::PolicyStatus* defaultSetting)
+{
+  std::string defaultVar = "CMAKE_POLICY_DEFAULT_" + policy;
+  std::string defaultValue = mf->GetSafeDefinition(defaultVar.c_str());
+  if(defaultValue == "NEW")
+    {
+    *defaultSetting = cmPolicies::NEW;
+    }
+  else if(defaultValue == "OLD")
+    {
+    *defaultSetting = cmPolicies::OLD;
+    }
+  else if(defaultValue == "")
+    {
+    *defaultSetting = cmPolicies::WARN;
+    }
+  else
+    {
+    cmOStringStream e;
+    e << defaultVar << " has value \"" << defaultValue
+      << "\" but must be \"OLD\", \"NEW\", or \"\" (empty).";
+    mf->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
+    return false;
+    }
+
+  return true;
+}
+
 bool cmPolicies::GetPolicyID(const char *id, cmPolicies::PolicyID &pid)
 {
   if (!id || strlen(id) < 1)

+ 4 - 0
Source/cmPolicies.h

@@ -102,6 +102,10 @@ public:
   void DiagnoseAncientPolicies(std::vector<PolicyID> const& ancient,
                                unsigned int majorVer, unsigned int minorVer,
                                unsigned int patchVer, cmMakefile* mf);
+
+  bool GetPolicyDefault(cmMakefile* mf, std::string const& policy,
+                        cmPolicies::PolicyStatus* defaultStatus);
+
 };
 
 #endif

+ 18 - 0
Tests/PolicyScope/CMakeLists.txt

@@ -81,6 +81,24 @@ macro1()
 cmake_policy(GET CMP0002 cmp)
 check(CMP0002 "OLD" "${cmp}")
 
+#-----------------------------------------------------------------------------
+# Test CMAKE_POLICY_DEFAULT_CMP<NNNN> variable.
+cmake_policy(PUSH)
+  set(CMAKE_POLICY_DEFAULT_CMP0010 OLD) # ignored
+  set(CMAKE_POLICY_DEFAULT_CMP0012 OLD) # honored
+  set(CMAKE_POLICY_DEFAULT_CMP0013 NEW) # honored
+  set(CMAKE_POLICY_DEFAULT_CMP0014 "")  # noop
+  cmake_policy(VERSION 2.6.3)
+  cmake_policy(GET CMP0010 cmp)
+  check(CMP0010 "NEW" "${cmp}")
+  cmake_policy(GET CMP0012 cmp)
+  check(CMP0012 "OLD" "${cmp}")
+  cmake_policy(GET CMP0013 cmp)
+  check(CMP0013 "NEW" "${cmp}")
+  cmake_policy(GET CMP0014 cmp)
+  check(CMP0014 "" "${cmp}")
+cmake_policy(POP)
+
 #-----------------------------------------------------------------------------
 # Dummy executable so the project can build and run.
 add_executable(PolicyScope main.c)