summaryrefslogtreecommitdiffstats
path: root/Source/cmTarget.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2014-06-16 15:49:10 (GMT)
committerBrad King <brad.king@kitware.com>2014-06-23 13:22:07 (GMT)
commitd912220eaaa92f3e8524c33e1684ebbf84eba521 (patch)
tree51af981b604913add31a561a4dd3ac643ba0c832 /Source/cmTarget.cxx
parentedce43514d854a84d2a00c975268f898bd1dda45 (diff)
downloadCMake-d912220eaaa92f3e8524c33e1684ebbf84eba521.zip
CMake-d912220eaaa92f3e8524c33e1684ebbf84eba521.tar.gz
CMake-d912220eaaa92f3e8524c33e1684ebbf84eba521.tar.bz2
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.
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r--Source/cmTarget.cxx105
1 files changed, 63 insertions, 42 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 6e4f65f..7a63db4 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<std::string>::const_iterator
+ for(std::vector<cmLinkItem>::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<std::string>::const_iterator
@@ -3571,10 +3569,10 @@ public:
this->Languages.insert(*li);
}
- for(std::vector<std::string>::const_iterator
+ for(std::vector<cmLinkItem>::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<std::string>::const_iterator li = impl->Libraries.begin();
+ for(std::vector<cmLinkItem>::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<std::string>& libs) const
+ std::vector<cmLinkItem>& items) const
{
cmGeneratorExpression ge;
cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), prop, 0, 0);
+ std::vector<std::string> libs;
cmSystemTools::ExpandListArgument(ge.Parse(value)->Evaluate(
this->Makefile,
config,
false,
headTarget,
this, &dagChecker), libs);
+ this->LookupLinkItems(libs, items);
+}
+
+//----------------------------------------------------------------------------
+void cmTarget::LookupLinkItems(std::vector<std::string> const& names,
+ std::vector<cmLinkItem>& items) const
+{
+ for(std::vector<std::string>::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<std::string> 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<cmTarget const*>& tgts,
std::set<cmTarget const*>& 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<std::string>::const_iterator
- it = iface->Libraries.begin();
+ for(std::vector<cmLinkItem>::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<std::string>::const_iterator it = impl->Libraries.begin();
+ for(std::vector<cmLinkItem>::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<std::string>::const_iterator it = iface->Libraries.begin();
+ for(std::vector<cmLinkItem>::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<std::string> ifaceLibs;
+ std::vector<cmLinkItem> 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<std::string>::const_iterator it
+ for(std::vector<cmLinkItem>::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<std::string>::const_iterator it
+ for(std::vector<cmLinkItem>::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<std::string> emitted;
- for(std::vector<std::string>::const_iterator
+ for(std::vector<cmLinkItem>::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<std::string>::const_iterator
+ for(std::vector<cmLinkItem>::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)));
}
}
}