From 5bb53f6b731228e4592066329e8992987289a986 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 30 Dec 2013 13:33:02 +0100 Subject: cmTarget: Deprecate COMPILE_DEFINITIONS_ properties with a policy. --- Help/manual/cmake-policies.7.rst | 1 + Help/policy/CMP0043.rst | 39 ++++++++++++++++++++++ Source/cmGeneratorExpressionEvaluator.cxx | 7 +++- Source/cmGlobalGenerator.cxx | 23 ++++++++----- Source/cmMakefile.cxx | 28 ++++++++-------- Source/cmPolicies.cxx | 5 +++ Source/cmPolicies.h | 1 + Source/cmTarget.cxx | 36 +++++++++++++++----- Tests/CompileDefinitions/compiletest.c | 4 +++ .../CompileDefinitions/target_prop/CMakeLists.txt | 3 ++ Tests/RunCMake/CMP0043/CMP0043-NEW-result.txt | 1 + Tests/RunCMake/CMP0043/CMP0043-NEW-stderr.txt | 1 + Tests/RunCMake/CMP0043/CMP0043-NEW.cmake | 7 ++++ Tests/RunCMake/CMP0043/CMP0043-OLD-result.txt | 1 + Tests/RunCMake/CMP0043/CMP0043-OLD-stderr.txt | 1 + Tests/RunCMake/CMP0043/CMP0043-OLD.cmake | 7 ++++ Tests/RunCMake/CMP0043/CMP0043-WARN-result.txt | 1 + Tests/RunCMake/CMP0043/CMP0043-WARN-stderr.txt | 5 +++ Tests/RunCMake/CMP0043/CMP0043-WARN.cmake | 5 +++ Tests/RunCMake/CMP0043/CMakeLists.txt | 3 ++ Tests/RunCMake/CMP0043/RunCMakeTest.cmake | 7 ++++ Tests/RunCMake/CMP0043/empty.cpp | 7 ++++ Tests/RunCMake/CMakeLists.txt | 1 + 23 files changed, 163 insertions(+), 31 deletions(-) create mode 100644 Help/policy/CMP0043.rst create mode 100644 Tests/RunCMake/CMP0043/CMP0043-NEW-result.txt create mode 100644 Tests/RunCMake/CMP0043/CMP0043-NEW-stderr.txt create mode 100644 Tests/RunCMake/CMP0043/CMP0043-NEW.cmake create mode 100644 Tests/RunCMake/CMP0043/CMP0043-OLD-result.txt create mode 100644 Tests/RunCMake/CMP0043/CMP0043-OLD-stderr.txt create mode 100644 Tests/RunCMake/CMP0043/CMP0043-OLD.cmake create mode 100644 Tests/RunCMake/CMP0043/CMP0043-WARN-result.txt create mode 100644 Tests/RunCMake/CMP0043/CMP0043-WARN-stderr.txt create mode 100644 Tests/RunCMake/CMP0043/CMP0043-WARN.cmake create mode 100644 Tests/RunCMake/CMP0043/CMakeLists.txt create mode 100644 Tests/RunCMake/CMP0043/RunCMakeTest.cmake create mode 100644 Tests/RunCMake/CMP0043/empty.cpp diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index 9138660..2181f88 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -92,3 +92,4 @@ All Policies /policy/CMP0040 /policy/CMP0041 /policy/CMP0042 + /policy/CMP0043 diff --git a/Help/policy/CMP0043.rst b/Help/policy/CMP0043.rst new file mode 100644 index 0000000..89a6cde --- /dev/null +++ b/Help/policy/CMP0043.rst @@ -0,0 +1,39 @@ +CMP0043 +------- + +Ignore COMPILE_DEFINITIONS_ properties + +CMake 2.8.12 and lower allowed setting the +:prop_tgt:`COMPILE_DEFINITIONS_` target property and +:prop_dir:`COMPILE_DEFINITIONS_` directory property to apply +configuration-specific compile definitions. + +Since CMake 2.8.10, the :prop_tgt:`COMPILE_DEFINITIONS` property has supported +:manual:`generator expressions ` for setting +configuration-dependent content. The continued existence of the suffixed +variables is redundant, and causes a maintenance burden. Population of the +:prop_tgt:`COMPILE_DEFINITIONS_DEBUG >` property +may be replaced with a population of :prop_tgt:`COMPILE_DEFINITIONS` directly +or via :command:`target_compile_definitions`: + +.. code-block:: cmake + + # Old Interface: + set_property(TARGET tgt APPEND PROPERTY + COMPILE_DEFINITIONS_DEBUG DEBUG_MODE + ) + + # New Interfaces: + set_property(TARGET tgt APPEND PROPERTY + COMPILE_DEFINITIONS $<$:DEBUG_MODE> + ) + target_compile_definitions(tgt PRIVATE $<$:DEBUG_MODE>) + +The OLD behavior for this policy is to consume the content of the suffixed +:prop_tgt:`COMPILE_DEFINITIONS_` target property when generating the +compilation command. The NEW behavior for this policy is to ignore the content +of the :prop_tgt:`COMPILE_DEFINITIONS_` target property . + +This policy was introduced in CMake version 3.0.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. diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 5edea86..80b16d3 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -1024,7 +1024,12 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode /* else */ if (cmHasLiteralPrefix(propertyName.c_str(), "COMPILE_DEFINITIONS_")) { - interfacePropertyName = "INTERFACE_COMPILE_DEFINITIONS"; + cmPolicies::PolicyStatus polSt = + context->Makefile->GetPolicyStatus(cmPolicies::CMP0043); + if (polSt == cmPolicies::WARN || polSt == cmPolicies::OLD) + { + interfacePropertyName = "INTERFACE_COMPILE_DEFINITIONS"; + } } #undef POPULATE_INTERFACE_PROPERTY_NAME diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 82c9155..c43fd91 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1330,9 +1330,6 @@ void cmGlobalGenerator::FinalizeTargetCompileInfo() const std::vector noconfig_compile_definitions = mf->GetCompileDefinitionsEntries(); - std::vector configs; - mf->GetConfigurations(configs); - cmTargets& targets = mf->GetTargets(); for(cmTargets::iterator ti = targets.begin(); ti != targets.end(); ++ti) @@ -1353,13 +1350,21 @@ void cmGlobalGenerator::FinalizeTargetCompileInfo() t->InsertCompileDefinition(*it); } - for(std::vector::const_iterator ci = configs.begin(); - ci != configs.end(); ++ci) + cmPolicies::PolicyStatus polSt + = mf->GetPolicyStatus(cmPolicies::CMP0043); + if (polSt == cmPolicies::WARN || polSt == cmPolicies::OLD) { - std::string defPropName = "COMPILE_DEFINITIONS_"; - defPropName += cmSystemTools::UpperCase(*ci); - t->AppendProperty(defPropName.c_str(), - mf->GetProperty(defPropName.c_str())); + std::vector configs; + mf->GetConfigurations(configs); + + for(std::vector::const_iterator ci = configs.begin(); + ci != configs.end(); ++ci) + { + std::string defPropName = "COMPILE_DEFINITIONS_"; + defPropName += cmSystemTools::UpperCase(*ci); + t->AppendProperty(defPropName.c_str(), + mf->GetProperty(defPropName.c_str())); + } } } } diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 35b65b4..479e712 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1601,20 +1601,22 @@ void cmMakefile::InitializeFromParent() } // compile definitions property and per-config versions - { - this->SetProperty("COMPILE_DEFINITIONS", - parent->GetProperty("COMPILE_DEFINITIONS")); - std::vector configs; - this->GetConfigurations(configs); - for(std::vector::const_iterator ci = configs.begin(); - ci != configs.end(); ++ci) - { - std::string defPropName = "COMPILE_DEFINITIONS_"; - defPropName += cmSystemTools::UpperCase(*ci); - this->SetProperty(defPropName.c_str(), - parent->GetProperty(defPropName.c_str())); + cmPolicies::PolicyStatus polSt = this->GetPolicyStatus(cmPolicies::CMP0043); + if (polSt == cmPolicies::WARN || polSt == cmPolicies::OLD) + { + this->SetProperty("COMPILE_DEFINITIONS", + parent->GetProperty("COMPILE_DEFINITIONS")); + std::vector configs; + this->GetConfigurations(configs); + for(std::vector::const_iterator ci = configs.begin(); + ci != configs.end(); ++ci) + { + std::string defPropName = "COMPILE_DEFINITIONS_"; + defPropName += cmSystemTools::UpperCase(*ci); + const char* prop = parent->GetProperty(defPropName.c_str()); + this->SetProperty(defPropName.c_str(), prop); + } } - } // link libraries this->LinkLibraries = parent->LinkLibraries; diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx index 987c663..32c1476 100644 --- a/Source/cmPolicies.cxx +++ b/Source/cmPolicies.cxx @@ -316,6 +316,11 @@ cmPolicies::cmPolicies() CMP0042, "CMP0042", "MACOSX_RPATH is enabled by default.", 3,0,0,0, cmPolicies::WARN); + + this->DefinePolicy( + CMP0043, "CMP0043", + "Ignore COMPILE_DEFINITIONS_ properties.", + 3,0,0,0, cmPolicies::WARN); } cmPolicies::~cmPolicies() diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 66eaf87..3c8200f 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -96,6 +96,7 @@ public: /// add_custom_command() must exist. CMP0041, ///< Error on relative include with generator expression CMP0042, ///< Enable MACOSX_RPATH by default + CMP0043, ///< Ignore COMPILE_DEFINITIONS_ properties /** \brief Always the last entry. * diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index b06480b..a8468ef 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2209,14 +2209,34 @@ void cmTarget::GetCompileDefinitions(std::vector &list, std::string configPropName = "COMPILE_DEFINITIONS_" + cmSystemTools::UpperCase(config); const char *configProp = this->GetProperty(configPropName.c_str()); - std::string defsString = (configProp ? configProp : ""); - - cmGeneratorExpression ge(lfbt); - cmsys::auto_ptr cge = - ge.Parse(defsString); - this->Internal - ->CachedLinkInterfaceCompileDefinitionsEntries[configString].push_back( - new cmTargetInternals::TargetPropertyEntry(cge)); + if (configProp) + { + switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0043)) + { + case cmPolicies::WARN: + { + cmOStringStream e; + e << this->Makefile->GetCMakeInstance()->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0043); + this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, + e.str().c_str()); + } + case cmPolicies::OLD: + { + cmGeneratorExpression ge(lfbt); + cmsys::auto_ptr cge = + ge.Parse(configProp); + this->Internal + ->CachedLinkInterfaceCompileDefinitionsEntries[configString] + .push_back(new cmTargetInternals::TargetPropertyEntry(cge)); + } + break; + case cmPolicies::NEW: + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::REQUIRED_IF_USED: + break; + } + } } } diff --git a/Tests/CompileDefinitions/compiletest.c b/Tests/CompileDefinitions/compiletest.c index d7883af..8871750 100644 --- a/Tests/CompileDefinitions/compiletest.c +++ b/Tests/CompileDefinitions/compiletest.c @@ -13,6 +13,10 @@ #error Unexpected LINK_LANGUAGE_IS_CXX #endif +#ifdef DEBUG_MODE +#error Unexpected DEBUG_MODE +#endif + int main(void) { return 0; diff --git a/Tests/CompileDefinitions/target_prop/CMakeLists.txt b/Tests/CompileDefinitions/target_prop/CMakeLists.txt index a0d3f4e..2ca2869 100644 --- a/Tests/CompileDefinitions/target_prop/CMakeLists.txt +++ b/Tests/CompileDefinitions/target_prop/CMakeLists.txt @@ -35,6 +35,9 @@ set_property(TARGET target_prop_executable APPEND PROPERTY COMPILE_DEFINITIONS add_executable(target_prop_c_executable ../compiletest.c) +cmake_policy(SET CMP0043 NEW) +set_property(TARGET target_prop_c_executable APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUG_MODE) + set_property(TARGET target_prop_c_executable APPEND PROPERTY COMPILE_DEFINITIONS "$<$,CXX>:LINK_CXX_DEFINE>" "$<$,C>:LINK_C_DEFINE>" diff --git a/Tests/RunCMake/CMP0043/CMP0043-NEW-result.txt b/Tests/RunCMake/CMP0043/CMP0043-NEW-result.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMP0043-NEW-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMP0043/CMP0043-NEW-stderr.txt b/Tests/RunCMake/CMP0043/CMP0043-NEW-stderr.txt new file mode 100644 index 0000000..10f3293 --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMP0043-NEW-stderr.txt @@ -0,0 +1 @@ +^$ diff --git a/Tests/RunCMake/CMP0043/CMP0043-NEW.cmake b/Tests/RunCMake/CMP0043/CMP0043-NEW.cmake new file mode 100644 index 0000000..857153d --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMP0043-NEW.cmake @@ -0,0 +1,7 @@ + +cmake_policy(SET CMP0043 NEW) + +add_library(foo empty.cpp) +set_property(TARGET foo + PROPERTY COMPILE_DEFINITIONS_DEBUG "DEBUG_MODE" +) diff --git a/Tests/RunCMake/CMP0043/CMP0043-OLD-result.txt b/Tests/RunCMake/CMP0043/CMP0043-OLD-result.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMP0043-OLD-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMP0043/CMP0043-OLD-stderr.txt b/Tests/RunCMake/CMP0043/CMP0043-OLD-stderr.txt new file mode 100644 index 0000000..10f3293 --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMP0043-OLD-stderr.txt @@ -0,0 +1 @@ +^$ diff --git a/Tests/RunCMake/CMP0043/CMP0043-OLD.cmake b/Tests/RunCMake/CMP0043/CMP0043-OLD.cmake new file mode 100644 index 0000000..f379430 --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMP0043-OLD.cmake @@ -0,0 +1,7 @@ + +cmake_policy(SET CMP0043 OLD) + +add_library(foo empty.cpp) +set_property(TARGET foo + PROPERTY COMPILE_DEFINITIONS_DEBUG "DEBUG_MODE" +) diff --git a/Tests/RunCMake/CMP0043/CMP0043-WARN-result.txt b/Tests/RunCMake/CMP0043/CMP0043-WARN-result.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMP0043-WARN-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMP0043/CMP0043-WARN-stderr.txt b/Tests/RunCMake/CMP0043/CMP0043-WARN-stderr.txt new file mode 100644 index 0000000..4769a63 --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMP0043-WARN-stderr.txt @@ -0,0 +1,5 @@ +CMake Warning \(dev\) in CMakeLists.txt: + Policy CMP0043 is not set: Ignore COMPILE_DEFINITIONS_ properties. + Run "cmake --help-policy CMP0043" for policy details. Use the cmake_policy + command to set the policy and suppress this warning. +This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/CMP0043/CMP0043-WARN.cmake b/Tests/RunCMake/CMP0043/CMP0043-WARN.cmake new file mode 100644 index 0000000..161a60d --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMP0043-WARN.cmake @@ -0,0 +1,5 @@ + +add_library(foo empty.cpp) +set_property(TARGET foo + PROPERTY COMPILE_DEFINITIONS_DEBUG "DEBUG_MODE" +) diff --git a/Tests/RunCMake/CMP0043/CMakeLists.txt b/Tests/RunCMake/CMP0043/CMakeLists.txt new file mode 100644 index 0000000..11ea636 --- /dev/null +++ b/Tests/RunCMake/CMP0043/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8) +project(${RunCMake_TEST} CXX) +include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE) diff --git a/Tests/RunCMake/CMP0043/RunCMakeTest.cmake b/Tests/RunCMake/CMP0043/RunCMakeTest.cmake new file mode 100644 index 0000000..7f9572e --- /dev/null +++ b/Tests/RunCMake/CMP0043/RunCMakeTest.cmake @@ -0,0 +1,7 @@ +include(RunCMake) + +list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug) + +run_cmake(CMP0043-OLD) +run_cmake(CMP0043-NEW) +run_cmake(CMP0043-WARN) diff --git a/Tests/RunCMake/CMP0043/empty.cpp b/Tests/RunCMake/CMP0043/empty.cpp new file mode 100644 index 0000000..bfbbdde --- /dev/null +++ b/Tests/RunCMake/CMP0043/empty.cpp @@ -0,0 +1,7 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif +int empty() +{ + return 0; +} diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 96724ce..01ab5d4 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -64,6 +64,7 @@ add_RunCMake_test(CMP0041) if(CMAKE_SYSTEM_NAME MATCHES Darwin AND CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG) add_RunCMake_test(CMP0042) endif() +add_RunCMake_test(CMP0043) add_RunCMake_test(CTest) if(UNIX AND "${CMAKE_TEST_GENERATOR}" MATCHES "Unix Makefiles") add_RunCMake_test(CompilerChange) -- cgit v0.12 From 6aabb6a62b679f64e278087fc671cd33a35bf871 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 26 Dec 2013 15:59:55 +0100 Subject: Genex: Use case-sensitive comparison for COMPILER_ID. --- Help/manual/cmake-policies.7.rst | 1 + Help/policy/CMP0044.rst | 19 ++++++++++++++++ Source/cmGeneratorExpressionEvaluator.cxx | 24 +++++++++++++++++++- Source/cmPolicies.cxx | 5 +++++ Source/cmPolicies.h | 1 + Tests/GeneratorExpression/CMP0044/CMakeLists.txt | 19 ++++++++++++++++ .../GeneratorExpression/CMP0044/cmp0044-check.cpp | 26 ++++++++++++++++++++++ Tests/GeneratorExpression/CMakeLists.txt | 6 +++++ Tests/RunCMake/CMP0043/CMakeLists.txt | 4 ++++ .../GeneratorExpression/CMP0044-WARN-result.txt | 1 + .../GeneratorExpression/CMP0044-WARN-stderr.txt | 7 ++++++ .../GeneratorExpression/CMP0044-WARN.cmake | 17 ++++++++++++++ .../GeneratorExpression/RunCMakeTest.cmake | 1 + 13 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 Help/policy/CMP0044.rst create mode 100644 Tests/GeneratorExpression/CMP0044/CMakeLists.txt create mode 100644 Tests/GeneratorExpression/CMP0044/cmp0044-check.cpp create mode 100644 Tests/RunCMake/GeneratorExpression/CMP0044-WARN-result.txt create mode 100644 Tests/RunCMake/GeneratorExpression/CMP0044-WARN-stderr.txt create mode 100644 Tests/RunCMake/GeneratorExpression/CMP0044-WARN.cmake diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index 2181f88..e9c31a7 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -93,3 +93,4 @@ All Policies /policy/CMP0041 /policy/CMP0042 /policy/CMP0043 + /policy/CMP0044 diff --git a/Help/policy/CMP0044.rst b/Help/policy/CMP0044.rst new file mode 100644 index 0000000..edbadf5 --- /dev/null +++ b/Help/policy/CMP0044.rst @@ -0,0 +1,19 @@ +CMP0044 +------- + +Case sensitive ``_COMPILER_ID`` generator expressions + +CMake 2.8.12 introduced the ``_COMPILER_ID`` +:manual:`generator expressions ` to allow +comparison of the :variable:`CMAKE__COMPILER_ID` with a test value. The +possible valid values are lowercase, but the comparison with the test value +was performed case-insensitively. + +The OLD behavior for this policy is to perform a case-insensitive comparison +with the value in the ``_COMPILER_ID`` expression. The NEW behavior +for this policy is to perform a case-sensitive comparison with the value in +the ``_COMPILER_ID`` expression. + +This policy was introduced in CMake version 3.0.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. diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 80b16d3..1feb03a 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -412,10 +412,32 @@ struct CompilerIdNode : public cmGeneratorExpressionNode return parameters.front().empty() ? "1" : "0"; } - if (cmsysString_strcasecmp(parameters.begin()->c_str(), compilerId) == 0) + if (strcmp(parameters.begin()->c_str(), compilerId) == 0) { return "1"; } + + if (cmsysString_strcasecmp(parameters.begin()->c_str(), compilerId) == 0) + { + switch(context->Makefile->GetPolicyStatus(cmPolicies::CMP0044)) + { + case cmPolicies::WARN: + { + cmOStringStream e; + e << context->Makefile->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0044); + context->Makefile->GetCMakeInstance() + ->IssueMessage(cmake::AUTHOR_WARNING, + e.str().c_str(), context->Backtrace); + } + case cmPolicies::OLD: + return "1"; + case cmPolicies::NEW: + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::REQUIRED_IF_USED: + break; + } + } return "0"; } }; diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx index 32c1476..c9dacaf 100644 --- a/Source/cmPolicies.cxx +++ b/Source/cmPolicies.cxx @@ -321,6 +321,11 @@ cmPolicies::cmPolicies() CMP0043, "CMP0043", "Ignore COMPILE_DEFINITIONS_ properties.", 3,0,0,0, cmPolicies::WARN); + + this->DefinePolicy( + CMP0044, "CMP0044", + "Case sensitive _COMPILER_ID generator expressions.", + 3,0,0,0, cmPolicies::WARN); } cmPolicies::~cmPolicies() diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 3c8200f..0d7327f 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -97,6 +97,7 @@ public: CMP0041, ///< Error on relative include with generator expression CMP0042, ///< Enable MACOSX_RPATH by default CMP0043, ///< Ignore COMPILE_DEFINITIONS_ properties + CMP0044, ///< Case sensitive _COMPILER_ID generator expressions /** \brief Always the last entry. * diff --git a/Tests/GeneratorExpression/CMP0044/CMakeLists.txt b/Tests/GeneratorExpression/CMP0044/CMakeLists.txt new file mode 100644 index 0000000..309a8cc --- /dev/null +++ b/Tests/GeneratorExpression/CMP0044/CMakeLists.txt @@ -0,0 +1,19 @@ + +string(TOLOWER ${CMAKE_C_COMPILER_ID} lc_test) +if (lc_test STREQUAL CMAKE_C_COMPILER_ID) + string(TOUPPER ${CMAKE_C_COMPILER_ID} lc_test) + if (lc_test STREQUAL CMAKE_C_COMPILER_ID) + message(SEND_ERROR "Try harder.") + endif() +endif() + +if (CMP0044_TYPE) + cmake_policy(SET CMP0044 ${CMP0044_TYPE}) +endif() + +add_library(cmp0044-check-${CMP0044_TYPE} cmp0044-check.cpp) +target_compile_definitions(cmp0044-check-${CMP0044_TYPE} + PRIVATE + Result=$ + Type_Is_${CMP0044_TYPE} +) diff --git a/Tests/GeneratorExpression/CMP0044/cmp0044-check.cpp b/Tests/GeneratorExpression/CMP0044/cmp0044-check.cpp new file mode 100644 index 0000000..2356bc4 --- /dev/null +++ b/Tests/GeneratorExpression/CMP0044/cmp0044-check.cpp @@ -0,0 +1,26 @@ + +#ifdef Type_Is_ +# if !Result +# error Result should be 1 in WARN mode +# endif +#endif + +#ifdef Type_Is_NEW +# if Result +# error Result should be 0 in NEW mode +# endif +#endif + +#ifdef Type_Is_OLD +# if !Result +# error Result should be 1 in OLD mode +# endif +#endif + +#if !defined(Type_Is_) && !defined(Type_Is_OLD) && !defined(Type_Is_NEW) +#error No expected definition present +#endif + +void foo(void) +{ +} diff --git a/Tests/GeneratorExpression/CMakeLists.txt b/Tests/GeneratorExpression/CMakeLists.txt index 3b85dc3..a0e34ef 100644 --- a/Tests/GeneratorExpression/CMakeLists.txt +++ b/Tests/GeneratorExpression/CMakeLists.txt @@ -252,3 +252,9 @@ endforeach() add_test(echo-old-style echo "\$") set_property(TEST echo-old-style PROPERTY PASS_REGULAR_EXPRESSION "^\\$\n$") + +add_subdirectory(CMP0044 ${CMAKE_BINARY_DIR}/CMP0044-WARN) +set(CMP0044_TYPE NEW) +add_subdirectory(CMP0044 ${CMAKE_BINARY_DIR}/CMP0044-NEW) +set(CMP0044_TYPE OLD) +add_subdirectory(CMP0044 ${CMAKE_BINARY_DIR}/CMP0044-OLD) diff --git a/Tests/RunCMake/CMP0043/CMakeLists.txt b/Tests/RunCMake/CMP0043/CMakeLists.txt index 11ea636..b465c88 100644 --- a/Tests/RunCMake/CMP0043/CMakeLists.txt +++ b/Tests/RunCMake/CMP0043/CMakeLists.txt @@ -1,3 +1,7 @@ cmake_minimum_required(VERSION 2.8) project(${RunCMake_TEST} CXX) include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE) + +if(CMAKE_BUILD_TYPE) + # Dummy variable use +endif() diff --git a/Tests/RunCMake/GeneratorExpression/CMP0044-WARN-result.txt b/Tests/RunCMake/GeneratorExpression/CMP0044-WARN-result.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/CMP0044-WARN-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/GeneratorExpression/CMP0044-WARN-stderr.txt b/Tests/RunCMake/GeneratorExpression/CMP0044-WARN-stderr.txt new file mode 100644 index 0000000..2079c12 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/CMP0044-WARN-stderr.txt @@ -0,0 +1,7 @@ +CMake Warning \(dev\) at CMP0044-WARN.cmake:13 \(target_compile_definitions\): + Policy CMP0044 is not set: Case sensitive _COMPILER_ID generator + expressions. Run "cmake --help-policy CMP0044" for policy details. Use + the cmake_policy command to set the policy and suppress this warning. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) +This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/GeneratorExpression/CMP0044-WARN.cmake b/Tests/RunCMake/GeneratorExpression/CMP0044-WARN.cmake new file mode 100644 index 0000000..d5b85c9 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/CMP0044-WARN.cmake @@ -0,0 +1,17 @@ + +project(CMP0044-WARN) + +string(TOLOWER ${CMAKE_C_COMPILER_ID} lc_test) +if (lc_test STREQUAL CMAKE_C_COMPILER_ID) + string(TOUPPER ${CMAKE_C_COMPILER_ID} lc_test) + if (lc_test STREQUAL CMAKE_C_COMPILER_ID) + message(SEND_ERROR "Try harder.") + endif() +endif() + +add_library(cmp0044-check empty.c) +target_compile_definitions(cmp0044-check + PRIVATE + Result=$ + Type_Is_${CMP0044_TYPE} +) diff --git a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake index 54d5064..f3f99ed 100644 --- a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake +++ b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake @@ -9,3 +9,4 @@ run_cmake(BadZero) run_cmake(BadTargetName) run_cmake(BadTargetTypeObject) run_cmake(BadInstallPrefix) +run_cmake(CMP0044-WARN) -- cgit v0.12 From 37ebeb910073aa142b41daa949dabf978e4d749d Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 8 Jan 2014 10:25:07 +0100 Subject: FindQt4: Fix use of get_target_property to use actual target name. This was introduced in ba48e63f (Generate config-specific interface link libraries propeties., 2013-02-09). --- Modules/FindQt4.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/FindQt4.cmake b/Modules/FindQt4.cmake index 28b8454..2c4e765 100644 --- a/Modules/FindQt4.cmake +++ b/Modules/FindQt4.cmake @@ -1187,7 +1187,7 @@ if (QT_QMAKE_EXECUTABLE AND QTVERSION) endmacro() macro(_qt4_add_target_private_depends _QT_MODULE) - get_target_property(_configs ${_QT_MODULE} IMPORTED_CONFIGURATIONS) + get_target_property(_configs Qt4::${_QT_MODULE} IMPORTED_CONFIGURATIONS) foreach(_config ${_configs}) _qt4_add_target_depends_internal(${_QT_MODULE} IMPORTED_LINK_DEPENDENT_LIBRARIES_${_config} ${ARGN}) endforeach() -- cgit v0.12 From ab9f58f657a244d182ccd9a9361fae0a7c068f20 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 8 Jan 2014 10:26:49 +0100 Subject: FindQt4: Ensure target exists before calling get_target_property. This macro is called for all potential Qt targets, even those which were not found. --- Modules/FindQt4.cmake | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Modules/FindQt4.cmake b/Modules/FindQt4.cmake index 2c4e765..03924fa 100644 --- a/Modules/FindQt4.cmake +++ b/Modules/FindQt4.cmake @@ -1178,20 +1178,24 @@ if (QT_QMAKE_EXECUTABLE AND QTVERSION) endmacro() macro(_qt4_add_target_depends _QT_MODULE) - get_target_property(_configs Qt4::${_QT_MODULE} IMPORTED_CONFIGURATIONS) - _qt4_add_target_depends_internal(${_QT_MODULE} INTERFACE_LINK_LIBRARIES ${ARGN}) - foreach(_config ${_configs}) - _qt4_add_target_depends_internal(${_QT_MODULE} IMPORTED_LINK_INTERFACE_LIBRARIES_${_config} ${ARGN}) - endforeach() - set(_configs) + if (TARGET Qt4::${_QT_MODULE}) + get_target_property(_configs Qt4::${_QT_MODULE} IMPORTED_CONFIGURATIONS) + _qt4_add_target_depends_internal(${_QT_MODULE} INTERFACE_LINK_LIBRARIES ${ARGN}) + foreach(_config ${_configs}) + _qt4_add_target_depends_internal(${_QT_MODULE} IMPORTED_LINK_INTERFACE_LIBRARIES_${_config} ${ARGN}) + endforeach() + set(_configs) + endif() endmacro() macro(_qt4_add_target_private_depends _QT_MODULE) - get_target_property(_configs Qt4::${_QT_MODULE} IMPORTED_CONFIGURATIONS) - foreach(_config ${_configs}) - _qt4_add_target_depends_internal(${_QT_MODULE} IMPORTED_LINK_DEPENDENT_LIBRARIES_${_config} ${ARGN}) - endforeach() - set(_configs) + if (TARGET Qt4::${_QT_MODULE}) + get_target_property(_configs Qt4::${_QT_MODULE} IMPORTED_CONFIGURATIONS) + foreach(_config ${_configs}) + _qt4_add_target_depends_internal(${_QT_MODULE} IMPORTED_LINK_DEPENDENT_LIBRARIES_${_config} ${ARGN}) + endforeach() + set(_configs) + endif() endmacro() -- cgit v0.12 From 73e93400e2efab2096618ff58a5ad68236cd04aa Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 8 Jan 2014 13:16:33 +0100 Subject: get_target_property: Error on non-existent target. Introduce policy CMP0045 to control this behavior. --- Help/manual/cmake-policies.7.rst | 1 + Help/policy/CMP0045.rst | 17 ++++++++++++++ Source/cmGetTargetPropertyCommand.cxx | 31 +++++++++++++++++++++++++- Source/cmPolicies.cxx | 5 +++++ Source/cmPolicies.h | 1 + Tests/RunCMake/CMP0045/CMP0045-NEW-result.txt | 1 + Tests/RunCMake/CMP0045/CMP0045-NEW-stderr.txt | 4 ++++ Tests/RunCMake/CMP0045/CMP0045-NEW.cmake | 4 ++++ Tests/RunCMake/CMP0045/CMP0045-OLD-result.txt | 1 + Tests/RunCMake/CMP0045/CMP0045-OLD-stderr.txt | 1 + Tests/RunCMake/CMP0045/CMP0045-OLD.cmake | 4 ++++ Tests/RunCMake/CMP0045/CMP0045-WARN-result.txt | 1 + Tests/RunCMake/CMP0045/CMP0045-WARN-stderr.txt | 9 ++++++++ Tests/RunCMake/CMP0045/CMP0045-WARN.cmake | 2 ++ Tests/RunCMake/CMP0045/CMakeLists.txt | 3 +++ Tests/RunCMake/CMP0045/RunCMakeTest.cmake | 5 +++++ Tests/RunCMake/CMP0045/empty.cpp | 7 ++++++ Tests/RunCMake/CMakeLists.txt | 1 + 18 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 Help/policy/CMP0045.rst create mode 100644 Tests/RunCMake/CMP0045/CMP0045-NEW-result.txt create mode 100644 Tests/RunCMake/CMP0045/CMP0045-NEW-stderr.txt create mode 100644 Tests/RunCMake/CMP0045/CMP0045-NEW.cmake create mode 100644 Tests/RunCMake/CMP0045/CMP0045-OLD-result.txt create mode 100644 Tests/RunCMake/CMP0045/CMP0045-OLD-stderr.txt create mode 100644 Tests/RunCMake/CMP0045/CMP0045-OLD.cmake create mode 100644 Tests/RunCMake/CMP0045/CMP0045-WARN-result.txt create mode 100644 Tests/RunCMake/CMP0045/CMP0045-WARN-stderr.txt create mode 100644 Tests/RunCMake/CMP0045/CMP0045-WARN.cmake create mode 100644 Tests/RunCMake/CMP0045/CMakeLists.txt create mode 100644 Tests/RunCMake/CMP0045/RunCMakeTest.cmake create mode 100644 Tests/RunCMake/CMP0045/empty.cpp diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index e9c31a7..c9f39c4 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -94,3 +94,4 @@ All Policies /policy/CMP0042 /policy/CMP0043 /policy/CMP0044 + /policy/CMP0045 diff --git a/Help/policy/CMP0045.rst b/Help/policy/CMP0045.rst new file mode 100644 index 0000000..748eb6a --- /dev/null +++ b/Help/policy/CMP0045.rst @@ -0,0 +1,17 @@ +CMP0045 +------- + +Error on non-existent target in get_target_property. + +In CMake 2.8.12 and lower, the :command:`get_target_property` command accepted +a non-existent target argument without issuing any error or warning. The +result variable is set to a ``-NOTFOUND`` value. + +The OLD behavior for this policy is to issue no warning and set the result +variable to a ``-NOTFOUND`` value. The NEW behavior +for this policy is to issue a ``FATAL_ERROR`` if the command is called with a +non-existent target. + +This policy was introduced in CMake version 3.0.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. diff --git a/Source/cmGetTargetPropertyCommand.cxx b/Source/cmGetTargetPropertyCommand.cxx index 02f00a5..488cc28 100644 --- a/Source/cmGetTargetPropertyCommand.cxx +++ b/Source/cmGetTargetPropertyCommand.cxx @@ -40,7 +40,36 @@ bool cmGetTargetPropertyCommand cmTarget& target = *tgt; prop = target.GetProperty(args[2].c_str()); } - + else + { + bool issueMessage = false; + cmOStringStream e; + cmake::MessageType messageType = cmake::AUTHOR_WARNING; + switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0045)) + { + case cmPolicies::WARN: + issueMessage = true; + e << this->Makefile->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0045) << "\n"; + case cmPolicies::OLD: + break; + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::NEW: + issueMessage = true; + messageType = cmake::FATAL_ERROR; + } + if (issueMessage) + { + e << "get_target_property() called with non-existent target \"" + << targetName << "\"."; + this->Makefile->IssueMessage(messageType, e.str().c_str()); + if (messageType == cmake::FATAL_ERROR) + { + return false; + } + } + } if (prop) { this->Makefile->AddDefinition(var.c_str(), prop); diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx index c9dacaf..5a189f8 100644 --- a/Source/cmPolicies.cxx +++ b/Source/cmPolicies.cxx @@ -326,6 +326,11 @@ cmPolicies::cmPolicies() CMP0044, "CMP0044", "Case sensitive _COMPILER_ID generator expressions.", 3,0,0,0, cmPolicies::WARN); + + this->DefinePolicy( + CMP0045, "CMP0045", + "Error on non-existent target in get_target_property.", + 3,0,0,0, cmPolicies::WARN); } cmPolicies::~cmPolicies() diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 0d7327f..b1342bf 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -98,6 +98,7 @@ public: CMP0042, ///< Enable MACOSX_RPATH by default CMP0043, ///< Ignore COMPILE_DEFINITIONS_ properties CMP0044, ///< Case sensitive _COMPILER_ID generator expressions + CMP0045, ///< Error on non-existent target in get_target_property /** \brief Always the last entry. * diff --git a/Tests/RunCMake/CMP0045/CMP0045-NEW-result.txt b/Tests/RunCMake/CMP0045/CMP0045-NEW-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMP0045-NEW-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CMP0045/CMP0045-NEW-stderr.txt b/Tests/RunCMake/CMP0045/CMP0045-NEW-stderr.txt new file mode 100644 index 0000000..805a85e --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMP0045-NEW-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at CMP0045-NEW.cmake:4 \(get_target_property\): + get_target_property\(\) called with non-existent target "tgt". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/CMP0045/CMP0045-NEW.cmake b/Tests/RunCMake/CMP0045/CMP0045-NEW.cmake new file mode 100644 index 0000000..7b2a3cd --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMP0045-NEW.cmake @@ -0,0 +1,4 @@ + +cmake_policy(SET CMP0045 NEW) + +get_target_property(result tgt TYPE) diff --git a/Tests/RunCMake/CMP0045/CMP0045-OLD-result.txt b/Tests/RunCMake/CMP0045/CMP0045-OLD-result.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMP0045-OLD-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMP0045/CMP0045-OLD-stderr.txt b/Tests/RunCMake/CMP0045/CMP0045-OLD-stderr.txt new file mode 100644 index 0000000..10f3293 --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMP0045-OLD-stderr.txt @@ -0,0 +1 @@ +^$ diff --git a/Tests/RunCMake/CMP0045/CMP0045-OLD.cmake b/Tests/RunCMake/CMP0045/CMP0045-OLD.cmake new file mode 100644 index 0000000..90201a3 --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMP0045-OLD.cmake @@ -0,0 +1,4 @@ + +cmake_policy(SET CMP0045 OLD) + +get_target_property(result tgt TYPE) diff --git a/Tests/RunCMake/CMP0045/CMP0045-WARN-result.txt b/Tests/RunCMake/CMP0045/CMP0045-WARN-result.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMP0045-WARN-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMP0045/CMP0045-WARN-stderr.txt b/Tests/RunCMake/CMP0045/CMP0045-WARN-stderr.txt new file mode 100644 index 0000000..4c53224 --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMP0045-WARN-stderr.txt @@ -0,0 +1,9 @@ +CMake Warning \(dev\) at CMP0045-WARN.cmake:2 \(get_target_property\): + Policy CMP0045 is not set: Error on non-existent target in + get_target_property. Run "cmake --help-policy CMP0045" for policy details. + Use the cmake_policy command to set the policy and suppress this warning. + + get_target_property\(\) called with non-existent target "tgt". +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) +This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/CMP0045/CMP0045-WARN.cmake b/Tests/RunCMake/CMP0045/CMP0045-WARN.cmake new file mode 100644 index 0000000..86a99a0 --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMP0045-WARN.cmake @@ -0,0 +1,2 @@ + +get_target_property(result tgt TYPE) diff --git a/Tests/RunCMake/CMP0045/CMakeLists.txt b/Tests/RunCMake/CMP0045/CMakeLists.txt new file mode 100644 index 0000000..11ea636 --- /dev/null +++ b/Tests/RunCMake/CMP0045/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8) +project(${RunCMake_TEST} CXX) +include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE) diff --git a/Tests/RunCMake/CMP0045/RunCMakeTest.cmake b/Tests/RunCMake/CMP0045/RunCMakeTest.cmake new file mode 100644 index 0000000..7c0e8a2 --- /dev/null +++ b/Tests/RunCMake/CMP0045/RunCMakeTest.cmake @@ -0,0 +1,5 @@ +include(RunCMake) + +run_cmake(CMP0045-OLD) +run_cmake(CMP0045-NEW) +run_cmake(CMP0045-WARN) diff --git a/Tests/RunCMake/CMP0045/empty.cpp b/Tests/RunCMake/CMP0045/empty.cpp new file mode 100644 index 0000000..bfbbdde --- /dev/null +++ b/Tests/RunCMake/CMP0045/empty.cpp @@ -0,0 +1,7 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif +int empty() +{ + return 0; +} diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 01ab5d4..944b898 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -65,6 +65,7 @@ if(CMAKE_SYSTEM_NAME MATCHES Darwin AND CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG) add_RunCMake_test(CMP0042) endif() add_RunCMake_test(CMP0043) +add_RunCMake_test(CMP0045) add_RunCMake_test(CTest) if(UNIX AND "${CMAKE_TEST_GENERATOR}" MATCHES "Unix Makefiles") add_RunCMake_test(CompilerChange) -- cgit v0.12