cmTarget: Evaluate CMP0026 in calling context
This policy should be checked at the call site that tries to access the LOCATION 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 test with a cross-directory case.
This commit is contained in:
parent
2e75bf672b
commit
23409f50f1
|
@ -302,7 +302,8 @@ bool cmGetPropertyCommand::HandleTargetMode()
|
||||||
}
|
}
|
||||||
if(cmTarget* target = this->Makefile->FindTargetToUse(this->Name))
|
if(cmTarget* target = this->Makefile->FindTargetToUse(this->Name))
|
||||||
{
|
{
|
||||||
return this->StoreResult(target->GetProperty(this->PropertyName.c_str()));
|
return this->StoreResult(target->GetProperty(this->PropertyName.c_str(),
|
||||||
|
this->Makefile));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,7 +38,7 @@ bool cmGetTargetPropertyCommand
|
||||||
else if(cmTarget* tgt = this->Makefile->FindTargetToUse(targetName))
|
else if(cmTarget* tgt = this->Makefile->FindTargetToUse(targetName))
|
||||||
{
|
{
|
||||||
cmTarget& target = *tgt;
|
cmTarget& target = *tgt;
|
||||||
prop = target.GetProperty(args[2].c_str());
|
prop = target.GetProperty(args[2].c_str(), this->Makefile);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -2624,7 +2624,7 @@ const char* cmTarget::GetFeature(const char* feature, const char* config) const
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmTarget::HandleLocationPropertyPolicy() const
|
bool cmTarget::HandleLocationPropertyPolicy(cmMakefile* context) const
|
||||||
{
|
{
|
||||||
if (this->IsImported())
|
if (this->IsImported())
|
||||||
{
|
{
|
||||||
|
@ -2633,7 +2633,7 @@ bool cmTarget::HandleLocationPropertyPolicy() const
|
||||||
cmOStringStream e;
|
cmOStringStream e;
|
||||||
const char *modal = 0;
|
const char *modal = 0;
|
||||||
cmake::MessageType messageType = cmake::AUTHOR_WARNING;
|
cmake::MessageType messageType = cmake::AUTHOR_WARNING;
|
||||||
switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0026))
|
switch (context->GetPolicyStatus(cmPolicies::CMP0026))
|
||||||
{
|
{
|
||||||
case cmPolicies::WARN:
|
case cmPolicies::WARN:
|
||||||
e << (this->Makefile->GetPolicies()
|
e << (this->Makefile->GetPolicies()
|
||||||
|
@ -2654,7 +2654,7 @@ bool cmTarget::HandleLocationPropertyPolicy() const
|
||||||
<< this->GetName() << "\". Use the target name directly with "
|
<< this->GetName() << "\". Use the target name directly with "
|
||||||
"add_custom_command, or use the generator expression $<TARGET_FILE>, "
|
"add_custom_command, or use the generator expression $<TARGET_FILE>, "
|
||||||
"as appropriate.\n";
|
"as appropriate.\n";
|
||||||
this->Makefile->IssueMessage(messageType, e.str().c_str());
|
context->IssueMessage(messageType, e.str().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
return messageType != cmake::FATAL_ERROR;
|
return messageType != cmake::FATAL_ERROR;
|
||||||
|
@ -2662,6 +2662,13 @@ bool cmTarget::HandleLocationPropertyPolicy() const
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
const char *cmTarget::GetProperty(const char* prop) const
|
const char *cmTarget::GetProperty(const char* prop) const
|
||||||
|
{
|
||||||
|
return this->GetProperty(prop, this->Makefile);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
const char *cmTarget::GetProperty(const char* prop,
|
||||||
|
cmMakefile* context) const
|
||||||
{
|
{
|
||||||
if(!prop)
|
if(!prop)
|
||||||
{
|
{
|
||||||
|
@ -2674,7 +2681,7 @@ const char *cmTarget::GetProperty(const char* prop) const
|
||||||
cmOStringStream e;
|
cmOStringStream e;
|
||||||
e << "INTERFACE_LIBRARY targets may only have whitelisted properties. "
|
e << "INTERFACE_LIBRARY targets may only have whitelisted properties. "
|
||||||
"The property \"" << prop << "\" is not allowed.";
|
"The property \"" << prop << "\" is not allowed.";
|
||||||
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
|
context->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2693,7 +2700,7 @@ const char *cmTarget::GetProperty(const char* prop) const
|
||||||
{
|
{
|
||||||
if(strcmp(prop,"LOCATION") == 0)
|
if(strcmp(prop,"LOCATION") == 0)
|
||||||
{
|
{
|
||||||
if (!this->HandleLocationPropertyPolicy())
|
if (!this->HandleLocationPropertyPolicy(context))
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2714,7 +2721,7 @@ const char *cmTarget::GetProperty(const char* prop) const
|
||||||
// Support "LOCATION_<CONFIG>".
|
// Support "LOCATION_<CONFIG>".
|
||||||
if(cmHasLiteralPrefix(prop, "LOCATION_"))
|
if(cmHasLiteralPrefix(prop, "LOCATION_"))
|
||||||
{
|
{
|
||||||
if (!this->HandleLocationPropertyPolicy())
|
if (!this->HandleLocationPropertyPolicy(context))
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2729,7 +2736,7 @@ const char *cmTarget::GetProperty(const char* prop) const
|
||||||
std::string configName(prop, strlen(prop) - 9);
|
std::string configName(prop, strlen(prop) - 9);
|
||||||
if(configName != "IMPORTED")
|
if(configName != "IMPORTED")
|
||||||
{
|
{
|
||||||
if (!this->HandleLocationPropertyPolicy())
|
if (!this->HandleLocationPropertyPolicy(context))
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,6 +257,7 @@ public:
|
||||||
void SetProperty(const char *prop, const char *value);
|
void SetProperty(const char *prop, const char *value);
|
||||||
void AppendProperty(const char* prop, const char* value,bool asString=false);
|
void AppendProperty(const char* prop, const char* value,bool asString=false);
|
||||||
const char *GetProperty(const char *prop) const;
|
const char *GetProperty(const char *prop) const;
|
||||||
|
const char *GetProperty(const char *prop, cmMakefile* context) const;
|
||||||
bool GetPropertyAsBool(const char *prop) const;
|
bool GetPropertyAsBool(const char *prop) const;
|
||||||
void CheckProperty(const char* prop, cmMakefile* context) const;
|
void CheckProperty(const char* prop, cmMakefile* context) const;
|
||||||
|
|
||||||
|
@ -579,7 +580,7 @@ public:
|
||||||
const std::string &compatibilityType) const;
|
const std::string &compatibilityType) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool HandleLocationPropertyPolicy() const;
|
bool HandleLocationPropertyPolicy(cmMakefile* context) const;
|
||||||
|
|
||||||
// The set of include directories that are marked as system include
|
// The set of include directories that are marked as system include
|
||||||
// directories.
|
// directories.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
add_library(otherlib ../empty.cpp)
|
|
@ -10,3 +10,16 @@ CMake Warning \(dev\) at CMP0026-WARN.cmake:5 \(get_target_property\):
|
||||||
Call Stack \(most recent call first\):
|
Call Stack \(most recent call first\):
|
||||||
CMakeLists.txt:3 \(include\)
|
CMakeLists.txt:3 \(include\)
|
||||||
This warning is for project developers. Use -Wno-dev to suppress it.
|
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.
|
||||||
|
|
|
@ -3,3 +3,6 @@ enable_language(CXX)
|
||||||
|
|
||||||
add_library(somelib empty.cpp)
|
add_library(somelib empty.cpp)
|
||||||
get_target_property(_loc somelib LOCATION)
|
get_target_property(_loc somelib LOCATION)
|
||||||
|
|
||||||
|
add_subdirectory(CMP0026-WARN-Dir)
|
||||||
|
get_target_property(_loc otherlib LOCATION)
|
||||||
|
|
Loading…
Reference in New Issue