# 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")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/toolchain/toolchain.gni")

# Used by libc++ and libc++abi.
config("config") {
  cflags = [ "-fstrict-aliasing" ]
  if (is_win) {
    cflags += [
      # libc++ wants to redefine the macros WIN32_LEAN_AND_MEAN and _CRT_RAND_S
      # in its implementation.
      "-Wno-macro-redefined",

      # We want to use a uniform C++ version across all of chromium, but
      # upstream libc++ requires C++20 so we have to make an exception here.
      # No other target should override the default -std= flag.
      "-std:c++20",
    ]
  } else {
    cflags += [
      "-fPIC",
      "-std=c++20",
    ]
  }

  defines = [ "_LIBCPP_BUILDING_LIBRARY" ]
}

# Explicitly set version macros to Windows 7 to prevent libc++ from adding a
# hard dependency on GetSystemTimePreciseAsFileTime, which was introduced in
# Windows 8.
config("winver") {
  defines = [
    "NTDDI_VERSION=NTDDI_WIN7",
    "_WIN32_WINNT=_WIN32_WINNT_WIN7",
    "WINVER=_WIN32_WINNT_WIN7",
  ]
}

if (libcxx_is_shared) {
  _libcxx_target_type = "shared_library"
} else {
  _libcxx_target_type = "source_set"
}
target(_libcxx_target_type, "libc++") {
  # Most things that need to depend on libc++ should do so via the implicit
  # 'common_deps' dependency below.  Some targets that package libc++.so may
  # need to explicitly depend on libc++.
  visibility = [
    "//build/config:common_deps",
    "//third_party/catapult/devil:devil",
  ]
  if (is_linux && !is_chromeos) {
    # This target packages libc++.so, so must have an explicit dependency on
    # libc++.
    visibility +=
        [ "//remoting/host/linux:remoting_me2me_host_copy_user_session" ]
  }
  if (libcxx_is_shared) {
    no_default_deps = true
  }

  if (is_linux && !is_clang) {
    libs = [ "atomic" ]
  }

  sources = [
    "trunk/src/algorithm.cpp",
    "trunk/src/any.cpp",
    "trunk/src/atomic.cpp",
    "trunk/src/barrier.cpp",
    "trunk/src/bind.cpp",
    "trunk/src/charconv.cpp",
    "trunk/src/chrono.cpp",
    "trunk/src/condition_variable.cpp",
    "trunk/src/condition_variable_destructor.cpp",
    "trunk/src/debug.cpp",
    "trunk/src/exception.cpp",
    "trunk/src/functional.cpp",
    "trunk/src/future.cpp",
    "trunk/src/hash.cpp",
    "trunk/src/ios.cpp",
    "trunk/src/ios.instantiations.cpp",
    "trunk/src/iostream.cpp",
    "trunk/src/locale.cpp",
    "trunk/src/memory.cpp",
    "trunk/src/mutex.cpp",
    "trunk/src/mutex_destructor.cpp",
    "trunk/src/new.cpp",
    "trunk/src/optional.cpp",
    "trunk/src/random.cpp",
    "trunk/src/random_shuffle.cpp",
    "trunk/src/regex.cpp",
    "trunk/src/shared_mutex.cpp",
    "trunk/src/stdexcept.cpp",
    "trunk/src/string.cpp",
    "trunk/src/strstream.cpp",
    "trunk/src/system_error.cpp",
    "trunk/src/thread.cpp",
    "trunk/src/typeinfo.cpp",
    "trunk/src/utility.cpp",
    "trunk/src/valarray.cpp",
    "trunk/src/variant.cpp",
    "trunk/src/vector.cpp",
  ]
  if (is_win) {
    sources += [
      "trunk/src/support/win32/locale_win32.cpp",
      "trunk/src/support/win32/support.cpp",
      "trunk/src/support/win32/thread_win32.cpp",
    ]
    configs -= [ "//build/config/win:winver" ]
    configs += [ ":winver" ]
    if (libcxx_natvis_include) {
      inputs = [
        # libc++.natvis listed as an input here instead of in
        # //build/config/c++:runtime_library to prevent unnecessary size
        # increase in generated build files.
        "//build/config/c++/libc++.natvis",
      ]
    }
  }
  configs -= [
    "//build/config/compiler:chromium_code",
    "//build/config/compiler:no_exceptions",
    "//build/config/compiler:no_rtti",
    "//build/config/coverage:default_coverage",
  ]
  if (is_android && libcxx_is_shared) {
    # Use libc++_chrome to avoid conflicting with system libc++
    # See crbug.com/1076244#c11 for more detail.
    output_name = "libc++_chrome"
    configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
  }
  configs += [
    ":config",
    "//build/config/compiler:no_chromium_code",
    "//build/config/compiler:exceptions",
    "//build/config/compiler:rtti",
    "//build/config/sanitizers:sanitizer_options_link_helper",
  ]
  if (libcxx_is_shared && !is_win) {
    configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
    configs += [ "//build/config/gcc:symbol_visibility_default" ]
  }

  defines = []

  if (!libcxx_is_shared) {
    if (is_apple && is_clang) {
      # We want operator new/delete to be private on Mac, but these functions
      # are implicitly created by the compiler for each translation unit, as
      # specified in the C++ spec 3.7.4p2, which makes them always have default
      # visibility.  This option is needed to force hidden visibility since
      # -fvisibility=hidden doesn't have the desired effect.
      cflags = [ "-fvisibility-global-new-delete-hidden" ]
    } else {
      defines += [
        # This resets the visibility to default only for the various
        # flavors of operator new and operator delete.  These symbols
        # are weak and get overriden by Chromium-provided ones, but if
        # these symbols had hidden visibility, this would make the
        # Chromium symbols hidden too because elf visibility rules
        # require that linkers use the least visible form when merging,
        # and if this is hidden, then when we merge it with tcmalloc's
        # operator new, hidden visibility would win. However, tcmalloc
        # needs a visible operator new to also override operator new
        # references from system libraries.
        # TODO(lld): Ask lld for a --force-public-visibility flag or
        # similar to that overrides the default elf merging rules, and
        # make tcmalloc's gn config pass that to all its dependencies,
        # then remove this override here.
        "_LIBCPP_OVERRIDABLE_FUNC_VIS=__attribute__((__visibility__(\"default\")))",
      ]
    }
  }
  if (!is_apple && (is_asan || is_tsan || is_msan)) {
    # In {a,t,m}san configurations, operator new and operator delete will be
    # provided by the sanitizer runtime library.  Since libc++ defines these
    # symbols with weak linkage, and the *san runtime uses strong linkage, it
    # should technically be OK to omit this, but it's added to be explicit.
    defines += [ "_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS" ]
  }

  if (!is_win) {
    defines += [ "LIBCXX_BUILDING_LIBCXXABI" ]
    if (!export_libcxxabi_from_executables) {
      deps = [ "//buildtools/third_party/libc++abi" ]
    }
  }
}
