summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2014-05-09 10:50:29 -0400
committerBrad King <brad.king@kitware.com>2014-05-09 11:24:15 -0400
commit911cc9a39e1f26344d47743885626060c2d94d2c (patch)
treea0199eb310d875d3a891cbf78224f79893750b6f
parentcb810abe6d1c4189517d84fa6e08849a02e3f873 (diff)
downloadcmake-911cc9a39e1f26344d47743885626060c2d94d2c.tar.gz
cmTarget: Evaluate CMP0026 and CMP0051 in calling context
These policies should be checked at the call site that tries to access the LOCATION or SOURCES property, not the directory scope containing the target. Thread the caller context through cmTarget::GetProperty to use for checking the policy setting and emitting a diagnostic with proper backtrace. Extend the RunCMake.CMP0026 and RunCMake.CMP0051 tests with cross-directory cases.
-rw-r--r--Source/cmGetPropertyCommand.cxx3
-rw-r--r--Source/cmGetTargetPropertyCommand.cxx2
-rw-r--r--Source/cmTarget.cxx25
-rw-r--r--Source/cmTarget.h3
-rw-r--r--Tests/RunCMake/CMP0026/CMP0026-WARN-Dir/CMakeLists.txt1
-rw-r--r--Tests/RunCMake/CMP0026/CMP0026-WARN-stderr.txt13
-rw-r--r--Tests/RunCMake/CMP0026/CMP0026-WARN.cmake3
-rw-r--r--Tests/RunCMake/CMP0051/CMP0051-WARN-Dir/CMakeLists.txt1
-rw-r--r--Tests/RunCMake/CMP0051/CMP0051-WARN-stderr.txt18
-rw-r--r--Tests/RunCMake/CMP0051/CMP0051-WARN.cmake6
10 files changed, 62 insertions, 13 deletions
diff --git a/Source/cmGetPropertyCommand.cxx b/Source/cmGetPropertyCommand.cxx
index 6dd40c9213..512d78994c 100644
--- a/Source/cmGetPropertyCommand.cxx
+++ b/Source/cmGetPropertyCommand.cxx
@@ -302,7 +302,8 @@ bool cmGetPropertyCommand::HandleTargetMode()
}
if(cmTarget* target = this->Makefile->FindTargetToUse(this->Name))
{
- return this->StoreResult(target->GetProperty(this->PropertyName));
+ return this->StoreResult(target->GetProperty(this->PropertyName,
+ this->Makefile));
}
else
{
diff --git a/Source/cmGetTargetPropertyCommand.cxx b/Source/cmGetTargetPropertyCommand.cxx
index e3ec0bcd39..aa6f0c11cc 100644
--- a/Source/cmGetTargetPropertyCommand.cxx
+++ b/Source/cmGetTargetPropertyCommand.cxx
@@ -38,7 +38,7 @@ bool cmGetTargetPropertyCommand
else if(cmTarget* tgt = this->Makefile->FindTargetToUse(targetName))
{
cmTarget& target = *tgt;
- const char* prop_cstr = target.GetProperty(args[2]);
+ const char* prop_cstr = target.GetProperty(args[2], this->Makefile);
if(prop_cstr)
{
prop = prop_cstr;
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 6b8d51d975..3f2ae9e275 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -3178,7 +3178,7 @@ const char* cmTarget::GetFeature(const std::string& feature,
}
//----------------------------------------------------------------------------
-bool cmTarget::HandleLocationPropertyPolicy() const
+bool cmTarget::HandleLocationPropertyPolicy(cmMakefile* context) const
{
if (this->IsImported())
{
@@ -3187,7 +3187,7 @@ bool cmTarget::HandleLocationPropertyPolicy() const
cmOStringStream e;
const char *modal = 0;
cmake::MessageType messageType = cmake::AUTHOR_WARNING;
- switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0026))
+ switch (context->GetPolicyStatus(cmPolicies::CMP0026))
{
case cmPolicies::WARN:
e << (this->Makefile->GetPolicies()
@@ -3208,7 +3208,7 @@ bool cmTarget::HandleLocationPropertyPolicy() const
<< this->GetName() << "\". Use the target name directly with "
"add_custom_command, or use the generator expression $<TARGET_FILE>, "
"as appropriate.\n";
- this->Makefile->IssueMessage(messageType, e.str());
+ context->IssueMessage(messageType, e.str());
}
return messageType != cmake::FATAL_ERROR;
@@ -3217,13 +3217,20 @@ bool cmTarget::HandleLocationPropertyPolicy() const
//----------------------------------------------------------------------------
const char *cmTarget::GetProperty(const std::string& prop) const
{
+ return this->GetProperty(prop, this->Makefile);
+}
+
+//----------------------------------------------------------------------------
+const char *cmTarget::GetProperty(const std::string& prop,
+ cmMakefile* context) const
+{
if (this->GetType() == INTERFACE_LIBRARY
&& !whiteListedInterfaceProperty(prop))
{
cmOStringStream e;
e << "INTERFACE_LIBRARY targets may only have whitelisted properties. "
"The property \"" << prop << "\" is not allowed.";
- this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
+ context->IssueMessage(cmake::FATAL_ERROR, e.str());
return 0;
}
@@ -3242,7 +3249,7 @@ const char *cmTarget::GetProperty(const std::string& prop) const
{
if(prop == "LOCATION")
{
- if (!this->HandleLocationPropertyPolicy())
+ if (!this->HandleLocationPropertyPolicy(context))
{
return 0;
}
@@ -3263,7 +3270,7 @@ const char *cmTarget::GetProperty(const std::string& prop) const
// Support "LOCATION_<CONFIG>".
if(cmHasLiteralPrefix(prop, "LOCATION_"))
{
- if (!this->HandleLocationPropertyPolicy())
+ if (!this->HandleLocationPropertyPolicy(context))
{
return 0;
}
@@ -3278,7 +3285,7 @@ const char *cmTarget::GetProperty(const std::string& prop) const
std::string configName(prop.c_str(), prop.size() - 9);
if(configName != "IMPORTED")
{
- if (!this->HandleLocationPropertyPolicy())
+ if (!this->HandleLocationPropertyPolicy(context))
{
return 0;
}
@@ -3416,7 +3423,7 @@ const char *cmTarget::GetProperty(const std::string& prop) const
bool noMessage = true;
cmOStringStream e;
cmake::MessageType messageType = cmake::AUTHOR_WARNING;
- switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0051))
+ switch(context->GetPolicyStatus(cmPolicies::CMP0051))
{
case cmPolicies::WARN:
e << (this->Makefile->GetPolicies()
@@ -3437,7 +3444,7 @@ const char *cmTarget::GetProperty(const std::string& prop) const
"read at configure time. Code reading that property needs to be "
"adapted to ignore the generator expression using the "
"string(GENEX_STRIP) command.";
- this->Makefile->IssueMessage(messageType, e.str());
+ context->IssueMessage(messageType, e.str());
}
if (addContent)
{
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 22462b90e6..bee6b34911 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -231,6 +231,7 @@ public:
void AppendProperty(const std::string& prop, const char* value,
bool asString=false);
const char *GetProperty(const std::string& prop) const;
+ const char *GetProperty(const std::string& prop, cmMakefile* context) const;
bool GetPropertyAsBool(const std::string& prop) const;
void CheckProperty(const std::string& prop, cmMakefile* context) const;
@@ -587,7 +588,7 @@ public:
const std::string &compatibilityType) const;
private:
- bool HandleLocationPropertyPolicy() const;
+ bool HandleLocationPropertyPolicy(cmMakefile* context) const;
// The set of include directories that are marked as system include
// directories.
diff --git a/Tests/RunCMake/CMP0026/CMP0026-WARN-Dir/CMakeLists.txt b/Tests/RunCMake/CMP0026/CMP0026-WARN-Dir/CMakeLists.txt
new file mode 100644
index 0000000000..17a7db043a
--- /dev/null
+++ b/Tests/RunCMake/CMP0026/CMP0026-WARN-Dir/CMakeLists.txt
@@ -0,0 +1 @@
+add_library(otherlib ../empty.cpp)
diff --git a/Tests/RunCMake/CMP0026/CMP0026-WARN-stderr.txt b/Tests/RunCMake/CMP0026/CMP0026-WARN-stderr.txt
index 9b8819488e..d122c4a2eb 100644
--- a/Tests/RunCMake/CMP0026/CMP0026-WARN-stderr.txt
+++ b/Tests/RunCMake/CMP0026/CMP0026-WARN-stderr.txt
@@ -10,3 +10,16 @@ CMake Warning \(dev\) at CMP0026-WARN.cmake:5 \(get_target_property\):
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
++
+CMake Warning \(dev\) at CMP0026-WARN.cmake:8 \(get_target_property\):
+ Policy CMP0026 is not set: Disallow use of the LOCATION target property.
+ Run "cmake --help-policy CMP0026" for policy details. Use the cmake_policy
+ command to set the policy and suppress this warning.
+
+ The LOCATION property should not be read from target "otherlib". Use the
+ target name directly with add_custom_command, or use the generator
+ expression \$<TARGET_FILE>, as appropriate.
+
+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/CMP0026/CMP0026-WARN.cmake b/Tests/RunCMake/CMP0026/CMP0026-WARN.cmake
index 89c5a8af79..bfc9203af9 100644
--- a/Tests/RunCMake/CMP0026/CMP0026-WARN.cmake
+++ b/Tests/RunCMake/CMP0026/CMP0026-WARN.cmake
@@ -3,3 +3,6 @@ enable_language(CXX)
add_library(somelib empty.cpp)
get_target_property(_loc somelib LOCATION)
+
+add_subdirectory(CMP0026-WARN-Dir)
+get_target_property(_loc otherlib LOCATION)
diff --git a/Tests/RunCMake/CMP0051/CMP0051-WARN-Dir/CMakeLists.txt b/Tests/RunCMake/CMP0051/CMP0051-WARN-Dir/CMakeLists.txt
new file mode 100644
index 0000000000..77cbad53ef
--- /dev/null
+++ b/Tests/RunCMake/CMP0051/CMP0051-WARN-Dir/CMakeLists.txt
@@ -0,0 +1 @@
+add_library(empty2 ../empty.cpp $<TARGET_OBJECTS:objects>)
diff --git a/Tests/RunCMake/CMP0051/CMP0051-WARN-stderr.txt b/Tests/RunCMake/CMP0051/CMP0051-WARN-stderr.txt
index f1b0357c9b..ae2e468482 100644
--- a/Tests/RunCMake/CMP0051/CMP0051-WARN-stderr.txt
+++ b/Tests/RunCMake/CMP0051/CMP0051-WARN-stderr.txt
@@ -12,4 +12,20 @@ Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
-Sources: "empty.cpp"$
+Sources: "empty.cpp"
+*
+CMake Warning \(dev\) at CMP0051-WARN.cmake:12 \(get_target_property\):
+ Policy CMP0051 is not set: List TARGET_OBJECTS in SOURCES target property.
+ Run "cmake --help-policy CMP0051" for policy details. Use the cmake_policy
+ command to set the policy and suppress this warning.
+
+ Target "empty2" contains \$<TARGET_OBJECTS> generator expression in its
+ sources list. This content was not previously part of the SOURCES property
+ when that property was read at configure time. Code reading that property
+ needs to be adapted to ignore the generator expression using the
+ string\(GENEX_STRIP\) command.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
+This warning is for project developers. Use -Wno-dev to suppress it.
+
+Sources: "../empty.cpp"$
diff --git a/Tests/RunCMake/CMP0051/CMP0051-WARN.cmake b/Tests/RunCMake/CMP0051/CMP0051-WARN.cmake
index fd595cec29..744598fcbf 100644
--- a/Tests/RunCMake/CMP0051/CMP0051-WARN.cmake
+++ b/Tests/RunCMake/CMP0051/CMP0051-WARN.cmake
@@ -6,3 +6,9 @@ add_library(empty empty.cpp $<TARGET_OBJECTS:objects>)
get_target_property(srcs empty SOURCES)
message("Sources: \"${srcs}\"")
+
+add_subdirectory(CMP0051-WARN-Dir)
+
+get_target_property(srcs empty2 SOURCES)
+
+message("Sources: \"${srcs}\"")