|
|
@@ -5202,7 +5202,9 @@ cmTarget::LinkInterface const* cmTarget::GetLinkInterface(const char* config,
|
|
|
{
|
|
|
// Compute the link interface for this configuration.
|
|
|
cmTargetInternals::OptionalLinkInterface iface;
|
|
|
- iface.Exists = this->ComputeLinkInterface(config, iface, head);
|
|
|
+ const char* explicitLibraries =
|
|
|
+ this->ComputeLinkInterfaceLibraries(config, iface, head, iface.Exists);
|
|
|
+ this->ComputeLinkInterface(config, iface, head, explicitLibraries);
|
|
|
|
|
|
// Store the information for this configuration.
|
|
|
cmTargetInternals::LinkInterfaceMapType::value_type entry(key, iface);
|
|
|
@@ -5273,8 +5275,10 @@ void cmTarget::GetTransitivePropertyTargets(const char* config,
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
-bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface,
|
|
|
- cmTarget const* headTarget) const
|
|
|
+const char* cmTarget::ComputeLinkInterfaceLibraries(const char* config,
|
|
|
+ LinkInterface& iface,
|
|
|
+ cmTarget const* headTarget,
|
|
|
+ bool &exists) const
|
|
|
{
|
|
|
// Construct the property name suffix for this configuration.
|
|
|
std::string suffix = "_";
|
|
|
@@ -5350,8 +5354,10 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface,
|
|
|
(this->GetType() == cmTarget::EXECUTABLE ||
|
|
|
(this->GetType() == cmTarget::MODULE_LIBRARY)))
|
|
|
{
|
|
|
- return false;
|
|
|
+ exists = false;
|
|
|
+ return 0;
|
|
|
}
|
|
|
+ exists = true;
|
|
|
|
|
|
if(explicitLibraries)
|
|
|
{
|
|
|
@@ -5378,70 +5384,6 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface,
|
|
|
LinkImplementation const* impl = this->GetLinkImplementation(config,
|
|
|
headTarget);
|
|
|
iface.Libraries = impl->Libraries;
|
|
|
- }
|
|
|
-
|
|
|
- if(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.
|
|
|
- std::set<cmStdString> emitted;
|
|
|
- for(std::vector<std::string>::const_iterator
|
|
|
- li = iface.Libraries.begin(); li != iface.Libraries.end(); ++li)
|
|
|
- {
|
|
|
- emitted.insert(*li);
|
|
|
- }
|
|
|
- if (this->GetType() != cmTarget::INTERFACE_LIBRARY)
|
|
|
- {
|
|
|
- LinkImplementation const* impl = this->GetLinkImplementation(config,
|
|
|
- headTarget);
|
|
|
- for(std::vector<std::string>::const_iterator
|
|
|
- li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li)
|
|
|
- {
|
|
|
- if(emitted.insert(*li).second)
|
|
|
- {
|
|
|
- if(cmTarget* tgt = this->Makefile->FindTargetToUse(*li))
|
|
|
- {
|
|
|
- // This is a runtime dependency on another shared library.
|
|
|
- if(tgt->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.
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if(this->LinkLanguagePropagatesToDependents())
|
|
|
- {
|
|
|
- // Targets using this archive need its language runtime libraries.
|
|
|
- iface.Languages = impl->Languages;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if (this->PolicyStatusCMP0022 == cmPolicies::WARN
|
|
|
- || this->PolicyStatusCMP0022 == cmPolicies::OLD)
|
|
|
- {
|
|
|
- // The link implementation is the default link interface.
|
|
|
- LinkImplementation const* impl = this->GetLinkImplementation(config,
|
|
|
- headTarget);
|
|
|
- iface.ImplementationIsInterface = true;
|
|
|
- iface.WrongConfigLibraries = impl->WrongConfigLibraries;
|
|
|
- if(this->LinkLanguagePropagatesToDependents())
|
|
|
- {
|
|
|
- // Targets using this archive need its language runtime libraries.
|
|
|
- iface.Languages = impl->Languages;
|
|
|
- }
|
|
|
-
|
|
|
if(this->PolicyStatusCMP0022 == cmPolicies::WARN &&
|
|
|
!this->Internal->PolicyWarnedCMP0022)
|
|
|
{
|
|
|
@@ -5506,9 +5448,90 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ return explicitLibraries;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+void cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface,
|
|
|
+ cmTarget const* headTarget,
|
|
|
+ const char* explicitLibraries) const
|
|
|
+{
|
|
|
+ if(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.
|
|
|
+ std::set<cmStdString> emitted;
|
|
|
+ for(std::vector<std::string>::const_iterator
|
|
|
+ li = iface.Libraries.begin(); li != iface.Libraries.end(); ++li)
|
|
|
+ {
|
|
|
+ emitted.insert(*li);
|
|
|
+ }
|
|
|
+ if (this->GetType() != cmTarget::INTERFACE_LIBRARY)
|
|
|
+ {
|
|
|
+ LinkImplementation const* impl = this->GetLinkImplementation(config,
|
|
|
+ headTarget);
|
|
|
+ for(std::vector<std::string>::const_iterator
|
|
|
+ li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li)
|
|
|
+ {
|
|
|
+ if(emitted.insert(*li).second)
|
|
|
+ {
|
|
|
+ if(cmTarget* tgt = this->Makefile->FindTargetToUse(*li))
|
|
|
+ {
|
|
|
+ // This is a runtime dependency on another shared library.
|
|
|
+ if(tgt->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.
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(this->LinkLanguagePropagatesToDependents())
|
|
|
+ {
|
|
|
+ // Targets using this archive need its language runtime libraries.
|
|
|
+ iface.Languages = impl->Languages;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (this->PolicyStatusCMP0022 == cmPolicies::WARN
|
|
|
+ || this->PolicyStatusCMP0022 == cmPolicies::OLD)
|
|
|
+ {
|
|
|
+ // The link implementation is the default link interface.
|
|
|
+ LinkImplementation const* impl = this->GetLinkImplementation(config,
|
|
|
+ headTarget);
|
|
|
+ iface.ImplementationIsInterface = true;
|
|
|
+ iface.WrongConfigLibraries = impl->WrongConfigLibraries;
|
|
|
+ if(this->LinkLanguagePropagatesToDependents())
|
|
|
+ {
|
|
|
+ // Targets using this archive need its language runtime libraries.
|
|
|
+ iface.Languages = impl->Languages;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if(this->GetType() == cmTarget::STATIC_LIBRARY)
|
|
|
{
|
|
|
+ // Construct the property name suffix for this configuration.
|
|
|
+ std::string suffix = "_";
|
|
|
+ if(config && *config)
|
|
|
+ {
|
|
|
+ suffix += cmSystemTools::UpperCase(config);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ suffix += "NOCONFIG";
|
|
|
+ }
|
|
|
+
|
|
|
// How many repetitions are needed if this library has cyclic
|
|
|
// dependencies?
|
|
|
std::string propName = "LINK_INTERFACE_MULTIPLICITY";
|
|
|
@@ -5523,8 +5546,6 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface,
|
|
|
sscanf(reps, "%u", &iface.Multiplicity);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- return true;
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|