summaryrefslogtreecommitdiffstats
path: root/Source/cmTarget.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2014-07-21 17:04:04 (GMT)
committerBrad King <brad.king@kitware.com>2014-07-21 17:04:04 (GMT)
commit7b743a2e761783f930de41db3f7a706b065bbb2e (patch)
treed9adfc045b4339fe62aa94fd924747cd0b51f0a2 /Source/cmTarget.cxx
parent807e4ffeefb0e10ef0546e0eb7383f3d5533809b (diff)
downloadCMake-7b743a2e761783f930de41db3f7a706b065bbb2e.zip
CMake-7b743a2e761783f930de41db3f7a706b065bbb2e.tar.gz
CMake-7b743a2e761783f930de41db3f7a706b065bbb2e.tar.bz2
cmTarget: Avoid re-computing head-independent link interfaces
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r--Source/cmTarget.cxx60
1 files changed, 53 insertions, 7 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 353a3a6..ca24d2d 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -114,10 +114,12 @@ public:
{
OptionalLinkInterface():
LibrariesDone(false), AllDone(false),
- Exists(false), ExplicitLibraries(0) {}
+ Exists(false), HadHeadSensitiveCondition(false),
+ ExplicitLibraries(0) {}
bool LibrariesDone;
bool AllDone;
bool Exists;
+ bool HadHeadSensitiveCondition;
const char* ExplicitLibraries;
};
void ComputeLinkInterface(cmTarget const* thisTarget,
@@ -151,9 +153,11 @@ public:
struct OptionalLinkImplementation: public cmTarget::LinkImplementation
{
OptionalLinkImplementation():
- LibrariesDone(false), LanguagesDone(false) {}
+ LibrariesDone(false), LanguagesDone(false),
+ HadHeadSensitiveCondition(false) {}
bool LibrariesDone;
bool LanguagesDone;
+ bool HadHeadSensitiveCondition;
};
void ComputeLinkImplementationLibraries(cmTarget const* thisTarget,
const std::string& config,
@@ -3435,7 +3439,8 @@ void cmTarget::ExpandLinkItems(std::string const& prop,
std::string const& config,
cmTarget const* headTarget,
bool usage_requirements_only,
- std::vector<cmLinkItem>& items) const
+ std::vector<cmLinkItem>& items,
+ bool& hadHeadSensitiveCondition) const
{
cmGeneratorExpression ge;
cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), prop, 0, 0);
@@ -3446,13 +3451,15 @@ void cmTarget::ExpandLinkItems(std::string const& prop,
dagChecker.SetTransitivePropertiesOnly();
}
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,
config,
false,
headTarget,
this, &dagChecker), libs);
this->LookupLinkItems(libs, items);
+ hadHeadSensitiveCondition = cge->GetHadHeadSensitiveCondition();
}
//----------------------------------------------------------------------------
@@ -5757,6 +5764,14 @@ cmTarget::LinkInterface const* cmTarget::GetLinkInterface(
std::string CONFIG = cmSystemTools::UpperCase(config);
cmTargetInternals::HeadToLinkInterfaceMap& hm =
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];
if(!iface.LibrariesDone)
{
@@ -5802,6 +5817,14 @@ cmTarget::GetLinkInterfaceLibraries(const std::string& config,
(usage_requirements_only ?
this->Internal->LinkInterfaceUsageRequirementsOnlyMap[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];
if(!iface.LibrariesDone)
{
@@ -5830,6 +5853,14 @@ cmTarget::GetImportLinkInterface(const std::string& config,
(usage_requirements_only ?
this->Internal->LinkInterfaceUsageRequirementsOnlyMap[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];
if(!iface.AllDone)
{
@@ -5838,7 +5869,8 @@ cmTarget::GetImportLinkInterface(const std::string& config,
cmSystemTools::ExpandListArgument(info->Languages, iface.Languages);
this->ExpandLinkItems(info->LibrariesProp, info->Libraries, config,
headTarget, usage_requirements_only,
- iface.Libraries);
+ iface.Libraries,
+ iface.HadHeadSensitiveCondition);
std::vector<std::string> deps;
cmSystemTools::ExpandListArgument(info->SharedDeps, deps);
this->LookupLinkItems(deps, iface.SharedDeps);
@@ -6022,7 +6054,8 @@ cmTargetInternals::ComputeLinkInterfaceLibraries(
// The interface libraries have been explicitly set.
thisTarget->ExpandLinkItems(linkIfaceProp, explicitLibraries, config,
headTarget, usage_requirements_only,
- iface.Libraries);
+ iface.Libraries,
+ iface.HadHeadSensitiveCondition);
}
else if (thisTarget->PolicyStatusCMP0022 == cmPolicies::WARN
|| thisTarget->PolicyStatusCMP0022 == cmPolicies::OLD)
@@ -6045,9 +6078,10 @@ cmTargetInternals::ComputeLinkInterfaceLibraries(
static const std::string newProp = "INTERFACE_LINK_LIBRARIES";
if(const char* newExplicitLibraries = thisTarget->GetProperty(newProp))
{
+ bool hadHeadSensitiveConditionDummy = false;
thisTarget->ExpandLinkItems(newProp, newExplicitLibraries, config,
headTarget, usage_requirements_only,
- ifaceLibs);
+ ifaceLibs, hadHeadSensitiveConditionDummy);
}
if (ifaceLibs != iface.Libraries)
{
@@ -6271,6 +6305,14 @@ cmTarget::GetLinkImplementationLibrariesInternal(const std::string& config,
std::string CONFIG = cmSystemTools::UpperCase(config);
cmTargetInternals::HeadToLinkImplementationMap& hm =
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];
if(!impl.LibrariesDone)
{
@@ -6305,6 +6347,10 @@ cmTargetInternals::ComputeLinkImplementationLibraries(
std::string const evaluated =
cge->Evaluate(thisTarget->Makefile, config, false, head, &dagChecker);
cmSystemTools::ExpandListArgument(evaluated, llibs);
+ if(cge->GetHadHeadSensitiveCondition())
+ {
+ impl.HadHeadSensitiveCondition = true;
+ }
for(std::vector<std::string>::const_iterator li = llibs.begin();
li != llibs.end(); ++li)