cmGeneratorTarget: Move GetLinkInterfaceLibraries from cmTarget.

This commit is contained in:
Stephen Kelly 2015-08-26 19:38:37 +02:00
parent 84b847e42f
commit 0db9d92787
5 changed files with 59 additions and 53 deletions

View File

@ -1109,7 +1109,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
if(isInterfaceProperty) if(isInterfaceProperty)
{ {
if(cmLinkInterfaceLibraries const* iface = if(cmLinkInterfaceLibraries const* iface =
target->GetLinkInterfaceLibraries(context->Config, headTarget, true)) gtgt->GetLinkInterfaceLibraries(context->Config, headTarget, true))
{ {
linkedTargetsContent = linkedTargetsContent =
getLinkedTargetsContent(iface->Libraries, target, getLinkedTargetsContent(iface->Libraries, target,

View File

@ -1507,20 +1507,22 @@ void cmGeneratorTarget::GetAutoUicOptions(std::vector<std::string> &result,
void processILibs(const std::string& config, void processILibs(const std::string& config,
cmTarget const* headTarget, cmTarget const* headTarget,
cmLinkItem const& item, cmLinkItem const& item,
cmGlobalGenerator* gg,
std::vector<cmTarget const*>& tgts, std::vector<cmTarget const*>& tgts,
std::set<cmTarget const*>& emitted) std::set<cmTarget const*>& emitted)
{ {
if (item.Target && emitted.insert(item.Target).second) if (item.Target && emitted.insert(item.Target).second)
{ {
tgts.push_back(item.Target); tgts.push_back(item.Target);
cmGeneratorTarget* gt = gg->GetGeneratorTarget(item.Target);
if(cmLinkInterfaceLibraries const* iface = if(cmLinkInterfaceLibraries const* iface =
item.Target->GetLinkInterfaceLibraries(config, headTarget, true)) gt->GetLinkInterfaceLibraries(config, headTarget, true))
{ {
for(std::vector<cmLinkItem>::const_iterator for(std::vector<cmLinkItem>::const_iterator
it = iface->Libraries.begin(); it = iface->Libraries.begin();
it != iface->Libraries.end(); ++it) it != iface->Libraries.end(); ++it)
{ {
processILibs(config, headTarget, *it, tgts, emitted); processILibs(config, headTarget, *it, gg, tgts, emitted);
} }
} }
} }
@ -1545,7 +1547,9 @@ cmGeneratorTarget::GetLinkImplementationClosure(
it = impl->Libraries.begin(); it = impl->Libraries.begin();
it != impl->Libraries.end(); ++it) it != impl->Libraries.end(); ++it)
{ {
processILibs(config, this->Target, *it, tgts , emitted); processILibs(config, this->Target, *it,
this->LocalGenerator->GetGlobalGenerator(),
tgts , emitted);
} }
} }
return tgts; return tgts;
@ -3503,3 +3507,49 @@ void cmGeneratorTarget::ComputeLinkInterface(const std::string& config,
} }
} }
} }
//----------------------------------------------------------------------------
const cmLinkInterfaceLibraries *
cmGeneratorTarget::GetLinkInterfaceLibraries(const std::string& config,
cmTarget const* head,
bool usage_requirements_only) const
{
// Imported targets have their own link interface.
if(this->IsImported())
{
return this->Target->GetImportLinkInterface(config, head,
usage_requirements_only);
}
// Link interfaces are not supported for executables that do not
// export symbols.
if(this->GetType() == cmTarget::EXECUTABLE &&
!this->Target->IsExecutableWithExports())
{
return 0;
}
// Lookup any existing link interface for this configuration.
std::string CONFIG = cmSystemTools::UpperCase(config);
cmHeadToLinkInterfaceMap& hm =
(usage_requirements_only ?
this->Target->GetHeadToLinkInterfaceUsageRequirementsMap(config) :
this->Target->GetHeadToLinkInterfaceMap(config));
// If the link interface does not depend on the head target
// then return the one we computed first.
if(!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition)
{
return &hm.begin()->second;
}
cmOptionalLinkInterface& iface = hm[head];
if(!iface.LibrariesDone)
{
iface.LibrariesDone = true;
this->Target->ComputeLinkInterfaceLibraries(
config, iface, head, usage_requirements_only);
}
return iface.Exists? &iface : 0;
}

View File

@ -112,6 +112,11 @@ public:
cmOptionalLinkInterface& iface, cmOptionalLinkInterface& iface,
cmTarget const* head) const; cmTarget const* head) const;
cmLinkInterfaceLibraries const*
GetLinkInterfaceLibraries(const std::string& config,
cmTarget const* headTarget,
bool usage_requirements_only) const;
/** Get the full path to the target according to the settings in its /** Get the full path to the target according to the settings in its
makefile and the configuration type. */ makefile and the configuration type. */
std::string GetFullPath(const std::string& config="", bool implib = false, std::string GetFullPath(const std::string& config="", bool implib = false,

View File

@ -4107,50 +4107,6 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config,
} }
} }
//----------------------------------------------------------------------------
const cmLinkInterfaceLibraries *
cmTarget::GetLinkInterfaceLibraries(const std::string& config,
cmTarget const* head,
bool usage_requirements_only) const
{
// Imported targets have their own link interface.
if(this->IsImported())
{
return this->GetImportLinkInterface(config, head, usage_requirements_only);
}
// Link interfaces are not supported for executables that do not
// export symbols.
if(this->GetType() == cmTarget::EXECUTABLE &&
!this->IsExecutableWithExports())
{
return 0;
}
// Lookup any existing link interface for this configuration.
cmHeadToLinkInterfaceMap& hm =
(usage_requirements_only ?
this->GetHeadToLinkInterfaceUsageRequirementsMap(config) :
this->GetHeadToLinkInterfaceMap(config));
// If the link interface does not depend on the head target
// then return the one we computed first.
if(!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition)
{
return &hm.begin()->second;
}
cmOptionalLinkInterface& iface = hm[head];
if(!iface.LibrariesDone)
{
iface.LibrariesDone = true;
this->ComputeLinkInterfaceLibraries(
config, iface, head, usage_requirements_only);
}
return iface.Exists? &iface : 0;
}
cmHeadToLinkInterfaceMap& cmHeadToLinkInterfaceMap&
cmTarget::GetHeadToLinkInterfaceMap(const std::string &config) const cmTarget::GetHeadToLinkInterfaceMap(const std::string &config) const
{ {

View File

@ -238,11 +238,6 @@ public:
cmTarget const* head, cmTarget const* head,
bool usage_requirements_only) const; bool usage_requirements_only) const;
cmLinkInterfaceLibraries const*
GetLinkInterfaceLibraries(const std::string& config,
cmTarget const* headTarget,
bool usage_requirements_only) const;
cmHeadToLinkInterfaceMap& cmHeadToLinkInterfaceMap&
GetHeadToLinkInterfaceMap(std::string const& config) const; GetHeadToLinkInterfaceMap(std::string const& config) const;
cmHeadToLinkInterfaceMap& GetHeadToLinkInterfaceUsageRequirementsMap( cmHeadToLinkInterfaceMap& GetHeadToLinkInterfaceUsageRequirementsMap(