You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.8 KiB
108 lines
3.8 KiB
8 months ago
|
# 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)
|