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