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()...@@ -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}")
build.zig+9
...@@ -676,6 +676,7 @@ fn addCMakeLibraryList(exe: *std.build.LibExeObjStep, list: []const u8) void {...@@ -676,6 +676,7 @@ fn addCMakeLibraryList(exe: *std.build.LibExeObjStep, list: []const u8) void {
676}676}
677677
678const CMakeConfig = struct {678const CMakeConfig = struct {
679 llvm_linkage: std.build.LibExeObjStep.Linkage,
679 cmake_binary_dir: []const u8,680 cmake_binary_dir: []const u8,
680 cmake_prefix_path: []const u8,681 cmake_prefix_path: []const u8,
681 cxx_compiler: []const u8,682 cxx_compiler: []const u8,
...@@ -714,6 +715,7 @@ fn findAndParseConfigH(b: *Builder, config_h_path_option: ?[]const u8) ?CMakeCon...@@ -714,6 +715,7 @@ fn findAndParseConfigH(b: *Builder, config_h_path_option: ?[]const u8) ?CMakeCon
714 };715 };
715716
716 var ctx: CMakeConfig = .{717 var ctx: CMakeConfig = .{
718 .llvm_linkage = undefined,
717 .cmake_binary_dir = undefined,719 .cmake_binary_dir = undefined,
718 .cmake_prefix_path = undefined,720 .cmake_prefix_path = undefined,
719 .cxx_compiler = undefined,721 .cxx_compiler = undefined,
...@@ -757,6 +759,7 @@ fn findAndParseConfigH(b: *Builder, config_h_path_option: ?[]const u8) ?CMakeCon...@@ -757,6 +759,7 @@ fn findAndParseConfigH(b: *Builder, config_h_path_option: ?[]const u8) ?CMakeCon
757 .prefix = "#define ZIG_DIA_GUIDS_LIB ",759 .prefix = "#define ZIG_DIA_GUIDS_LIB ",
758 .field = "dia_guids_lib",760 .field = "dia_guids_lib",
759 },761 },
762 // .prefix = ZIG_LLVM_LINK_MODE parsed manually below
760 };763 };
761764
762 var lines_it = mem.tokenize(u8, config_h_text, "\r\n");765 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...@@ -769,6 +772,12 @@ fn findAndParseConfigH(b: *Builder, config_h_path_option: ?[]const u8) ?CMakeCon
769 @field(ctx, mapping.field) = toNativePathSep(b, quoted);772 @field(ctx, mapping.field) = toNativePathSep(b, quoted);
770 }773 }
771 }774 }
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 }
772 }781 }
773 return ctx;782 return ctx;
774}783}
cmake/Findclang.cmake+15-34
...@@ -8,52 +8,33 @@...@@ -8,52 +8,33 @@
8# CLANG_LIBDIRS8# CLANG_LIBDIRS
99
10find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h10find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h
11 PATHS11 HINTS ${LLVM_INCLUDE_DIRS}
12 /usr/lib/llvm/14/include12 # Only look for Clang next to LLVM or in { CMAKE_PREFIX_PATH, CMAKE_LIBRARY_PATH, CMAKE_FRAMEWORK_PATH }
13 /usr/lib/llvm-14/include13 NO_SYSTEM_ENVIRONMENT_PATH
14 /usr/lib/llvm-14.0/include14 NO_CMAKE_SYSTEM_PATH
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)15)
2116
22if(ZIG_PREFER_CLANG_CPP_DYLIB)17if(${LLVM_LINK_MODE} STREQUAL "shared")
23 find_library(CLANG_LIBRARIES18 find_library(CLANG_LIBRARIES
24 NAMES19 NAMES
20 libclang-cpp.so.14
25 clang-cpp-14.021 clang-cpp-14.0
26 clang-cpp14022 clang-cpp140
27 clang-cpp23 clang-cpp
28 NAMES_PER_DIR24 NAMES_PER_DIR
29 PATHS25 HINTS "${LLVM_LIBDIRS}"
30 ${CLANG_LIBDIRS}26 # Only look for Clang next to LLVM or in { CMAKE_PREFIX_PATH, CMAKE_LIBRARY_PATH, CMAKE_FRAMEWORK_PATH }
31 /usr/lib/llvm/14/lib27 NO_SYSTEM_ENVIRONMENT_PATH
32 /usr/lib/llvm/14/lib6428 NO_CMAKE_SYSTEM_PATH
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 )29 )
39endif()30else()
40
41if(NOT CLANG_LIBRARIES)
42 macro(FIND_AND_ADD_CLANG_LIB _libname_)31 macro(FIND_AND_ADD_CLANG_LIB _libname_)
43 string(TOUPPER ${_libname_} _prettylibname_)32 string(TOUPPER ${_libname_} _prettylibname_)
44 find_library(CLANG_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR33 find_library(CLANG_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR
45 PATHS34 HINTS "${LLVM_LIBDIRS}"
46 ${CLANG_LIBDIRS}35 # Only look for Clang next to LLVM or in { CMAKE_PREFIX_PATH, CMAKE_LIBRARY_PATH, CMAKE_FRAMEWORK_PATH }
47 /usr/lib/llvm/14/lib36 NO_SYSTEM_ENVIRONMENT_PATH
48 /usr/lib/llvm-14/lib37 NO_CMAKE_SYSTEM_PATH
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 )38 )
58 if(CLANG_${_prettylibname_}_LIB)39 if(CLANG_${_prettylibname_}_LIB)
59 set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_${_prettylibname_}_LIB})40 set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_${_prettylibname_}_LIB})
cmake/Findlld.cmake+5-2
...@@ -7,6 +7,7 @@...@@ -7,6 +7,7 @@
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 HINTS ${LLVM_INCLUDE_DIRS}
10 PATHS11 PATHS
11 /usr/lib/llvm-14/include12 /usr/lib/llvm-14/include
12 /usr/local/llvm140/include13 /usr/local/llvm140/include
...@@ -16,6 +17,7 @@ find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h...@@ -16,6 +17,7 @@ find_path(LLD_INCLUDE_DIRS NAMES lld/Common/Driver.h
16 /mingw64/include)17 /mingw64/include)
1718
18find_library(LLD_LIBRARY NAMES lld-14.0 lld140 lld NAMES_PER_DIR19find_library(LLD_LIBRARY NAMES lld-14.0 lld140 lld NAMES_PER_DIR
20 HINTS ${LLVM_LIBDIRS}
19 PATHS21 PATHS
20 /usr/lib/llvm-14/lib22 /usr/lib/llvm-14/lib
21 /usr/local/llvm140/lib23 /usr/local/llvm140/lib
...@@ -29,6 +31,7 @@ else()...@@ -29,6 +31,7 @@ else()
29 macro(FIND_AND_ADD_LLD_LIB _libname_)31 macro(FIND_AND_ADD_LLD_LIB _libname_)
30 string(TOUPPER ${_libname_} _prettylibname_)32 string(TOUPPER ${_libname_} _prettylibname_)
31 find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR33 find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR
34 HINTS ${LLVM_LIBDIRS}
32 PATHS35 PATHS
33 ${LLD_LIBDIRS}36 ${LLD_LIBDIRS}
34 /usr/lib/llvm-14/lib37 /usr/lib/llvm-14/lib
...@@ -39,8 +42,8 @@ else()...@@ -39,8 +42,8 @@ else()
39 /mingw64/lib42 /mingw64/lib
40 /c/msys64/mingw64/lib43 /c/msys64/mingw64/lib
41 c:/msys64/mingw64/lib)44 c:/msys64/mingw64/lib)
42 if(LLD_${_prettylibname_}_LIB)45 if(LLD_${_prettylibname_}_LIB)
43 set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})46 set(LLD_LIBRARIES ${LLD_LIBRARIES} ${LLD_${_prettylibname_}_LIB})
44 endif()47 endif()
45 endmacro(FIND_AND_ADD_LLD_LIB)48 endmacro(FIND_AND_ADD_LLD_LIB)
4649
cmake/Findllvm.cmake+138-128
...@@ -6,158 +6,147 @@...@@ -6,158 +6,147 @@
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()
50
51 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
52 message(FATAL_ERROR "unable to find llvm-config")
53 endif()
5430
55 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")31 # Check that this LLVM is the right version
56 message(FATAL_ERROR "unable to find llvm-config")32 execute_process(
57 endif()33 COMMAND ${LLVM_CONFIG_EXE} --version
34 OUTPUT_VARIABLE LLVM_CONFIG_VERSION
35 OUTPUT_STRIP_TRAILING_WHITESPACE)
5836
59 execute_process(37 get_filename_component(LLVM_CONFIG_DIR "${LLVM_CONFIG_EXE}" DIRECTORY)
60 COMMAND ${LLVM_CONFIG_EXE} --version38 if("${LLVM_CONFIG_VERSION}" VERSION_LESS 14 OR "${LLVM_CONFIG_VERSION}" VERSION_EQUAL 15 OR "${LLVM_CONFIG_VERSION}" VERSION_GREATER 15)
61 OUTPUT_VARIABLE LLVM_CONFIG_VERSION39 # Save the error message, in case this is the last llvm-config we find
62 OUTPUT_STRIP_TRAILING_WHITESPACE)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)42 # Ignore this directory and try the search again
65 message(FATAL_ERROR "expected LLVM 14.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}")43 list(APPEND CMAKE_IGNORE_PATH "${LLVM_CONFIG_DIR}")
66 endif()44 continue()
67 if("${LLVM_CONFIG_VERSION}" VERSION_EQUAL 15)45 endif()
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")
8146
82 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")47 # Check that this LLVM supports linking as a shared/static library, if requested
83 message(FATAL_ERROR "unable to find llvm-config")48 if (ZIG_SHARED_LLVM OR ZIG_STATIC_LLVM)
84 endif()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")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 ERROR_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")
109
110 # Got it!
111 break()
112 endwhile()
134113
135 if(ZIG_STATIC_LLVM)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}
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}
144 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES129 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
145 OUTPUT_STRIP_TRAILING_WHITESPACE)130 OUTPUT_STRIP_TRAILING_WHITESPACE)
146 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")131 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
147132
148 execute_process(133 execute_process(
149 COMMAND ${LLVM_CONFIG_EXE} --libdir --link-static134 COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK}
150 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES135 OUTPUT_VARIABLE LLVM_LINK_MODE
151 OUTPUT_STRIP_TRAILING_WHITESPACE)136 OUTPUT_STRIP_TRAILING_WHITESPACE)
152 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")137 else()
153 endif()
154 if(NOT LLVM_LIBRARIES)
155 execute_process(138 execute_process(
156 COMMAND ${LLVM_CONFIG_EXE} --libs139 COMMAND ${LLVM_CONFIG_EXE} --libs
157 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES140 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
158 OUTPUT_STRIP_TRAILING_WHITESPACE)141 OUTPUT_STRIP_TRAILING_WHITESPACE)
159 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")142 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
161 execute_process(150 execute_process(
162 COMMAND ${LLVM_CONFIG_EXE} --system-libs151 COMMAND ${LLVM_CONFIG_EXE} --system-libs
163 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES152 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
...@@ -165,18 +154,33 @@ elseif(ZIG_USE_LLVM_CONFIG)...@@ -165,18 +154,33 @@ elseif(ZIG_USE_LLVM_CONFIG)
165 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")154 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
166155
167 execute_process(156 execute_process(
168 COMMAND ${LLVM_CONFIG_EXE} --libdir157 COMMAND ${LLVM_CONFIG_EXE} --shared-mode
169 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES158 OUTPUT_VARIABLE LLVM_LINK_MODE
170 OUTPUT_STRIP_TRAILING_WHITESPACE)159 OUTPUT_STRIP_TRAILING_WHITESPACE)
171 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
172 endif()160 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)173 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS} ${LLVM_STATIC_SYSTEM_LIBS})
177 find_library(LLVM_LIBRARIES NAMES LLVM LLVM-14 LLVM-14.0 NAMES_PER_DIR)174 else()
175 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
178 endif()176 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
180 link_directories("${CMAKE_PREFIX_PATH}/lib")184 link_directories("${CMAKE_PREFIX_PATH}/lib")
181 link_directories("${LLVM_LIBDIRS}")185 link_directories("${LLVM_LIBDIRS}")
182else()186else()
...@@ -185,10 +189,13 @@ else()...@@ -185,10 +189,13 @@ else()
185189
186 macro(FIND_AND_ADD_LLVM_LIB _libname_)190 macro(FIND_AND_ADD_LLVM_LIB _libname_)
187 string(TOUPPER ${_libname_} _prettylibname_)191 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)
189 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_${_prettylibname_}_LIB})194 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_${_prettylibname_}_LIB})
190 endmacro(FIND_AND_ADD_LLVM_LIB)195 endmacro(FIND_AND_ADD_LLVM_LIB)
191196
197 set(LLVM_LINK_MODE "static")
198
192 # This list can be re-generated with `llvm-config --libfiles` and then199 # This list can be re-generated with `llvm-config --libfiles` and then
193 # reformatting using your favorite text editor. Note we do not execute200 # reformatting using your favorite text editor. Note we do not execute
194 # `llvm-config` here because we are cross compiling.201 # `llvm-config` here because we are cross compiling.
...@@ -352,6 +359,9 @@ else()...@@ -352,6 +359,9 @@ else()
352 FIND_AND_ADD_LLVM_LIB(LLVMBinaryFormat)359 FIND_AND_ADD_LLVM_LIB(LLVMBinaryFormat)
353 FIND_AND_ADD_LLVM_LIB(LLVMSupport)360 FIND_AND_ADD_LLVM_LIB(LLVMSupport)
354 FIND_AND_ADD_LLVM_LIB(LLVMDemangle)361 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)
355endif()365endif()
356366
357include(FindPackageHandleStandardArgs)367include(FindPackageHandleStandardArgs)
src/stage1/config.h.in+1
...@@ -16,6 +16,7 @@...@@ -16,6 +16,7 @@
1616
17// Used by build.zig for communicating build information to self hosted build.17// Used by build.zig for communicating build information to self hosted build.
18#define ZIG_CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@"18#define ZIG_CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@"
19#define ZIG_LLVM_LINK_MODE "@LLVM_LINK_MODE@"
19#define ZIG_CMAKE_PREFIX_PATH "@CMAKE_PREFIX_PATH@"20#define ZIG_CMAKE_PREFIX_PATH "@CMAKE_PREFIX_PATH@"
20#define ZIG_CXX_COMPILER "@CMAKE_CXX_COMPILER@"21#define ZIG_CXX_COMPILER "@CMAKE_CXX_COMPILER@"
21#define ZIG_LLD_INCLUDE_PATH "@LLD_INCLUDE_DIRS@"22#define ZIG_LLD_INCLUDE_PATH "@LLD_INCLUDE_DIRS@"