Browse Source

LinkerId: Fix detection of linker tool for MSVC

Previously we matched an entire build system output line and then
extracted the relevant portion in a separate brittle step.  Match
it directly.  Use the `CMAKE_LINKER` value directly if available.
Brad King 1 year ago
parent
commit
455aed3061

+ 3 - 3
Modules/CMakeParseImplicitLinkInfo.cmake

@@ -97,6 +97,8 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex)
         if("${line}" MATCHES " --with-ld=([^ ]+/${linker})( |$)")
           set(linker_tool_fallback "${CMAKE_MATCH_1}")
         endif()
+      elseif("${line}" MATCHES "vs_link.*-- +([^\"]*[/\\](${linker})) ") # cmake -E vs_link_exe
+        set(linker_tool "${CMAKE_MATCH_1}")
       elseif("${line}" MATCHES "${linker_tool_regex}")
         set(linker_tool "${CMAKE_MATCH_2}")
       endif()
@@ -270,9 +272,7 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex)
   endif()
   if(linker_tool)
     if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
-      # pick-up last path
-      string(REGEX REPLACE "^.*([A-Za-z]:[/\\][^:]+)$" "\\1" linker_tool "${linker_tool}")
-      cmake_path(SET linker_tool "${linker_tool}")
+      cmake_path(NORMAL_PATH linker_tool)
     endif()
     string(APPEND log "  linker tool for '${EXTRA_PARSE_LANGUAGE}': ${linker_tool}\n")
   endif()

+ 2 - 2
Tests/RunCMake/ParseImplicitLinkInfo/ParseImplicitLinkInfo.cmake

@@ -173,9 +173,9 @@ foreach(t ${targets})
     # File format
     # file(WRITE ${outfile} "libs=${implicit_libs}\ndirs=${idirs}\nlibrary_arch=${library_arch}\nlinker_tool=${linker_tool}\n")
 
-    if(NOT CMAKE_HOST_WIN32)
+    if(t MATCHES "windows" AND NOT CMAKE_HOST_WIN32)
       string(REPLACE "\\" "/" linker_tool "${linker_tool}")
-      cmake_path(SET linker_tool "${linker_tool}")
+      cmake_path(NORMAL_PATH linker_tool)
     endif()
 
     if(t MATCHES "-empty$")          # empty isn't supposed to parse