# Copyright 2015 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/c++/c++.gni")

source_set("libc++abi") {
  visibility = [ "//buildtools/third_party/libc++" ]
  deps = []

  # Fuchsia builds don't link against any libraries that provide stack unwinding
  # symbols, unlike Linux does with glibc.  Build and link against libunwind
  # manually to get this functionality.
  if (is_fuchsia) {
    deps += [ "//buildtools/third_party/libunwind" ]
  }

  sources = [
    "trunk/src/abort_message.cpp",
    "trunk/src/cxa_aux_runtime.cpp",
    "trunk/src/cxa_default_handlers.cpp",
    "trunk/src/cxa_exception.cpp",
    "trunk/src/cxa_exception_storage.cpp",
    "trunk/src/cxa_guard.cpp",
    "trunk/src/cxa_handlers.cpp",

    # This file is supposed to be used in fno-exception builds of
    # libc++abi.  We build lib++/libc++abi with exceptions enabled.
    #"trunk/src/cxa_noexception.cpp",
    "trunk/src/cxa_personality.cpp",
    "trunk/src/cxa_unexpected.cpp",
    "trunk/src/cxa_vector.cpp",
    "trunk/src/cxa_virtual.cpp",
    "trunk/src/fallback_malloc.cpp",
    "trunk/src/private_typeinfo.cpp",
    "trunk/src/stdlib_exception.cpp",
    "trunk/src/stdlib_stdexcept.cpp",
    "trunk/src/stdlib_typeinfo.cpp",
  ]

  # See the comment in cxa_demangle_stub.cc for why we don't use LLVM's
  # demangler on android.
  if (is_android) {
    deps += [ ":cxa_demangle_stub" ]
  } else {
    sources += [ "trunk/src/cxa_demangle.cpp" ]
  }

  # This file should really be included on linux as well, but that
  # would introduce an unwanted glibc 2.18 dependency.
  if (is_fuchsia || (is_posix && !is_mac && !is_linux)) {
    sources += [ "trunk/src/cxa_thread_atexit.cpp" ]
  }

  defines = [
    "LIBCXXABI_SILENT_TERMINATE",
    "_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS",
  ]

  configs -= [
    "//build/config/compiler:chromium_code",
    "//build/config/compiler:no_exceptions",
    "//build/config/compiler:no_rtti",
    "//build/config/coverage:default_coverage",
  ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//build/config/compiler:exceptions",
    "//build/config/compiler:rtti",
    "//buildtools/third_party/libc++:config",
  ]
}

source_set("cxa_demangle_stub") {
  # TODO(thomasanderson): This file is currently pulled in from //base on
  # Android, but will no longer be needed once Android builds always set
  # use_custom_libcxx=true.  When this happens, this target can be removed,
  # cxa_demangle_stub.cc can be added to the libc++abi target above, and
  # __cxa_demangle can simply be annoted with _LIBCXXABI_FUNC_VIS.
  if (use_custom_libcxx && !libcpp_is_static) {
    defines = [ "EXPORT_CXA_DEMANGLE" ]
  }
  sources = [ "cxa_demangle_stub.cc" ]
}
