diff options
-rw-r--r-- | Source/cmTarget.cxx | 34 | ||||
-rw-r--r-- | Source/cmTarget.h | 4 |
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. */ |