authorgravatar for topolarity@tapscott.meCody Tapscott <topolarity@tapscott.me> 2022-07-16 08:26:45-07:00
committergravatar for topolarity@tapscott.meCody Tapscott <topolarity@tapscott.me> 2022-07-23 08:55:56-07:00
log4113a790b0da56d7081aca52d0ca4e349d27a6a1
treeb43a9874521451f41a06198369fbedf95f30fa4a
parent3f640ef3d20db848a4d38299cb66db8a3c14b3b1

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.

3 files changed, 50 insertions(+), 23 deletions(-)

cmake/Findclang.cmake-1
...@@ -7,7 +7,6 @@...@@ -7,7 +7,6 @@
7# CLANG_LIBRARIES7# CLANG_LIBRARIES
8# CLANG_LIBDIRS8# CLANG_LIBDIRS
99
10#TODO: FIXME
11find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h10find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h
12 HINTS ${LLVM_INCLUDE_DIRS}11 HINTS ${LLVM_INCLUDE_DIRS}
13 NO_DEFAULT_PATH # Only look for clang next to LLVM12 NO_DEFAULT_PATH # Only look for clang next to LLVM
cmake/Findlld.cmake+23-5
...@@ -8,12 +8,22 @@...@@ -8,12 +8,22 @@
88
9find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h9find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h
10 HINTS ${LLVM_INCLUDE_DIRS}10 HINTS ${LLVM_INCLUDE_DIRS}
11 NO_DEFAULT_PATH # Only look for LLD next to LLVM11 PATHS
12)12 /usr/lib/llvm-14/include
13 /usr/local/llvm140/include
14 /usr/local/llvm14/include
15 /usr/local/opt/llvm@14/include
16 /opt/homebrew/opt/llvm@14/include
17 /mingw64/include)
1318
14find_library(LLD_LIBRARY NAMES lld-14.0 lld140 lld NAMES_PER_DIR19find_library(LLD_LIBRARY NAMES lld-14.0 lld140 lld NAMES_PER_DIR
15 HINTS ${LLVM_LIBDIRS}20 HINTS ${LLVM_LIBDIRS}
16 NO_DEFAULT_PATH # Only look for LLD next to LLVM21 PATHS
22 /usr/lib/llvm-14/lib
23 /usr/local/llvm140/lib
24 /usr/local/llvm14/lib
25 /usr/local/opt/llvm@14/lib
26 /opt/homebrew/opt/llvm@14/lib
17)27)
18if(EXISTS ${LLD_LIBRARY})28if(EXISTS ${LLD_LIBRARY})
19 set(LLD_LIBRARIES ${LLD_LIBRARY})29 set(LLD_LIBRARIES ${LLD_LIBRARY})
...@@ -22,8 +32,16 @@ else()...@@ -22,8 +32,16 @@ else()
22 string(TOUPPER ${_libname_} _prettylibname_)32 string(TOUPPER ${_libname_} _prettylibname_)
23 find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR33 find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR
24 HINTS ${LLVM_LIBDIRS}34 HINTS ${LLVM_LIBDIRS}
25 NO_DEFAULT_PATH # Only look for LLD next to LLVM35 PATHS
26 )36 ${LLD_LIBDIRS}
37 /usr/lib/llvm-14/lib
38 /usr/local/llvm140/lib
39 /usr/local/llvm14/lib
40 /usr/local/opt/llvm@14/lib
41 /opt/homebrew/opt/llvm@14/lib
42 /mingw64/lib
43 /c/msys64/mingw64/lib
44 c:/msys64/mingw64/lib)
27 if(LLD_${_prettylibname_}_LIB)45 if(LLD_${_prettylibname_}_LIB)
28 set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})46 set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})
29 endif()47 endif()
cmake/Findllvm.cmake+27-17
...@@ -56,7 +56,7 @@ if(ZIG_USE_LLVM_CONFIG)...@@ -56,7 +56,7 @@ if(ZIG_USE_LLVM_CONFIG)
56 COMMAND ${LLVM_CONFIG_EXE} --libs ${STATIC_OR_SHARED_LINK}56 COMMAND ${LLVM_CONFIG_EXE} --libs ${STATIC_OR_SHARED_LINK}
57 OUTPUT_QUIET57 OUTPUT_QUIET
58 ERROR_VARIABLE LLVM_CONFIG_ERROR58 ERROR_VARIABLE LLVM_CONFIG_ERROR
59 OUTPUT_STRIP_TRAILING_WHITESPACE)59 ERROR_STRIP_TRAILING_WHITESPACE)
6060
61 if (LLVM_CONFIG_ERROR) 61 if (LLVM_CONFIG_ERROR)
62 # Save the error message, in case this is the last llvm-config we find62 # Save the error message, in case this is the last llvm-config we find
...@@ -124,6 +124,12 @@ if(ZIG_USE_LLVM_CONFIG)...@@ -124,6 +124,12 @@ if(ZIG_USE_LLVM_CONFIG)
124 OUTPUT_STRIP_TRAILING_WHITESPACE)124 OUTPUT_STRIP_TRAILING_WHITESPACE)
125 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")125 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
126126
127 execute_process(
128 COMMAND ${LLVM_CONFIG_EXE} --system-libs ${STATIC_OR_SHARED_LINK}
129 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
130 OUTPUT_STRIP_TRAILING_WHITESPACE)
131 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
132
127 execute_process(133 execute_process(
128 COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK}134 COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK}
129 OUTPUT_VARIABLE LLVM_LINK_MODE135 OUTPUT_VARIABLE LLVM_LINK_MODE
...@@ -141,21 +147,33 @@ if(ZIG_USE_LLVM_CONFIG)...@@ -141,21 +147,33 @@ if(ZIG_USE_LLVM_CONFIG)
141 OUTPUT_STRIP_TRAILING_WHITESPACE)147 OUTPUT_STRIP_TRAILING_WHITESPACE)
142 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")148 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
143149
150 execute_process(
151 COMMAND ${LLVM_CONFIG_EXE} --system-libs
152 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
153 OUTPUT_STRIP_TRAILING_WHITESPACE)
154 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
155
144 execute_process(156 execute_process(
145 COMMAND ${LLVM_CONFIG_EXE} --shared-mode157 COMMAND ${LLVM_CONFIG_EXE} --shared-mode
146 OUTPUT_VARIABLE LLVM_LINK_MODE158 OUTPUT_VARIABLE LLVM_LINK_MODE
147 OUTPUT_STRIP_TRAILING_WHITESPACE)159 OUTPUT_STRIP_TRAILING_WHITESPACE)
148 endif()160 endif()
149161
150 # We always ask for the system libs corresponding to static linking,162 if (${LLVM_LINK_MODE} STREQUAL "shared")
151 # since we always statically link LLD which needs these libraries163 # We always ask for the system libs corresponding to static linking,
152 execute_process(164 # since on some distros LLD is only available as a static library
153 COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static165 # and we need these libraries to link it successfully
154 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES166 execute_process(
155 OUTPUT_STRIP_TRAILING_WHITESPACE)167 COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
156 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")168 OUTPUT_VARIABLE LLVM_STATIC_SYSTEM_LIBS_SPACES
169 ERROR_QUIET # Some installations have no static libs, we just ignore the failure
170 OUTPUT_STRIP_TRAILING_WHITESPACE)
171 string(REPLACE " " ";" LLVM_STATIC_SYSTEM_LIBS "${LLVM_STATIC_SYSTEM_LIBS_SPACES}")
157172
158 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})173 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS} ${LLVM_STATIC_SYSTEM_LIBS})
174 else()
175 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
176 endif()
159177
160 execute_process(178 execute_process(
161 COMMAND ${LLVM_CONFIG_EXE} --includedir179 COMMAND ${LLVM_CONFIG_EXE} --includedir
...@@ -163,14 +181,6 @@ if(ZIG_USE_LLVM_CONFIG)...@@ -163,14 +181,6 @@ if(ZIG_USE_LLVM_CONFIG)
163 OUTPUT_STRIP_TRAILING_WHITESPACE)181 OUTPUT_STRIP_TRAILING_WHITESPACE)
164 string(REPLACE " " ";" LLVM_INCLUDE_DIRS "${LLVM_INCLUDE_DIRS_SPACES}")182 string(REPLACE " " ";" LLVM_INCLUDE_DIRS "${LLVM_INCLUDE_DIRS_SPACES}")
165183
166 if(NOT LLVM_LIBRARIES)
167 find_library(LLVM_LIBRARIES
168 NAMES LLVM LLVM-14 LLVM-14.0 NAMES_PER_DIR
169 HINTS "${LLVM_CONFIG_DIR}/../lib" "${LLVM_CONFIG_DIR}/../lib64" "${LLVM_CONFIG_DIR}/../${CMAKE_LIBRARY_ARCHITECTURE}")
170
171 # TODO: Make this fallthrough work
172 endif()
173
174 link_directories("${CMAKE_PREFIX_PATH}/lib")184 link_directories("${CMAKE_PREFIX_PATH}/lib")
175 link_directories("${LLVM_LIBDIRS}")185 link_directories("${LLVM_LIBDIRS}")
176else()186else()