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