diff options
author | Brad King <brad.king@kitware.com> | 2023-12-08 17:45:29 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2023-12-08 20:48:15 (GMT) |
commit | 1e42a0cf1895d7d0c0d3f5baf38c5b8a51c3550a (patch) | |
tree | 8181f0d3118efa1df1669be46d339a261c6fc4bb /Modules | |
parent | 007b2c0efaa3132a4560ee04974096cd0486ea41 (diff) | |
download | CMake-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.cmake | 36 |
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) |