diff options
author | Brad King <brad.king@kitware.com> | 2023-12-19 19:32:20 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-01-03 21:24:58 (GMT) |
commit | 78b7ba64941cf6341939a85bd95b79692910cf77 (patch) | |
tree | 350b71f1bd94e8e6bd27933e25d39f1c14e5a4bc | |
parent | dd480e5be58f4c0740c9331e7e1f099cd326ea8c (diff) | |
download | CMake-78b7ba64941cf6341939a85bd95b79692910cf77.zip CMake-78b7ba64941cf6341939a85bd95b79692910cf77.tar.gz CMake-78b7ba64941cf6341939a85bd95b79692910cf77.tar.bz2 |
LinkerId: Fix detection of linker tool for GNU on SunOS sparc32
We do not use `-Wl,-v` on SunOS because not all GNU deployments use the
`collect2` helper, and those that do do not always print the underlying
`ld` command line. Parse the `--with-ld=` option as a fallback.
5 files changed, 15 insertions, 5 deletions
diff --git a/Modules/CMakeParseImplicitLinkInfo.cmake b/Modules/CMakeParseImplicitLinkInfo.cmake index 5234411..b4a7860 100644 --- a/Modules/CMakeParseImplicitLinkInfo.cmake +++ b/Modules/CMakeParseImplicitLinkInfo.cmake @@ -75,8 +75,9 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex) set(linker_regex "^( *|.*[/\\])(${linker}|${startfile}|([^/\\]+-)?ld|collect2)[^/\\]*( |$)") set(linker_exclude_regex "collect2 version |^[A-Za-z0-9_]+=|/ldfe ") set(linker_tool_regex "^[ \t]*(->|\")?[ \t]*(.*[/\\](${linker}))(\"|,| |$)") - set(linker_tool_exclude_regex "cuda-fake-ld|-fuse-ld=|--with-ld=") + set(linker_tool_exclude_regex "cuda-fake-ld|-fuse-ld=") set(linker_tool "NOTFOUND") + set(linker_tool_fallback "") set(link_line_parsed 0) string(APPEND log " link line regex: [${linker_regex}]\n") if(EXTRA_PARSE_COMPUTE_LINKER) @@ -90,6 +91,12 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex) set(linker_tool "${CMAKE_MATCH_1}") elseif("${line}" MATCHES "^export XL_LINKER=(.*/${linker})[ \t]*$") # IBM XL set(linker_tool "${CMAKE_MATCH_1}") + elseif("${line}" MATCHES "--with-ld=") # GNU + # The GNU compiler reports how it was configured. + # This does not account for -fuse-ld= so use it only as a fallback. + if("${line}" MATCHES " --with-ld=([^ ]+/${linker})( |$)") + set(linker_tool_fallback "${CMAKE_MATCH_1}") + endif() elseif("${line}" MATCHES "${linker_tool_regex}") set(linker_tool "${CMAKE_MATCH_2}") endif() @@ -258,6 +265,9 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex) endif() endforeach() + if(NOT linker_tool AND linker_tool_fallback) + set(linker_tool "${linker_tool_fallback}") + endif() if(linker_tool) if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") # pick-up last path diff --git a/Tests/RunCMake/ParseImplicitLinkInfo/results/freebsd-Fortran-GNU-4.6.4.output b/Tests/RunCMake/ParseImplicitLinkInfo/results/freebsd-Fortran-GNU-4.6.4.output index 2641265..41c3c30 100644 --- a/Tests/RunCMake/ParseImplicitLinkInfo/results/freebsd-Fortran-GNU-4.6.4.output +++ b/Tests/RunCMake/ParseImplicitLinkInfo/results/freebsd-Fortran-GNU-4.6.4.output @@ -1,3 +1,3 @@ libs=gfortran;m;gcc_s;gcc;quadmath;m;gcc_s;gcc;c;gcc_s;gcc dirs=/usr/local/lib/gcc46/gcc/x86_64-portbld-freebsd10.0/4.6.4;/usr/local/x86_64-portbld-freebsd10.0/lib;/usr/local/lib/gcc46 -linker_tool= +linker_tool=/usr/local/bin/ld diff --git a/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-C-GNU-5.5.0.output b/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-C-GNU-5.5.0.output index a8ca4c2..3212044 100644 --- a/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-C-GNU-5.5.0.output +++ b/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-C-GNU-5.5.0.output @@ -1,3 +1,3 @@ libs=gcc;c;gcc;c dirs=/lib;/usr/lib;/opt/csw/lib/gcc/sparc-sun-solaris2.10/5.5.0;/opt/csw/sparc-sun-solaris2.10/lib;/opt/csw/lib -linker_tool= +linker_tool=/usr/ccs/bin/ld diff --git a/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-CXX-GNU-5.5.0.output b/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-CXX-GNU-5.5.0.output index d208cd8..742e608 100644 --- a/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-CXX-GNU-5.5.0.output +++ b/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-CXX-GNU-5.5.0.output @@ -1,3 +1,3 @@ libs=stdc\+\+;m;rt;gcc_s;gcc;c;gcc_s;gcc;c dirs=/lib;/usr/lib;/opt/csw/lib/gcc/sparc-sun-solaris2.10/5.5.0;/opt/csw/sparc-sun-solaris2.10/lib;/opt/csw/lib -linker_tool= +linker_tool=/usr/ccs/bin/ld diff --git a/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-Fortran-GNU-5.5.0.output b/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-Fortran-GNU-5.5.0.output index 5230611..7169169 100644 --- a/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-Fortran-GNU-5.5.0.output +++ b/Tests/RunCMake/ParseImplicitLinkInfo/results/sunos5.10_sparc32-Fortran-GNU-5.5.0.output @@ -1,3 +1,3 @@ libs=gfortran;m;gcc_s;gcc;m;gcc_s;gcc;c;gcc_s;gcc;m;gcc_s;gcc;c dirs=/lib;/usr/lib;/opt/csw/lib/gcc/sparc-sun-solaris2.10/5.5.0;/opt/csw/sparc-sun-solaris2.10/lib;/opt/csw/lib -linker_tool= +linker_tool=/usr/ccs/bin/ld |