Commit 4113a790b0

Cody Tapscott <topolarity@tapscott.me>
2022-07-16 17:26:45
CMake: Search more permissively for LLD
This change relaxes the restriction added in the prior commit that LLD should be alongside LLVM. This also leaves unresolved the issue of making sure the link mode (static or shared) of LLD matches that of LLVM/Clang. That would be an unfortunate restriction, since LLD seems to be provided only as a static lib on some distros.
1 parent 3f640ef
cmake/Findclang.cmake
@@ -7,7 +7,6 @@
 # CLANG_LIBRARIES
 # CLANG_LIBDIRS
 
-#TODO: FIXME
 find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h
   HINTS ${LLVM_INCLUDE_DIRS}
   NO_DEFAULT_PATH # Only look for clang next to LLVM
cmake/Findlld.cmake
@@ -8,12 +8,22 @@
 
 find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h
     HINTS ${LLVM_INCLUDE_DIRS}
-    NO_DEFAULT_PATH # Only look for LLD next to LLVM
-)
+    PATHS
+        /usr/lib/llvm-14/include
+        /usr/local/llvm140/include
+        /usr/local/llvm14/include
+        /usr/local/opt/llvm@14/include
+        /opt/homebrew/opt/llvm@14/include
+        /mingw64/include)
 
 find_library(LLD_LIBRARY NAMES lld-14.0 lld140 lld NAMES_PER_DIR
     HINTS ${LLVM_LIBDIRS}
-    NO_DEFAULT_PATH # Only look for LLD next to LLVM
+    PATHS
+        /usr/lib/llvm-14/lib
+        /usr/local/llvm140/lib
+        /usr/local/llvm14/lib
+        /usr/local/opt/llvm@14/lib
+        /opt/homebrew/opt/llvm@14/lib
 )
 if(EXISTS ${LLD_LIBRARY})
     set(LLD_LIBRARIES ${LLD_LIBRARY})
@@ -22,8 +32,16 @@ else()
         string(TOUPPER ${_libname_} _prettylibname_)
         find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR
             HINTS ${LLVM_LIBDIRS}
-            NO_DEFAULT_PATH # Only look for LLD next to LLVM
-        )
+            PATHS
+                ${LLD_LIBDIRS}
+                /usr/lib/llvm-14/lib
+                /usr/local/llvm140/lib
+                /usr/local/llvm14/lib
+                /usr/local/opt/llvm@14/lib
+                /opt/homebrew/opt/llvm@14/lib
+                /mingw64/lib
+                /c/msys64/mingw64/lib
+                c:/msys64/mingw64/lib)
         if(LLD_${_prettylibname_}_LIB)
             set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})
         endif()
cmake/Findllvm.cmake
@@ -56,7 +56,7 @@ if(ZIG_USE_LLVM_CONFIG)
         COMMAND ${LLVM_CONFIG_EXE} --libs ${STATIC_OR_SHARED_LINK}
         OUTPUT_QUIET
         ERROR_VARIABLE LLVM_CONFIG_ERROR
-        OUTPUT_STRIP_TRAILING_WHITESPACE)
+        ERROR_STRIP_TRAILING_WHITESPACE)
 
       if (LLVM_CONFIG_ERROR) 
         # Save the error message, in case this is the last llvm-config we find
@@ -124,6 +124,12 @@ if(ZIG_USE_LLVM_CONFIG)
         OUTPUT_STRIP_TRAILING_WHITESPACE)
     string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
 
+    execute_process(
+        COMMAND ${LLVM_CONFIG_EXE} --system-libs ${STATIC_OR_SHARED_LINK}
+        OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
+        OUTPUT_STRIP_TRAILING_WHITESPACE)
+    string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
+
     execute_process(
       COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK}
       OUTPUT_VARIABLE LLVM_LINK_MODE
@@ -141,21 +147,33 @@ if(ZIG_USE_LLVM_CONFIG)
         OUTPUT_STRIP_TRAILING_WHITESPACE)
     string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
 
+    execute_process(
+        COMMAND ${LLVM_CONFIG_EXE} --system-libs
+        OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
+        OUTPUT_STRIP_TRAILING_WHITESPACE)
+    string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
+
     execute_process(
       COMMAND ${LLVM_CONFIG_EXE} --shared-mode
       OUTPUT_VARIABLE LLVM_LINK_MODE
       OUTPUT_STRIP_TRAILING_WHITESPACE)
   endif()
 
-  # We always ask for the system libs corresponding to static linking,
-  # since we always statically link LLD which needs these libraries
-  execute_process(
-      COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
-      OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
-      OUTPUT_STRIP_TRAILING_WHITESPACE)
-  string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
+  if (${LLVM_LINK_MODE} STREQUAL "shared")
+    # We always ask for the system libs corresponding to static linking,
+    # since on some distros LLD is only available as a static library
+    # and we need these libraries to link it successfully
+    execute_process(
+        COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
+        OUTPUT_VARIABLE LLVM_STATIC_SYSTEM_LIBS_SPACES
+        ERROR_QUIET # Some installations have no static libs, we just ignore the failure
+        OUTPUT_STRIP_TRAILING_WHITESPACE)
+    string(REPLACE " " ";" LLVM_STATIC_SYSTEM_LIBS "${LLVM_STATIC_SYSTEM_LIBS_SPACES}")
 
-  set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
+    set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS} ${LLVM_STATIC_SYSTEM_LIBS})
+  else()
+    set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
+  endif()
 
   execute_process(
       COMMAND ${LLVM_CONFIG_EXE} --includedir
@@ -163,14 +181,6 @@ if(ZIG_USE_LLVM_CONFIG)
       OUTPUT_STRIP_TRAILING_WHITESPACE)
   string(REPLACE " " ";" LLVM_INCLUDE_DIRS "${LLVM_INCLUDE_DIRS_SPACES}")
 
-  if(NOT LLVM_LIBRARIES)
-    find_library(LLVM_LIBRARIES
-      NAMES LLVM LLVM-14 LLVM-14.0 NAMES_PER_DIR
-      HINTS "${LLVM_CONFIG_DIR}/../lib" "${LLVM_CONFIG_DIR}/../lib64" "${LLVM_CONFIG_DIR}/../${CMAKE_LIBRARY_ARCHITECTURE}")
-
-    # TODO: Make this fallthrough work
-  endif()
-
   link_directories("${CMAKE_PREFIX_PATH}/lib")
   link_directories("${LLVM_LIBDIRS}")
 else()