authorgravatar for topolarity@tapscott.meCody Tapscott <topolarity@tapscott.me> 2022-07-15 18:51:41-07:00
committergravatar for topolarity@tapscott.meCody Tapscott <topolarity@tapscott.me> 2022-07-23 08:52:30-07:00
log3f640ef3d20db848a4d38299cb66db8a3c14b3b1
tree609b61c97b9a96a8dbcf7160cb73513c497d8b76
parent460211431f407c9f707e3ac3bbff61610a487926

CMake: Improve usage of `llvm-config`, esp. for consistent linking

This commit reworks the LLVM/Clang/LLD discovery process for CMake. The biggest changes are that: 1. We search for LLVM from most preferred directory to least, skipping any `llvm-config` that is the wrong version, or that doesn't support the requested link mode ("static" or "shared"). 2. `ZIG_PREFER_CLANG_CPP_DYLIB` has been renamed to `ZIG_SHARED_LLVM`, to better align with `ZIG_STATIC_LLVM`. 3. We only search for LLVM in the same directory alongside LLVM. 4. LLVM's link mode is forwarded to Clang, so that we can look for the appropriate shared/static libraries. 5. We use `--link-static` when querying `--system-libs` from llvm-config, so that this will include libz and other dependencies for statically linking LLD

4 files changed, 155 insertions(+), 190 deletions(-)

CMakeLists.txt+5-1
...@@ -66,9 +66,9 @@ endif()...@@ -66,9 +66,9 @@ endif()
66message(STATUS "Configuring zig version ${ZIG_VERSION}")66message(STATUS "Configuring zig version ${ZIG_VERSION}")
6767
68set(ZIG_STATIC off CACHE BOOL "Attempt to build a static zig executable (not compatible with glibc)")68set(ZIG_STATIC off CACHE BOOL "Attempt to build a static zig executable (not compatible with glibc)")
69set(ZIG_SHARED_LLVM off CACHE BOOL "Prefer linking against shared LLVM libraries")
69set(ZIG_STATIC_LLVM off CACHE BOOL "Prefer linking against static LLVM libraries")70set(ZIG_STATIC_LLVM off CACHE BOOL "Prefer linking against static LLVM libraries")
70set(ZIG_STATIC_ZLIB off CACHE BOOL "Prefer linking against static zlib")71set(ZIG_STATIC_ZLIB off CACHE BOOL "Prefer linking against static zlib")
71set(ZIG_PREFER_CLANG_CPP_DYLIB off CACHE BOOL "Try to link against -lclang-cpp")
72set(ZIG_USE_CCACHE off CACHE BOOL "Use ccache if available")72set(ZIG_USE_CCACHE off CACHE BOOL "Use ccache if available")
7373
74if(CCACHE_PROGRAM AND ZIG_USE_CCACHE)74if(CCACHE_PROGRAM AND ZIG_USE_CCACHE)
...@@ -80,6 +80,10 @@ if(ZIG_STATIC)...@@ -80,6 +80,10 @@ if(ZIG_STATIC)
80 set(ZIG_STATIC_ZLIB ON)80 set(ZIG_STATIC_ZLIB ON)
81endif()81endif()
8282
83if (ZIG_SHARED_LLVM AND ZIG_STATIC_LLVM)
84 message(SEND_ERROR "-DZIG_SHARED_LLVM and -DZIG_STATIC_LLVM cannot both be enabled simultaneously")
85endif()
86
83string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_LIB_DIR_ESCAPED "${ZIG_LIBC_LIB_DIR}")87string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_LIB_DIR_ESCAPED "${ZIG_LIBC_LIB_DIR}")
84string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_STATIC_LIB_DIR_ESCAPED "${ZIG_LIBC_STATIC_LIB_DIR}")88string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_STATIC_LIB_DIR_ESCAPED "${ZIG_LIBC_STATIC_LIB_DIR}")
85string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_INCLUDE_DIR_ESCAPED "${ZIG_LIBC_INCLUDE_DIR}")89string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_INCLUDE_DIR_ESCAPED "${ZIG_LIBC_INCLUDE_DIR}")
cmake/Findclang.cmake+10-34
...@@ -7,53 +7,29 @@...@@ -7,53 +7,29 @@
7# CLANG_LIBRARIES7# CLANG_LIBRARIES
8# CLANG_LIBDIRS8# CLANG_LIBDIRS
99
10#TODO: FIXME
10find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h11find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h
11 PATHS12 HINTS ${LLVM_INCLUDE_DIRS}
12 /usr/lib/llvm/14/include13 NO_DEFAULT_PATH # Only look for clang next to LLVM
13 /usr/lib/llvm-14/include
14 /usr/lib/llvm-14.0/include
15 /usr/local/llvm140/include
16 /usr/local/llvm14/include
17 /usr/local/opt/llvm@14/include
18 /opt/homebrew/opt/llvm@14/include
19 /mingw64/include
20)14)
2115
22if(ZIG_PREFER_CLANG_CPP_DYLIB)16if(${LLVM_LINK_MODE} STREQUAL "shared")
23 find_library(CLANG_LIBRARIES17 find_library(CLANG_LIBRARIES
24 NAMES18 NAMES
19 libclang-cpp.so.14
25 clang-cpp-14.020 clang-cpp-14.0
26 clang-cpp14021 clang-cpp140
27 clang-cpp22 clang-cpp
28 NAMES_PER_DIR23 NAMES_PER_DIR
29 PATHS24 HINTS "${LLVM_LIBDIRS}"
30 ${CLANG_LIBDIRS}25 NO_DEFAULT_PATH # Only look for Clang next to LLVM
31 /usr/lib/llvm/14/lib
32 /usr/lib/llvm/14/lib64
33 /usr/lib/llvm-14/lib
34 /usr/local/llvm140/lib
35 /usr/local/llvm14/lib
36 /usr/local/opt/llvm@14/lib
37 /opt/homebrew/opt/llvm@14/lib
38 )26 )
39endif()27else()
40
41if(NOT CLANG_LIBRARIES)
42 macro(FIND_AND_ADD_CLANG_LIB _libname_)28 macro(FIND_AND_ADD_CLANG_LIB _libname_)
43 string(TOUPPER ${_libname_} _prettylibname_)29 string(TOUPPER ${_libname_} _prettylibname_)
44 find_library(CLANG_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR30 find_library(CLANG_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR
45 PATHS31 HINTS "${LLVM_LIBDIRS}"
46 ${CLANG_LIBDIRS}32 NO_DEFAULT_PATH # Only look for Clang next to LLVM
47 /usr/lib/llvm/14/lib
48 /usr/lib/llvm-14/lib
49 /usr/lib/llvm-14.0/lib
50 /usr/local/llvm140/lib
51 /usr/local/llvm14/lib
52 /usr/local/opt/llvm@14/lib
53 /opt/homebrew/opt/llvm@14/lib
54 /mingw64/lib
55 /c/msys64/mingw64/lib
56 c:\\msys64\\mingw64\\lib
57 )33 )
58 if(CLANG_${_prettylibname_}_LIB)34 if(CLANG_${_prettylibname_}_LIB)
59 set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_${_prettylibname_}_LIB})35 set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_${_prettylibname_}_LIB})
cmake/Findlld.cmake+10-25
...@@ -7,21 +7,13 @@...@@ -7,21 +7,13 @@
7# LLD_LIBRARIES7# LLD_LIBRARIES
88
9find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h9find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h
10 PATHS10 HINTS ${LLVM_INCLUDE_DIRS}
11 /usr/lib/llvm-14/include11 NO_DEFAULT_PATH # Only look for LLD next to LLVM
12 /usr/local/llvm140/include12)
13 /usr/local/llvm14/include
14 /usr/local/opt/llvm@14/include
15 /opt/homebrew/opt/llvm@14/include
16 /mingw64/include)
1713
18find_library(LLD_LIBRARY NAMES lld-14.0 lld140 lld NAMES_PER_DIR14find_library(LLD_LIBRARY NAMES lld-14.0 lld140 lld NAMES_PER_DIR
19 PATHS15 HINTS ${LLVM_LIBDIRS}
20 /usr/lib/llvm-14/lib16 NO_DEFAULT_PATH # Only look for LLD next to LLVM
21 /usr/local/llvm140/lib
22 /usr/local/llvm14/lib
23 /usr/local/opt/llvm@14/lib
24 /opt/homebrew/opt/llvm@14/lib
25)17)
26if(EXISTS ${LLD_LIBRARY})18if(EXISTS ${LLD_LIBRARY})
27 set(LLD_LIBRARIES ${LLD_LIBRARY})19 set(LLD_LIBRARIES ${LLD_LIBRARY})
...@@ -29,18 +21,11 @@ else()...@@ -29,18 +21,11 @@ else()
29 macro(FIND_AND_ADD_LLD_LIB _libname_)21 macro(FIND_AND_ADD_LLD_LIB _libname_)
30 string(TOUPPER ${_libname_} _prettylibname_)22 string(TOUPPER ${_libname_} _prettylibname_)
31 find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR23 find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR
32 PATHS24 HINTS ${LLVM_LIBDIRS}
33 ${LLD_LIBDIRS}25 NO_DEFAULT_PATH # Only look for LLD next to LLVM
34 /usr/lib/llvm-14/lib26 )
35 /usr/local/llvm140/lib27 if(LLD_${_prettylibname_}_LIB)
36 /usr/local/llvm14/lib28 set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})
37 /usr/local/opt/llvm@14/lib
38 /opt/homebrew/opt/llvm@14/lib
39 /mingw64/lib
40 /c/msys64/mingw64/lib
41 c:/msys64/mingw64/lib)
42 if(LLD_${_prettylibname_}_LIB)
43 set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})
44 endif()29 endif()
45 endmacro(FIND_AND_ADD_LLD_LIB)30 endmacro(FIND_AND_ADD_LLD_LIB)
4631
cmake/Findllvm.cmake+130-130
...@@ -6,175 +6,169 @@...@@ -6,175 +6,169 @@
6# LLVM_INCLUDE_DIRS6# LLVM_INCLUDE_DIRS
7# LLVM_LIBRARIES7# LLVM_LIBRARIES
8# LLVM_LIBDIRS8# LLVM_LIBDIRS
9# LLVM_LINK_MODE
910
10find_path(LLVM_INCLUDE_DIRS NAMES llvm/IR/IRBuilder.h
11 PATHS
12 /usr/lib/llvm/14/include
13 /usr/lib/llvm-14/include
14 /usr/lib/llvm-14.0/include
15 /usr/lib/llvm14/include
16 /usr/local/llvm14/include
17 /usr/local/llvm140/include
18 /usr/local/opt/llvm@14/include
19 /opt/homebrew/opt/llvm@14/include
20 /mingw64/include
21)
2211
23if(ZIG_PREFER_CLANG_CPP_DYLIB)12if(ZIG_USE_LLVM_CONFIG)
24 find_library(LLVM_LIBRARIES13 while(1)
25 NAMES14 unset(LLVM_CONFIG_EXE CACHE)
26 LLVM-14.015 find_program(LLVM_CONFIG_EXE
27 LLVM-1416 NAMES llvm-config-14 llvm-config-14.0 llvm-config140 llvm-config14 llvm-config NAMES_PER_DIR
28 LLVM-14017 PATHS
29 LLVM18 "/mingw64/bin"
30 NAMES_PER_DIR19 "/c/msys64/mingw64/bin"
31 PATHS20 "c:/msys64/mingw64/bin"
32 ${LLVM_LIBDIRS}21 "C:/Libraries/llvm-14.0.0/bin")
33 /usr/lib/llvm/14/lib
34 /usr/lib/llvm/14/lib64
35 /usr/lib/llvm-14/lib
36 /usr/lib/llvm14/lib
37 /usr/local/llvm14/lib
38 /usr/local/llvm140/lib
39 /usr/local/opt/llvm@14/lib
40 /opt/homebrew/opt/llvm@14/lib
41 )
4222
43 find_program(LLVM_CONFIG_EXE23 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
44 NAMES llvm-config-14 llvm-config-14.0 llvm-config140 llvm-config14 llvm-config NAMES_PER_DIR24 if (DEFINED LLVM_CONFIG_ERROR_MESSAGE)
45 PATHS25 message(FATAL_ERROR ${LLVM_CONFIG_ERROR_MESSAGE})
46 "/mingw64/bin"26 else()
47 "/c/msys64/mingw64/bin"27 message(FATAL_ERROR "unable to find llvm-config")
48 "c:/msys64/mingw64/bin"28 endif()
49 "C:/Libraries/llvm-14.0.0/bin")29 endif()
5030
51 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")31 # Check that this LLVM is the right version
52 message(FATAL_ERROR "unable to find llvm-config")32 execute_process(
53 endif()33 COMMAND ${LLVM_CONFIG_EXE} --version
34 OUTPUT_VARIABLE LLVM_CONFIG_VERSION
35 OUTPUT_STRIP_TRAILING_WHITESPACE)
5436
55 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")37 get_filename_component(LLVM_CONFIG_DIR "${LLVM_CONFIG_EXE}" DIRECTORY)
56 message(FATAL_ERROR "unable to find llvm-config")38 if("${LLVM_CONFIG_VERSION}" VERSION_LESS 14 OR "${LLVM_CONFIG_VERSION}" VERSION_EQUAL 15 OR "${LLVM_CONFIG_VERSION}" VERSION_GREATER 15)
57 endif()39 # Save the error message, in case this is the last llvm-config we find
40 set(LLVM_CONFIG_ERROR_MESSAGE "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")
5841
59 execute_process(42 # Ignore this directory and try the search again
60 COMMAND ${LLVM_CONFIG_EXE} --version43 list(APPEND CMAKE_IGNORE_PATH "${LLVM_CONFIG_DIR}")
61 OUTPUT_VARIABLE LLVM_CONFIG_VERSION44 continue()
62 OUTPUT_STRIP_TRAILING_WHITESPACE)45 endif()
6346
64 if("${LLVM_CONFIG_VERSION}" VERSION_LESS 14)47 # Check that this LLVM supports linking as a shared/static library, if requested
65 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")48 if (ZIG_SHARED_LLVM OR ZIG_STATIC_LLVM)
66 endif()49 if (ZIG_SHARED_LLVM)
67 if("${LLVM_CONFIG_VERSION}" VERSION_EQUAL 15)50 set(STATIC_OR_SHARED_LINK "--link-shared")
68 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")51 elseif (ZIG_STATIC_LLVM)
69 endif()52 set(STATIC_OR_SHARED_LINK "--link-static")
70 if("${LLVM_CONFIG_VERSION}" VERSION_GREATER 15)53 endif()
71 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")
72 endif()
73elseif(ZIG_USE_LLVM_CONFIG)
74 find_program(LLVM_CONFIG_EXE
75 NAMES llvm-config-14 llvm-config-14.0 llvm-config140 llvm-config14 llvm-config NAMES_PER_DIR
76 PATHS
77 "/mingw64/bin"
78 "/c/msys64/mingw64/bin"
79 "c:/msys64/mingw64/bin"
80 "C:/Libraries/llvm-14.0.0/bin")
81
82 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
83 message(FATAL_ERROR "unable to find llvm-config")
84 endif()
8554
86 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")55 execute_process(
87 message(FATAL_ERROR "unable to find llvm-config")56 COMMAND ${LLVM_CONFIG_EXE} --libs ${STATIC_OR_SHARED_LINK}
88 endif()57 OUTPUT_QUIET
58 ERROR_VARIABLE LLVM_CONFIG_ERROR
59 OUTPUT_STRIP_TRAILING_WHITESPACE)
8960
90 execute_process(61 if (LLVM_CONFIG_ERROR)
91 COMMAND ${LLVM_CONFIG_EXE} --version62 # Save the error message, in case this is the last llvm-config we find
92 OUTPUT_VARIABLE LLVM_CONFIG_VERSION63 if (ZIG_SHARED_LLVM)
93 OUTPUT_STRIP_TRAILING_WHITESPACE)64 set(LLVM_CONFIG_ERROR_MESSAGE "LLVM 14.x found at ${LLVM_CONFIG_EXE} does not support linking as a shared library")
65 else()
66 set(LLVM_CONFIG_ERROR_MESSAGE "LLVM 14.x found at ${LLVM_CONFIG_EXE} does not support linking as a static library")
67 endif()
9468
95 if("${LLVM_CONFIG_VERSION}" VERSION_LESS 14)69 # Ignore this directory and try the search again
96 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")70 list(APPEND CMAKE_IGNORE_PATH "${LLVM_CONFIG_DIR}")
97 endif()71 continue()
98 if("${LLVM_CONFIG_VERSION}" VERSION_EQUAL 15)72 endif()
99 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")73 endif()
100 endif()
101 if("${LLVM_CONFIG_VERSION}" VERSION_GREATER 15)
102 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")
103 endif()
10474
105 execute_process(75 execute_process(
106 COMMAND ${LLVM_CONFIG_EXE} --targets-built76 COMMAND ${LLVM_CONFIG_EXE} --targets-built
107 OUTPUT_VARIABLE LLVM_TARGETS_BUILT_SPACES77 OUTPUT_VARIABLE LLVM_TARGETS_BUILT_SPACES
108 OUTPUT_STRIP_TRAILING_WHITESPACE)78 OUTPUT_STRIP_TRAILING_WHITESPACE)
109 string(REPLACE " " ";" LLVM_TARGETS_BUILT "${LLVM_TARGETS_BUILT_SPACES}")79 string(REPLACE " " ";" LLVM_TARGETS_BUILT "${LLVM_TARGETS_BUILT_SPACES}")
110 function(NEED_TARGET TARGET_NAME)80 function(NEED_TARGET TARGET_NAME)
111 list (FIND LLVM_TARGETS_BUILT "${TARGET_NAME}" _index)81 list (FIND LLVM_TARGETS_BUILT "${TARGET_NAME}" _index)
112 if (${_index} EQUAL -1)82 if (${_index} EQUAL -1)
113 message(FATAL_ERROR "LLVM (according to ${LLVM_CONFIG_EXE}) is missing target ${TARGET_NAME}. Zig requires LLVM to be built with all default targets enabled.")83 # Save the error message, in case this is the last llvm-config we find
84 set(LLVM_CONFIG_ERROR_MESSAGE "LLVM (according to ${LLVM_CONFIG_EXE}) is missing target ${TARGET_NAME}. Zig requires LLVM to be built with all default targets enabled.")
85
86 # Ignore this directory and try the search again
87 list(APPEND CMAKE_IGNORE_PATH "${LLVM_CONFIG_DIR}")
88 continue()
114 endif()89 endif()
115 endfunction(NEED_TARGET)90 endfunction(NEED_TARGET)
116 NEED_TARGET("AArch64")91 NEED_TARGET("AArch64")
117 NEED_TARGET("AMDGPU")92 NEED_TARGET("AMDGPU")
118 NEED_TARGET("ARM")93 NEED_TARGET("ARM")
119 NEED_TARGET("AVR")94 NEED_TARGET("AVR")
120 NEED_TARGET("BPF")95 NEED_TARGET("BPF")
121 NEED_TARGET("Hexagon")96 NEED_TARGET("Hexagon")
122 NEED_TARGET("Lanai")97 NEED_TARGET("Lanai")
123 NEED_TARGET("Mips")98 NEED_TARGET("Mips")
124 NEED_TARGET("MSP430")99 NEED_TARGET("MSP430")
125 NEED_TARGET("NVPTX")100 NEED_TARGET("NVPTX")
126 NEED_TARGET("PowerPC")101 NEED_TARGET("PowerPC")
127 NEED_TARGET("RISCV")102 NEED_TARGET("RISCV")
128 NEED_TARGET("Sparc")103 NEED_TARGET("Sparc")
129 NEED_TARGET("SystemZ")104 NEED_TARGET("SystemZ")
130 NEED_TARGET("VE")105 NEED_TARGET("VE")
131 NEED_TARGET("WebAssembly")106 NEED_TARGET("WebAssembly")
132 NEED_TARGET("X86")107 NEED_TARGET("X86")
133 NEED_TARGET("XCore")108 NEED_TARGET("XCore")
134109
135 if(ZIG_STATIC_LLVM)110 # Got it!
111 break()
112 endwhile()
113
114 if(ZIG_SHARED_LLVM OR ZIG_STATIC_LLVM)
136 execute_process(115 execute_process(
137 COMMAND ${LLVM_CONFIG_EXE} --libfiles --link-static116 COMMAND ${LLVM_CONFIG_EXE} --libfiles ${STATIC_OR_SHARED_LINK}
138 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES117 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
139 OUTPUT_STRIP_TRAILING_WHITESPACE)118 OUTPUT_STRIP_TRAILING_WHITESPACE)
140 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")119 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
141120
142 execute_process(121 execute_process(
143 COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static122 COMMAND ${LLVM_CONFIG_EXE} --libdir ${STATIC_OR_SHARED_LINK}
144 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
145 OUTPUT_STRIP_TRAILING_WHITESPACE)
146 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
147
148 execute_process(
149 COMMAND ${LLVM_CONFIG_EXE} --libdir --link-static
150 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES123 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
151 OUTPUT_STRIP_TRAILING_WHITESPACE)124 OUTPUT_STRIP_TRAILING_WHITESPACE)
152 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")125 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
153 endif()126
154 if(NOT LLVM_LIBRARIES)127 execute_process(
128 COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK}
129 OUTPUT_VARIABLE LLVM_LINK_MODE
130 OUTPUT_STRIP_TRAILING_WHITESPACE)
131 else()
155 execute_process(132 execute_process(
156 COMMAND ${LLVM_CONFIG_EXE} --libs133 COMMAND ${LLVM_CONFIG_EXE} --libs
157 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES134 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
158 OUTPUT_STRIP_TRAILING_WHITESPACE)135 OUTPUT_STRIP_TRAILING_WHITESPACE)
159 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")136 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
160137
161 execute_process(
162 COMMAND ${LLVM_CONFIG_EXE} --system-libs
163 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
164 OUTPUT_STRIP_TRAILING_WHITESPACE)
165 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
166
167 execute_process(138 execute_process(
168 COMMAND ${LLVM_CONFIG_EXE} --libdir139 COMMAND ${LLVM_CONFIG_EXE} --libdir
169 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES140 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
170 OUTPUT_STRIP_TRAILING_WHITESPACE)141 OUTPUT_STRIP_TRAILING_WHITESPACE)
171 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")142 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
143
144 execute_process(
145 COMMAND ${LLVM_CONFIG_EXE} --shared-mode
146 OUTPUT_VARIABLE LLVM_LINK_MODE
147 OUTPUT_STRIP_TRAILING_WHITESPACE)
172 endif()148 endif()
173149
150 # We always ask for the system libs corresponding to static linking,
151 # since we always statically link LLD which needs these libraries
152 execute_process(
153 COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
154 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
155 OUTPUT_STRIP_TRAILING_WHITESPACE)
156 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
157
174 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})158 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
175159
160 execute_process(
161 COMMAND ${LLVM_CONFIG_EXE} --includedir
162 OUTPUT_VARIABLE LLVM_INCLUDE_DIRS_SPACES
163 OUTPUT_STRIP_TRAILING_WHITESPACE)
164 string(REPLACE " " ";" LLVM_INCLUDE_DIRS "${LLVM_INCLUDE_DIRS_SPACES}")
165
176 if(NOT LLVM_LIBRARIES)166 if(NOT LLVM_LIBRARIES)
177 find_library(LLVM_LIBRARIES NAMES LLVM LLVM-14 LLVM-14.0 NAMES_PER_DIR)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
178 endif()172 endif()
179173
180 link_directories("${CMAKE_PREFIX_PATH}/lib")174 link_directories("${CMAKE_PREFIX_PATH}/lib")
...@@ -185,10 +179,13 @@ else()...@@ -185,10 +179,13 @@ else()
185179
186 macro(FIND_AND_ADD_LLVM_LIB _libname_)180 macro(FIND_AND_ADD_LLVM_LIB _libname_)
187 string(TOUPPER ${_libname_} _prettylibname_)181 string(TOUPPER ${_libname_} _prettylibname_)
188 find_library(LLVM_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR PATHS ${LLVM_LIBDIRS})182 find_library(LLVM_${_prettylibname_}_LIB
183 NAMES ${_libname_} NAMES_PER_DIR)
189 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_${_prettylibname_}_LIB})184 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_${_prettylibname_}_LIB})
190 endmacro(FIND_AND_ADD_LLVM_LIB)185 endmacro(FIND_AND_ADD_LLVM_LIB)
191186
187 set(LLVM_LINK_MODE "static")
188
192 # This list can be re-generated with `llvm-config --libfiles` and then189 # This list can be re-generated with `llvm-config --libfiles` and then
193 # reformatting using your favorite text editor. Note we do not execute190 # reformatting using your favorite text editor. Note we do not execute
194 # `llvm-config` here because we are cross compiling.191 # `llvm-config` here because we are cross compiling.
...@@ -352,6 +349,9 @@ else()...@@ -352,6 +349,9 @@ else()
352 FIND_AND_ADD_LLVM_LIB(LLVMBinaryFormat)349 FIND_AND_ADD_LLVM_LIB(LLVMBinaryFormat)
353 FIND_AND_ADD_LLVM_LIB(LLVMSupport)350 FIND_AND_ADD_LLVM_LIB(LLVMSupport)
354 FIND_AND_ADD_LLVM_LIB(LLVMDemangle)351 FIND_AND_ADD_LLVM_LIB(LLVMDemangle)
352
353 get_filename_component(LLVM_LIBDIRS "${LLVM_LLVMCORE_LIB}" DIRECTORY)
354 find_path(LLVM_INCLUDE_DIRS NAMES llvm/IR/IRBuilder.h)
355endif()355endif()
356356
357include(FindPackageHandleStandardArgs)357include(FindPackageHandleStandardArgs)