blob: 45499a5e37adee7fc9809ebb506c861b80fdb49e [file] [log] [blame]
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
# Function to identify the linker. This is used internally by CMake and should
# not be included by user code.
# If successful, sets CMAKE_<lang>_COMPILER_LINKER_ID and
# CMAKE_<lang>_COMPILER_LINKER_VERSION
cmake_policy(PUSH)
cmake_policy(SET CMP0053 NEW)
cmake_policy(SET CMP0054 NEW)
function(cmake_determine_linker_id lang linker)
if (NOT linker)
# linker was not identified
unset(CMAKE_${lang}_COMPILER_LINKER_ID PARENT_SCOPE)
unset(CMAKE_${lang}_COMPILER_LINKER_VERSION PARENT_SCOPE)
unset(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT PARENT_SCOPE)
return()
endif()
set(linker_id)
set(linker_frontend)
set(linker_version)
# Compute the linker ID and version.
foreach(flags IN ITEMS
"-v" # AppleClang, GNU, GNUgold, MOLD
"-V" # AIX, Solaris
"--version" # LLD
)
execute_process(COMMAND "${linker}" ${flags}
OUTPUT_VARIABLE linker_desc
ERROR_VARIABLE linker_desc
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
string(JOIN "\" \"" flags_string ${flags})
string(REGEX REPLACE "\n\n.*" "" linker_desc_head "${linker_desc}")
message(CONFIGURE_LOG
"Running the ${lang} compiler's linker: \"${linker}\" \"${flags_string}\"\n"
"${linker_desc_head}\n"
)
if(CMAKE_EFFECTIVE_SYSTEM_NAME STREQUAL "Apple" AND linker_desc MATCHES "@\\(#\\)PROGRAM:ld.+PROJECT:[a-z0-9]+-([0-9.]+).+")
set(linker_id "AppleClang")
set(linker_frontend "GNU")
set(linker_version "${CMAKE_MATCH_1}")
break()
elseif(linker_desc MATCHES "mold \\(sold\\) ([0-9.]+)")
set(linker_id "MOLD")
set(linker_frontend "GNU")
set(linker_version "${CMAKE_MATCH_1}")
break()
elseif(linker_desc MATCHES "mold ([0-9.]+)")
set(linker_id "MOLD")
set(linker_frontend "GNU")
set(linker_version "${CMAKE_MATCH_1}")
break()
elseif(linker_desc MATCHES "LLD ([0-9.]+)")
set(linker_id "LLD")
set(linker_frontend "GNU")
set(linker_version "${CMAKE_MATCH_1}")
if(WIN32 AND NOT linker_desc MATCHES "compatible with GNU")
set(linker_frontend "MSVC")
endif()
break()
elseif(linker_desc MATCHES "GNU ld (\\([^)]+\\)|version) ([0-9.]+)")
set(linker_id "GNU")
set(linker_frontend "GNU")
set(linker_version "${CMAKE_MATCH_2}")
break()
elseif(linker_desc MATCHES "GNU gold \\([^)]+\\) ([0-9.]+)")
set(linker_id "GNUgold")
set(linker_frontend "GNU")
set(linker_version "${CMAKE_MATCH_1}")
break()
elseif(linker_desc MATCHES "Microsoft \\(R\\) Incremental Linker Version ([0-9.]+)")
set(linker_id "MSVC")
set(linker_frontend "MSVC")
set(linker_version "${CMAKE_MATCH_1}")
break()
elseif (CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND linker_desc MATCHES "Solaris Link Editors: ([0-9.-]+)")
set(linker_id "Solaris")
set(linker_version "${CMAKE_MATCH_1}")
break()
elseif (CMAKE_SYSTEM_NAME STREQUAL "AIX" AND linker_desc MATCHES " LD ([0-9.]+)")
set(linker_id "AIX")
set(linker_version "${CMAKE_MATCH_1}")
break()
endif()
endforeach()
set(CMAKE_${lang}_COMPILER_LINKER_ID "${linker_id}" PARENT_SCOPE)
if (linker_frontend)
set(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT "${linker_frontend}" PARENT_SCOPE)
else()
unset(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT PARENT_SCOPE)
endif()
if (linker_version)
set(CMAKE_${lang}_COMPILER_LINKER_VERSION "${linker_version}" PARENT_SCOPE)
else()
unset(CMAKE_${lang}_COMPILER_LINKER_VERSION PARENT_SCOPE)
endif()
endfunction()
cmake_policy(POP)