You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
2.1 KiB
52 lines
2.1 KiB
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
|
|
|
|
# This module is shared by multiple languages; use include blocker.
|
|
include_guard()
|
|
|
|
block(SCOPE_FOR POLICIES)
|
|
cmake_policy(SET CMP0054 NEW)
|
|
|
|
# WHOLE_ARCHIVE Feature for LINK_LIBRARY generator expression
|
|
## check linker capabilities
|
|
function(__cmake_set_whole_archive_feature __linker)
|
|
unset(__lang)
|
|
if(ARGC EQUAL "2")
|
|
set(__lang "${ARGV1}_")
|
|
endif()
|
|
|
|
if(NOT __linker)
|
|
set(_CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED FALSE CACHE INTERNAL "linker supports push/pop state")
|
|
endif()
|
|
|
|
if(NOT DEFINED _CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED)
|
|
execute_process(COMMAND "${__linker}" --help
|
|
OUTPUT_VARIABLE __linker_help
|
|
ERROR_VARIABLE __linker_help)
|
|
if(__linker_help MATCHES "--push-state" AND __linker_help MATCHES "--pop-state")
|
|
set(_CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED TRUE CACHE INTERNAL "linker supports push/pop state")
|
|
else()
|
|
set(_CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED FALSE CACHE INTERNAL "linker supports push/pop state")
|
|
endif()
|
|
endif()
|
|
## WHOLE_ARCHIVE: Force loading all members of an archive
|
|
if(_CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED)
|
|
set(CMAKE_${__lang}LINK_LIBRARY_USING_WHOLE_ARCHIVE "LINKER:--push-state,--whole-archive"
|
|
"<LINK_ITEM>"
|
|
"LINKER:--pop-state" PARENT_SCOPE)
|
|
else()
|
|
set(CMAKE_${__lang}LINK_LIBRARY_USING_WHOLE_ARCHIVE "LINKER:--whole-archive"
|
|
"<LINK_ITEM>"
|
|
"LINKER:--no-whole-archive" PARENT_SCOPE)
|
|
endif()
|
|
set(CMAKE_${__lang}LINK_LIBRARY_USING_WHOLE_ARCHIVE_SUPPORTED TRUE PARENT_SCOPE)
|
|
set(CMAKE_${__lang}LINK_LIBRARY_WHOLE_ARCHIVE_ATTRIBUTES LIBRARY_TYPE=STATIC DEDUPLICATION=YES OVERRIDE=DEFAULT PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
|
|
## Configure system linker
|
|
__cmake_set_whole_archive_feature("${CMAKE_LINKER}")
|
|
|
|
endblock()
|