|
|
@@ -313,6 +313,48 @@ static const char* targetPropertyTransitiveWhitelist[] = {
|
|
|
, "INTERFACE_COMPILE_DEFINITIONS"
|
|
|
};
|
|
|
|
|
|
+std::string getLinkedTargetsContent(const std::vector<std::string> &libraries,
|
|
|
+ cmTarget *target,
|
|
|
+ cmGeneratorExpressionContext *context,
|
|
|
+ cmGeneratorExpressionDAGChecker *dagChecker,
|
|
|
+ const std::string &interfacePropertyName)
|
|
|
+{
|
|
|
+ cmGeneratorExpression ge(context->Backtrace);
|
|
|
+
|
|
|
+ std::string sep;
|
|
|
+ std::string depString;
|
|
|
+ for (std::vector<std::string>::const_iterator
|
|
|
+ it = libraries.begin();
|
|
|
+ it != libraries.end(); ++it)
|
|
|
+ {
|
|
|
+ if (*it == target->GetName())
|
|
|
+ {
|
|
|
+ // Broken code can have a target in its own link interface.
|
|
|
+ // Don't follow such link interface entries so as not to create a
|
|
|
+ // self-referencing loop.
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (context->Makefile->FindTargetToUse(it->c_str()))
|
|
|
+ {
|
|
|
+ depString +=
|
|
|
+ sep + "$<TARGET_PROPERTY:" + *it + "," + interfacePropertyName + ">";
|
|
|
+ sep = ";";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depString);
|
|
|
+ std::string linkedTargetsContent = cge->Evaluate(context->Makefile,
|
|
|
+ context->Config,
|
|
|
+ context->Quiet,
|
|
|
+ context->HeadTarget,
|
|
|
+ target,
|
|
|
+ dagChecker);
|
|
|
+ if (cge->GetHadContextSensitiveCondition())
|
|
|
+ {
|
|
|
+ context->HadContextSensitiveCondition = true;
|
|
|
+ }
|
|
|
+ return linkedTargetsContent;
|
|
|
+}
|
|
|
+
|
|
|
//----------------------------------------------------------------------------
|
|
|
struct TransitiveWhitelistCompare
|
|
|
{
|
|
|
@@ -508,41 +550,10 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
|
|
|
context->HeadTarget);
|
|
|
if(iface)
|
|
|
{
|
|
|
- cmGeneratorExpression ge(context->Backtrace);
|
|
|
-
|
|
|
- std::string sep;
|
|
|
- std::string depString;
|
|
|
- for (std::vector<std::string>::const_iterator
|
|
|
- it = iface->Libraries.begin();
|
|
|
- it != iface->Libraries.end(); ++it)
|
|
|
- {
|
|
|
- if (*it == target->GetName())
|
|
|
- {
|
|
|
- // Broken code can have a target in its own link interface.
|
|
|
- // Don't follow such link interface entries so as not to create a
|
|
|
- // self-referencing loop.
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (context->Makefile->FindTargetToUse(it->c_str()))
|
|
|
- {
|
|
|
- depString +=
|
|
|
- sep + "$<TARGET_PROPERTY:" + *it + ","
|
|
|
- + interfacePropertyName + ">";
|
|
|
- sep = ";";
|
|
|
- }
|
|
|
- }
|
|
|
- cmsys::auto_ptr<cmCompiledGeneratorExpression> cge =
|
|
|
- ge.Parse(depString);
|
|
|
- linkedTargetsContent = cge->Evaluate(context->Makefile,
|
|
|
- context->Config,
|
|
|
- context->Quiet,
|
|
|
- context->HeadTarget,
|
|
|
- target,
|
|
|
- &dagChecker);
|
|
|
- if (cge->GetHadContextSensitiveCondition())
|
|
|
- {
|
|
|
- context->HadContextSensitiveCondition = true;
|
|
|
- }
|
|
|
+ linkedTargetsContent =
|
|
|
+ getLinkedTargetsContent(iface->Libraries, target,
|
|
|
+ context, &dagChecker,
|
|
|
+ interfacePropertyName);
|
|
|
}
|
|
|
}
|
|
|
|