浏览代码

target_link_libraries: Propagate dependencies of object libraries

Prior to this commit, linking against an object library did not
propagate private link dependencies of object libraries to their
consuming targets. This change implements the correct behavior.

Fixes: #18692
Co-Author: Brad King <[email protected]>
Kyle Edwards 6 年之前
父节点
当前提交
bab24e782c

+ 5 - 0
Help/release/dev/object-library-link.rst

@@ -0,0 +1,5 @@
+object-library-link
+-------------------
+
+* Object library linking has been fixed to propagate transitive link
+  dependencies of object libraries to consuming targets.

+ 2 - 1
Source/cmTargetLinkLibrariesCommand.cxx

@@ -451,7 +451,8 @@ bool cmTargetLinkLibrariesCommand::HandleLibrary(const std::string& lib,
   // STATIC library.)
   if (this->CurrentProcessingState == ProcessingKeywordPrivateInterface ||
       this->CurrentProcessingState == ProcessingPlainPrivateInterface) {
-    if (this->Target->GetType() == cmStateEnums::STATIC_LIBRARY) {
+    if (this->Target->GetType() == cmStateEnums::STATIC_LIBRARY ||
+        this->Target->GetType() == cmStateEnums::OBJECT_LIBRARY) {
       std::string configLib =
         this->Target->GetDebugGeneratorExpressions(libRef, llt);
       if (cmGeneratorExpression::IsValidTargetName(libRef) ||

+ 1 - 0
Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake

@@ -45,6 +45,7 @@ run_object_lib_build2(LinkObjRHSObject)
 run_object_lib_build(LinkObjRHSShared2)
 run_object_lib_build(LinkObjRHSStatic2)
 run_object_lib_build2(LinkObjRHSObject2)
+run_object_lib_build(TransitiveDependencies)
 
 run_cmake(MissingSource)
 run_cmake(ObjWithObj)

+ 7 - 0
Tests/RunCMake/ObjectLibrary/TransitiveDependencies.cmake

@@ -0,0 +1,7 @@
+add_library(lib1 STATIC depends_obj0.c)
+add_library(lib2 OBJECT a.c)
+target_link_libraries(lib2 PRIVATE lib1)
+
+add_executable(test exe2.c)
+
+target_link_libraries(test PUBLIC lib2)

+ 6 - 0
Tests/RunCMake/ObjectLibrary/exe2.c

@@ -0,0 +1,6 @@
+extern int myobj_foo(void);
+
+int main(void)
+{
+  return myobj_foo();
+}