+include(CMakePushCheckState)
+include(CheckCSourceRuns)
+
# Calls `message(VERBOSE msg)` if and only if VERBOSE is available (since CMake 3.15).
# Call CMake with --loglevel=VERBOSE to view those messages.
function(message_verbose msg)
endif()
endfunction()
+function(try_linker linker)
+ string(TOUPPER ${linker} upper_linker)
+ find_program(HAS_LD_${upper_linker} "ld.${linker}")
+ if(HAS_LD_${upper_linker})
+ cmake_push_check_state(RESET)
+ set(CMAKE_REQUIRED_LIBRARIES "-fuse-ld=${linker}")
+ check_c_source_runs("int main() { return 0; }" HAVE_LD_${upper_linker})
+ cmake_pop_check_state()
+ endif()
+endfunction()
+
function(use_fastest_linker)
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
message(WARNING "use_fastest_linker() disabled, as it is not called at the project top level")
return()
endif()
- find_program(HAS_LD_LLD ld.lld)
- if(HAS_LD_LLD)
- link_libraries(-fuse-ld=lld)
+ set(use_default_linker 1)
+ try_linker(lld)
+ if (HAVE_LD_LLD)
+ link_libraries("-fuse-ld=lld")
+ set(use_default_linker 0)
message_verbose("Using lld linker for faster linking")
else()
- find_program(HAS_LD_GOLD ld.gold)
- if(HAS_LD_GOLD)
- link_libraries(-fuse-ld=gold)
+ try_linker(gold)
+ if(HAVE_LD_GOLD)
+ link_libraries("-fuse-ld=gold")
+ set(use_default_linker 0)
message_verbose("Using gold linker for faster linking")
- else()
- message_verbose("Using default linker")
endif()
endif()
+ if(use_default_linker)
+ message_verbose("Using default linker")
+ endif()
endfunction()
option(USE_FASTER_LINKER "Use the lld or gold linker instead of the default for faster linking" TRUE)