From 6354df92b12746dcb0f6fa263af2adf649cf1f3f Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 09:36:24 -0400 Subject: [PATCH 01/24] cmTarget: Remove unused GetInterfaceLinkLibraries method --- Source/cmTarget.cxx | 23 ----------------------- Source/cmTarget.h | 3 --- 2 files changed, 26 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 01edde900..3b7bfafb5 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1228,29 +1228,6 @@ void cmTarget::GetDirectLinkLibraries(const std::string& config, } } -//---------------------------------------------------------------------------- -void cmTarget::GetInterfaceLinkLibraries(const std::string& config, - std::vector &libs, - cmTarget const* head) const -{ - const char *prop = this->GetProperty("INTERFACE_LINK_LIBRARIES"); - if (prop) - { - cmGeneratorExpression ge; - const cmsys::auto_ptr cge = ge.Parse(prop); - - cmGeneratorExpressionDAGChecker dagChecker( - this->GetName(), - "INTERFACE_LINK_LIBRARIES", 0, 0); - cmSystemTools::ExpandListArgument(cge->Evaluate(this->Makefile, - config, - false, - head, - &dagChecker), - libs); - } -} - //---------------------------------------------------------------------------- std::string cmTarget::GetDebugGeneratorExpressions(const std::string &value, cmTarget::LinkLibraryType llt) const diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 2d51835e3..3b1b40a26 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -162,9 +162,6 @@ public: void GetDirectLinkLibraries(const std::string& config, std::vector &, cmTarget const* head) const; - void GetInterfaceLinkLibraries(const std::string& config, - std::vector &, - cmTarget const* head) const; /** Compute the link type to use for the given configuration. */ LinkLibraryType ComputeLinkType(const std::string& config) const; From 8d15a1bbfbefff919d8a7aa0d04f54d08d1f1a11 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 11:31:11 -0400 Subject: [PATCH 02/24] cmTarget: De-duplicate library list expansion Create an ExpandLinkItems method to handle evaluation of generator expressions in a library list and expansion of the ;-list into a vector. Replace some duplicate copies of the implementation with calls to the new helper. --- Source/cmTarget.cxx | 61 ++++++++++++++++++++------------------------- Source/cmTarget.h | 4 +++ 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 3b7bfafb5..9d53fc2c5 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3691,6 +3691,23 @@ void cmTarget::ComputeLinkClosure(const std::string& config, LinkClosure& lc, } } +//---------------------------------------------------------------------------- +void cmTarget::ExpandLinkItems(std::string const& prop, + std::string const& value, + std::string const& config, + cmTarget const* headTarget, + std::vector& libs) const +{ + cmGeneratorExpression ge; + cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), prop, 0, 0); + cmSystemTools::ExpandListArgument(ge.Parse(value)->Evaluate( + this->Makefile, + config, + false, + headTarget, + this, &dagChecker), libs); +} + //---------------------------------------------------------------------------- const char* cmTarget::GetSuffixVariableInternal(bool implib) const { @@ -5870,19 +5887,8 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config, } if(propertyLibs) { - cmGeneratorExpression ge; - - cmGeneratorExpressionDAGChecker dagChecker( - this->GetName(), - linkProp, 0, 0); - cmSystemTools::ExpandListArgument(ge.Parse(propertyLibs) - ->Evaluate(this->Makefile, - desired_config, - false, - headTarget, - this, - &dagChecker), - info.LinkInterface.Libraries); + this->ExpandLinkItems(linkProp, propertyLibs, desired_config, + headTarget, info.LinkInterface.Libraries); } } if(this->GetType() == INTERFACE_LIBRARY) @@ -6302,15 +6308,8 @@ const char* cmTarget::ComputeLinkInterfaceLibraries(const std::string& config, if(explicitLibraries) { // The interface libraries have been explicitly set. - cmGeneratorExpression ge; - cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), - linkIfaceProp, 0, 0); - cmSystemTools::ExpandListArgument(ge.Parse(explicitLibraries)->Evaluate( - this->Makefile, - config, - false, - headTarget, - this, &dagChecker), iface.Libraries); + this->ExpandLinkItems(linkIfaceProp, explicitLibraries, config, + headTarget, iface.Libraries); } else if (this->PolicyStatusCMP0022 == cmPolicies::WARN || this->PolicyStatusCMP0022 == cmPolicies::OLD) @@ -6328,19 +6327,13 @@ const char* cmTarget::ComputeLinkInterfaceLibraries(const std::string& config, { // Compare the link implementation fallback link interface to the // preferred new link interface property and warn if different. - cmGeneratorExpression ge; - cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), - "INTERFACE_LINK_LIBRARIES", 0, 0); std::vector ifaceLibs; - const char* newExplicitLibraries = - this->GetProperty("INTERFACE_LINK_LIBRARIES"); - cmSystemTools::ExpandListArgument( - ge.Parse(newExplicitLibraries)->Evaluate(this->Makefile, - config, - false, - headTarget, - this, &dagChecker), - ifaceLibs); + std::string newProp = "INTERFACE_LINK_LIBRARIES"; + if(const char* newExplicitLibraries = this->GetProperty(newProp)) + { + this->ExpandLinkItems(newProp, newExplicitLibraries, config, + headTarget, ifaceLibs); + } if (ifaceLibs != impl->Libraries) { std::string oldLibraries; diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 3b1b40a26..ba3077e6a 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -764,6 +764,10 @@ private: void ComputeLinkClosure(const std::string& config, LinkClosure& lc, cmTarget const* head) const; + void ExpandLinkItems(std::string const& prop, std::string const& value, + std::string const& config, cmTarget const* headTarget, + std::vector& libs) const; + std::string ProcessSourceItemCMP0049(const std::string& s); void ClearLinkMaps(); From 7b85938973782ec6d09b1debe6ad48d3ba887683 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 09:49:13 -0400 Subject: [PATCH 03/24] cmComputeTargetDepends: Remove unused 'linking' argument The AddInterfaceDepends method is never called with a non-true value for its 'linking' argument. Drop it. --- Source/cmComputeTargetDepends.cxx | 9 +++------ Source/cmComputeTargetDepends.h | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Source/cmComputeTargetDepends.cxx b/Source/cmComputeTargetDepends.cxx index f28217fc5..8e75807a8 100644 --- a/Source/cmComputeTargetDepends.cxx +++ b/Source/cmComputeTargetDepends.cxx @@ -261,8 +261,7 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index) if(emitted.insert(*lib).second) { this->AddTargetDepend(depender_index, *lib, true); - this->AddInterfaceDepends(depender_index, *lib, - true, emitted); + this->AddInterfaceDepends(depender_index, *lib, emitted); } } } @@ -304,8 +303,7 @@ void cmComputeTargetDepends::AddInterfaceDepends(int depender_index, if(emitted.insert(*lib).second) { this->AddTargetDepend(depender_index, *lib, true); - this->AddInterfaceDepends(depender_index, *lib, - true, emitted); + this->AddInterfaceDepends(depender_index, *lib, emitted); } } } @@ -314,7 +312,6 @@ void cmComputeTargetDepends::AddInterfaceDepends(int depender_index, //---------------------------------------------------------------------------- void cmComputeTargetDepends::AddInterfaceDepends(int depender_index, const std::string& dependee_name, - bool linking, std::set &emitted) { cmTarget const* depender = this->Targets[depender_index]; @@ -323,7 +320,7 @@ void cmComputeTargetDepends::AddInterfaceDepends(int depender_index, // Skip targets that will not really be linked. This is probably a // name conflict between an external library and an executable // within the project. - if(linking && dependee && + if(dependee && dependee->GetType() == cmTarget::EXECUTABLE && !dependee->IsExecutableWithExports()) { diff --git a/Source/cmComputeTargetDepends.h b/Source/cmComputeTargetDepends.h index 755381635..b99199f6f 100644 --- a/Source/cmComputeTargetDepends.h +++ b/Source/cmComputeTargetDepends.h @@ -53,7 +53,7 @@ private: bool ComputeFinalDepends(cmComputeComponentGraph const& ccg); void AddInterfaceDepends(int depender_index, const std::string& dependee_name, - bool linking, std::set &emitted); + std::set &emitted); void AddInterfaceDepends(int depender_index, cmTarget const* dependee, const std::string& config, std::set &emitted); From e838e0a977bf3ca07509f4af39d5f93d598f84f4 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 11:44:49 -0400 Subject: [PATCH 04/24] cmTarget: Simplify processILibs implementation Combine the outer two if() conditions into a single one with &&. Scope inner lookup result inside its condition. --- Source/cmTarget.cxx | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 9d53fc2c5..ff4ded19c 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -6123,22 +6123,19 @@ void processILibs(const std::string& config, std::string const& name, std::vector& tgts, std::set& emitted) { - if (cmTarget* tgt = headTarget->GetMakefile() - ->FindTargetToUse(name)) + cmTarget* tgt = headTarget->GetMakefile() + ->FindTargetToUse(name); + if (tgt && emitted.insert(tgt).second) { - if (emitted.insert(tgt).second) + tgts.push_back(tgt); + if(cmTarget::LinkInterface const* iface = + tgt->GetLinkInterfaceLibraries(config, headTarget)) { - tgts.push_back(tgt); - cmTarget::LinkInterface const* iface = - tgt->GetLinkInterfaceLibraries(config, headTarget); - if (iface) + for(std::vector::const_iterator + it = iface->Libraries.begin(); + it != iface->Libraries.end(); ++it) { - for(std::vector::const_iterator - it = iface->Libraries.begin(); - it != iface->Libraries.end(); ++it) - { - processILibs(config, headTarget, *it, tgts, emitted); - } + processILibs(config, headTarget, *it, tgts, emitted); } } } From 962f2c3529d39e293549d16963c59f1508c5a81c Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 11:48:31 -0400 Subject: [PATCH 05/24] cmComputeLinkDepends: Simplify CheckWrongConfigItem implementation Combine the outer two if() conditions into a single one with &&. --- Source/cmComputeLinkDepends.cxx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index 995f191bd..336097be1 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -999,12 +999,9 @@ void cmComputeLinkDepends::CheckWrongConfigItem(int depender_index, // For CMake 2.4 bug-compatibility we need to consider the output // directories of targets linked in another configuration as link // directories. - if(cmTarget const* tgt - = this->FindTargetToLink(depender_index, item)) + cmTarget const* tgt = this->FindTargetToLink(depender_index, item); + if(tgt && !tgt->IsImported()) { - if(!tgt->IsImported()) - { - this->OldWrongConfigItems.insert(tgt); - } + this->OldWrongConfigItems.insert(tgt); } } From 2f0004c143455387c4b6ecac2458fcec4d57643f Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 11 Jun 2014 10:39:13 -0400 Subject: [PATCH 06/24] cmTarget: Remove 'head' argument from GetTransitiveTargetClosure The method is never called with any headTarget besides "this". --- Source/cmTarget.cxx | 9 ++++----- Source/cmTarget.h | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index ff4ded19c..6759a3d58 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -5207,7 +5207,7 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget const* tgt, || (!impliedByUse && !explicitlySet)); std::vector deps; - tgt->GetTransitiveTargetClosure(config, tgt, deps); + tgt->GetTransitiveTargetClosure(config, deps); if(deps.empty()) { @@ -5423,7 +5423,7 @@ bool isLinkDependentProperty(cmTarget const* tgt, const std::string &p, const std::string& config) { std::vector deps; - tgt->GetTransitiveTargetClosure(config, tgt, deps); + tgt->GetTransitiveTargetClosure(config, deps); if(deps.empty()) { @@ -6143,18 +6143,17 @@ void processILibs(const std::string& config, //---------------------------------------------------------------------------- void cmTarget::GetTransitiveTargetClosure(const std::string& config, - cmTarget const* headTarget, std::vector &tgts) const { std::set emitted; cmTarget::LinkImplementation const* impl - = this->GetLinkImplementationLibraries(config, headTarget); + = this->GetLinkImplementationLibraries(config, this); for(std::vector::const_iterator it = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) { - processILibs(config, headTarget, *it, tgts, emitted); + processILibs(config, this, *it, tgts, emitted); } } diff --git a/Source/cmTarget.h b/Source/cmTarget.h index ba3077e6a..762323f95 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -277,7 +277,6 @@ public: cmTarget const* headTarget, std::vector &libs) const; void GetTransitiveTargetClosure(const std::string& config, - cmTarget const* headTarget, std::vector &libs) const; /** The link implementation specifies the direct library From cbf689c7dd39dc0952361b63e8322a0408b4569b Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 11 Jun 2014 10:39:51 -0400 Subject: [PATCH 07/24] cmTarget: Rename Get{TransitiveTarget => LinkImplementation}Closure The method computes the transitive closure of targets starting with the current target link implementation libraries. Clarify the name. --- Source/cmTarget.cxx | 6 +++--- Source/cmTarget.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 6759a3d58..72c46ed22 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -5207,7 +5207,7 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget const* tgt, || (!impliedByUse && !explicitlySet)); std::vector deps; - tgt->GetTransitiveTargetClosure(config, deps); + tgt->GetLinkImplementationClosure(config, deps); if(deps.empty()) { @@ -5423,7 +5423,7 @@ bool isLinkDependentProperty(cmTarget const* tgt, const std::string &p, const std::string& config) { std::vector deps; - tgt->GetTransitiveTargetClosure(config, deps); + tgt->GetLinkImplementationClosure(config, deps); if(deps.empty()) { @@ -6142,7 +6142,7 @@ void processILibs(const std::string& config, } //---------------------------------------------------------------------------- -void cmTarget::GetTransitiveTargetClosure(const std::string& config, +void cmTarget::GetLinkImplementationClosure(const std::string& config, std::vector &tgts) const { std::set emitted; diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 762323f95..2211338e6 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 &libs) const; - void GetTransitiveTargetClosure(const std::string& config, - std::vector &libs) const; + void GetLinkImplementationClosure(const std::string& config, + std::vector &libs) const; /** The link implementation specifies the direct library dependencies needed by the object files of the target. */ From 56aed7005ae17e979f4635240539041e66d9220a Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 11 Jun 2014 10:40:36 -0400 Subject: [PATCH 08/24] cmTarget: Cache GetLinkImplementationClosure results Store them internally and return by reference to avoid duplicate computation. --- Source/cmTarget.cxx | 34 ++++++++++++++++++++++------------ Source/cmTarget.h | 4 ++-- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 72c46ed22..566a16ac8 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -170,12 +170,15 @@ public: CachedLinkInterfaceSourcesEntries; mutable std::map > CachedLinkInterfaceCompileFeaturesEntries; + mutable std::map > + CachedLinkImplementationClosure; mutable std::map CacheLinkInterfaceIncludeDirectoriesDone; mutable std::map CacheLinkInterfaceCompileDefinitionsDone; mutable std::map CacheLinkInterfaceCompileOptionsDone; mutable std::map CacheLinkInterfaceSourcesDone; mutable std::map CacheLinkInterfaceCompileFeaturesDone; + mutable std::map CacheLinkImplementationClosureDone; }; //---------------------------------------------------------------------------- @@ -5206,8 +5209,8 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget const* tgt, assert((impliedByUse ^ explicitlySet) || (!impliedByUse && !explicitlySet)); - std::vector deps; - tgt->GetLinkImplementationClosure(config, deps); + std::vector 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 deps; - tgt->GetLinkImplementationClosure(config, deps); + std::vector 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 &tgts) const +std::vector const& +cmTarget::GetLinkImplementationClosure(const std::string& config) const { - std::set emitted; + std::vector& tgts = + this->Internal->CachedLinkImplementationClosure[config]; + if(!this->Internal->CacheLinkImplementationClosureDone[config]) + { + this->Internal->CacheLinkImplementationClosureDone[config] = true; + std::set emitted; - cmTarget::LinkImplementation const* impl + cmTarget::LinkImplementation const* impl = this->GetLinkImplementationLibraries(config, this); - for(std::vector::const_iterator it = impl->Libraries.begin(); - it != impl->Libraries.end(); ++it) - { - processILibs(config, this, *it, tgts, emitted); + for(std::vector::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 2211338e6..86108b768 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 &libs) const; - void GetLinkImplementationClosure(const std::string& config, - std::vector &libs) const; + std::vector const& + GetLinkImplementationClosure(const std::string& config) const; /** The link implementation specifies the direct library dependencies needed by the object files of the target. */ From 06328dd58ee3de5d716b0d2b259927da2e173c1d Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 12 Jun 2014 16:10:00 -0400 Subject: [PATCH 09/24] cmTarget: Remove 'head' argument from GetLinkInformation No call sites use it anyway. Co-Author: Stephen Kelly --- Source/cmTarget.cxx | 8 +++----- Source/cmTarget.h | 10 ++++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 566a16ac8..f6a92bdf6 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -6943,19 +6943,17 @@ void cmTarget::CheckPropertyCompatibility(cmComputeLinkInformation *info, //---------------------------------------------------------------------------- cmComputeLinkInformation* -cmTarget::GetLinkInformation(const std::string& config, - cmTarget const* head) const +cmTarget::GetLinkInformation(const std::string& config) const { - cmTarget const* headTarget = head ? head : this; // Lookup any existing information for this configuration. - TargetConfigPair key(headTarget, cmSystemTools::UpperCase(config)); + std::string key(cmSystemTools::UpperCase(config)); cmTargetLinkInformationMap::iterator i = this->LinkInformation.find(key); if(i == this->LinkInformation.end()) { // Compute information for this configuration. cmComputeLinkInformation* info = - new cmComputeLinkInformation(this, config, headTarget); + new cmComputeLinkInformation(this, config, this); if(!info || !info->Compute()) { delete info; diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 86108b768..5bcbb3dc1 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -44,11 +44,9 @@ class cmGeneratorTarget; class cmTargetTraceDependencies; struct cmTargetLinkInformationMap: - public std::map, - cmComputeLinkInformation*> + public std::map { - typedef std::map, - cmComputeLinkInformation*> derived; + typedef std::map derived; cmTargetLinkInformationMap() {} cmTargetLinkInformationMap(cmTargetLinkInformationMap const& r); ~cmTargetLinkInformationMap(); @@ -442,8 +440,8 @@ public: * install tree. For example: "\@rpath/" or "\@loader_path/". */ std::string GetInstallNameDirForInstallTree() const; - cmComputeLinkInformation* GetLinkInformation(const std::string& config, - cmTarget const* head = 0) const; + cmComputeLinkInformation* + GetLinkInformation(const std::string& config) const; // Get the properties cmPropertyMap &GetProperties() const { return this->Properties; } From bd9b667bbe83b112a9ea4448605fac980d2d8a68 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 12 Jun 2014 16:15:10 -0400 Subject: [PATCH 10/24] cmComputeLinkInformation: Remove 'head' argument It is only ever constructed with the current target as its own 'head'. Co-Author: Stephen Kelly --- Source/cmComputeLinkDepends.cxx | 12 +++++------- Source/cmComputeLinkDepends.h | 4 +--- Source/cmComputeLinkInformation.cxx | 13 +++++-------- Source/cmComputeLinkInformation.h | 4 +--- Source/cmTarget.cxx | 2 +- 5 files changed, 13 insertions(+), 22 deletions(-) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index 336097be1..1aabdebe5 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -172,12 +172,10 @@ satisfy dependencies. //---------------------------------------------------------------------------- cmComputeLinkDepends -::cmComputeLinkDepends(cmTarget const* target, const std::string& config, - cmTarget const* head) +::cmComputeLinkDepends(cmTarget const* target, const std::string& config) { // Store context information. this->Target = target; - this->HeadTarget = head; this->Makefile = this->Target->GetMakefile(); this->LocalGenerator = this->Makefile->GetLocalGenerator(); this->GlobalGenerator = this->LocalGenerator->GetGlobalGenerator(); @@ -356,7 +354,7 @@ void cmComputeLinkDepends::FollowLinkEntry(BFSEntry const& qe) { // Follow the target dependencies. if(cmTarget::LinkInterface const* iface = - entry.Target->GetLinkInterface(this->Config, this->HeadTarget)) + entry.Target->GetLinkInterface(this->Config, this->Target)) { const bool isIface = entry.Target->GetType() == cmTarget::INTERFACE_LIBRARY; @@ -455,7 +453,7 @@ void cmComputeLinkDepends::HandleSharedDependency(SharedDepEntry const& dep) if(entry.Target) { if(cmTarget::LinkInterface const* iface = - entry.Target->GetLinkInterface(this->Config, this->HeadTarget)) + entry.Target->GetLinkInterface(this->Config, this->Target)) { // Follow public and private dependencies transitively. this->FollowSharedDeps(index, iface, true); @@ -544,7 +542,7 @@ void cmComputeLinkDepends::AddDirectLinkEntries() { // Add direct link dependencies in this configuration. cmTarget::LinkImplementation const* impl = - this->Target->GetLinkImplementation(this->Config, this->HeadTarget); + this->Target->GetLinkImplementation(this->Config, this->Target); this->AddLinkEntries(-1, impl->Libraries); for(std::vector::const_iterator wi = impl->WrongConfigLibraries.begin(); @@ -955,7 +953,7 @@ int cmComputeLinkDepends::ComputeComponentCount(NodeList const& nl) if(cmTarget const* target = this->EntryList[*ni].Target) { if(cmTarget::LinkInterface const* iface = - target->GetLinkInterface(this->Config, this->HeadTarget)) + target->GetLinkInterface(this->Config, this->Target)) { if(iface->Multiplicity > count) { diff --git a/Source/cmComputeLinkDepends.h b/Source/cmComputeLinkDepends.h index 13fc993fb..440dc0d4f 100644 --- a/Source/cmComputeLinkDepends.h +++ b/Source/cmComputeLinkDepends.h @@ -32,8 +32,7 @@ class cmake; class cmComputeLinkDepends { public: - cmComputeLinkDepends(cmTarget const* target, const std::string& config, - cmTarget const* head); + cmComputeLinkDepends(cmTarget const* target, const std::string& config); ~cmComputeLinkDepends(); // Basic information about each link item. @@ -60,7 +59,6 @@ private: // Context information. cmTarget const* Target; - cmTarget const* HeadTarget; cmMakefile* Makefile; cmLocalGenerator* LocalGenerator; cmGlobalGenerator const* GlobalGenerator; diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index 0ce04a5d1..bcafe2df1 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -239,12 +239,10 @@ because this need be done only for shared libraries without soname-s. //---------------------------------------------------------------------------- cmComputeLinkInformation -::cmComputeLinkInformation(cmTarget const* target, const std::string& config, - cmTarget const* headTarget) +::cmComputeLinkInformation(cmTarget const* target, const std::string& config) { // Store context information. this->Target = target; - this->HeadTarget = headTarget; this->Makefile = this->Target->GetMakefile(); this->LocalGenerator = this->Makefile->GetLocalGenerator(); this->GlobalGenerator = this->LocalGenerator->GetGlobalGenerator(); @@ -267,7 +265,7 @@ cmComputeLinkInformation this->OrderDependentRPath = 0; // Get the language used for linking this target. - this->LinkLanguage = this->Target->GetLinkerLanguage(config, headTarget); + this->LinkLanguage = this->Target->GetLinkerLanguage(config); if(this->LinkLanguage.empty()) { // The Compute method will do nothing, so skip the rest of the @@ -505,8 +503,7 @@ bool cmComputeLinkInformation::Compute() } // Compute the ordered link line items. - cmComputeLinkDepends cld(this->Target, this->Config, - this->HeadTarget); + cmComputeLinkDepends cld(this->Target, this->Config); cld.SetOldLinkDirMode(this->OldLinkDirMode); cmComputeLinkDepends::EntryVector const& linkEntries = cld.Compute(); @@ -573,7 +570,7 @@ void cmComputeLinkInformation::AddImplicitLinkInfo() { // The link closure lists all languages whose implicit info is needed. cmTarget::LinkClosure const* lc=this->Target->GetLinkClosure(this->Config, - this->HeadTarget); + this->Target); for(std::vector::const_iterator li = lc->Languages.begin(); li != lc->Languages.end(); ++li) { @@ -1972,7 +1969,7 @@ void cmComputeLinkInformation::GetRPath(std::vector& runtimeDirs, // present. This is done even when skipping rpath support. { cmTarget::LinkClosure const* lc = - this->Target->GetLinkClosure(this->Config, this->HeadTarget); + this->Target->GetLinkClosure(this->Config, this->Target); for(std::vector::const_iterator li = lc->Languages.begin(); li != lc->Languages.end(); ++li) { diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h index e345fe259..e5d674abf 100644 --- a/Source/cmComputeLinkInformation.h +++ b/Source/cmComputeLinkInformation.h @@ -29,8 +29,7 @@ class cmOrderDirectories; class cmComputeLinkInformation { public: - cmComputeLinkInformation(cmTarget const* target, const std::string& config, - cmTarget const* headTarget); + cmComputeLinkInformation(cmTarget const* target, const std::string& config); ~cmComputeLinkInformation(); bool Compute(); @@ -75,7 +74,6 @@ private: // Context information. cmTarget const* Target; - cmTarget const* HeadTarget; cmMakefile* Makefile; cmLocalGenerator* LocalGenerator; cmGlobalGenerator* GlobalGenerator; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index f6a92bdf6..32b077717 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -6953,7 +6953,7 @@ cmTarget::GetLinkInformation(const std::string& config) const { // Compute information for this configuration. cmComputeLinkInformation* info = - new cmComputeLinkInformation(this, config, this); + new cmComputeLinkInformation(this, config); if(!info || !info->Compute()) { delete info; From bcdb7ff9df8fb831e952a3909da11da51773a30f Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 12 Jun 2014 16:20:08 -0400 Subject: [PATCH 11/24] cmTarget: Remove 'head' argument from GetLinkerLanguage It is only ever called with the 'this' target as the head. Co-Author: Stephen Kelly --- Source/cmTarget.cxx | 15 ++++++--------- Source/cmTarget.h | 3 +-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 32b077717..f52c94d22 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3552,11 +3552,9 @@ private: }; //---------------------------------------------------------------------------- -std::string cmTarget::GetLinkerLanguage(const std::string& config, - cmTarget const* head) const +std::string cmTarget::GetLinkerLanguage(const std::string& config) const { - cmTarget const* headTarget = head ? head : this; - return this->GetLinkClosure(config, headTarget)->LinkerLanguage; + return this->GetLinkClosure(config, this)->LinkerLanguage; } //---------------------------------------------------------------------------- @@ -3842,8 +3840,7 @@ bool cmTarget::HasSOName(const std::string& config) const return ((this->GetType() == cmTarget::SHARED_LIBRARY || this->GetType() == cmTarget::MODULE_LIBRARY) && !this->GetPropertyAsBool("NO_SONAME") && - this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config, - this))); + this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config))); } //---------------------------------------------------------------------------- @@ -4216,7 +4213,7 @@ void cmTarget::GetFullNameInternal(const std::string& config, const char* suffixVar = this->GetSuffixVariableInternal(implib); // Check for language-specific default prefix and suffix. - std::string ll = this->GetLinkerLanguage(config, this); + std::string ll = this->GetLinkerLanguage(config); if(!ll.empty()) { if(!targetSuffix && suffixVar && *suffixVar) @@ -4555,7 +4552,7 @@ bool cmTarget::NeedRelinkBeforeInstall(const std::string& config) const } // Check for rpath support on this platform. - std::string ll = this->GetLinkerLanguage(config, this); + std::string ll = this->GetLinkerLanguage(config); if(!ll.empty()) { std::string flagVar = "CMAKE_SHARED_LIBRARY_RUNTIME_"; @@ -5644,7 +5641,7 @@ bool cmTarget::IsChrpathUsed(const std::string& config) const #if defined(CMAKE_USE_ELF_PARSER) // Enable if the rpath flag uses a separator and the target uses ELF // binaries. - std::string ll = this->GetLinkerLanguage(config, this); + std::string ll = this->GetLinkerLanguage(config); if(!ll.empty()) { std::string sepVar = "CMAKE_SHARED_LIBRARY_RUNTIME_"; diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 5bcbb3dc1..26a1e8657 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -355,8 +355,7 @@ public: GetTargetVersion(bool soversion, int& major, int& minor, int& patch) const; ///! Return the preferred linker language for this target - std::string GetLinkerLanguage(const std::string& config = "", - cmTarget const* head = 0) const; + std::string GetLinkerLanguage(const std::string& config = "") const; /** Get the full name of the target according to the settings in its makefile. */ From 4ac72455fd7027039d498f007fdfe7c1d819b9f9 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 12 Jun 2014 16:21:45 -0400 Subject: [PATCH 12/24] cmTarget: Drop 'head' argument from GetLinkClosure It is only ever passed the 'this' target itself. --- Source/cmComputeLinkInformation.cxx | 5 ++--- Source/cmTarget.cxx | 22 ++++++++++------------ Source/cmTarget.h | 6 ++---- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index bcafe2df1..e1852a360 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -569,8 +569,7 @@ bool cmComputeLinkInformation::Compute() void cmComputeLinkInformation::AddImplicitLinkInfo() { // The link closure lists all languages whose implicit info is needed. - cmTarget::LinkClosure const* lc=this->Target->GetLinkClosure(this->Config, - this->Target); + cmTarget::LinkClosure const* lc=this->Target->GetLinkClosure(this->Config); for(std::vector::const_iterator li = lc->Languages.begin(); li != lc->Languages.end(); ++li) { @@ -1969,7 +1968,7 @@ void cmComputeLinkInformation::GetRPath(std::vector& runtimeDirs, // present. This is done even when skipping rpath support. { cmTarget::LinkClosure const* lc = - this->Target->GetLinkClosure(this->Config, this->Target); + this->Target->GetLinkClosure(this->Config); for(std::vector::const_iterator li = lc->Languages.begin(); li != lc->Languages.end(); ++li) { diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index f52c94d22..f38005271 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -136,8 +136,7 @@ public: cmTarget::LinkImplementation> LinkImplMapType; LinkImplMapType LinkImplMap; - typedef std::map - LinkClosureMapType; + typedef std::map LinkClosureMapType; LinkClosureMapType LinkClosureMap; typedef std::map > @@ -3554,21 +3553,20 @@ private: //---------------------------------------------------------------------------- std::string cmTarget::GetLinkerLanguage(const std::string& config) const { - return this->GetLinkClosure(config, this)->LinkerLanguage; + return this->GetLinkClosure(config)->LinkerLanguage; } //---------------------------------------------------------------------------- -cmTarget::LinkClosure const* cmTarget::GetLinkClosure( - const std::string& config, - cmTarget const* head) const +cmTarget::LinkClosure const* +cmTarget::GetLinkClosure(const std::string& config) const { - TargetConfigPair key(head, cmSystemTools::UpperCase(config)); + std::string key(cmSystemTools::UpperCase(config)); cmTargetInternals::LinkClosureMapType::iterator i = this->Internal->LinkClosureMap.find(key); if(i == this->Internal->LinkClosureMap.end()) { LinkClosure lc; - this->ComputeLinkClosure(config, lc, head); + this->ComputeLinkClosure(config, lc); cmTargetInternals::LinkClosureMapType::value_type entry(key, lc); i = this->Internal->LinkClosureMap.insert(entry).first; } @@ -3629,12 +3627,12 @@ public: }; //---------------------------------------------------------------------------- -void cmTarget::ComputeLinkClosure(const std::string& config, LinkClosure& lc, - cmTarget const* head) const +void cmTarget::ComputeLinkClosure(const std::string& config, + LinkClosure& lc) const { // Get languages built in this target. std::set languages; - LinkImplementation const* impl = this->GetLinkImplementation(config, head); + LinkImplementation const* impl = this->GetLinkImplementation(config, this); for(std::vector::const_iterator li = impl->Languages.begin(); li != impl->Languages.end(); ++li) { @@ -3642,7 +3640,7 @@ void cmTarget::ComputeLinkClosure(const std::string& config, LinkClosure& lc, } // Add interface languages from linked targets. - cmTargetCollectLinkLanguages cll(this, config, languages, head); + cmTargetCollectLinkLanguages cll(this, config, languages, this); for(std::vector::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 26a1e8657..8c6955e76 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -308,8 +308,7 @@ public: // Languages whose runtime libraries must be linked. std::vector Languages; }; - LinkClosure const* GetLinkClosure(const std::string& config, - cmTarget const* head) const; + LinkClosure const* GetLinkClosure(const std::string& config) const; /** Strip off leading and trailing whitespace from an item named in the link dependencies of this target. */ @@ -757,8 +756,7 @@ private: void ComputeLinkImplementationLanguages(const std::string& config, LinkImplementation& impl, cmTarget const* head) const; - void ComputeLinkClosure(const std::string& config, LinkClosure& lc, - cmTarget const* head) const; + void ComputeLinkClosure(const std::string& config, LinkClosure& lc) const; void ExpandLinkItems(std::string const& prop, std::string const& value, std::string const& config, cmTarget const* headTarget, From 0dc9e88d76fa74440fc3b38032738a21ce72f2d7 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 12 Jun 2014 16:22:11 -0400 Subject: [PATCH 13/24] cmTarget: Remove 'head' argument from GetLinkImplementation Many of the 'head' arguments added by commit v2.8.11~289^2~1 (Make linking APIs aware of 'head' target, 2013-01-04) turned out not to be needed. The "link implementation" of a target never needs to be computed with anything but itself as the 'head' target (except for CMP0022 OLD behavior because then it is the link interface). Remove the unused 'head' target paths. Add "internal" versions of cmTarget::GetDirectLinkLibraries and GetLinkImplementationLibraries to support the CMP0022 OLD behavior without otherwise exposing the 'head' target option of these methods. --- Source/cmComputeLinkDepends.cxx | 2 +- Source/cmComputeTargetDepends.cxx | 2 +- Source/cmGeneratorExpressionEvaluator.cxx | 3 +- Source/cmGeneratorTarget.cxx | 2 +- Source/cmGlobalXCodeGenerator.cxx | 2 +- Source/cmTarget.cxx | 53 ++++++++++++++--------- Source/cmTarget.h | 18 +++++--- 7 files changed, 49 insertions(+), 33 deletions(-) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index 1aabdebe5..1b83ee8fa 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -542,7 +542,7 @@ void cmComputeLinkDepends::AddDirectLinkEntries() { // Add direct link dependencies in this configuration. cmTarget::LinkImplementation const* impl = - this->Target->GetLinkImplementation(this->Config, this->Target); + this->Target->GetLinkImplementation(this->Config); this->AddLinkEntries(-1, impl->Libraries); for(std::vector::const_iterator wi = impl->WrongConfigLibraries.begin(); diff --git a/Source/cmComputeTargetDepends.cxx b/Source/cmComputeTargetDepends.cxx index 8e75807a8..a5df060bc 100644 --- a/Source/cmComputeTargetDepends.cxx +++ b/Source/cmComputeTargetDepends.cxx @@ -250,7 +250,7 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index) } } std::vector tlibs; - depender->GetDirectLinkLibraries(*it, tlibs, depender); + depender->GetDirectLinkLibraries(*it, tlibs); // A target should not depend on itself. emitted.insert(depender->GetName()); diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 7dcb335d6..cefdd6316 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -1098,8 +1098,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode cmStrCmp(interfacePropertyName)) != transEnd) { const cmTarget::LinkImplementation *impl - = target->GetLinkImplementationLibraries(context->Config, - headTarget); + = target->GetLinkImplementationLibraries(context->Config); if(impl) { linkedTargetsContent = diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index a7576ed60..381a0ed00 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -449,7 +449,7 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(const std::string& dir, if (iter == this->SystemIncludesCache.end()) { cmTarget::LinkImplementation const* impl - = this->Target->GetLinkImplementation(config, this->Target); + = this->Target->GetLinkImplementation(config); if(!impl) { return false; diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 29a5955a6..9a36df5aa 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -1255,7 +1255,7 @@ void cmGlobalXCodeGenerator::ForceLinkerLanguage(cmTarget& cmtarget) // If the language is compiled as a source trust Xcode to link with it. cmTarget::LinkImplementation const* impl = - cmtarget.GetLinkImplementation("NOCONFIG", &cmtarget); + cmtarget.GetLinkImplementation("NOCONFIG"); for(std::vector::const_iterator li = impl->Languages.begin(); li != impl->Languages.end(); ++li) { diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index f38005271..86cab4e8f 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1198,8 +1198,15 @@ bool cmTarget::NameResolvesToFramework(const std::string& libname) const //---------------------------------------------------------------------------- void cmTarget::GetDirectLinkLibraries(const std::string& config, - std::vector &libs, - cmTarget const* head) const + std::vector &libs) const +{ + this->GetDirectLinkLibrariesInternal(config, libs, this); +} + +//---------------------------------------------------------------------------- +void cmTarget::GetDirectLinkLibrariesInternal(const std::string& config, + std::vector &libs, + cmTarget const* head) const { const char *prop = this->GetProperty("LINK_LIBRARIES"); if (prop) @@ -2273,8 +2280,7 @@ cmTarget::GetIncludeDirectories(const std::string& config) const if(this->Makefile->IsOn("APPLE")) { - LinkImplementation const* impl = this->GetLinkImplementation(config, - this); + LinkImplementation const* impl = this->GetLinkImplementation(config); for(std::vector::const_iterator it = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) @@ -3632,7 +3638,7 @@ void cmTarget::ComputeLinkClosure(const std::string& config, { // Get languages built in this target. std::set languages; - LinkImplementation const* impl = this->GetLinkImplementation(config, this); + LinkImplementation const* impl = this->GetLinkImplementation(config); for(std::vector::const_iterator li = impl->Languages.begin(); li != impl->Languages.end(); ++li) { @@ -4500,7 +4506,7 @@ bool cmTarget::HaveBuildTreeRPATH(const std::string& config) const return false; } std::vector libs; - this->GetDirectLinkLibraries(config, libs, this); + this->GetDirectLinkLibraries(config, libs); return !libs.empty(); } @@ -6151,7 +6157,7 @@ cmTarget::GetLinkImplementationClosure(const std::string& config) const std::set emitted; cmTarget::LinkImplementation const* impl - = this->GetLinkImplementationLibraries(config, this); + = this->GetLinkImplementationLibraries(config); for(std::vector::const_iterator it = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) @@ -6321,7 +6327,7 @@ const char* cmTarget::ComputeLinkInterfaceLibraries(const std::string& config, { // The link implementation is the default link interface. LinkImplementation const* impl = - this->GetLinkImplementationLibraries(config, headTarget); + this->GetLinkImplementationLibrariesInternal(config, headTarget); iface.Libraries = impl->Libraries; if(this->PolicyStatusCMP0022 == cmPolicies::WARN && !this->Internal->PolicyWarnedCMP0022) @@ -6407,7 +6413,7 @@ void cmTargetInternals::ComputeLinkInterface(cmTarget const* thisTarget, if (thisTarget->GetType() != cmTarget::INTERFACE_LIBRARY) { cmTarget::LinkImplementation const* impl = - thisTarget->GetLinkImplementation(config, headTarget); + thisTarget->GetLinkImplementation(config); for(std::vector::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { @@ -6438,7 +6444,8 @@ void cmTargetInternals::ComputeLinkInterface(cmTarget const* thisTarget, { // The link implementation is the default link interface. cmTarget::LinkImplementation const* - impl = thisTarget->GetLinkImplementation(config, headTarget); + impl = thisTarget->GetLinkImplementationLibrariesInternal(config, + headTarget); iface.ImplementationIsInterface = true; iface.WrongConfigLibraries = impl->WrongConfigLibraries; } @@ -6447,7 +6454,7 @@ void cmTargetInternals::ComputeLinkInterface(cmTarget const* thisTarget, { // Targets using this archive need its language runtime libraries. if(cmTarget::LinkImplementation const* impl = - thisTarget->GetLinkImplementation(config, headTarget)) + thisTarget->GetLinkImplementation(config)) { iface.Languages = impl->Languages; } @@ -6485,8 +6492,7 @@ void cmTargetInternals::ComputeLinkInterface(cmTarget const* thisTarget, //---------------------------------------------------------------------------- cmTarget::LinkImplementation const* -cmTarget::GetLinkImplementation(const std::string& config, - cmTarget const* head) const +cmTarget::GetLinkImplementation(const std::string& config) const { // There is no link implementation for imported targets. if(this->IsImported()) @@ -6495,7 +6501,7 @@ cmTarget::GetLinkImplementation(const std::string& config, } // Lookup any existing link implementation for this configuration. - TargetConfigPair key(head, cmSystemTools::UpperCase(config)); + TargetConfigPair key(this, cmSystemTools::UpperCase(config)); cmTargetInternals::LinkImplMapType::iterator i = this->Internal->LinkImplMap.find(key); @@ -6503,8 +6509,8 @@ cmTarget::GetLinkImplementation(const std::string& config, { // Compute the link implementation for this configuration. LinkImplementation impl; - this->ComputeLinkImplementation(config, impl, head); - this->ComputeLinkImplementationLanguages(config, impl, head); + this->ComputeLinkImplementation(config, impl, this); + this->ComputeLinkImplementationLanguages(config, impl, this); // Store the information for this configuration. cmTargetInternals::LinkImplMapType::value_type entry(key, impl); @@ -6512,7 +6518,7 @@ cmTarget::GetLinkImplementation(const std::string& config, } else if (i->second.Languages.empty()) { - this->ComputeLinkImplementationLanguages(config, i->second, head); + this->ComputeLinkImplementationLanguages(config, i->second, this); } return &i->second; @@ -6520,8 +6526,15 @@ cmTarget::GetLinkImplementation(const std::string& config, //---------------------------------------------------------------------------- cmTarget::LinkImplementation const* -cmTarget::GetLinkImplementationLibraries(const std::string& config, - cmTarget const* head) const +cmTarget::GetLinkImplementationLibraries(const std::string& config) const +{ + return this->GetLinkImplementationLibrariesInternal(config, this); +} + +//---------------------------------------------------------------------------- +cmTarget::LinkImplementation const* +cmTarget::GetLinkImplementationLibrariesInternal(const std::string& config, + cmTarget const* head) const { // There is no link implementation for imported targets. if(this->IsImported()) @@ -6555,7 +6568,7 @@ void cmTarget::ComputeLinkImplementation(const std::string& config, { // Collect libraries directly linked in this configuration. std::vector llibs; - this->GetDirectLinkLibraries(config, llibs, head); + this->GetDirectLinkLibrariesInternal(config, llibs, head); for(std::vector::const_iterator li = llibs.begin(); li != llibs.end(); ++li) { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 8c6955e76..8cf962ff6 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -158,8 +158,7 @@ public: const LinkLibraryVectorType &GetOriginalLinkLibraries() const {return this->OriginalLinkLibraries;} void GetDirectLinkLibraries(const std::string& config, - std::vector &, - cmTarget const* head) const; + std::vector &) const; /** Compute the link type to use for the given configuration. */ LinkLibraryType ComputeLinkType(const std::string& config) const; @@ -291,12 +290,11 @@ public: // Needed only for OLD behavior of CMP0003. std::vector WrongConfigLibraries; }; - LinkImplementation const* GetLinkImplementation(const std::string& config, - cmTarget const* head) const; + LinkImplementation const* + GetLinkImplementation(const std::string& config) const; - LinkImplementation const* GetLinkImplementationLibraries( - const std::string& config, - cmTarget const* head) const; + LinkImplementation const* + GetLinkImplementationLibraries(const std::string& config) const; /** Link information from the transitive closure of the link implementation and the interfaces of its dependencies. */ @@ -750,6 +748,12 @@ private: cmTarget const* head, bool &exists) const; + void GetDirectLinkLibrariesInternal(const std::string& config, + std::vector& libs, + cmTarget const* head) const; + LinkImplementation const* + GetLinkImplementationLibrariesInternal(const std::string& config, + cmTarget const* head) const; void ComputeLinkImplementation(const std::string& config, LinkImplementation& impl, cmTarget const* head) const; From 6f0951af011d28366cf31ff621238f026cb8d895 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 10:36:21 -0400 Subject: [PATCH 14/24] cmTarget: Drop 'head' target from GetImportInfo Move generator expression evaluation for imported library lists out of GetImportInfo and into a new GetImportLinkInterface helper. This avoids duplicating the computation and storage of all imported target info just because some of it is parameterized on the 'head' target. --- Source/cmTarget.cxx | 98 ++++++++++++++++++++++++++++----------------- Source/cmTarget.h | 11 +++-- 2 files changed, 69 insertions(+), 40 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 86cab4e8f..cc647af8d 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -64,11 +64,16 @@ struct cmTarget::OutputInfo //---------------------------------------------------------------------------- struct cmTarget::ImportInfo { + ImportInfo(): NoSOName(false), Multiplicity(0) {} bool NoSOName; + int Multiplicity; std::string Location; std::string SOName; std::string ImportLibrary; - cmTarget::LinkInterface LinkInterface; + std::string Languages; + std::string Libraries; + std::string LibrariesProp; + std::string SharedDeps; }; //---------------------------------------------------------------------------- @@ -121,11 +126,14 @@ public: LinkInterfaceMapType LinkInterfaceMap; bool PolicyWarnedCMP0022; + typedef std::map + ImportLinkInterfaceMapType; + ImportLinkInterfaceMapType ImportLinkInterfaceMap; + typedef std::map OutputInfoMapType; OutputInfoMapType OutputInfoMap; - typedef std::map - ImportInfoMapType; + typedef std::map ImportInfoMapType; ImportInfoMapType ImportInfoMap; typedef std::map CompileInfoMapType; @@ -481,6 +489,7 @@ void cmTarget::ClearLinkMaps() this->LinkImplementationLanguageIsContextDependent = true; this->Internal->LinkImplMap.clear(); this->Internal->LinkInterfaceMap.clear(); + this->Internal->ImportLinkInterfaceMap.clear(); this->Internal->LinkClosureMap.clear(); for (cmTargetLinkInformationMap::const_iterator it = this->LinkInformation.begin(); @@ -3853,7 +3862,7 @@ std::string cmTarget::GetSOName(const std::string& config) const if(this->IsImported()) { // Lookup the imported soname. - if(cmTarget::ImportInfo const* info = this->GetImportInfo(config, this)) + if(cmTarget::ImportInfo const* info = this->GetImportInfo(config)) { if(info->NoSOName) { @@ -3921,7 +3930,7 @@ bool cmTarget::HasMacOSXRpathInstallNameDir(const std::string& config) const else { // Lookup the imported soname. - if(cmTarget::ImportInfo const* info = this->GetImportInfo(config, this)) + if(cmTarget::ImportInfo const* info = this->GetImportInfo(config)) { if(!info->NoSOName && !info->SOName.empty()) { @@ -4007,7 +4016,7 @@ bool cmTarget::IsImportedSharedLibWithoutSOName( { if(this->IsImported() && this->GetType() == cmTarget::SHARED_LIBRARY) { - if(cmTarget::ImportInfo const* info = this->GetImportInfo(config, this)) + if(cmTarget::ImportInfo const* info = this->GetImportInfo(config)) { return info->NoSOName; } @@ -4131,7 +4140,7 @@ std::string cmTarget::ImportedGetFullPath(const std::string& config, bool implib) const { std::string result; - if(cmTarget::ImportInfo const* info = this->GetImportInfo(config, this)) + if(cmTarget::ImportInfo const* info = this->GetImportInfo(config)) { result = implib? info->ImportLibrary : info->Location; } @@ -5670,8 +5679,7 @@ bool cmTarget::IsChrpathUsed(const std::string& config) const //---------------------------------------------------------------------------- cmTarget::ImportInfo const* -cmTarget::GetImportInfo(const std::string& config, - cmTarget const* headTarget) const +cmTarget::GetImportInfo(const std::string& config) const { // There is no imported information for non-imported targets. if(!this->IsImported()) @@ -5690,16 +5698,15 @@ cmTarget::GetImportInfo(const std::string& config, { config_upper = "NOCONFIG"; } - TargetConfigPair key(headTarget, config_upper); typedef cmTargetInternals::ImportInfoMapType ImportInfoMapType; ImportInfoMapType::const_iterator i = - this->Internal->ImportInfoMap.find(key); + this->Internal->ImportInfoMap.find(config_upper); if(i == this->Internal->ImportInfoMap.end()) { ImportInfo info; - this->ComputeImportInfo(config_upper, info, headTarget); - ImportInfoMapType::value_type entry(key, info); + this->ComputeImportInfo(config_upper, info); + ImportInfoMapType::value_type entry(config_upper, info); i = this->Internal->ImportInfoMap.insert(entry).first; } @@ -5851,8 +5858,7 @@ bool cmTarget::GetMappedConfig(std::string const& desired_config, //---------------------------------------------------------------------------- void cmTarget::ComputeImportInfo(std::string const& desired_config, - ImportInfo& info, - cmTarget const* headTarget) const + ImportInfo& info) const { // This method finds information about an imported target from its // properties. The "IMPORTED_" namespace is reserved for properties @@ -5891,8 +5897,8 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config, } if(propertyLibs) { - this->ExpandLinkItems(linkProp, propertyLibs, desired_config, - headTarget, info.LinkInterface.Libraries); + info.LibrariesProp = linkProp; + info.Libraries = propertyLibs; } } if(this->GetType() == INTERFACE_LIBRARY) @@ -5978,13 +5984,12 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config, linkProp += suffix; if(const char* config_libs = this->GetProperty(linkProp)) { - cmSystemTools::ExpandListArgument(config_libs, - info.LinkInterface.SharedDeps); + info.SharedDeps = config_libs; } else if(const char* libs = this->GetProperty("IMPORTED_LINK_DEPENDENT_LIBRARIES")) { - cmSystemTools::ExpandListArgument(libs, info.LinkInterface.SharedDeps); + info.SharedDeps = libs; } } @@ -5995,14 +6000,12 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config, linkProp += suffix; if(const char* config_libs = this->GetProperty(linkProp)) { - cmSystemTools::ExpandListArgument(config_libs, - info.LinkInterface.Languages); + info.Languages = config_libs; } else if(const char* libs = this->GetProperty("IMPORTED_LINK_INTERFACE_LANGUAGES")) { - cmSystemTools::ExpandListArgument(libs, - info.LinkInterface.Languages); + info.Languages = libs; } } @@ -6013,12 +6016,12 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config, linkProp += suffix; if(const char* config_reps = this->GetProperty(linkProp)) { - sscanf(config_reps, "%u", &info.LinkInterface.Multiplicity); + sscanf(config_reps, "%u", &info.Multiplicity); } else if(const char* reps = this->GetProperty("IMPORTED_LINK_INTERFACE_MULTIPLICITY")) { - sscanf(reps, "%u", &info.LinkInterface.Multiplicity); + sscanf(reps, "%u", &info.Multiplicity); } } } @@ -6031,11 +6034,7 @@ cmTarget::LinkInterface const* cmTarget::GetLinkInterface( // Imported targets have their own link interface. if(this->IsImported()) { - if(cmTarget::ImportInfo const* info = this->GetImportInfo(config, head)) - { - return &info->LinkInterface; - } - return 0; + return this->GetImportLinkInterface(config, head); } // Link interfaces are not supported for executables that do not @@ -6084,11 +6083,7 @@ cmTarget::GetLinkInterfaceLibraries(const std::string& config, // Imported targets have their own link interface. if(this->IsImported()) { - if(cmTarget::ImportInfo const* info = this->GetImportInfo(config, head)) - { - return &info->LinkInterface; - } - return 0; + return this->GetImportLinkInterface(config, head); } // Link interfaces are not supported for executables that do not @@ -6121,6 +6116,37 @@ cmTarget::GetLinkInterfaceLibraries(const std::string& config, return i->second.Exists ? &i->second : 0; } +//---------------------------------------------------------------------------- +cmTarget::LinkInterface const* +cmTarget::GetImportLinkInterface(const std::string& config, + cmTarget const* headTarget) const +{ + cmTarget::ImportInfo const* info = this->GetImportInfo(config); + if(!info) + { + return 0; + } + + TargetConfigPair key(headTarget, cmSystemTools::UpperCase(config)); + + cmTargetInternals::ImportLinkInterfaceMapType::iterator i = + this->Internal->ImportLinkInterfaceMap.find(key); + if(i == this->Internal->ImportLinkInterfaceMap.end()) + { + LinkInterface iface; + iface.Multiplicity = info->Multiplicity; + cmSystemTools::ExpandListArgument(info->Languages, iface.Languages); + this->ExpandLinkItems(info->LibrariesProp, info->Libraries, config, + headTarget, iface.Libraries); + cmSystemTools::ExpandListArgument(info->SharedDeps, iface.SharedDeps); + + cmTargetInternals::ImportLinkInterfaceMapType::value_type + entry(key, iface); + i = this->Internal->ImportLinkInterfaceMap.insert(entry).first; + } + return &i->second; +} + //---------------------------------------------------------------------------- void processILibs(const std::string& config, cmTarget const* headTarget, diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 8cf962ff6..07731947c 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -730,10 +730,9 @@ private: // Cache import information from properties for each configuration. struct ImportInfo; - ImportInfo const* GetImportInfo(const std::string& config, - cmTarget const* workingTarget) const; - void ComputeImportInfo(std::string const& desired_config, ImportInfo& info, - cmTarget const* head) const; + ImportInfo const* GetImportInfo(const std::string& config) const; + void ComputeImportInfo(std::string const& desired_config, + ImportInfo& info) const; // Cache target compile paths for each configuration. struct CompileInfo; @@ -743,6 +742,10 @@ private: void CheckPropertyCompatibility(cmComputeLinkInformation *info, const std::string& config) const; + LinkInterface const* + GetImportLinkInterface(const std::string& config, + cmTarget const* head) const; + const char* ComputeLinkInterfaceLibraries(const std::string& config, LinkInterface& iface, cmTarget const* head, From 9f3ed029ce830f0395e102258758a4b3680e5d0f Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 09:55:20 -0400 Subject: [PATCH 15/24] cmTarget: Constify GetTransitivePropertyTargets results Populate a vector of "cmTarget const*" instead of "cmTarget*". --- Source/cmGeneratorExpressionEvaluator.cxx | 11 ++++++----- Source/cmGeneratorTarget.cxx | 10 +++++----- Source/cmTarget.cxx | 4 ++-- Source/cmTarget.h | 4 ++-- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index cefdd6316..3dee601cb 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -799,7 +799,8 @@ static const char* targetPropertyTransitiveWhitelist[] = { #undef TRANSITIVE_PROPERTY_NAME -std::string getLinkedTargetsContent(const std::vector &targets, +std::string getLinkedTargetsContent( + const std::vector &targets, cmTarget const* target, cmTarget const* headTarget, cmGeneratorExpressionContext *context, @@ -810,7 +811,7 @@ std::string getLinkedTargetsContent(const std::vector &targets, std::string sep; std::string depString; - for (std::vector::const_iterator + for (std::vector::const_iterator it = targets.begin(); it != targets.end(); ++it) { @@ -847,12 +848,12 @@ std::string getLinkedTargetsContent(const std::vector &libraries, cmGeneratorExpressionDAGChecker *dagChecker, const std::string &interfacePropertyName) { - std::vector tgts; + std::vector tgts; for (std::vector::const_iterator it = libraries.begin(); it != libraries.end(); ++it) { - if (cmTarget *tgt = context->Makefile->FindTargetToUse(*it)) + if (cmTarget const *tgt = context->Makefile->FindTargetToUse(*it)) { tgts.push_back(tgt); } @@ -1082,7 +1083,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode cmStrCmp(propertyName)) != transEnd) { - std::vector tgts; + std::vector tgts; target->GetTransitivePropertyTargets(context->Config, headTarget, tgts); if (!tgts.empty()) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 381a0ed00..392b37740 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -252,7 +252,7 @@ cmGeneratorTarget::GetSourceDepends(cmSourceFile const* sf) const return 0; } -static void handleSystemIncludesDep(cmMakefile *mf, cmTarget* depTgt, +static void handleSystemIncludesDep(cmMakefile *mf, cmTarget const* depTgt, const std::string& config, cmTarget *headTarget, cmGeneratorExpressionDAGChecker *dagChecker, @@ -474,11 +474,11 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(const std::string& dir, &dagChecker), result); } - std::set uniqueDeps; + std::set uniqueDeps; for(std::vector::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { - cmTarget* tgt = this->Makefile->FindTargetToUse(*li); + cmTarget const* tgt = this->Makefile->FindTargetToUse(*li); if (!tgt) { continue; @@ -489,10 +489,10 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(const std::string& dir, handleSystemIncludesDep(this->Makefile, tgt, config, this->Target, &dagChecker, result, excludeImported); - std::vector deps; + std::vector deps; tgt->GetTransitivePropertyTargets(config, this->Target, deps); - for(std::vector::const_iterator di = deps.begin(); + for(std::vector::const_iterator di = deps.begin(); di != deps.end(); ++di) { if (uniqueDeps.insert(*di).second) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index cc647af8d..96f28af14 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -6197,7 +6197,7 @@ cmTarget::GetLinkImplementationClosure(const std::string& config) const //---------------------------------------------------------------------------- void cmTarget::GetTransitivePropertyTargets(const std::string& config, cmTarget const* headTarget, - std::vector &tgts) const + std::vector &tgts) const { cmTarget::LinkInterface const* iface = this->GetLinkInterfaceLibraries(config, headTarget); @@ -6212,7 +6212,7 @@ void cmTarget::GetTransitivePropertyTargets(const std::string& config, for(std::vector::const_iterator it = iface->Libraries.begin(); it != iface->Libraries.end(); ++it) { - if (cmTarget* tgt = headTarget->GetMakefile() + if (cmTarget const* tgt = headTarget->GetMakefile() ->FindTargetToUse(*it)) { tgts.push_back(tgt); diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 07731947c..fae1bbb70 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -271,8 +271,8 @@ public: LinkInterface const* GetLinkInterfaceLibraries(const std::string& config, cmTarget const* headTarget) const; void GetTransitivePropertyTargets(const std::string& config, - cmTarget const* headTarget, - std::vector &libs) const; + cmTarget const* headTarget, + std::vector &libs) const; std::vector const& GetLinkImplementationClosure(const std::string& config) const; From 47ab3ca64105cdfcc7b57ffe037aa93d8226b945 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 10:09:46 -0400 Subject: [PATCH 16/24] cmTarget: Constify GetLinkImplementationClosure results Populate a vector of "cmTarget const*" instead of "cmTarget*". --- Source/cmTarget.cxx | 20 ++++++++++---------- Source/cmTarget.h | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 96f28af14..4ef481a84 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -177,7 +177,7 @@ public: CachedLinkInterfaceSourcesEntries; mutable std::map > CachedLinkInterfaceCompileFeaturesEntries; - mutable std::map > + mutable std::map > CachedLinkImplementationClosure; mutable std::map CacheLinkInterfaceIncludeDirectoriesDone; @@ -5219,7 +5219,7 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget const* tgt, assert((impliedByUse ^ explicitlySet) || (!impliedByUse && !explicitlySet)); - std::vector const& deps = + std::vector const& deps = tgt->GetLinkImplementationClosure(config); if(deps.empty()) @@ -5245,7 +5245,7 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget const* tgt, report += "\" property not set.\n"; } - for(std::vector::const_iterator li = + for(std::vector::const_iterator li = deps.begin(); li != deps.end(); ++li) { @@ -5435,7 +5435,7 @@ bool isLinkDependentProperty(cmTarget const* tgt, const std::string &p, const std::string& interfaceProperty, const std::string& config) { - std::vector const& deps = + std::vector const& deps = tgt->GetLinkImplementationClosure(config); if(deps.empty()) @@ -5443,8 +5443,7 @@ bool isLinkDependentProperty(cmTarget const* tgt, const std::string &p, return false; } - for(std::vector::const_iterator li = - deps.begin(); + for(std::vector::const_iterator li = deps.begin(); li != deps.end(); ++li) { const char *prop = (*li)->GetProperty(interfaceProperty); @@ -6151,7 +6150,8 @@ cmTarget::GetImportLinkInterface(const std::string& config, void processILibs(const std::string& config, cmTarget const* headTarget, std::string const& name, - std::vector& tgts, std::set& emitted) + std::vector& tgts, + std::set& emitted) { cmTarget* tgt = headTarget->GetMakefile() ->FindTargetToUse(name); @@ -6172,15 +6172,15 @@ void processILibs(const std::string& config, } //---------------------------------------------------------------------------- -std::vector const& +std::vector const& cmTarget::GetLinkImplementationClosure(const std::string& config) const { - std::vector& tgts = + std::vector& tgts = this->Internal->CachedLinkImplementationClosure[config]; if(!this->Internal->CacheLinkImplementationClosureDone[config]) { this->Internal->CacheLinkImplementationClosureDone[config] = true; - std::set emitted; + std::set emitted; cmTarget::LinkImplementation const* impl = this->GetLinkImplementationLibraries(config); diff --git a/Source/cmTarget.h b/Source/cmTarget.h index fae1bbb70..cb6855950 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -273,7 +273,7 @@ public: void GetTransitivePropertyTargets(const std::string& config, cmTarget const* headTarget, std::vector &libs) const; - std::vector const& + std::vector const& GetLinkImplementationClosure(const std::string& config) const; /** The link implementation specifies the direct library From 069d60fe039ae1d797a26786f3cd4c23afc27b07 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 09:45:46 -0400 Subject: [PATCH 17/24] cmTarget: Add method to lookup other targets in a target's scope Move the main implementation of cmComputeLinkDepends::FindTargetToLink into cmTarget. --- Source/cmComputeLinkDepends.cxx | 31 +++---------------------------- Source/cmTarget.cxx | 31 +++++++++++++++++++++++++++++++ Source/cmTarget.h | 2 ++ 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index 1b83ee8fa..1b2d1cb52 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -623,40 +623,15 @@ cmTarget const* cmComputeLinkDepends::FindTargetToLink(int depender_index, const std::string& name) { // Look for a target in the scope of the depender. - cmMakefile* mf = this->Makefile; + cmTarget const* from = this->Target; if(depender_index >= 0) { if(cmTarget const* depender = this->EntryList[depender_index].Target) { - mf = depender->GetMakefile(); + from = depender; } } - cmTarget const* tgt = mf->FindTargetToUse(name); - - // Skip targets that will not really be linked. This is probably a - // name conflict between an external library and an executable - // within the project. - if(tgt && tgt->GetType() == cmTarget::EXECUTABLE && - !tgt->IsExecutableWithExports()) - { - tgt = 0; - } - - if(tgt && tgt->GetType() == cmTarget::OBJECT_LIBRARY) - { - cmOStringStream e; - e << "Target \"" << this->Target->GetName() << "\" links to " - "OBJECT library \"" << tgt->GetName() << "\" but this is not " - "allowed. " - "One may link only to STATIC or SHARED libraries, or to executables " - "with the ENABLE_EXPORTS property set."; - this->CMakeInstance->IssueMessage(cmake::FATAL_ERROR, e.str(), - this->Target->GetBacktrace()); - tgt = 0; - } - - // Return the target found, if any. - return tgt; + return from->FindTargetToLink(name); } //---------------------------------------------------------------------------- diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 4ef481a84..9a6c93cc9 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -6680,6 +6680,37 @@ cmTarget::ComputeLinkImplementationLanguages(const std::string& config, } } +//---------------------------------------------------------------------------- +cmTarget const* cmTarget::FindTargetToLink(std::string const& name) const +{ + cmTarget const* tgt = this->Makefile->FindTargetToUse(name); + + // Skip targets that will not really be linked. This is probably a + // name conflict between an external library and an executable + // within the project. + if(tgt && tgt->GetType() == cmTarget::EXECUTABLE && + !tgt->IsExecutableWithExports()) + { + tgt = 0; + } + + if(tgt && tgt->GetType() == cmTarget::OBJECT_LIBRARY) + { + cmOStringStream e; + e << "Target \"" << this->GetName() << "\" links to " + "OBJECT library \"" << tgt->GetName() << "\" but this is not " + "allowed. " + "One may link only to STATIC or SHARED libraries, or to executables " + "with the ENABLE_EXPORTS property set."; + cmake* cm = this->Makefile->GetCMakeInstance(); + cm->IssueMessage(cmake::FATAL_ERROR, e.str(), this->GetBacktrace()); + tgt = 0; + } + + // Return the target found, if any. + return tgt; +} + //---------------------------------------------------------------------------- std::string cmTarget::CheckCMP0004(std::string const& item) const { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index cb6855950..049d3ea86 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -308,6 +308,8 @@ public: }; LinkClosure const* GetLinkClosure(const std::string& config) const; + cmTarget const* FindTargetToLink(std::string const& name) const; + /** Strip off leading and trailing whitespace from an item named in the link dependencies of this target. */ std::string CheckCMP0004(std::string const& item) const; From a272344228174958a8b2346793d3272eb432dad8 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 10:10:18 -0400 Subject: [PATCH 18/24] Fix scope of transitive target name lookups In cmTarget, cmGeneratorTarget, and cmGeneratorExpressionEvaluator, fix target name lookups to occur in the cmMakefile context of the target that referenced the name, not the current 'head' target. The context matters for imported targets because they are directory-scoped instead of globally unique. We already do this in cmComputeLinkDepends and cmComputeTargetDepends. Extend the InterfaceLibrary test with an example covering this behavior. --- Source/cmGeneratorExpressionEvaluator.cxx | 4 ++-- Source/cmGeneratorTarget.cxx | 2 +- Source/cmTarget.cxx | 23 ++++++++----------- Tests/InterfaceLibrary/CMakeLists.txt | 12 +++++++++- Tests/InterfaceLibrary/definetestexe.cpp | 4 +++- .../InterfaceLibrary/ifacedir/CMakeLists.txt | 8 +++++++ Tests/InterfaceLibrary/ifacedir/sub.cpp | 1 + 7 files changed, 36 insertions(+), 18 deletions(-) create mode 100644 Tests/InterfaceLibrary/ifacedir/CMakeLists.txt create mode 100644 Tests/InterfaceLibrary/ifacedir/sub.cpp diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 3dee601cb..f4918820f 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -828,7 +828,7 @@ std::string getLinkedTargetsContent( sep = ";"; } cmsys::auto_ptr cge = ge.Parse(depString); - std::string linkedTargetsContent = cge->Evaluate(context->Makefile, + std::string linkedTargetsContent = cge->Evaluate(target->GetMakefile(), context->Config, context->Quiet, headTarget, @@ -853,7 +853,7 @@ std::string getLinkedTargetsContent(const std::vector &libraries, it = libraries.begin(); it != libraries.end(); ++it) { - if (cmTarget const *tgt = context->Makefile->FindTargetToUse(*it)) + if (cmTarget const *tgt = target->FindTargetToLink(*it)) { tgts.push_back(tgt); } diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 392b37740..36c5648be 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -478,7 +478,7 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(const std::string& dir, for(std::vector::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { - cmTarget const* tgt = this->Makefile->FindTargetToUse(*li); + cmTarget const* tgt = this->Target->FindTargetToLink(*li); if (!tgt) { continue; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 9a6c93cc9..e4f26d1fe 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3492,9 +3492,9 @@ public: Makefile(target->GetMakefile()), Target(target) { this->Visited.insert(target); } - void Visit(const std::string& name) + void Visit(cmTarget const* from, const std::string& name) { - cmTarget *target = this->Makefile->FindTargetToUse(name); + cmTarget const *target = from->FindTargetToLink(name); if(!target) { @@ -3553,7 +3553,7 @@ public: for(std::vector::const_iterator li = iface->Libraries.begin(); li != iface->Libraries.end(); ++li) { - this->Visit(*li); + this->Visit(target, *li); } } private: @@ -3659,7 +3659,7 @@ void cmTarget::ComputeLinkClosure(const std::string& config, for(std::vector::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { - cll.Visit(*li); + cll.Visit(this, *li); } // Store the transitive closure of languages. @@ -6149,13 +6149,12 @@ cmTarget::GetImportLinkInterface(const std::string& config, //---------------------------------------------------------------------------- void processILibs(const std::string& config, cmTarget const* headTarget, + cmTarget const* curTarget, std::string const& name, std::vector& tgts, std::set& emitted) { - cmTarget* tgt = headTarget->GetMakefile() - ->FindTargetToUse(name); - if (tgt && emitted.insert(tgt).second) + if (cmTarget const* tgt = curTarget->FindTargetToLink(name)) { tgts.push_back(tgt); if(cmTarget::LinkInterface const* iface = @@ -6165,7 +6164,7 @@ void processILibs(const std::string& config, it = iface->Libraries.begin(); it != iface->Libraries.end(); ++it) { - processILibs(config, headTarget, *it, tgts, emitted); + processILibs(config, headTarget, tgt, *it, tgts, emitted); } } } @@ -6188,7 +6187,7 @@ cmTarget::GetLinkImplementationClosure(const std::string& config) const for(std::vector::const_iterator it = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) { - processILibs(config, this, *it, tgts , emitted); + processILibs(config, this, this, *it, tgts , emitted); } } return tgts; @@ -6212,8 +6211,7 @@ void cmTarget::GetTransitivePropertyTargets(const std::string& config, for(std::vector::const_iterator it = iface->Libraries.begin(); it != iface->Libraries.end(); ++it) { - if (cmTarget const* tgt = headTarget->GetMakefile() - ->FindTargetToUse(*it)) + if (cmTarget const* tgt = this->FindTargetToLink(*it)) { tgts.push_back(tgt); } @@ -6245,8 +6243,7 @@ void cmTarget::GetTransitivePropertyTargets(const std::string& config, for(std::vector::const_iterator it = libs.begin(); it != libs.end(); ++it) { - if (cmTarget* tgt = headTarget->GetMakefile() - ->FindTargetToUse(*it)) + if (cmTarget const* tgt = this->FindTargetToLink(*it)) { tgts.push_back(tgt); } diff --git a/Tests/InterfaceLibrary/CMakeLists.txt b/Tests/InterfaceLibrary/CMakeLists.txt index 81b34e6e4..d4f49c21b 100644 --- a/Tests/InterfaceLibrary/CMakeLists.txt +++ b/Tests/InterfaceLibrary/CMakeLists.txt @@ -8,8 +8,18 @@ target_compile_definitions(iface_nodepends INTERFACE IFACE_DEFINE) add_subdirectory(headerdir) +# Add an interface target in a subdirectory that uses an imported interface. +add_subdirectory(ifacedir) + +# Poison an imported interface with the same name as that in the subdir +# to ensure that the transitive lookup occurs in the subdir. +add_library(imp::iface INTERFACE IMPORTED) +set_property(TARGET imp::iface APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SOMEPROP) +set_property(TARGET imp::iface PROPERTY INTERFACE_SOMEPROP OFF) +set_property(TARGET imp::iface PROPERTY INTERFACE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/does_not_exist.cpp) + add_executable(InterfaceLibrary definetestexe.cpp) -target_link_libraries(InterfaceLibrary iface_nodepends headeriface) +target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface) add_subdirectory(libsdir) diff --git a/Tests/InterfaceLibrary/definetestexe.cpp b/Tests/InterfaceLibrary/definetestexe.cpp index e7a10c171..30f292542 100644 --- a/Tests/InterfaceLibrary/definetestexe.cpp +++ b/Tests/InterfaceLibrary/definetestexe.cpp @@ -15,7 +15,9 @@ #error Expected IFACE_HEADER_BUILDDIR #endif +extern int sub(); + int main(int,char**) { - return 0; + return sub(); } diff --git a/Tests/InterfaceLibrary/ifacedir/CMakeLists.txt b/Tests/InterfaceLibrary/ifacedir/CMakeLists.txt new file mode 100644 index 000000000..228715e75 --- /dev/null +++ b/Tests/InterfaceLibrary/ifacedir/CMakeLists.txt @@ -0,0 +1,8 @@ +add_library(imp::iface INTERFACE IMPORTED) +set_property(TARGET imp::iface APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SOMEPROP) +set_property(TARGET imp::iface PROPERTY INTERFACE_SOMEPROP ON) +set_property(TARGET imp::iface PROPERTY INTERFACE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/sub.cpp) + +add_library(subiface INTERFACE) +target_link_libraries(subiface INTERFACE imp::iface) +set_property(TARGET subiface PROPERTY INTERFACE_SOMEPROP ON) diff --git a/Tests/InterfaceLibrary/ifacedir/sub.cpp b/Tests/InterfaceLibrary/ifacedir/sub.cpp new file mode 100644 index 000000000..165a66adb --- /dev/null +++ b/Tests/InterfaceLibrary/ifacedir/sub.cpp @@ -0,0 +1 @@ +int sub() { return 0; } From 4dad5fd20bfa330b3131fd5cafa709d85c1b58ec Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 10:55:33 -0400 Subject: [PATCH 19/24] cmTarget: Add cmLinkItem to refer to a target by name and pointer Many items named in target_link_libraries calls are targets, but not all. Create a cmLinkItem type that acts like std::string so it can name an item but also has a pointer to a cmTarget that is the result of looking up the item name in the referencing target's scope. This will be useful to avoid duplicate lookup operations later. --- Source/cmTarget.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 049d3ea86..97c8bf083 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -43,6 +43,18 @@ class cmTarget; class cmGeneratorTarget; class cmTargetTraceDependencies; +// Basic information about each link item. +class cmLinkItem: public std::string +{ + typedef std::string std_string; +public: + cmLinkItem(): std_string(), Target(0) {} + cmLinkItem(const std_string& n, + cmTarget const* t): std_string(n), Target(t) {} + cmLinkItem(cmLinkItem const& r): std_string(r), Target(r.Target) {} + cmTarget const* Target; +}; + struct cmTargetLinkInformationMap: public std::map { From 097be4139df044c86daadb665ec224ee66e6b3bb Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 10:58:23 -0400 Subject: [PATCH 20/24] cmTarget: Add GetUtilityItems to get target ordering dependencies Add a method like GetUtilities but that provides the target names already looked up and resolved to cmTarget pointers internally. Update call site in cmComputeTargetDepends::AddTargetDepend to use the already-found target instead of looking it up again. --- Source/cmComputeTargetDepends.cxx | 7 +++---- Source/cmTarget.cxx | 21 +++++++++++++++++++++ Source/cmTarget.h | 1 + 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Source/cmComputeTargetDepends.cxx b/Source/cmComputeTargetDepends.cxx index a5df060bc..6196542b6 100644 --- a/Source/cmComputeTargetDepends.cxx +++ b/Source/cmComputeTargetDepends.cxx @@ -421,12 +421,11 @@ void cmComputeTargetDepends::AddTargetDepend(int depender_index, if(dependee->IsImported()) { // Skip imported targets but follow their utility dependencies. - std::set const& utils = dependee->GetUtilities(); - for(std::set::const_iterator i = utils.begin(); + std::set const& utils = dependee->GetUtilityItems(); + for(std::set::const_iterator i = utils.begin(); i != utils.end(); ++i) { - if(cmTarget const* transitive_dependee = - dependee->GetMakefile()->FindTargetToUse(*i)) + if(cmTarget const* transitive_dependee = i->Target) { this->AddTargetDepend(depender_index, transitive_dependee, false); } diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index e4f26d1fe..6e4f65f54 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -95,11 +95,13 @@ public: : Backtrace(NULL) { this->PolicyWarnedCMP0022 = false; + this->UtilityItemsDone = false; } cmTargetInternals(cmTargetInternals const&) : Backtrace(NULL) { this->PolicyWarnedCMP0022 = false; + this->UtilityItemsDone = false; } ~cmTargetInternals(); @@ -151,6 +153,9 @@ public: SourceFilesMapType; SourceFilesMapType SourceFilesMap; + std::set UtilityItems; + bool UtilityItemsDone; + struct TargetPropertyEntry { TargetPropertyEntry(cmsys::auto_ptr cge, const std::string &targetName = std::string()) @@ -470,6 +475,22 @@ cmListFileBacktrace const* cmTarget::GetUtilityBacktrace( return &i->second; } +//---------------------------------------------------------------------------- +std::set const& cmTarget::GetUtilityItems() const +{ + if(!this->Internal->UtilityItemsDone) + { + this->Internal->UtilityItemsDone = true; + for(std::set::const_iterator i = this->Utilities.begin(); + i != this->Utilities.end(); ++i) + { + this->Internal->UtilityItems.insert( + cmLinkItem(*i, this->Makefile->FindTargetToUse(*i))); + } + } + return this->Internal->UtilityItems; +} + //---------------------------------------------------------------------------- void cmTarget::FinishConfigure() { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 97c8bf083..c56fa98d4 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -227,6 +227,7 @@ public: void AddUtility(const std::string& u, cmMakefile *makefile = 0); ///! Get the utilities used by this target std::setconst& GetUtilities() const { return this->Utilities; } + std::setconst& GetUtilityItems() const; cmListFileBacktrace const* GetUtilityBacktrace(const std::string& u) const; /** Finalize the target at the end of the Configure step. */ From edce43514d854a84d2a00c975268f898bd1dda45 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 09:38:04 -0400 Subject: [PATCH 21/24] cmExportFileGenerator: Make SetImportLinkProperty a template Allow the vector of property entries to have any element type that can convert to std::string. --- Source/cmExportFileGenerator.cxx | 8 ++++---- Source/cmExportFileGenerator.h | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index 9f5eee56f..1f39d7af9 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -865,15 +865,16 @@ cmExportFileGenerator } //---------------------------------------------------------------------------- +template void cmExportFileGenerator ::SetImportLinkProperty(std::string const& suffix, cmTarget* target, const std::string& propName, - std::vector const& entries, + std::vector const& entries, ImportPropertyMap& properties, std::vector& missingTargets - ) + ) { // Skip the property if there are no entries. if(entries.empty()) @@ -884,7 +885,7 @@ cmExportFileGenerator // Construct the property value. std::string link_entries; const char* sep = ""; - for(std::vector::const_iterator li = entries.begin(); + for(typename std::vector::const_iterator li = entries.begin(); li != entries.end(); ++li) { // Separate this from the previous entry. @@ -902,7 +903,6 @@ cmExportFileGenerator properties[prop] = link_entries; } - //---------------------------------------------------------------------------- void cmExportFileGenerator::GenerateImportHeaderCode(std::ostream& os, const std::string& config) diff --git a/Source/cmExportFileGenerator.h b/Source/cmExportFileGenerator.h index abd8ad531..919924e0e 100644 --- a/Source/cmExportFileGenerator.h +++ b/Source/cmExportFileGenerator.h @@ -95,9 +95,11 @@ protected: std::string const& suffix, cmTarget* target, ImportPropertyMap& properties, std::vector& missingTargets); + + template void SetImportLinkProperty(std::string const& suffix, cmTarget* target, const std::string& propName, - std::vector const& entries, + std::vector const& entries, ImportPropertyMap& properties, std::vector& missingTargets); From d912220eaaa92f3e8524c33e1684ebbf84eba521 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 11:49:10 -0400 Subject: [PATCH 22/24] cmTarget: Lookup targets in LinkInterface and LinkImplementation Instead of storing just the string names in these structures, lookup any target associated with each item and store its cmTarget pointer. Use the cmLinkItem class to hold the name and pointer together. Update client sites to use the pre-stored lookup result instead of looking up the target name again. Create a cmTarget::LookupLinkItems helper method to handle the lookup. Since lookups are now moving from cmComputeLinkDepends::AddLinkEntries to cmTarget::LookupLinkItems, move use of CheckCMP0004 to the latter. This drops use of CheckCMP0004 from entries added for _LIB_DEPENDS variables by cmComputeLinkDepends::AddVarLinkEntries, but I do not think that use was intentional originally anyway. --- Source/cmComputeLinkDepends.cxx | 46 +++++----- Source/cmComputeLinkDepends.h | 10 +-- Source/cmComputeTargetDepends.cxx | 30 +++---- Source/cmComputeTargetDepends.h | 5 +- Source/cmGeneratorExpressionEvaluator.cxx | 10 +-- Source/cmGeneratorTarget.cxx | 4 +- Source/cmTarget.cxx | 105 +++++++++++++--------- Source/cmTarget.h | 14 +-- 8 files changed, 123 insertions(+), 101 deletions(-) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index 1b2d1cb52..6170e92e9 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -292,8 +292,7 @@ cmComputeLinkDepends::AllocateLinkEntry(std::string const& item) } //---------------------------------------------------------------------------- -int cmComputeLinkDepends::AddLinkEntry(int depender_index, - std::string const& item) +int cmComputeLinkDepends::AddLinkEntry(cmLinkItem const& item) { // Check if the item entry has already been added. std::map::iterator lei = this->LinkEntryIndex.find(item); @@ -310,7 +309,7 @@ int cmComputeLinkDepends::AddLinkEntry(int depender_index, int index = lei->second; LinkEntry& entry = this->EntryList[index]; entry.Item = item; - entry.Target = this->FindTargetToLink(depender_index, entry.Item); + entry.Target = item.Target; entry.IsFlag = (!entry.Target && item[0] == '-' && item[1] != 'l' && item.substr(0, 10) != "-framework"); @@ -370,11 +369,11 @@ void cmComputeLinkDepends::FollowLinkEntry(BFSEntry const& qe) this->FollowSharedDeps(depender_index, iface); // Support for CMP0003. - for(std::vector::const_iterator + for(std::vector::const_iterator oi = iface->WrongConfigLibraries.begin(); oi != iface->WrongConfigLibraries.end(); ++oi) { - this->CheckWrongConfigItem(depender_index, *oi); + this->CheckWrongConfigItem(*oi); } } } @@ -406,9 +405,9 @@ cmComputeLinkDepends void cmComputeLinkDepends ::QueueSharedDependencies(int depender_index, - std::vector const& deps) + std::vector const& deps) { - for(std::vector::const_iterator li = deps.begin(); + for(std::vector::const_iterator li = deps.begin(); li != deps.end(); ++li) { SharedDepEntry qe; @@ -432,8 +431,7 @@ void cmComputeLinkDepends::HandleSharedDependency(SharedDepEntry const& dep) // Initialize the item entry. LinkEntry& entry = this->EntryList[lei->second]; entry.Item = dep.Item; - entry.Target = this->FindTargetToLink(dep.DependerIndex, - dep.Item); + entry.Target = dep.Item.Target; // This item was added specifically because it is a dependent // shared library. It may get special treatment @@ -472,7 +470,7 @@ void cmComputeLinkDepends::AddVarLinkEntries(int depender_index, cmSystemTools::ExpandListArgument(value, deplist); // Look for entries meant for this configuration. - std::vector actual_libs; + std::vector actual_libs; cmTarget::LinkLibraryType llt = cmTarget::GENERAL; bool haveLLT = false; for(std::vector::const_iterator di = deplist.begin(); @@ -520,11 +518,13 @@ void cmComputeLinkDepends::AddVarLinkEntries(int depender_index, // If the library is meant for this link type then use it. if(llt == cmTarget::GENERAL || llt == this->LinkType) { - actual_libs.push_back(*di); + cmLinkItem item(*di, this->FindTargetToLink(depender_index, *di)); + actual_libs.push_back(item); } else if(this->OldLinkDirMode) { - this->CheckWrongConfigItem(depender_index, *di); + cmLinkItem item(*di, this->FindTargetToLink(depender_index, *di)); + this->CheckWrongConfigItem(item); } // Reset the link type until another explicit type is given. @@ -544,36 +544,36 @@ void cmComputeLinkDepends::AddDirectLinkEntries() cmTarget::LinkImplementation const* impl = this->Target->GetLinkImplementation(this->Config); this->AddLinkEntries(-1, impl->Libraries); - for(std::vector::const_iterator + for(std::vector::const_iterator wi = impl->WrongConfigLibraries.begin(); wi != impl->WrongConfigLibraries.end(); ++wi) { - this->CheckWrongConfigItem(-1, *wi); + this->CheckWrongConfigItem(*wi); } } //---------------------------------------------------------------------------- void -cmComputeLinkDepends::AddLinkEntries(int depender_index, - std::vector const& libs) +cmComputeLinkDepends::AddLinkEntries( + int depender_index, std::vector const& libs) { // Track inferred dependency sets implied by this list. std::map dependSets; // Loop over the libraries linked directly by the depender. - for(std::vector::const_iterator li = libs.begin(); + for(std::vector::const_iterator li = libs.begin(); li != libs.end(); ++li) { // Skip entries that will resolve to the target getting linked or // are empty. - std::string item = this->Target->CheckCMP0004(*li); + cmLinkItem const& item = *li; if(item == this->Target->GetName() || item.empty()) { continue; } // Add a link entry for this item. - int dependee_index = this->AddLinkEntry(depender_index, item); + int dependee_index = this->AddLinkEntry(*li); // The dependee must come after the depender. if(depender_index >= 0) @@ -961,8 +961,7 @@ void cmComputeLinkDepends::DisplayFinalEntries() } //---------------------------------------------------------------------------- -void cmComputeLinkDepends::CheckWrongConfigItem(int depender_index, - std::string const& item) +void cmComputeLinkDepends::CheckWrongConfigItem(cmLinkItem const& item) { if(!this->OldLinkDirMode) { @@ -972,9 +971,8 @@ void cmComputeLinkDepends::CheckWrongConfigItem(int depender_index, // For CMake 2.4 bug-compatibility we need to consider the output // directories of targets linked in another configuration as link // directories. - cmTarget const* tgt = this->FindTargetToLink(depender_index, item); - if(tgt && !tgt->IsImported()) + if(item.Target && !item.Target->IsImported()) { - this->OldWrongConfigItems.insert(tgt); + this->OldWrongConfigItems.insert(item.Target); } } diff --git a/Source/cmComputeLinkDepends.h b/Source/cmComputeLinkDepends.h index 440dc0d4f..3207ecbf5 100644 --- a/Source/cmComputeLinkDepends.h +++ b/Source/cmComputeLinkDepends.h @@ -77,11 +77,11 @@ private: std::map::iterator AllocateLinkEntry(std::string const& item); - int AddLinkEntry(int depender_index, std::string const& item); + int AddLinkEntry(cmLinkItem const& item); void AddVarLinkEntries(int depender_index, const char* value); void AddDirectLinkEntries(); void AddLinkEntries(int depender_index, - std::vector const& libs); + std::vector const& libs); cmTarget const* FindTargetToLink(int depender_index, const std::string& name); @@ -103,7 +103,7 @@ private: // of the interface. struct SharedDepEntry { - std::string Item; + cmLinkItem Item; int DependerIndex; }; std::queue SharedDepQueue; @@ -112,7 +112,7 @@ private: cmTarget::LinkInterface const* iface, bool follow_interface = false); void QueueSharedDependencies(int depender_index, - std::vector const& deps); + std::vector const& deps); void HandleSharedDependency(SharedDepEntry const& dep); // Dependency inferral for each link item. @@ -163,7 +163,7 @@ private: // Compatibility help. bool OldLinkDirMode; - void CheckWrongConfigItem(int depender_index, std::string const& item); + void CheckWrongConfigItem(cmLinkItem const& item); std::set OldWrongConfigItems; }; diff --git a/Source/cmComputeTargetDepends.cxx b/Source/cmComputeTargetDepends.cxx index 6196542b6..3929af40d 100644 --- a/Source/cmComputeTargetDepends.cxx +++ b/Source/cmComputeTargetDepends.cxx @@ -249,13 +249,15 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index) const_cast(depender)->AddUtility(objLib); } } - std::vector tlibs; - depender->GetDirectLinkLibraries(*it, tlibs); + + cmTarget::LinkImplementation const* impl = + depender->GetLinkImplementation(*it); // A target should not depend on itself. emitted.insert(depender->GetName()); - for(std::vector::const_iterator lib = tlibs.begin(); - lib != tlibs.end(); ++lib) + for(std::vector::const_iterator + lib = impl->Libraries.begin(); + lib != impl->Libraries.end(); ++lib) { // Don't emit the same library twice for this target. if(emitted.insert(*lib).second) @@ -269,11 +271,11 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index) // Loop over all utility dependencies. { - std::set const& tutils = depender->GetUtilities(); + std::set const& tutils = depender->GetUtilityItems(); std::set emitted; // A target should not depend on itself. emitted.insert(depender->GetName()); - for(std::set::const_iterator util = tutils.begin(); + for(std::set::const_iterator util = tutils.begin(); util != tutils.end(); ++util) { // Don't emit the same utility twice for this target. @@ -295,7 +297,7 @@ void cmComputeTargetDepends::AddInterfaceDepends(int depender_index, if(cmTarget::LinkInterface const* iface = dependee->GetLinkInterface(config, depender)) { - for(std::vector::const_iterator + for(std::vector::const_iterator lib = iface->Libraries.begin(); lib != iface->Libraries.end(); ++lib) { @@ -311,12 +313,11 @@ void cmComputeTargetDepends::AddInterfaceDepends(int depender_index, //---------------------------------------------------------------------------- void cmComputeTargetDepends::AddInterfaceDepends(int depender_index, - const std::string& dependee_name, + cmLinkItem const& dependee_name, std::set &emitted) { cmTarget const* depender = this->Targets[depender_index]; - cmTarget const* dependee = - depender->GetMakefile()->FindTargetToUse(dependee_name); + cmTarget const* dependee = dependee_name.Target; // Skip targets that will not really be linked. This is probably a // name conflict between an external library and an executable // within the project. @@ -344,16 +345,15 @@ void cmComputeTargetDepends::AddInterfaceDepends(int depender_index, } //---------------------------------------------------------------------------- -void cmComputeTargetDepends::AddTargetDepend(int depender_index, - const std::string& dependee_name, - bool linking) +void cmComputeTargetDepends::AddTargetDepend( + int depender_index, cmLinkItem const& dependee_name, + bool linking) { // Get the depender. cmTarget const* depender = this->Targets[depender_index]; // Check the target's makefile first. - cmTarget const* dependee = - depender->GetMakefile()->FindTargetToUse(dependee_name); + cmTarget const* dependee = dependee_name.Target; if(!dependee && !linking && (depender->GetType() != cmTarget::GLOBAL_TARGET)) diff --git a/Source/cmComputeTargetDepends.h b/Source/cmComputeTargetDepends.h index b99199f6f..902f342bf 100644 --- a/Source/cmComputeTargetDepends.h +++ b/Source/cmComputeTargetDepends.h @@ -20,6 +20,7 @@ class cmComputeComponentGraph; class cmGlobalGenerator; +class cmLinkItem; class cmTarget; class cmTargetDependSet; @@ -46,13 +47,13 @@ private: void CollectDepends(); void CollectTargetDepends(int depender_index); void AddTargetDepend(int depender_index, - const std::string& dependee_name, + cmLinkItem const& dependee_name, bool linking); void AddTargetDepend(int depender_index, cmTarget const* dependee, bool linking); bool ComputeFinalDepends(cmComputeComponentGraph const& ccg); void AddInterfaceDepends(int depender_index, - const std::string& dependee_name, + cmLinkItem const& dependee_name, std::set &emitted); void AddInterfaceDepends(int depender_index, cmTarget const* dependee, const std::string& config, diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index f4918820f..c925869b9 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -800,7 +800,7 @@ static const char* targetPropertyTransitiveWhitelist[] = { #undef TRANSITIVE_PROPERTY_NAME std::string getLinkedTargetsContent( - const std::vector &targets, + std::vector &targets, cmTarget const* target, cmTarget const* headTarget, cmGeneratorExpressionContext *context, @@ -841,7 +841,7 @@ std::string getLinkedTargetsContent( return linkedTargetsContent; } -std::string getLinkedTargetsContent(const std::vector &libraries, +std::string getLinkedTargetsContent(std::vector const &libraries, cmTarget const* target, cmTarget const* headTarget, cmGeneratorExpressionContext *context, @@ -849,13 +849,13 @@ std::string getLinkedTargetsContent(const std::vector &libraries, const std::string &interfacePropertyName) { std::vector tgts; - for (std::vector::const_iterator + for (std::vector::const_iterator it = libraries.begin(); it != libraries.end(); ++it) { - if (cmTarget const *tgt = target->FindTargetToLink(*it)) + if (it->Target) { - tgts.push_back(tgt); + tgts.push_back(it->Target); } } return getLinkedTargetsContent(tgts, target, headTarget, context, diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 36c5648be..fd82d1742 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -475,10 +475,10 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(const std::string& dir, } std::set uniqueDeps; - for(std::vector::const_iterator li = impl->Libraries.begin(); + for(std::vector::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { - cmTarget const* tgt = this->Target->FindTargetToLink(*li); + cmTarget const* tgt = li->Target; if (!tgt) { continue; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 6e4f65f54..7a63db414 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2311,7 +2311,7 @@ cmTarget::GetIncludeDirectories(const std::string& config) const if(this->Makefile->IsOn("APPLE")) { LinkImplementation const* impl = this->GetLinkImplementation(config); - for(std::vector::const_iterator + for(std::vector::const_iterator it = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) { @@ -3513,13 +3513,11 @@ public: Makefile(target->GetMakefile()), Target(target) { this->Visited.insert(target); } - void Visit(cmTarget const* from, const std::string& name) + void Visit(cmLinkItem const& item) { - cmTarget const *target = from->FindTargetToLink(name); - - if(!target) + if(!item.Target) { - if(name.find("::") != std::string::npos) + if(item.find("::") != std::string::npos) { bool noMessage = false; cmake::MessageType messageType = cmake::FATAL_ERROR; @@ -3545,7 +3543,7 @@ public: if(!noMessage) { e << "Target \"" << this->Target->GetName() - << "\" links to target \"" << name + << "\" links to target \"" << item << "\" but the target was not found. Perhaps a find_package() " "call is missing for an IMPORTED target, or an ALIAS target is " "missing?"; @@ -3556,13 +3554,13 @@ public: } return; } - if(!this->Visited.insert(target).second) + if(!this->Visited.insert(item.Target).second) { return; } cmTarget::LinkInterface const* iface = - target->GetLinkInterface(this->Config, this->HeadTarget); + item.Target->GetLinkInterface(this->Config, this->HeadTarget); if(!iface) { return; } for(std::vector::const_iterator @@ -3571,10 +3569,10 @@ public: this->Languages.insert(*li); } - for(std::vector::const_iterator + for(std::vector::const_iterator li = iface->Libraries.begin(); li != iface->Libraries.end(); ++li) { - this->Visit(target, *li); + this->Visit(*li); } } private: @@ -3677,10 +3675,10 @@ void cmTarget::ComputeLinkClosure(const std::string& config, // Add interface languages from linked targets. cmTargetCollectLinkLanguages cll(this, config, languages, this); - for(std::vector::const_iterator li = impl->Libraries.begin(); + for(std::vector::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { - cll.Visit(this, *li); + cll.Visit(*li); } // Store the transitive closure of languages. @@ -3731,16 +3729,34 @@ void cmTarget::ExpandLinkItems(std::string const& prop, std::string const& value, std::string const& config, cmTarget const* headTarget, - std::vector& libs) const + std::vector& items) const { cmGeneratorExpression ge; cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), prop, 0, 0); + std::vector libs; cmSystemTools::ExpandListArgument(ge.Parse(value)->Evaluate( this->Makefile, config, false, headTarget, this, &dagChecker), libs); + this->LookupLinkItems(libs, items); +} + +//---------------------------------------------------------------------------- +void cmTarget::LookupLinkItems(std::vector const& names, + std::vector& items) const +{ + for(std::vector::const_iterator i = names.begin(); + i != names.end(); ++i) + { + std::string name = this->CheckCMP0004(*i); + if(name == this->GetName() || name.empty()) + { + continue; + } + items.push_back(cmLinkItem(name, this->FindTargetToLink(name))); + } } //---------------------------------------------------------------------------- @@ -6158,7 +6174,11 @@ cmTarget::GetImportLinkInterface(const std::string& config, cmSystemTools::ExpandListArgument(info->Languages, iface.Languages); this->ExpandLinkItems(info->LibrariesProp, info->Libraries, config, headTarget, iface.Libraries); - cmSystemTools::ExpandListArgument(info->SharedDeps, iface.SharedDeps); + { + std::vector deps; + cmSystemTools::ExpandListArgument(info->SharedDeps, deps); + this->LookupLinkItems(deps, iface.SharedDeps); + } cmTargetInternals::ImportLinkInterfaceMapType::value_type entry(key, iface); @@ -6170,22 +6190,21 @@ cmTarget::GetImportLinkInterface(const std::string& config, //---------------------------------------------------------------------------- void processILibs(const std::string& config, cmTarget const* headTarget, - cmTarget const* curTarget, - std::string const& name, + cmLinkItem const& item, std::vector& tgts, std::set& emitted) { - if (cmTarget const* tgt = curTarget->FindTargetToLink(name)) + if (item.Target && emitted.insert(item.Target).second) { - tgts.push_back(tgt); + tgts.push_back(item.Target); if(cmTarget::LinkInterface const* iface = - tgt->GetLinkInterfaceLibraries(config, headTarget)) + item.Target->GetLinkInterfaceLibraries(config, headTarget)) { - for(std::vector::const_iterator - it = iface->Libraries.begin(); + for(std::vector::const_iterator + it = iface->Libraries.begin(); it != iface->Libraries.end(); ++it) { - processILibs(config, headTarget, tgt, *it, tgts, emitted); + processILibs(config, headTarget, *it, tgts, emitted); } } } @@ -6205,10 +6224,10 @@ cmTarget::GetLinkImplementationClosure(const std::string& config) const cmTarget::LinkImplementation const* impl = this->GetLinkImplementationLibraries(config); - for(std::vector::const_iterator it = impl->Libraries.begin(); + for(std::vector::const_iterator it = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) { - processILibs(config, this, this, *it, tgts , emitted); + processILibs(config, this, *it, tgts , emitted); } } return tgts; @@ -6229,12 +6248,12 @@ void cmTarget::GetTransitivePropertyTargets(const std::string& config, || this->GetPolicyStatusCMP0022() == cmPolicies::WARN || this->GetPolicyStatusCMP0022() == cmPolicies::OLD) { - for(std::vector::const_iterator it = iface->Libraries.begin(); + for(std::vector::const_iterator it = iface->Libraries.begin(); it != iface->Libraries.end(); ++it) { - if (cmTarget const* tgt = this->FindTargetToLink(*it)) + if (it->Target) { - tgts.push_back(tgt); + tgts.push_back(it->Target); } } return; @@ -6378,7 +6397,7 @@ const char* cmTarget::ComputeLinkInterfaceLibraries(const std::string& config, { // Compare the link implementation fallback link interface to the // preferred new link interface property and warn if different. - std::vector ifaceLibs; + std::vector ifaceLibs; std::string newProp = "INTERFACE_LINK_LIBRARIES"; if(const char* newExplicitLibraries = this->GetProperty(newProp)) { @@ -6390,7 +6409,7 @@ const char* cmTarget::ComputeLinkInterfaceLibraries(const std::string& config, std::string oldLibraries; std::string newLibraries; const char *sep = ""; - for(std::vector::const_iterator it + for(std::vector::const_iterator it = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) { oldLibraries += sep; @@ -6398,7 +6417,7 @@ const char* cmTarget::ComputeLinkInterfaceLibraries(const std::string& config, sep = ";"; } sep = ""; - for(std::vector::const_iterator it + for(std::vector::const_iterator it = ifaceLibs.begin(); it != ifaceLibs.end(); ++it) { newLibraries += sep; @@ -6449,7 +6468,7 @@ void cmTargetInternals::ComputeLinkInterface(cmTarget const* thisTarget, // Shared libraries may have runtime implementation dependencies // on other shared libraries that are not in the interface. std::set emitted; - for(std::vector::const_iterator + for(std::vector::const_iterator li = iface.Libraries.begin(); li != iface.Libraries.end(); ++li) { emitted.insert(*li); @@ -6458,15 +6477,15 @@ void cmTargetInternals::ComputeLinkInterface(cmTarget const* thisTarget, { cmTarget::LinkImplementation const* impl = thisTarget->GetLinkImplementation(config); - for(std::vector::const_iterator + for(std::vector::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { if(emitted.insert(*li).second) { - if(cmTarget* tgt = thisTarget->Makefile->FindTargetToUse(*li)) + if(li->Target) { // This is a runtime dependency on another shared library. - if(tgt->GetType() == cmTarget::SHARED_LIBRARY) + if(li->Target->GetType() == cmTarget::SHARED_LIBRARY) { iface.SharedDeps.push_back(*li); } @@ -6617,10 +6636,10 @@ void cmTarget::ComputeLinkImplementation(const std::string& config, li != llibs.end(); ++li) { // Skip entries that resolve to the target itself or are empty. - std::string item = this->CheckCMP0004(*li); - if(item == this->GetName() || item.empty()) + std::string name = this->CheckCMP0004(*li); + if(name == this->GetName() || name.empty()) { - if(item == this->GetName()) + if(name == this->GetName()) { bool noMessage = false; cmake::MessageType messageType = cmake::FATAL_ERROR; @@ -6659,7 +6678,8 @@ void cmTarget::ComputeLinkImplementation(const std::string& config, } // The entry is meant for this configuration. - impl.Libraries.push_back(item); + impl.Libraries.push_back( + cmLinkItem(name, this->FindTargetToLink(name))); } cmTarget::LinkLibraryType linkType = this->ComputeLinkType(config); @@ -6669,13 +6689,14 @@ void cmTarget::ComputeLinkImplementation(const std::string& config, { if(li->second != cmTarget::GENERAL && li->second != linkType) { - std::string item = this->CheckCMP0004(li->first); - if(item == this->GetName() || item.empty()) + std::string name = this->CheckCMP0004(li->first); + if(name == this->GetName() || name.empty()) { continue; } // Support OLD behavior for CMP0003. - impl.WrongConfigLibraries.push_back(item); + impl.WrongConfigLibraries.push_back( + cmLinkItem(name, this->FindTargetToLink(name))); } } } diff --git a/Source/cmTarget.h b/Source/cmTarget.h index c56fa98d4..2e0df4221 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -259,10 +259,10 @@ public: std::vector Languages; // Libraries listed in the interface. - std::vector Libraries; + std::vector Libraries; // Shared library dependencies needed for linking on some platforms. - std::vector SharedDeps; + std::vector SharedDeps; // Number of repetitions of a strongly connected component of two // or more static libraries. @@ -270,7 +270,7 @@ public: // Libraries listed for other configurations. // Needed only for OLD behavior of CMP0003. - std::vector WrongConfigLibraries; + std::vector WrongConfigLibraries; bool ImplementationIsInterface; @@ -297,11 +297,11 @@ public: std::vector Languages; // Libraries linked directly in this configuration. - std::vector Libraries; + std::vector Libraries; // Libraries linked directly in other configurations. // Needed only for OLD behavior of CMP0003. - std::vector WrongConfigLibraries; + std::vector WrongConfigLibraries; }; LinkImplementation const* GetLinkImplementation(const std::string& config) const; @@ -782,7 +782,9 @@ private: void ExpandLinkItems(std::string const& prop, std::string const& value, std::string const& config, cmTarget const* headTarget, - std::vector& libs) const; + std::vector& items) const; + void LookupLinkItems(std::vector const& names, + std::vector& items) const; std::string ProcessSourceItemCMP0049(const std::string& s); From 281eb3d8a6a4983a33d5a8d70a0e21ebb3bd115f Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 14:08:43 -0400 Subject: [PATCH 23/24] cmTarget: Improve HaveBuildTreeRPATH implementation Use GetLinkImplementationLibraries instead of GetDirectLinkLibraries because it tells us whether there will be any libraries to link after evaluating generator expressions. Also GetDirectLinkLibraries will be dropped soon. --- Source/cmTarget.cxx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 7a63db414..f4a0224d8 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -4551,9 +4551,12 @@ bool cmTarget::HaveBuildTreeRPATH(const std::string& config) const { return false; } - std::vector libs; - this->GetDirectLinkLibraries(config, libs); - return !libs.empty(); + if(LinkImplementation const* impl = + this->GetLinkImplementationLibraries(config)) + { + return !impl->Libraries.empty(); + } + return false; } //---------------------------------------------------------------------------- From f5c18c9c1c0434f3481b1684af5fe6e0ea823f87 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 16 Jun 2014 14:12:18 -0400 Subject: [PATCH 24/24] cmTarget: Drop GetDirectLinkLibraries methods Inline the implementation in the last remaining caller and drop the methods. --- Source/cmTarget.cxx | 69 ++++++++++++++++++--------------------------- Source/cmTarget.h | 5 ---- 2 files changed, 27 insertions(+), 47 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index f4a0224d8..71d03df14 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1226,47 +1226,6 @@ bool cmTarget::NameResolvesToFramework(const std::string& libname) const NameResolvesToFramework(libname); } -//---------------------------------------------------------------------------- -void cmTarget::GetDirectLinkLibraries(const std::string& config, - std::vector &libs) const -{ - this->GetDirectLinkLibrariesInternal(config, libs, this); -} - -//---------------------------------------------------------------------------- -void cmTarget::GetDirectLinkLibrariesInternal(const std::string& config, - std::vector &libs, - cmTarget const* head) const -{ - const char *prop = this->GetProperty("LINK_LIBRARIES"); - if (prop) - { - cmGeneratorExpression ge; - const cmsys::auto_ptr cge = ge.Parse(prop); - - cmGeneratorExpressionDAGChecker dagChecker( - this->GetName(), - "LINK_LIBRARIES", 0, 0); - cmSystemTools::ExpandListArgument(cge->Evaluate(this->Makefile, - config, - false, - head, - &dagChecker), - libs); - - std::set const& seenProps = cge->GetSeenTargetProperties(); - for (std::set::const_iterator it = seenProps.begin(); - it != seenProps.end(); ++it) - { - if (!this->GetProperty(*it)) - { - this->LinkImplicitNullProperties.insert(*it); - } - } - cge->GetMaxLanguageStandard(this, this->MaxLanguageStandards); - } -} - //---------------------------------------------------------------------------- std::string cmTarget::GetDebugGeneratorExpressions(const std::string &value, cmTarget::LinkLibraryType llt) const @@ -6634,7 +6593,33 @@ void cmTarget::ComputeLinkImplementation(const std::string& config, { // Collect libraries directly linked in this configuration. std::vector llibs; - this->GetDirectLinkLibrariesInternal(config, llibs, head); + if(const char *prop = this->GetProperty("LINK_LIBRARIES")) + { + cmGeneratorExpression ge; + const cmsys::auto_ptr cge = ge.Parse(prop); + + cmGeneratorExpressionDAGChecker dagChecker( + this->GetName(), + "LINK_LIBRARIES", 0, 0); + cmSystemTools::ExpandListArgument(cge->Evaluate(this->Makefile, + config, + false, + head, + &dagChecker), + llibs); + + std::set const& seenProps = cge->GetSeenTargetProperties(); + for (std::set::const_iterator it = seenProps.begin(); + it != seenProps.end(); ++it) + { + if (!this->GetProperty(*it)) + { + this->LinkImplicitNullProperties.insert(*it); + } + } + cge->GetMaxLanguageStandard(this, this->MaxLanguageStandards); + } + for(std::vector::const_iterator li = llibs.begin(); li != llibs.end(); ++li) { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 2e0df4221..3f534f2db 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -169,8 +169,6 @@ public: return this->LinkLibraries;} const LinkLibraryVectorType &GetOriginalLinkLibraries() const {return this->OriginalLinkLibraries;} - void GetDirectLinkLibraries(const std::string& config, - std::vector &) const; /** Compute the link type to use for the given configuration. */ LinkLibraryType ComputeLinkType(const std::string& config) const; @@ -766,9 +764,6 @@ private: cmTarget const* head, bool &exists) const; - void GetDirectLinkLibrariesInternal(const std::string& config, - std::vector& libs, - cmTarget const* head) const; LinkImplementation const* GetLinkImplementationLibrariesInternal(const std::string& config, cmTarget const* head) const;