import("//build/config/c++/c++.gni")
import("//build/config/chrome_build.gni")
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/dcheck_always_on.gni")
import("//buildtools/deps_revisions.gni")

assert(use_custom_libcxx, "should only be used if use_custom_libcxx is set")

declare_args() {
  # lldb pretty printing only works when libc++ is built in the __1 (or __ndk1)
  # namespaces.  For pretty printing to work out-of-the-box on Mac (where lldb
  # is primarily used), this flag is set to false to build with the __1
  # namespace (to maintain ABI compatibility, this implies building without
  # _LIBCPP_ABI_UNSTABLE).  This is not necessary on non-component builds
  # because we leave the ABI version set to __1 in that case because libc++
  # symbols are not exported.
  # TODO(thomasanderson): Set this to true by default once rL352899 is available
  # in MacOS's lldb.
  libcxx_abi_unstable = !(is_apple && is_debug && is_component_build)
}

# TODO(xiaohuic): https://crbug/917533 Crashes on internal ChromeOS build.
# Do unconditionally once the underlying problem is fixed.
if (is_chromeos_ash && is_chrome_branded) {
  libcxx_abi_unstable = false
}

# This is included by reference in the //build/config/compiler:runtime_library
# config that is applied to all targets. It is here to separate out the logic
# that is specific to libc++. Please see that target for advice on what should
# go in :runtime_library vs. :compiler.
config("runtime_library") {
  cflags = []
  cflags_cc = []
  defines = []
  ldflags = []
  libs = []

  if (libcxx_abi_unstable) {
    defines += [ "_LIBCPP_ABI_UNSTABLE" ]
  }

  if (libcxx_is_shared) {
    # When libcxx_is_shared is true, symbols from libc++.so are exported for
    # all DSOs to use.  If the system libc++ gets loaded (indirectly through
    # a system library), then it will conflict with our libc++.so.  Add a
    # custom ABI version if we're building with _LIBCPP_ABI_UNSTABLE to avoid
    # conflicts.
    #
    # Windows doesn't need to set _LIBCPP_ABI_VERSION since there's no system
    # C++ library we could conflict with.
    if (libcxx_abi_unstable && !is_win) {
      defines += [ "_LIBCPP_ABI_VERSION=Cr" ]
    }
  } else {
    # Don't leak any symbols on a static build.
    defines += [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ]
    if (!export_libcxxabi_from_executables && !is_win) {
      defines += [ "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" ]
    }
  }

  defines += [
    "_LIBCPP_ENABLE_NODISCARD",

    # TODO(crbug.com/1166707): libc++ requires this macro.
    "_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS",
  ]

  # Work around a symbol conflict between GRPC and the Fuchsia SDK.
  # TODO(crbug.com/1166970): Remove this when resolved.
  if (is_fuchsia) {
    defines += [ "_LIBCPP_NO_NATIVE_SEMAPHORES" ]
  }

  # The Windows component build fails to link with libc++'s debug mode. See
  # https://crbug.com/923166#c33, https://crbug.com/923166#c44, and
  # https://llvm.org/PR41018.
  if (!(is_win && is_component_build)) {
    # libc++ has two levels of debug mode. Setting _LIBCPP_DEBUG to zero
    # enables most assertions. Setting it to one additionally enables iterator
    # debugging. See https://libcxx.llvm.org/docs/DesignDocs/DebugMode.html
    if (enable_iterator_debugging) {
      defines += [ "_LIBCPP_DEBUG=1" ]
    } else if (is_debug || dcheck_always_on) {
      defines += [ "_LIBCPP_DEBUG=0" ]
    }
  }

  if (is_win) {
    # Intentionally not using libc++abi on Windows because libc++abi only
    # implements the Itanium C++ ABI, and not the Microsoft ABI which we use on
    # Windows (and we need to use in order to interoperate correctly with COM
    # among other things).
    assert(!export_libcxxabi_from_executables,
           "Don't use libcxxabi on Windows.")

    cflags_cc +=
        [ "-I" + rebase_path("$libcxx_prefix/include", root_build_dir) ]

    # Prevent libc++ from embedding linker flags to try to automatically link
    # against its runtime library. This is unnecessary with our build system,
    # and can also result in build failures if libc++'s name for a library
    # does not match ours.
    defines += [ "_LIBCPP_NO_AUTO_LINK" ]

    if (is_component_build) {
      # TODO(crbug.com/1090975): Disable the exclude_from_explicit_instantiation
      # to work around compiler bugs in the interaction between it and
      # dllimport/dllexport.
      defines += [ "_LIBCPP_HIDE_FROM_ABI=_LIBCPP_HIDDEN" ]
    }

    # Add a debug visualizer for Microsoft's debuggers so that they can display
    # libc++ types well.
    if (libcxx_natvis_include) {
      # chrome.natvis listed as an input in //buildtools/third_party/libc++ to
      # guarantee relinking on changes.
      ldflags += [ "/NATVIS:" + rebase_path("libc++.natvis", root_build_dir) ]
    }
  } else {
    cflags_cc += [
      "-nostdinc++",
      "-isystem" + rebase_path("$libcxx_prefix/include", root_build_dir),
      "-isystem" + rebase_path("$libcxxabi_prefix/include", root_build_dir),
    ]
    cflags_objcc = cflags_cc

    defines += [ "CR_LIBCXX_REVISION=$libcxx_revision" ]

    # Make sure we don't link against the system libstdc++ or libc++.
    if (is_clang) {
      ldflags += [ "-nostdlib++" ]
    } else {
      # Gcc has a built-in abs() definition with default visibility.
      # If it was not disabled, it would conflict with libc++'s abs()
      # with hidden visibility.
      cflags += [ "-fno-builtin-abs" ]

      ldflags += [ "-nodefaultlibs" ]

      # Unfortunately, there's no way to disable linking against just libc++
      # (gcc doesn't have -notstdlib++:
      # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83931); -nodefaultlibs
      # removes all of the default libraries, so add back the ones that we need.
      libs += [
        "c",
        "gcc_s",
        "m",
        "rt",
      ]
    }
  }
}
