1
0
Эх сурвалжийг харах

Fix export of STATIC library PRIVATE dependencies with CMP0022 NEW

The target_link_libraries command records the PRIVATE dependencies of a
STATIC library in INTERFACE_LINK_LIBRARIES as "$<LINK_ONLY:dep>".  This
hides the target name from export namespacing logic inside a generator
expression.  When user-written generator expressions reference a target
name they must put it inside a "$<TARGET_NAME:dep>" expression to allow
the export logic to rename the target.  In the case that the private
dependency is not already a generator expression, target_link_libraries
must use "$<LINK_ONLY:$<TARGET_NAME:dep>>" to allow the export logic to
rename the target.

Reported-by: Tamás Kenéz <[email protected]>
Brad King 10 жил өмнө
parent
commit
aea1b03617

+ 5 - 2
Source/cmTargetLinkLibrariesCommand.cxx

@@ -432,8 +432,11 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const std::string& lib,
         {
         {
         std::string configLib = this->Target
         std::string configLib = this->Target
                                      ->GetDebugGeneratorExpressions(lib, llt);
                                      ->GetDebugGeneratorExpressions(lib, llt);
-        if (cmGeneratorExpression::IsValidTargetName(lib)
-            || cmGeneratorExpression::Find(lib) != std::string::npos)
+        if (cmGeneratorExpression::IsValidTargetName(configLib))
+          {
+          configLib = "$<LINK_ONLY:$<TARGET_NAME:" + configLib + ">>";
+          }
+        else if (cmGeneratorExpression::Find(configLib) != std::string::npos)
           {
           {
           configLib = "$<LINK_ONLY:" + configLib + ">";
           configLib = "$<LINK_ONLY:" + configLib + ">";
           }
           }

+ 6 - 0
Tests/ExportImport/Export/CMakeLists.txt

@@ -136,6 +136,8 @@ cmake_policy(SET CMP0022 NEW)
 add_library(testLibRequired testLibRequired.c)
 add_library(testLibRequired testLibRequired.c)
 add_library(testLibDepends testLibDepends.c)
 add_library(testLibDepends testLibDepends.c)
 target_link_libraries(testLibDepends LINK_PUBLIC testLibRequired)
 target_link_libraries(testLibDepends LINK_PUBLIC testLibRequired)
+add_library(testStaticLibRequiredPrivate testStaticLibRequiredPrivate.c)
+target_link_libraries(testLibDepends PRIVATE testStaticLibRequiredPrivate)
 cmake_policy(POP)
 cmake_policy(POP)
 
 
 macro(add_include_lib _libName)
 macro(add_include_lib _libName)
@@ -394,6 +396,10 @@ install(TARGETS
         INCLUDES DESTINATION
         INCLUDES DESTINATION
           $<INSTALL_PREFIX>/include/$<TARGET_PROPERTY:NAME>
           $<INSTALL_PREFIX>/include/$<TARGET_PROPERTY:NAME>
 )
 )
+install(TARGETS
+          testStaticLibRequiredPrivate
+        EXPORT RequiredExp DESTINATION lib
+)
 install(EXPORT RequiredExp NAMESPACE Req:: FILE testLibRequiredTargets.cmake DESTINATION lib/cmake/testLibRequired)
 install(EXPORT RequiredExp NAMESPACE Req:: FILE testLibRequiredTargets.cmake DESTINATION lib/cmake/testLibRequired)
 
 
 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest")
 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest")

+ 6 - 1
Tests/ExportImport/Export/testLibDepends.c

@@ -16,5 +16,10 @@
 #endif
 #endif
 
 
 extern int testLibRequired(void);
 extern int testLibRequired(void);
+extern int testStaticLibRequiredPrivate(void);
 
 
-int testLibDepends(void) { return testLibRequired(); }
+int testLibDepends(void) {
+  return testLibRequired()
+    + testStaticLibRequiredPrivate()
+    ;
+}

+ 1 - 0
Tests/ExportImport/Export/testStaticLibRequiredPrivate.c

@@ -0,0 +1 @@
+int testStaticLibRequiredPrivate(void) { return 0; }