1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
cmake_minimum_required(VERSION 3.28)
include(CheckLinkerFlag)
function(target_export_script TARGET)
set(options)
set(oneValueArgs LINK_EXE APPLE_LD GNU_LD)
set(multiValueArgs)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
get_property(target_type TARGET ${TARGET} PROPERTY TYPE)
if (NOT target_type MATCHES "(SHARED|MODULE)_LIBRARY")
# Linker scripts do nothing on non-shared libraries.
return()
endif ()
if (MSVC)
## TODO: implement something similar for Windows/link.exe
# https://github.com/halide/Halide/issues/4651
return()
endif ()
if (XCODE)
# There is a bug in Xcode where -Xlinker flags in the OTHER_LDFLAGS
# property creates a bogus dependency on a file named -Xlinker. No
# idea how this happens. CMake translates the EXPORTED_SYMBOLS_FLAG
# below to -Xlinker -exported_symbols_list -Xlinker ${ARG_APPLE_LD}
# which by rights should work, and in fact Xcode prints a link line
# that DOES work, but the aforementioned bug breaks the check. Going
# through the "official" Xcode attribute is a reasonable workaround.
set_property(TARGET "${TARGET}" PROPERTY XCODE_ATTRIBUTE_EXPORTED_SYMBOLS_FILE "${ARG_APPLE_LD}")
return()
endif ()
## More linkers support the GNU syntax (ld, lld, gold), so try it first.
set(VERSION_SCRIPT_FLAG "LINKER:--version-script=${ARG_GNU_LD}")
check_linker_flag(CXX "${VERSION_SCRIPT_FLAG}" LINKER_HAS_FLAG_VERSION_SCRIPT)
if (LINKER_HAS_FLAG_VERSION_SCRIPT)
target_link_options(${TARGET} PRIVATE "${VERSION_SCRIPT_FLAG}")
set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS "${ARG_GNU_LD}")
return()
endif ()
## The Apple linker expects a different flag.
file(CONFIGURE OUTPUT _target_export_script.apple.ldscript CONTENT [[]])
set(EXPORTED_SYMBOLS_FLAG "LINKER:-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/_target_export_script.apple.ldscript")
check_linker_flag(CXX "${EXPORTED_SYMBOLS_FLAG}" LINKER_HAS_FLAG_EXPORTED_SYMBOLS_LIST)
if (LINKER_HAS_FLAG_EXPORTED_SYMBOLS_LIST)
target_link_options(${TARGET} PRIVATE "LINKER:-exported_symbols_list,${ARG_APPLE_LD}")
set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS "${ARG_APPLE_LD}")
return()
endif ()
message(WARNING "Unknown linker! Could not attach Halide linker script.")
endfunction()
|