|
|
@@ -33,49 +33,43 @@ function(cmake_determine_linker_id lang linker)
|
|
|
set(linker_frontend)
|
|
|
set(linker_version)
|
|
|
|
|
|
- # Compute the linker ID
|
|
|
- if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND linker_desc MATCHES "@\\(#\\)PROGRAM:ld")
|
|
|
+ # Compute the linker ID and version.
|
|
|
+ if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND linker_desc MATCHES "@\\(#\\)PROGRAM:ld.+PROJECT:[a-z0-9]+-([0-9.]+).+")
|
|
|
set(linker_id "AppleClang")
|
|
|
set(linker_frontend "GNU")
|
|
|
- elseif (linker_desc MATCHES "mold \\(sold\\)")
|
|
|
+ set(linker_version "${CMAKE_MATCH_1}")
|
|
|
+ elseif (linker_desc MATCHES "mold \\(sold\\) ([0-9.]+)")
|
|
|
set(linker_id "MOLD")
|
|
|
set(linker_frontend "GNU")
|
|
|
- elseif (linker_desc MATCHES "mold")
|
|
|
+ set(linker_version "${CMAKE_MATCH_1}")
|
|
|
+ elseif (linker_desc MATCHES "mold ([0-9.]+)")
|
|
|
set(linker_id "MOLD")
|
|
|
set(linker_frontend "GNU")
|
|
|
- elseif (linker_desc MATCHES "LLD")
|
|
|
+ set(linker_version "${CMAKE_MATCH_1}")
|
|
|
+ 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()
|
|
|
- elseif (linker_desc MATCHES "GNU ld")
|
|
|
+ elseif (linker_desc MATCHES "GNU ld \\([^)]+\\) ([0-9.]+)")
|
|
|
set(linker_id "GNU")
|
|
|
set(linker_frontend "GNU")
|
|
|
- elseif (linker_desc MATCHES "GNU gold")
|
|
|
+ set(linker_version "${CMAKE_MATCH_1}")
|
|
|
+ elseif (linker_desc MATCHES "GNU gold \\([^)]+\\) ([0-9.]+)")
|
|
|
set(linker_id "GNUgold")
|
|
|
set(linker_frontend "GNU")
|
|
|
- elseif (linker_desc MATCHES "Microsoft \\(R\\) Incremental Linker")
|
|
|
+ set(linker_version "${CMAKE_MATCH_1}")
|
|
|
+ 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}")
|
|
|
else()
|
|
|
# unknown linker
|
|
|
set(linker_id "UNKNOWN")
|
|
|
endif()
|
|
|
|
|
|
- # Get linker version
|
|
|
- if (linker_id STREQUAL "AppleClang")
|
|
|
- string(REGEX REPLACE ".+PROJECT:[a-z0-9]+-([0-9.]+).+" "\\1" linker_version "${linker_desc}")
|
|
|
- elseif (linker_id MATCHES "MOLD|SOLD")
|
|
|
- string(REGEX REPLACE "^mold (\\(sold\\) )?([0-9.]+).+" "\\2" linker_version "${linker_desc}")
|
|
|
- elseif (linker_id STREQUAL "LLD")
|
|
|
- string(REGEX REPLACE ".*LLD ([0-9.]+).*" "\\1" linker_version "${linker_desc}")
|
|
|
- elseif (linker_id MATCHES "(GNU|GOLD)")
|
|
|
- string(REGEX REPLACE "^GNU [^ ]+ \\([^)]+\\) ([0-9.]+).*" "\\1" linker_version "${linker_desc}")
|
|
|
- elseif (linker_id STREQUAL "MSVC")
|
|
|
- string(REGEX REPLACE ".+Linker Version ([0-9.]+).+" "\\1" linker_version "${linker_desc}")
|
|
|
- endif()
|
|
|
-
|
|
|
set(CMAKE_${lang}_COMPILER_LINKER_ID "${linker_id}" PARENT_SCOPE)
|
|
|
if (linker_frontend)
|
|
|
set(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT "${linker_frontend}" PARENT_SCOPE)
|