xref: /aosp_15_r20/external/openscreen/build/config/BUILD.gn (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard# Copyright 2018 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard# Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard# found in the LICENSE file.
4*3f982cf4SFabien Sanglard
5*3f982cf4SFabien Sanglardimport("//build/config/arm.gni")
6*3f982cf4SFabien Sanglardimport("//build/config/sysroot.gni")
7*3f982cf4SFabien Sanglardimport("//build_overrides/build.gni")
8*3f982cf4SFabien Sanglard
9*3f982cf4SFabien Sanglarddeclare_args() {
10*3f982cf4SFabien Sanglard  # Enable OSP_DCHECKs to be compiled in, even if it's not a debug build.
11*3f982cf4SFabien Sanglard  dcheck_always_on = false
12*3f982cf4SFabien Sanglard
13*3f982cf4SFabien Sanglard  # Enable address sanitizer.
14*3f982cf4SFabien Sanglard  is_asan = false
15*3f982cf4SFabien Sanglard
16*3f982cf4SFabien Sanglard  # Enable thread sanitizer.
17*3f982cf4SFabien Sanglard  is_tsan = false
18*3f982cf4SFabien Sanglard
19*3f982cf4SFabien Sanglard  # Enables clang's source-based coverage (requires is_clang=true).
20*3f982cf4SFabien Sanglard  # NOTE: This will slow down the build and increase binary size
21*3f982cf4SFabien Sanglard  # significantly. For more details, see:
22*3f982cf4SFabien Sanglard  # https://chromium.googlesource.com/chromium/src/+/refs/heads/master/docs/clang_code_coverage_wrapper.md
23*3f982cf4SFabien Sanglard  use_coverage = false
24*3f982cf4SFabien Sanglard}
25*3f982cf4SFabien Sanglard
26*3f982cf4SFabien Sanglardassert(!use_coverage || is_clang)
27*3f982cf4SFabien Sanglard
28*3f982cf4SFabien Sanglardconfig("compiler_defaults") {
29*3f982cf4SFabien Sanglard  cflags = []
30*3f982cf4SFabien Sanglard  if (is_posix && !is_mac) {
31*3f982cf4SFabien Sanglard    cflags += [ "-fPIC" ]
32*3f982cf4SFabien Sanglard  }
33*3f982cf4SFabien Sanglard
34*3f982cf4SFabien Sanglard  ldflags = []
35*3f982cf4SFabien Sanglard  if (is_linux) {
36*3f982cf4SFabien Sanglard    ldflags += [ "-pthread" ]
37*3f982cf4SFabien Sanglard  }
38*3f982cf4SFabien Sanglard  if (is_posix && !is_mac) {
39*3f982cf4SFabien Sanglard    ldflags += [ "-Wl,--fatal-warnings" ]
40*3f982cf4SFabien Sanglard
41*3f982cf4SFabien Sanglard    if (is_clang) {
42*3f982cf4SFabien Sanglard      ldflags += [
43*3f982cf4SFabien Sanglard        "-stdlib=libstdc++",
44*3f982cf4SFabien Sanglard        "-latomic",
45*3f982cf4SFabien Sanglard      ]
46*3f982cf4SFabien Sanglard    }
47*3f982cf4SFabien Sanglard  }
48*3f982cf4SFabien Sanglard}
49*3f982cf4SFabien Sanglard
50*3f982cf4SFabien Sanglardconfig("compiler_cpu_abi") {
51*3f982cf4SFabien Sanglard  cflags = []
52*3f982cf4SFabien Sanglard  ldflags = []
53*3f982cf4SFabien Sanglard
54*3f982cf4SFabien Sanglard  if (current_cpu == "x64") {
55*3f982cf4SFabien Sanglard    # These are explicitly specified in case of cross-compiling.
56*3f982cf4SFabien Sanglard    cflags += [ "-m64" ]
57*3f982cf4SFabien Sanglard    ldflags += [ "-m64" ]
58*3f982cf4SFabien Sanglard  } else if (current_cpu == "x86") {
59*3f982cf4SFabien Sanglard    cflags += [ "-m32" ]
60*3f982cf4SFabien Sanglard    ldflags += [ "-m32" ]
61*3f982cf4SFabien Sanglard  } else if (current_cpu == "arm") {
62*3f982cf4SFabien Sanglard    cflags += [
63*3f982cf4SFabien Sanglard      "--target=arm-linux-gnueabihf",
64*3f982cf4SFabien Sanglard      "-march=$arm_arch",
65*3f982cf4SFabien Sanglard      "-mfloat-abi=$arm_float_abi",
66*3f982cf4SFabien Sanglard      "-mtune=$arm_tune",
67*3f982cf4SFabien Sanglard    ]
68*3f982cf4SFabien Sanglard    ldflags += [ "--target=arm-linux-gnueabihf" ]
69*3f982cf4SFabien Sanglard  } else if (current_cpu == "arm64") {
70*3f982cf4SFabien Sanglard    cflags += [ "--target=aarch64-linux-gnu" ]
71*3f982cf4SFabien Sanglard    ldflags += [ "--target=aarch64-linux-gnu" ]
72*3f982cf4SFabien Sanglard  }
73*3f982cf4SFabien Sanglard}
74*3f982cf4SFabien Sanglard
75*3f982cf4SFabien Sanglardconfig("no_exceptions") {
76*3f982cf4SFabien Sanglard  # -fno-exceptions causes the compiler to choose the implementation of the STL
77*3f982cf4SFabien Sanglard  # that uses abort() calls instead of throws, as well as issue compile errors
78*3f982cf4SFabien Sanglard  # for throw calls in user ccode. The no*unwind-tables flags disable generation
79*3f982cf4SFabien Sanglard  # of static unwind tables that are typically used for exceptions, resulting
80*3f982cf4SFabien Sanglard  # in typically smaller object sizes. For some information, see:
81*3f982cf4SFabien Sanglard  # https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-funwind-tables-1203
82*3f982cf4SFabien Sanglard  cflags_cc = [
83*3f982cf4SFabien Sanglard    "-fno-exceptions",
84*3f982cf4SFabien Sanglard    "-fno-unwind-tables",
85*3f982cf4SFabien Sanglard    "-fno-asynchronous-unwind-tables",
86*3f982cf4SFabien Sanglard  ]
87*3f982cf4SFabien Sanglard
88*3f982cf4SFabien Sanglard  cflags_objcc = [
89*3f982cf4SFabien Sanglard    "-fno-exceptions",
90*3f982cf4SFabien Sanglard    "-fno-unwind-tables",
91*3f982cf4SFabien Sanglard    "-fno-asynchronous-unwind-tables",
92*3f982cf4SFabien Sanglard  ]
93*3f982cf4SFabien Sanglard}
94*3f982cf4SFabien Sanglard
95*3f982cf4SFabien Sanglardconfig("no_rtti") {
96*3f982cf4SFabien Sanglard  cflags_cc = [ "-fno-rtti" ]
97*3f982cf4SFabien Sanglard  cflags_objcc = [ "-fno-rtti" ]
98*3f982cf4SFabien Sanglard}
99*3f982cf4SFabien Sanglard
100*3f982cf4SFabien Sanglardconfig("openscreen_code") {
101*3f982cf4SFabien Sanglard  cflags = [
102*3f982cf4SFabien Sanglard    "-Wall",
103*3f982cf4SFabien Sanglard    "-Werror",
104*3f982cf4SFabien Sanglard    "-fno-strict-aliasing",  # See http://crbug.com/32204
105*3f982cf4SFabien Sanglard  ]
106*3f982cf4SFabien Sanglard
107*3f982cf4SFabien Sanglard  cflags_cc = [ "-std=c++14" ]
108*3f982cf4SFabien Sanglard  cflags_objcc = [ "-std=c++14" ]
109*3f982cf4SFabien Sanglard
110*3f982cf4SFabien Sanglard  ldflags = [ "-Werror" ]
111*3f982cf4SFabien Sanglard
112*3f982cf4SFabien Sanglard  if (is_gcc) {
113*3f982cf4SFabien Sanglard    cflags += [ "-Wno-maybe-uninitialized" ]
114*3f982cf4SFabien Sanglard    cflags_cc += [
115*3f982cf4SFabien Sanglard      # GCC 7.2 reports noexcept errors that are not found in GCC 8.
116*3f982cf4SFabien Sanglard      # TODO(crbug.com/openscreen/40): Remove this when bots are upgraded to
117*3f982cf4SFabien Sanglard      # >= GCC 8.3.
118*3f982cf4SFabien Sanglard      "-Wno-noexcept-type",
119*3f982cf4SFabien Sanglard    ]
120*3f982cf4SFabien Sanglard  }
121*3f982cf4SFabien Sanglard
122*3f982cf4SFabien Sanglard  if (is_clang) {
123*3f982cf4SFabien Sanglard    cflags += [
124*3f982cf4SFabien Sanglard      "-Wextra",
125*3f982cf4SFabien Sanglard      "-fcolor-diagnostics",
126*3f982cf4SFabien Sanglard
127*3f982cf4SFabien Sanglard      # Warn on missing break statements at the end of switch cases.
128*3f982cf4SFabien Sanglard      "-Wimplicit-fallthrough",
129*3f982cf4SFabien Sanglard
130*3f982cf4SFabien Sanglard      # Unused function parameters are okay (e.g., empty virtual method
131*3f982cf4SFabien Sanglard      # overrides).
132*3f982cf4SFabien Sanglard      "-Wno-unused-parameter",
133*3f982cf4SFabien Sanglard
134*3f982cf4SFabien Sanglard      # Permit code like "struct foo f = {0};".
135*3f982cf4SFabien Sanglard      "-Wno-missing-field-initializers",
136*3f982cf4SFabien Sanglard
137*3f982cf4SFabien Sanglard      # Warn on signed versus unsigned comparisons.
138*3f982cf4SFabien Sanglard      "-Wsign-compare",
139*3f982cf4SFabien Sanglard
140*3f982cf4SFabien Sanglard      # Warn on extra semi-colons.
141*3f982cf4SFabien Sanglard      "-Wextra-semi",
142*3f982cf4SFabien Sanglard
143*3f982cf4SFabien Sanglard      # Warn on unused results.
144*3f982cf4SFabien Sanglard      "-Wunused-result",
145*3f982cf4SFabien Sanglard    ]
146*3f982cf4SFabien Sanglard
147*3f982cf4SFabien Sanglard    # Generate warning if code generates exit-time destructors, since such
148*3f982cf4SFabien Sanglard    # things are in violation of Chromium C++ Don'ts.
149*3f982cf4SFabien Sanglard    cflags_cc += [ "-Wexit-time-destructors" ]
150*3f982cf4SFabien Sanglard    cflags_objcc += [ "-Wexit-time-destructors" ]
151*3f982cf4SFabien Sanglard
152*3f982cf4SFabien Sanglard    ldflags += [ "-fcolor-diagnostics" ]
153*3f982cf4SFabien Sanglard  }
154*3f982cf4SFabien Sanglard
155*3f982cf4SFabien Sanglard  defines = []
156*3f982cf4SFabien Sanglard  if (dcheck_always_on) {
157*3f982cf4SFabien Sanglard    defines += [ "DCHECK_ALWAYS_ON" ]
158*3f982cf4SFabien Sanglard  } else if (!is_debug) {
159*3f982cf4SFabien Sanglard    # C-style assertions in the standard library should match the behavior of
160*3f982cf4SFabien Sanglard    # OSP_DCHECKs. Thus, turn them off whenever OSP_DCHECKs would be turned off.
161*3f982cf4SFabien Sanglard    defines += [ "NDEBUG" ]
162*3f982cf4SFabien Sanglard  }
163*3f982cf4SFabien Sanglard}
164*3f982cf4SFabien Sanglard
165*3f982cf4SFabien Sanglardconfig("default_optimization") {
166*3f982cf4SFabien Sanglard  cflags = []
167*3f982cf4SFabien Sanglard  defines = []
168*3f982cf4SFabien Sanglard  if (is_debug) {
169*3f982cf4SFabien Sanglard    cflags += [
170*3f982cf4SFabien Sanglard      "-O0",
171*3f982cf4SFabien Sanglard      "-g3",  # Include extra debugging information.
172*3f982cf4SFabien Sanglard      "-fstack-protector-strong",
173*3f982cf4SFabien Sanglard    ]
174*3f982cf4SFabien Sanglard    defines += [ "_DEBUG" ]
175*3f982cf4SFabien Sanglard  } else {
176*3f982cf4SFabien Sanglard    cflags += [
177*3f982cf4SFabien Sanglard      "-O2",
178*3f982cf4SFabien Sanglard      "-g1",  # Minimal symbols (enough for stack traces).
179*3f982cf4SFabien Sanglard      "-fstack-protector",
180*3f982cf4SFabien Sanglard    ]
181*3f982cf4SFabien Sanglard  }
182*3f982cf4SFabien Sanglard}
183*3f982cf4SFabien Sanglard
184*3f982cf4SFabien Sanglardconfig("symbol_visibility_hidden") {
185*3f982cf4SFabien Sanglard  cflags = [ "-fvisibility=hidden" ]
186*3f982cf4SFabien Sanglard}
187*3f982cf4SFabien Sanglard
188*3f982cf4SFabien Sanglardconfig("symbol_visibility_default") {
189*3f982cf4SFabien Sanglard  cflags = [ "-fvisibility=default" ]
190*3f982cf4SFabien Sanglard}
191*3f982cf4SFabien Sanglard
192*3f982cf4SFabien Sanglardconfig("default_sanitizers") {
193*3f982cf4SFabien Sanglard  # NOTE: This is not an artificial restriction; clang doesn't allow these to be
194*3f982cf4SFabien Sanglard  # used together.
195*3f982cf4SFabien Sanglard  assert(!is_asan || !is_tsan)
196*3f982cf4SFabien Sanglard
197*3f982cf4SFabien Sanglard  cflags = []
198*3f982cf4SFabien Sanglard  ldflags = []
199*3f982cf4SFabien Sanglard  if (is_asan) {
200*3f982cf4SFabien Sanglard    cflags += [ "-fsanitize=address" ]
201*3f982cf4SFabien Sanglard    ldflags += [ "-fsanitize=address" ]
202*3f982cf4SFabien Sanglard  } else if (is_tsan) {
203*3f982cf4SFabien Sanglard    cflags += [ "-fsanitize=thread" ]
204*3f982cf4SFabien Sanglard    ldflags += [ "-fsanitize=thread" ]
205*3f982cf4SFabien Sanglard  }
206*3f982cf4SFabien Sanglard
207*3f982cf4SFabien Sanglard  if (use_libfuzzer) {
208*3f982cf4SFabien Sanglard    cflags += [ "-fsanitize=fuzzer-no-link" ]
209*3f982cf4SFabien Sanglard    if (!is_asan) {
210*3f982cf4SFabien Sanglard      ldflags += [ "-fsanitize=address" ]
211*3f982cf4SFabien Sanglard    }
212*3f982cf4SFabien Sanglard  }
213*3f982cf4SFabien Sanglard}
214*3f982cf4SFabien Sanglard
215*3f982cf4SFabien Sanglardconfig("default_coverage") {
216*3f982cf4SFabien Sanglard  cflags = []
217*3f982cf4SFabien Sanglard  ldflags = []
218*3f982cf4SFabien Sanglard
219*3f982cf4SFabien Sanglard  # TODO(issuetracker.google.com/155348032): Limit the use of these flags
220*3f982cf4SFabien Sanglard  if (use_coverage) {
221*3f982cf4SFabien Sanglard    cflags += [
222*3f982cf4SFabien Sanglard      "-fprofile-instr-generate",
223*3f982cf4SFabien Sanglard      "-fcoverage-mapping",
224*3f982cf4SFabien Sanglard    ]
225*3f982cf4SFabien Sanglard    ldflags += [ "-fprofile-instr-generate" ]
226*3f982cf4SFabien Sanglard  }
227*3f982cf4SFabien Sanglard}
228*3f982cf4SFabien Sanglard
229*3f982cf4SFabien Sanglardconfig("sysroot_runtime_libraries") {
230*3f982cf4SFabien Sanglard  if (sysroot != "") {
231*3f982cf4SFabien Sanglard    assert(is_clang)
232*3f982cf4SFabien Sanglard    sysroot_path = rebase_path(sysroot, root_build_dir)
233*3f982cf4SFabien Sanglard    flags = [ "--sysroot=" + sysroot_path ]
234*3f982cf4SFabien Sanglard    hash = exec_script("//build/scripts/install-sysroot.py",
235*3f982cf4SFabien Sanglard                       [
236*3f982cf4SFabien Sanglard                         "--print-hash",
237*3f982cf4SFabien Sanglard                         "$current_cpu",
238*3f982cf4SFabien Sanglard                         "$sysroot_platform",
239*3f982cf4SFabien Sanglard                       ],
240*3f982cf4SFabien Sanglard                       "trim string",
241*3f982cf4SFabien Sanglard                       [ "//build/scripts/sysroots.json" ])
242*3f982cf4SFabien Sanglard
243*3f982cf4SFabien Sanglard    # GN uses this to know that the sysroot is "dirty"
244*3f982cf4SFabien Sanglard    defines = [ "SYSROOT_HASH=$hash" ]
245*3f982cf4SFabien Sanglard    ldflags = flags
246*3f982cf4SFabien Sanglard    cflags = flags
247*3f982cf4SFabien Sanglard
248*3f982cf4SFabien Sanglard    ld_paths = exec_script("//build/scripts/sysroot_ld_path.py",
249*3f982cf4SFabien Sanglard                           [ sysroot_path ],
250*3f982cf4SFabien Sanglard                           "list lines")
251*3f982cf4SFabien Sanglard    foreach(ld_path, ld_paths) {
252*3f982cf4SFabien Sanglard      ld_path = rebase_path(ld_path, root_build_dir)
253*3f982cf4SFabien Sanglard      ldflags += [ "-L" + ld_path ]
254*3f982cf4SFabien Sanglard    }
255*3f982cf4SFabien Sanglard  }
256*3f982cf4SFabien Sanglard}
257*3f982cf4SFabien Sanglard
258*3f982cf4SFabien Sanglardconfig("operating_system_defines") {
259*3f982cf4SFabien Sanglard  defines = []
260*3f982cf4SFabien Sanglard  if (is_linux) {
261*3f982cf4SFabien Sanglard    defines += [ "OS_LINUX" ]
262*3f982cf4SFabien Sanglard  } else if (is_mac) {
263*3f982cf4SFabien Sanglard    defines += [ "MAC_OSX" ]
264*3f982cf4SFabien Sanglard  }
265*3f982cf4SFabien Sanglard}
266