# 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) { # libc++ wants to redefine the macros WIN32_LEAN_AND_MEAN and _CRT_RAND_S in its # implementation. cflags += [ "-Wno-macro-redefined" ] } else { cflags += [ "-fPIC" ] } } component("libc++") { if (is_component_build) { no_default_deps = true } else { static_component_type = "source_set" } sources = [ "trunk/src/algorithm.cpp", "trunk/src/any.cpp", "trunk/src/bind.cpp", "trunk/src/chrono.cpp", "trunk/src/condition_variable.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/iostream.cpp", "trunk/src/locale.cpp", "trunk/src/memory.cpp", "trunk/src/mutex.cpp", "trunk/src/new.cpp", "trunk/src/optional.cpp", "trunk/src/random.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/compiler:chromium_code", "//build/config/compiler:no_exceptions", "//build/config/compiler:no_rtti", "//build/config/coverage:default_coverage", ] if (is_android && is_component_build) { 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", ] defines = [ "_LIBCPP_BUILDING_LIBRARY" ] if (!is_clang && is_component_build) { # This is a temporary workaround to get libc++ builds working with # gcc. It can be removed with either # https://reviews.llvm.org/D35326 or # https://reviews.llvm.org/D35388 lands. defines += [ "_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS=__attribute__((__visibility__(\"default\")))" ] } if (!is_component_build) { 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_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", ] } } }