| # SPDX-License-Identifier: Apache-2.0 |
| # |
| # Copyright (c) 2022, Nordic Semiconductor ASA |
| # Copyright (c) 2023, Intel Corporation |
| |
| # FindGnuLd module for locating LLVM lld linker. |
| # |
| # The module defines the following variables: |
| # |
| # 'LLVMLLD_LINKER' |
| # Path to LLVM lld linker |
| # Set to 'LLVMLLD_LINKER-NOTFOUND' if ld was not found. |
| # |
| # 'LlvmLld_FOUND', 'LLVMLLD_FOUND' |
| # True if LLVM lld was found. |
| # |
| # 'LLVMLLD_VERSION_STRING' |
| # The version of LLVM lld. |
| |
| include(FindPackageHandleStandardArgs) |
| |
| # See if the compiler has a preferred linker |
| execute_process(COMMAND ${CMAKE_C_COMPILER} --print-prog-name=ld.lld |
| OUTPUT_VARIABLE LLVMLLD_LINKER |
| OUTPUT_STRIP_TRAILING_WHITESPACE) |
| |
| if(NOT EXISTS "${LLVMLLD_LINKER}") |
| # Need to clear it or else find_program() won't replace the value. |
| set(LLVMLLD_LINKER) |
| |
| if(DEFINED TOOLCHAIN_HOME) |
| # Search for linker under TOOLCHAIN_HOME if it is defined |
| # to limit which linker to use, or else we would be using |
| # host tools. |
| set(LLD_SEARCH_PATH PATHS ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) |
| endif() |
| |
| # Note that, although there is lld, it cannot be used directly |
| # as it would complain about it not being a generic linker, |
| # and asks you to use ld.lld instead. So do not search for lld. |
| find_program(LLVMLLD_LINKER ld.lld ${LLD_SEARCH_PATH}) |
| endif() |
| |
| if(LLVMLLD_LINKER) |
| # Parse the 'ld.lld --version' output to find the installed version. |
| execute_process( |
| COMMAND |
| ${LLVMLLD_LINKER} --version |
| OUTPUT_VARIABLE llvmlld_version_output |
| ERROR_VARIABLE llvmlld_error_output |
| RESULT_VARIABLE llvmlld_status |
| ) |
| |
| set(LLVMLLD_VERSION_STRING) |
| if(${llvmlld_status} EQUAL 0) |
| # Extract GNU ld version. Different distros have their |
| # own version scheme so we need to account for that. |
| # Examples: |
| # - "GNU ld (GNU Binutils for Ubuntu) 2.34" |
| # - "GNU ld (Zephyr SDK 0.15.2) 2.38" |
| # - "GNU ld (Gentoo 2.39 p5) 2.39.0" |
| string(REGEX MATCH |
| "LLD ([0-9]+[.][0-9]+[.]?[0-9]*).*" |
| out_var ${llvmlld_version_output}) |
| set(LLVMLLD_VERSION_STRING ${CMAKE_MATCH_1}) |
| endif() |
| endif() |
| |
| find_package_handle_standard_args(LlvmLld |
| REQUIRED_VARS LLVMLLD_LINKER |
| VERSION_VAR LLVMLLD_VERSION_STRING |
| ) |