From 4113a790b0da56d7081aca52d0ca4e349d27a6a1 Mon Sep 17 00:00:00 2001 From: Cody Tapscott Date: Sat, 16 Jul 2022 08:26:45 -0700 Subject: [PATCH] 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. --- cmake/Findclang.cmake | 1 - cmake/Findlld.cmake | 28 ++++++++++++++++++++++----- cmake/Findllvm.cmake | 44 ++++++++++++++++++++++++++----------------- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/cmake/Findclang.cmake b/cmake/Findclang.cmake index 37097d0c0b..d2b898a74a 100644 --- a/cmake/Findclang.cmake +++ b/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 diff --git a/cmake/Findlld.cmake b/cmake/Findlld.cmake index fed89b6ef5..17e27e10f0 100644 --- a/cmake/Findlld.cmake +++ b/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() diff --git a/cmake/Findllvm.cmake b/cmake/Findllvm.cmake index ba93bd8914..d62a154b84 100644 --- a/cmake/Findllvm.cmake +++ b/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()