# 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 )