1 import("//llvm/lib/Target/targets.gni")
2 import("//llvm/triples.gni")
3 import("//llvm/utils/gn/build/buildflags.gni")
4 import("//llvm/utils/gn/build/libs/edit/enable.gni")
5 import("//llvm/utils/gn/build/libs/pthread/enable.gni")
6 import("//llvm/utils/gn/build/libs/terminfo/enable.gni")
7 import("//llvm/utils/gn/build/libs/xar/enable.gni")
8 import("//llvm/utils/gn/build/libs/xml/enable.gni")
9 import("//llvm/utils/gn/build/libs/zlib/enable.gni")
10 import("//llvm/utils/gn/build/write_cmake_config.gni")
11 import("//llvm/version.gni")
13 # Contains actions to create config.h, llvm-config.h, abi-breaking.h,
14 # and the various .def files used by llvm/lib/Target.
15 # Other than in the cmake build, these are created at build time, not at
16 # config time. That way, they can run in parallel, and this pattern means that
17 # e.g. creating the clang config header (which happens in another gn file)
18 # doesn't block building lld.
20 # The headers are created by processing the foo.h.cmake files as input,
21 # to keep the gn build close to the cmake build.
23 # Other than in the cmake build, header generation doesn't do any feature
24 # checking. See also "Philosophy" in llvm/utils/gn/README.rst.
26 ##############################################################################
27 # config.h, llvm-config.h, abi-breaking.h
29 # FIXME: Several of the config settings go in a global config header but
30 # are only used in a single translation unit -- so toggling that value
31 # causes a full rebuild when it really only has to rebuild a single file.
32 # Instead monolithing config headers, investigate using something like
33 # https://is.gd/buildflag_header_gni instead (needs to be done in both the
34 # cmake build and here).
36 # FIXME: This hardcodes a bunch of settings I never use; some of them should
37 # become declare_args if anyone wants to set them.
40 # Enable additional checks that alter the LLVM C++ ABI.
41 llvm_enable_abi_breaking_checks = llvm_enable_assertions
43 # Iterate unordered llvm containers in reverse.
44 llvm_enable_reverse_iteration = false
47 write_cmake_config("abi-breaking") {
48 input = "abi-breaking.h.cmake"
49 output = "$target_gen_dir/abi-breaking.h"
52 if (llvm_enable_abi_breaking_checks) {
53 values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=1" ]
55 values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=" ]
58 if (llvm_enable_reverse_iteration) {
59 values += [ "LLVM_ENABLE_REVERSE_ITERATION=1" ]
61 values += [ "LLVM_ENABLE_REVERSE_ITERATION=" ]
65 write_cmake_config("config") {
70 input = "config.h.cmake"
71 output = "$target_gen_dir/config.h"
73 "BUG_REPORT_URL=https://bugs.llvm.org/",
74 "ENABLE_BACKTRACES=1",
75 "ENABLE_CRASH_OVERRIDES=1",
76 "BACKTRACE_HEADER=execinfo.h",
77 "HAVE_CRASHREPORTERCLIENT_H=",
78 "HAVE_DECL_FE_ALL_EXCEPT=1",
79 "HAVE_DECL_FE_INEXACT=1",
80 "LLVM_ENABLE_DIA_SDK=",
81 "LLVM_ENABLE_CRASH_DUMPS=",
92 "HAVE_STD_IS_TRIVIALLY_COPYABLE=1",
96 "HAVE_VALGRIND_VALGRIND_H=",
114 "HAVE____CHKSTK_MS=",
115 "HOST_LINK_VERSION=",
116 "LLVM_TARGET_TRIPLE_ENV=",
117 "LLVM_VERSION_INFO=",
118 "LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO=1",
119 "PACKAGE_BUGREPORT=https://bugs.llvm.org/",
121 "PACKAGE_STRING=LLVM ${llvm_version}svn",
122 "PACKAGE_VERSION=${llvm_version}svn",
125 "LLVM_GISEL_COV_ENABLED=",
126 "LLVM_GISEL_COV_PREFIX=",
128 # This is both in llvm-config.h and config.h; llvm-config.h doesn't
129 # define it if it's not set while config.h defines it to empty in that case.
130 "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple",
133 if (current_os == "linux" || current_os == "android") {
139 "HAVE_POSIX_FALLOCATE=1",
140 "HAVE_SCHED_GETAFFINITY=1",
142 "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=1",
150 "HAVE_POSIX_FALLOCATE=",
151 "HAVE_SCHED_GETAFFINITY=",
153 "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=",
157 if (current_os == "mac") {
159 "HAVE_CRASHREPORTER_INFO=1",
160 "HAVE_DECL_ARC4RANDOM=1",
163 "HAVE_MACH_MACH_H=1",
164 "HAVE_MALLOC_MALLOC_H=1",
165 "HAVE_MALLOC_ZONE_STATISTICS=1",
166 "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1",
170 "HAVE_CRASHREPORTER_INFO=",
171 "HAVE_DECL_ARC4RANDOM=",
175 "HAVE_MALLOC_MALLOC_H=",
176 "HAVE_MALLOC_ZONE_STATISTICS=",
177 "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=",
181 if (current_os == "linux" || current_os == "mac") {
184 "HAVE_POSIX_SPAWN=1",
185 "HAVE_PTHREAD_GETNAME_NP=1",
191 "HAVE_PTHREAD_GETNAME_NP=",
195 if (current_os == "win") {
197 "HAVE_DECL_STRERROR_S=1",
206 "HAVE_PTHREAD_SETNAME_NP=",
209 "HAVE_PTHREAD_GETSPECIFIC=",
211 "HAVE_PTHREAD_MUTEX_LOCK=",
212 "HAVE_PTHREAD_RWLOCK_INIT=",
223 "HAVE_SYS_RESOURCE_H=",
229 "HAVE__UNWIND_BACKTRACE=",
234 # POSIX-y system defaults.
236 "HAVE_DECL_STRERROR_S=",
240 "HAVE_GETPAGESIZE=1",
245 "HAVE_PTHREAD_SETNAME_NP=1",
248 "HAVE_PTHREAD_GETSPECIFIC=1",
250 "HAVE_PTHREAD_MUTEX_LOCK=1",
251 "HAVE_PTHREAD_RWLOCK_INIT=1",
256 "HAVE_SIGALTSTACK=1",
259 "HAVE_SYS_IOCTL_H=1",
261 "HAVE_SYS_PARAM_H=1",
262 "HAVE_SYS_RESOURCE_H=1",
268 "HAVE__UNWIND_BACKTRACE=1",
274 if (current_os == "linux" || current_os == "android") {
275 values += [ "LTDL_SHLIB_EXT=.so" ]
276 } else if (current_os == "mac") {
277 values += [ "LTDL_SHLIB_EXT=.dylib" ]
278 } else if (current_os == "win") {
279 values += [ "LTDL_SHLIB_EXT=.dll" ]
282 if (llvm_enable_libedit) {
283 values += [ "HAVE_LIBEDIT=1" ]
285 values += [ "HAVE_LIBEDIT=" ]
288 if (llvm_enable_libxar) {
289 values += [ "HAVE_LIBXAR=1" ]
291 values += [ "HAVE_LIBXAR=" ]
294 if (llvm_enable_terminfo) {
295 values += [ "HAVE_TERMINFO=1" ]
297 values += [ "HAVE_TERMINFO=" ]
300 if (llvm_enable_zlib) {
301 values += [ "LLVM_ENABLE_ZLIB=1" ]
303 values += [ "LLVM_ENABLE_ZLIB=" ]
306 if (llvm_enable_libxml2) {
307 values += [ "LLVM_LIBXML2_ENABLED=1" ]
309 values += [ "LLVM_LIBXML2_ENABLED=" ]
313 write_cmake_config("llvm-config") {
314 input = "llvm-config.h.cmake"
315 output = "$target_gen_dir/llvm-config.h"
318 "LINK_POLLY_INTO_TOOLS=",
319 "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple",
320 "LLVM_HAS_ATOMICS=1",
321 "LLVM_HOST_TRIPLE=$llvm_current_triple",
322 "LLVM_NATIVE_ARCH=$native_target",
323 "LLVM_NATIVE_ASMPARSER=1",
324 "LLVM_NATIVE_ASMPRINTER=1",
325 "LLVM_NATIVE_DISASSEMBLER=1",
326 "LLVM_NATIVE_TARGET=1",
327 "LLVM_NATIVE_TARGETINFO=1",
328 "LLVM_NATIVE_TARGETMC=1",
329 "LLVM_USE_INTEL_JITEVENTS=",
330 "LLVM_USE_OPROFILE=",
332 "LLVM_VERSION_MAJOR=$llvm_version_major",
333 "LLVM_VERSION_MINOR=$llvm_version_minor",
334 "LLVM_VERSION_PATCH=$llvm_version_patch",
335 "PACKAGE_VERSION=${llvm_version}svn",
336 "LLVM_FORCE_ENABLE_STATS=",
339 if (current_os == "win") {
340 values += [ "LLVM_ON_UNIX=" ]
342 values += [ "LLVM_ON_UNIX=1" ]
345 if (llvm_enable_threads) {
346 values += [ "LLVM_ENABLE_THREADS=1" ]
348 values += [ "LLVM_ENABLE_THREADS=" ]
352 ##############################################################################
353 # .def files used by llvm/lib/Target
355 template("write_target_def_file") {
356 assert(defined(invoker.key), "must set 'key' in $target_name")
357 assert(defined(invoker.value), "must set 'value' in $target_name")
359 write_cmake_config(target_name) {
360 visibility = [ ":write_target_def_files" ]
361 input = "$target_name.in"
362 output = "$target_gen_dir/$target_name"
364 # Build something like
365 # `LLVM_ENUM_ASM_PARSERS=LLVM_ASM_PARSER(ARM)\nLLVM_ASM_PARSER(X86)\n`. Note
366 # that \n is a literal '\' followed by a literal 'n', not a newline
367 # character. (write_cmake_config.py replaces that with a real newline).
369 foreach(target, llvm_targets_to_build) {
370 value = "$value${invoker.value}($target)\n"
372 values = [ "${invoker.key}=$value" ]
376 write_target_def_file("AsmParsers.def") {
377 key = "LLVM_ENUM_ASM_PARSERS"
378 value = "LLVM_ASM_PARSER"
381 write_target_def_file("AsmPrinters.def") {
382 key = "LLVM_ENUM_ASM_PRINTERS"
383 value = "LLVM_ASM_PRINTER"
386 write_target_def_file("Disassemblers.def") {
387 key = "LLVM_ENUM_DISASSEMBLERS"
388 value = "LLVM_DISASSEMBLER"
391 write_target_def_file("Targets.def") {
392 key = "LLVM_ENUM_TARGETS"
393 value = "LLVM_TARGET"
396 group("write_target_def_files") {
398 "//llvm/lib/Support",
404 ":Disassemblers.def",