diff options
author | Brad King <brad.king@kitware.com> | 2023-12-12 01:06:16 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-01-04 16:59:26 (GMT) |
commit | 2c6ec6de1521b1e82f2bd5ac3324f6953ac31f4d (patch) | |
tree | 1dbff1ddd17d156442894ebbb0bab50fa7db32d2 /Source | |
parent | dd4a6dff9246715b419a8daf4ced2d3c46a529df (diff) | |
download | CMake-2c6ec6de1521b1e82f2bd5ac3324f6953ac31f4d.zip CMake-2c6ec6de1521b1e82f2bd5ac3324f6953ac31f4d.tar.gz CMake-2c6ec6de1521b1e82f2bd5ac3324f6953ac31f4d.tar.bz2 |
Link to transitive dependencies on stub libraries only on some linkers
Only linkers that enforce `--no-allow-shlib-undefined` recursively need
to link private transitive dependencies on stub libraries explicitly.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmComputeLinkInformation.cxx | 3 | ||||
-rw-r--r-- | Source/cmGeneratorTarget.cxx | 14 | ||||
-rw-r--r-- | Source/cmGeneratorTarget.h | 3 |
3 files changed, 19 insertions, 1 deletions
diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index d9d8ec1..de7f02e 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -1340,7 +1340,8 @@ void cmComputeLinkInformation::AddSharedDepItem(LinkEntry const& entry) // If the linker also uses '--as-needed' behavior, this will not // add an unnecessary direct dependency. (tgt && tgt->IsImported() && - !tgt->HasKnownRuntimeArtifactLocation(this->Config))) { + !tgt->HasKnownRuntimeArtifactLocation(this->Config) && + this->Target->LinkerEnforcesNoAllowShLibUndefined(this->Config))) { this->AddItem(entry); return; } diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 289bb24..11253db 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -5596,6 +5596,20 @@ std::string cmGeneratorTarget::GetLinkerTool(const std::string& lang, return linkerTool; } +bool cmGeneratorTarget::LinkerEnforcesNoAllowShLibUndefined( + std::string const& config) const +{ + // FIXME(#25486): Account for the LINKER_TYPE target property. + // Also factor out the hard-coded list below into a platform + // information table based on the linker id. + std::string ll = this->GetLinkerLanguage(config); + std::string linkerIdVar = cmStrCat("CMAKE_", ll, "_COMPILER_LINKER_ID"); + cmValue linkerId = this->Makefile->GetDefinition(linkerIdVar); + // The GNU bfd-based linker may enforce '--no-allow-shlib-undefined' + // recursively by default. The Solaris linker has similar behavior. + return linkerId && (*linkerId == "GNU" || *linkerId == "Solaris"); +} + std::string cmGeneratorTarget::GetPDBOutputName( const std::string& config) const { diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index cfb08fa..fb56a0d 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -805,6 +805,9 @@ public: std::string GetLinkerTool(const std::string& lang, const std::string& config) const; + /** Is the linker known to enforce '--no-allow-shlib-undefined'? */ + bool LinkerEnforcesNoAllowShLibUndefined(std::string const& config) const; + /** Does this target have a GNU implib to convert to MS format? */ bool HasImplibGNUtoMS(std::string const& config) const; |