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
This commit is contained in:
Ankit Meel 2021-02-03 23:20:27 +05:30
parent 46e66cecb3
commit dcb2821292
Notes: blender-bot 2023-04-19 05:36:32 +02:00
Referenced by commit 67856d8c4a, macOS/GTests: add_dependencies to fix build error
Referenced by pull request #107033, macOS/GTests: simplify test library linking
Referenced by commit ed590e9181, macOS/GTests: simplify blender_test library linking
1 changed files with 22 additions and 3 deletions

View File

@ -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)