summaryrefslogtreecommitdiffstats
path: root/Source/cmGeneratorExpressionEvaluator.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2014-07-15 19:18:05 (GMT)
committerBrad King <brad.king@kitware.com>2014-07-16 17:31:30 (GMT)
commit60bafeb68404dc37434644f56e98000b3b0fff81 (patch)
treef5ea0954ce3f83db76f9f937826d4dd6e631b126 /Source/cmGeneratorExpressionEvaluator.cxx
parent8cb9105431bcc4bd206d92b7cd53cebdb1a783bd (diff)
downloadCMake-60bafeb68404dc37434644f56e98000b3b0fff81.zip
CMake-60bafeb68404dc37434644f56e98000b3b0fff81.tar.gz
CMake-60bafeb68404dc37434644f56e98000b3b0fff81.tar.bz2
Genex: Avoid repeated search of transitive property whitelist
In cmGeneratorExpressionEvaluator, avoid searching through the list of transitive interface property names repeatedly during evaluation of TargetPropertyNode. Simply record the results of the first search for later re-use.
Diffstat (limited to 'Source/cmGeneratorExpressionEvaluator.cxx')
-rw-r--r--Source/cmGeneratorExpressionEvaluator.cxx59
1 files changed, 26 insertions, 33 deletions
diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx
index d08c3c9..ddcc39d 100644
--- a/Source/cmGeneratorExpressionEvaluator.cxx
+++ b/Source/cmGeneratorExpressionEvaluator.cxx
@@ -1044,12 +1044,18 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
std::string linkedTargetsContent;
std::string interfacePropertyName;
+ bool isInterfaceProperty = false;
#define POPULATE_INTERFACE_PROPERTY_NAME(prop) \
- if (propertyName == #prop || propertyName == "INTERFACE_" #prop) \
+ if (propertyName == #prop) \
{ \
interfacePropertyName = "INTERFACE_" #prop; \
} \
+ else if (propertyName == "INTERFACE_" #prop) \
+ { \
+ interfacePropertyName = "INTERFACE_" #prop; \
+ isInterfaceProperty = true; \
+ } \
else
CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(POPULATE_INTERFACE_PROPERTY_NAME)
@@ -1065,17 +1071,10 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
}
}
#undef POPULATE_INTERFACE_PROPERTY_NAME
-
cmTarget const* headTarget = context->HeadTarget
? context->HeadTarget : target;
- const char * const *transBegin =
- cmArrayBegin(targetPropertyTransitiveWhitelist) + 1;
- const char * const *transEnd =
- cmArrayEnd(targetPropertyTransitiveWhitelist);
-
- if (std::find_if(transBegin, transEnd,
- cmStrCmp(propertyName)) != transEnd)
+ if(isInterfaceProperty)
{
if(cmTarget::LinkInterfaceLibraries const* iface =
target->GetLinkInterfaceLibraries(context->Config, headTarget, true))
@@ -1087,18 +1086,17 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
interfacePropertyName);
}
}
- else if (std::find_if(transBegin, transEnd,
- cmStrCmp(interfacePropertyName)) != transEnd)
+ else if(!interfacePropertyName.empty())
{
const cmTarget::LinkImplementationLibraries *impl
= target->GetLinkImplementationLibraries(context->Config);
if(impl)
{
linkedTargetsContent =
- getLinkedTargetsContent(impl->Libraries, target,
- headTarget,
- context, &dagChecker,
- interfacePropertyName);
+ getLinkedTargetsContent(impl->Libraries, target,
+ headTarget,
+ context, &dagChecker,
+ interfacePropertyName);
}
}
@@ -1178,32 +1176,27 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
return propContent ? propContent : "";
}
}
- for (size_t i = 1;
- i < cmArraySize(targetPropertyTransitiveWhitelist);
- ++i)
+ if(!interfacePropertyName.empty())
{
- if (targetPropertyTransitiveWhitelist[i] == interfacePropertyName)
- {
- cmGeneratorExpression ge(&context->Backtrace);
- cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
- cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
- std::string result = cge->Evaluate(context->Makefile,
+ cmGeneratorExpression ge(&context->Backtrace);
+ cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
+ cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
+ std::string result = cge->Evaluate(context->Makefile,
context->Config,
context->Quiet,
headTarget,
target,
&dagChecker);
- if (cge->GetHadContextSensitiveCondition())
- {
- context->HadContextSensitiveCondition = true;
- }
- if (!linkedTargetsContent.empty())
- {
- result += (result.empty() ? "" : ";") + linkedTargetsContent;
- }
- return result;
+ if (cge->GetHadContextSensitiveCondition())
+ {
+ context->HadContextSensitiveCondition = true;
+ }
+ if (!linkedTargetsContent.empty())
+ {
+ result += (result.empty() ? "" : ";") + linkedTargetsContent;
}
+ return result;
}
return prop;
}