|
|
@@ -799,70 +799,49 @@ static const char* targetPropertyTransitiveWhitelist[] = {
|
|
|
|
|
|
#undef TRANSITIVE_PROPERTY_NAME
|
|
|
|
|
|
+template <typename T>
|
|
|
std::string
|
|
|
getLinkedTargetsContent(
|
|
|
- std::vector<cmTarget const*> &targets,
|
|
|
+ std::vector<T> const &libraries,
|
|
|
cmTarget const* target,
|
|
|
cmTarget const* headTarget,
|
|
|
cmGeneratorExpressionContext *context,
|
|
|
cmGeneratorExpressionDAGChecker *dagChecker,
|
|
|
const std::string &interfacePropertyName)
|
|
|
{
|
|
|
- cmGeneratorExpression ge(&context->Backtrace);
|
|
|
-
|
|
|
+ std::string linkedTargetsContent;
|
|
|
std::string sep;
|
|
|
std::string depString;
|
|
|
- for (std::vector<cmTarget const*>::const_iterator
|
|
|
- it = targets.begin();
|
|
|
- it != targets.end(); ++it)
|
|
|
+ for (typename std::vector<T>::const_iterator it = libraries.begin();
|
|
|
+ it != libraries.end(); ++it)
|
|
|
{
|
|
|
- if (*it == target)
|
|
|
- {
|
|
|
- // 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;
|
|
|
+ // 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.
|
|
|
+ if (it->Target && it->Target != target)
|
|
|
+ {
|
|
|
+ depString +=
|
|
|
+ sep + "$<TARGET_PROPERTY:" +
|
|
|
+ it->Target->GetName() + "," + interfacePropertyName + ">";
|
|
|
+ sep = ";";
|
|
|
}
|
|
|
- depString +=
|
|
|
- sep + "$<TARGET_PROPERTY:" +
|
|
|
- (*it)->GetName() + "," + interfacePropertyName + ">";
|
|
|
- sep = ";";
|
|
|
}
|
|
|
- cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depString);
|
|
|
- std::string linkedTargetsContent = cge->Evaluate(target->GetMakefile(),
|
|
|
- context->Config,
|
|
|
- context->Quiet,
|
|
|
- headTarget,
|
|
|
- target,
|
|
|
- dagChecker);
|
|
|
- if (cge->GetHadContextSensitiveCondition())
|
|
|
- {
|
|
|
- context->HadContextSensitiveCondition = true;
|
|
|
- }
|
|
|
- return linkedTargetsContent;
|
|
|
-}
|
|
|
-
|
|
|
-std::string
|
|
|
-getLinkedTargetsContent(
|
|
|
- std::vector<cmLinkImplItem> const &libraries,
|
|
|
- cmTarget const* target,
|
|
|
- cmTarget const* headTarget,
|
|
|
- cmGeneratorExpressionContext *context,
|
|
|
- cmGeneratorExpressionDAGChecker *dagChecker,
|
|
|
- const std::string &interfacePropertyName)
|
|
|
-{
|
|
|
- std::vector<cmTarget const*> tgts;
|
|
|
- for (std::vector<cmLinkImplItem>::const_iterator
|
|
|
- it = libraries.begin();
|
|
|
- it != libraries.end(); ++it)
|
|
|
+ if(!depString.empty())
|
|
|
{
|
|
|
- if (it->Target)
|
|
|
- {
|
|
|
- tgts.push_back(it->Target);
|
|
|
+ cmGeneratorExpression ge(&context->Backtrace);
|
|
|
+ cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depString);
|
|
|
+ linkedTargetsContent = cge->Evaluate(target->GetMakefile(),
|
|
|
+ context->Config,
|
|
|
+ context->Quiet,
|
|
|
+ headTarget,
|
|
|
+ target,
|
|
|
+ dagChecker);
|
|
|
+ if (cge->GetHadContextSensitiveCondition())
|
|
|
+ {
|
|
|
+ context->HadContextSensitiveCondition = true;
|
|
|
}
|
|
|
}
|
|
|
- return getLinkedTargetsContent(tgts, target, headTarget, context,
|
|
|
- dagChecker, interfacePropertyName);
|
|
|
+ return linkedTargetsContent;
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
@@ -1098,27 +1077,14 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
|
|
|
if (std::find_if(transBegin, transEnd,
|
|
|
cmStrCmp(propertyName)) != transEnd)
|
|
|
{
|
|
|
- std::vector<cmTarget const*> tgts;
|
|
|
if(cmTarget::LinkInterfaceLibraries const* iface =
|
|
|
target->GetLinkInterfaceLibraries(context->Config, headTarget, true))
|
|
|
{
|
|
|
- for(std::vector<cmLinkItem>::const_iterator
|
|
|
- it = iface->Libraries.begin();
|
|
|
- it != iface->Libraries.end(); ++it)
|
|
|
- {
|
|
|
- if (it->Target)
|
|
|
- {
|
|
|
- tgts.push_back(it->Target);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (!tgts.empty())
|
|
|
- {
|
|
|
linkedTargetsContent =
|
|
|
- getLinkedTargetsContent(tgts, target,
|
|
|
- headTarget,
|
|
|
- context, &dagChecker,
|
|
|
- interfacePropertyName);
|
|
|
+ getLinkedTargetsContent(iface->Libraries, target,
|
|
|
+ headTarget,
|
|
|
+ context, &dagChecker,
|
|
|
+ interfacePropertyName);
|
|
|
}
|
|
|
}
|
|
|
else if (std::find_if(transBegin, transEnd,
|