From 0a561a03475f4ed1e017802970a8f17998fe05c3 Mon Sep 17 00:00:00 2001 From: Brad King Date: Sun, 3 Nov 2013 06:45:21 -0500 Subject: CMP0022: Warn about a given target at most once Since cmTarget::ComputeLinkInterface is called separately for each "head" target that links a target, the warning we produce when CMP0022 is not set could be repeated. Add explicit logic to allow the warning to appear at most once. Multiple copies of the warning for the same target are almost always identical and therefore redundant. In the rare case that two copies of the warning are different, the second can appear in a future run after the first is fixed. --- Source/cmTarget.cxx | 11 +++++++++-- Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe-stderr.txt | 1 + Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake | 7 +++++++ Tests/RunCMake/CMP0022/CMP0022-WARN-stderr.txt | 2 +- Tests/RunCMake/CMP0022/CMP0022-WARN.cmake | 5 +++++ Tests/RunCMake/CMP0022/RunCMakeTest.cmake | 1 + Tests/RunCMake/CMP0022/empty_vs6_4.cpp | 1 + 7 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe-stderr.txt create mode 100644 Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake create mode 100644 Tests/RunCMake/CMP0022/empty_vs6_4.cpp diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 3365caf..3598fcc 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -83,10 +83,12 @@ class cmTargetInternals public: cmTargetInternals() { + this->PolicyWarnedCMP0022 = false; this->SourceFileFlagsConstructed = false; } cmTargetInternals(cmTargetInternals const& r) { + this->PolicyWarnedCMP0022 = false; this->SourceFileFlagsConstructed = false; // Only some of these entries are part of the object state. // Others not copied here are result caches. @@ -109,6 +111,7 @@ public: typedef std::map LinkInterfaceMapType; LinkInterfaceMapType LinkInterfaceMap; + bool PolicyWarnedCMP0022; typedef std::map OutputInfoMapType; OutputInfoMapType OutputInfoMap; @@ -6433,7 +6436,8 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, } } - if(explicitLibraries && this->PolicyStatusCMP0022 == cmPolicies::WARN) + if(explicitLibraries && this->PolicyStatusCMP0022 == cmPolicies::WARN && + !this->Internal->PolicyWarnedCMP0022) { // Compare the explicitly set old link interface properties to the // preferred new link interface property one and warn if different. @@ -6455,6 +6459,7 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, linkIfaceProp << ":\n" " " << (explicitLibraries ? explicitLibraries : "(empty)") << "\n"; this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str()); + this->Internal->PolicyWarnedCMP0022 = true; } } @@ -6544,7 +6549,8 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, iface.Languages = impl->Languages; } - if(this->PolicyStatusCMP0022 == cmPolicies::WARN) + if(this->PolicyStatusCMP0022 == cmPolicies::WARN && + !this->Internal->PolicyWarnedCMP0022) { // Compare the link implementation fallback link interface to the // preferred new link interface property and warn if different. @@ -6603,6 +6609,7 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, "Link implementation:\n" " " << oldLibraries << "\n"; this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str()); + this->Internal->PolicyWarnedCMP0022 = true; } } } diff --git a/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe-stderr.txt b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe-stderr.txt new file mode 100644 index 0000000..10f3293 --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe-stderr.txt @@ -0,0 +1 @@ +^$ diff --git a/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake new file mode 100644 index 0000000..b0268c8 --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake @@ -0,0 +1,7 @@ +enable_language(CXX) + +add_library(testLib empty_vs6_1.cpp) +add_executable(testExe empty_vs6_2.cpp) +target_link_libraries(testExe testLib) + +export(TARGETS testExe FILE "${CMAKE_CURRENT_BINARY_DIR}/cmp0022NOWARN-exe.cmake") diff --git a/Tests/RunCMake/CMP0022/CMP0022-WARN-stderr.txt b/Tests/RunCMake/CMP0022/CMP0022-WARN-stderr.txt index f849be2..2f7dfbf 100644 --- a/Tests/RunCMake/CMP0022/CMP0022-WARN-stderr.txt +++ b/Tests/RunCMake/CMP0022/CMP0022-WARN-stderr.txt @@ -1,4 +1,4 @@ -CMake Warning \(dev\) in CMakeLists.txt: +^CMake Warning \(dev\) in CMakeLists.txt: Policy CMP0022 is not set: INTERFACE_LINK_LIBRARIES defines the link interface. Run "cmake --help-policy CMP0022" for policy details. Use the cmake_policy command to set the policy and suppress this warning. diff --git a/Tests/RunCMake/CMP0022/CMP0022-WARN.cmake b/Tests/RunCMake/CMP0022/CMP0022-WARN.cmake index 24b7f45..fe7e858 100644 --- a/Tests/RunCMake/CMP0022/CMP0022-WARN.cmake +++ b/Tests/RunCMake/CMP0022/CMP0022-WARN.cmake @@ -9,3 +9,8 @@ set_property(TARGET bar PROPERTY LINK_INTERFACE_LIBRARIES bat) add_library(user empty.cpp) target_link_libraries(user bar) + +# Use "bar" again with a different "head" target to check +# that the warning does not appear again. +add_library(user2 empty_vs6_3.cpp) +target_link_libraries(user2 bar) diff --git a/Tests/RunCMake/CMP0022/RunCMakeTest.cmake b/Tests/RunCMake/CMP0022/RunCMakeTest.cmake index 45b56e4..2781d20 100644 --- a/Tests/RunCMake/CMP0022/RunCMakeTest.cmake +++ b/Tests/RunCMake/CMP0022/RunCMakeTest.cmake @@ -4,6 +4,7 @@ run_cmake(CMP0022-WARN) run_cmake(CMP0022-WARN-tll) run_cmake(CMP0022-WARN-static) run_cmake(CMP0022-WARN-empty-old) +run_cmake(CMP0022-NOWARN-exe) run_cmake(CMP0022-NOWARN-shared) run_cmake(CMP0022-NOWARN-static) run_cmake(CMP0022-NOWARN-static-link_libraries) diff --git a/Tests/RunCMake/CMP0022/empty_vs6_4.cpp b/Tests/RunCMake/CMP0022/empty_vs6_4.cpp new file mode 100644 index 0000000..7efedab --- /dev/null +++ b/Tests/RunCMake/CMP0022/empty_vs6_4.cpp @@ -0,0 +1 @@ +#include "empty.cpp" -- cgit v0.12