Do not warn by default when policy CMP0025 or CMP0047 is not set

These policies are triggered by the use of a particular compiler rather
than outdated CMake code in a project.  Avoid warning in every project
that enables a language by not displaying the policy warning by default.
Add variable CMAKE_POLICY_WARNING_CMP<NNNN> to control the warning
explicitly; otherwise enable the warning with --debug-output or --trace.

This breaks with strict policy convention because it does not provide
developers with any warning about the behavior change by default.
Existing projects will continue to build without a warning or change in
behavior.  When a developer changes the minimum required version of
CMake in a project to a sufficiently high value (3.0), the project will
suddenly get the new compiler id and may break, but at least the
breakage comes with a change to the project rather than the version of
CMake used to build it.

Breaking strict policy convention is worthwhile in this case because
very few projects will be affected by the behavior change but every
project would have to see the warning if it were enabled by default.
This commit is contained in:
Brad King 2014-04-02 14:02:03 -04:00
parent d339653eaf
commit a41c0a9dcb
7 changed files with 54 additions and 9 deletions

View File

@ -131,6 +131,7 @@ Variables that Change Behavior
/variable/CMAKE_MODULE_PATH /variable/CMAKE_MODULE_PATH
/variable/CMAKE_NOT_USING_CONFIG_FLAGS /variable/CMAKE_NOT_USING_CONFIG_FLAGS
/variable/CMAKE_POLICY_DEFAULT_CMPNNNN /variable/CMAKE_POLICY_DEFAULT_CMPNNNN
/variable/CMAKE_POLICY_WARNING_CMPNNNN
/variable/CMAKE_PREFIX_PATH /variable/CMAKE_PREFIX_PATH
/variable/CMAKE_PROGRAM_PATH /variable/CMAKE_PROGRAM_PATH
/variable/CMAKE_PROJECT_PROJECT-NAME_INCLUDE /variable/CMAKE_PROJECT_PROJECT-NAME_INCLUDE

View File

@ -18,6 +18,10 @@ to the invocation of either command.
The OLD behavior for this policy is to use compiler id ``Clang``. The The OLD behavior for this policy is to use compiler id ``Clang``. The
NEW behavior for this policy is to use compiler id ``AppleClang``. NEW behavior for this policy is to use compiler id ``AppleClang``.
This policy was introduced in CMake version 3.0. CMake version This policy was introduced in CMake version 3.0. Use the
|release| warns when the policy is not set and uses OLD behavior. Use :command:`cmake_policy` command to set this policy to OLD or NEW explicitly.
the :command:`cmake_policy` command to set it to OLD or NEW explicitly. Unlike most policies, CMake version |release| does *not* warn
by default when this policy is not set and simply uses OLD behavior.
See documentation of the
:variable:`CMAKE_POLICY_WARNING_CMP0025 <CMAKE_POLICY_WARNING_CMP<NNNN>>`
variable to control the warning.

View File

@ -19,7 +19,10 @@ The OLD behavior for this policy is to use the ``GNU`` compiler id
for the qcc and QCC compiler drivers. The NEW behavior for this policy for the qcc and QCC compiler drivers. The NEW behavior for this policy
is to use the ``QCC`` compiler id for those drivers. is to use the ``QCC`` compiler id for those drivers.
This policy was introduced in CMake version 3.0. This policy was introduced in CMake version 3.0. Use the
CMake version |release| warns when the policy is not set and uses :command:`cmake_policy` command to set this policy to OLD or NEW explicitly.
OLD behavior. Use the :command:`cmake_policy` command to set it to Unlike most policies, CMake version |release| does *not* warn
OLD or NEW explicitly. by default when this policy is not set and simply uses OLD behavior.
See documentation of the
:variable:`CMAKE_POLICY_WARNING_CMP0047 <CMAKE_POLICY_WARNING_CMP<NNNN>>`
variable to control the warning.

View File

@ -0,0 +1,17 @@
CMAKE_POLICY_WARNING_CMP<NNNN>
------------------------------
Explicitly enable or disable the warning when CMake Policy ``CMP<NNNN>``
is not set. This is meaningful only for the few policies that do not
warn by default:
* ``CMAKE_POLICY_WARNING_CMP0025`` controls the warning for
policy :policy:`CMP0025`.
* ``CMAKE_POLICY_WARNING_CMP0047`` controls the warning for
policy :policy:`CMP0047`.
This variable should not be set by a project in CMake code. Project
developers running CMake may set this variable in their cache to
enable the warning (e.g. ``-DCMAKE_POLICY_WARNING_CMP<NNNN>=ON``).
Alternatively, running :manual:`cmake(1)` with the ``--debug-output``
or ``--trace`` option will also enable the warning.

View File

@ -759,7 +759,8 @@ void cmGlobalGenerator::CheckCompilerIdCompatibility(cmMakefile* mf,
switch(mf->GetPolicyStatus(cmPolicies::CMP0025)) switch(mf->GetPolicyStatus(cmPolicies::CMP0025))
{ {
case cmPolicies::WARN: case cmPolicies::WARN:
if(!this->CMakeInstance->GetIsInTryCompile()) if(!this->CMakeInstance->GetIsInTryCompile() &&
mf->PolicyOptionalWarningEnabled("CMAKE_POLICY_WARNING_CMP0025"))
{ {
cmOStringStream w; cmOStringStream w;
w << policies->GetPolicyWarning(cmPolicies::CMP0025) << "\n" w << policies->GetPolicyWarning(cmPolicies::CMP0025) << "\n"
@ -790,7 +791,8 @@ void cmGlobalGenerator::CheckCompilerIdCompatibility(cmMakefile* mf,
switch(mf->GetPolicyStatus(cmPolicies::CMP0047)) switch(mf->GetPolicyStatus(cmPolicies::CMP0047))
{ {
case cmPolicies::WARN: case cmPolicies::WARN:
if(!this->CMakeInstance->GetIsInTryCompile()) if(!this->CMakeInstance->GetIsInTryCompile() &&
mf->PolicyOptionalWarningEnabled("CMAKE_POLICY_WARNING_CMP0047"))
{ {
cmOStringStream w; cmOStringStream w;
w << policies->GetPolicyWarning(cmPolicies::CMP0047) << "\n" w << policies->GetPolicyWarning(cmPolicies::CMP0047) << "\n"

View File

@ -4350,6 +4350,22 @@ cmMakefile::GetPolicyStatusInternal(cmPolicies::PolicyID id) const
return this->GetPolicies()->GetPolicyStatus(id); return this->GetPolicies()->GetPolicyStatus(id);
} }
//----------------------------------------------------------------------------
bool cmMakefile::PolicyOptionalWarningEnabled(std::string const& var)
{
// Check for an explicit CMAKE_POLICY_WARNING_CMP<NNNN> setting.
if(!var.empty())
{
if(const char* val = this->GetDefinition(var.c_str()))
{
return cmSystemTools::IsOn(val);
}
}
// Enable optional policy warnings with --debug-output or --trace.
cmake* cm = this->GetCMakeInstance();
return cm->GetDebugOutput() || cm->GetTrace();
}
bool cmMakefile::SetPolicy(const char *id, bool cmMakefile::SetPolicy(const char *id,
cmPolicies::PolicyStatus status) cmPolicies::PolicyStatus status)
{ {

View File

@ -875,6 +875,8 @@ public:
std::set<cmStdString> const & GetSystemIncludeDirectories() const std::set<cmStdString> const & GetSystemIncludeDirectories() const
{ return this->SystemIncludeDirectories; } { return this->SystemIncludeDirectories; }
bool PolicyOptionalWarningEnabled(std::string const& var);
protected: protected:
// add link libraries and directories to the target // add link libraries and directories to the target
void AddGlobalLinkInformation(const char* name, cmTarget& target); void AddGlobalLinkInformation(const char* name, cmTarget& target);