summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2014-06-11 14:40:36 (GMT)
committerBrad King <brad.king@kitware.com>2014-06-23 13:14:44 (GMT)
commit56aed7005ae17e979f4635240539041e66d9220a (patch)
treed11b9a8cf1d17aeb6b58e18ea294329f1125a232
parentcbf689c7dd39dc0952361b63e8322a0408b4569b (diff)
downloadCMake-56aed7005ae17e979f4635240539041e66d9220a.zip
CMake-56aed7005ae17e979f4635240539041e66d9220a.tar.gz
CMake-56aed7005ae17e979f4635240539041e66d9220a.tar.bz2
cmTarget: Cache GetLinkImplementationClosure results
Store them internally and return by reference to avoid duplicate computation.
-rw-r--r--Source/cmTarget.cxx34
-rw-r--r--Source/cmTarget.h4
2 files changed, 24 insertions, 14 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 72c46ed..566a16a 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -170,12 +170,15 @@ public:
CachedLinkInterfaceSourcesEntries;
mutable std::map<std::string, std::vector<TargetPropertyEntry*> >
CachedLinkInterfaceCompileFeaturesEntries;
+ mutable std::map<std::string, std::vector<cmTarget*> >
+ CachedLinkImplementationClosure;
mutable std::map<std::string, bool> CacheLinkInterfaceIncludeDirectoriesDone;
mutable std::map<std::string, bool> CacheLinkInterfaceCompileDefinitionsDone;
mutable std::map<std::string, bool> CacheLinkInterfaceCompileOptionsDone;
mutable std::map<std::string, bool> CacheLinkInterfaceSourcesDone;
mutable std::map<std::string, bool> CacheLinkInterfaceCompileFeaturesDone;
+ mutable std::map<std::string, bool> CacheLinkImplementationClosureDone;
};
//----------------------------------------------------------------------------
@@ -5206,8 +5209,8 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget const* tgt,
assert((impliedByUse ^ explicitlySet)
|| (!impliedByUse && !explicitlySet));
- std::vector<cmTarget*> deps;
- tgt->GetLinkImplementationClosure(config, deps);
+ std::vector<cmTarget*> const& deps =
+ tgt->GetLinkImplementationClosure(config);
if(deps.empty())
{
@@ -5422,8 +5425,8 @@ bool isLinkDependentProperty(cmTarget const* tgt, const std::string &p,
const std::string& interfaceProperty,
const std::string& config)
{
- std::vector<cmTarget*> deps;
- tgt->GetLinkImplementationClosure(config, deps);
+ std::vector<cmTarget*> const& deps =
+ tgt->GetLinkImplementationClosure(config);
if(deps.empty())
{
@@ -6142,19 +6145,26 @@ void processILibs(const std::string& config,
}
//----------------------------------------------------------------------------
-void cmTarget::GetLinkImplementationClosure(const std::string& config,
- std::vector<cmTarget*> &tgts) const
+std::vector<cmTarget*> const&
+cmTarget::GetLinkImplementationClosure(const std::string& config) const
{
- std::set<cmTarget*> emitted;
+ std::vector<cmTarget*>& tgts =
+ this->Internal->CachedLinkImplementationClosure[config];
+ if(!this->Internal->CacheLinkImplementationClosureDone[config])
+ {
+ this->Internal->CacheLinkImplementationClosureDone[config] = true;
+ std::set<cmTarget*> emitted;
- cmTarget::LinkImplementation const* impl
+ cmTarget::LinkImplementation const* impl
= this->GetLinkImplementationLibraries(config, this);
- for(std::vector<std::string>::const_iterator it = impl->Libraries.begin();
- it != impl->Libraries.end(); ++it)
- {
- processILibs(config, this, *it, tgts, emitted);
+ for(std::vector<std::string>::const_iterator it = impl->Libraries.begin();
+ it != impl->Libraries.end(); ++it)
+ {
+ processILibs(config, this, *it, tgts , emitted);
+ }
}
+ return tgts;
}
//----------------------------------------------------------------------------
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 2211338..86108b7 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -276,8 +276,8 @@ public:
void GetTransitivePropertyTargets(const std::string& config,
cmTarget const* headTarget,
std::vector<cmTarget*> &libs) const;
- void GetLinkImplementationClosure(const std::string& config,
- std::vector<cmTarget*> &libs) const;
+ std::vector<cmTarget*> const&
+ GetLinkImplementationClosure(const std::string& config) const;
/** The link implementation specifies the direct library
dependencies needed by the object files of the target. */