Merge topic 'user-policy-defaults'
a364daf
Allow users to specify defaults for unset policies8e45c11
Fix indentation in cmPolicies::ApplyPolicyVersion()
This commit is contained in:
commit
d4ed72e3bb
|
@ -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. "
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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->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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue