|
|
@@ -1507,20 +1507,22 @@ void cmGeneratorTarget::GetAutoUicOptions(std::vector<std::string> &result,
|
|
|
void processILibs(const std::string& config,
|
|
|
cmTarget const* headTarget,
|
|
|
cmLinkItem const& item,
|
|
|
+ cmGlobalGenerator* gg,
|
|
|
std::vector<cmTarget const*>& tgts,
|
|
|
std::set<cmTarget const*>& emitted)
|
|
|
{
|
|
|
if (item.Target && emitted.insert(item.Target).second)
|
|
|
{
|
|
|
tgts.push_back(item.Target);
|
|
|
+ cmGeneratorTarget* gt = gg->GetGeneratorTarget(item.Target);
|
|
|
if(cmLinkInterfaceLibraries const* iface =
|
|
|
- item.Target->GetLinkInterfaceLibraries(config, headTarget, true))
|
|
|
+ gt->GetLinkInterfaceLibraries(config, headTarget, true))
|
|
|
{
|
|
|
for(std::vector<cmLinkItem>::const_iterator
|
|
|
it = iface->Libraries.begin();
|
|
|
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.end(); ++it)
|
|
|
{
|
|
|
- processILibs(config, this->Target, *it, tgts , emitted);
|
|
|
+ processILibs(config, this->Target, *it,
|
|
|
+ this->LocalGenerator->GetGlobalGenerator(),
|
|
|
+ tgts , emitted);
|
|
|
}
|
|
|
}
|
|
|
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;
|
|
|
+}
|