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.
This commit is contained in:
Cody Tapscott 2022-07-16 08:26:45 -07:00
parent 3f640ef3d2
commit 4113a790b0
3 changed files with 50 additions and 23 deletions

View file

@ -7,7 +7,6 @@
# CLANG_LIBRARIES # CLANG_LIBRARIES
# CLANG_LIBDIRS # CLANG_LIBDIRS
#TODO: FIXME
find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h
HINTS ${LLVM_INCLUDE_DIRS} HINTS ${LLVM_INCLUDE_DIRS}
NO_DEFAULT_PATH # Only look for clang next to LLVM NO_DEFAULT_PATH # Only look for clang next to LLVM

View file

@ -8,12 +8,22 @@
find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h
HINTS ${LLVM_INCLUDE_DIRS} 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 find_library(LLD_LIBRARY NAMES lld-14.0 lld140 lld NAMES_PER_DIR
HINTS ${LLVM_LIBDIRS} 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}) if(EXISTS ${LLD_LIBRARY})
set(LLD_LIBRARIES ${LLD_LIBRARY}) set(LLD_LIBRARIES ${LLD_LIBRARY})
@ -22,8 +32,16 @@ else()
string(TOUPPER ${_libname_} _prettylibname_) string(TOUPPER ${_libname_} _prettylibname_)
find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR
HINTS ${LLVM_LIBDIRS} 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) if(LLD_${_prettylibname_}_LIB)
set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB}) set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})
endif() endif()

View file

@ -56,7 +56,7 @@ if(ZIG_USE_LLVM_CONFIG)
COMMAND ${LLVM_CONFIG_EXE} --libs ${STATIC_OR_SHARED_LINK} COMMAND ${LLVM_CONFIG_EXE} --libs ${STATIC_OR_SHARED_LINK}
OUTPUT_QUIET OUTPUT_QUIET
ERROR_VARIABLE LLVM_CONFIG_ERROR ERROR_VARIABLE LLVM_CONFIG_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE) ERROR_STRIP_TRAILING_WHITESPACE)
if (LLVM_CONFIG_ERROR) if (LLVM_CONFIG_ERROR)
# Save the error message, in case this is the last llvm-config we find # 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) OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}") 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( execute_process(
COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK} COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK}
OUTPUT_VARIABLE LLVM_LINK_MODE OUTPUT_VARIABLE LLVM_LINK_MODE
@ -141,21 +147,33 @@ if(ZIG_USE_LLVM_CONFIG)
OUTPUT_STRIP_TRAILING_WHITESPACE) OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}") 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( execute_process(
COMMAND ${LLVM_CONFIG_EXE} --shared-mode COMMAND ${LLVM_CONFIG_EXE} --shared-mode
OUTPUT_VARIABLE LLVM_LINK_MODE OUTPUT_VARIABLE LLVM_LINK_MODE
OUTPUT_STRIP_TRAILING_WHITESPACE) OUTPUT_STRIP_TRAILING_WHITESPACE)
endif() endif()
# We always ask for the system libs corresponding to static linking, if (${LLVM_LINK_MODE} STREQUAL "shared")
# since we always statically link LLD which needs these libraries # We always ask for the system libs corresponding to static linking,
execute_process( # since on some distros LLD is only available as a static library
COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static # and we need these libraries to link it successfully
OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES execute_process(
OUTPUT_STRIP_TRAILING_WHITESPACE) COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}") 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( execute_process(
COMMAND ${LLVM_CONFIG_EXE} --includedir COMMAND ${LLVM_CONFIG_EXE} --includedir
@ -163,14 +181,6 @@ if(ZIG_USE_LLVM_CONFIG)
OUTPUT_STRIP_TRAILING_WHITESPACE) OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE " " ";" LLVM_INCLUDE_DIRS "${LLVM_INCLUDE_DIRS_SPACES}") 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("${CMAKE_PREFIX_PATH}/lib")
link_directories("${LLVM_LIBDIRS}") link_directories("${LLVM_LIBDIRS}")
else() else()