xref: /aosp_15_r20/external/cronet/build/config/BUILDCONFIG.gn (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2013 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 Worker# =============================================================================
6*6777b538SAndroid Build Coastguard Worker# WHAT IS THIS FILE?
7*6777b538SAndroid Build Coastguard Worker# =============================================================================
8*6777b538SAndroid Build Coastguard Worker#
9*6777b538SAndroid Build Coastguard Worker# This is the main GN build configuration. This file is loaded after the
10*6777b538SAndroid Build Coastguard Worker# build args (args.gn) for the build directory and after the toplevel ".gn"
11*6777b538SAndroid Build Coastguard Worker# file (which points to this file as the build configuration).
12*6777b538SAndroid Build Coastguard Worker#
13*6777b538SAndroid Build Coastguard Worker# This file will be executed and the resulting context will be used to execute
14*6777b538SAndroid Build Coastguard Worker# every other file in the build. So variables declared here (that don't start
15*6777b538SAndroid Build Coastguard Worker# with an underscore) will be implicitly global.
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker# =============================================================================
18*6777b538SAndroid Build Coastguard Worker# PLATFORM SELECTION
19*6777b538SAndroid Build Coastguard Worker# =============================================================================
20*6777b538SAndroid Build Coastguard Worker#
21*6777b538SAndroid Build Coastguard Worker# There are two main things to set: "os" and "cpu". The "toolchain" is the name
22*6777b538SAndroid Build Coastguard Worker# of the GN thing that encodes combinations of these things.
23*6777b538SAndroid Build Coastguard Worker#
24*6777b538SAndroid Build Coastguard Worker# Users typically only set the variables "target_os" and "target_cpu" in "gn
25*6777b538SAndroid Build Coastguard Worker# args", the rest are set up by our build and internal to GN.
26*6777b538SAndroid Build Coastguard Worker#
27*6777b538SAndroid Build Coastguard Worker# There are three different types of each of these things: The "host"
28*6777b538SAndroid Build Coastguard Worker# represents the computer doing the compile and never changes. The "target"
29*6777b538SAndroid Build Coastguard Worker# represents the main thing we're trying to build. The "current" represents
30*6777b538SAndroid Build Coastguard Worker# which configuration is currently being defined, which can be either the
31*6777b538SAndroid Build Coastguard Worker# host, the target, or something completely different (like nacl). GN will
32*6777b538SAndroid Build Coastguard Worker# run the same build file multiple times for the different required
33*6777b538SAndroid Build Coastguard Worker# configuration in the same build.
34*6777b538SAndroid Build Coastguard Worker#
35*6777b538SAndroid Build Coastguard Worker# This gives the following variables:
36*6777b538SAndroid Build Coastguard Worker#  - host_os, host_cpu, host_toolchain
37*6777b538SAndroid Build Coastguard Worker#  - target_os, target_cpu, default_toolchain
38*6777b538SAndroid Build Coastguard Worker#  - current_os, current_cpu, current_toolchain.
39*6777b538SAndroid Build Coastguard Worker#
40*6777b538SAndroid Build Coastguard Worker# Note the default_toolchain isn't symmetrical (you would expect
41*6777b538SAndroid Build Coastguard Worker# target_toolchain). This is because the "default" toolchain is a GN built-in
42*6777b538SAndroid Build Coastguard Worker# concept, and "target" is something our build sets up that's symmetrical with
43*6777b538SAndroid Build Coastguard Worker# its GYP counterpart. Potentially the built-in default_toolchain variable
44*6777b538SAndroid Build Coastguard Worker# could be renamed in the future.
45*6777b538SAndroid Build Coastguard Worker#
46*6777b538SAndroid Build Coastguard Worker# When writing build files, to do something only for the host:
47*6777b538SAndroid Build Coastguard Worker#   if (current_toolchain == host_toolchain) { ...
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Workerif (target_os == "") {
50*6777b538SAndroid Build Coastguard Worker  target_os = host_os
51*6777b538SAndroid Build Coastguard Worker}
52*6777b538SAndroid Build Coastguard Worker
53*6777b538SAndroid Build Coastguard Workerif (target_cpu == "") {
54*6777b538SAndroid Build Coastguard Worker  if (target_os == "android") {
55*6777b538SAndroid Build Coastguard Worker    # If we're building for Android, we should assume that we want to
56*6777b538SAndroid Build Coastguard Worker    # build for ARM by default, not the host_cpu (which is likely x64).
57*6777b538SAndroid Build Coastguard Worker    # This allows us to not have to specify both target_os and target_cpu
58*6777b538SAndroid Build Coastguard Worker    # on the command line.
59*6777b538SAndroid Build Coastguard Worker    target_cpu = "arm"
60*6777b538SAndroid Build Coastguard Worker  } else {
61*6777b538SAndroid Build Coastguard Worker    target_cpu = host_cpu
62*6777b538SAndroid Build Coastguard Worker  }
63*6777b538SAndroid Build Coastguard Worker}
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Workerif (current_cpu == "") {
66*6777b538SAndroid Build Coastguard Worker  current_cpu = target_cpu
67*6777b538SAndroid Build Coastguard Worker}
68*6777b538SAndroid Build Coastguard Workerif (current_os == "") {
69*6777b538SAndroid Build Coastguard Worker  current_os = target_os
70*6777b538SAndroid Build Coastguard Worker}
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker# =============================================================================
73*6777b538SAndroid Build Coastguard Worker# BUILD FLAGS
74*6777b538SAndroid Build Coastguard Worker# =============================================================================
75*6777b538SAndroid Build Coastguard Worker#
76*6777b538SAndroid Build Coastguard Worker# This block lists input arguments to the build, along with their default
77*6777b538SAndroid Build Coastguard Worker# values.
78*6777b538SAndroid Build Coastguard Worker#
79*6777b538SAndroid Build Coastguard Worker# If a value is specified on the command line, it will overwrite the defaults
80*6777b538SAndroid Build Coastguard Worker# given in a declare_args block, otherwise the default will be used.
81*6777b538SAndroid Build Coastguard Worker#
82*6777b538SAndroid Build Coastguard Worker# YOU SHOULD ALMOST NEVER NEED TO ADD FLAGS TO THIS FILE. GN allows any file in
83*6777b538SAndroid Build Coastguard Worker# the build to declare build flags. If you need a flag for a single component,
84*6777b538SAndroid Build Coastguard Worker# you can just declare it in the corresponding BUILD.gn file.
85*6777b538SAndroid Build Coastguard Worker#
86*6777b538SAndroid Build Coastguard Worker# - If your feature is a single target, say //components/foo, you can put
87*6777b538SAndroid Build Coastguard Worker#   a declare_args() block in //components/foo/BUILD.gn and use it there.
88*6777b538SAndroid Build Coastguard Worker#   Nobody else in the build needs to see the flag.
89*6777b538SAndroid Build Coastguard Worker#
90*6777b538SAndroid Build Coastguard Worker# - Defines based on build variables should be implemented via the generated
91*6777b538SAndroid Build Coastguard Worker#   build flag header system. See //build/buildflag_header.gni. You can put
92*6777b538SAndroid Build Coastguard Worker#   the buildflag_header target in the same file as the build flag itself. You
93*6777b538SAndroid Build Coastguard Worker#   should almost never set "defines" directly.
94*6777b538SAndroid Build Coastguard Worker#
95*6777b538SAndroid Build Coastguard Worker# - If your flag toggles a target on and off or toggles between different
96*6777b538SAndroid Build Coastguard Worker#   versions of similar things, write a "group" target that forwards to the
97*6777b538SAndroid Build Coastguard Worker#   right target (or no target) depending on the value of the build flag. This
98*6777b538SAndroid Build Coastguard Worker#   group can be in the same BUILD.gn file as the build flag, and targets can
99*6777b538SAndroid Build Coastguard Worker#   depend unconditionally on the group rather than duplicating flag checks
100*6777b538SAndroid Build Coastguard Worker#   across many targets.
101*6777b538SAndroid Build Coastguard Worker#
102*6777b538SAndroid Build Coastguard Worker# - If a semi-random set of build files REALLY needs to know about a define and
103*6777b538SAndroid Build Coastguard Worker#   the above pattern for isolating the build logic in a forwarding group
104*6777b538SAndroid Build Coastguard Worker#   doesn't work, you can put the argument in a .gni file. This should be put
105*6777b538SAndroid Build Coastguard Worker#   in the lowest level of the build that knows about this feature (which should
106*6777b538SAndroid Build Coastguard Worker#   almost always be outside of the //build directory!).
107*6777b538SAndroid Build Coastguard Worker#
108*6777b538SAndroid Build Coastguard Worker# Other flag advice:
109*6777b538SAndroid Build Coastguard Worker#
110*6777b538SAndroid Build Coastguard Worker# - Use boolean values when possible. If you need a default value that expands
111*6777b538SAndroid Build Coastguard Worker#   to some complex thing in the default case (like the location of the
112*6777b538SAndroid Build Coastguard Worker#   compiler which would be computed by a script), use a default value of -1 or
113*6777b538SAndroid Build Coastguard Worker#   the empty string. Outside of the declare_args block, conditionally expand
114*6777b538SAndroid Build Coastguard Worker#   the default value as necessary.
115*6777b538SAndroid Build Coastguard Worker#
116*6777b538SAndroid Build Coastguard Worker# - Use a name like "use_foo" or "is_foo" (whatever is more appropriate for
117*6777b538SAndroid Build Coastguard Worker#   your feature) rather than just "foo".
118*6777b538SAndroid Build Coastguard Worker#
119*6777b538SAndroid Build Coastguard Worker# - Write good comments directly above the declaration with no blank line.
120*6777b538SAndroid Build Coastguard Worker#   These comments will appear as documentation in "gn args --list".
121*6777b538SAndroid Build Coastguard Worker#
122*6777b538SAndroid Build Coastguard Worker# - Don't call exec_script inside declare_args. This will execute the script
123*6777b538SAndroid Build Coastguard Worker#   even if the value is overridden, which is wasteful. See first bullet.
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Workerdeclare_args() {
126*6777b538SAndroid Build Coastguard Worker  # Set to enable the official build level of optimization. This has nothing
127*6777b538SAndroid Build Coastguard Worker  # to do with branding, but enables an additional level of optimization above
128*6777b538SAndroid Build Coastguard Worker  # release (!is_debug). This might be better expressed as a tri-state
129*6777b538SAndroid Build Coastguard Worker  # (debug, release, official) but for historical reasons there are two
130*6777b538SAndroid Build Coastguard Worker  # separate flags.
131*6777b538SAndroid Build Coastguard Worker  #
132*6777b538SAndroid Build Coastguard Worker  # IMPORTANT NOTE: (!is_debug) is *not* sufficient to get satisfying
133*6777b538SAndroid Build Coastguard Worker  # performance. In particular, DCHECK()s are still enabled for release builds,
134*6777b538SAndroid Build Coastguard Worker  # which can halve overall performance, and do increase memory usage. Always
135*6777b538SAndroid Build Coastguard Worker  # set "is_official_build" to true for any build intended to ship to end-users.
136*6777b538SAndroid Build Coastguard Worker  is_official_build = false
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker  # Set to true when compiling with the Clang compiler.
139*6777b538SAndroid Build Coastguard Worker  is_clang = current_os != "linux" ||
140*6777b538SAndroid Build Coastguard Worker             (current_cpu != "s390x" && current_cpu != "s390" &&
141*6777b538SAndroid Build Coastguard Worker              current_cpu != "ppc64" && current_cpu != "ppc" &&
142*6777b538SAndroid Build Coastguard Worker              current_cpu != "mips" && current_cpu != "mips64" &&
143*6777b538SAndroid Build Coastguard Worker              current_cpu != "riscv64")
144*6777b538SAndroid Build Coastguard Worker
145*6777b538SAndroid Build Coastguard Worker  # Allows the path to a custom target toolchain to be injected as a single
146*6777b538SAndroid Build Coastguard Worker  # argument, and set as the default toolchain.
147*6777b538SAndroid Build Coastguard Worker  custom_toolchain = ""
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker  # This should not normally be set as a build argument.  It's here so that
150*6777b538SAndroid Build Coastguard Worker  # every toolchain can pass through the "global" value via toolchain_args().
151*6777b538SAndroid Build Coastguard Worker  host_toolchain = ""
152*6777b538SAndroid Build Coastguard Worker
153*6777b538SAndroid Build Coastguard Worker  # Do not set this directly.
154*6777b538SAndroid Build Coastguard Worker  # It should be set only by //build/toolchains/android:robolectric_x64.
155*6777b538SAndroid Build Coastguard Worker  # True when compiling native code for use with robolectric_binary().
156*6777b538SAndroid Build Coastguard Worker  is_robolectric = false
157*6777b538SAndroid Build Coastguard Worker
158*6777b538SAndroid Build Coastguard Worker  # DON'T ADD MORE FLAGS HERE. Read the comment above.
159*6777b538SAndroid Build Coastguard Worker}
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Workerdeclare_args() {
162*6777b538SAndroid Build Coastguard Worker  # Debug build. Enabling official builds automatically sets is_debug to false.
163*6777b538SAndroid Build Coastguard Worker  is_debug = !is_official_build
164*6777b538SAndroid Build Coastguard Worker}
165*6777b538SAndroid Build Coastguard Worker
166*6777b538SAndroid Build Coastguard Workerdeclare_args() {
167*6777b538SAndroid Build Coastguard Worker  # Component build. Setting to true compiles targets declared as "components"
168*6777b538SAndroid Build Coastguard Worker  # as shared libraries loaded dynamically. This speeds up development time.
169*6777b538SAndroid Build Coastguard Worker  # When false, components will be linked statically.
170*6777b538SAndroid Build Coastguard Worker  #
171*6777b538SAndroid Build Coastguard Worker  # For more information see
172*6777b538SAndroid Build Coastguard Worker  # https://chromium.googlesource.com/chromium/src/+/main/docs/component_build.md
173*6777b538SAndroid Build Coastguard Worker  is_component_build = is_debug && current_os != "ios"
174*6777b538SAndroid Build Coastguard Worker}
175*6777b538SAndroid Build Coastguard Worker
176*6777b538SAndroid Build Coastguard Workerassert(!(is_debug && is_official_build), "Can't do official debug builds")
177*6777b538SAndroid Build Coastguard Workerassert(!(current_os == "ios" && is_component_build),
178*6777b538SAndroid Build Coastguard Worker       "Can't use component build on iOS")
179*6777b538SAndroid Build Coastguard Worker
180*6777b538SAndroid Build Coastguard Workerdeclare_args() {
181*6777b538SAndroid Build Coastguard Worker  # Unsafe buffers. Location of file used by plugins to track portions of
182*6777b538SAndroid Build Coastguard Worker  # the codebase which have been made manifestly safe.
183*6777b538SAndroid Build Coastguard Worker  clang_unsafe_buffers_paths = ""
184*6777b538SAndroid Build Coastguard Worker}
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker# ==============================================================================
187*6777b538SAndroid Build Coastguard Worker# TOOLCHAIN SETUP
188*6777b538SAndroid Build Coastguard Worker# ==============================================================================
189*6777b538SAndroid Build Coastguard Worker#
190*6777b538SAndroid Build Coastguard Worker# Here we set the default toolchain, as well as the variable host_toolchain
191*6777b538SAndroid Build Coastguard Worker# which will identify the toolchain corresponding to the local system when
192*6777b538SAndroid Build Coastguard Worker# doing cross-compiles. When not cross-compiling, this will be the same as the
193*6777b538SAndroid Build Coastguard Worker# default toolchain.
194*6777b538SAndroid Build Coastguard Worker#
195*6777b538SAndroid Build Coastguard Worker# We do this before anything else to make sure we complain about any
196*6777b538SAndroid Build Coastguard Worker# unsupported os/cpu combinations as early as possible.
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard Workerif (host_toolchain == "") {
199*6777b538SAndroid Build Coastguard Worker  # This should only happen in the top-level context.
200*6777b538SAndroid Build Coastguard Worker  # In a specific toolchain context, the toolchain_args()
201*6777b538SAndroid Build Coastguard Worker  # block should have propagated a value down.
202*6777b538SAndroid Build Coastguard Worker  # TODO(dpranke): Add some sort of assert here that verifies that
203*6777b538SAndroid Build Coastguard Worker  # no toolchain omitted host_toolchain from its toolchain_args().
204*6777b538SAndroid Build Coastguard Worker
205*6777b538SAndroid Build Coastguard Worker  if (host_os == "linux") {
206*6777b538SAndroid Build Coastguard Worker    if (target_os != "linux") {
207*6777b538SAndroid Build Coastguard Worker      host_toolchain = "//build/toolchain/linux:clang_$host_cpu"
208*6777b538SAndroid Build Coastguard Worker    } else if (is_clang) {
209*6777b538SAndroid Build Coastguard Worker      host_toolchain = "//build/toolchain/linux:clang_$host_cpu"
210*6777b538SAndroid Build Coastguard Worker    } else {
211*6777b538SAndroid Build Coastguard Worker      host_toolchain = "//build/toolchain/linux:$host_cpu"
212*6777b538SAndroid Build Coastguard Worker    }
213*6777b538SAndroid Build Coastguard Worker  } else if (host_os == "mac") {
214*6777b538SAndroid Build Coastguard Worker    host_toolchain = "//build/toolchain/mac:clang_$host_cpu"
215*6777b538SAndroid Build Coastguard Worker  } else if (host_os == "win") {
216*6777b538SAndroid Build Coastguard Worker    # On Windows always use the target CPU for host builds for x86/x64. On the
217*6777b538SAndroid Build Coastguard Worker    # configurations we support this will always work and it saves build steps.
218*6777b538SAndroid Build Coastguard Worker    # Windows ARM64 targets require an x64 host for cross build.
219*6777b538SAndroid Build Coastguard Worker    if (target_cpu == "x86" || target_cpu == "x64") {
220*6777b538SAndroid Build Coastguard Worker      if (is_clang) {
221*6777b538SAndroid Build Coastguard Worker        host_toolchain = "//build/toolchain/win:win_clang_$target_cpu"
222*6777b538SAndroid Build Coastguard Worker      } else {
223*6777b538SAndroid Build Coastguard Worker        host_toolchain = "//build/toolchain/win:$target_cpu"
224*6777b538SAndroid Build Coastguard Worker      }
225*6777b538SAndroid Build Coastguard Worker    } else if (is_clang) {
226*6777b538SAndroid Build Coastguard Worker      host_toolchain = "//build/toolchain/win:win_clang_$host_cpu"
227*6777b538SAndroid Build Coastguard Worker    } else {
228*6777b538SAndroid Build Coastguard Worker      host_toolchain = "//build/toolchain/win:$host_cpu"
229*6777b538SAndroid Build Coastguard Worker    }
230*6777b538SAndroid Build Coastguard Worker  } else if (host_os == "aix") {
231*6777b538SAndroid Build Coastguard Worker    host_toolchain = "//build/toolchain/aix:$host_cpu"
232*6777b538SAndroid Build Coastguard Worker  } else if (host_os == "zos") {
233*6777b538SAndroid Build Coastguard Worker    host_toolchain = "//build/toolchain/zos:$host_cpu"
234*6777b538SAndroid Build Coastguard Worker  } else {
235*6777b538SAndroid Build Coastguard Worker    assert(false, "Unsupported host_os: $host_os")
236*6777b538SAndroid Build Coastguard Worker  }
237*6777b538SAndroid Build Coastguard Worker}
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker_default_toolchain = ""
240*6777b538SAndroid Build Coastguard Worker
241*6777b538SAndroid Build Coastguard Workerif (target_os == "android") {
242*6777b538SAndroid Build Coastguard Worker  assert(host_os == "linux", "Android builds are only supported on Linux.")
243*6777b538SAndroid Build Coastguard Worker  _default_toolchain = "//build/toolchain/android:android_clang_$target_cpu"
244*6777b538SAndroid Build Coastguard Worker} else if (target_os == "chromeos" || target_os == "linux") {
245*6777b538SAndroid Build Coastguard Worker  # See comments in build/toolchain/cros/BUILD.gn about board compiles.
246*6777b538SAndroid Build Coastguard Worker  if (is_clang) {
247*6777b538SAndroid Build Coastguard Worker    _default_toolchain = "//build/toolchain/linux:clang_$target_cpu"
248*6777b538SAndroid Build Coastguard Worker  } else {
249*6777b538SAndroid Build Coastguard Worker    _default_toolchain = "//build/toolchain/linux:$target_cpu"
250*6777b538SAndroid Build Coastguard Worker  }
251*6777b538SAndroid Build Coastguard Worker} else if (target_os == "fuchsia") {
252*6777b538SAndroid Build Coastguard Worker  _default_toolchain = "//build/toolchain/fuchsia:$target_cpu"
253*6777b538SAndroid Build Coastguard Worker} else if (target_os == "ios") {
254*6777b538SAndroid Build Coastguard Worker  _default_toolchain = "//build/toolchain/ios:ios_clang_$target_cpu"
255*6777b538SAndroid Build Coastguard Worker} else if (target_os == "mac") {
256*6777b538SAndroid Build Coastguard Worker  assert(host_os == "mac" || host_os == "linux",
257*6777b538SAndroid Build Coastguard Worker         "Mac cross-compiles are unsupported.")
258*6777b538SAndroid Build Coastguard Worker  _default_toolchain = "//build/toolchain/mac:clang_$target_cpu"
259*6777b538SAndroid Build Coastguard Worker} else if (target_os == "win") {
260*6777b538SAndroid Build Coastguard Worker  # On Windows, we use the same toolchain for host and target by default.
261*6777b538SAndroid Build Coastguard Worker  # Beware, win cross builds have some caveats, see docs/win_cross.md
262*6777b538SAndroid Build Coastguard Worker  if (is_clang) {
263*6777b538SAndroid Build Coastguard Worker    _default_toolchain = "//build/toolchain/win:win_clang_$target_cpu"
264*6777b538SAndroid Build Coastguard Worker  } else {
265*6777b538SAndroid Build Coastguard Worker    _default_toolchain = "//build/toolchain/win:$target_cpu"
266*6777b538SAndroid Build Coastguard Worker  }
267*6777b538SAndroid Build Coastguard Worker} else if (target_os == "winuwp") {
268*6777b538SAndroid Build Coastguard Worker  # Only target WinUWP on for a Windows store application and only
269*6777b538SAndroid Build Coastguard Worker  # x86, x64 and arm are supported target CPUs.
270*6777b538SAndroid Build Coastguard Worker  assert(target_cpu == "x86" || target_cpu == "x64" || target_cpu == "arm" ||
271*6777b538SAndroid Build Coastguard Worker         target_cpu == "arm64")
272*6777b538SAndroid Build Coastguard Worker  _default_toolchain = "//build/toolchain/win:uwp_$target_cpu"
273*6777b538SAndroid Build Coastguard Worker} else if (target_os == "aix") {
274*6777b538SAndroid Build Coastguard Worker  _default_toolchain = "//build/toolchain/aix:$target_cpu"
275*6777b538SAndroid Build Coastguard Worker} else if (target_os == "zos") {
276*6777b538SAndroid Build Coastguard Worker  _default_toolchain = "//build/toolchain/zos:$target_cpu"
277*6777b538SAndroid Build Coastguard Worker} else {
278*6777b538SAndroid Build Coastguard Worker  assert(false, "Unsupported target_os: $target_os")
279*6777b538SAndroid Build Coastguard Worker}
280*6777b538SAndroid Build Coastguard Worker
281*6777b538SAndroid Build Coastguard Worker# If a custom toolchain has been set in the args, set it as default. Otherwise,
282*6777b538SAndroid Build Coastguard Worker# set the default toolchain for the platform (if any).
283*6777b538SAndroid Build Coastguard Workerif (custom_toolchain != "") {
284*6777b538SAndroid Build Coastguard Worker  set_default_toolchain(custom_toolchain)
285*6777b538SAndroid Build Coastguard Worker} else if (_default_toolchain != "") {
286*6777b538SAndroid Build Coastguard Worker  set_default_toolchain(_default_toolchain)
287*6777b538SAndroid Build Coastguard Worker}
288*6777b538SAndroid Build Coastguard Worker
289*6777b538SAndroid Build Coastguard Worker# =============================================================================
290*6777b538SAndroid Build Coastguard Worker# OS DEFINITIONS
291*6777b538SAndroid Build Coastguard Worker# =============================================================================
292*6777b538SAndroid Build Coastguard Worker#
293*6777b538SAndroid Build Coastguard Worker# We set these various is_FOO booleans for convenience in writing OS-based
294*6777b538SAndroid Build Coastguard Worker# conditions.
295*6777b538SAndroid Build Coastguard Worker#
296*6777b538SAndroid Build Coastguard Worker# - is_android, is_chromeos, is_ios, and is_win should be obvious.
297*6777b538SAndroid Build Coastguard Worker# - is_mac is set only for desktop Mac. It is not set on iOS.
298*6777b538SAndroid Build Coastguard Worker# - is_posix is true for mac and any Unix-like system (basically everything
299*6777b538SAndroid Build Coastguard Worker#   except Fuchsia and Windows).
300*6777b538SAndroid Build Coastguard Worker# - is_linux is true for desktop Linux, but not for ChromeOS nor Android (which
301*6777b538SAndroid Build Coastguard Worker#   is generally too different despite being based on the Linux kernel).
302*6777b538SAndroid Build Coastguard Worker#
303*6777b538SAndroid Build Coastguard Worker# Do not add more is_* variants here for random lesser-used Unix systems like
304*6777b538SAndroid Build Coastguard Worker# aix or one of the BSDs. If you need to check these, just check the
305*6777b538SAndroid Build Coastguard Worker# current_os value directly.
306*6777b538SAndroid Build Coastguard Worker
307*6777b538SAndroid Build Coastguard Workeris_android = current_os == "android"
308*6777b538SAndroid Build Coastguard Workeris_chromeos = current_os == "chromeos"
309*6777b538SAndroid Build Coastguard Workeris_fuchsia = current_os == "fuchsia"
310*6777b538SAndroid Build Coastguard Workeris_ios = current_os == "ios"
311*6777b538SAndroid Build Coastguard Workeris_linux = current_os == "linux"
312*6777b538SAndroid Build Coastguard Workeris_mac = current_os == "mac"
313*6777b538SAndroid Build Coastguard Workeris_nacl = current_os == "nacl"
314*6777b538SAndroid Build Coastguard Workeris_win = current_os == "win" || current_os == "winuwp"
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard Workeris_apple = is_ios || is_mac
317*6777b538SAndroid Build Coastguard Workeris_posix = !is_win && !is_fuchsia
318*6777b538SAndroid Build Coastguard Worker
319*6777b538SAndroid Build Coastguard Worker# =============================================================================
320*6777b538SAndroid Build Coastguard Worker# TARGET DEFAULTS
321*6777b538SAndroid Build Coastguard Worker# =============================================================================
322*6777b538SAndroid Build Coastguard Worker#
323*6777b538SAndroid Build Coastguard Worker# Set up the default configuration for every build target of the given type.
324*6777b538SAndroid Build Coastguard Worker# The values configured here will be automatically set on the scope of the
325*6777b538SAndroid Build Coastguard Worker# corresponding target. Target definitions can add or remove to the settings
326*6777b538SAndroid Build Coastguard Worker# here as needed.
327*6777b538SAndroid Build Coastguard Worker#
328*6777b538SAndroid Build Coastguard Worker# WHAT GOES HERE?
329*6777b538SAndroid Build Coastguard Worker#
330*6777b538SAndroid Build Coastguard Worker# Other than the main compiler and linker configs, the only reason for a config
331*6777b538SAndroid Build Coastguard Worker# to be in this list is if some targets need to explicitly override that config
332*6777b538SAndroid Build Coastguard Worker# by removing it. This is how targets opt-out of flags. If you don't have that
333*6777b538SAndroid Build Coastguard Worker# requirement and just need to add a config everywhere, reference it as a
334*6777b538SAndroid Build Coastguard Worker# sub-config of an existing one, most commonly the main "compiler" one.
335*6777b538SAndroid Build Coastguard Worker
336*6777b538SAndroid Build Coastguard Worker# Holds all configs used for running the compiler.
337*6777b538SAndroid Build Coastguard Workerdefault_compiler_configs = [
338*6777b538SAndroid Build Coastguard Worker  "//build/config:feature_flags",
339*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:afdo",
340*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:afdo_optimize_size",
341*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:cet_shadow_stack",
342*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:chromium_code",
343*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:compiler",
344*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:compiler_arm_fpu",
345*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:compiler_arm_thumb",
346*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:default_include_dirs",
347*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:default_init_stack_vars",
348*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:default_optimization",
349*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:default_stack_frames",
350*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:default_symbols",
351*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:no_exceptions",
352*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:no_rtti",
353*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:no_unresolved_symbols",
354*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:runtime_library",
355*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:thin_archive",
356*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler:thinlto_optimize_default",
357*6777b538SAndroid Build Coastguard Worker  "//build/config/compiler/pgo:default_pgo_flags",
358*6777b538SAndroid Build Coastguard Worker  "//build/config/coverage:default_coverage",
359*6777b538SAndroid Build Coastguard Worker  "//build/config/sanitizers:default_sanitizer_flags",
360*6777b538SAndroid Build Coastguard Worker]
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard Workerif (is_win) {
363*6777b538SAndroid Build Coastguard Worker  default_compiler_configs += [
364*6777b538SAndroid Build Coastguard Worker    "//build/config/win:default_cfg_compiler",
365*6777b538SAndroid Build Coastguard Worker    "//build/config/win:default_crt",
366*6777b538SAndroid Build Coastguard Worker    "//build/config/win:lean_and_mean",
367*6777b538SAndroid Build Coastguard Worker    "//build/config/win:nominmax",
368*6777b538SAndroid Build Coastguard Worker    "//build/config/win:unicode",
369*6777b538SAndroid Build Coastguard Worker    "//build/config/win:winver",
370*6777b538SAndroid Build Coastguard Worker  ]
371*6777b538SAndroid Build Coastguard Worker}
372*6777b538SAndroid Build Coastguard Worker
373*6777b538SAndroid Build Coastguard Workerif (is_apple) {
374*6777b538SAndroid Build Coastguard Worker  default_compiler_configs += [ "//build/config/compiler:enable_arc" ]
375*6777b538SAndroid Build Coastguard Worker}
376*6777b538SAndroid Build Coastguard Worker
377*6777b538SAndroid Build Coastguard Workerif (is_posix) {
378*6777b538SAndroid Build Coastguard Worker  if (current_os != "aix") {
379*6777b538SAndroid Build Coastguard Worker    default_compiler_configs +=
380*6777b538SAndroid Build Coastguard Worker        [ "//build/config/gcc:symbol_visibility_hidden" ]
381*6777b538SAndroid Build Coastguard Worker  }
382*6777b538SAndroid Build Coastguard Worker}
383*6777b538SAndroid Build Coastguard Worker
384*6777b538SAndroid Build Coastguard Workerif (is_fuchsia) {
385*6777b538SAndroid Build Coastguard Worker  default_compiler_configs += [ "//build/config/gcc:symbol_visibility_hidden" ]
386*6777b538SAndroid Build Coastguard Worker}
387*6777b538SAndroid Build Coastguard Worker
388*6777b538SAndroid Build Coastguard Workerif (is_android) {
389*6777b538SAndroid Build Coastguard Worker  default_compiler_configs +=
390*6777b538SAndroid Build Coastguard Worker      [ "//build/config/android:default_orderfile_instrumentation" ]
391*6777b538SAndroid Build Coastguard Worker}
392*6777b538SAndroid Build Coastguard Worker
393*6777b538SAndroid Build Coastguard Workerif (is_clang && !is_nacl) {
394*6777b538SAndroid Build Coastguard Worker  default_compiler_configs += [
395*6777b538SAndroid Build Coastguard Worker    "//build/config/clang:extra_warnings",
396*6777b538SAndroid Build Coastguard Worker    "//build/config/clang:find_bad_constructs",
397*6777b538SAndroid Build Coastguard Worker    "//build/config/clang:unsafe_buffers",
398*6777b538SAndroid Build Coastguard Worker  ]
399*6777b538SAndroid Build Coastguard Worker}
400*6777b538SAndroid Build Coastguard Worker
401*6777b538SAndroid Build Coastguard Worker# Debug/release-related defines.
402*6777b538SAndroid Build Coastguard Workerif (is_debug) {
403*6777b538SAndroid Build Coastguard Worker  default_compiler_configs += [ "//build/config:debug" ]
404*6777b538SAndroid Build Coastguard Worker} else {
405*6777b538SAndroid Build Coastguard Worker  default_compiler_configs += [ "//build/config:release" ]
406*6777b538SAndroid Build Coastguard Worker}
407*6777b538SAndroid Build Coastguard Worker
408*6777b538SAndroid Build Coastguard Worker# Static libraries and source sets use only the compiler ones.
409*6777b538SAndroid Build Coastguard Workerset_defaults("static_library") {
410*6777b538SAndroid Build Coastguard Worker  configs = default_compiler_configs
411*6777b538SAndroid Build Coastguard Worker}
412*6777b538SAndroid Build Coastguard Workerset_defaults("source_set") {
413*6777b538SAndroid Build Coastguard Worker  configs = default_compiler_configs
414*6777b538SAndroid Build Coastguard Worker}
415*6777b538SAndroid Build Coastguard Workerset_defaults("rust_library") {
416*6777b538SAndroid Build Coastguard Worker  configs = default_compiler_configs
417*6777b538SAndroid Build Coastguard Worker}
418*6777b538SAndroid Build Coastguard Worker
419*6777b538SAndroid Build Coastguard Worker# Compute the set of configs common to all linked targets (shared libraries,
420*6777b538SAndroid Build Coastguard Worker# loadable modules, executables) to avoid duplication below.
421*6777b538SAndroid Build Coastguard Workerif (is_win) {
422*6777b538SAndroid Build Coastguard Worker  # Many targets remove these configs, so they are not contained within
423*6777b538SAndroid Build Coastguard Worker  # //build/config:executable_config for easy removal.
424*6777b538SAndroid Build Coastguard Worker  _linker_configs = [
425*6777b538SAndroid Build Coastguard Worker    "//build/config/win:default_incremental_linking",
426*6777b538SAndroid Build Coastguard Worker
427*6777b538SAndroid Build Coastguard Worker    # Default to console-mode apps. Most of our targets are tests and such
428*6777b538SAndroid Build Coastguard Worker    # that shouldn't use the windows subsystem.
429*6777b538SAndroid Build Coastguard Worker    "//build/config/win:console",
430*6777b538SAndroid Build Coastguard Worker  ]
431*6777b538SAndroid Build Coastguard Worker} else if (is_apple) {
432*6777b538SAndroid Build Coastguard Worker  _linker_configs = [ "//build/config/apple:strip_all" ]
433*6777b538SAndroid Build Coastguard Worker} else {
434*6777b538SAndroid Build Coastguard Worker  _linker_configs = []
435*6777b538SAndroid Build Coastguard Worker}
436*6777b538SAndroid Build Coastguard Worker
437*6777b538SAndroid Build Coastguard Worker# Executable defaults.
438*6777b538SAndroid Build Coastguard Workerdefault_executable_configs = default_compiler_configs + [
439*6777b538SAndroid Build Coastguard Worker                               "//build/config/compiler:export_dynamic",
440*6777b538SAndroid Build Coastguard Worker                               "//build/config:default_libs",
441*6777b538SAndroid Build Coastguard Worker                               "//build/config:executable_config",
442*6777b538SAndroid Build Coastguard Worker                             ] + _linker_configs
443*6777b538SAndroid Build Coastguard Worker
444*6777b538SAndroid Build Coastguard Workerif (is_win) {
445*6777b538SAndroid Build Coastguard Worker  # Turn on linker CFI for executables, and position it so it can be removed
446*6777b538SAndroid Build Coastguard Worker  # if needed.
447*6777b538SAndroid Build Coastguard Worker  default_executable_configs += [ "//build/config/win:cfi_linker" ]
448*6777b538SAndroid Build Coastguard Worker}
449*6777b538SAndroid Build Coastguard Workerif (is_fuchsia) {
450*6777b538SAndroid Build Coastguard Worker  # Sometimes executables are linked by rustc passing a command line to
451*6777b538SAndroid Build Coastguard Worker  # clang++. It includes "-pie" which is pointless on Fuchsia. Suppress the
452*6777b538SAndroid Build Coastguard Worker  # resulting (fatal) warning. Unfortunately there's no way to do this only
453*6777b538SAndroid Build Coastguard Worker  # for binaries linked by rustc; gn does not make the distinction.
454*6777b538SAndroid Build Coastguard Worker  default_executable_configs +=
455*6777b538SAndroid Build Coastguard Worker      [ "//build/config/fuchsia:rustc_no_pie_warning" ]
456*6777b538SAndroid Build Coastguard Worker}
457*6777b538SAndroid Build Coastguard Worker
458*6777b538SAndroid Build Coastguard Workerset_defaults("executable") {
459*6777b538SAndroid Build Coastguard Worker  configs = default_executable_configs
460*6777b538SAndroid Build Coastguard Worker}
461*6777b538SAndroid Build Coastguard Worker
462*6777b538SAndroid Build Coastguard Worker# Shared library and loadable module defaults (also for components in component
463*6777b538SAndroid Build Coastguard Worker# mode).
464*6777b538SAndroid Build Coastguard Workerdefault_shared_library_configs = default_compiler_configs + [
465*6777b538SAndroid Build Coastguard Worker                                   "//build/config:default_libs",
466*6777b538SAndroid Build Coastguard Worker                                   "//build/config:shared_library_config",
467*6777b538SAndroid Build Coastguard Worker                                 ] + _linker_configs
468*6777b538SAndroid Build Coastguard Workerif (is_win) {
469*6777b538SAndroid Build Coastguard Worker  # Turn on linker CFI for DLLs, and position it so it can be removed if needed.
470*6777b538SAndroid Build Coastguard Worker  default_shared_library_configs += [ "//build/config/win:cfi_linker" ]
471*6777b538SAndroid Build Coastguard Worker}
472*6777b538SAndroid Build Coastguard Worker
473*6777b538SAndroid Build Coastguard Workerif (is_android) {
474*6777b538SAndroid Build Coastguard Worker  # Strip native JNI exports from shared libraries by default. Binaries that
475*6777b538SAndroid Build Coastguard Worker  # want this can remove this config.
476*6777b538SAndroid Build Coastguard Worker  default_shared_library_configs +=
477*6777b538SAndroid Build Coastguard Worker      [ "//build/config/android:hide_all_but_jni_onload" ]
478*6777b538SAndroid Build Coastguard Worker}
479*6777b538SAndroid Build Coastguard Workerif (is_fuchsia) {
480*6777b538SAndroid Build Coastguard Worker  # Sometimes shared libraries are linked by rustc passing a command line to
481*6777b538SAndroid Build Coastguard Worker  # clang++. It includes "-pie" which is pointless on Fuchsia. Suppress the
482*6777b538SAndroid Build Coastguard Worker  # resulting (fatal) warning. Unfortunately there's no way to do this only
483*6777b538SAndroid Build Coastguard Worker  # for binaries linked by rustc; gn does not make the distinction.
484*6777b538SAndroid Build Coastguard Worker  default_shared_library_configs +=
485*6777b538SAndroid Build Coastguard Worker      [ "//build/config/fuchsia:rustc_no_pie_warning" ]
486*6777b538SAndroid Build Coastguard Worker}
487*6777b538SAndroid Build Coastguard Workerset_defaults("shared_library") {
488*6777b538SAndroid Build Coastguard Worker  configs = default_shared_library_configs
489*6777b538SAndroid Build Coastguard Worker}
490*6777b538SAndroid Build Coastguard Workerset_defaults("loadable_module") {
491*6777b538SAndroid Build Coastguard Worker  configs = default_shared_library_configs
492*6777b538SAndroid Build Coastguard Worker
493*6777b538SAndroid Build Coastguard Worker  # loadable_modules are generally used by other libs, not just via JNI.
494*6777b538SAndroid Build Coastguard Worker  if (is_android) {
495*6777b538SAndroid Build Coastguard Worker    configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
496*6777b538SAndroid Build Coastguard Worker  }
497*6777b538SAndroid Build Coastguard Worker}
498*6777b538SAndroid Build Coastguard Worker
499*6777b538SAndroid Build Coastguard Workerdefault_rust_proc_macro_configs =
500*6777b538SAndroid Build Coastguard Worker    default_shared_library_configs + [ "//build/rust:proc_macro_extern" ] +
501*6777b538SAndroid Build Coastguard Worker    # Rust proc macros don't support (Thin)LTO, so always remove it.
502*6777b538SAndroid Build Coastguard Worker    [
503*6777b538SAndroid Build Coastguard Worker      "//build/config/compiler:thinlto_optimize_default",
504*6777b538SAndroid Build Coastguard Worker      "//build/config/compiler:thinlto_optimize_max",
505*6777b538SAndroid Build Coastguard Worker    ] -
506*6777b538SAndroid Build Coastguard Worker    [
507*6777b538SAndroid Build Coastguard Worker      "//build/config/compiler:thinlto_optimize_default",
508*6777b538SAndroid Build Coastguard Worker      "//build/config/compiler:thinlto_optimize_max",
509*6777b538SAndroid Build Coastguard Worker    ]
510*6777b538SAndroid Build Coastguard Worker
511*6777b538SAndroid Build Coastguard Workerset_defaults("rust_proc_macro") {
512*6777b538SAndroid Build Coastguard Worker  configs = default_rust_proc_macro_configs
513*6777b538SAndroid Build Coastguard Worker}
514*6777b538SAndroid Build Coastguard Worker
515*6777b538SAndroid Build Coastguard Worker# A helper for forwarding testonly and visibility.
516*6777b538SAndroid Build Coastguard Worker# Forwarding "*" does not include variables from outer scopes (to avoid copying
517*6777b538SAndroid Build Coastguard Worker# all globals into each template invocation), so it will not pick up
518*6777b538SAndroid Build Coastguard Worker# file-scoped or outer-template-scoped variables. Normally this behavior is
519*6777b538SAndroid Build Coastguard Worker# desired, but "visibility" and "testonly" are commonly defined in outer scopes.
520*6777b538SAndroid Build Coastguard Worker# Explicitly forwarding them in forward_variables_from() works around this
521*6777b538SAndroid Build Coastguard Worker# nuance. See //build/docs/writing_gn_templates.md#using-forward_variables_from
522*6777b538SAndroid Build Coastguard WorkerTESTONLY_AND_VISIBILITY = [
523*6777b538SAndroid Build Coastguard Worker  "testonly",
524*6777b538SAndroid Build Coastguard Worker  "visibility",
525*6777b538SAndroid Build Coastguard Worker]
526*6777b538SAndroid Build Coastguard Worker
527*6777b538SAndroid Build Coastguard Worker# Sets default dependencies for static_library and source_set targets.
528*6777b538SAndroid Build Coastguard Workerforeach(_target_type,
529*6777b538SAndroid Build Coastguard Worker        [
530*6777b538SAndroid Build Coastguard Worker          "source_set",
531*6777b538SAndroid Build Coastguard Worker          "static_library",
532*6777b538SAndroid Build Coastguard Worker        ]) {
533*6777b538SAndroid Build Coastguard Worker  template(_target_type) {
534*6777b538SAndroid Build Coastguard Worker    target(_target_type, target_name) {
535*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
536*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
537*6777b538SAndroid Build Coastguard Worker      if (!defined(inputs)) {
538*6777b538SAndroid Build Coastguard Worker        inputs = []
539*6777b538SAndroid Build Coastguard Worker      }
540*6777b538SAndroid Build Coastguard Worker
541*6777b538SAndroid Build Coastguard Worker      # Consumed by the unsafe-buffers plugin during compile.
542*6777b538SAndroid Build Coastguard Worker      #
543*6777b538SAndroid Build Coastguard Worker      # TODO(crbug.com/326584510): Reclient doesn't respect this variable, see
544*6777b538SAndroid Build Coastguard Worker      # rbe_bug_326584510_missing_inputs in //build/config/rbe.gni.
545*6777b538SAndroid Build Coastguard Worker      _uses_cflags = false
546*6777b538SAndroid Build Coastguard Worker      if (defined(sources)) {
547*6777b538SAndroid Build Coastguard Worker        foreach(f, sources) {
548*6777b538SAndroid Build Coastguard Worker          if (string_replace(f + ".END", ".cc.END", "") != f + ".END" ||
549*6777b538SAndroid Build Coastguard Worker              string_replace(f + ".END", ".c.END", "") != f + ".END" ||
550*6777b538SAndroid Build Coastguard Worker              string_replace(f + ".END", ".mm.END", "") != f + ".END" ||
551*6777b538SAndroid Build Coastguard Worker              string_replace(f + ".END", ".m.END", "") != f + ".END") {
552*6777b538SAndroid Build Coastguard Worker            _uses_cflags = true
553*6777b538SAndroid Build Coastguard Worker          }
554*6777b538SAndroid Build Coastguard Worker        }
555*6777b538SAndroid Build Coastguard Worker      }
556*6777b538SAndroid Build Coastguard Worker      if (_uses_cflags && clang_unsafe_buffers_paths != "") {
557*6777b538SAndroid Build Coastguard Worker        inputs += [ clang_unsafe_buffers_paths ]
558*6777b538SAndroid Build Coastguard Worker      }
559*6777b538SAndroid Build Coastguard Worker    }
560*6777b538SAndroid Build Coastguard Worker  }
561*6777b538SAndroid Build Coastguard Worker}
562*6777b538SAndroid Build Coastguard Worker
563*6777b538SAndroid Build Coastguard Worker# Sets default dependencies for executable and shared_library targets.
564*6777b538SAndroid Build Coastguard Worker#
565*6777b538SAndroid Build Coastguard Worker# Variables
566*6777b538SAndroid Build Coastguard Worker#   no_default_deps: If true, no standard dependencies will be added.
567*6777b538SAndroid Build Coastguard Worker#       Targets that set this usually also want to remove
568*6777b538SAndroid Build Coastguard Worker#       "//build/config/compiler:runtime_library" from configs (to remove
569*6777b538SAndroid Build Coastguard Worker#       its subconfig "//build/config/c++:runtime_library").
570*6777b538SAndroid Build Coastguard Workerforeach(_target_type,
571*6777b538SAndroid Build Coastguard Worker        [
572*6777b538SAndroid Build Coastguard Worker          "executable",
573*6777b538SAndroid Build Coastguard Worker          "loadable_module",
574*6777b538SAndroid Build Coastguard Worker          "shared_library",
575*6777b538SAndroid Build Coastguard Worker        ]) {
576*6777b538SAndroid Build Coastguard Worker  template(_target_type) {
577*6777b538SAndroid Build Coastguard Worker    # Alias "target_name" because it is clobbered by forward_variables_from().
578*6777b538SAndroid Build Coastguard Worker    _target_name = target_name
579*6777b538SAndroid Build Coastguard Worker    target(_target_type, _target_name) {
580*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
581*6777b538SAndroid Build Coastguard Worker                             "*",
582*6777b538SAndroid Build Coastguard Worker                             TESTONLY_AND_VISIBILITY + [ "no_default_deps" ])
583*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
584*6777b538SAndroid Build Coastguard Worker      if (!defined(inputs)) {
585*6777b538SAndroid Build Coastguard Worker        inputs = []
586*6777b538SAndroid Build Coastguard Worker      }
587*6777b538SAndroid Build Coastguard Worker
588*6777b538SAndroid Build Coastguard Worker      # Consumed by the unsafe-buffers plugin during compile.
589*6777b538SAndroid Build Coastguard Worker      #
590*6777b538SAndroid Build Coastguard Worker      # TODO(crbug.com/326584510): Reclient doesn't respect this variable, see
591*6777b538SAndroid Build Coastguard Worker      # rbe_bug_326584510_missing_inputs in //build/config/rbe.gni.
592*6777b538SAndroid Build Coastguard Worker      _uses_cflags = false
593*6777b538SAndroid Build Coastguard Worker      if (defined(sources)) {
594*6777b538SAndroid Build Coastguard Worker        foreach(f, sources) {
595*6777b538SAndroid Build Coastguard Worker          if (string_replace(f + ".END", ".cc.END", "") != f + ".END" ||
596*6777b538SAndroid Build Coastguard Worker              string_replace(f + ".END", ".c.END", "") != f + ".END" ||
597*6777b538SAndroid Build Coastguard Worker              string_replace(f + ".END", ".mm.END", "") != f + ".END" ||
598*6777b538SAndroid Build Coastguard Worker              string_replace(f + ".END", ".m.END", "") != f + ".END") {
599*6777b538SAndroid Build Coastguard Worker            _uses_cflags = true
600*6777b538SAndroid Build Coastguard Worker          }
601*6777b538SAndroid Build Coastguard Worker        }
602*6777b538SAndroid Build Coastguard Worker      }
603*6777b538SAndroid Build Coastguard Worker      if (_uses_cflags && clang_unsafe_buffers_paths != "") {
604*6777b538SAndroid Build Coastguard Worker        inputs += [ clang_unsafe_buffers_paths ]
605*6777b538SAndroid Build Coastguard Worker      }
606*6777b538SAndroid Build Coastguard Worker
607*6777b538SAndroid Build Coastguard Worker      if (!defined(deps)) {
608*6777b538SAndroid Build Coastguard Worker        deps = []
609*6777b538SAndroid Build Coastguard Worker      }
610*6777b538SAndroid Build Coastguard Worker      if (!defined(invoker.no_default_deps) || !invoker.no_default_deps) {
611*6777b538SAndroid Build Coastguard Worker        # This pulls in one of:
612*6777b538SAndroid Build Coastguard Worker        # //build/config:executable_deps
613*6777b538SAndroid Build Coastguard Worker        # //build/config:loadable_module_deps
614*6777b538SAndroid Build Coastguard Worker        # //build/config:shared_library_deps
615*6777b538SAndroid Build Coastguard Worker        # (This explicit list is so that grepping for these configs finds where
616*6777b538SAndroid Build Coastguard Worker        # they are used.)
617*6777b538SAndroid Build Coastguard Worker        deps += [ "//build/config:${_target_type}_deps" ]
618*6777b538SAndroid Build Coastguard Worker      }
619*6777b538SAndroid Build Coastguard Worker
620*6777b538SAndroid Build Coastguard Worker      # On Android, write shared library output file to metadata. We will use
621*6777b538SAndroid Build Coastguard Worker      # this information to, for instance, collect all shared libraries that
622*6777b538SAndroid Build Coastguard Worker      # should be packaged into an APK.
623*6777b538SAndroid Build Coastguard Worker      if (!defined(invoker.metadata) && (is_android || is_robolectric) &&
624*6777b538SAndroid Build Coastguard Worker          (_target_type == "shared_library" ||
625*6777b538SAndroid Build Coastguard Worker           _target_type == "loadable_module")) {
626*6777b538SAndroid Build Coastguard Worker        _output_name = _target_name
627*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.output_name)) {
628*6777b538SAndroid Build Coastguard Worker          _output_name = invoker.output_name
629*6777b538SAndroid Build Coastguard Worker        }
630*6777b538SAndroid Build Coastguard Worker
631*6777b538SAndroid Build Coastguard Worker        # Remove 'lib' prefix from output name if it exists.
632*6777b538SAndroid Build Coastguard Worker        _magic_prefix = "$0x01$0x01"
633*6777b538SAndroid Build Coastguard Worker        _output_name = string_replace("${_magic_prefix}${_output_name}",
634*6777b538SAndroid Build Coastguard Worker                                      "${_magic_prefix}lib",
635*6777b538SAndroid Build Coastguard Worker                                      _magic_prefix,
636*6777b538SAndroid Build Coastguard Worker                                      1)
637*6777b538SAndroid Build Coastguard Worker        _output_name = string_replace(_output_name, _magic_prefix, "", 1)
638*6777b538SAndroid Build Coastguard Worker
639*6777b538SAndroid Build Coastguard Worker        if (defined(output_extension)) {
640*6777b538SAndroid Build Coastguard Worker          _shlib_extension = ".$output_extension"
641*6777b538SAndroid Build Coastguard Worker        } else {
642*6777b538SAndroid Build Coastguard Worker          _shlib_extension = ".so"
643*6777b538SAndroid Build Coastguard Worker        }
644*6777b538SAndroid Build Coastguard Worker
645*6777b538SAndroid Build Coastguard Worker        metadata = {
646*6777b538SAndroid Build Coastguard Worker          shared_libraries =
647*6777b538SAndroid Build Coastguard Worker              [ "$root_out_dir/lib${_output_name}${_shlib_extension}" ]
648*6777b538SAndroid Build Coastguard Worker        }
649*6777b538SAndroid Build Coastguard Worker      }
650*6777b538SAndroid Build Coastguard Worker    }
651*6777b538SAndroid Build Coastguard Worker  }
652*6777b538SAndroid Build Coastguard Worker}
653*6777b538SAndroid Build Coastguard Worker
654*6777b538SAndroid Build Coastguard Worker# ==============================================================================
655*6777b538SAndroid Build Coastguard Worker# COMPONENT SETUP
656*6777b538SAndroid Build Coastguard Worker# ==============================================================================
657*6777b538SAndroid Build Coastguard Worker
658*6777b538SAndroid Build Coastguard Worker# Defines a component, which equates to a shared_library when
659*6777b538SAndroid Build Coastguard Worker# is_component_build == true and a static_library otherwise.
660*6777b538SAndroid Build Coastguard Worker#
661*6777b538SAndroid Build Coastguard Worker# Use static libraries for the static build rather than source sets because
662*6777b538SAndroid Build Coastguard Worker# many of of our test binaries link many large dependencies but often don't
663*6777b538SAndroid Build Coastguard Worker# use large portions of them. The static libraries are much more efficient to
664*6777b538SAndroid Build Coastguard Worker# link in this situation since only the necessary object files are linked.
665*6777b538SAndroid Build Coastguard Worker#
666*6777b538SAndroid Build Coastguard Worker# The invoker can override the type of the target in the non-component-build
667*6777b538SAndroid Build Coastguard Worker# case by setting static_component_type to either "source_set" or
668*6777b538SAndroid Build Coastguard Worker# "static_library". If unset, the default will be used.
669*6777b538SAndroid Build Coastguard Workertemplate("component") {
670*6777b538SAndroid Build Coastguard Worker  if (is_component_build) {
671*6777b538SAndroid Build Coastguard Worker    _component_mode = "shared_library"
672*6777b538SAndroid Build Coastguard Worker
673*6777b538SAndroid Build Coastguard Worker    # Generate a unique output_name for a shared library if not set by invoker.
674*6777b538SAndroid Build Coastguard Worker    if (!defined(invoker.output_name)) {
675*6777b538SAndroid Build Coastguard Worker      _output_name = get_label_info(":$target_name", "label_no_toolchain")
676*6777b538SAndroid Build Coastguard Worker      _output_name =
677*6777b538SAndroid Build Coastguard Worker          string_replace(_output_name, "$target_name:$target_name", target_name)
678*6777b538SAndroid Build Coastguard Worker      _output_name = string_replace(_output_name, "//", "")
679*6777b538SAndroid Build Coastguard Worker      _output_name = string_replace(_output_name, "/", "_")
680*6777b538SAndroid Build Coastguard Worker      _output_name = string_replace(_output_name, ":", "_")
681*6777b538SAndroid Build Coastguard Worker    }
682*6777b538SAndroid Build Coastguard Worker  } else if (defined(invoker.static_component_type)) {
683*6777b538SAndroid Build Coastguard Worker    assert(invoker.static_component_type == "static_library" ||
684*6777b538SAndroid Build Coastguard Worker           invoker.static_component_type == "source_set")
685*6777b538SAndroid Build Coastguard Worker    _component_mode = invoker.static_component_type
686*6777b538SAndroid Build Coastguard Worker  } else if (!defined(invoker.sources) || invoker.sources == []) {
687*6777b538SAndroid Build Coastguard Worker    # When there are no sources defined, use a source set to avoid creating
688*6777b538SAndroid Build Coastguard Worker    # an empty static library (which generally don't work).
689*6777b538SAndroid Build Coastguard Worker    _component_mode = "source_set"
690*6777b538SAndroid Build Coastguard Worker  } else {
691*6777b538SAndroid Build Coastguard Worker    _component_mode = "static_library"
692*6777b538SAndroid Build Coastguard Worker  }
693*6777b538SAndroid Build Coastguard Worker  target(_component_mode, target_name) {
694*6777b538SAndroid Build Coastguard Worker    if (defined(_output_name)) {
695*6777b538SAndroid Build Coastguard Worker      output_name = _output_name
696*6777b538SAndroid Build Coastguard Worker    }
697*6777b538SAndroid Build Coastguard Worker    if (is_component_build && is_android) {
698*6777b538SAndroid Build Coastguard Worker      # By appending .cr, we prevent name collisions with libraries already
699*6777b538SAndroid Build Coastguard Worker      # loaded by the Android zygote.
700*6777b538SAndroid Build Coastguard Worker      output_extension = "cr.so"
701*6777b538SAndroid Build Coastguard Worker    }
702*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
703*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
704*6777b538SAndroid Build Coastguard Worker  }
705*6777b538SAndroid Build Coastguard Worker}
706*6777b538SAndroid Build Coastguard Worker
707*6777b538SAndroid Build Coastguard Worker# Component defaults
708*6777b538SAndroid Build Coastguard Worker# Set a variable since we also want to make this available
709*6777b538SAndroid Build Coastguard Worker# to mixed_component.gni
710*6777b538SAndroid Build Coastguard Workerif (is_component_build) {
711*6777b538SAndroid Build Coastguard Worker  default_component_configs = default_shared_library_configs
712*6777b538SAndroid Build Coastguard Worker  if (is_android) {
713*6777b538SAndroid Build Coastguard Worker    default_component_configs -=
714*6777b538SAndroid Build Coastguard Worker        [ "//build/config/android:hide_all_but_jni_onload" ]
715*6777b538SAndroid Build Coastguard Worker  }
716*6777b538SAndroid Build Coastguard Worker} else {
717*6777b538SAndroid Build Coastguard Worker  default_component_configs = default_compiler_configs
718*6777b538SAndroid Build Coastguard Worker}
719*6777b538SAndroid Build Coastguard Worker
720*6777b538SAndroid Build Coastguard Workerset_defaults("component") {
721*6777b538SAndroid Build Coastguard Worker  configs = default_component_configs
722*6777b538SAndroid Build Coastguard Worker}
723*6777b538SAndroid Build Coastguard Worker
724*6777b538SAndroid Build Coastguard Worker# =============================================================================
725*6777b538SAndroid Build Coastguard Worker# ACTION OVERRIDE
726*6777b538SAndroid Build Coastguard Worker# =============================================================================
727*6777b538SAndroid Build Coastguard Worker#
728*6777b538SAndroid Build Coastguard Worker# We override gn action() to support remote execution using rewrapper. The
729*6777b538SAndroid Build Coastguard Worker# invoker should set allow_remote to true if remote execution is desired.
730*6777b538SAndroid Build Coastguard Worker#
731*6777b538SAndroid Build Coastguard Worker# As remote execution requires inputs to be made more explicit than is normally
732*6777b538SAndroid Build Coastguard Worker# expected with gn, you may find that setting allow_remote to true will result
733*6777b538SAndroid Build Coastguard Worker# in many missing file errors. In most cases, this should be resolved by
734*6777b538SAndroid Build Coastguard Worker# explicitly declaring these inputs/sources.
735*6777b538SAndroid Build Coastguard Worker#
736*6777b538SAndroid Build Coastguard Worker# However, it may be impractical to determine these inputs in gn. For such
737*6777b538SAndroid Build Coastguard Worker# cases, the invoker can specify a custom input processor, which are currently
738*6777b538SAndroid Build Coastguard Worker# defined and implemented in //build/util/action_remote.py. The appropriate
739*6777b538SAndroid Build Coastguard Worker# value should be set using the custom_processor arg.
740*6777b538SAndroid Build Coastguard Worker
741*6777b538SAndroid Build Coastguard Worker# Variables needed by rbe.gni aren't available at the top of this file.
742*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/rbe.gni")
743*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/siso.gni")
744*6777b538SAndroid Build Coastguard Worker
745*6777b538SAndroid Build Coastguard Worker# TODO(b/253987456): Add action_foreach support.
746*6777b538SAndroid Build Coastguard Workerforeach(_target_type, [ "action" ]) {
747*6777b538SAndroid Build Coastguard Worker  template(_target_type) {
748*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
749*6777b538SAndroid Build Coastguard Worker    action("${target_name}") {
750*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
751*6777b538SAndroid Build Coastguard Worker                             [
752*6777b538SAndroid Build Coastguard Worker                               "args",
753*6777b538SAndroid Build Coastguard Worker                               "assert_no_deps",
754*6777b538SAndroid Build Coastguard Worker                               "check_includes",
755*6777b538SAndroid Build Coastguard Worker                               "configs",
756*6777b538SAndroid Build Coastguard Worker                               "data_deps",
757*6777b538SAndroid Build Coastguard Worker                               "data",
758*6777b538SAndroid Build Coastguard Worker                               "depfile",
759*6777b538SAndroid Build Coastguard Worker                               "deps",
760*6777b538SAndroid Build Coastguard Worker                               "metadata",
761*6777b538SAndroid Build Coastguard Worker                               "outputs",
762*6777b538SAndroid Build Coastguard Worker                               "pool",
763*6777b538SAndroid Build Coastguard Worker                               "script",
764*6777b538SAndroid Build Coastguard Worker                               "public_configs",
765*6777b538SAndroid Build Coastguard Worker                               "public_deps",
766*6777b538SAndroid Build Coastguard Worker                               "response_file_contents",
767*6777b538SAndroid Build Coastguard Worker                               "sources",
768*6777b538SAndroid Build Coastguard Worker                               "write_runtime_deps",
769*6777b538SAndroid Build Coastguard Worker                             ])
770*6777b538SAndroid Build Coastguard Worker      allow_remote = false
771*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.allow_remote)) {
772*6777b538SAndroid Build Coastguard Worker        allow_remote = invoker.allow_remote
773*6777b538SAndroid Build Coastguard Worker      }
774*6777b538SAndroid Build Coastguard Worker
775*6777b538SAndroid Build Coastguard Worker      # If remote execution is desired, only run remotely when use_remoteexec
776*6777b538SAndroid Build Coastguard Worker      # is enabled, and the environment is not nacl.
777*6777b538SAndroid Build Coastguard Worker      # Siso doesn't use action_remote.py wrapper because it sends requests to
778*6777b538SAndroid Build Coastguard Worker      # Reproxy directly without actions_remote.py/rewrapper.
779*6777b538SAndroid Build Coastguard Worker      # TODO(b/259381924): Investigate enabling in nacl config.
780*6777b538SAndroid Build Coastguard Worker      if (allow_remote && use_remoteexec && !is_nacl && !use_siso) {
781*6777b538SAndroid Build Coastguard Worker        pool = "//build/toolchain:remote_action_pool($default_toolchain)"
782*6777b538SAndroid Build Coastguard Worker        script = "//build/util/action_remote.py"
783*6777b538SAndroid Build Coastguard Worker        inputs = [ invoker.script ]
784*6777b538SAndroid Build Coastguard Worker
785*6777b538SAndroid Build Coastguard Worker        re_inputs = [ rebase_path(invoker.script, rbe_exec_root) ]
786*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.inputs)) {
787*6777b538SAndroid Build Coastguard Worker          foreach(input, invoker.inputs) {
788*6777b538SAndroid Build Coastguard Worker            re_inputs += [ rebase_path(input, rbe_exec_root) ]
789*6777b538SAndroid Build Coastguard Worker            inputs += [ input ]
790*6777b538SAndroid Build Coastguard Worker          }
791*6777b538SAndroid Build Coastguard Worker        }
792*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.sources)) {
793*6777b538SAndroid Build Coastguard Worker          foreach(source, invoker.sources) {
794*6777b538SAndroid Build Coastguard Worker            re_inputs += [ rebase_path(source, rbe_exec_root) ]
795*6777b538SAndroid Build Coastguard Worker          }
796*6777b538SAndroid Build Coastguard Worker        }
797*6777b538SAndroid Build Coastguard Worker
798*6777b538SAndroid Build Coastguard Worker        re_outputs = []
799*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.outputs)) {
800*6777b538SAndroid Build Coastguard Worker          foreach(output, invoker.outputs) {
801*6777b538SAndroid Build Coastguard Worker            re_outputs += [ rebase_path(output, rbe_exec_root) ]
802*6777b538SAndroid Build Coastguard Worker          }
803*6777b538SAndroid Build Coastguard Worker        }
804*6777b538SAndroid Build Coastguard Worker
805*6777b538SAndroid Build Coastguard Worker        # Write input/output lists to files as these can grow extremely large.
806*6777b538SAndroid Build Coastguard Worker        re_inputs_file = "$target_gen_dir/${target_name}__remote_inputs.rsp"
807*6777b538SAndroid Build Coastguard Worker        write_file(re_inputs_file, re_inputs)
808*6777b538SAndroid Build Coastguard Worker        inputs += [ re_inputs_file ]
809*6777b538SAndroid Build Coastguard Worker        re_outputs_file = "$target_gen_dir/${target_name}__remote_outputs.rsp"
810*6777b538SAndroid Build Coastguard Worker        write_file(re_outputs_file, re_outputs)
811*6777b538SAndroid Build Coastguard Worker
812*6777b538SAndroid Build Coastguard Worker        rewrapper_cfg = "$rbe_py_cfg_file"
813*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.remote_worker)) {
814*6777b538SAndroid Build Coastguard Worker          remote_worker = invoker.remote_worker
815*6777b538SAndroid Build Coastguard Worker          assert(remote_worker == "large",
816*6777b538SAndroid Build Coastguard Worker                 "remote_worker = " + remote_worker + " is not supported")
817*6777b538SAndroid Build Coastguard Worker          rewrapper_cfg = "$rbe_py_large_cfg_file"
818*6777b538SAndroid Build Coastguard Worker        }
819*6777b538SAndroid Build Coastguard Worker
820*6777b538SAndroid Build Coastguard Worker        args = []
821*6777b538SAndroid Build Coastguard Worker        args += [ "$rbe_bin_dir/rewrapper" ]
822*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.custom_processor)) {
823*6777b538SAndroid Build Coastguard Worker          args += [ "--custom_processor=" + invoker.custom_processor ]
824*6777b538SAndroid Build Coastguard Worker        }
825*6777b538SAndroid Build Coastguard Worker
826*6777b538SAndroid Build Coastguard Worker        args += [
827*6777b538SAndroid Build Coastguard Worker          "--cfg=" + rewrapper_cfg,
828*6777b538SAndroid Build Coastguard Worker          "--exec_root=$rbe_exec_root",
829*6777b538SAndroid Build Coastguard Worker          "--input_list_paths=" + rebase_path(re_inputs_file, root_build_dir),
830*6777b538SAndroid Build Coastguard Worker          "--output_list_paths=" + rebase_path(re_outputs_file, root_build_dir),
831*6777b538SAndroid Build Coastguard Worker          "python3",
832*6777b538SAndroid Build Coastguard Worker          rebase_path(invoker.script, root_build_dir),
833*6777b538SAndroid Build Coastguard Worker        ]
834*6777b538SAndroid Build Coastguard Worker
835*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.args)) {
836*6777b538SAndroid Build Coastguard Worker          args += invoker.args
837*6777b538SAndroid Build Coastguard Worker        }
838*6777b538SAndroid Build Coastguard Worker      } else {
839*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker, [ "inputs" ])
840*6777b538SAndroid Build Coastguard Worker        not_needed(invoker,
841*6777b538SAndroid Build Coastguard Worker                   [
842*6777b538SAndroid Build Coastguard Worker                     "custom_processor",
843*6777b538SAndroid Build Coastguard Worker                     "remote_worker",
844*6777b538SAndroid Build Coastguard Worker                   ])
845*6777b538SAndroid Build Coastguard Worker      }
846*6777b538SAndroid Build Coastguard Worker    }
847*6777b538SAndroid Build Coastguard Worker  }
848*6777b538SAndroid Build Coastguard Worker}
849