diff options
author | Brad King <brad.king@kitware.com> | 2014-06-16 14:10:18 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2014-06-23 13:17:07 (GMT) |
commit | a272344228174958a8b2346793d3272eb432dad8 (patch) | |
tree | f780c36052e86269948024d64f3d368a3570ad2d /Source/cmTarget.cxx | |
parent | 069d60fe039ae1d797a26786f3cd4c23afc27b07 (diff) | |
download | CMake-a272344228174958a8b2346793d3272eb432dad8.zip CMake-a272344228174958a8b2346793d3272eb432dad8.tar.gz CMake-a272344228174958a8b2346793d3272eb432dad8.tar.bz2 |
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.
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r-- | Source/cmTarget.cxx | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 9a6c93c..e4f26d1 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<std::string>::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<std::string>::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<cmTarget const*>& tgts, std::set<cmTarget const*>& 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<std::string>::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<std::string>::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<std::string>::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); } |