|
1 |
| -function(find_compiler_rt_library name variable) |
2 |
| - set(CLANG_COMMAND ${CMAKE_CXX_COMPILER} ${SANITIZER_COMMON_CFLAGS} |
3 |
| - "--rtlib=compiler-rt" "--print-libgcc-file-name") |
4 |
| - if (CMAKE_CXX_COMPILER_ID MATCHES Clang AND CMAKE_CXX_COMPILER_TARGET) |
5 |
| - list(APPEND CLANG_COMMAND "--target=${CMAKE_CXX_COMPILER_TARGET}") |
| 1 | +# Check if compile-rt library file path exists. |
| 2 | +# If found, cache the path in: |
| 3 | +# COMPILER_RT_LIBRARY-<name>-<target> |
| 4 | +# If err_flag is true OR path not found, emit a message and set: |
| 5 | +# COMPILER_RT_LIBRARY-<name>-<target> to NOTFOUND |
| 6 | +function(cache_compiler_rt_library err_flag name target library_file) |
| 7 | + if(err_flag OR NOT EXISTS "${library_file}") |
| 8 | + message(STATUS "Failed to find compiler-rt ${name} library for ${target}") |
| 9 | + set(COMPILER_RT_LIBRARY-${name}-${target} "NOTFOUND" CACHE INTERNAL |
| 10 | + "compiler-rt ${name} library for ${target}") |
| 11 | + else() |
| 12 | + message(STATUS "Found compiler-rt ${name} library: ${library_file}") |
| 13 | + set(COMPILER_RT_LIBRARY-${name}-${target} "${library_file}" CACHE INTERNAL |
| 14 | + "compiler-rt ${name} library for ${target}") |
| 15 | + endif() |
| 16 | +endfunction() |
| 17 | + |
| 18 | +# Find the path to compiler-rt library `name` (e.g. "builtins") for |
| 19 | +# the specified `target` (e.g. "x86_64-linux") and return it in `variable`. |
| 20 | +# This calls cache_compiler_rt_library that caches the path to speed up |
| 21 | +# repeated invocations with the same `name` and `target`. |
| 22 | +function(find_compiler_rt_library name target variable) |
| 23 | + if(NOT CMAKE_CXX_COMPILER_ID MATCHES Clang) |
| 24 | + set(${variable} "NOTFOUND" PARENT_SCOPE) |
| 25 | + return() |
| 26 | + endif() |
| 27 | + if (NOT target AND CMAKE_CXX_COMPILER_TARGET) |
| 28 | + set(target "${CMAKE_CXX_COMPILER_TARGET}") |
6 | 29 | endif()
|
7 |
| - get_property(SANITIZER_CXX_FLAGS CACHE CMAKE_CXX_FLAGS PROPERTY VALUE) |
8 |
| - string(REPLACE " " ";" SANITIZER_CXX_FLAGS "${SANITIZER_CXX_FLAGS}") |
9 |
| - list(APPEND CLANG_COMMAND ${SANITIZER_CXX_FLAGS}) |
10 |
| - execute_process( |
| 30 | + if(NOT DEFINED COMPILER_RT_LIBRARY-builtins-${target}) |
| 31 | + # If the cache variable is not defined, invoke clang and then |
| 32 | + # set it with cache_compiler_rt_library. |
| 33 | + set(CLANG_COMMAND ${CMAKE_CXX_COMPILER} ${SANITIZER_COMMON_FLAGS} |
| 34 | + "--rtlib=compiler-rt" "-print-libgcc-file-name") |
| 35 | + if(target) |
| 36 | + list(APPEND CLANG_COMMAND "--target=${target}") |
| 37 | + endif() |
| 38 | + get_property(SANITIZER_CXX_FLAGS CACHE CMAKE_CXX_FLAGS PROPERTY VALUE) |
| 39 | + string(REPLACE " " ";" SANITIZER_CXX_FLAGS "${SANITIZER_CXX_FLAGS}") |
| 40 | + list(APPEND CLANG_COMMAND ${SANITIZER_CXX_FLAGS}) |
| 41 | + execute_process( |
11 | 42 | COMMAND ${CLANG_COMMAND}
|
12 | 43 | RESULT_VARIABLE HAD_ERROR
|
13 | 44 | OUTPUT_VARIABLE LIBRARY_FILE
|
14 |
| - ) |
15 |
| - string(STRIP "${LIBRARY_FILE}" LIBRARY_FILE) |
16 |
| - file(TO_CMAKE_PATH "${LIBRARY_FILE}" LIBRARY_FILE) |
17 |
| - string(REPLACE "builtins" "${name}" LIBRARY_FILE "${LIBRARY_FILE}") |
18 |
| - if (NOT HAD_ERROR AND EXISTS "${LIBRARY_FILE}") |
19 |
| - message(STATUS "Found compiler-rt ${name} library: ${LIBRARY_FILE}") |
20 |
| - set(${variable} "${LIBRARY_FILE}" PARENT_SCOPE) |
21 |
| - else() |
22 |
| - message(STATUS "Failed to find compiler-rt ${name} library") |
| 45 | + ) |
| 46 | + string(STRIP "${LIBRARY_FILE}" LIBRARY_FILE) |
| 47 | + file(TO_CMAKE_PATH "${LIBRARY_FILE}" LIBRARY_FILE) |
| 48 | + cache_compiler_rt_library(${HAD_ERROR} |
| 49 | + builtins "${target}" "${LIBRARY_FILE}") |
| 50 | + endif() |
| 51 | + if(NOT COMPILER_RT_LIBRARY-builtins-${target}) |
| 52 | + set(${variable} "NOTFOUND" PARENT_SCOPE) |
| 53 | + return() |
| 54 | + endif() |
| 55 | + if(NOT DEFINED COMPILER_RT_LIBRARY-${name}-${target}) |
| 56 | + # clang gives only the builtins library path. Other library paths are |
| 57 | + # obtained by substituting "builtins" with ${name} in the builtins |
| 58 | + # path and then checking if the resultant path exists. The result of |
| 59 | + # this check is also cached by cache_compiler_rt_library. |
| 60 | + set(LIBRARY_FILE "${COMPILER_RT_LIBRARY-builtins-${target}}") |
| 61 | + string(REPLACE "builtins" "${name}" LIBRARY_FILE "${LIBRARY_FILE}") |
| 62 | + cache_compiler_rt_library(FALSE "${name}" "${target}" "${LIBRARY_FILE}") |
23 | 63 | endif()
|
| 64 | + set(${variable} "${COMPILER_RT_LIBRARY-${name}-${target}}" PARENT_SCOPE) |
24 | 65 | endfunction()
|
0 commit comments