blob: 6494bb02d49e8416fd28b1f2c07d253f9477ffab [file] [log] [blame]
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",
]
}
}
}