| 12345678910111213141516171819202122232425262728293031323334 |
- enable_language(C)
- set(CMAKE_C_LINK_LIBRARY_USING_whole_archive_SUPPORTED TRUE)
- if(CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
- set(CMAKE_C_LINK_LIBRARY_USING_whole_archive "-force_load <LIB_ITEM>")
- elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
- execute_process(COMMAND "${CMAKE_LINKER}" --help
- OUTPUT_VARIABLE linker_help
- ERROR_VARIABLE linker_help)
- if(linker_help MATCHES "--push-state" AND linker_help MATCHES "--pop-state")
- set(CMAKE_C_LINK_LIBRARY_USING_whole_archive "LINKER:--push-state,--whole-archive"
- "<LINK_ITEM>"
- "LINKER:--pop-state")
- else()
- set(CMAKE_C_LINK_LIBRARY_USING_whole_archive "LINKER:--whole-archive"
- "<LINK_ITEM>"
- "LINKER:--no-whole-archive")
- endif()
- elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
- set(CMAKE_C_LINK_LIBRARY_USING_whole_archive "/WHOLEARCHIVE:<LIBRARY>")
- else()
- # feature not yet supported for the other environments
- set(CMAKE_C_LINK_LIBRARY_USING_whole_archive_SUPPORTED FALSE)
- endif()
- add_library(base STATIC base.c unref.c)
- target_compile_definitions(base PUBLIC STATIC_BASE)
- add_library(lib SHARED lib.c)
- target_link_libraries(lib PRIVATE "$<LINK_LIBRARY:whole_archive,base>")
- add_executable(main main.c)
- target_link_libraries(main PRIVATE lib)
|