This is an automated email from the ASF dual-hosted git repository.

alexey pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git


The following commit(s) were added to refs/heads/master by this push:
     new 092d0e5  [cmake_modules] fix linker probing on macOS
092d0e5 is described below

commit 092d0e535ac1c86d9f85f2987f42cb92fb352984
Author: Alexey Serbin <[email protected]>
AuthorDate: Sun Jan 26 10:42:14 2020 -0800

    [cmake_modules] fix linker probing on macOS
    
    Fixed linkage on macOS: as of now, using system ld64 linker.  It turned
    out that LLD linker from thirdparty ld64.lld not fully functional yet
    to link Kudu binaries.  At least, it doesn't support the -U flag which
    is used for the KRB5_REALM_OVERRIDE hack.
    
    This is a follow-up to 638d95d295da0bddf3fa157792ec7de8889ac919.
    
    Change-Id: I5c0ef0104388438f444b1f8ac76ca5ebf4cc2928
    Reviewed-on: http://gerrit.cloudera.org:8080/15107
    Tested-by: Alexey Serbin <[email protected]>
    Reviewed-by: Andrew Wong <[email protected]>
---
 cmake_modules/KuduLinker.cmake | 89 +++++++++++++++++++++++++++---------------
 1 file changed, 58 insertions(+), 31 deletions(-)

diff --git a/cmake_modules/KuduLinker.cmake b/cmake_modules/KuduLinker.cmake
index f2b2ac4..c447c73 100644
--- a/cmake_modules/KuduLinker.cmake
+++ b/cmake_modules/KuduLinker.cmake
@@ -20,13 +20,20 @@ function(APPEND_LINKER_FLAGS)
   # Search candidate linkers in the order of decreasing speed and 
functionality.
   # In particular, lld is the best choice since it's quite fast and supports
   # ThinLTO, etc.
-  foreach(candidate_linker lld "${THIRDPARTY_TOOLCHAIN_DIR}/bin/ld.lld" gold 
default)
+  #
+  # On macOS, LLD from third-party ${THIRDPARTY_TOOLCHAIN_DIR}/bin/ld64.lld
+  # isn't fully functional yet: it doesn't support -U option, etc.
+  if (NOT APPLE)
+    set(linkers "lld" "${THIRDPARTY_TOOLCHAIN_DIR}/bin/ld.lld" "gold")
+  endif()
+  list(APPEND linkers "default")
+  foreach(candidate_linker ${linkers})
     if(candidate_linker STREQUAL "default")
-      set(candidate_flag "")
+      set(candidate_flags "")
     else()
-      set(candidate_flag "-fuse-ld=${candidate_linker}")
+      set(candidate_flags "-fuse-ld=${candidate_linker}")
     endif()
-    GET_LINKER_VERSION("${candidate_flag}")
+    GET_LINKER_VERSION("${candidate_flags}")
     if(NOT LINKER_FOUND)
       continue()
     endif()
@@ -72,7 +79,7 @@ function(APPEND_LINKER_FLAGS)
       message(WARNING "Cannot use lld < 10.0.0 with TSAN/ASAN/UBSAN. 
Skipping...")
       continue()
     endif()
-    set(linker_flags "${candidate_flag}")
+    set(linker_flags "${candidate_flags}")
     break()
   endforeach()
 
@@ -90,65 +97,85 @@ endfunction()
 #
 # Sets the following variables:
 #   LINKER_FOUND: true/false
-#   LINKER_FAMILY: lld/ld/gold
+# When LINKER_FOUND is true, additionally sets the following variables:
+#   LINKER_FAMILY: lld/ld/gold on Linux, ld64 on macOS
 #   LINKER_VERSION: version number of the linker
 # Any additional arguments are passed verbatim into the C++ compiler 
invocation.
 function(GET_LINKER_VERSION)
   if(ARGN)
-    message(STATUS "Checking linker version with cflags: ${ARGN}")
+    message(STATUS "Checking linker version with flags: ${ARGN}")
   else()
     message(STATUS "Checking linker version when not specifying any flags")
   endif()
-  execute_process(COMMAND ${CMAKE_CXX_COMPILER} "-Wl,--version" ${ARGN}
-    ERROR_QUIET
-    OUTPUT_VARIABLE LINKER_OUTPUT)
-  if (LINKER_OUTPUT MATCHES "GNU gold")
-    # We're expecting LINKER_OUTPUT to look like one of these:
+  if (APPLE)
+    set(ld_version_flag "-v,-bundle")
+  else()
+    set(ld_version_flag "--version")
+  endif()
+  execute_process(
+    COMMAND ${CMAKE_CXX_COMPILER} "-Wl,${ld_version_flag}" ${ARGN}
+    ERROR_VARIABLE LINKER_STDERR
+    OUTPUT_VARIABLE LINKER_STDOUT
+    RESULT_VARIABLE LINKER_EXITCODE)
+  if (NOT LINKER_EXITCODE EQUAL 0)
+    set(LINKER_FOUND FALSE)
+  elseif (LINKER_STDOUT MATCHES "GNU gold")
+    # We're expecting LINKER_STDOUT to look like one of these:
     #   GNU gold (version 2.24) 1.11
     #   GNU gold (GNU Binutils for Ubuntu 2.30) 1.15
-    if (NOT "${LINKER_OUTPUT}" MATCHES "GNU gold \\([^\\)]*\\) 
(([0-9]+\\.?)+)")
+    if (NOT "${LINKER_STDOUT}" MATCHES "GNU gold \\([^\\)]*\\) 
(([0-9]+\\.?)+)")
       message(SEND_ERROR "Could not extract GNU gold version. "
-        "Linker version output: ${LINKER_OUTPUT}")
+        "Linker version output: ${LINKER_STDOUT}")
     endif()
+    set(LINKER_FOUND TRUE)
     set(LINKER_FAMILY "gold")
     set(LINKER_VERSION "${CMAKE_MATCH_1}")
-    set(LINKER_FOUND TRUE)
-  elseif (LINKER_OUTPUT MATCHES "GNU ld")
-    # We're expecting LINKER_OUTPUT to look like one of these:
+  elseif (LINKER_STDOUT MATCHES "GNU ld")
+    # We're expecting LINKER_STDOUT to look like one of these:
     #   GNU ld (GNU Binutils for Ubuntu) 2.30
     #   GNU ld version 2.20.51.0.2-5.42.el6 20100205
     #   GNU ld version 2.25.1-22.base.el7
-    if (NOT "${LINKER_OUTPUT}" MATCHES "GNU ld version (([0-9]+\\.?)+)" AND
-        NOT "${LINKER_OUTPUT}" MATCHES "GNU ld \\([^\\)]*\\) (([0-9]+\\.?)+)")
+    if (NOT "${LINKER_STDOUT}" MATCHES "GNU ld version (([0-9]+\\.?)+)" AND
+        NOT "${LINKER_STDOUT}" MATCHES "GNU ld \\([^\\)]*\\) (([0-9]+\\.?)+)")
       message(SEND_ERROR "Could not extract GNU ld version. "
-        "Linker version output: ${LINKER_OUTPUT}")
+        "Linker version output: ${LINKER_STDOUT}")
     endif()
+    set(LINKER_FOUND TRUE)
     set(LINKER_FAMILY "ld")
     set(LINKER_VERSION "${CMAKE_MATCH_1}")
-    set(LINKER_FOUND TRUE)
-  elseif (LINKER_OUTPUT MATCHES "LLD")
+  elseif (LINKER_STDOUT MATCHES "LLD")
     # Sample:
     #   LLD 9.0.0 (example.com:kudu.git 
a5848a4c3c8c72a1ac823182e87cd1f6c31ddc15) (compatible with GNU linkers)
-    if (NOT "${LINKER_OUTPUT}" MATCHES "LLD (([0-9]+\\.?)+)")
+    if (NOT "${LINKER_STDOUT}" MATCHES "LLD (([0-9]+\\.?)+)")
       message(SEND_ERROR "Could not extract lld version. "
-        "Linker version output: ${LINKER_OUTPUT}")
+        "Linker version output: ${LINKER_STDOUT}")
     endif()
+    set(LINKER_FOUND TRUE)
     set(LINKER_FAMILY "lld")
     set(LINKER_VERSION "${CMAKE_MATCH_1}")
+  elseif (LINKER_STDERR MATCHES "PROJECT:ld64")
+    # ld64 outputs the versioning information into stderr.
+    # Sample:
+    #   @(#)PROGRAM:ld  PROJECT:ld64-409.12
+    if (NOT "${LINKER_STDERR}" MATCHES "PROJECT:ld64-([0-9]+\\.[0-9]+)")
+      message(SEND_ERROR "Could not extract ld64 version. "
+        "Linker version output: ${LINKER_STDOUT}")
+    endif()
     set(LINKER_FOUND TRUE)
+    set(LINKER_FAMILY "ld64")
+    set(LINKER_VERSION "${CMAKE_MATCH_1}")
   else()
-    set(LINKER_FAMILY "")
-    set(LINKER_VERSION "")
     set(LINKER_FOUND FALSE)
   endif()
 
-  if(LINKER_FOUND)
-    message(STATUS "Found linker: ${LINKER_FAMILY} version ${LINKER_VERSION}")
-  else()
-    message(STATUS "Linker not found")
-  endif()
   # Propagate the results to the caller.
   set(LINKER_FOUND "${LINKER_FOUND}" PARENT_SCOPE)
   set(LINKER_FAMILY "${LINKER_FAMILY}" PARENT_SCOPE)
   set(LINKER_VERSION "${LINKER_VERSION}" PARENT_SCOPE)
+
+  if (LINKER_FOUND)
+    message(STATUS "Found linker: ${LINKER_FAMILY} version ${LINKER_VERSION}")
+  else()
+    message(STATUS "Linker not found")
+  endif()
 endfunction()

Reply via email to