xref: /aosp_15_r20/external/cronet/buildtools/third_party/libc++/BUILD.gn (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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