mirror of
https://github.com/Kitware/CMake.git
synced 2026-02-23 23:49:02 -06:00
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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user