mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-03 21:00:01 -05:00
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.
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
+16
-9
@@ -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;
|
||||
@@ -3216,6 +3216,13 @@ 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))
|
||||
@@ -3223,7 +3230,7 @@ const char *cmTarget::GetProperty(const std::string& prop) const
|
||||
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)
|
||||
{
|
||||
|
||||
+2
-1
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user