1*6777b538SAndroid Build Coastguard Worker# Copyright 2015 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Workerimport("//build/config/c++/c++.gni") 6*6777b538SAndroid Build Coastguard Workerimport("//build/config/sanitizers/sanitizers.gni") 7*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/toolchain.gni") 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker# Used by libc++ and libc++abi. 10*6777b538SAndroid Build Coastguard Worker# See //build/config/c++:runtime_library for the config used by users of libc++. 11*6777b538SAndroid Build Coastguard Workerconfig("config") { 12*6777b538SAndroid Build Coastguard Worker cflags = [ "-fstrict-aliasing" ] 13*6777b538SAndroid Build Coastguard Worker if (is_win) { 14*6777b538SAndroid Build Coastguard Worker cflags += [ 15*6777b538SAndroid Build Coastguard Worker # libc++ wants to redefine the macros WIN32_LEAN_AND_MEAN and _CRT_RAND_S 16*6777b538SAndroid Build Coastguard Worker # in its implementation. 17*6777b538SAndroid Build Coastguard Worker "-Wno-macro-redefined", 18*6777b538SAndroid Build Coastguard Worker ] 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker cflags_cc = [ 21*6777b538SAndroid Build Coastguard Worker # We want to use a uniform C++ version across all of chromium, but 22*6777b538SAndroid Build Coastguard Worker # upstream libc++ requires C++20 so we have to make an exception here. 23*6777b538SAndroid Build Coastguard Worker # No other target should override the default -std= flag. 24*6777b538SAndroid Build Coastguard Worker "-std:c++20", 25*6777b538SAndroid Build Coastguard Worker ] 26*6777b538SAndroid Build Coastguard Worker } else { 27*6777b538SAndroid Build Coastguard Worker cflags += [ "-fPIC" ] 28*6777b538SAndroid Build Coastguard Worker cflags_cc = [ "-std=c++20" ] 29*6777b538SAndroid Build Coastguard Worker } 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker defines = [ "_LIBCPP_BUILDING_LIBRARY" ] 32*6777b538SAndroid Build Coastguard Worker} 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker# Explicitly set version macros to Windows 7 to prevent libc++ from adding a 35*6777b538SAndroid Build Coastguard Worker# hard dependency on GetSystemTimePreciseAsFileTime, which was introduced in 36*6777b538SAndroid Build Coastguard Worker# Windows 8. 37*6777b538SAndroid Build Coastguard Workerconfig("winver") { 38*6777b538SAndroid Build Coastguard Worker defines = [ 39*6777b538SAndroid Build Coastguard Worker "NTDDI_VERSION=NTDDI_WIN7", 40*6777b538SAndroid Build Coastguard Worker "_WIN32_WINNT=_WIN32_WINNT_WIN7", 41*6777b538SAndroid Build Coastguard Worker "WINVER=_WIN32_WINNT_WIN7", 42*6777b538SAndroid Build Coastguard Worker ] 43*6777b538SAndroid Build Coastguard Worker} 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Workerif (libcxx_is_shared) { 46*6777b538SAndroid Build Coastguard Worker _libcxx_target_type = "shared_library" 47*6777b538SAndroid Build Coastguard Worker} else { 48*6777b538SAndroid Build Coastguard Worker _libcxx_target_type = "source_set" 49*6777b538SAndroid Build Coastguard Worker} 50*6777b538SAndroid Build Coastguard Workertarget(_libcxx_target_type, "libc++") { 51*6777b538SAndroid Build Coastguard Worker # Most things that need to depend on libc++ should do so via the implicit 52*6777b538SAndroid Build Coastguard Worker # 'common_deps' dependency below. Some targets that package libc++.so may 53*6777b538SAndroid Build Coastguard Worker # need to explicitly depend on libc++. 54*6777b538SAndroid Build Coastguard Worker visibility = [ 55*6777b538SAndroid Build Coastguard Worker "//build/config:common_deps", 56*6777b538SAndroid Build Coastguard Worker "//third_party/catapult/devil:devil", 57*6777b538SAndroid Build Coastguard Worker ] 58*6777b538SAndroid Build Coastguard Worker if (is_linux) { 59*6777b538SAndroid Build Coastguard Worker # This target packages libc++.so, so must have an explicit dependency on 60*6777b538SAndroid Build Coastguard Worker # libc++. 61*6777b538SAndroid Build Coastguard Worker visibility += 62*6777b538SAndroid Build Coastguard Worker [ "//remoting/host/linux:remoting_me2me_host_copy_user_session" ] 63*6777b538SAndroid Build Coastguard Worker } 64*6777b538SAndroid Build Coastguard Worker if (libcxx_is_shared) { 65*6777b538SAndroid Build Coastguard Worker no_default_deps = true 66*6777b538SAndroid Build Coastguard Worker } 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker if (is_linux && !is_clang) { 69*6777b538SAndroid Build Coastguard Worker libs = [ "atomic" ] 70*6777b538SAndroid Build Coastguard Worker } 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker inputs = [ 73*6777b538SAndroid Build Coastguard Worker "__assertion_handler", 74*6777b538SAndroid Build Coastguard Worker "__config_site", 75*6777b538SAndroid Build Coastguard Worker ] 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1458042): Move this build file to third_party/libc++/BUILD.gn 78*6777b538SAndroid Build Coastguard Worker # once submodule migration is done. 79*6777b538SAndroid Build Coastguard Worker sources = [ 80*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/algorithm.cpp", 81*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/any.cpp", 82*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/atomic.cpp", 83*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/barrier.cpp", 84*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/bind.cpp", 85*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/call_once.cpp", 86*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/charconv.cpp", 87*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/chrono.cpp", 88*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/condition_variable.cpp", 89*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/condition_variable_destructor.cpp", 90*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/error_category.cpp", 91*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/exception.cpp", 92*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/filesystem/directory_iterator.cpp", 93*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/filesystem/filesystem_error.cpp", 94*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/filesystem/operations.cpp", 95*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/filesystem/path.cpp", 96*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/functional.cpp", 97*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/future.cpp", 98*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/hash.cpp", 99*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/ios.cpp", 100*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/ios.instantiations.cpp", 101*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/iostream.cpp", 102*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/legacy_pointer_safety.cpp", 103*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/locale.cpp", 104*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/memory.cpp", 105*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/mutex.cpp", 106*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/mutex_destructor.cpp", 107*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/new_handler.cpp", 108*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/new_helpers.cpp", 109*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/optional.cpp", 110*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/random.cpp", 111*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/random_shuffle.cpp", 112*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/regex.cpp", 113*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/ryu/d2fixed.cpp", 114*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/ryu/d2s.cpp", 115*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/ryu/f2s.cpp", 116*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/shared_mutex.cpp", 117*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/stdexcept.cpp", 118*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/string.cpp", 119*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/strstream.cpp", 120*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/system_error.cpp", 121*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/thread.cpp", 122*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/typeinfo.cpp", 123*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/valarray.cpp", 124*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/variant.cpp", 125*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/vector.cpp", 126*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/verbose_abort.cpp", 127*6777b538SAndroid Build Coastguard Worker ] 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker if (is_apple || (!is_asan && !is_tsan && !is_msan)) { 130*6777b538SAndroid Build Coastguard Worker # In {a,t,m}san configurations, operator new and operator delete will be 131*6777b538SAndroid Build Coastguard Worker # provided by the sanitizer runtime library. Since libc++ defines these 132*6777b538SAndroid Build Coastguard Worker # symbols with weak linkage, and the *san runtime uses strong linkage, it 133*6777b538SAndroid Build Coastguard Worker # should technically be OK to include this file, but it's removed to be 134*6777b538SAndroid Build Coastguard Worker # explicit. 135*6777b538SAndroid Build Coastguard Worker sources += [ "//third_party/libc++/src/src/new.cpp" ] 136*6777b538SAndroid Build Coastguard Worker } 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker if (is_linux) { 139*6777b538SAndroid Build Coastguard Worker # These sources are necessary for the Centipede fuzzer, 140*6777b538SAndroid Build Coastguard Worker # which currently only needs to run on Linux. 141*6777b538SAndroid Build Coastguard Worker sources += [ 142*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/filesystem/directory_entry.cpp", 143*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/filesystem/filesystem_clock.cpp", 144*6777b538SAndroid Build Coastguard Worker ] 145*6777b538SAndroid Build Coastguard Worker } 146*6777b538SAndroid Build Coastguard Worker 147*6777b538SAndroid Build Coastguard Worker include_dirs = [ "//third_party/libc++/src/src" ] 148*6777b538SAndroid Build Coastguard Worker if (is_win) { 149*6777b538SAndroid Build Coastguard Worker sources += [ 150*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/support/win32/locale_win32.cpp", 151*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/support/win32/support.cpp", 152*6777b538SAndroid Build Coastguard Worker "//third_party/libc++/src/src/support/win32/thread_win32.cpp", 153*6777b538SAndroid Build Coastguard Worker ] 154*6777b538SAndroid Build Coastguard Worker configs -= [ "//build/config/win:winver" ] 155*6777b538SAndroid Build Coastguard Worker configs += [ ":winver" ] 156*6777b538SAndroid Build Coastguard Worker if (libcxx_natvis_include) { 157*6777b538SAndroid Build Coastguard Worker inputs += [ 158*6777b538SAndroid Build Coastguard Worker # libc++.natvis listed as an input here instead of in 159*6777b538SAndroid Build Coastguard Worker # //build/config/c++:runtime_library to prevent unnecessary size 160*6777b538SAndroid Build Coastguard Worker # increase in generated build files. 161*6777b538SAndroid Build Coastguard Worker "//build/config/c++/libc++.natvis", 162*6777b538SAndroid Build Coastguard Worker ] 163*6777b538SAndroid Build Coastguard Worker } 164*6777b538SAndroid Build Coastguard Worker } 165*6777b538SAndroid Build Coastguard Worker configs -= [ 166*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:chromium_code", 167*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:no_exceptions", 168*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:no_rtti", 169*6777b538SAndroid Build Coastguard Worker "//build/config/coverage:default_coverage", 170*6777b538SAndroid Build Coastguard Worker ] 171*6777b538SAndroid Build Coastguard Worker if ((is_android || is_apple) && libcxx_is_shared) { 172*6777b538SAndroid Build Coastguard Worker # Use libc++_chrome to avoid conflicting with system libc++ 173*6777b538SAndroid Build Coastguard Worker output_name = "libc++_chrome" 174*6777b538SAndroid Build Coastguard Worker if (is_android) { 175*6777b538SAndroid Build Coastguard Worker # See crbug.com/1076244#c11 for more detail. 176*6777b538SAndroid Build Coastguard Worker configs -= [ "//build/config/android:hide_all_but_jni_onload" ] 177*6777b538SAndroid Build Coastguard Worker } 178*6777b538SAndroid Build Coastguard Worker } 179*6777b538SAndroid Build Coastguard Worker configs += [ 180*6777b538SAndroid Build Coastguard Worker ":config", 181*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:no_chromium_code", 182*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:exceptions", 183*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:rtti", 184*6777b538SAndroid Build Coastguard Worker ] 185*6777b538SAndroid Build Coastguard Worker 186*6777b538SAndroid Build Coastguard Worker if (libcxx_is_shared && !is_win) { 187*6777b538SAndroid Build Coastguard Worker configs -= [ "//build/config/gcc:symbol_visibility_hidden" ] 188*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/gcc:symbol_visibility_default" ] 189*6777b538SAndroid Build Coastguard Worker } 190*6777b538SAndroid Build Coastguard Worker 191*6777b538SAndroid Build Coastguard Worker defines = [] 192*6777b538SAndroid Build Coastguard Worker 193*6777b538SAndroid Build Coastguard Worker if (!libcxx_is_shared) { 194*6777b538SAndroid Build Coastguard Worker if (is_apple && is_clang) { 195*6777b538SAndroid Build Coastguard Worker # We want operator new/delete to be private on Mac, but these functions 196*6777b538SAndroid Build Coastguard Worker # are implicitly created by the compiler for each translation unit, as 197*6777b538SAndroid Build Coastguard Worker # specified in the C++ spec 3.7.4p2, which makes them always have default 198*6777b538SAndroid Build Coastguard Worker # visibility. This option is needed to force hidden visibility since 199*6777b538SAndroid Build Coastguard Worker # -fvisibility=hidden doesn't have the desired effect. 200*6777b538SAndroid Build Coastguard Worker cflags = [ "-fvisibility-global-new-delete=force-hidden" ] 201*6777b538SAndroid Build Coastguard Worker } else { 202*6777b538SAndroid Build Coastguard Worker defines += [ 203*6777b538SAndroid Build Coastguard Worker # This resets the visibility to default only for the various 204*6777b538SAndroid Build Coastguard Worker # flavors of operator new and operator delete. These symbols 205*6777b538SAndroid Build Coastguard Worker # are weak and get overriden by Chromium-provided ones, but if 206*6777b538SAndroid Build Coastguard Worker # these symbols had hidden visibility, this would make the 207*6777b538SAndroid Build Coastguard Worker # Chromium symbols hidden too because elf visibility rules 208*6777b538SAndroid Build Coastguard Worker # require that linkers use the least visible form when merging, 209*6777b538SAndroid Build Coastguard Worker # and if this is hidden, then when we merge it with tcmalloc's 210*6777b538SAndroid Build Coastguard Worker # operator new, hidden visibility would win. However, tcmalloc 211*6777b538SAndroid Build Coastguard Worker # needs a visible operator new to also override operator new 212*6777b538SAndroid Build Coastguard Worker # references from system libraries. 213*6777b538SAndroid Build Coastguard Worker # TODO(lld): Ask lld for a --force-public-visibility flag or 214*6777b538SAndroid Build Coastguard Worker # similar to that overrides the default elf merging rules, and 215*6777b538SAndroid Build Coastguard Worker # make tcmalloc's gn config pass that to all its dependencies, 216*6777b538SAndroid Build Coastguard Worker # then remove this override here. 217*6777b538SAndroid Build Coastguard Worker "_LIBCPP_OVERRIDABLE_FUNC_VIS=__attribute__((__visibility__(\"default\")))", 218*6777b538SAndroid Build Coastguard Worker ] 219*6777b538SAndroid Build Coastguard Worker } 220*6777b538SAndroid Build Coastguard Worker } 221*6777b538SAndroid Build Coastguard Worker 222*6777b538SAndroid Build Coastguard Worker if (!is_win) { 223*6777b538SAndroid Build Coastguard Worker defines += [ "LIBCXX_BUILDING_LIBCXXABI" ] 224*6777b538SAndroid Build Coastguard Worker if (!export_libcxxabi_from_executables) { 225*6777b538SAndroid Build Coastguard Worker deps = [ "//buildtools/third_party/libc++abi" ] 226*6777b538SAndroid Build Coastguard Worker } 227*6777b538SAndroid Build Coastguard Worker } 228*6777b538SAndroid Build Coastguard Worker} 229