summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-12-08 17:45:29 (GMT)
committerBrad King <brad.king@kitware.com>2023-12-08 20:48:15 (GMT)
commit1e42a0cf1895d7d0c0d3f5baf38c5b8a51c3550a (patch)
tree8181f0d3118efa1df1669be46d339a261c6fc4bb /Modules
parent007b2c0efaa3132a4560ee04974096cd0486ea41 (diff)
downloadCMake-1e42a0cf1895d7d0c0d3f5baf38c5b8a51c3550a.zip
CMake-1e42a0cf1895d7d0c0d3f5baf38c5b8a51c3550a.tar.gz
CMake-1e42a0cf1895d7d0c0d3f5baf38c5b8a51c3550a.tar.bz2
LinkerId: Match linker id and version more robustly
Extract version number output only after explicitly matching it.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/Internal/CMakeDetermineLinkerId.cmake36
1 files changed, 15 insertions, 21 deletions
diff --git a/Modules/Internal/CMakeDetermineLinkerId.cmake b/Modules/Internal/CMakeDetermineLinkerId.cmake
index ab851d7..620da76 100644
--- a/Modules/Internal/CMakeDetermineLinkerId.cmake
+++ b/Modules/Internal/CMakeDetermineLinkerId.cmake
@@ -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)