Преглед на файлове

LinkerId: Match linker id and version more robustly

Extract version number output only after explicitly matching it.
Brad King преди 2 години
родител
ревизия
1e42a0cf18
променени са 1 файла, в които са добавени 15 реда и са изтрити 21 реда
  1. 15 21
      Modules/Internal/CMakeDetermineLinkerId.cmake

+ 15 - 21
Modules/Internal/CMakeDetermineLinkerId.cmake

@@ -33,49 +33,43 @@ function(cmake_determine_linker_id lang linker)
   set(linker_frontend)
   set(linker_frontend)
   set(linker_version)
   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_id "AppleClang")
     set(linker_frontend "GNU")
     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_id "MOLD")
     set(linker_frontend "GNU")
     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_id "MOLD")
     set(linker_frontend "GNU")
     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_id "LLD")
     set(linker_frontend "GNU")
     set(linker_frontend "GNU")
+    set(linker_version "${CMAKE_MATCH_1}")
     if (WIN32 AND NOT linker_desc MATCHES "compatible with GNU")
     if (WIN32 AND NOT linker_desc MATCHES "compatible with GNU")
       set (linker_frontend "MSVC")
       set (linker_frontend "MSVC")
     endif()
     endif()
-  elseif (linker_desc MATCHES "GNU ld")
+  elseif (linker_desc MATCHES "GNU ld \\([^)]+\\) ([0-9.]+)")
     set(linker_id "GNU")
     set(linker_id "GNU")
     set(linker_frontend "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_id "GNUgold")
     set(linker_frontend "GNU")
     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_id "MSVC")
     set(linker_frontend "MSVC")
     set(linker_frontend "MSVC")
+    set(linker_version "${CMAKE_MATCH_1}")
   else()
   else()
     # unknown linker
     # unknown linker
     set(linker_id "UNKNOWN")
     set(linker_id "UNKNOWN")
   endif()
   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)
   set(CMAKE_${lang}_COMPILER_LINKER_ID "${linker_id}" PARENT_SCOPE)
   if (linker_frontend)
   if (linker_frontend)
     set(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT "${linker_frontend}" PARENT_SCOPE)
     set(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT "${linker_frontend}" PARENT_SCOPE)