| import("//llvm/lib/Target/targets.gni") |
| import("//llvm/triples.gni") |
| import("//llvm/utils/gn/build/buildflags.gni") |
| import("//llvm/utils/gn/build/libs/edit/enable.gni") |
| import("//llvm/utils/gn/build/libs/pthread/enable.gni") |
| import("//llvm/utils/gn/build/libs/terminfo/enable.gni") |
| import("//llvm/utils/gn/build/libs/xar/enable.gni") |
| import("//llvm/utils/gn/build/libs/xml/enable.gni") |
| import("//llvm/utils/gn/build/libs/zlib/enable.gni") |
| import("//llvm/utils/gn/build/write_cmake_config.gni") |
| import("//llvm/version.gni") |
| |
| # Contains actions to create config.h, llvm-config.h, abi-breaking.h, |
| # and the various .def files used by llvm/lib/Target. |
| # Other than in the cmake build, these are created at build time, not at |
| # config time. That way, they can run in parallel, and this pattern means that |
| # e.g. creating the clang config header (which happens in another gn file) |
| # doesn't block building lld. |
| |
| # The headers are created by processing the foo.h.cmake files as input, |
| # to keep the gn build close to the cmake build. |
| |
| # Other than in the cmake build, header generation doesn't do any feature |
| # checking. See also "Philosophy" in llvm/utils/gn/README.rst. |
| |
| ############################################################################## |
| # config.h, llvm-config.h, abi-breaking.h |
| |
| # FIXME: Several of the config settings go in a global config header but |
| # are only used in a single translation unit -- so toggling that value |
| # causes a full rebuild when it really only has to rebuild a single file. |
| # Instead monolithing config headers, investigate using something like |
| # https://is.gd/buildflag_header_gni instead (needs to be done in both the |
| # cmake build and here). |
| |
| # FIXME: This hardcodes a bunch of settings I never use; some of them should |
| # become declare_args if anyone wants to set them. |
| |
| declare_args() { |
| # Enable additional checks that alter the LLVM C++ ABI. |
| llvm_enable_abi_breaking_checks = llvm_enable_assertions |
| |
| # Iterate unordered llvm containers in reverse. |
| llvm_enable_reverse_iteration = false |
| } |
| |
| write_cmake_config("abi-breaking") { |
| input = "abi-breaking.h.cmake" |
| output = "$target_gen_dir/abi-breaking.h" |
| values = [] |
| |
| if (llvm_enable_abi_breaking_checks) { |
| values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=" ] |
| } |
| |
| if (llvm_enable_reverse_iteration) { |
| values += [ "LLVM_ENABLE_REVERSE_ITERATION=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_REVERSE_ITERATION=" ] |
| } |
| } |
| |
| write_cmake_config("config") { |
| public_deps = [ |
| ":llvm-config", |
| ] |
| |
| input = "config.h.cmake" |
| output = "$target_gen_dir/config.h" |
| values = [ |
| "BUG_REPORT_URL=https://bugs.llvm.org/", |
| "ENABLE_BACKTRACES=1", |
| "ENABLE_CRASH_OVERRIDES=1", |
| "BACKTRACE_HEADER=execinfo.h", |
| "HAVE_CRASHREPORTERCLIENT_H=", |
| "HAVE_DECL_FE_ALL_EXCEPT=1", |
| "HAVE_DECL_FE_INEXACT=1", |
| "LLVM_ENABLE_DIA_SDK=", |
| "LLVM_ENABLE_CRASH_DUMPS=", |
| "HAVE_ERRNO_H=1", |
| "HAVE_FCNTL_H=1", |
| "HAVE_FENV_H=1", |
| "HAVE_FFI_CALL=", |
| "HAVE_FFI_FFI_H=", |
| "HAVE_FFI_H=", |
| "HAVE_LIBPFM=", |
| "HAVE_LIBPSAPI=", |
| "HAVE_MALLCTL=", |
| "HAVE_SIGNAL_H=1", |
| "HAVE_STD_IS_TRIVIALLY_COPYABLE=1", |
| "HAVE_STRERROR=1", |
| "HAVE_SYS_STAT_H=1", |
| "HAVE_SYS_TYPES_H=1", |
| "HAVE_VALGRIND_VALGRIND_H=", |
| "HAVE__ALLOCA=", |
| "HAVE___ALLOCA=", |
| "HAVE___ASHLDI3=", |
| "HAVE___ASHRDI3=", |
| "HAVE___CHKSTK=", |
| "HAVE___CHKSTK_MS=", |
| "HAVE___CMPDI2=", |
| "HAVE___DIVDI3=", |
| "HAVE___FIXDFDI=", |
| "HAVE___FIXSFDI=", |
| "HAVE___FLOATDIDF=", |
| "HAVE___LSHRDI3=", |
| "HAVE___MAIN=", |
| "HAVE___MODDI3=", |
| "HAVE___UDIVDI3=", |
| "HAVE___UMODDI3=", |
| "HAVE____CHKSTK=", |
| "HAVE____CHKSTK_MS=", |
| "HOST_LINK_VERSION=", |
| "LLVM_TARGET_TRIPLE_ENV=", |
| "LLVM_VERSION_INFO=", |
| "LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO=1", |
| "PACKAGE_BUGREPORT=https://bugs.llvm.org/", |
| "PACKAGE_NAME=LLVM", |
| "PACKAGE_STRING=LLVM ${llvm_version}svn", |
| "PACKAGE_VERSION=${llvm_version}svn", |
| "PACKAGE_VENDOR=", |
| "RETSIGTYPE=void", |
| "LLVM_GISEL_COV_ENABLED=", |
| "LLVM_GISEL_COV_PREFIX=", |
| "LLVM_WITH_Z3=", |
| |
| # FIXME: Set to 1 on mac once the 10.14 SDK is in common use. |
| "LLVM_SUPPORT_XCODE_SIGNPOSTS=", |
| |
| # This is both in llvm-config.h and config.h; llvm-config.h doesn't |
| # define it if it's not set while config.h defines it to empty in that case. |
| "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple", |
| ] |
| |
| if (current_os == "linux" || current_os == "android") { |
| values += [ |
| "HAVE_FUTIMENS=1", |
| "HAVE_LINK_H=1", |
| "HAVE_LSEEK64=1", |
| "HAVE_MALLINFO=1", |
| "HAVE_POSIX_FALLOCATE=1", |
| "HAVE_SCHED_GETAFFINITY=1", |
| "HAVE_CPU_COUNT=1", |
| "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=1", |
| ] |
| } else { |
| values += [ |
| "HAVE_FUTIMENS=", |
| "HAVE_LINK_H=", |
| "HAVE_LSEEK64=", |
| "HAVE_MALLINFO=", |
| "HAVE_POSIX_FALLOCATE=", |
| "HAVE_SCHED_GETAFFINITY=", |
| "HAVE_CPU_COUNT=", |
| "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=", |
| ] |
| } |
| |
| if (current_os == "mac") { |
| values += [ |
| "HAVE_CRASHREPORTER_INFO=1", |
| "HAVE_DECL_ARC4RANDOM=1", |
| "HAVE_DLADDR=1", |
| "HAVE_MACH_MACH_H=1", |
| "HAVE_MALLOC_MALLOC_H=1", |
| "HAVE_MALLOC_ZONE_STATISTICS=1", |
| "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1", |
| ] |
| } else { |
| values += [ |
| "HAVE_CRASHREPORTER_INFO=", |
| "HAVE_DECL_ARC4RANDOM=", |
| "HAVE_DLADDR=", |
| "HAVE_MACH_MACH_H=", |
| "HAVE_MALLOC_MALLOC_H=", |
| "HAVE_MALLOC_ZONE_STATISTICS=", |
| "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=", |
| ] |
| } |
| |
| if (current_os == "linux" || current_os == "mac") { |
| values += [ |
| "HAVE_BACKTRACE=1", |
| "HAVE_POSIX_SPAWN=1", |
| "HAVE_PTHREAD_GETNAME_NP=1", |
| ] |
| } else { |
| values += [ |
| "HAVE_BACKTRACE=", |
| "HAVE_POSIX_SPAWN=", |
| "HAVE_PTHREAD_GETNAME_NP=", |
| ] |
| } |
| |
| if (current_os == "win") { |
| values += [ |
| "HAVE_DECL_STRERROR_S=1", |
| "HAVE_DLFCN_H=", |
| "HAVE_DLOPEN=", |
| "HAVE_FUTIMES=", |
| "HAVE_GETPAGESIZE=", |
| "HAVE_GETRLIMIT=", |
| "HAVE_GETRUSAGE=", |
| "HAVE_ISATTY=", |
| "HAVE_LIBPTHREAD=", |
| "HAVE_PTHREAD_SETNAME_NP=", |
| "HAVE_LIBZ=", |
| "HAVE_PREAD=", |
| "HAVE_PTHREAD_GETSPECIFIC=", |
| "HAVE_PTHREAD_H=", |
| "HAVE_PTHREAD_MUTEX_LOCK=", |
| "HAVE_PTHREAD_RWLOCK_INIT=", |
| "HAVE_SBRK=", |
| "HAVE_SETENV=", |
| "HAVE_SETRLIMIT=", |
| "HAVE_SIGALTSTACK=", |
| "HAVE_STRERROR_R=", |
| "HAVE_SYSCONF=", |
| "HAVE_SYS_IOCTL_H=", |
| "HAVE_SYS_MMAN_H=", |
| "HAVE_SYS_PARAM_H=", |
| "HAVE_SYS_RESOURCE_H=", |
| "HAVE_SYS_TIME_H=", |
| "HAVE_TERMIOS_H=", |
| "HAVE_UNISTD_H=", |
| "HAVE_ZLIB_H=", |
| "HAVE__CHSIZE_S=1", |
| "HAVE__UNWIND_BACKTRACE=", |
| "stricmp=_stricmp", |
| "strdup=_strdup", |
| ] |
| } else { |
| # POSIX-y system defaults. |
| values += [ |
| "HAVE_DECL_STRERROR_S=", |
| "HAVE_DLFCN_H=1", |
| "HAVE_DLOPEN=1", |
| "HAVE_FUTIMES=1", |
| "HAVE_GETPAGESIZE=1", |
| "HAVE_GETRLIMIT=1", |
| "HAVE_GETRUSAGE=1", |
| "HAVE_ISATTY=1", |
| "HAVE_LIBPTHREAD=1", |
| "HAVE_PTHREAD_SETNAME_NP=1", |
| "HAVE_LIBZ=1", |
| "HAVE_PREAD=1", |
| "HAVE_PTHREAD_GETSPECIFIC=1", |
| "HAVE_PTHREAD_H=1", |
| "HAVE_PTHREAD_MUTEX_LOCK=1", |
| "HAVE_PTHREAD_RWLOCK_INIT=1", |
| "HAVE_SBRK=1", |
| "HAVE_SETENV=1", |
| "HAVE_SETRLIMIT=1", |
| "HAVE_SIGALTSTACK=1", |
| "HAVE_STRERROR_R=1", |
| "HAVE_SYSCONF=1", |
| "HAVE_SYS_IOCTL_H=1", |
| "HAVE_SYS_MMAN_H=1", |
| "HAVE_SYS_PARAM_H=1", |
| "HAVE_SYS_RESOURCE_H=1", |
| "HAVE_SYS_TIME_H=1", |
| "HAVE_TERMIOS_H=1", |
| "HAVE_UNISTD_H=1", |
| "HAVE_ZLIB_H=1", |
| "HAVE__CHSIZE_S=", |
| "HAVE__UNWIND_BACKTRACE=1", |
| "stricmp=", |
| "strdup=", |
| ] |
| } |
| |
| if (current_os == "mac") { |
| values += [ "LTDL_SHLIB_EXT=.dylib" ] |
| } else if (current_os == "win") { |
| values += [ "LTDL_SHLIB_EXT=.dll" ] |
| } else { |
| values += [ "LTDL_SHLIB_EXT=.so" ] |
| } |
| |
| if (llvm_enable_libedit) { |
| values += [ "HAVE_LIBEDIT=1" ] |
| } else { |
| values += [ "HAVE_LIBEDIT=" ] |
| } |
| |
| if (llvm_enable_libxar) { |
| values += [ "HAVE_LIBXAR=1" ] |
| } else { |
| values += [ "HAVE_LIBXAR=" ] |
| } |
| |
| if (llvm_enable_terminfo) { |
| values += [ "HAVE_TERMINFO=1" ] |
| } else { |
| values += [ "HAVE_TERMINFO=" ] |
| } |
| |
| if (llvm_enable_zlib) { |
| values += [ "LLVM_ENABLE_ZLIB=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_ZLIB=" ] |
| } |
| |
| if (llvm_enable_libxml2) { |
| values += [ "LLVM_LIBXML2_ENABLED=1" ] |
| } else { |
| values += [ "LLVM_LIBXML2_ENABLED=" ] |
| } |
| } |
| |
| write_cmake_config("llvm-config") { |
| input = "llvm-config.h.cmake" |
| output = "$target_gen_dir/llvm-config.h" |
| values = [ |
| "LLVM_ENABLE_DUMP=", |
| "LINK_POLLY_INTO_TOOLS=", |
| "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple", |
| "LLVM_HAS_ATOMICS=1", |
| "LLVM_HOST_TRIPLE=$llvm_current_triple", |
| "LLVM_NATIVE_ARCH=$native_target", |
| "LLVM_NATIVE_ASMPARSER=1", |
| "LLVM_NATIVE_ASMPRINTER=1", |
| "LLVM_NATIVE_DISASSEMBLER=1", |
| "LLVM_NATIVE_TARGET=1", |
| "LLVM_NATIVE_TARGETINFO=1", |
| "LLVM_NATIVE_TARGETMC=1", |
| "LLVM_USE_INTEL_JITEVENTS=", |
| "LLVM_USE_OPROFILE=", |
| "LLVM_USE_PERF=", |
| "LLVM_VERSION_MAJOR=$llvm_version_major", |
| "LLVM_VERSION_MINOR=$llvm_version_minor", |
| "LLVM_VERSION_PATCH=$llvm_version_patch", |
| "PACKAGE_VERSION=${llvm_version}svn", |
| "LLVM_FORCE_ENABLE_STATS=", |
| ] |
| |
| if (current_os == "win") { |
| values += [ "LLVM_ON_UNIX=" ] |
| } else { |
| values += [ "LLVM_ON_UNIX=1" ] |
| } |
| |
| if (llvm_enable_threads) { |
| values += [ "LLVM_ENABLE_THREADS=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_THREADS=" ] |
| } |
| } |
| |
| ############################################################################## |
| # .def files used by llvm/lib/Target |
| |
| template("write_target_def_file") { |
| assert(defined(invoker.key), "must set 'key' in $target_name") |
| assert(defined(invoker.value), "must set 'value' in $target_name") |
| |
| write_cmake_config(target_name) { |
| visibility = [ ":write_target_def_files" ] |
| input = "$target_name.in" |
| output = "$target_gen_dir/$target_name" |
| |
| # Build something like |
| # `LLVM_ENUM_ASM_PARSERS=LLVM_ASM_PARSER(ARM)\nLLVM_ASM_PARSER(X86)\n`. Note |
| # that \n is a literal '\' followed by a literal 'n', not a newline |
| # character. (write_cmake_config.py replaces that with a real newline). |
| value = "" |
| foreach(target, llvm_targets_to_build) { |
| value = "$value${invoker.value}($target)\n" |
| } |
| values = [ "${invoker.key}=$value" ] |
| } |
| } |
| |
| write_target_def_file("AsmParsers.def") { |
| key = "LLVM_ENUM_ASM_PARSERS" |
| value = "LLVM_ASM_PARSER" |
| } |
| |
| write_target_def_file("AsmPrinters.def") { |
| key = "LLVM_ENUM_ASM_PRINTERS" |
| value = "LLVM_ASM_PRINTER" |
| } |
| |
| write_target_def_file("Disassemblers.def") { |
| key = "LLVM_ENUM_DISASSEMBLERS" |
| value = "LLVM_DISASSEMBLER" |
| } |
| |
| write_target_def_file("Targets.def") { |
| key = "LLVM_ENUM_TARGETS" |
| value = "LLVM_TARGET" |
| } |
| |
| group("write_target_def_files") { |
| visibility = [ |
| "//llvm/lib/Support", |
| "//llvm/lib/Target", |
| ] |
| deps = [ |
| ":AsmParsers.def", |
| ":AsmPrinters.def", |
| ":Disassemblers.def", |
| ":Targets.def", |
| ] |
| } |