authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-26 11:41:00-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-07-26 11:41:00-07:00
log7a09bce2328e79a5f24ca207974287a4fba546bd
treee0a3cee17801163d51b58810d2f0b367d13832ee
parent0ffcf19e3d19ddd8c5f89d6ac8ff5a1d77666279
parentabc1ae538fee14af12bb5ffd35024d96da861961
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #12136 from topolarity/llvm-config-rework

CMake: Improve usage of `llvm-config` (esp. for consistent static/shared linking)

6 files changed, 173 insertions(+), 165 deletions(-)

CMakeLists.txt+5-1
......@@ -66,9 +66,9 @@ endif()
6666message(STATUS "Configuring zig version ${ZIG_VERSION}")
6767
6868set(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")
6970set(ZIG_STATIC_LLVM off CACHE BOOL "Prefer linking against static LLVM libraries")
7071set(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")
7272set(ZIG_USE_CCACHE off CACHE BOOL "Use ccache if available")
7373
7474if(CCACHE_PROGRAM AND ZIG_USE_CCACHE)
......@@ -80,6 +80,10 @@ if(ZIG_STATIC)
8080 set(ZIG_STATIC_ZLIB ON)
8181endif()
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
8387string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_LIB_DIR_ESCAPED "${ZIG_LIBC_LIB_DIR}")
8488string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_STATIC_LIB_DIR_ESCAPED "${ZIG_LIBC_STATIC_LIB_DIR}")
8589string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_INCLUDE_DIR_ESCAPED "${ZIG_LIBC_INCLUDE_DIR}")
build.zig+9
......@@ -676,6 +676,7 @@ fn addCMakeLibraryList(exe: *std.build.LibExeObjStep, list: []const u8) void {
676676}
677677
678678const CMakeConfig = struct {
679 llvm_linkage: std.build.LibExeObjStep.Linkage,
679680 cmake_binary_dir: []const u8,
680681 cmake_prefix_path: []const u8,
681682 cxx_compiler: []const u8,
......@@ -714,6 +715,7 @@ fn findAndParseConfigH(b: *Builder, config_h_path_option: ?[]const u8) ?CMakeCon
714715 };
715716
716717 var ctx: CMakeConfig = .{
718 .llvm_linkage = undefined,
717719 .cmake_binary_dir = undefined,
718720 .cmake_prefix_path = undefined,
719721 .cxx_compiler = undefined,
......@@ -757,6 +759,7 @@ fn findAndParseConfigH(b: *Builder, config_h_path_option: ?[]const u8) ?CMakeCon
757759 .prefix = "#define ZIG_DIA_GUIDS_LIB ",
758760 .field = "dia_guids_lib",
759761 },
762 // .prefix = ZIG_LLVM_LINK_MODE parsed manually below
760763 };
761764
762765 var lines_it = mem.tokenize(u8, config_h_text, "\r\n");
......@@ -769,6 +772,12 @@ fn findAndParseConfigH(b: *Builder, config_h_path_option: ?[]const u8) ?CMakeCon
769772 @field(ctx, mapping.field) = toNativePathSep(b, quoted);
770773 }
771774 }
775 if (mem.startsWith(u8, line, "#define ZIG_LLVM_LINK_MODE ")) {
776 var it = mem.split(u8, line, "\"");
777 _ = it.next().?; // skip the stuff before the quote
778 const quoted = it.next().?; // the stuff inside the quote
779 ctx.llvm_linkage = if (mem.eql(u8, quoted, "shared")) .dynamic else .static;
780 }
772781 }
773782 return ctx;
774783}
cmake/Findclang.cmake+15-34
......@@ -8,52 +8,33 @@
88# CLANG_LIBDIRS
99
1010find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h
11 PATHS
12 /usr/lib/llvm/14/include
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
11 HINTS ${LLVM_INCLUDE_DIRS}
12 # Only look for Clang next to LLVM or in { CMAKE_PREFIX_PATH, CMAKE_LIBRARY_PATH, CMAKE_FRAMEWORK_PATH }
13 NO_SYSTEM_ENVIRONMENT_PATH
14 NO_CMAKE_SYSTEM_PATH
2015)
2116
22if(ZIG_PREFER_CLANG_CPP_DYLIB)
17if(${LLVM_LINK_MODE} STREQUAL "shared")
2318 find_library(CLANG_LIBRARIES
2419 NAMES
20 libclang-cpp.so.14
2521 clang-cpp-14.0
2622 clang-cpp140
2723 clang-cpp
2824 NAMES_PER_DIR
29 PATHS
30 ${CLANG_LIBDIRS}
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
25 HINTS "${LLVM_LIBDIRS}"
26 # Only look for Clang next to LLVM or in { CMAKE_PREFIX_PATH, CMAKE_LIBRARY_PATH, CMAKE_FRAMEWORK_PATH }
27 NO_SYSTEM_ENVIRONMENT_PATH
28 NO_CMAKE_SYSTEM_PATH
3829 )
39endif()
40
41if(NOT CLANG_LIBRARIES)
30else()
4231 macro(FIND_AND_ADD_CLANG_LIB _libname_)
4332 string(TOUPPER ${_libname_} _prettylibname_)
4433 find_library(CLANG_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR
45 PATHS
46 ${CLANG_LIBDIRS}
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
34 HINTS "${LLVM_LIBDIRS}"
35 # Only look for Clang next to LLVM or in { CMAKE_PREFIX_PATH, CMAKE_LIBRARY_PATH, CMAKE_FRAMEWORK_PATH }
36 NO_SYSTEM_ENVIRONMENT_PATH
37 NO_CMAKE_SYSTEM_PATH
5738 )
5839 if(CLANG_${_prettylibname_}_LIB)
5940 set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_${_prettylibname_}_LIB})
cmake/Findlld.cmake+5-2
......@@ -7,6 +7,7 @@
77# LLD_LIBRARIES
88
99find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h
10 HINTS ${LLVM_INCLUDE_DIRS}
1011 PATHS
1112 /usr/lib/llvm-14/include
1213 /usr/local/llvm140/include
......@@ -16,6 +17,7 @@ find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h
1617 /mingw64/include)
1718
1819find_library(LLD_LIBRARY NAMES lld-14.0 lld140 lld NAMES_PER_DIR
20 HINTS ${LLVM_LIBDIRS}
1921 PATHS
2022 /usr/lib/llvm-14/lib
2123 /usr/local/llvm140/lib
......@@ -29,6 +31,7 @@ else()
2931 macro(FIND_AND_ADD_LLD_LIB _libname_)
3032 string(TOUPPER ${_libname_} _prettylibname_)
3133 find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR
34 HINTS ${LLVM_LIBDIRS}
3235 PATHS
3336 ${LLD_LIBDIRS}
3437 /usr/lib/llvm-14/lib
......@@ -39,8 +42,8 @@ else()
3942 /mingw64/lib
4043 /c/msys64/mingw64/lib
4144 c:/msys64/mingw64/lib)
42 if(LLD_${_prettylibname_}_LIB)
43 set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})
45 if(LLD_${_prettylibname_}_LIB)
46 set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})
4447 endif()
4548 endmacro(FIND_AND_ADD_LLD_LIB)
4649
cmake/Findllvm.cmake+138-128
......@@ -6,158 +6,147 @@
66# LLVM_INCLUDE_DIRS
77# LLVM_LIBRARIES
88# 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)
24 find_library(LLVM_LIBRARIES
25 NAMES
26 LLVM-14.0
27 LLVM-14
28 LLVM-140
29 LLVM
30 NAMES_PER_DIR
31 PATHS
32 ${LLVM_LIBDIRS}
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 )
12if(ZIG_USE_LLVM_CONFIG)
13 while(1)
14 unset(LLVM_CONFIG_EXE CACHE)
15 find_program(LLVM_CONFIG_EXE
16 NAMES llvm-config-14 llvm-config-14.0 llvm-config140 llvm-config14 llvm-config NAMES_PER_DIR
17 PATHS
18 "/mingw64/bin"
19 "/c/msys64/mingw64/bin"
20 "c:/msys64/mingw64/bin"
21 "C:/Libraries/llvm-14.0.0/bin")
4222
43 find_program(LLVM_CONFIG_EXE
44 NAMES llvm-config-14 llvm-config-14.0 llvm-config140 llvm-config14 llvm-config NAMES_PER_DIR
45 PATHS
46 "/mingw64/bin"
47 "/c/msys64/mingw64/bin"
48 "c:/msys64/mingw64/bin"
49 "C:/Libraries/llvm-14.0.0/bin")
50
51 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
52 message(FATAL_ERROR "unable to find llvm-config")
53 endif()
23 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
24 if (DEFINED LLVM_CONFIG_ERROR_MESSAGE)
25 message(FATAL_ERROR ${LLVM_CONFIG_ERROR_MESSAGE})
26 else()
27 message(FATAL_ERROR "unable to find llvm-config")
28 endif()
29 endif()
5430
55 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
56 message(FATAL_ERROR "unable to find llvm-config")
57 endif()
31 # Check that this LLVM is the right version
32 execute_process(
33 COMMAND ${LLVM_CONFIG_EXE} --version
34 OUTPUT_VARIABLE LLVM_CONFIG_VERSION
35 OUTPUT_STRIP_TRAILING_WHITESPACE)
5836
59 execute_process(
60 COMMAND ${LLVM_CONFIG_EXE} --version
61 OUTPUT_VARIABLE LLVM_CONFIG_VERSION
62 OUTPUT_STRIP_TRAILING_WHITESPACE)
37 get_filename_component(LLVM_CONFIG_DIR "${LLVM_CONFIG_EXE}" DIRECTORY)
38 if("${LLVM_CONFIG_VERSION}" VERSION_LESS 14 OR "${LLVM_CONFIG_VERSION}" VERSION_EQUAL 15 OR "${LLVM_CONFIG_VERSION}" VERSION_GREATER 15)
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}")
6341
64 if("${LLVM_CONFIG_VERSION}" VERSION_LESS 14)
65 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")
66 endif()
67 if("${LLVM_CONFIG_VERSION}" VERSION_EQUAL 15)
68 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")
69 endif()
70 if("${LLVM_CONFIG_VERSION}" VERSION_GREATER 15)
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")
42 # Ignore this directory and try the search again
43 list(APPEND CMAKE_IGNORE_PATH "${LLVM_CONFIG_DIR}")
44 continue()
45 endif()
8146
82 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
83 message(FATAL_ERROR "unable to find llvm-config")
84 endif()
47 # Check that this LLVM supports linking as a shared/static library, if requested
48 if (ZIG_SHARED_LLVM OR ZIG_STATIC_LLVM)
49 if (ZIG_SHARED_LLVM)
50 set(STATIC_OR_SHARED_LINK "--link-shared")
51 elseif (ZIG_STATIC_LLVM)
52 set(STATIC_OR_SHARED_LINK "--link-static")
53 endif()
8554
86 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
87 message(FATAL_ERROR "unable to find llvm-config")
88 endif()
55 execute_process(
56 COMMAND ${LLVM_CONFIG_EXE} --libs ${STATIC_OR_SHARED_LINK}
57 OUTPUT_QUIET
58 ERROR_VARIABLE LLVM_CONFIG_ERROR
59 ERROR_STRIP_TRAILING_WHITESPACE)
8960
90 execute_process(
91 COMMAND ${LLVM_CONFIG_EXE} --version
92 OUTPUT_VARIABLE LLVM_CONFIG_VERSION
93 OUTPUT_STRIP_TRAILING_WHITESPACE)
61 if (LLVM_CONFIG_ERROR)
62 # Save the error message, in case this is the last llvm-config we find
63 if (ZIG_SHARED_LLVM)
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)
96 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")
97 endif()
98 if("${LLVM_CONFIG_VERSION}" VERSION_EQUAL 15)
99 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")
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()
69 # Ignore this directory and try the search again
70 list(APPEND CMAKE_IGNORE_PATH "${LLVM_CONFIG_DIR}")
71 continue()
72 endif()
73 endif()
10474
105 execute_process(
106 COMMAND ${LLVM_CONFIG_EXE} --targets-built
107 OUTPUT_VARIABLE LLVM_TARGETS_BUILT_SPACES
108 OUTPUT_STRIP_TRAILING_WHITESPACE)
109 string(REPLACE " " ";" LLVM_TARGETS_BUILT "${LLVM_TARGETS_BUILT_SPACES}")
110 function(NEED_TARGET TARGET_NAME)
75 execute_process(
76 COMMAND ${LLVM_CONFIG_EXE} --targets-built
77 OUTPUT_VARIABLE LLVM_TARGETS_BUILT_SPACES
78 OUTPUT_STRIP_TRAILING_WHITESPACE)
79 string(REPLACE " " ";" LLVM_TARGETS_BUILT "${LLVM_TARGETS_BUILT_SPACES}")
80 function(NEED_TARGET TARGET_NAME)
11181 list (FIND LLVM_TARGETS_BUILT "${TARGET_NAME}" _index)
11282 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()
11489 endif()
115 endfunction(NEED_TARGET)
116 NEED_TARGET("AArch64")
117 NEED_TARGET("AMDGPU")
118 NEED_TARGET("ARM")
119 NEED_TARGET("AVR")
120 NEED_TARGET("BPF")
121 NEED_TARGET("Hexagon")
122 NEED_TARGET("Lanai")
123 NEED_TARGET("Mips")
124 NEED_TARGET("MSP430")
125 NEED_TARGET("NVPTX")
126 NEED_TARGET("PowerPC")
127 NEED_TARGET("RISCV")
128 NEED_TARGET("Sparc")
129 NEED_TARGET("SystemZ")
130 NEED_TARGET("VE")
131 NEED_TARGET("WebAssembly")
132 NEED_TARGET("X86")
133 NEED_TARGET("XCore")
90 endfunction(NEED_TARGET)
91 NEED_TARGET("AArch64")
92 NEED_TARGET("AMDGPU")
93 NEED_TARGET("ARM")
94 NEED_TARGET("AVR")
95 NEED_TARGET("BPF")
96 NEED_TARGET("Hexagon")
97 NEED_TARGET("Lanai")
98 NEED_TARGET("Mips")
99 NEED_TARGET("MSP430")
100 NEED_TARGET("NVPTX")
101 NEED_TARGET("PowerPC")
102 NEED_TARGET("RISCV")
103 NEED_TARGET("Sparc")
104 NEED_TARGET("SystemZ")
105 NEED_TARGET("VE")
106 NEED_TARGET("WebAssembly")
107 NEED_TARGET("X86")
108 NEED_TARGET("XCore")
109
110 # Got it!
111 break()
112 endwhile()
134113
135 if(ZIG_STATIC_LLVM)
114 if(ZIG_SHARED_LLVM OR ZIG_STATIC_LLVM)
136115 execute_process(
137 COMMAND ${LLVM_CONFIG_EXE} --libfiles --link-static
116 COMMAND ${LLVM_CONFIG_EXE} --libfiles ${STATIC_OR_SHARED_LINK}
138117 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
139118 OUTPUT_STRIP_TRAILING_WHITESPACE)
140119 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
141120
142121 execute_process(
143 COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
122 COMMAND ${LLVM_CONFIG_EXE} --libdir ${STATIC_OR_SHARED_LINK}
123 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
124 OUTPUT_STRIP_TRAILING_WHITESPACE)
125 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
126
127 execute_process(
128 COMMAND ${LLVM_CONFIG_EXE} --system-libs ${STATIC_OR_SHARED_LINK}
144129 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
145130 OUTPUT_STRIP_TRAILING_WHITESPACE)
146131 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
147132
148133 execute_process(
149 COMMAND ${LLVM_CONFIG_EXE} --libdir --link-static
150 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
151 OUTPUT_STRIP_TRAILING_WHITESPACE)
152 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
153 endif()
154 if(NOT LLVM_LIBRARIES)
134 COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK}
135 OUTPUT_VARIABLE LLVM_LINK_MODE
136 OUTPUT_STRIP_TRAILING_WHITESPACE)
137 else()
155138 execute_process(
156139 COMMAND ${LLVM_CONFIG_EXE} --libs
157140 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
158141 OUTPUT_STRIP_TRAILING_WHITESPACE)
159142 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
160143
144 execute_process(
145 COMMAND ${LLVM_CONFIG_EXE} --libdir
146 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
147 OUTPUT_STRIP_TRAILING_WHITESPACE)
148 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
149
161150 execute_process(
162151 COMMAND ${LLVM_CONFIG_EXE} --system-libs
163152 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
......@@ -165,18 +154,33 @@ elseif(ZIG_USE_LLVM_CONFIG)
165154 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
166155
167156 execute_process(
168 COMMAND ${LLVM_CONFIG_EXE} --libdir
169 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
170 OUTPUT_STRIP_TRAILING_WHITESPACE)
171 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
157 COMMAND ${LLVM_CONFIG_EXE} --shared-mode
158 OUTPUT_VARIABLE LLVM_LINK_MODE
159 OUTPUT_STRIP_TRAILING_WHITESPACE)
172160 endif()
173161
174 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
162 if (${LLVM_LINK_MODE} STREQUAL "shared")
163 # We always ask for the system libs corresponding to static linking,
164 # since on some distros LLD is only available as a static library
165 # and we need these libraries to link it successfully
166 execute_process(
167 COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
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}")
175172
176 if(NOT LLVM_LIBRARIES)
177 find_library(LLVM_LIBRARIES NAMES LLVM LLVM-14 LLVM-14.0 NAMES_PER_DIR)
173 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS} ${LLVM_STATIC_SYSTEM_LIBS})
174 else()
175 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
178176 endif()
179177
178 execute_process(
179 COMMAND ${LLVM_CONFIG_EXE} --includedir
180 OUTPUT_VARIABLE LLVM_INCLUDE_DIRS_SPACES
181 OUTPUT_STRIP_TRAILING_WHITESPACE)
182 string(REPLACE " " ";" LLVM_INCLUDE_DIRS "${LLVM_INCLUDE_DIRS_SPACES}")
183
180184 link_directories("${CMAKE_PREFIX_PATH}/lib")
181185 link_directories("${LLVM_LIBDIRS}")
182186else()
......@@ -185,10 +189,13 @@ else()
185189
186190 macro(FIND_AND_ADD_LLVM_LIB _libname_)
187191 string(TOUPPER ${_libname_} _prettylibname_)
188 find_library(LLVM_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR PATHS ${LLVM_LIBDIRS})
192 find_library(LLVM_${_prettylibname_}_LIB
193 NAMES ${_libname_} NAMES_PER_DIR)
189194 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_${_prettylibname_}_LIB})
190195 endmacro(FIND_AND_ADD_LLVM_LIB)
191196
197 set(LLVM_LINK_MODE "static")
198
192199 # This list can be re-generated with `llvm-config --libfiles` and then
193200 # reformatting using your favorite text editor. Note we do not execute
194201 # `llvm-config` here because we are cross compiling.
......@@ -352,6 +359,9 @@ else()
352359 FIND_AND_ADD_LLVM_LIB(LLVMBinaryFormat)
353360 FIND_AND_ADD_LLVM_LIB(LLVMSupport)
354361 FIND_AND_ADD_LLVM_LIB(LLVMDemangle)
362
363 get_filename_component(LLVM_LIBDIRS "${LLVM_LLVMCORE_LIB}" DIRECTORY)
364 find_path(LLVM_INCLUDE_DIRS NAMES llvm/IR/IRBuilder.h)
355365endif()
356366
357367include(FindPackageHandleStandardArgs)
src/stage1/config.h.in+1
......@@ -16,6 +16,7 @@
1616
1717// Used by build.zig for communicating build information to self hosted build.
1818#define ZIG_CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@"
19#define ZIG_LLVM_LINK_MODE "@LLVM_LINK_MODE@"
1920#define ZIG_CMAKE_PREFIX_PATH "@CMAKE_PREFIX_PATH@"
2021#define ZIG_CXX_COMPILER "@CMAKE_CXX_COMPILER@"
2122#define ZIG_LLD_INCLUDE_PATH "@LLD_INCLUDE_DIRS@"