cmGeneratorTarget: Move ComputeLinkInterface from cmTarget.
This commit is contained in:
parent
6220241fd0
commit
84b847e42f
@ -3399,9 +3399,107 @@ cmGeneratorTarget::GetLinkInterface(const std::string& config,
|
|||||||
iface.AllDone = true;
|
iface.AllDone = true;
|
||||||
if(iface.Exists)
|
if(iface.Exists)
|
||||||
{
|
{
|
||||||
this->Target->ComputeLinkInterface(config, iface, head);
|
this->ComputeLinkInterface(config, iface, head);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return iface.Exists? &iface : 0;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -108,6 +108,9 @@ public:
|
|||||||
|
|
||||||
cmLinkInterface const* GetLinkInterface(const std::string& config,
|
cmLinkInterface const* GetLinkInterface(const std::string& config,
|
||||||
cmTarget const* headTarget) const;
|
cmTarget const* headTarget) const;
|
||||||
|
void ComputeLinkInterface(const std::string& config,
|
||||||
|
cmOptionalLinkInterface& iface,
|
||||||
|
cmTarget const* head) 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. */
|
||||||
|
@ -4358,103 +4358,6 @@ cmTarget::ComputeLinkInterfaceLibraries(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
void cmTarget::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->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->GetPolicyStatusCMP0022() == cmPolicies::WARN
|
|
||||||
|| this->GetPolicyStatusCMP0022() == cmPolicies::OLD)
|
|
||||||
{
|
|
||||||
// The link implementation is the default link interface.
|
|
||||||
cmLinkImplementationLibraries const*
|
|
||||||
impl = this->GetLinkImplementationLibrariesInternal(config,
|
|
||||||
headTarget);
|
|
||||||
iface.ImplementationIsInterface = true;
|
|
||||||
iface.WrongConfigLibraries = impl->WrongConfigLibraries;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this->LinkLanguagePropagatesToDependents())
|
|
||||||
{
|
|
||||||
// Targets using this archive need its language runtime libraries.
|
|
||||||
if(cmTarget::LinkImplementation const* impl =
|
|
||||||
this->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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void cmTargetInternals::AddInterfaceEntries(
|
void cmTargetInternals::AddInterfaceEntries(
|
||||||
|
@ -233,9 +233,6 @@ public:
|
|||||||
|
|
||||||
void GetObjectLibrariesCMP0026(std::vector<cmTarget*>& objlibs) const;
|
void GetObjectLibrariesCMP0026(std::vector<cmTarget*>& objlibs) const;
|
||||||
|
|
||||||
void ComputeLinkInterface(const std::string& config,
|
|
||||||
cmOptionalLinkInterface& iface,
|
|
||||||
cmTarget const* head) const;
|
|
||||||
void ComputeLinkInterfaceLibraries(const std::string& config,
|
void ComputeLinkInterfaceLibraries(const std::string& config,
|
||||||
cmOptionalLinkInterface &iface,
|
cmOptionalLinkInterface &iface,
|
||||||
cmTarget const* head,
|
cmTarget const* head,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user