xref: /aosp_15_r20/external/cronet/build/config/c++/BUILD.gn (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Workerimport("//build/config/c++/c++.gni")
2*6777b538SAndroid Build Coastguard Workerimport("//build/config/chrome_build.gni")
3*6777b538SAndroid Build Coastguard Workerimport("//build/config/chromeos/ui_mode.gni")
4*6777b538SAndroid Build Coastguard Workerimport("//build/config/compiler/compiler.gni")
5*6777b538SAndroid Build Coastguard Workerimport("//build/config/dcheck_always_on.gni")
6*6777b538SAndroid Build Coastguard Workerimport("//buildtools/deps_revisions.gni")
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Workerassert(use_custom_libcxx, "should only be used if use_custom_libcxx is set")
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker# This is included by reference in the //build/config/compiler:runtime_library
11*6777b538SAndroid Build Coastguard Worker# config that is applied to all targets. It is here to separate out the logic
12*6777b538SAndroid Build Coastguard Worker# that is specific to libc++. Please see that target for advice on what should
13*6777b538SAndroid Build Coastguard Worker# go in :runtime_library vs. :compiler.
14*6777b538SAndroid Build Coastguard Workerconfig("runtime_library") {
15*6777b538SAndroid Build Coastguard Worker  cflags = []
16*6777b538SAndroid Build Coastguard Worker  cflags_cc = []
17*6777b538SAndroid Build Coastguard Worker  defines = []
18*6777b538SAndroid Build Coastguard Worker  include_dirs = []
19*6777b538SAndroid Build Coastguard Worker  ldflags = []
20*6777b538SAndroid Build Coastguard Worker  libs = []
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker  # Fixed libc++ configuration macros are in
23*6777b538SAndroid Build Coastguard Worker  # buildtools/third_party/libc++/__config_site. This config only has defines
24*6777b538SAndroid Build Coastguard Worker  # that vary depending on gn args, and non-define flags.
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker  if (!libcxx_is_shared) {
27*6777b538SAndroid Build Coastguard Worker    # Don't leak any symbols on a static build.
28*6777b538SAndroid Build Coastguard Worker    defines += [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ]
29*6777b538SAndroid Build Coastguard Worker    if (!export_libcxxabi_from_executables && !is_win) {
30*6777b538SAndroid Build Coastguard Worker      defines += [ "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" ]
31*6777b538SAndroid Build Coastguard Worker    }
32*6777b538SAndroid Build Coastguard Worker  }
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker  include_dirs += [ "//buildtools/third_party/libc++" ]
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker  # libc++ has two levels of additional checking:
37*6777b538SAndroid Build Coastguard Worker  # 1. _LIBCPP_ENABLE_ASSERTIONS enables assertions for bounds checking.
38*6777b538SAndroid Build Coastguard Worker  #    We always enable this in __config_site, in all build configurations.
39*6777b538SAndroid Build Coastguard Worker  # 2. _LIBCPP_ENABLE_DEBUG_MODE enables iterator debugging and other
40*6777b538SAndroid Build Coastguard Worker  #    expensive checks. Enable these only if enable_iterator_debugging is on.
41*6777b538SAndroid Build Coastguard Worker  if (enable_iterator_debugging) {
42*6777b538SAndroid Build Coastguard Worker    defines += [ "_LIBCPP_ENABLE_DEBUG_MODE" ]
43*6777b538SAndroid Build Coastguard Worker  }
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker  defines += [ "CR_LIBCXX_REVISION=$libcxx_revision" ]
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker  # Temporarily add a define to force a rebuild when changing
48*6777b538SAndroid Build Coastguard Worker  # buildtools/third_party/libc++/__config_site which isn't picked up by
49*6777b538SAndroid Build Coastguard Worker  # dependency tracking (because it's an #include of headers included via
50*6777b538SAndroid Build Coastguard Worker  # -isysroot).
51*6777b538SAndroid Build Coastguard Worker  # TODO(thakis): Remove this after a few days.
52*6777b538SAndroid Build Coastguard Worker  if (is_fuchsia) {
53*6777b538SAndroid Build Coastguard Worker    defines += [ "TEMP_REBUILD_HACK" ]
54*6777b538SAndroid Build Coastguard Worker  }
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker  if (is_win) {
57*6777b538SAndroid Build Coastguard Worker    # Intentionally not using libc++abi on Windows because libc++abi only
58*6777b538SAndroid Build Coastguard Worker    # implements the Itanium C++ ABI, and not the Microsoft ABI which we use on
59*6777b538SAndroid Build Coastguard Worker    # Windows (and we need to use in order to interoperate correctly with COM
60*6777b538SAndroid Build Coastguard Worker    # among other things).
61*6777b538SAndroid Build Coastguard Worker    assert(!export_libcxxabi_from_executables,
62*6777b538SAndroid Build Coastguard Worker           "Don't use libcxxabi on Windows.")
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker    cflags_cc +=
65*6777b538SAndroid Build Coastguard Worker        [ "-I" + rebase_path("$libcxx_prefix/include", root_build_dir) ]
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker    # Add a debug visualizer for Microsoft's debuggers so that they can display
68*6777b538SAndroid Build Coastguard Worker    # libc++ types well.
69*6777b538SAndroid Build Coastguard Worker    if (libcxx_natvis_include) {
70*6777b538SAndroid Build Coastguard Worker      # chrome.natvis listed as an input in //buildtools/third_party/libc++ to
71*6777b538SAndroid Build Coastguard Worker      # guarantee relinking on changes.
72*6777b538SAndroid Build Coastguard Worker      ldflags += [ "/NATVIS:" + rebase_path("libc++.natvis", root_build_dir) ]
73*6777b538SAndroid Build Coastguard Worker    }
74*6777b538SAndroid Build Coastguard Worker  } else {
75*6777b538SAndroid Build Coastguard Worker    cflags_cc += [
76*6777b538SAndroid Build Coastguard Worker      "-nostdinc++",
77*6777b538SAndroid Build Coastguard Worker      "-isystem" + rebase_path("$libcxx_prefix/include", root_build_dir),
78*6777b538SAndroid Build Coastguard Worker      "-isystem" + rebase_path("$libcxxabi_prefix/include", root_build_dir),
79*6777b538SAndroid Build Coastguard Worker    ]
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker    cflags_objcc = cflags_cc
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker    # Make sure we don't link against the system libstdc++ or libc++.
84*6777b538SAndroid Build Coastguard Worker    if (is_clang) {
85*6777b538SAndroid Build Coastguard Worker      ldflags += [ "-nostdlib++" ]
86*6777b538SAndroid Build Coastguard Worker    } else {
87*6777b538SAndroid Build Coastguard Worker      # Gcc has a built-in abs() definition with default visibility.
88*6777b538SAndroid Build Coastguard Worker      # If it was not disabled, it would conflict with libc++'s abs()
89*6777b538SAndroid Build Coastguard Worker      # with hidden visibility.
90*6777b538SAndroid Build Coastguard Worker      cflags += [ "-fno-builtin-abs" ]
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker      ldflags += [ "-nodefaultlibs" ]
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker      # Unfortunately, there's no way to disable linking against just libc++
95*6777b538SAndroid Build Coastguard Worker      # (gcc doesn't have -notstdlib++:
96*6777b538SAndroid Build Coastguard Worker      # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83931); -nodefaultlibs
97*6777b538SAndroid Build Coastguard Worker      # removes all of the default libraries, so add back the ones that we need.
98*6777b538SAndroid Build Coastguard Worker      libs += [
99*6777b538SAndroid Build Coastguard Worker        "c",
100*6777b538SAndroid Build Coastguard Worker        "gcc_s",
101*6777b538SAndroid Build Coastguard Worker        "m",
102*6777b538SAndroid Build Coastguard Worker        "rt",
103*6777b538SAndroid Build Coastguard Worker      ]
104*6777b538SAndroid Build Coastguard Worker    }
105*6777b538SAndroid Build Coastguard Worker  }
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker  # In a world without NaCl, the `runtime_library` config would also configure
108*6777b538SAndroid Build Coastguard Worker  # the `_LIBCPP_ENABLE_ASSERTIONS` define to enable hardening when using the
109*6777b538SAndroid Build Coastguard Worker  # custom hermetic libc++. However, this is currently added by the `compiler`
110*6777b538SAndroid Build Coastguard Worker  # config instead, since this hardening define should also be used by the NaCl
111*6777b538SAndroid Build Coastguard Worker  # saigo toolchain, which uses a prebuilt libc++ that is distinct from the
112*6777b538SAndroid Build Coastguard Worker  # custom hermetic libc++.
113*6777b538SAndroid Build Coastguard Worker}
114