Skip to content

Commit 35ce987

Browse files
CMake: reworked whole archive linking commands
1 parent 9952102 commit 35ce987

File tree

6 files changed

+45
-20
lines changed

6 files changed

+45
-20
lines changed

BuildTools/CMake/BuildUtils.cmake

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,3 +499,35 @@ function(set_targets_emscripten_properties)
499499
endforeach()
500500
endif()
501501
endfunction()
502+
503+
504+
# Links the static library <lib> to the target <tgt> as a whole archive.
505+
function(target_link_whole_archive tgt lib)
506+
if(MSVC)
507+
target_link_libraries(${tgt} PRIVATE ${lib})
508+
else()
509+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.24)
510+
# Use the new $<LINK_LIBRARY:WHOLE_ARCHIVE,lib> generator expression.
511+
# This one argument expands to the right flags automatically on
512+
# every toolchain (-Wl,--whole-archive/--no-whole-archive on ELF,
513+
# -Wl,-force_load on Apple, /WHOLEARCHIVE on MSVC, ...).
514+
target_link_libraries(
515+
${tgt} PRIVATE
516+
"$<LINK_LIBRARY:WHOLE_ARCHIVE,${lib}>"
517+
)
518+
else()
519+
# Legacy toolchains: add the flags by hand.
520+
if(APPLE)
521+
target_link_libraries(
522+
${tgt} PRIVATE
523+
"-Wl,-force_load,$<TARGET_FILE:${lib}>"
524+
)
525+
else()
526+
target_link_libraries(
527+
${tgt} PRIVATE
528+
"-Wl,--whole-archive" ${lib} "-Wl,--no-whole-archive"
529+
)
530+
endif()
531+
endif()
532+
endif()
533+
endfunction()

CMakeLists.txt

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -445,22 +445,6 @@ else()
445445
endif(MSVC)
446446

447447

448-
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
449-
CMAKE_CXX_COMPILER_ID MATCHES "GNU")
450-
if(PLATFORM_APPLE)
451-
# Looks like force_load is preferable over all_load
452-
set(WHOLE_ARCHIVE_FLAG "-Wl,-force_load" CACHE INTERNAL "all_load flag")
453-
# Option -noall_load is obsolete and there is no -noforce_load
454-
set(NO_WHOLE_ARCHIVE_FLAG "" CACHE INTERNAL "noall_load flag")
455-
else()
456-
set(WHOLE_ARCHIVE_FLAG "-Wl,--whole-archive" CACHE INTERNAL "whole-archive flag")
457-
set(NO_WHOLE_ARCHIVE_FLAG "-Wl,--no-whole-archive" CACHE INTERNAL "no-whole-archive flag")
458-
endif()
459-
else()
460-
set(WHOLE_ARCHIVE_FLAG "")
461-
set(NO_WHOLE_ARCHIVE_FLAG "")
462-
endif()
463-
464448
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
465449
# Treat warnings as errors
466450
set(DILIGENT_CLANG_COMPILE_OPTIONS "" CACHE STRING "Common Clang compile options")

Graphics/Archiver/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
cmake_minimum_required (VERSION 3.10)
22

3+
include(../../BuildTools/CMake/BuildUtils.cmake)
4+
35
project(Diligent-Archiver CXX)
46

57
set(INCLUDE
@@ -181,8 +183,8 @@ PUBLIC
181183
Diligent-ArchiverInterface
182184
PRIVATE
183185
Diligent-BuildSettings
184-
${WHOLE_ARCHIVE_FLAG} Diligent-Archiver-static ${NO_WHOLE_ARCHIVE_FLAG}
185186
)
187+
target_link_whole_archive(Diligent-Archiver-shared Diligent-Archiver-static)
186188

187189
if(PLATFORM_WIN32)
188190
# Do not add 'lib' prefix when building with MinGW

Graphics/GraphicsEngineOpenGL/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
cmake_minimum_required (VERSION 3.10)
22

3+
include(../../BuildTools/CMake/BuildUtils.cmake)
4+
35
project(Diligent-GraphicsEngineOpenGL CXX)
46

57
set(INCLUDE
@@ -262,10 +264,10 @@ PUBLIC
262264
target_link_libraries(Diligent-GraphicsEngineOpenGL-shared
263265
PRIVATE
264266
Diligent-BuildSettings
265-
${WHOLE_ARCHIVE_FLAG} Diligent-GraphicsEngineOpenGL-static ${NO_WHOLE_ARCHIVE_FLAG}
266267
PUBLIC
267268
${PUBLIC_DEPENDENCIES}
268269
)
270+
target_link_whole_archive(Diligent-GraphicsEngineOpenGL-shared Diligent-GraphicsEngineOpenGL-static)
269271

270272
target_compile_definitions(Diligent-GraphicsEngineOpenGL-shared PUBLIC ENGINE_DLL=1)
271273
if(PLATFORM_MACOS)

Graphics/GraphicsEngineVulkan/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
cmake_minimum_required (VERSION 3.10)
22

3+
include(../../BuildTools/CMake/BuildUtils.cmake)
34
include(../../BuildTools/CMake/VulkanUtils.cmake)
45

56
project(Diligent-GraphicsEngineVk CXX)
@@ -286,10 +287,11 @@ PUBLIC
286287
target_link_libraries(Diligent-GraphicsEngineVk-shared
287288
PRIVATE
288289
Diligent-BuildSettings
289-
${WHOLE_ARCHIVE_FLAG} Diligent-GraphicsEngineVk-static ${NO_WHOLE_ARCHIVE_FLAG}
290290
PUBLIC
291291
${PUBLIC_DEPENDENCIES}
292292
)
293+
target_link_whole_archive(Diligent-GraphicsEngineVk-shared Diligent-GraphicsEngineVk-static)
294+
293295

294296
if (MINGW_BUILD)
295297
# Restrict export to GetEngineFactoryVk

Tests/GPUTestFramework/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
cmake_minimum_required (VERSION 3.17)
22

3+
include(../../BuildTools/CMake/BuildUtils.cmake)
4+
35
project(Diligent-GPUTestFramework)
46

57
set(SOURCE src/GPUTestingEnvironment.cpp src/TestingSwapChainBase.cpp)
@@ -156,5 +158,6 @@ set_target_properties(Diligent-GPUTestFramework PROPERTIES
156158
)
157159

158160
if (TARGET Diligent-Archiver-shared)
159-
target_link_libraries(Diligent-GPUTestFramework PUBLIC Diligent-Archiver-shared)
161+
get_backend_libraries_type(LIB_TYPE)
162+
target_link_libraries(Diligent-GPUTestFramework PUBLIC Diligent-Archiver-${LIB_TYPE})
160163
endif()

0 commit comments

Comments
 (0)