diff options
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r-- | Source/cmTarget.cxx | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 4885b07..8b4ac6f 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -335,6 +335,18 @@ void cmTarget::DefineProperties(cmake *cm) "for the named configuration."); cm->DefineProperty + ("IMPORTED_LINK_INTERFACE_MULTIPLICITY", cmProperty::TARGET, + "Repetition count for cycles of IMPORTED static libraries.", + "This is LINK_INTERFACE_MULTIPLICITY for IMPORTED targets."); + cm->DefineProperty + ("IMPORTED_LINK_INTERFACE_MULTIPLICITY_<CONFIG>", cmProperty::TARGET, + "Per-configuration repetition count for cycles of IMPORTED archives.", + "This is the configuration-specific version of " + "IMPORTED_LINK_INTERFACE_MULTIPLICITY. " + "If set, this property completely overrides the generic property " + "for the named configuration."); + + cm->DefineProperty ("IMPORTED_LOCATION", cmProperty::TARGET, "Full path to the main file on disk for an IMPORTED target.", "Specifies the location of an IMPORTED target file on disk. " @@ -508,6 +520,25 @@ void cmTarget::DefineProperties(cmake *cm) "for the named configuration."); cm->DefineProperty + ("LINK_INTERFACE_MULTIPLICITY", cmProperty::TARGET, + "Repetition count for STATIC libraries with cyclic dependencies.", + "When linking to a STATIC library target with cyclic dependencies the " + "linker may need to scan more than once through the archives in the " + "strongly connected component of the dependency graph. " + "CMake by default constructs the link line so that the linker will " + "scan through the component at least twice. " + "This property specifies the minimum number of scans if it is larger " + "than the default. " + "CMake uses the largest value specified by any target in a component."); + cm->DefineProperty + ("LINK_INTERFACE_MULTIPLICITY_<CONFIG>", cmProperty::TARGET, + "Per-configuration repetition count for cycles of STATIC libraries.", + "This is the configuration-specific version of " + "LINK_INTERFACE_MULTIPLICITY. " + "If set, this property completely overrides the generic property " + "for the named configuration."); + + cm->DefineProperty ("MAP_IMPORTED_CONFIG_<CONFIG>", cmProperty::TARGET, "Map from project configuration to IMPORTED target's configuration.", "List configurations of an imported target that may be used for " @@ -3877,6 +3908,22 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config, info.LinkInterface.Languages); } } + + // Get the cyclic repetition count. + if(this->GetType() == cmTarget::STATIC_LIBRARY) + { + std::string linkProp = "IMPORTED_LINK_INTERFACE_MULTIPLICITY"; + linkProp += suffix; + if(const char* config_reps = this->GetProperty(linkProp.c_str())) + { + sscanf(config_reps, "%u", &info.LinkInterface.Multiplicity); + } + else if(const char* reps = + this->GetProperty("IMPORTED_LINK_INTERFACE_MULTIPLICITY")) + { + sscanf(reps, "%u", &info.LinkInterface.Multiplicity); + } + } } //---------------------------------------------------------------------------- @@ -4010,6 +4057,23 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface) } } + if(this->GetType() == cmTarget::STATIC_LIBRARY) + { + // 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.c_str())) + { + sscanf(config_reps, "%u", &iface.Multiplicity); + } + else if(const char* reps = + this->GetProperty("LINK_INTERFACE_MULTIPLICITY")) + { + sscanf(reps, "%u", &iface.Multiplicity); + } + } + return true; } |