| 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", |
| ] |
| } |
| } |
| } |