summaryrefslogtreecommitdiffstats
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
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.
-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;
}