# Copyright 2017 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") import("//build/config/sanitizers/sanitizers.gni") declare_args() { # Use in-tree libc++ (buildtools/third_party/libc++ and # buildtools/third_party/libc++abi) instead of the system C++ library for C++ # standard library support. # Don't check in changes that set this to false for more platforms; doing so # is not supported. use_custom_libcxx = is_fuchsia || is_android || is_mac || (is_ios && !use_xcode_clang) || (is_win && is_clang) || ((is_linux || is_chromeos) && (!is_chromeos_ash || default_toolchain != "//build/toolchain/cros:target")) # Use libc++ instead of stdlibc++ when using the host_cpu toolchain, even if # use_custom_libcxx is false. This is useful for cross-compiles where a custom # toolchain for the target_cpu has been set as the default toolchain, but # use_custom_libcxx should still be true when building for the host. The # expected usage is to set use_custom_libcxx=false and # use_custom_libcxx_for_host=true in the passed in buildargs. use_custom_libcxx_for_host = false # Builds libcxx Natvis into the symbols for type visualization. # Set to false to workaround http://crbug.com/966676 and # http://crbug.com/966687. libcxx_natvis_include = true # When set, enables libc++ debug mode with iterator debugging. # # Iterator debugging is generally useful for catching bugs. But it can # introduce extra locking to check the state of an iterator against the state # of the current object. For iterator- and thread-heavy code, this can # significantly slow execution - two orders of magnitude slowdown has been # seen (crbug.com/903553) and iterator debugging also slows builds by making # generation of snapshot_blob.bin take ~40-60 s longer. Therefore this # defaults to off. enable_iterator_debugging = false } use_custom_libcxx = use_custom_libcxx || (use_custom_libcxx_for_host && !is_a_target_toolchain) use_custom_libcxx = use_custom_libcxx && !is_nacl declare_args() { # WARNING: Setting this to a non-default value is highly discouraged. # If true, libc++ will be built as a shared library; otherwise libc++ will be # linked statically. Setting this to something other than the default is # unsupported and can be broken by libc++ rolls. Note that if this is set to # true, you must also set libcxx_abi_unstable=false, which is bad for # performance and memory use. libcxx_is_shared = use_custom_libcxx && is_component_build } # libc++abi needs to be exported from executables to be picked up by shared # libraries on certain instrumented builds. export_libcxxabi_from_executables = use_custom_libcxx && !is_ios && !is_win && !is_component_build && (is_asan || is_ubsan_vptr) # On Android, many shared libraries get loaded from the context of a JRE. In # this case, there's no "main executable" to export libc++abi from. We could # export libc++abi from each "toplevel" shared library instead, but that would # require adding an explicit dependency for each one, and might introduce # subtle, hard-to-fix problems down the line if the dependency is missing. # # export_libcxxabi_from_executables was added to avoid having an RPATH set in # static sanitizer builds just for executables to find libc++. But on Android, # the Bionic dynamic loader doesn't even look at RPATH; instead, LD_LIBRARY_PATH # is set for tests. Because of this, we make libc++ a shared library on android # since it should get loaded properly. if (is_android && export_libcxxabi_from_executables) { export_libcxxabi_from_executables = false libcxx_is_shared = true } libcxx_prefix = "//buildtools/third_party/libc++/trunk" libcxxabi_prefix = "//buildtools/third_party/libc++abi/trunk"