|
|
@@ -3399,9 +3399,107 @@ cmGeneratorTarget::GetLinkInterface(const std::string& config,
|
|
|
iface.AllDone = true;
|
|
|
if(iface.Exists)
|
|
|
{
|
|
|
- this->Target->ComputeLinkInterface(config, iface, head);
|
|
|
+ this->ComputeLinkInterface(config, iface, head);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return iface.Exists? &iface : 0;
|
|
|
}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+void cmGeneratorTarget::ComputeLinkInterface(const std::string& config,
|
|
|
+ cmOptionalLinkInterface &iface,
|
|
|
+ cmTarget const* headTarget) const
|
|
|
+{
|
|
|
+ if(iface.ExplicitLibraries)
|
|
|
+ {
|
|
|
+ if(this->GetType() == cmTarget::SHARED_LIBRARY
|
|
|
+ || this->GetType() == cmTarget::STATIC_LIBRARY
|
|
|
+ || this->GetType() == cmTarget::INTERFACE_LIBRARY)
|
|
|
+ {
|
|
|
+ // Shared libraries may have runtime implementation dependencies
|
|
|
+ // on other shared libraries that are not in the interface.
|
|
|
+ UNORDERED_SET<std::string> emitted;
|
|
|
+ for(std::vector<cmLinkItem>::const_iterator
|
|
|
+ li = iface.Libraries.begin(); li != iface.Libraries.end(); ++li)
|
|
|
+ {
|
|
|
+ emitted.insert(*li);
|
|
|
+ }
|
|
|
+ if (this->GetType() != cmTarget::INTERFACE_LIBRARY)
|
|
|
+ {
|
|
|
+ cmTarget::LinkImplementation const* impl =
|
|
|
+ this->Target->GetLinkImplementation(config);
|
|
|
+ for(std::vector<cmLinkImplItem>::const_iterator
|
|
|
+ li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li)
|
|
|
+ {
|
|
|
+ if(emitted.insert(*li).second)
|
|
|
+ {
|
|
|
+ if(li->Target)
|
|
|
+ {
|
|
|
+ // This is a runtime dependency on another shared library.
|
|
|
+ if(li->Target->GetType() == cmTarget::SHARED_LIBRARY)
|
|
|
+ {
|
|
|
+ iface.SharedDeps.push_back(*li);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // TODO: Recognize shared library file names. Perhaps this
|
|
|
+ // should be moved to cmComputeLinkInformation, but that creates
|
|
|
+ // a chicken-and-egg problem since this list is needed for its
|
|
|
+ // construction.
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (this->Target->GetPolicyStatusCMP0022() == cmPolicies::WARN
|
|
|
+ || this->Target->GetPolicyStatusCMP0022() == cmPolicies::OLD)
|
|
|
+ {
|
|
|
+ // The link implementation is the default link interface.
|
|
|
+ cmLinkImplementationLibraries const*
|
|
|
+ impl = this->Target->GetLinkImplementationLibrariesInternal(config,
|
|
|
+ headTarget);
|
|
|
+ iface.ImplementationIsInterface = true;
|
|
|
+ iface.WrongConfigLibraries = impl->WrongConfigLibraries;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(this->Target->LinkLanguagePropagatesToDependents())
|
|
|
+ {
|
|
|
+ // Targets using this archive need its language runtime libraries.
|
|
|
+ if(cmTarget::LinkImplementation const* impl =
|
|
|
+ this->Target->GetLinkImplementation(config))
|
|
|
+ {
|
|
|
+ iface.Languages = impl->Languages;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(this->GetType() == cmTarget::STATIC_LIBRARY)
|
|
|
+ {
|
|
|
+ // Construct the property name suffix for this configuration.
|
|
|
+ std::string suffix = "_";
|
|
|
+ if(!config.empty())
|
|
|
+ {
|
|
|
+ suffix += cmSystemTools::UpperCase(config);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ suffix += "NOCONFIG";
|
|
|
+ }
|
|
|
+
|
|
|
+ // How many repetitions are needed if this library has cyclic
|
|
|
+ // dependencies?
|
|
|
+ std::string propName = "LINK_INTERFACE_MULTIPLICITY";
|
|
|
+ propName += suffix;
|
|
|
+ if(const char* config_reps = this->GetProperty(propName))
|
|
|
+ {
|
|
|
+ sscanf(config_reps, "%u", &iface.Multiplicity);
|
|
|
+ }
|
|
|
+ else if(const char* reps =
|
|
|
+ this->GetProperty("LINK_INTERFACE_MULTIPLICITY"))
|
|
|
+ {
|
|
|
+ sscanf(reps, "%u", &iface.Multiplicity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|