import("//Meta/gn/build/buildflags.gni") import("//Meta/gn/build/mac_sdk.gni") import("//Meta/gn/build/sysroot.gni") import("//Meta/gn/build/toolchain/compiler.gni") declare_args() { # If set, puts relative paths in debug info. # Makes the build output independent of the build directory, but makes # most debuggers harder to use. See "Getting to local determinism" and # "Getting debuggers to work well with locally deterministic builds" in # http://blog.llvm.org/2019/11/deterministic-builds-with-clang-and-lld.html # for more information. use_relative_paths_in_debug_info = false # The version of host gcc. Ignored if is_clang is true. gcc_version = 12 } config("compiler_defaults") { defines = [] asmflags = [] cflags = [] cflags_cc = [] ldflags = [] if (symbol_level == 2) { if (is_debug_gdb) { cflags += [ "-ggdb" ] } else if (is_clang && is_debug_lldb) { # GCC (as of version 13) does not support lldb-specific debug information cflags += [ "-glldb" ] } else { cflags += [ "-g" ] } # For full debug-info -g builds, --gdb-index makes links ~15% slower, and # gdb symbol reading time 1500% faster (lld links in 4.4 instead of 3.9s, # and gdb loads and runs it in 2s instead of in 30s). It's likely that # people doing symbol_level=2 want to run a debugger (since # symbol_level=2 isn't the default). So this seems like the right # tradeoff. if (current_os != "mac" && use_lld) { cflags += [ "-ggnu-pubnames" ] # llvm PR34820 ldflags += [ "-Wl,--gdb-index" ] # Use debug fission. In this mode, detailed debug information is # written to a .dwo file next to each .o file instead of into the .o # file directly. The linker then only links the .o files, which contain # a pointer to each .dwo file. The debugger then reads debug info out # of all the .dwo files instead of from the binary. # # (The dwp tool can link all the debug info together into a single # "debug info binary", but that's not done as part of the build.) # # This requires `-Wl,--gdb-index` (above) to work well. # # With lld, this reduces link time: # - in release + symbol_level=2 builds: From 2.3s to 1.3s # - in debug builds: From 5.2s to 4.6s # # Time needed for gdb startup and setting a breakpoint is comparable, # the time from from `r` to hititng a breakpoint on main goes from 4s # to 2s. # # (macOS's linker always keeps debug info out of its output executables # and debuggers there also know to load debug info from the .o files. # macOS also has a debug info linker like dwp, it's called dsymutil. # This happens by default, so there's no need to pass a flag there.) cflags += [ "-gsplit-dwarf" ] ldflags += [ "-gsplit-dwarf" ] # Needed for ThinLTO builds. } } else if (symbol_level == 1) { cflags += [ "-g1" ] # For linetable-only -g1 builds, --gdb-index makes links ~8% slower, but # links are 4x faster than -g builds so it's a fairly small absolute cost. # On the other hand, gdb startup is well below 1s with and without the # index, and people using -g1 likely don't use a debugger. So don't use # the flag here. # Linetables always go in the .o file, even with -gsplit-dwarf, so there's # no point in passing -gsplit-dwarf here. } if (is_optimized) { cflags += [ "-O3" ] } cflags += [ "-fdiagnostics-color" ] cflags += [ "-ffp-contract=off" ] if (use_lld) { ldflags += [ "-Wl,--color-diagnostics" ] } cflags_cc += [ "-std=c++20", "-fvisibility-inlines-hidden", ] # Warning setup. cflags += [ "-Wall", "-Wextra", ] cflags += [ "-Wno-unused-parameter", "-Wno-invalid-offsetof", ] if (is_clang) { cflags += [ "-Wdelete-non-virtual-dtor", "-Wstring-conversion", "-Wno-user-defined-literals", "-fconstexpr-steps=16777216", "-Wno-unused-private-field", "-Wno-implicit-const-int-float-conversion", ] } else { cflags += [ # Disable gcc's potentially uninitialized use analysis as it presents # lots of false positives. "-Wno-maybe-uninitialized", # Disable -Wredundant-move on GCC>=9. GCC wants to remove std::move # in code like "A foo(ConvertibleToA a) { return std::move(a); }", # but this code does not compile (or uses the copy constructor # instead) on clang<=3.8. Clang also has a -Wredundant-move, but it # only fires when the types match exactly, so we can keep it here. "-Wno-redundant-move", "-Wno-literal-suffix", ] } if (use_lld) { ldflags += [ "-fuse-ld=lld" ] } # Deterministic build setup, see # http://blog.llvm.org/2019/11/deterministic-builds-with-clang-and-lld.html if (is_clang) { cflags += [ "-no-canonical-prefixes", "-Werror=date-time", ] if (use_relative_paths_in_debug_info) { cflags += [ "-fdebug-compilation-dir=." ] } } if (sysroot != "") { if (current_os != "mac" && current_os != "android") { cflags += [ "--sysroot=" + rebase_path(sysroot, root_build_dir) ] ldflags += [ "--sysroot=" + rebase_path(sysroot, root_build_dir) ] } } if (current_os == "mac") { sdk_path = mac_sdk_path cflags += [ "-isysroot", rebase_path(sdk_path, root_build_dir), ] ldflags += [ "-isysroot", rebase_path(sdk_path, root_build_dir), ] } if (sysroot != "" && current_os != "win" && is_clang) { cflags += [ "-Wpoison-system-directories" ] } cflags_objcc = cflags_cc } config("no_exceptions") { cflags_cc = [ "-fno-exceptions" ] cflags_objcc = cflags_cc } config("zdefs") { if (current_os != "mac" && current_os != "android") { ldflags = [ "-Wl,-z,defs" ] } } config("pic") { if (current_os != "mac") { cflags_cc = [ "-fPIC" ] } }