` WHOLE_ARCHIVE` should be available on `Generic` systems that use GCC
CMAKE_LINK_LIBRARY_USING_FEATURE
is an awesome addition to CMake. Specifically the predefined feature WHOLE_ARCHIVE
. Bare metal and RTOS based embedded systems often have many weak symbols and wrapping a Hardware Abstraction Layer or Board Package into a static library was always a huge pain because of this.
Bare metal / RTOS systems will often use a toolchain file and set the CMAKE_SYSTEM_NAME
to Generic
. But looking at the Generic
platform file here it is pretty bare (by design).
I took the implementation from the Linux platform file here and run it immediately following the call to project
. IMO this should really be available without doing this though, and would really help with teaching CMake for embedded.
Possible Solution
Seems like the Linux implementation could be used for GNU compilers, as long as it's guarded to not interfere with other Generic
systems (like IAR, etc). I guess some of the other common embedded compilers might need a branch in the code to setup their way to do WHOLE_ARCHIVE
linking.
Something like:
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# Features for LINK_LIBRARY generator expression
## check linker capabilities
if(NOT DEFINED _CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED)
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_LINKER_PUSHPOP_STATE_SUPPORTED TRUE CACHE INTERNAL "linker supports push/pop state")
else()
set(_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED FALSE CACHE INTERNAL "linker supports push/pop state")
endif()
unset(__linker_help)
endif()
## WHOLE_ARCHIVE: Force loading all members of an archive
if(_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED)
set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE "LINKER:--push-state,--whole-archive"
"<LINK_ITEM>"
"LINKER:--pop-state")
else()
set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE "LINKER:--whole-archive"
"<LINK_ITEM>"
"LINKER:--no-whole-archive")
endif()
set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE_SUPPORTED TRUE)
# Features for LINK_GROUP generator expression
## RESCAN: request the linker to rescan static libraries until there is
## no pending undefined symbols
set(CMAKE_LINK_GROUP_USING_RESCAN "LINKER:--start-group" "LINKER:--end-group")
set(CMAKE_LINK_GROUP_USING_RESCAN_SUPPORTED TRUE)
endif()