From 1e42a0cf1895d7d0c0d3f5baf38c5b8a51c3550a Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 8 Dec 2023 12:45:29 -0500 Subject: LinkerId: Match linker id and version more robustly Extract version number output only after explicitly matching it. --- Modules/Internal/CMakeDetermineLinkerId.cmake | 36 +++++++++++---------------- 1 file 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) -- cgit v0.12