| # 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" ] | 
 |   } | 
 | } | 
 |  | 
 | if (libcpp_is_static) { | 
 |   link_target_type = "source_set" | 
 | } else { | 
 |   link_target_type = "shared_library" | 
 | } | 
 | target(link_target_type, "libc++") { | 
 |   if (!libcpp_is_static) { | 
 |     no_default_deps = true | 
 |   } | 
 |   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 && !libcpp_is_static) { | 
 |     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 && !libcpp_is_static) { | 
 |     # 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 (libcpp_is_static) { | 
 |     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_win) { | 
 |     defines += [ "LIBCXX_BUILDING_LIBCXXABI" ] | 
 |     deps = [ | 
 |       "//buildtools/third_party/libc++abi", | 
 |     ] | 
 |   } | 
 | } |