OSDN Git Service

0bf598d0d3d177ba9a51ebf3b63463492ae0dab8
[android-x86/external-llvm.git] / utils / gn / secondary / llvm / include / llvm / Config / BUILD.gn
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")
12
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.
19
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.
22
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.
25
26 ##############################################################################
27 # config.h, llvm-config.h, abi-breaking.h
28
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).
35
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.
38
39 declare_args() {
40   # Enable additional checks that alter the LLVM C++ ABI.
41   llvm_enable_abi_breaking_checks = llvm_enable_assertions
42
43   # Iterate unordered llvm containers in reverse.
44   llvm_enable_reverse_iteration = false
45 }
46
47 write_cmake_config("abi-breaking") {
48   input = "abi-breaking.h.cmake"
49   output = "$target_gen_dir/abi-breaking.h"
50   values = []
51
52   if (llvm_enable_abi_breaking_checks) {
53     values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=1" ]
54   } else {
55     values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=" ]
56   }
57
58   if (llvm_enable_reverse_iteration) {
59     values += [ "LLVM_ENABLE_REVERSE_ITERATION=1" ]
60   } else {
61     values += [ "LLVM_ENABLE_REVERSE_ITERATION=" ]
62   }
63 }
64
65 write_cmake_config("config") {
66   public_deps = [
67     ":llvm-config",
68   ]
69
70   input = "config.h.cmake"
71   output = "$target_gen_dir/config.h"
72   values = [
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=",
82     "HAVE_ERRNO_H=1",
83     "HAVE_FCNTL_H=1",
84     "HAVE_FENV_H=1",
85     "HAVE_FFI_CALL=",
86     "HAVE_FFI_FFI_H=",
87     "HAVE_FFI_H=",
88     "HAVE_LIBPFM=",
89     "HAVE_LIBPSAPI=",
90     "HAVE_MALLCTL=",
91     "HAVE_SIGNAL_H=1",
92     "HAVE_STD_IS_TRIVIALLY_COPYABLE=1",
93     "HAVE_STRERROR=1",
94     "HAVE_SYS_STAT_H=1",
95     "HAVE_SYS_TYPES_H=1",
96     "HAVE_VALGRIND_VALGRIND_H=",
97     "HAVE__ALLOCA=",
98     "HAVE___ALLOCA=",
99     "HAVE___ASHLDI3=",
100     "HAVE___ASHRDI3=",
101     "HAVE___CHKSTK=",
102     "HAVE___CHKSTK_MS=",
103     "HAVE___CMPDI2=",
104     "HAVE___DIVDI3=",
105     "HAVE___FIXDFDI=",
106     "HAVE___FIXSFDI=",
107     "HAVE___FLOATDIDF=",
108     "HAVE___LSHRDI3=",
109     "HAVE___MAIN=",
110     "HAVE___MODDI3=",
111     "HAVE___UDIVDI3=",
112     "HAVE___UMODDI3=",
113     "HAVE____CHKSTK=",
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/",
120     "PACKAGE_NAME=LLVM",
121     "PACKAGE_STRING=LLVM ${llvm_version}svn",
122     "PACKAGE_VERSION=${llvm_version}svn",
123     "PACKAGE_VENDOR=",
124     "RETSIGTYPE=void",
125     "LLVM_GISEL_COV_ENABLED=",
126     "LLVM_GISEL_COV_PREFIX=",
127
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",
131   ]
132
133   if (current_os == "linux" || current_os == "android") {
134     values += [
135       "HAVE_FUTIMENS=1",
136       "HAVE_LINK_H=1",
137       "HAVE_LSEEK64=1",
138       "HAVE_MALLINFO=1",
139       "HAVE_POSIX_FALLOCATE=1",
140       "HAVE_SCHED_GETAFFINITY=1",
141       "HAVE_CPU_COUNT=1",
142       "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=1",
143     ]
144   } else {
145     values += [
146       "HAVE_FUTIMENS=",
147       "HAVE_LINK_H=",
148       "HAVE_LSEEK64=",
149       "HAVE_MALLINFO=",
150       "HAVE_POSIX_FALLOCATE=",
151       "HAVE_SCHED_GETAFFINITY=",
152       "HAVE_CPU_COUNT=",
153       "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=",
154     ]
155   }
156
157   if (current_os == "mac") {
158     values += [
159       "HAVE_CRASHREPORTER_INFO=1",
160       "HAVE_DECL_ARC4RANDOM=1",
161       "HAVE_DLADDR=1",
162       "HAVE_MALLOC_H=",
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",
167     ]
168   } else {
169     values += [
170       "HAVE_CRASHREPORTER_INFO=",
171       "HAVE_DECL_ARC4RANDOM=",
172       "HAVE_DLADDR=",
173       "HAVE_MACH_MACH_H=",
174       "HAVE_MALLOC_H=1",
175       "HAVE_MALLOC_MALLOC_H=",
176       "HAVE_MALLOC_ZONE_STATISTICS=",
177       "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=",
178     ]
179   }
180
181   if (current_os == "linux" || current_os == "mac") {
182     values += [
183       "HAVE_BACKTRACE=1",
184       "HAVE_POSIX_SPAWN=1",
185       "HAVE_PTHREAD_GETNAME_NP=1",
186     ]
187   } else {
188     values += [
189       "HAVE_BACKTRACE=",
190       "HAVE_POSIX_SPAWN=",
191       "HAVE_PTHREAD_GETNAME_NP=",
192     ]
193   }
194
195   if (current_os == "win") {
196     values += [
197       "HAVE_DECL_STRERROR_S=1",
198       "HAVE_DLFCN_H=",
199       "HAVE_DLOPEN=",
200       "HAVE_FUTIMES=",
201       "HAVE_GETPAGESIZE=",
202       "HAVE_GETRLIMIT=",
203       "HAVE_GETRUSAGE=",
204       "HAVE_ISATTY=",
205       "HAVE_LIBPTHREAD=",
206       "HAVE_PTHREAD_SETNAME_NP=",
207       "HAVE_LIBZ=",
208       "HAVE_PREAD=",
209       "HAVE_PTHREAD_GETSPECIFIC=",
210       "HAVE_PTHREAD_H=",
211       "HAVE_PTHREAD_MUTEX_LOCK=",
212       "HAVE_PTHREAD_RWLOCK_INIT=",
213       "HAVE_REALPATH=",
214       "HAVE_SBRK=",
215       "HAVE_SETENV=",
216       "HAVE_SETRLIMIT=",
217       "HAVE_SIGALTSTACK=",
218       "HAVE_STRERROR_R=",
219       "HAVE_SYSCONF=",
220       "HAVE_SYS_IOCTL_H=",
221       "HAVE_SYS_MMAN_H=",
222       "HAVE_SYS_PARAM_H=",
223       "HAVE_SYS_RESOURCE_H=",
224       "HAVE_SYS_TIME_H=",
225       "HAVE_TERMIOS_H=",
226       "HAVE_UNISTD_H=",
227       "HAVE_ZLIB_H=",
228       "HAVE__CHSIZE_S=1",
229       "HAVE__UNWIND_BACKTRACE=",
230       "stricmp=_stricmp",
231       "strdup=_strdup",
232     ]
233   } else {
234     # POSIX-y system defaults.
235     values += [
236       "HAVE_DECL_STRERROR_S=",
237       "HAVE_DLFCN_H=1",
238       "HAVE_DLOPEN=1",
239       "HAVE_FUTIMES=1",
240       "HAVE_GETPAGESIZE=1",
241       "HAVE_GETRLIMIT=1",
242       "HAVE_GETRUSAGE=1",
243       "HAVE_ISATTY=1",
244       "HAVE_LIBPTHREAD=1",
245       "HAVE_PTHREAD_SETNAME_NP=1",
246       "HAVE_LIBZ=1",
247       "HAVE_PREAD=1",
248       "HAVE_PTHREAD_GETSPECIFIC=1",
249       "HAVE_PTHREAD_H=1",
250       "HAVE_PTHREAD_MUTEX_LOCK=1",
251       "HAVE_PTHREAD_RWLOCK_INIT=1",
252       "HAVE_REALPATH=1",
253       "HAVE_SBRK=1",
254       "HAVE_SETENV=1",
255       "HAVE_SETRLIMIT=1",
256       "HAVE_SIGALTSTACK=1",
257       "HAVE_STRERROR_R=1",
258       "HAVE_SYSCONF=1",
259       "HAVE_SYS_IOCTL_H=1",
260       "HAVE_SYS_MMAN_H=1",
261       "HAVE_SYS_PARAM_H=1",
262       "HAVE_SYS_RESOURCE_H=1",
263       "HAVE_SYS_TIME_H=1",
264       "HAVE_TERMIOS_H=1",
265       "HAVE_UNISTD_H=1",
266       "HAVE_ZLIB_H=1",
267       "HAVE__CHSIZE_S=",
268       "HAVE__UNWIND_BACKTRACE=1",
269       "stricmp=",
270       "strdup=",
271     ]
272   }
273
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" ]
280   }
281
282   if (llvm_enable_libedit) {
283     values += [ "HAVE_LIBEDIT=1" ]
284   } else {
285     values += [ "HAVE_LIBEDIT=" ]
286   }
287
288   if (llvm_enable_libxar) {
289     values += [ "HAVE_LIBXAR=1" ]
290   } else {
291     values += [ "HAVE_LIBXAR=" ]
292   }
293
294   if (llvm_enable_terminfo) {
295     values += [ "HAVE_TERMINFO=1" ]
296   } else {
297     values += [ "HAVE_TERMINFO=" ]
298   }
299
300   if (llvm_enable_zlib) {
301     values += [ "LLVM_ENABLE_ZLIB=1" ]
302   } else {
303     values += [ "LLVM_ENABLE_ZLIB=" ]
304   }
305
306   if (llvm_enable_libxml2) {
307     values += [ "LLVM_LIBXML2_ENABLED=1" ]
308   } else {
309     values += [ "LLVM_LIBXML2_ENABLED=" ]
310   }
311 }
312
313 write_cmake_config("llvm-config") {
314   input = "llvm-config.h.cmake"
315   output = "$target_gen_dir/llvm-config.h"
316   values = [
317     "LLVM_ENABLE_DUMP=",
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=",
331     "LLVM_USE_PERF=",
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=",
337   ]
338
339   if (current_os == "win") {
340     values += [ "LLVM_ON_UNIX=" ]
341   } else {
342     values += [ "LLVM_ON_UNIX=1" ]
343   }
344
345   if (llvm_enable_threads) {
346     values += [ "LLVM_ENABLE_THREADS=1" ]
347   } else {
348     values += [ "LLVM_ENABLE_THREADS=" ]
349   }
350 }
351
352 ##############################################################################
353 # .def files used by llvm/lib/Target
354
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")
358
359   write_cmake_config(target_name) {
360     visibility = [ ":write_target_def_files" ]
361     input = "$target_name.in"
362     output = "$target_gen_dir/$target_name"
363
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).
368     value = ""
369     foreach(target, llvm_targets_to_build) {
370       value = "$value${invoker.value}($target)\n"
371     }
372     values = [ "${invoker.key}=$value" ]
373   }
374 }
375
376 write_target_def_file("AsmParsers.def") {
377   key = "LLVM_ENUM_ASM_PARSERS"
378   value = "LLVM_ASM_PARSER"
379 }
380
381 write_target_def_file("AsmPrinters.def") {
382   key = "LLVM_ENUM_ASM_PRINTERS"
383   value = "LLVM_ASM_PRINTER"
384 }
385
386 write_target_def_file("Disassemblers.def") {
387   key = "LLVM_ENUM_DISASSEMBLERS"
388   value = "LLVM_DISASSEMBLER"
389 }
390
391 write_target_def_file("Targets.def") {
392   key = "LLVM_ENUM_TARGETS"
393   value = "LLVM_TARGET"
394 }
395
396 group("write_target_def_files") {
397   visibility = [
398     "//llvm/lib/Support",
399     "//llvm/lib/Target",
400   ]
401   deps = [
402     ":AsmParsers.def",
403     ":AsmPrinters.def",
404     ":Disassemblers.def",
405     ":Targets.def",
406   ]
407 }