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