214 lines
6.9 KiB
Plaintext
214 lines
6.9 KiB
Plaintext
|
|
# Copyright 2015 The Chromium Authors
|
||
|
|
# 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) {
|
||
|
|
cflags += [
|
||
|
|
# libc++ wants to redefine the macros WIN32_LEAN_AND_MEAN and _CRT_RAND_S
|
||
|
|
# in its implementation.
|
||
|
|
"-Wno-macro-redefined",
|
||
|
|
]
|
||
|
|
|
||
|
|
cflags_cc = [
|
||
|
|
# We want to use a uniform C++ version across all of chromium, but
|
||
|
|
# upstream libc++ requires C++20 so we have to make an exception here.
|
||
|
|
# No other target should override the default -std= flag.
|
||
|
|
"-std:c++20",
|
||
|
|
]
|
||
|
|
} else {
|
||
|
|
cflags += [ "-fPIC" ]
|
||
|
|
cflags_cc = [ "-std=c++20" ]
|
||
|
|
}
|
||
|
|
|
||
|
|
defines = [ "_LIBCPP_BUILDING_LIBRARY" ]
|
||
|
|
}
|
||
|
|
|
||
|
|
# Explicitly set version macros to Windows 7 to prevent libc++ from adding a
|
||
|
|
# hard dependency on GetSystemTimePreciseAsFileTime, which was introduced in
|
||
|
|
# Windows 8.
|
||
|
|
config("winver") {
|
||
|
|
defines = [
|
||
|
|
"NTDDI_VERSION=NTDDI_WIN7",
|
||
|
|
"_WIN32_WINNT=_WIN32_WINNT_WIN7",
|
||
|
|
"WINVER=_WIN32_WINNT_WIN7",
|
||
|
|
]
|
||
|
|
}
|
||
|
|
|
||
|
|
if (libcxx_is_shared) {
|
||
|
|
_libcxx_target_type = "shared_library"
|
||
|
|
} else {
|
||
|
|
_libcxx_target_type = "source_set"
|
||
|
|
}
|
||
|
|
target(_libcxx_target_type, "libc++") {
|
||
|
|
# Most things that need to depend on libc++ should do so via the implicit
|
||
|
|
# 'common_deps' dependency below. Some targets that package libc++.so may
|
||
|
|
# need to explicitly depend on libc++.
|
||
|
|
visibility = [
|
||
|
|
"//build/config:common_deps",
|
||
|
|
"//third_party/catapult/devil:devil",
|
||
|
|
]
|
||
|
|
if (is_linux) {
|
||
|
|
# This target packages libc++.so, so must have an explicit dependency on
|
||
|
|
# libc++.
|
||
|
|
visibility +=
|
||
|
|
[ "//remoting/host/linux:remoting_me2me_host_copy_user_session" ]
|
||
|
|
}
|
||
|
|
if (libcxx_is_shared) {
|
||
|
|
no_default_deps = true
|
||
|
|
}
|
||
|
|
|
||
|
|
if (is_linux && !is_clang) {
|
||
|
|
libs = [ "atomic" ]
|
||
|
|
}
|
||
|
|
|
||
|
|
inputs = [ "__config_site" ]
|
||
|
|
|
||
|
|
sources = [
|
||
|
|
"trunk/src/algorithm.cpp",
|
||
|
|
"trunk/src/any.cpp",
|
||
|
|
"trunk/src/atomic.cpp",
|
||
|
|
"trunk/src/barrier.cpp",
|
||
|
|
"trunk/src/bind.cpp",
|
||
|
|
"trunk/src/charconv.cpp",
|
||
|
|
"trunk/src/chrono.cpp",
|
||
|
|
"trunk/src/condition_variable.cpp",
|
||
|
|
"trunk/src/condition_variable_destructor.cpp",
|
||
|
|
"trunk/src/exception.cpp",
|
||
|
|
"trunk/src/format.cpp",
|
||
|
|
"trunk/src/functional.cpp",
|
||
|
|
"trunk/src/future.cpp",
|
||
|
|
"trunk/src/hash.cpp",
|
||
|
|
"trunk/src/ios.cpp",
|
||
|
|
"trunk/src/ios.instantiations.cpp",
|
||
|
|
"trunk/src/iostream.cpp",
|
||
|
|
"trunk/src/legacy_pointer_safety.cpp",
|
||
|
|
"trunk/src/locale.cpp",
|
||
|
|
"trunk/src/memory.cpp",
|
||
|
|
"trunk/src/mutex.cpp",
|
||
|
|
"trunk/src/mutex_destructor.cpp",
|
||
|
|
"trunk/src/new.cpp",
|
||
|
|
"trunk/src/optional.cpp",
|
||
|
|
"trunk/src/random.cpp",
|
||
|
|
"trunk/src/random_shuffle.cpp",
|
||
|
|
"trunk/src/regex.cpp",
|
||
|
|
"trunk/src/ryu/d2fixed.cpp",
|
||
|
|
"trunk/src/ryu/d2s.cpp",
|
||
|
|
"trunk/src/ryu/f2s.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",
|
||
|
|
"trunk/src/verbose_abort.cpp",
|
||
|
|
]
|
||
|
|
|
||
|
|
if (enable_iterator_debugging) {
|
||
|
|
sources += [
|
||
|
|
"trunk/src/debug.cpp",
|
||
|
|
"trunk/src/legacy_debug_handler.cpp",
|
||
|
|
]
|
||
|
|
}
|
||
|
|
|
||
|
|
include_dirs = [ "trunk/src" ]
|
||
|
|
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/win:winver" ]
|
||
|
|
configs += [ ":winver" ]
|
||
|
|
if (libcxx_natvis_include) {
|
||
|
|
inputs += [
|
||
|
|
# libc++.natvis listed as an input here instead of in
|
||
|
|
# //build/config/c++:runtime_library to prevent unnecessary size
|
||
|
|
# increase in generated build files.
|
||
|
|
"//build/config/c++/libc++.natvis",
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
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_apple) && libcxx_is_shared) {
|
||
|
|
# Use libc++_chrome to avoid conflicting with system libc++
|
||
|
|
output_name = "libc++_chrome"
|
||
|
|
if (is_android) {
|
||
|
|
# See crbug.com/1076244#c11 for more detail.
|
||
|
|
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",
|
||
|
|
]
|
||
|
|
|
||
|
|
if (libcxx_is_shared && !is_win) {
|
||
|
|
configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
|
||
|
|
configs += [ "//build/config/gcc:symbol_visibility_default" ]
|
||
|
|
}
|
||
|
|
|
||
|
|
defines = []
|
||
|
|
|
||
|
|
if (!libcxx_is_shared) {
|
||
|
|
if (is_apple && is_clang) {
|
||
|
|
# We want operator new/delete to be private on Mac, but these functions
|
||
|
|
# are implicitly created by the compiler for each translation unit, as
|
||
|
|
# specified in the C++ spec 3.7.4p2, which makes them always have default
|
||
|
|
# visibility. This option is needed to force hidden visibility since
|
||
|
|
# -fvisibility=hidden doesn't have the desired effect.
|
||
|
|
cflags = [ "-fvisibility-global-new-delete-hidden" ]
|
||
|
|
} else {
|
||
|
|
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_apple && (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" ]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|