Merge branch 'fix-INCLUDE_DIRECTORIES-genex-read' into release

This commit is contained in:
Brad King 2013-05-31 09:37:27 -04:00
commit 1ba508865e
1 changed files with 77 additions and 37 deletions

View File

@ -313,6 +313,59 @@ static const char* targetPropertyTransitiveWhitelist[] = {
, "INTERFACE_COMPILE_DEFINITIONS" , "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
{
explicit TransitiveWhitelistCompare(const std::string &needle)
: Needle(needle) {}
bool operator() (const char *item)
{ return strcmp(item, this->Needle.c_str()) == 0; }
private:
std::string Needle;
};
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
static const struct TargetPropertyNode : public cmGeneratorExpressionNode static const struct TargetPropertyNode : public cmGeneratorExpressionNode
{ {
@ -485,49 +538,36 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
interfacePropertyName = "INTERFACE_COMPILE_DEFINITIONS"; interfacePropertyName = "INTERFACE_COMPILE_DEFINITIONS";
} }
if (interfacePropertyName == "INTERFACE_INCLUDE_DIRECTORIES" const char **transBegin = targetPropertyTransitiveWhitelist;
|| interfacePropertyName == "INTERFACE_COMPILE_DEFINITIONS") const char **transEnd = targetPropertyTransitiveWhitelist
+ (sizeof(targetPropertyTransitiveWhitelist) /
sizeof(*targetPropertyTransitiveWhitelist));
if (std::find_if(transBegin, transEnd,
TransitiveWhitelistCompare(propertyName)) != transEnd)
{ {
const cmTarget::LinkInterface *iface = target->GetLinkInterface( const cmTarget::LinkInterface *iface = target->GetLinkInterface(
context->Config, context->Config,
context->HeadTarget); context->HeadTarget);
if(iface) if(iface)
{ {
cmGeneratorExpression ge(context->Backtrace); linkedTargetsContent =
getLinkedTargetsContent(iface->Libraries, target,
std::string sep; context, &dagChecker,
std::string depString; interfacePropertyName);
for (std::vector<std::string>::const_iterator }
it = iface->Libraries.begin(); }
it != iface->Libraries.end(); ++it) else if (std::find_if(transBegin, transEnd,
{ TransitiveWhitelistCompare(interfacePropertyName)) != transEnd)
if (*it == target->GetName()) {
{ const cmTarget::LinkImplementation *impl = target->GetLinkImplementation(
// Broken code can have a target in its own link interface. context->Config,
// Don't follow such link interface entries so as not to create a context->HeadTarget);
// self-referencing loop. if(impl)
continue; {
} linkedTargetsContent =
if (context->Makefile->FindTargetToUse(it->c_str())) getLinkedTargetsContent(impl->Libraries, target,
{ context, &dagChecker,
depString += interfacePropertyName);
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;
}
} }
} }