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