xref: /aosp_15_r20/external/perfetto/gn/standalone/BUILD.gn (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker#
3*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker#
7*6dbdd20aSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker#
9*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/perfetto_check_build_deps.gni")
16*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/android.gni")
17*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/libc++/libc++.gni")
18*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/sanitizers/sanitizers.gni")
19*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/toolchain/msvc.gni")
20*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/wasm.gni")
21*6dbdd20aSAndroid Build Coastguard Worker
22*6dbdd20aSAndroid Build Coastguard Worker# These warnings have been introduced with the newest version of clang (only in
23*6dbdd20aSAndroid Build Coastguard Worker# the hermetic build) and are enabled just with -Werror.
24*6dbdd20aSAndroid Build Coastguard Workerhermetic_clang_suppressions = [ "-Wno-c99-designator" ]
25*6dbdd20aSAndroid Build Coastguard Worker
26*6dbdd20aSAndroid Build Coastguard Worker# We deal with three toolchains here:
27*6dbdd20aSAndroid Build Coastguard Worker# 1. Clang, used in most cases.
28*6dbdd20aSAndroid Build Coastguard Worker# 2. GCC, used in some Linux cases.
29*6dbdd20aSAndroid Build Coastguard Worker# 3. MSVC, used in some Windows cases.
30*6dbdd20aSAndroid Build Coastguard Worker# Clang vs gcc is typically not a problem: both support roughly the same
31*6dbdd20aSAndroid Build Coastguard Worker# switches. -Wno-unknown-warning-option fixes the mismatching ones.
32*6dbdd20aSAndroid Build Coastguard Worker# The situation on Windows is a bit trickier: clang-cl.exe really pretends to be
33*6dbdd20aSAndroid Build Coastguard Worker# cl.exe (MSVC), so we should use MSVC-style switches (e.g. /W2). However,
34*6dbdd20aSAndroid Build Coastguard Worker# clang-cl.exe still supports some -Wclang-style-switches for flags that don't
35*6dbdd20aSAndroid Build Coastguard Worker# have a corresponding version in MSVC.
36*6dbdd20aSAndroid Build Coastguard Worker#
37*6dbdd20aSAndroid Build Coastguard Worker# In the rules below, the conditionals should be interpreted as follows:
38*6dbdd20aSAndroid Build Coastguard Worker# is_win -> can be either clang-cl.exe or cl.exe (MSVC). Only MSVC-style
39*6dbdd20aSAndroid Build Coastguard Worker#           switches (the common denominator) should be used.
40*6dbdd20aSAndroid Build Coastguard Worker# is_clang -> could be clang-on-linux, clang-on-mac or clang-cl.exe.
41*6dbdd20aSAndroid Build Coastguard Worker
42*6dbdd20aSAndroid Build Coastguard Workerconfig("extra_warnings") {
43*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
44*6dbdd20aSAndroid Build Coastguard Worker    cflags = [
45*6dbdd20aSAndroid Build Coastguard Worker      "/W2",
46*6dbdd20aSAndroid Build Coastguard Worker      "/wd4244",  # conversion from 'float' to 'int', possible loss of data
47*6dbdd20aSAndroid Build Coastguard Worker      "/wd4267",  # conversion from 'size_t' to 'int', possible loss of data
48*6dbdd20aSAndroid Build Coastguard Worker    ]
49*6dbdd20aSAndroid Build Coastguard Worker    if (is_clang) {
50*6dbdd20aSAndroid Build Coastguard Worker      cflags += [
51*6dbdd20aSAndroid Build Coastguard Worker        "-Wno-float-equal",
52*6dbdd20aSAndroid Build Coastguard Worker        "-Wno-unused-macros",
53*6dbdd20aSAndroid Build Coastguard Worker        "-Wno-old-style-cast",
54*6dbdd20aSAndroid Build Coastguard Worker      ]
55*6dbdd20aSAndroid Build Coastguard Worker    }
56*6dbdd20aSAndroid Build Coastguard Worker  } else {
57*6dbdd20aSAndroid Build Coastguard Worker    # Clang or Gcc. On linux, Android and Mac.
58*6dbdd20aSAndroid Build Coastguard Worker    cflags = [
59*6dbdd20aSAndroid Build Coastguard Worker      "-Wall",
60*6dbdd20aSAndroid Build Coastguard Worker      "-Wextra",
61*6dbdd20aSAndroid Build Coastguard Worker      "-Wpedantic",
62*6dbdd20aSAndroid Build Coastguard Worker    ]
63*6dbdd20aSAndroid Build Coastguard Worker  }
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard Worker  # Disable variadic macro warning as we make extensive use of them in trace
66*6dbdd20aSAndroid Build Coastguard Worker  # processor and client API.
67*6dbdd20aSAndroid Build Coastguard Worker  if (is_clang) {
68*6dbdd20aSAndroid Build Coastguard Worker    # Only enable -Weverything on hermetic clang as system clang might be quite
69*6dbdd20aSAndroid Build Coastguard Worker    # out of date.
70*6dbdd20aSAndroid Build Coastguard Worker    if (is_hermetic_clang && current_toolchain == host_toolchain &&
71*6dbdd20aSAndroid Build Coastguard Worker        !is_fuzzer) {
72*6dbdd20aSAndroid Build Coastguard Worker      # Disable Weverything on fuzzers to avoid breakages when new versions of
73*6dbdd20aSAndroid Build Coastguard Worker      # clang are rolled into OSS-fuzz.
74*6dbdd20aSAndroid Build Coastguard Worker      cflags += [ "-Weverything" ]
75*6dbdd20aSAndroid Build Coastguard Worker    }
76*6dbdd20aSAndroid Build Coastguard Worker    cflags += [
77*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-c++98-compat-pedantic",
78*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-c++98-compat",
79*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-disabled-macro-expansion",
80*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-documentation-unknown-command",
81*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-gnu-include-next",
82*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-gnu-statement-expression",
83*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-gnu-zero-variadic-macro-arguments",
84*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-padded",
85*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-poison-system-directories",
86*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-pre-c11-compat",
87*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-reserved-id-macro",
88*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-reserved-identifier",
89*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-shadow-uncaptured-local",
90*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-unknown-sanitizers",
91*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-unknown-warning-option",
92*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-unsafe-buffer-usage",
93*6dbdd20aSAndroid Build Coastguard Worker
94*6dbdd20aSAndroid Build Coastguard Worker      # TODO(primiano): -Wswitch-default could be useful but will require a mass
95*6dbdd20aSAndroid Build Coastguard Worker      # codebase cleanup.
96*6dbdd20aSAndroid Build Coastguard Worker      "-Wno-switch-default",
97*6dbdd20aSAndroid Build Coastguard Worker    ]
98*6dbdd20aSAndroid Build Coastguard Worker
99*6dbdd20aSAndroid Build Coastguard Worker    if (perfetto_thread_safety_annotations) {
100*6dbdd20aSAndroid Build Coastguard Worker      cflags += [
101*6dbdd20aSAndroid Build Coastguard Worker        "-Wthread-safety",
102*6dbdd20aSAndroid Build Coastguard Worker        "-Wno-thread-safety-negative",
103*6dbdd20aSAndroid Build Coastguard Worker      ]
104*6dbdd20aSAndroid Build Coastguard Worker    }
105*6dbdd20aSAndroid Build Coastguard Worker  } else if (is_gcc) {
106*6dbdd20aSAndroid Build Coastguard Worker    # Use return std::move(...) for compatibility with old GCC compilers.
107*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc = [ "-Wno-redundant-move" ]
108*6dbdd20aSAndroid Build Coastguard Worker
109*6dbdd20aSAndroid Build Coastguard Worker    # Use after free detection in GCC is still not good enough: it still fails
110*6dbdd20aSAndroid Build Coastguard Worker    # on very obvious false-positives in trace processor.
111*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc += [ "-Wno-use-after-free" ]
112*6dbdd20aSAndroid Build Coastguard Worker
113*6dbdd20aSAndroid Build Coastguard Worker    # GCC 7's handling of uninitialized std::optional is flaky at best and
114*6dbdd20aSAndroid Build Coastguard Worker    # causes many false positives.
115*6dbdd20aSAndroid Build Coastguard Worker    # TODO(lalitm): remove this when we upgrade to a GCC version which is good
116*6dbdd20aSAndroid Build Coastguard Worker    # enough to handle this.
117*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc += [ "-Wno-maybe-uninitialized" ]
118*6dbdd20aSAndroid Build Coastguard Worker
119*6dbdd20aSAndroid Build Coastguard Worker    # GCC's handling of detecting infinite recursion is flaky at best and
120*6dbdd20aSAndroid Build Coastguard Worker    # causes some false positives.
121*6dbdd20aSAndroid Build Coastguard Worker    # TODO(lalitm): remove this when we upgrade to a GCC version which is good
122*6dbdd20aSAndroid Build Coastguard Worker    # enough to handle this.
123*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc += [ "-Wno-infinite-recursion" ]
124*6dbdd20aSAndroid Build Coastguard Worker
125*6dbdd20aSAndroid Build Coastguard Worker    # GCC's handling of detecting non null arguments is flaky at best and
126*6dbdd20aSAndroid Build Coastguard Worker    # causes some false positives.
127*6dbdd20aSAndroid Build Coastguard Worker    # TODO(lalitm): remove this when we upgrade to a GCC version which is good
128*6dbdd20aSAndroid Build Coastguard Worker    # enough to handle this.
129*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc += [ "-Wno-nonnull" ]
130*6dbdd20aSAndroid Build Coastguard Worker  }
131*6dbdd20aSAndroid Build Coastguard Worker}
132*6dbdd20aSAndroid Build Coastguard Worker
133*6dbdd20aSAndroid Build Coastguard Workerconfig("no_exceptions") {
134*6dbdd20aSAndroid Build Coastguard Worker  # Exceptions are disabled by default on Windows (Use /EHsc to enable them).
135*6dbdd20aSAndroid Build Coastguard Worker  if (!is_win) {
136*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc = [ "-fno-exceptions" ]
137*6dbdd20aSAndroid Build Coastguard Worker  }
138*6dbdd20aSAndroid Build Coastguard Worker}
139*6dbdd20aSAndroid Build Coastguard Worker
140*6dbdd20aSAndroid Build Coastguard Workerconfig("no_rtti") {
141*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
142*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc = [ "/GR-" ]
143*6dbdd20aSAndroid Build Coastguard Worker  } else {
144*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc = [ "-fno-rtti" ]
145*6dbdd20aSAndroid Build Coastguard Worker  }
146*6dbdd20aSAndroid Build Coastguard Worker}
147*6dbdd20aSAndroid Build Coastguard Worker
148*6dbdd20aSAndroid Build Coastguard Worker# Used in buildtools dependencies for standalone builds.
149*6dbdd20aSAndroid Build Coastguard Workerconfig("c++17") {
150*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
151*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc = [ "/std:c++17" ]
152*6dbdd20aSAndroid Build Coastguard Worker  } else {
153*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc = [ "-std=c++17" ]
154*6dbdd20aSAndroid Build Coastguard Worker  }
155*6dbdd20aSAndroid Build Coastguard Worker}
156*6dbdd20aSAndroid Build Coastguard Worker
157*6dbdd20aSAndroid Build Coastguard Worker# Used in buildtools dependencies for standalone builds.
158*6dbdd20aSAndroid Build Coastguard Workerconfig("c++20") {
159*6dbdd20aSAndroid Build Coastguard Worker  visibility = [ "//buildtools:libc++config" ]
160*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
161*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc = [ "/std:c++20" ]
162*6dbdd20aSAndroid Build Coastguard Worker  } else {
163*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc = [ "-std=c++20" ]
164*6dbdd20aSAndroid Build Coastguard Worker  }
165*6dbdd20aSAndroid Build Coastguard Worker}
166*6dbdd20aSAndroid Build Coastguard Worker
167*6dbdd20aSAndroid Build Coastguard Workerconfig("visibility_hidden") {
168*6dbdd20aSAndroid Build Coastguard Worker  if (!is_win) {
169*6dbdd20aSAndroid Build Coastguard Worker    cflags = [ "-fvisibility=hidden" ]
170*6dbdd20aSAndroid Build Coastguard Worker  }
171*6dbdd20aSAndroid Build Coastguard Worker}
172*6dbdd20aSAndroid Build Coastguard Worker
173*6dbdd20aSAndroid Build Coastguard Workerconfig("win32_lean_and_mean") {
174*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
175*6dbdd20aSAndroid Build Coastguard Worker    defines = [ "WIN32_LEAN_AND_MEAN" ]
176*6dbdd20aSAndroid Build Coastguard Worker  }
177*6dbdd20aSAndroid Build Coastguard Worker}
178*6dbdd20aSAndroid Build Coastguard Worker
179*6dbdd20aSAndroid Build Coastguard Workerconfig("default") {
180*6dbdd20aSAndroid Build Coastguard Worker  asmflags = []
181*6dbdd20aSAndroid Build Coastguard Worker  cflags = []
182*6dbdd20aSAndroid Build Coastguard Worker  cflags_c = []
183*6dbdd20aSAndroid Build Coastguard Worker  cflags_cc = []
184*6dbdd20aSAndroid Build Coastguard Worker  defines = []
185*6dbdd20aSAndroid Build Coastguard Worker  include_dirs = []
186*6dbdd20aSAndroid Build Coastguard Worker  ldflags = []
187*6dbdd20aSAndroid Build Coastguard Worker  libs = []
188*6dbdd20aSAndroid Build Coastguard Worker
189*6dbdd20aSAndroid Build Coastguard Worker  if ((is_android || is_linux) && !is_wasm) {
190*6dbdd20aSAndroid Build Coastguard Worker    ldflags += [
191*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,--build-id",
192*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,-z,max-page-size=16384",
193*6dbdd20aSAndroid Build Coastguard Worker    ]
194*6dbdd20aSAndroid Build Coastguard Worker  }
195*6dbdd20aSAndroid Build Coastguard Worker
196*6dbdd20aSAndroid Build Coastguard Worker  if (is_clang || !is_win) {  # Clang or GCC, but not MSVC.
197*6dbdd20aSAndroid Build Coastguard Worker    cflags += [
198*6dbdd20aSAndroid Build Coastguard Worker      "-fstrict-aliasing",
199*6dbdd20aSAndroid Build Coastguard Worker      "-Wformat",
200*6dbdd20aSAndroid Build Coastguard Worker    ]
201*6dbdd20aSAndroid Build Coastguard Worker  }
202*6dbdd20aSAndroid Build Coastguard Worker
203*6dbdd20aSAndroid Build Coastguard Worker  if (is_clang && is_win) {
204*6dbdd20aSAndroid Build Coastguard Worker    # clang-cl from version 16 does not like out-of-line definition of static
205*6dbdd20aSAndroid Build Coastguard Worker    # constexpr, even in C++14 mode. Disable the deprecated warnings to work
206*6dbdd20aSAndroid Build Coastguard Worker    # around the problem.
207*6dbdd20aSAndroid Build Coastguard Worker    cflags += [ "-Wno-deprecated" ]
208*6dbdd20aSAndroid Build Coastguard Worker  }
209*6dbdd20aSAndroid Build Coastguard Worker
210*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
211*6dbdd20aSAndroid Build Coastguard Worker    cflags += [
212*6dbdd20aSAndroid Build Coastguard Worker      "/bigobj",  # Some of our files are bigger than the regular limits.
213*6dbdd20aSAndroid Build Coastguard Worker      "/Gy",  # Enable function-level linking.
214*6dbdd20aSAndroid Build Coastguard Worker      "/FS",  # Preserve previous PDB behavior.
215*6dbdd20aSAndroid Build Coastguard Worker      "/utf-8",  # Assume UTF-8 by default to avoid code page dependencies.
216*6dbdd20aSAndroid Build Coastguard Worker      "/Zc:__cplusplus",  # Allow use of __cplusplus macro.
217*6dbdd20aSAndroid Build Coastguard Worker    ]
218*6dbdd20aSAndroid Build Coastguard Worker    defines += [
219*6dbdd20aSAndroid Build Coastguard Worker      "_CRT_NONSTDC_NO_WARNINGS",
220*6dbdd20aSAndroid Build Coastguard Worker      "_CRT_SECURE_NO_DEPRECATE",
221*6dbdd20aSAndroid Build Coastguard Worker      "_CRT_SECURE_NO_WARNINGS",  # Disables warnings on some POSIX-compat API.
222*6dbdd20aSAndroid Build Coastguard Worker      "_SCL_SECURE_NO_DEPRECATE",
223*6dbdd20aSAndroid Build Coastguard Worker      "NOMINMAX",
224*6dbdd20aSAndroid Build Coastguard Worker    ]
225*6dbdd20aSAndroid Build Coastguard Worker    if (!use_custom_libcxx) {
226*6dbdd20aSAndroid Build Coastguard Worker      defines += [ "_HAS_EXCEPTIONS=0" ]  # Disables exceptions in MSVC STL.
227*6dbdd20aSAndroid Build Coastguard Worker    }
228*6dbdd20aSAndroid Build Coastguard Worker  } else if (!is_wasm) {  # !is_win
229*6dbdd20aSAndroid Build Coastguard Worker    cflags += [
230*6dbdd20aSAndroid Build Coastguard Worker      "-g",
231*6dbdd20aSAndroid Build Coastguard Worker      "-fPIC",
232*6dbdd20aSAndroid Build Coastguard Worker      "-fstack-protector-strong",
233*6dbdd20aSAndroid Build Coastguard Worker    ]
234*6dbdd20aSAndroid Build Coastguard Worker  }
235*6dbdd20aSAndroid Build Coastguard Worker
236*6dbdd20aSAndroid Build Coastguard Worker  # Treat warnings as errors, but give up on fuzzer builds.
237*6dbdd20aSAndroid Build Coastguard Worker  if (!is_fuzzer) {
238*6dbdd20aSAndroid Build Coastguard Worker    if (is_win) {
239*6dbdd20aSAndroid Build Coastguard Worker      cflags += [ "/WX" ]
240*6dbdd20aSAndroid Build Coastguard Worker    } else {
241*6dbdd20aSAndroid Build Coastguard Worker      cflags += [ "-Werror" ]
242*6dbdd20aSAndroid Build Coastguard Worker    }
243*6dbdd20aSAndroid Build Coastguard Worker  }
244*6dbdd20aSAndroid Build Coastguard Worker
245*6dbdd20aSAndroid Build Coastguard Worker  if (is_clang) {
246*6dbdd20aSAndroid Build Coastguard Worker    cflags += [ "-fcolor-diagnostics" ]
247*6dbdd20aSAndroid Build Coastguard Worker    if (!is_win) {
248*6dbdd20aSAndroid Build Coastguard Worker      cflags += [ "-fdiagnostics-show-template-tree" ]
249*6dbdd20aSAndroid Build Coastguard Worker    }
250*6dbdd20aSAndroid Build Coastguard Worker  }
251*6dbdd20aSAndroid Build Coastguard Worker
252*6dbdd20aSAndroid Build Coastguard Worker  if (is_hermetic_clang && is_linux && !is_wasm) {
253*6dbdd20aSAndroid Build Coastguard Worker    cflags += hermetic_clang_suppressions
254*6dbdd20aSAndroid Build Coastguard Worker  } else {
255*6dbdd20aSAndroid Build Coastguard Worker    not_needed([ "hermetic_clang_suppressions" ])
256*6dbdd20aSAndroid Build Coastguard Worker  }
257*6dbdd20aSAndroid Build Coastguard Worker
258*6dbdd20aSAndroid Build Coastguard Worker  if (non_hermetic_clang_stdlib != "") {
259*6dbdd20aSAndroid Build Coastguard Worker    if (is_clang && !is_hermetic_clang && !is_wasm) {
260*6dbdd20aSAndroid Build Coastguard Worker      cflags_cc += [ "-stdlib=" + non_hermetic_clang_stdlib ]
261*6dbdd20aSAndroid Build Coastguard Worker      ldflags += [ "-stdlib=" + non_hermetic_clang_stdlib ]
262*6dbdd20aSAndroid Build Coastguard Worker    }
263*6dbdd20aSAndroid Build Coastguard Worker  }
264*6dbdd20aSAndroid Build Coastguard Worker
265*6dbdd20aSAndroid Build Coastguard Worker  if (is_lto) {
266*6dbdd20aSAndroid Build Coastguard Worker    cflags += [ "-flto=full" ]
267*6dbdd20aSAndroid Build Coastguard Worker    ldflags += [ "-flto=full" ]
268*6dbdd20aSAndroid Build Coastguard Worker  }
269*6dbdd20aSAndroid Build Coastguard Worker
270*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
271*6dbdd20aSAndroid Build Coastguard Worker    # We support only x86/x64 builds on Windows.
272*6dbdd20aSAndroid Build Coastguard Worker    assert(current_cpu == "x64" || current_cpu == "x86")
273*6dbdd20aSAndroid Build Coastguard Worker  } else if (current_cpu == "arm") {
274*6dbdd20aSAndroid Build Coastguard Worker    cflags += [
275*6dbdd20aSAndroid Build Coastguard Worker      "-march=armv7-a",
276*6dbdd20aSAndroid Build Coastguard Worker      "-mfpu=neon",
277*6dbdd20aSAndroid Build Coastguard Worker      "-mthumb",
278*6dbdd20aSAndroid Build Coastguard Worker    ]
279*6dbdd20aSAndroid Build Coastguard Worker  } else if (current_cpu == "riscv64") {
280*6dbdd20aSAndroid Build Coastguard Worker    if (!is_clang) {
281*6dbdd20aSAndroid Build Coastguard Worker      # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104338
282*6dbdd20aSAndroid Build Coastguard Worker      libs += [ "atomic" ]
283*6dbdd20aSAndroid Build Coastguard Worker    }
284*6dbdd20aSAndroid Build Coastguard Worker  } else if (current_cpu == "x86") {
285*6dbdd20aSAndroid Build Coastguard Worker    asmflags += [ "-m32" ]
286*6dbdd20aSAndroid Build Coastguard Worker    cflags += [
287*6dbdd20aSAndroid Build Coastguard Worker      "-m32",
288*6dbdd20aSAndroid Build Coastguard Worker      "-msse2",
289*6dbdd20aSAndroid Build Coastguard Worker      "-mfpmath=sse",
290*6dbdd20aSAndroid Build Coastguard Worker    ]
291*6dbdd20aSAndroid Build Coastguard Worker    ldflags += [ "-m32" ]
292*6dbdd20aSAndroid Build Coastguard Worker  } else if (current_cpu == "arm64") {
293*6dbdd20aSAndroid Build Coastguard Worker    cflags += [ "-fno-omit-frame-pointer" ]
294*6dbdd20aSAndroid Build Coastguard Worker  } else if (current_cpu == "x64") {
295*6dbdd20aSAndroid Build Coastguard Worker    cflags += [ "-fno-omit-frame-pointer" ]  # For perf profiling.
296*6dbdd20aSAndroid Build Coastguard Worker    if (enable_perfetto_x64_cpu_opt) {
297*6dbdd20aSAndroid Build Coastguard Worker      # When updating these flags, the CheckCpuOptimizations() in utils.cc must
298*6dbdd20aSAndroid Build Coastguard Worker      # be updated accordingly.
299*6dbdd20aSAndroid Build Coastguard Worker      cflags += [
300*6dbdd20aSAndroid Build Coastguard Worker        "-mbmi",
301*6dbdd20aSAndroid Build Coastguard Worker        "-mbmi2",
302*6dbdd20aSAndroid Build Coastguard Worker        "-mavx2",
303*6dbdd20aSAndroid Build Coastguard Worker        "-mpopcnt",
304*6dbdd20aSAndroid Build Coastguard Worker        "-msse4.2",
305*6dbdd20aSAndroid Build Coastguard Worker      ]
306*6dbdd20aSAndroid Build Coastguard Worker    }
307*6dbdd20aSAndroid Build Coastguard Worker  }
308*6dbdd20aSAndroid Build Coastguard Worker
309*6dbdd20aSAndroid Build Coastguard Worker  if (is_wasm) {
310*6dbdd20aSAndroid Build Coastguard Worker    # As of writing (2023-06-12) WASM 128bit SIMD is supported on
311*6dbdd20aSAndroid Build Coastguard Worker    # stable Chrome, Safari, and Firefox. See:
312*6dbdd20aSAndroid Build Coastguard Worker    # - https://webassembly.org/roadmap/
313*6dbdd20aSAndroid Build Coastguard Worker    # - https://emscripten.org/docs/porting/simd.html
314*6dbdd20aSAndroid Build Coastguard Worker    cflags += [ "-msimd128" ]
315*6dbdd20aSAndroid Build Coastguard Worker  }
316*6dbdd20aSAndroid Build Coastguard Worker
317*6dbdd20aSAndroid Build Coastguard Worker  if (is_linux) {
318*6dbdd20aSAndroid Build Coastguard Worker    # Enable LFS (large file support) for stat() and other syscalls.
319*6dbdd20aSAndroid Build Coastguard Worker    cflags += [
320*6dbdd20aSAndroid Build Coastguard Worker      "-D_FILE_OFFSET_BITS=64",
321*6dbdd20aSAndroid Build Coastguard Worker      "-D_LARGEFILE_SOURCE",
322*6dbdd20aSAndroid Build Coastguard Worker      "-D_LARGEFILE64_SOURCE",
323*6dbdd20aSAndroid Build Coastguard Worker    ]
324*6dbdd20aSAndroid Build Coastguard Worker    libs += [
325*6dbdd20aSAndroid Build Coastguard Worker      "pthread",
326*6dbdd20aSAndroid Build Coastguard Worker      "rt",
327*6dbdd20aSAndroid Build Coastguard Worker    ]
328*6dbdd20aSAndroid Build Coastguard Worker  }
329*6dbdd20aSAndroid Build Coastguard Worker
330*6dbdd20aSAndroid Build Coastguard Worker  if (is_win && !is_clang) {
331*6dbdd20aSAndroid Build Coastguard Worker    # When using MSVC we need to manually pass the include dirs. clang-cl.exe
332*6dbdd20aSAndroid Build Coastguard Worker    # doesn't need them because it's smart enough to figure out the right path
333*6dbdd20aSAndroid Build Coastguard Worker    # by querying the registry on its own.
334*6dbdd20aSAndroid Build Coastguard Worker    include_dirs = win_msvc_inc_dirs  # Defined in msvc.gni.
335*6dbdd20aSAndroid Build Coastguard Worker  }
336*6dbdd20aSAndroid Build Coastguard Worker
337*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
338*6dbdd20aSAndroid Build Coastguard Worker    cflags += [ "/Zi" ]
339*6dbdd20aSAndroid Build Coastguard Worker  }
340*6dbdd20aSAndroid Build Coastguard Worker  if (is_debug) {
341*6dbdd20aSAndroid Build Coastguard Worker    if (is_win) {
342*6dbdd20aSAndroid Build Coastguard Worker      if (is_clang) {
343*6dbdd20aSAndroid Build Coastguard Worker        # Required to see symbols in windbg when building with clang-cl.exe.
344*6dbdd20aSAndroid Build Coastguard Worker        cflags += [ "-gcodeview-ghash" ]
345*6dbdd20aSAndroid Build Coastguard Worker        ldflags = [ "/DEBUG:GHASH" ]
346*6dbdd20aSAndroid Build Coastguard Worker      }
347*6dbdd20aSAndroid Build Coastguard Worker    } else {
348*6dbdd20aSAndroid Build Coastguard Worker      libs += [ "dl" ]
349*6dbdd20aSAndroid Build Coastguard Worker    }
350*6dbdd20aSAndroid Build Coastguard Worker  }
351*6dbdd20aSAndroid Build Coastguard Worker
352*6dbdd20aSAndroid Build Coastguard Worker  if (is_android) {
353*6dbdd20aSAndroid Build Coastguard Worker    asmflags += [ "--target=$android_abi_target" ]
354*6dbdd20aSAndroid Build Coastguard Worker    cflags += [
355*6dbdd20aSAndroid Build Coastguard Worker      "--sysroot=$android_compile_sysroot",
356*6dbdd20aSAndroid Build Coastguard Worker      "-DANDROID",
357*6dbdd20aSAndroid Build Coastguard Worker      "-D__ANDROID_API__=${android_api_level}",
358*6dbdd20aSAndroid Build Coastguard Worker      "--target=$android_abi_target",
359*6dbdd20aSAndroid Build Coastguard Worker    ]
360*6dbdd20aSAndroid Build Coastguard Worker    cflags_cc += [ "-isystem$android_compile_sysroot/c++/v1" ]
361*6dbdd20aSAndroid Build Coastguard Worker
362*6dbdd20aSAndroid Build Coastguard Worker    android_lib_dir = "$android_compile_sysroot/usr/lib/$android_abi_target/$android_api_level"
363*6dbdd20aSAndroid Build Coastguard Worker    ldflags += [
364*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,-z,nocopyreloc",
365*6dbdd20aSAndroid Build Coastguard Worker      "--sysroot=$android_compile_sysroot",
366*6dbdd20aSAndroid Build Coastguard Worker      "-B${android_lib_dir}",
367*6dbdd20aSAndroid Build Coastguard Worker      "--target=$android_abi_target",
368*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,--no-undefined",
369*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,-z,noexecstack",
370*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,-z,relro",
371*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,-z,now",
372*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,--warn-shared-textrel",
373*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,--fatal-warnings",
374*6dbdd20aSAndroid Build Coastguard Worker
375*6dbdd20aSAndroid Build Coastguard Worker      # From NDK docs: "although the option uses the name "libstdc++" for
376*6dbdd20aSAndroid Build Coastguard Worker      # historical reasons, this is correct for libc++ as well.
377*6dbdd20aSAndroid Build Coastguard Worker      "-static-libstdc++",
378*6dbdd20aSAndroid Build Coastguard Worker    ]
379*6dbdd20aSAndroid Build Coastguard Worker    lib_dirs = [ android_lib_dir ]
380*6dbdd20aSAndroid Build Coastguard Worker  }
381*6dbdd20aSAndroid Build Coastguard Worker}
382*6dbdd20aSAndroid Build Coastguard Worker
383*6dbdd20aSAndroid Build Coastguard Workerconfig("debug_noopt") {
384*6dbdd20aSAndroid Build Coastguard Worker  cflags = []
385*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
386*6dbdd20aSAndroid Build Coastguard Worker    cflags = [ "/Od" ]
387*6dbdd20aSAndroid Build Coastguard Worker  } else {
388*6dbdd20aSAndroid Build Coastguard Worker    cflags = [ "-O0" ]
389*6dbdd20aSAndroid Build Coastguard Worker  }
390*6dbdd20aSAndroid Build Coastguard Worker  if (is_android || is_linux) {
391*6dbdd20aSAndroid Build Coastguard Worker    cflags += [ "-funwind-tables" ]
392*6dbdd20aSAndroid Build Coastguard Worker  }
393*6dbdd20aSAndroid Build Coastguard Worker}
394*6dbdd20aSAndroid Build Coastguard Worker
395*6dbdd20aSAndroid Build Coastguard Workerconfig("release") {
396*6dbdd20aSAndroid Build Coastguard Worker  # Compiler flags for release builds.
397*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
398*6dbdd20aSAndroid Build Coastguard Worker    cflags = [
399*6dbdd20aSAndroid Build Coastguard Worker      "/O2",
400*6dbdd20aSAndroid Build Coastguard Worker      "/Zc:inline",
401*6dbdd20aSAndroid Build Coastguard Worker    ]
402*6dbdd20aSAndroid Build Coastguard Worker  } else if (is_android) {
403*6dbdd20aSAndroid Build Coastguard Worker    cflags = [ "-O2" ]
404*6dbdd20aSAndroid Build Coastguard Worker  } else if (is_fuzzer) {
405*6dbdd20aSAndroid Build Coastguard Worker    cflags = [ "-O1" ]
406*6dbdd20aSAndroid Build Coastguard Worker  } else {
407*6dbdd20aSAndroid Build Coastguard Worker    cflags = [ "-O3" ]
408*6dbdd20aSAndroid Build Coastguard Worker  }
409*6dbdd20aSAndroid Build Coastguard Worker  if (!is_win) {
410*6dbdd20aSAndroid Build Coastguard Worker    cflags += [
411*6dbdd20aSAndroid Build Coastguard Worker      "-fdata-sections",
412*6dbdd20aSAndroid Build Coastguard Worker      "-ffunction-sections",
413*6dbdd20aSAndroid Build Coastguard Worker    ]
414*6dbdd20aSAndroid Build Coastguard Worker  }
415*6dbdd20aSAndroid Build Coastguard Worker
416*6dbdd20aSAndroid Build Coastguard Worker  # Linker flags for release builds.
417*6dbdd20aSAndroid Build Coastguard Worker  if (is_win) {
418*6dbdd20aSAndroid Build Coastguard Worker    ldflags = [
419*6dbdd20aSAndroid Build Coastguard Worker      "/OPT:REF",
420*6dbdd20aSAndroid Build Coastguard Worker      "/OPT:ICF",
421*6dbdd20aSAndroid Build Coastguard Worker      "/INCREMENTAL:NO",
422*6dbdd20aSAndroid Build Coastguard Worker      "/FIXED:NO",
423*6dbdd20aSAndroid Build Coastguard Worker    ]
424*6dbdd20aSAndroid Build Coastguard Worker  } else if (is_mac) {
425*6dbdd20aSAndroid Build Coastguard Worker    ldflags = [ "-dead_strip" ]
426*6dbdd20aSAndroid Build Coastguard Worker  } else if (!is_win && !is_wasm) {
427*6dbdd20aSAndroid Build Coastguard Worker    ldflags = [
428*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,--gc-sections",
429*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,--icf=all",
430*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,-O1",
431*6dbdd20aSAndroid Build Coastguard Worker    ]
432*6dbdd20aSAndroid Build Coastguard Worker  }
433*6dbdd20aSAndroid Build Coastguard Worker  defines = [ "NDEBUG" ]
434*6dbdd20aSAndroid Build Coastguard Worker}
435*6dbdd20aSAndroid Build Coastguard Worker
436*6dbdd20aSAndroid Build Coastguard Workerconfig("shared_library") {
437*6dbdd20aSAndroid Build Coastguard Worker  if (is_android || is_linux) {
438*6dbdd20aSAndroid Build Coastguard Worker    ldflags = [ "-fPIC" ]
439*6dbdd20aSAndroid Build Coastguard Worker  }
440*6dbdd20aSAndroid Build Coastguard Worker}
441*6dbdd20aSAndroid Build Coastguard Worker
442*6dbdd20aSAndroid Build Coastguard Workerconfig("executable") {
443*6dbdd20aSAndroid Build Coastguard Worker  ldflags = []
444*6dbdd20aSAndroid Build Coastguard Worker
445*6dbdd20aSAndroid Build Coastguard Worker  # Android will refuse to run executables if they aren't position independent.
446*6dbdd20aSAndroid Build Coastguard Worker  # Instead on Linux there isn't any need and they break ASan (goo.gl/paFR6K).
447*6dbdd20aSAndroid Build Coastguard Worker  # The OSS-Fuzz provided AFL library is not PIC, so we we cannot use -fPIE
448*6dbdd20aSAndroid Build Coastguard Worker  # for the fuzzer executables.
449*6dbdd20aSAndroid Build Coastguard Worker  if ((is_android || is_linux) && !is_wasm && !is_fuzzer) {
450*6dbdd20aSAndroid Build Coastguard Worker    asmflags = [ "-fPIE" ]
451*6dbdd20aSAndroid Build Coastguard Worker    cflags = [ "-fPIE" ]
452*6dbdd20aSAndroid Build Coastguard Worker    ldflags += [ "-pie" ]
453*6dbdd20aSAndroid Build Coastguard Worker  }
454*6dbdd20aSAndroid Build Coastguard Worker
455*6dbdd20aSAndroid Build Coastguard Worker  # -rpath stores the path to the linked shared libraries into the binary, so
456*6dbdd20aSAndroid Build Coastguard Worker  # that they can be launched without passing any LD_LIBRARY_PATH. It's
457*6dbdd20aSAndroid Build Coastguard Worker  # supported only by Linux, not Android. But concretely we need this only when
458*6dbdd20aSAndroid Build Coastguard Worker  # use_custom_libcxx=true && custom_libcxx_is_static=false, which happens only
459*6dbdd20aSAndroid Build Coastguard Worker  # on Linux right now.
460*6dbdd20aSAndroid Build Coastguard Worker  if (is_linux && !is_wasm) {
461*6dbdd20aSAndroid Build Coastguard Worker    ldflags += [
462*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,-rpath=\$ORIGIN/.",
463*6dbdd20aSAndroid Build Coastguard Worker      "-Wl,-rpath-link=.",
464*6dbdd20aSAndroid Build Coastguard Worker    ]
465*6dbdd20aSAndroid Build Coastguard Worker  }
466*6dbdd20aSAndroid Build Coastguard Worker}
467*6dbdd20aSAndroid Build Coastguard Worker
468*6dbdd20aSAndroid Build Coastguard Worker# This config is only added to certain leaf target types (see BUILDCONFIG.gn).
469*6dbdd20aSAndroid Build Coastguard Worker# This allows us to remove the config (and thus the dependency) on a per-target
470*6dbdd20aSAndroid Build Coastguard Worker# basis. If the config was applied to source_sets, then they would unavoidably
471*6dbdd20aSAndroid Build Coastguard Worker# carry the dependency onto liblog to the final target.
472*6dbdd20aSAndroid Build Coastguard Workerconfig("android_liblog") {
473*6dbdd20aSAndroid Build Coastguard Worker  if (is_android) {
474*6dbdd20aSAndroid Build Coastguard Worker    libs = [ "log" ]
475*6dbdd20aSAndroid Build Coastguard Worker  }
476*6dbdd20aSAndroid Build Coastguard Worker}
477*6dbdd20aSAndroid Build Coastguard Worker
478*6dbdd20aSAndroid Build Coastguard Worker# Checks that tools/install-build-deps has been run since it last changed.
479*6dbdd20aSAndroid Build Coastguard Workerperfetto_check_build_deps("check_build_deps") {
480*6dbdd20aSAndroid Build Coastguard Worker  args = []
481*6dbdd20aSAndroid Build Coastguard Worker}
482*6dbdd20aSAndroid Build Coastguard Worker
483*6dbdd20aSAndroid Build Coastguard Workerperfetto_check_build_deps("check_build_deps_android") {
484*6dbdd20aSAndroid Build Coastguard Worker  args = [ "--android" ]
485*6dbdd20aSAndroid Build Coastguard Worker}
486