From d339653eaf8757b79f02a315cb5e6d63555f17d2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 2 Apr 2014 12:51:47 -0400 Subject: [PATCH 1/2] Help: Revise and format policy CMP0025 and CMP0047 docs Add inline reST markup as appropriate. Word CMP0047 docs more like those of CMP0025. State explicitly that the policies must be set before the project or enable_language command calls. --- Help/policy/CMP0025.rst | 26 ++++++++++++++------------ Help/policy/CMP0047.rst | 25 +++++++++++++++++-------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Help/policy/CMP0025.rst b/Help/policy/CMP0025.rst index f3b39e3d2..5d63efaae 100644 --- a/Help/policy/CMP0025.rst +++ b/Help/policy/CMP0025.rst @@ -1,21 +1,23 @@ CMP0025 ------- -Compiler id for Apple Clang is now AppleClang. +Compiler id for Apple Clang is now ``AppleClang``. -CMake >= 3.0 recognize that Apple Clang is a different compiler +CMake 3.0 and above recognize that Apple Clang is a different compiler than upstream Clang and that they have different version numbers. -CMake now prefers to present this to projects by setting -CMAKE__COMPILER_ID to "AppleClang" instead of "Clang". However, -existing projects may assume the compiler id for Apple Clang is just -"Clang" as it was in CMake < 3.0. Therefore this policy determines -for Apple Clang which compiler id to report in -CMAKE__COMPILER_ID after is enabled by the project() or -enable_language() command. +CMake now prefers to present this to projects by setting the +:variable:`CMAKE__COMPILER_ID` variable to ``AppleClang`` instead +of ``Clang``. However, existing projects may assume the compiler id for +Apple Clang is just ``Clang`` as it was in CMake versions prior to 3.0. +Therefore this policy determines for Apple Clang which compiler id to +report in the :variable:`CMAKE__COMPILER_ID` variable after +language ```` is enabled by the :command:`project` or +:command:`enable_language` command. The policy must be set prior +to the invocation of either command. -The OLD behavior for this policy is to use compiler id "Clang". The -NEW behavior for this policy is to use compiler id "AppleClang". +The OLD behavior for this policy is to use compiler id ``Clang``. The +NEW behavior for this policy is to use compiler id ``AppleClang``. This policy was introduced in CMake version 3.0. CMake version |release| warns when the policy is not set and uses OLD behavior. Use -the cmake_policy command to set it to OLD or NEW explicitly. +the :command:`cmake_policy` command to set it to OLD or NEW explicitly. diff --git a/Help/policy/CMP0047.rst b/Help/policy/CMP0047.rst index c2d951bfa..896d70275 100644 --- a/Help/policy/CMP0047.rst +++ b/Help/policy/CMP0047.rst @@ -1,16 +1,25 @@ CMP0047 ------- -Use QCC compiler id for the qcc drivers on QNX. +Use ``QCC`` compiler id for the qcc drivers on QNX. -CMake 2.8.12 and lower assigned the QNX qcc and QCC compiler drivers the "GNU" -compiler id. +CMake 3.0 and above recognize that the QNX qcc compiler driver is +different from the GNU compiler. +CMake now prefers to present this to projects by setting the +:variable:`CMAKE__COMPILER_ID` variable to ``QCC`` instead +of ``GNU``. However, existing projects may assume the compiler id for +QNX qcc is just ``GNU`` as it was in CMake versions prior to 3.0. +Therefore this policy determines for QNX qcc which compiler id to +report in the :variable:`CMAKE__COMPILER_ID` variable after +language ```` is enabled by the :command:`project` or +:command:`enable_language` command. The policy must be set prior +to the invocation of either command. -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 is to use the "QCC" -compiler id for those drivers. +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 +is to use the ``QCC`` compiler id for those drivers. This policy was introduced in CMake version 3.0. CMake version |release| warns when the policy is not set and uses -OLD behavior. Use the cmake_policy command to set it to OLD or -NEW explicitly. +OLD behavior. Use the :command:`cmake_policy` command to set it to +OLD or NEW explicitly. From a41c0a9dcbc201b183bcc0a0c0f6bf9f2cebd079 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 2 Apr 2014 14:02:03 -0400 Subject: [PATCH 2/2] 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 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. --- Help/manual/cmake-variables.7.rst | 1 + Help/policy/CMP0025.rst | 10 +++++++--- Help/policy/CMP0047.rst | 11 +++++++---- Help/variable/CMAKE_POLICY_WARNING_CMPNNNN.rst | 17 +++++++++++++++++ Source/cmGlobalGenerator.cxx | 6 ++++-- Source/cmMakefile.cxx | 16 ++++++++++++++++ Source/cmMakefile.h | 2 ++ 7 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 Help/variable/CMAKE_POLICY_WARNING_CMPNNNN.rst diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index d9d7a0c4c..f4b96665e 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -131,6 +131,7 @@ Variables that Change Behavior /variable/CMAKE_MODULE_PATH /variable/CMAKE_NOT_USING_CONFIG_FLAGS /variable/CMAKE_POLICY_DEFAULT_CMPNNNN + /variable/CMAKE_POLICY_WARNING_CMPNNNN /variable/CMAKE_PREFIX_PATH /variable/CMAKE_PROGRAM_PATH /variable/CMAKE_PROJECT_PROJECT-NAME_INCLUDE diff --git a/Help/policy/CMP0025.rst b/Help/policy/CMP0025.rst index 5d63efaae..8d19edfa6 100644 --- a/Help/policy/CMP0025.rst +++ b/Help/policy/CMP0025.rst @@ -18,6 +18,10 @@ to the invocation of either command. The OLD behavior for this policy is to use compiler id ``Clang``. The NEW behavior for this policy is to use compiler id ``AppleClang``. -This policy was introduced in CMake version 3.0. CMake version -|release| warns when the policy is not set and uses OLD behavior. Use -the :command:`cmake_policy` command to set it to OLD or NEW explicitly. +This policy was introduced in CMake version 3.0. Use the +:command:`cmake_policy` command to set this policy 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 >` +variable to control the warning. diff --git a/Help/policy/CMP0047.rst b/Help/policy/CMP0047.rst index 896d70275..26ae43939 100644 --- a/Help/policy/CMP0047.rst +++ b/Help/policy/CMP0047.rst @@ -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 is to use the ``QCC`` compiler id for those drivers. -This policy was introduced in CMake version 3.0. -CMake version |release| warns when the policy is not set and uses -OLD behavior. Use the :command:`cmake_policy` command to set it to -OLD or NEW explicitly. +This policy was introduced in CMake version 3.0. Use the +:command:`cmake_policy` command to set this policy 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_CMP0047 >` +variable to control the warning. diff --git a/Help/variable/CMAKE_POLICY_WARNING_CMPNNNN.rst b/Help/variable/CMAKE_POLICY_WARNING_CMPNNNN.rst new file mode 100644 index 000000000..b563aeaec --- /dev/null +++ b/Help/variable/CMAKE_POLICY_WARNING_CMPNNNN.rst @@ -0,0 +1,17 @@ +CMAKE_POLICY_WARNING_CMP +------------------------------ + +Explicitly enable or disable the warning when CMake Policy ``CMP`` +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=ON``). +Alternatively, running :manual:`cmake(1)` with the ``--debug-output`` +or ``--trace`` option will also enable the warning. diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 4f3328d02..beb10daa1 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -759,7 +759,8 @@ void cmGlobalGenerator::CheckCompilerIdCompatibility(cmMakefile* mf, switch(mf->GetPolicyStatus(cmPolicies::CMP0025)) { case cmPolicies::WARN: - if(!this->CMakeInstance->GetIsInTryCompile()) + if(!this->CMakeInstance->GetIsInTryCompile() && + mf->PolicyOptionalWarningEnabled("CMAKE_POLICY_WARNING_CMP0025")) { cmOStringStream w; w << policies->GetPolicyWarning(cmPolicies::CMP0025) << "\n" @@ -790,7 +791,8 @@ void cmGlobalGenerator::CheckCompilerIdCompatibility(cmMakefile* mf, switch(mf->GetPolicyStatus(cmPolicies::CMP0047)) { case cmPolicies::WARN: - if(!this->CMakeInstance->GetIsInTryCompile()) + if(!this->CMakeInstance->GetIsInTryCompile() && + mf->PolicyOptionalWarningEnabled("CMAKE_POLICY_WARNING_CMP0047")) { cmOStringStream w; w << policies->GetPolicyWarning(cmPolicies::CMP0047) << "\n" diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 10137ec8b..b19594323 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -4350,6 +4350,22 @@ cmMakefile::GetPolicyStatusInternal(cmPolicies::PolicyID id) const return this->GetPolicies()->GetPolicyStatus(id); } +//---------------------------------------------------------------------------- +bool cmMakefile::PolicyOptionalWarningEnabled(std::string const& var) +{ + // Check for an explicit CMAKE_POLICY_WARNING_CMP 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, cmPolicies::PolicyStatus status) { diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 45f3b9f4a..f00fd20e1 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -875,6 +875,8 @@ public: std::set const & GetSystemIncludeDirectories() const { return this->SystemIncludeDirectories; } + bool PolicyOptionalWarningEnabled(std::string const& var); + protected: // add link libraries and directories to the target void AddGlobalLinkInformation(const char* name, cmTarget& target);