cmTarget: Avoid re-computing head-independent link interfaces
This commit is contained in:
parent
807e4ffeef
commit
7b743a2e76
|
@ -114,10 +114,12 @@ public:
|
||||||
{
|
{
|
||||||
OptionalLinkInterface():
|
OptionalLinkInterface():
|
||||||
LibrariesDone(false), AllDone(false),
|
LibrariesDone(false), AllDone(false),
|
||||||
Exists(false), ExplicitLibraries(0) {}
|
Exists(false), HadHeadSensitiveCondition(false),
|
||||||
|
ExplicitLibraries(0) {}
|
||||||
bool LibrariesDone;
|
bool LibrariesDone;
|
||||||
bool AllDone;
|
bool AllDone;
|
||||||
bool Exists;
|
bool Exists;
|
||||||
|
bool HadHeadSensitiveCondition;
|
||||||
const char* ExplicitLibraries;
|
const char* ExplicitLibraries;
|
||||||
};
|
};
|
||||||
void ComputeLinkInterface(cmTarget const* thisTarget,
|
void ComputeLinkInterface(cmTarget const* thisTarget,
|
||||||
|
@ -151,9 +153,11 @@ public:
|
||||||
struct OptionalLinkImplementation: public cmTarget::LinkImplementation
|
struct OptionalLinkImplementation: public cmTarget::LinkImplementation
|
||||||
{
|
{
|
||||||
OptionalLinkImplementation():
|
OptionalLinkImplementation():
|
||||||
LibrariesDone(false), LanguagesDone(false) {}
|
LibrariesDone(false), LanguagesDone(false),
|
||||||
|
HadHeadSensitiveCondition(false) {}
|
||||||
bool LibrariesDone;
|
bool LibrariesDone;
|
||||||
bool LanguagesDone;
|
bool LanguagesDone;
|
||||||
|
bool HadHeadSensitiveCondition;
|
||||||
};
|
};
|
||||||
void ComputeLinkImplementationLibraries(cmTarget const* thisTarget,
|
void ComputeLinkImplementationLibraries(cmTarget const* thisTarget,
|
||||||
const std::string& config,
|
const std::string& config,
|
||||||
|
@ -3435,7 +3439,8 @@ void cmTarget::ExpandLinkItems(std::string const& prop,
|
||||||
std::string const& config,
|
std::string const& config,
|
||||||
cmTarget const* headTarget,
|
cmTarget const* headTarget,
|
||||||
bool usage_requirements_only,
|
bool usage_requirements_only,
|
||||||
std::vector<cmLinkItem>& items) const
|
std::vector<cmLinkItem>& items,
|
||||||
|
bool& hadHeadSensitiveCondition) const
|
||||||
{
|
{
|
||||||
cmGeneratorExpression ge;
|
cmGeneratorExpression ge;
|
||||||
cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), prop, 0, 0);
|
cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), prop, 0, 0);
|
||||||
|
@ -3446,13 +3451,15 @@ void cmTarget::ExpandLinkItems(std::string const& prop,
|
||||||
dagChecker.SetTransitivePropertiesOnly();
|
dagChecker.SetTransitivePropertiesOnly();
|
||||||
}
|
}
|
||||||
std::vector<std::string> libs;
|
std::vector<std::string> libs;
|
||||||
cmSystemTools::ExpandListArgument(ge.Parse(value)->Evaluate(
|
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(value);
|
||||||
|
cmSystemTools::ExpandListArgument(cge->Evaluate(
|
||||||
this->Makefile,
|
this->Makefile,
|
||||||
config,
|
config,
|
||||||
false,
|
false,
|
||||||
headTarget,
|
headTarget,
|
||||||
this, &dagChecker), libs);
|
this, &dagChecker), libs);
|
||||||
this->LookupLinkItems(libs, items);
|
this->LookupLinkItems(libs, items);
|
||||||
|
hadHeadSensitiveCondition = cge->GetHadHeadSensitiveCondition();
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -5757,6 +5764,14 @@ cmTarget::LinkInterface const* cmTarget::GetLinkInterface(
|
||||||
std::string CONFIG = cmSystemTools::UpperCase(config);
|
std::string CONFIG = cmSystemTools::UpperCase(config);
|
||||||
cmTargetInternals::HeadToLinkInterfaceMap& hm =
|
cmTargetInternals::HeadToLinkInterfaceMap& hm =
|
||||||
this->Internal->LinkInterfaceMap[CONFIG];
|
this->Internal->LinkInterfaceMap[CONFIG];
|
||||||
|
|
||||||
|
// If the link interface does not depend on the head target
|
||||||
|
// then return the one we computed first.
|
||||||
|
if(!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition)
|
||||||
|
{
|
||||||
|
return &hm.begin()->second;
|
||||||
|
}
|
||||||
|
|
||||||
cmTargetInternals::OptionalLinkInterface& iface = hm[head];
|
cmTargetInternals::OptionalLinkInterface& iface = hm[head];
|
||||||
if(!iface.LibrariesDone)
|
if(!iface.LibrariesDone)
|
||||||
{
|
{
|
||||||
|
@ -5802,6 +5817,14 @@ cmTarget::GetLinkInterfaceLibraries(const std::string& config,
|
||||||
(usage_requirements_only ?
|
(usage_requirements_only ?
|
||||||
this->Internal->LinkInterfaceUsageRequirementsOnlyMap[CONFIG] :
|
this->Internal->LinkInterfaceUsageRequirementsOnlyMap[CONFIG] :
|
||||||
this->Internal->LinkInterfaceMap[CONFIG]);
|
this->Internal->LinkInterfaceMap[CONFIG]);
|
||||||
|
|
||||||
|
// If the link interface does not depend on the head target
|
||||||
|
// then return the one we computed first.
|
||||||
|
if(!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition)
|
||||||
|
{
|
||||||
|
return &hm.begin()->second;
|
||||||
|
}
|
||||||
|
|
||||||
cmTargetInternals::OptionalLinkInterface& iface = hm[head];
|
cmTargetInternals::OptionalLinkInterface& iface = hm[head];
|
||||||
if(!iface.LibrariesDone)
|
if(!iface.LibrariesDone)
|
||||||
{
|
{
|
||||||
|
@ -5830,6 +5853,14 @@ cmTarget::GetImportLinkInterface(const std::string& config,
|
||||||
(usage_requirements_only ?
|
(usage_requirements_only ?
|
||||||
this->Internal->LinkInterfaceUsageRequirementsOnlyMap[CONFIG] :
|
this->Internal->LinkInterfaceUsageRequirementsOnlyMap[CONFIG] :
|
||||||
this->Internal->LinkInterfaceMap[CONFIG]);
|
this->Internal->LinkInterfaceMap[CONFIG]);
|
||||||
|
|
||||||
|
// If the link interface does not depend on the head target
|
||||||
|
// then return the one we computed first.
|
||||||
|
if(!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition)
|
||||||
|
{
|
||||||
|
return &hm.begin()->second;
|
||||||
|
}
|
||||||
|
|
||||||
cmTargetInternals::OptionalLinkInterface& iface = hm[headTarget];
|
cmTargetInternals::OptionalLinkInterface& iface = hm[headTarget];
|
||||||
if(!iface.AllDone)
|
if(!iface.AllDone)
|
||||||
{
|
{
|
||||||
|
@ -5838,7 +5869,8 @@ cmTarget::GetImportLinkInterface(const std::string& config,
|
||||||
cmSystemTools::ExpandListArgument(info->Languages, iface.Languages);
|
cmSystemTools::ExpandListArgument(info->Languages, iface.Languages);
|
||||||
this->ExpandLinkItems(info->LibrariesProp, info->Libraries, config,
|
this->ExpandLinkItems(info->LibrariesProp, info->Libraries, config,
|
||||||
headTarget, usage_requirements_only,
|
headTarget, usage_requirements_only,
|
||||||
iface.Libraries);
|
iface.Libraries,
|
||||||
|
iface.HadHeadSensitiveCondition);
|
||||||
std::vector<std::string> deps;
|
std::vector<std::string> deps;
|
||||||
cmSystemTools::ExpandListArgument(info->SharedDeps, deps);
|
cmSystemTools::ExpandListArgument(info->SharedDeps, deps);
|
||||||
this->LookupLinkItems(deps, iface.SharedDeps);
|
this->LookupLinkItems(deps, iface.SharedDeps);
|
||||||
|
@ -6022,7 +6054,8 @@ cmTargetInternals::ComputeLinkInterfaceLibraries(
|
||||||
// The interface libraries have been explicitly set.
|
// The interface libraries have been explicitly set.
|
||||||
thisTarget->ExpandLinkItems(linkIfaceProp, explicitLibraries, config,
|
thisTarget->ExpandLinkItems(linkIfaceProp, explicitLibraries, config,
|
||||||
headTarget, usage_requirements_only,
|
headTarget, usage_requirements_only,
|
||||||
iface.Libraries);
|
iface.Libraries,
|
||||||
|
iface.HadHeadSensitiveCondition);
|
||||||
}
|
}
|
||||||
else if (thisTarget->PolicyStatusCMP0022 == cmPolicies::WARN
|
else if (thisTarget->PolicyStatusCMP0022 == cmPolicies::WARN
|
||||||
|| thisTarget->PolicyStatusCMP0022 == cmPolicies::OLD)
|
|| thisTarget->PolicyStatusCMP0022 == cmPolicies::OLD)
|
||||||
|
@ -6045,9 +6078,10 @@ cmTargetInternals::ComputeLinkInterfaceLibraries(
|
||||||
static const std::string newProp = "INTERFACE_LINK_LIBRARIES";
|
static const std::string newProp = "INTERFACE_LINK_LIBRARIES";
|
||||||
if(const char* newExplicitLibraries = thisTarget->GetProperty(newProp))
|
if(const char* newExplicitLibraries = thisTarget->GetProperty(newProp))
|
||||||
{
|
{
|
||||||
|
bool hadHeadSensitiveConditionDummy = false;
|
||||||
thisTarget->ExpandLinkItems(newProp, newExplicitLibraries, config,
|
thisTarget->ExpandLinkItems(newProp, newExplicitLibraries, config,
|
||||||
headTarget, usage_requirements_only,
|
headTarget, usage_requirements_only,
|
||||||
ifaceLibs);
|
ifaceLibs, hadHeadSensitiveConditionDummy);
|
||||||
}
|
}
|
||||||
if (ifaceLibs != iface.Libraries)
|
if (ifaceLibs != iface.Libraries)
|
||||||
{
|
{
|
||||||
|
@ -6271,6 +6305,14 @@ cmTarget::GetLinkImplementationLibrariesInternal(const std::string& config,
|
||||||
std::string CONFIG = cmSystemTools::UpperCase(config);
|
std::string CONFIG = cmSystemTools::UpperCase(config);
|
||||||
cmTargetInternals::HeadToLinkImplementationMap& hm =
|
cmTargetInternals::HeadToLinkImplementationMap& hm =
|
||||||
this->Internal->LinkImplMap[CONFIG];
|
this->Internal->LinkImplMap[CONFIG];
|
||||||
|
|
||||||
|
// If the link implementation does not depend on the head target
|
||||||
|
// then return the one we computed first.
|
||||||
|
if(!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition)
|
||||||
|
{
|
||||||
|
return &hm.begin()->second;
|
||||||
|
}
|
||||||
|
|
||||||
cmTargetInternals::OptionalLinkImplementation& impl = hm[head];
|
cmTargetInternals::OptionalLinkImplementation& impl = hm[head];
|
||||||
if(!impl.LibrariesDone)
|
if(!impl.LibrariesDone)
|
||||||
{
|
{
|
||||||
|
@ -6305,6 +6347,10 @@ cmTargetInternals::ComputeLinkImplementationLibraries(
|
||||||
std::string const evaluated =
|
std::string const evaluated =
|
||||||
cge->Evaluate(thisTarget->Makefile, config, false, head, &dagChecker);
|
cge->Evaluate(thisTarget->Makefile, config, false, head, &dagChecker);
|
||||||
cmSystemTools::ExpandListArgument(evaluated, llibs);
|
cmSystemTools::ExpandListArgument(evaluated, llibs);
|
||||||
|
if(cge->GetHadHeadSensitiveCondition())
|
||||||
|
{
|
||||||
|
impl.HadHeadSensitiveCondition = true;
|
||||||
|
}
|
||||||
|
|
||||||
for(std::vector<std::string>::const_iterator li = llibs.begin();
|
for(std::vector<std::string>::const_iterator li = llibs.begin();
|
||||||
li != llibs.end(); ++li)
|
li != llibs.end(); ++li)
|
||||||
|
|
|
@ -802,7 +802,8 @@ private:
|
||||||
void ExpandLinkItems(std::string const& prop, std::string const& value,
|
void ExpandLinkItems(std::string const& prop, std::string const& value,
|
||||||
std::string const& config, cmTarget const* headTarget,
|
std::string const& config, cmTarget const* headTarget,
|
||||||
bool usage_requirements_only,
|
bool usage_requirements_only,
|
||||||
std::vector<cmLinkItem>& items) const;
|
std::vector<cmLinkItem>& items,
|
||||||
|
bool& hadHeadSensitiveCondition) const;
|
||||||
void LookupLinkItems(std::vector<std::string> const& names,
|
void LookupLinkItems(std::vector<std::string> const& names,
|
||||||
std::vector<cmLinkItem>& items) const;
|
std::vector<cmLinkItem>& items) const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue