summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2013-02-13 11:35:31 (GMT)
committerStephen Kelly <steveire@gmail.com>2013-02-23 08:42:24 (GMT)
commit7e707444be6f7344888102ce4f88db48a31cab63 (patch)
tree3465c6b559fba38afa8d845bdf818c37cf0ad6f1 /Source
parentd1a2729b1af86a0a3abfb21df18ed85bcfaa59c6 (diff)
downloadCMake-7e707444be6f7344888102ce4f88db48a31cab63.zip
CMake-7e707444be6f7344888102ce4f88db48a31cab63.tar.gz
CMake-7e707444be6f7344888102ce4f88db48a31cab63.tar.bz2
Expand includes and defines transitively in 'external' genexes.
This means that we can use expressions of the form $<TARGET_PROPERTY:foo,INTERFACE_INCLUDE_DIRECTORIES> to get a list of the interface include directories of foo, including those coming from dependencies. We can't have a test of a target which has a single include directory in its INCLUDE_DIRECTORIES because the shell on the MSYS platforms transforms a single include directory to include a prefix, which is not what the test expects. We test a target with two directories instead as a means to test a target with no link dependencies.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGeneratorExpressionEvaluator.cxx87
1 files changed, 51 insertions, 36 deletions
diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx
index 3407187..683245c 100644
--- a/Source/cmGeneratorExpressionEvaluator.cxx
+++ b/Source/cmGeneratorExpressionEvaluator.cxx
@@ -452,8 +452,6 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
const char *prop = target->GetProperty(propertyName.c_str());
- std::string linkedTargetsContent;
-
if (dagCheckerParent)
{
if (dagCheckerParent->EvaluatingLinkLibraries())
@@ -467,9 +465,40 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
{
assert(dagCheckerParent->EvaluatingIncludeDirectories()
|| dagCheckerParent->EvaluatingCompileDefinitions());
+ }
+ }
+
+ std::string linkedTargetsContent;
+
+ std::string interfacePropertyName;
- if (propertyName == "INTERFACE_INCLUDE_DIRECTORIES"
- || propertyName == "INTERFACE_COMPILE_DEFINITIONS")
+ if (propertyName == "INTERFACE_INCLUDE_DIRECTORIES"
+ || propertyName == "INCLUDE_DIRECTORIES")
+ {
+ interfacePropertyName = "INTERFACE_INCLUDE_DIRECTORIES";
+ }
+ else if (propertyName == "INTERFACE_COMPILE_DEFINITIONS"
+ || propertyName == "COMPILE_DEFINITIONS"
+ || strncmp(propertyName.c_str(), "COMPILE_DEFINITIONS_", 20) == 0)
+ {
+ interfacePropertyName = "INTERFACE_COMPILE_DEFINITIONS";
+ }
+
+ if (interfacePropertyName == "INTERFACE_INCLUDE_DIRECTORIES"
+ || interfacePropertyName == "INTERFACE_COMPILE_DEFINITIONS")
+ {
+ const cmTarget::LinkInterface *iface = target->GetLinkInterface(
+ context->Config,
+ 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())
{
@@ -478,40 +507,26 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
// self-referencing loop.
continue;
}
- const cmTarget::LinkInterface *iface = target->GetLinkInterface(
- context->Config,
- context->HeadTarget);
- if(iface)
+ if (context->Makefile->FindTargetToUse(it->c_str()))
{
- 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 (context->Makefile->FindTargetToUse(it->c_str()))
- {
- depString +=
- sep + "$<TARGET_PROPERTY:" + *it + "," + propertyName + ">";
- 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;
- }
+ 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;
+ }
}
}
@@ -551,7 +566,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
sizeof(*targetPropertyTransitiveWhitelist));
++i)
{
- if (targetPropertyTransitiveWhitelist[i] == propertyName)
+ if (targetPropertyTransitiveWhitelist[i] == interfacePropertyName)
{
cmGeneratorExpression ge(context->Backtrace);
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);