# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/sanitizers/sanitizers.gni")
import("//build_overrides/build.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_apple || is_linux ||
                      is_chromeos || (is_win && is_clang)

  # 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
}

# TODO(https://crbug.com/1385662): This is temporarily guarded to make it easier
# to roll out this change. Once the various projects (ANGLE, v8, et cetera)
# rolling in Chrome's //build have updated, remove this entirely.
if (!defined(enable_safe_libcxx)) {
  enable_safe_libcxx = true
}

# 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_apple && !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"

assert(!(is_ios && libcxx_is_shared),
       "Can't build libc++ as a shared library on iOS.")
