Bump to 4.8.3
[platform/upstream/ccache.git] / cmake / UseFastestLinker.cmake
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.
5   return()
6 endif()
7
8 if(DISABLE_FASTEST_LINKER)
9   message(STATUS "Not probing for fastest linker")
10   return()
11 endif()
12
13 if(MSVC)
14   message(STATUS "Using standard linker for MSVC")
15   return()
16 endif()
17
18 if(ENABLE_IPO)
19   message(STATUS "Using standard linker for IPO")
20   return()
21 endif()
22
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}")
28   return()
29 endif()
30
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; }")
34   try_compile(
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}"
39   )
40 endfunction()
41
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")
45     return()
46   endif()
47
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")
54       return()
55     endif()
56   endif()
57
58   check_linker(lld)
59   if(HAVE_LD_LLD)
60     link_libraries("-fuse-ld=lld")
61     message(STATUS "Using lld linker")
62     return()
63   endif()
64
65   check_linker(gold)
66   if(HAVE_LD_GOLD)
67     link_libraries("-fuse-ld=gold")
68     message(STATUS "Using gold linker")
69     return()
70   endif()
71
72   message(STATUS "Using default linker")
73 endfunction()
74
75 option(USE_FASTER_LINKER "Use the lld or gold linker instead of the default for faster linking" TRUE)
76 if(USE_FASTER_LINKER)
77   use_fastest_linker()
78 endif()