1 if(NOT CCACHE_DEV_MODE)
2 # For ccache, using a faster linker is in practice only relevant to reduce the
3 # compile-link-test cycle for developers, so use the standard linker for
4 # non-developer builds.
8 if(DISABLE_FASTEST_LINKER)
9 message(STATUS "Not probing for fastest linker")
14 message(STATUS "Using standard linker for MSVC")
19 message(STATUS "Using standard linker for IPO")
23 if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
24 # Be conservative and only probe for a faster linker on platforms that likely
25 # don't have toolchain bugs. See for example
26 # <https://www.sourceware.org/bugzilla/show_bug.cgi?id=22838>.
27 message(STATUS "Not probing for faster linker on ${CMAKE_SYSTEM_PROCESSOR}")
31 function(check_linker linker)
32 string(TOUPPER ${linker} upper_linker)
33 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakefiles/CMakeTmp/main.c" "int main() { return 0; }")
35 HAVE_LD_${upper_linker}
36 ${CMAKE_CURRENT_BINARY_DIR}
37 "${CMAKE_CURRENT_BINARY_DIR}/CMakefiles/CMakeTmp/main.c"
38 LINK_LIBRARIES "-fuse-ld=${linker}"
42 function(use_fastest_linker)
43 if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
44 message(WARNING "use_fastest_linker() disabled, as it is not called at the project top level")
48 # prefer an lld that matches the clang version
49 if(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_VERSION MATCHES "^([0-9]*)\\.")
50 check_linker(lld-${CMAKE_MATCH_1})
51 if(HAVE_LD_LLD-${CMAKE_MATCH_1})
52 link_libraries("-fuse-ld=lld-${CMAKE_MATCH_1}")
53 message(STATUS "Using lld-${CMAKE_MATCH_1} linker")
60 link_libraries("-fuse-ld=lld")
61 message(STATUS "Using lld linker")
67 link_libraries("-fuse-ld=gold")
68 message(STATUS "Using gold linker")
72 message(STATUS "Using default linker")
75 option(USE_FASTER_LINKER "Use the lld or gold linker instead of the default for faster linking" TRUE)