[Bf-blender-cvs] [dcb2821292f] master: macOS/GTest: Fix duplicate symbol errors with some generators

Ankit Meel noreply at git.blender.org
Wed Feb 3 18:51:29 CET 2021


Commit: dcb2821292f962951e88f146cb304160f21f73da
Author: Ankit Meel
Date:   Wed Feb 3 23:20:27 2021 +0530
Branches: master
https://developer.blender.org/rBdcb2821292f962951e88f146cb304160f21f73da

macOS/GTest: Fix duplicate symbol errors with some generators

Don't force load _and_ link against a library in case
linker fails to deduplicate them.
https://devtalk.blender.org/t/macos-duplicate-symbol-errors/17343

Reviewed By: #platform_macos, brecht
Differential Revision: https://developer.blender.org/D10294

===================================================================

M	tests/gtests/runner/CMakeLists.txt

===================================================================

diff --git a/tests/gtests/runner/CMakeLists.txt b/tests/gtests/runner/CMakeLists.txt
index 85b80979074..b1b9cf98d68 100644
--- a/tests/gtests/runner/CMakeLists.txt
+++ b/tests/gtests/runner/CMakeLists.txt
@@ -62,12 +62,31 @@ if(WIN32)
     target_link_options(blender_test PRIVATE /wholearchive:$<TARGET_FILE:${_lib}>)
   endforeach()
 elseif(APPLE)
+  # force_load for `_test_libs` ensures that all symbols definitely make it into the test binary.
+  # But linking against them again using `target_link_libraries` creates duplicate symbol
+  # errors when linker cannot deduplicate a force loaded and linked library.
+  # So force load test libraries separately, and link against their non-"test libraries"
+  # dependencies separately.
+
+  # Gather dependencies of all test libraries.
+  set(_test_libs_dependencies)
   foreach(_lib ${_test_libs})
-    # We need -force_load for every test library and target_link_libraries will
-    # deduplicate it. So explicitly set as linker option for every test lib.
-    target_link_libraries(blender_test ${_lib})
+    get_target_property(_interface_libs ${_lib} INTERFACE_LINK_LIBRARIES)
+    if (_interface_libs)
+      list(APPEND _test_libs_dependencies ${_interface_libs})
+    endif()
+    unset(_interface_libs)
+  endforeach()
+
+  # Force load test libraries. Ensure that they are not linked twice in case they
+  # are used as dependencies of other test libraries.
+  foreach(_lib ${_test_libs})
+    list(REMOVE_ITEM _test_libs_dependencies ${_lib})
     target_link_options(blender_test PRIVATE "LINKER:-force_load,$<TARGET_FILE:${_lib}>")
   endforeach()
+
+  target_link_libraries(blender_test "${_test_libs_dependencies}")
+  unset(_test_libs_dependencies)
 endif()
 
 unset(_test_libs)



More information about the Bf-blender-cvs mailing list