whole_archive.cmake 1.5 KB

12345678910111213141516171819202122232425262728293031323334
  1. enable_language(C)
  2. set(CMAKE_C_LINK_LIBRARY_USING_whole_archive_SUPPORTED TRUE)
  3. if(CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
  4. set(CMAKE_C_LINK_LIBRARY_USING_whole_archive "-force_load <LIB_ITEM>")
  5. elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
  6. execute_process(COMMAND "${CMAKE_LINKER}" --help
  7. OUTPUT_VARIABLE linker_help
  8. ERROR_VARIABLE linker_help)
  9. if(linker_help MATCHES "--push-state" AND linker_help MATCHES "--pop-state")
  10. set(CMAKE_C_LINK_LIBRARY_USING_whole_archive "LINKER:--push-state,--whole-archive"
  11. "<LINK_ITEM>"
  12. "LINKER:--pop-state")
  13. else()
  14. set(CMAKE_C_LINK_LIBRARY_USING_whole_archive "LINKER:--whole-archive"
  15. "<LINK_ITEM>"
  16. "LINKER:--no-whole-archive")
  17. endif()
  18. elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
  19. set(CMAKE_C_LINK_LIBRARY_USING_whole_archive "/WHOLEARCHIVE:<LIBRARY>")
  20. else()
  21. # feature not yet supported for the other environments
  22. set(CMAKE_C_LINK_LIBRARY_USING_whole_archive_SUPPORTED FALSE)
  23. endif()
  24. add_library(base STATIC base.c unref.c)
  25. target_compile_definitions(base PUBLIC STATIC_BASE)
  26. add_library(lib SHARED lib.c)
  27. target_link_libraries(lib PRIVATE "$<LINK_LIBRARY:whole_archive,base>")
  28. add_executable(main main.c)
  29. target_link_libraries(main PRIVATE lib)