From 357db6c5e0d571c2e2eb72bfcbdd2fefe72014ca Mon Sep 17 00:00:00 2001 From: Roland Kaufmann Date: Fri, 5 Jul 2013 12:44:04 +0200 Subject: [PATCH] Add function to detect linker version The linker that is used (ld vs. gold for instance) is often hidden when using the compiler as a front-end (to include the correct runtime libraries). These functions enables us to probe the linker version and reports its finding in the log. --- cmake/Modules/UseCompVer.cmake | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/cmake/Modules/UseCompVer.cmake b/cmake/Modules/UseCompVer.cmake index 461898ef..cf0e3772 100644 --- a/cmake/Modules/UseCompVer.cmake +++ b/cmake/Modules/UseCompVer.cmake @@ -45,3 +45,34 @@ function (compiler_info) message (STATUS "GNU C++ compiler version: ${version}") endif (CMAKE_COMPILER_IS_GNUCXX) endfunction (compiler_info) + +function (get_ld_version ver_name) + # run linker to get the version number. interestingly, this option works + # (for our purposes) on all major platforms (Linux, Mac OS X and Windows); + # it returns the program version although it may have ended in error + exec_program (${CMAKE_LINKER} + ARGS "-v" + OUTPUT_VARIABLE _version + ) + + # keep only first line, even on Mac OS X there is no line end + list (GET _version 0 _version) + + # format of the version string is platform-specific + if (NOT WIN32) + if (APPLE) + string (REGEX REPLACE ".*, from Apple (.*\)" "\\1" _version "${_version}") + else (APPLE) + # assuming some GNU toolchain now + string (REGEX REPLACE "GNU ([a-zA-Z0-9_]*) \\(.*\\) (.*)" "\\1 \\2" _version "${_version}") + endif (APPLE) + endif (NOT WIN32) + + # return the string to the caller + set (${ver_name} "${_version}" PARENT_SCOPE) +endfunction (get_ld_version ver_name) + +function (linker_info) + get_ld_version (version) + message (STATUS "Linker: ${version}") +endfunction (linker_info)