xref: /aosp_15_r20/external/angle/build/toolchain/gcc_toolchain.gni (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker# Copyright 2013 The Chromium Authors
2*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
4*8975f5c5SAndroid Build Coastguard Worker
5*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/clang/clang.gni")
6*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/compiler/compiler.gni")
7*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/coverage/coverage.gni")
8*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/rust.gni")
9*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/sanitizers/sanitizers.gni")
10*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/sysroot.gni")
11*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/v8_target_cpu.gni")
12*8975f5c5SAndroid Build Coastguard Workerimport("//build/toolchain/cc_wrapper.gni")
13*8975f5c5SAndroid Build Coastguard Workerimport("//build/toolchain/rbe.gni")
14*8975f5c5SAndroid Build Coastguard Workerimport("//build/toolchain/toolchain.gni")
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Workerif (is_nacl) {
17*8975f5c5SAndroid Build Coastguard Worker  # To keep NaCl variables out of builds that don't include NaCl, all
18*8975f5c5SAndroid Build Coastguard Worker  # variables defined in nacl/config.gni referenced here should be protected by
19*8975f5c5SAndroid Build Coastguard Worker  # is_nacl conditions.
20*8975f5c5SAndroid Build Coastguard Worker  import("//build/config/nacl/config.gni")
21*8975f5c5SAndroid Build Coastguard Worker}
22*8975f5c5SAndroid Build Coastguard Worker
23*8975f5c5SAndroid Build Coastguard Workerdeclare_args() {
24*8975f5c5SAndroid Build Coastguard Worker  # Enables allowlist generation for IDR_ grit defines seen by the compiler.
25*8975f5c5SAndroid Build Coastguard Worker  # Currently works only on some platforms and enabled by default for official
26*8975f5c5SAndroid Build Coastguard Worker  # builds. Requires debug info.
27*8975f5c5SAndroid Build Coastguard Worker  enable_resource_allowlist_generation =
28*8975f5c5SAndroid Build Coastguard Worker      is_official_build &&
29*8975f5c5SAndroid Build Coastguard Worker      # Don't enable for Android-on-Chrome OS.
30*8975f5c5SAndroid Build Coastguard Worker      (target_os == "android" || target_os == "win")
31*8975f5c5SAndroid Build Coastguard Worker
32*8975f5c5SAndroid Build Coastguard Worker  # Use -MD instead of -MMD for compiler commands. This is useful for tracking
33*8975f5c5SAndroid Build Coastguard Worker  # the comprehensive set of dependencies.  It's also required when building
34*8975f5c5SAndroid Build Coastguard Worker  # without the sysroot so that updates to system header files trigger a
35*8975f5c5SAndroid Build Coastguard Worker  # rebuild (when using the sysroot, the CR_SYSROOT_KEY define takes care of
36*8975f5c5SAndroid Build Coastguard Worker  # this already).
37*8975f5c5SAndroid Build Coastguard Worker  system_headers_in_deps = !use_sysroot
38*8975f5c5SAndroid Build Coastguard Worker}
39*8975f5c5SAndroid Build Coastguard Worker
40*8975f5c5SAndroid Build Coastguard Worker# When the arg is set via args.gn, it applies to all toolchains. In order to not
41*8975f5c5SAndroid Build Coastguard Worker# hit the assert in grit_rule.gni, explicitly disable for host toolchains.
42*8975f5c5SAndroid Build Coastguard Workerif ((is_linux || is_chromeos) && target_os == "android") {
43*8975f5c5SAndroid Build Coastguard Worker  enable_resource_allowlist_generation = false
44*8975f5c5SAndroid Build Coastguard Worker}
45*8975f5c5SAndroid Build Coastguard Worker
46*8975f5c5SAndroid Build Coastguard Worker# Ensure enable_resource_allowlist_generation is enabled only when it will work.
47*8975f5c5SAndroid Build Coastguard Workerif (enable_resource_allowlist_generation) {
48*8975f5c5SAndroid Build Coastguard Worker  assert(
49*8975f5c5SAndroid Build Coastguard Worker      !strip_debug_info,
50*8975f5c5SAndroid Build Coastguard Worker      "enable_resource_allowlist_generation=true requires strip_debug_info=false")
51*8975f5c5SAndroid Build Coastguard Worker  assert(
52*8975f5c5SAndroid Build Coastguard Worker      !is_component_build,
53*8975f5c5SAndroid Build Coastguard Worker      "enable_resource_allowlist_generation=true requires is_component_build=false")
54*8975f5c5SAndroid Build Coastguard Worker  assert(
55*8975f5c5SAndroid Build Coastguard Worker      target_os == "android" || target_os == "win",
56*8975f5c5SAndroid Build Coastguard Worker      "enable_resource_allowlist_generation=true does not work for target_os=$target_os")
57*8975f5c5SAndroid Build Coastguard Worker}
58*8975f5c5SAndroid Build Coastguard Worker
59*8975f5c5SAndroid Build Coastguard Worker# This template defines a toolchain for something that works like gcc
60*8975f5c5SAndroid Build Coastguard Worker# (including clang).
61*8975f5c5SAndroid Build Coastguard Worker#
62*8975f5c5SAndroid Build Coastguard Worker# It requires the following variables specifying the executables to run:
63*8975f5c5SAndroid Build Coastguard Worker#  - ar
64*8975f5c5SAndroid Build Coastguard Worker#  - cc
65*8975f5c5SAndroid Build Coastguard Worker#  - cxx
66*8975f5c5SAndroid Build Coastguard Worker#  - ld
67*8975f5c5SAndroid Build Coastguard Worker#
68*8975f5c5SAndroid Build Coastguard Worker# Optional parameters that control the tools:
69*8975f5c5SAndroid Build Coastguard Worker#
70*8975f5c5SAndroid Build Coastguard Worker#  - extra_cflags
71*8975f5c5SAndroid Build Coastguard Worker#      Extra flags to be appended when compiling C files (but not C++ files).
72*8975f5c5SAndroid Build Coastguard Worker#  - extra_cppflags
73*8975f5c5SAndroid Build Coastguard Worker#      Extra flags to be appended when compiling both C and C++ files. "CPP"
74*8975f5c5SAndroid Build Coastguard Worker#      stands for "C PreProcessor" in this context, although it can be
75*8975f5c5SAndroid Build Coastguard Worker#      used for non-preprocessor flags as well. Not to be confused with
76*8975f5c5SAndroid Build Coastguard Worker#      "CXX" (which follows).
77*8975f5c5SAndroid Build Coastguard Worker#  - extra_cxxflags
78*8975f5c5SAndroid Build Coastguard Worker#      Extra flags to be appended when compiling C++ files (but not C files).
79*8975f5c5SAndroid Build Coastguard Worker#  - extra_asmflags
80*8975f5c5SAndroid Build Coastguard Worker#      Extra flags to be appended when compiling assembly.
81*8975f5c5SAndroid Build Coastguard Worker#  - extra_ldflags
82*8975f5c5SAndroid Build Coastguard Worker#      Extra flags to be appended when linking
83*8975f5c5SAndroid Build Coastguard Worker#
84*8975f5c5SAndroid Build Coastguard Worker#  - link_outputs
85*8975f5c5SAndroid Build Coastguard Worker#      The content of this array, if specified, will be added to the list of
86*8975f5c5SAndroid Build Coastguard Worker#      outputs from the link command. This can be useful in conjunction with
87*8975f5c5SAndroid Build Coastguard Worker#      the post_link parameter.
88*8975f5c5SAndroid Build Coastguard Worker#  - use_unstripped_as_runtime_outputs
89*8975f5c5SAndroid Build Coastguard Worker#      When |strip| is set, mark unstripped executables as runtime deps rather
90*8975f5c5SAndroid Build Coastguard Worker#      than stripped ones.
91*8975f5c5SAndroid Build Coastguard Worker#  - post_link
92*8975f5c5SAndroid Build Coastguard Worker#      The content of this string, if specified, will be run as a separate
93*8975f5c5SAndroid Build Coastguard Worker#      command following the the link command.
94*8975f5c5SAndroid Build Coastguard Worker#  - deps
95*8975f5c5SAndroid Build Coastguard Worker#      Just forwarded to the toolchain definition.
96*8975f5c5SAndroid Build Coastguard Worker#  - executable_extension
97*8975f5c5SAndroid Build Coastguard Worker#      If this string is specified it will be used for the file extension
98*8975f5c5SAndroid Build Coastguard Worker#      for an executable, rather than using no extension; targets will
99*8975f5c5SAndroid Build Coastguard Worker#      still be able to override the extension using the output_extension
100*8975f5c5SAndroid Build Coastguard Worker#      variable.
101*8975f5c5SAndroid Build Coastguard Worker#  - rebuild_define
102*8975f5c5SAndroid Build Coastguard Worker#      The contents of this string, if specified, will be passed as a #define
103*8975f5c5SAndroid Build Coastguard Worker#      to the toolchain. It can be used to force recompiles whenever a
104*8975f5c5SAndroid Build Coastguard Worker#      toolchain is updated.
105*8975f5c5SAndroid Build Coastguard Worker#  - shlib_extension
106*8975f5c5SAndroid Build Coastguard Worker#      If this string is specified it will be used for the file extension
107*8975f5c5SAndroid Build Coastguard Worker#      for a shared library, rather than default value specified in
108*8975f5c5SAndroid Build Coastguard Worker#      toolchain.gni
109*8975f5c5SAndroid Build Coastguard Worker#  - strip
110*8975f5c5SAndroid Build Coastguard Worker#      Location of the strip executable. When specified, strip will be run on
111*8975f5c5SAndroid Build Coastguard Worker#      all shared libraries and executables as they are built. The pre-stripped
112*8975f5c5SAndroid Build Coastguard Worker#      artifacts will be put in lib.unstripped/ and exe.unstripped/.
113*8975f5c5SAndroid Build Coastguard Worker#
114*8975f5c5SAndroid Build Coastguard Worker# Callers will normally want to invoke "gcc_toolchain" instead, which makes an
115*8975f5c5SAndroid Build Coastguard Worker# additional toolchain for Rust targets that are build-time artificts such as
116*8975f5c5SAndroid Build Coastguard Worker# proc macros.
117*8975f5c5SAndroid Build Coastguard Workertemplate("single_gcc_toolchain") {
118*8975f5c5SAndroid Build Coastguard Worker  toolchain(target_name) {
119*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value")
120*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value")
121*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value")
122*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value")
123*8975f5c5SAndroid Build Coastguard Worker
124*8975f5c5SAndroid Build Coastguard Worker    # This define changes when the toolchain changes, forcing a rebuild.
125*8975f5c5SAndroid Build Coastguard Worker    # Nothing should ever use this define.
126*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.rebuild_define)) {
127*8975f5c5SAndroid Build Coastguard Worker      rebuild_string = "-D" + invoker.rebuild_define + " "
128*8975f5c5SAndroid Build Coastguard Worker    } else {
129*8975f5c5SAndroid Build Coastguard Worker      rebuild_string = ""
130*8975f5c5SAndroid Build Coastguard Worker    }
131*8975f5c5SAndroid Build Coastguard Worker
132*8975f5c5SAndroid Build Coastguard Worker    # GN's syntax can't handle more than one scope dereference at once, like
133*8975f5c5SAndroid Build Coastguard Worker    # "invoker.toolchain_args.foo", so make a temporary to hold the toolchain
134*8975f5c5SAndroid Build Coastguard Worker    # args so we can do "invoker_toolchain_args.foo".
135*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.toolchain_args),
136*8975f5c5SAndroid Build Coastguard Worker           "Toolchains must specify toolchain_args")
137*8975f5c5SAndroid Build Coastguard Worker    invoker_toolchain_args = invoker.toolchain_args
138*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker_toolchain_args.current_cpu),
139*8975f5c5SAndroid Build Coastguard Worker           "toolchain_args must specify a current_cpu")
140*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker_toolchain_args.current_os),
141*8975f5c5SAndroid Build Coastguard Worker           "toolchain_args must specify a current_os")
142*8975f5c5SAndroid Build Coastguard Worker
143*8975f5c5SAndroid Build Coastguard Worker    # use_reclient is default to use_remoteexec
144*8975f5c5SAndroid Build Coastguard Worker    if (!defined(invoker_toolchain_args.use_reclient) &&
145*8975f5c5SAndroid Build Coastguard Worker        defined(invoker_toolchain_args.use_remoteexec)) {
146*8975f5c5SAndroid Build Coastguard Worker      invoker_toolchain_args.use_reclient =
147*8975f5c5SAndroid Build Coastguard Worker          invoker_toolchain_args.use_remoteexec
148*8975f5c5SAndroid Build Coastguard Worker    }
149*8975f5c5SAndroid Build Coastguard Worker
150*8975f5c5SAndroid Build Coastguard Worker    # When invoking this toolchain not as the default one, these args will be
151*8975f5c5SAndroid Build Coastguard Worker    # passed to the build. They are ignored when this is the default toolchain.
152*8975f5c5SAndroid Build Coastguard Worker    toolchain_args = {
153*8975f5c5SAndroid Build Coastguard Worker      # Populate toolchain args from the invoker.
154*8975f5c5SAndroid Build Coastguard Worker      forward_variables_from(invoker_toolchain_args, "*")
155*8975f5c5SAndroid Build Coastguard Worker
156*8975f5c5SAndroid Build Coastguard Worker      # The host toolchain value computed by the default toolchain's setup
157*8975f5c5SAndroid Build Coastguard Worker      # needs to be passed through unchanged to all secondary toolchains to
158*8975f5c5SAndroid Build Coastguard Worker      # ensure that it's always the same, regardless of the values that may be
159*8975f5c5SAndroid Build Coastguard Worker      # set on those toolchains.
160*8975f5c5SAndroid Build Coastguard Worker      host_toolchain = host_toolchain
161*8975f5c5SAndroid Build Coastguard Worker
162*8975f5c5SAndroid Build Coastguard Worker      if (!defined(invoker_toolchain_args.v8_current_cpu)) {
163*8975f5c5SAndroid Build Coastguard Worker        v8_current_cpu = invoker_toolchain_args.current_cpu
164*8975f5c5SAndroid Build Coastguard Worker      }
165*8975f5c5SAndroid Build Coastguard Worker    }
166*8975f5c5SAndroid Build Coastguard Worker
167*8975f5c5SAndroid Build Coastguard Worker    # When the invoker has explicitly overridden use_remoteexec or
168*8975f5c5SAndroid Build Coastguard Worker    # cc_wrapper in the toolchain args, use those values, otherwise default
169*8975f5c5SAndroid Build Coastguard Worker    # to the global one.  This works because the only reasonable override
170*8975f5c5SAndroid Build Coastguard Worker    # that toolchains might supply for these values are to force-disable them.
171*8975f5c5SAndroid Build Coastguard Worker    if (defined(toolchain_args.use_reclient)) {
172*8975f5c5SAndroid Build Coastguard Worker      toolchain_uses_reclient = toolchain_args.use_reclient
173*8975f5c5SAndroid Build Coastguard Worker    } else {
174*8975f5c5SAndroid Build Coastguard Worker      toolchain_uses_reclient = use_reclient
175*8975f5c5SAndroid Build Coastguard Worker    }
176*8975f5c5SAndroid Build Coastguard Worker
177*8975f5c5SAndroid Build Coastguard Worker    if (defined(toolchain_args.cc_wrapper)) {
178*8975f5c5SAndroid Build Coastguard Worker      toolchain_cc_wrapper = toolchain_args.cc_wrapper
179*8975f5c5SAndroid Build Coastguard Worker    } else {
180*8975f5c5SAndroid Build Coastguard Worker      toolchain_cc_wrapper = cc_wrapper
181*8975f5c5SAndroid Build Coastguard Worker    }
182*8975f5c5SAndroid Build Coastguard Worker    assert(!(toolchain_cc_wrapper != "" && toolchain_uses_reclient),
183*8975f5c5SAndroid Build Coastguard Worker           "re-client and cc_wrapper can't be used together.")
184*8975f5c5SAndroid Build Coastguard Worker
185*8975f5c5SAndroid Build Coastguard Worker    # When the invoker has explicitly overridden cc_wrapper in the
186*8975f5c5SAndroid Build Coastguard Worker    # toolchain args, use those values, otherwise default to the global one.
187*8975f5c5SAndroid Build Coastguard Worker    # This works because the only reasonable override that toolchains might
188*8975f5c5SAndroid Build Coastguard Worker    # supply for these values are to force-disable them.
189*8975f5c5SAndroid Build Coastguard Worker    # But if needs_rewrapper_path_arg is set in a Chrome OS build, the
190*8975f5c5SAndroid Build Coastguard Worker    # toolchain wrapper will have picked up rewrapper via cmd-line arg. So
191*8975f5c5SAndroid Build Coastguard Worker    # need to prepend rewrapper in that case.
192*8975f5c5SAndroid Build Coastguard Worker    if (toolchain_uses_reclient &&
193*8975f5c5SAndroid Build Coastguard Worker        (!defined(invoker.needs_rewrapper_path_arg) ||
194*8975f5c5SAndroid Build Coastguard Worker         !invoker.needs_rewrapper_path_arg)) {
195*8975f5c5SAndroid Build Coastguard Worker      if (defined(toolchain_args.reclient_cc_cfg_file)) {
196*8975f5c5SAndroid Build Coastguard Worker        toolchain_reclient_cc_cfg_file = toolchain_args.reclient_cc_cfg_file
197*8975f5c5SAndroid Build Coastguard Worker      } else {
198*8975f5c5SAndroid Build Coastguard Worker        toolchain_reclient_cc_cfg_file = reclient_cc_cfg_file
199*8975f5c5SAndroid Build Coastguard Worker      }
200*8975f5c5SAndroid Build Coastguard Worker
201*8975f5c5SAndroid Build Coastguard Worker      # C/C++ (clang) rewrapper prefix to use when use_reclient is true.
202*8975f5c5SAndroid Build Coastguard Worker      compiler_prefix = "${reclient_bin_dir}/rewrapper -cfg=${toolchain_reclient_cc_cfg_file}${rbe_bug_326584510_missing_inputs} -exec_root=${rbe_exec_root} "
203*8975f5c5SAndroid Build Coastguard Worker    } else {
204*8975f5c5SAndroid Build Coastguard Worker      compiler_prefix = "${toolchain_cc_wrapper} "
205*8975f5c5SAndroid Build Coastguard Worker
206*8975f5c5SAndroid Build Coastguard Worker      # Prevent warning about unused variable since it is not read in the code
207*8975f5c5SAndroid Build Coastguard Worker      # paths when reclient is not needed.
208*8975f5c5SAndroid Build Coastguard Worker      not_needed(invoker, [ "needs_rewrapper_path_arg" ])
209*8975f5c5SAndroid Build Coastguard Worker    }
210*8975f5c5SAndroid Build Coastguard Worker
211*8975f5c5SAndroid Build Coastguard Worker    # A specific toolchain may wish to avoid coverage instrumentation, so we
212*8975f5c5SAndroid Build Coastguard Worker    # allow the global "use_clang_coverage" arg to be overridden.
213*8975f5c5SAndroid Build Coastguard Worker    if (defined(toolchain_args.use_clang_coverage)) {
214*8975f5c5SAndroid Build Coastguard Worker      toolchain_use_clang_coverage = toolchain_args.use_clang_coverage
215*8975f5c5SAndroid Build Coastguard Worker    } else {
216*8975f5c5SAndroid Build Coastguard Worker      toolchain_use_clang_coverage = use_clang_coverage
217*8975f5c5SAndroid Build Coastguard Worker    }
218*8975f5c5SAndroid Build Coastguard Worker
219*8975f5c5SAndroid Build Coastguard Worker    # For a coverage build, we use the wrapper script globally so that it can
220*8975f5c5SAndroid Build Coastguard Worker    # remove coverage cflags from files that should not have them.
221*8975f5c5SAndroid Build Coastguard Worker    if (toolchain_use_clang_coverage) {
222*8975f5c5SAndroid Build Coastguard Worker      # "coverage_instrumentation_input_file" is set in args.gn, but it can be
223*8975f5c5SAndroid Build Coastguard Worker      # overridden by a toolchain config.
224*8975f5c5SAndroid Build Coastguard Worker      if (defined(toolchain_args.coverage_instrumentation_input_file)) {
225*8975f5c5SAndroid Build Coastguard Worker        toolchain_coverage_instrumentation_input_file =
226*8975f5c5SAndroid Build Coastguard Worker            toolchain_args.coverage_instrumentation_input_file
227*8975f5c5SAndroid Build Coastguard Worker      } else {
228*8975f5c5SAndroid Build Coastguard Worker        toolchain_coverage_instrumentation_input_file =
229*8975f5c5SAndroid Build Coastguard Worker            coverage_instrumentation_input_file
230*8975f5c5SAndroid Build Coastguard Worker      }
231*8975f5c5SAndroid Build Coastguard Worker
232*8975f5c5SAndroid Build Coastguard Worker      _coverage_wrapper =
233*8975f5c5SAndroid Build Coastguard Worker          rebase_path("//build/toolchain/clang_code_coverage_wrapper.py",
234*8975f5c5SAndroid Build Coastguard Worker                      root_build_dir)
235*8975f5c5SAndroid Build Coastguard Worker
236*8975f5c5SAndroid Build Coastguard Worker      # The wrapper needs to know what OS we target because it uses that to
237*8975f5c5SAndroid Build Coastguard Worker      # select a list of files that should not be instrumented.
238*8975f5c5SAndroid Build Coastguard Worker      _coverage_wrapper = _coverage_wrapper + " --target-os=" +
239*8975f5c5SAndroid Build Coastguard Worker                          invoker_toolchain_args.current_os
240*8975f5c5SAndroid Build Coastguard Worker
241*8975f5c5SAndroid Build Coastguard Worker      # We want to instrument everything if there is no input file set.
242*8975f5c5SAndroid Build Coastguard Worker      # If there is a file we need to give it to the wrapper script so it can
243*8975f5c5SAndroid Build Coastguard Worker      # instrument only those files.
244*8975f5c5SAndroid Build Coastguard Worker      if (toolchain_coverage_instrumentation_input_file != "") {
245*8975f5c5SAndroid Build Coastguard Worker        _coverage_wrapper =
246*8975f5c5SAndroid Build Coastguard Worker            _coverage_wrapper + " --files-to-instrument=" +
247*8975f5c5SAndroid Build Coastguard Worker            rebase_path(toolchain_coverage_instrumentation_input_file,
248*8975f5c5SAndroid Build Coastguard Worker                        root_build_dir)
249*8975f5c5SAndroid Build Coastguard Worker      }
250*8975f5c5SAndroid Build Coastguard Worker      compiler_prefix =
251*8975f5c5SAndroid Build Coastguard Worker          "\"$python_path\" ${_coverage_wrapper} " + compiler_prefix
252*8975f5c5SAndroid Build Coastguard Worker    }
253*8975f5c5SAndroid Build Coastguard Worker
254*8975f5c5SAndroid Build Coastguard Worker    cc = compiler_prefix + invoker.cc
255*8975f5c5SAndroid Build Coastguard Worker    cxx = compiler_prefix + invoker.cxx
256*8975f5c5SAndroid Build Coastguard Worker
257*8975f5c5SAndroid Build Coastguard Worker    # "asm" doesn't support any of toolchain_cc_wrapper and
258*8975f5c5SAndroid Build Coastguard Worker    # toolchain_uses_reclient. The coverage flags are also nonsensical on
259*8975f5c5SAndroid Build Coastguard Worker    # assembler runs.
260*8975f5c5SAndroid Build Coastguard Worker    asm = invoker.cc
261*8975f5c5SAndroid Build Coastguard Worker    ar = invoker.ar
262*8975f5c5SAndroid Build Coastguard Worker    ld = invoker.ld
263*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.readelf)) {
264*8975f5c5SAndroid Build Coastguard Worker      readelf = invoker.readelf
265*8975f5c5SAndroid Build Coastguard Worker    } else {
266*8975f5c5SAndroid Build Coastguard Worker      readelf = "readelf"
267*8975f5c5SAndroid Build Coastguard Worker    }
268*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.nm)) {
269*8975f5c5SAndroid Build Coastguard Worker      nm = invoker.nm
270*8975f5c5SAndroid Build Coastguard Worker    } else {
271*8975f5c5SAndroid Build Coastguard Worker      nm = "nm"
272*8975f5c5SAndroid Build Coastguard Worker    }
273*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.dwp)) {
274*8975f5c5SAndroid Build Coastguard Worker      dwp_switch = " --dwp=\"${invoker.dwp}\""
275*8975f5c5SAndroid Build Coastguard Worker    } else {
276*8975f5c5SAndroid Build Coastguard Worker      dwp_switch = ""
277*8975f5c5SAndroid Build Coastguard Worker    }
278*8975f5c5SAndroid Build Coastguard Worker
279*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.shlib_extension)) {
280*8975f5c5SAndroid Build Coastguard Worker      default_shlib_extension = invoker.shlib_extension
281*8975f5c5SAndroid Build Coastguard Worker    } else {
282*8975f5c5SAndroid Build Coastguard Worker      default_shlib_extension = shlib_extension
283*8975f5c5SAndroid Build Coastguard Worker    }
284*8975f5c5SAndroid Build Coastguard Worker
285*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.default_shlib_subdir)) {
286*8975f5c5SAndroid Build Coastguard Worker      default_shlib_subdir = invoker.default_shlib_subdir
287*8975f5c5SAndroid Build Coastguard Worker    } else {
288*8975f5c5SAndroid Build Coastguard Worker      default_shlib_subdir = ""
289*8975f5c5SAndroid Build Coastguard Worker    }
290*8975f5c5SAndroid Build Coastguard Worker
291*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.executable_extension)) {
292*8975f5c5SAndroid Build Coastguard Worker      default_executable_extension = invoker.executable_extension
293*8975f5c5SAndroid Build Coastguard Worker    } else {
294*8975f5c5SAndroid Build Coastguard Worker      default_executable_extension = ""
295*8975f5c5SAndroid Build Coastguard Worker    }
296*8975f5c5SAndroid Build Coastguard Worker
297*8975f5c5SAndroid Build Coastguard Worker    # Bring these into our scope for string interpolation with default values.
298*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.extra_cflags) && invoker.extra_cflags != "") {
299*8975f5c5SAndroid Build Coastguard Worker      extra_cflags = " " + invoker.extra_cflags
300*8975f5c5SAndroid Build Coastguard Worker    } else {
301*8975f5c5SAndroid Build Coastguard Worker      extra_cflags = ""
302*8975f5c5SAndroid Build Coastguard Worker    }
303*8975f5c5SAndroid Build Coastguard Worker
304*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != "") {
305*8975f5c5SAndroid Build Coastguard Worker      extra_cppflags = " " + invoker.extra_cppflags
306*8975f5c5SAndroid Build Coastguard Worker    } else {
307*8975f5c5SAndroid Build Coastguard Worker      extra_cppflags = ""
308*8975f5c5SAndroid Build Coastguard Worker    }
309*8975f5c5SAndroid Build Coastguard Worker
310*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.extra_cxxflags) && invoker.extra_cxxflags != "") {
311*8975f5c5SAndroid Build Coastguard Worker      extra_cxxflags = " " + invoker.extra_cxxflags
312*8975f5c5SAndroid Build Coastguard Worker    } else {
313*8975f5c5SAndroid Build Coastguard Worker      extra_cxxflags = ""
314*8975f5c5SAndroid Build Coastguard Worker    }
315*8975f5c5SAndroid Build Coastguard Worker
316*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.extra_asmflags) && invoker.extra_asmflags != "") {
317*8975f5c5SAndroid Build Coastguard Worker      extra_asmflags = " " + invoker.extra_asmflags
318*8975f5c5SAndroid Build Coastguard Worker    } else {
319*8975f5c5SAndroid Build Coastguard Worker      extra_asmflags = ""
320*8975f5c5SAndroid Build Coastguard Worker    }
321*8975f5c5SAndroid Build Coastguard Worker
322*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") {
323*8975f5c5SAndroid Build Coastguard Worker      extra_ldflags = " " + invoker.extra_ldflags
324*8975f5c5SAndroid Build Coastguard Worker    } else {
325*8975f5c5SAndroid Build Coastguard Worker      extra_ldflags = ""
326*8975f5c5SAndroid Build Coastguard Worker    }
327*8975f5c5SAndroid Build Coastguard Worker
328*8975f5c5SAndroid Build Coastguard Worker    if (system_headers_in_deps) {
329*8975f5c5SAndroid Build Coastguard Worker      md = "-MD"
330*8975f5c5SAndroid Build Coastguard Worker    } else {
331*8975f5c5SAndroid Build Coastguard Worker      md = "-MMD"
332*8975f5c5SAndroid Build Coastguard Worker    }
333*8975f5c5SAndroid Build Coastguard Worker
334*8975f5c5SAndroid Build Coastguard Worker    enable_linker_map = defined(invoker.enable_linker_map) &&
335*8975f5c5SAndroid Build Coastguard Worker                        invoker.enable_linker_map && generate_linker_map
336*8975f5c5SAndroid Build Coastguard Worker
337*8975f5c5SAndroid Build Coastguard Worker    # These library switches can apply to all tools below.
338*8975f5c5SAndroid Build Coastguard Worker    lib_switch = "-l"
339*8975f5c5SAndroid Build Coastguard Worker    lib_dir_switch = "-L"
340*8975f5c5SAndroid Build Coastguard Worker
341*8975f5c5SAndroid Build Coastguard Worker    # Object files go in this directory.
342*8975f5c5SAndroid Build Coastguard Worker    object_subdir = "{{target_out_dir}}/{{label_name}}"
343*8975f5c5SAndroid Build Coastguard Worker
344*8975f5c5SAndroid Build Coastguard Worker    tool("cc") {
345*8975f5c5SAndroid Build Coastguard Worker      depfile = "{{output}}.d"
346*8975f5c5SAndroid Build Coastguard Worker      precompiled_header_type = "gcc"
347*8975f5c5SAndroid Build Coastguard Worker      command = "$cc $md -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}"
348*8975f5c5SAndroid Build Coastguard Worker      depsformat = "gcc"
349*8975f5c5SAndroid Build Coastguard Worker      description = "CC {{output}}"
350*8975f5c5SAndroid Build Coastguard Worker      outputs = [ "$object_subdir/{{source_name_part}}.o" ]
351*8975f5c5SAndroid Build Coastguard Worker    }
352*8975f5c5SAndroid Build Coastguard Worker
353*8975f5c5SAndroid Build Coastguard Worker    tool("cxx") {
354*8975f5c5SAndroid Build Coastguard Worker      depfile = "{{output}}.d"
355*8975f5c5SAndroid Build Coastguard Worker      precompiled_header_type = "gcc"
356*8975f5c5SAndroid Build Coastguard Worker      command = "$cxx $md -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} -c {{source}} -o {{output}}"
357*8975f5c5SAndroid Build Coastguard Worker      depsformat = "gcc"
358*8975f5c5SAndroid Build Coastguard Worker      description = "CXX {{output}}"
359*8975f5c5SAndroid Build Coastguard Worker      outputs = [ "$object_subdir/{{source_name_part}}.o" ]
360*8975f5c5SAndroid Build Coastguard Worker    }
361*8975f5c5SAndroid Build Coastguard Worker
362*8975f5c5SAndroid Build Coastguard Worker    tool("asm") {
363*8975f5c5SAndroid Build Coastguard Worker      # For GCC we can just use the C compiler to compile assembly.
364*8975f5c5SAndroid Build Coastguard Worker      depfile = "{{output}}.d"
365*8975f5c5SAndroid Build Coastguard Worker      command = "$asm $md -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}}${extra_asmflags} -c {{source}} -o {{output}}"
366*8975f5c5SAndroid Build Coastguard Worker      depsformat = "gcc"
367*8975f5c5SAndroid Build Coastguard Worker      description = "ASM {{output}}"
368*8975f5c5SAndroid Build Coastguard Worker      outputs = [ "$object_subdir/{{source_name_part}}.o" ]
369*8975f5c5SAndroid Build Coastguard Worker    }
370*8975f5c5SAndroid Build Coastguard Worker
371*8975f5c5SAndroid Build Coastguard Worker    tool("alink") {
372*8975f5c5SAndroid Build Coastguard Worker      if (current_os == "aix") {
373*8975f5c5SAndroid Build Coastguard Worker        # AIX does not support either -D (deterministic output) or response
374*8975f5c5SAndroid Build Coastguard Worker        # files.
375*8975f5c5SAndroid Build Coastguard Worker        command = "$ar -X64 {{arflags}} -r -c -s {{output}} {{inputs}}"
376*8975f5c5SAndroid Build Coastguard Worker      } else {
377*8975f5c5SAndroid Build Coastguard Worker        rspfile = "{{output}}.rsp"
378*8975f5c5SAndroid Build Coastguard Worker        rspfile_content = "{{inputs}}"
379*8975f5c5SAndroid Build Coastguard Worker        command = "\"$ar\" {{arflags}} -r -c -D {{output}} @\"$rspfile\""
380*8975f5c5SAndroid Build Coastguard Worker      }
381*8975f5c5SAndroid Build Coastguard Worker
382*8975f5c5SAndroid Build Coastguard Worker      # Remove the output file first so that ar doesn't try to modify the
383*8975f5c5SAndroid Build Coastguard Worker      # existing file.
384*8975f5c5SAndroid Build Coastguard Worker      if (host_os == "win") {
385*8975f5c5SAndroid Build Coastguard Worker        tool_wrapper_path =
386*8975f5c5SAndroid Build Coastguard Worker            rebase_path("//build/toolchain/win/tool_wrapper.py", root_build_dir)
387*8975f5c5SAndroid Build Coastguard Worker        command = "cmd /s /c \"\"$python_path\" $tool_wrapper_path delete-file {{output}} && $command\""
388*8975f5c5SAndroid Build Coastguard Worker      } else {
389*8975f5c5SAndroid Build Coastguard Worker        command = "rm -f {{output}} && $command"
390*8975f5c5SAndroid Build Coastguard Worker      }
391*8975f5c5SAndroid Build Coastguard Worker
392*8975f5c5SAndroid Build Coastguard Worker      # Almost all targets build with //build/config/compiler:thin_archive which
393*8975f5c5SAndroid Build Coastguard Worker      # adds -T -S to arflags.
394*8975f5c5SAndroid Build Coastguard Worker      description = "AR {{output}}"
395*8975f5c5SAndroid Build Coastguard Worker      outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
396*8975f5c5SAndroid Build Coastguard Worker
397*8975f5c5SAndroid Build Coastguard Worker      # Static libraries go in the target out directory by default so we can
398*8975f5c5SAndroid Build Coastguard Worker      # generate different targets with the same name and not have them collide.
399*8975f5c5SAndroid Build Coastguard Worker      default_output_dir = "{{target_out_dir}}"
400*8975f5c5SAndroid Build Coastguard Worker      default_output_extension = ".a"
401*8975f5c5SAndroid Build Coastguard Worker      output_prefix = "lib"
402*8975f5c5SAndroid Build Coastguard Worker    }
403*8975f5c5SAndroid Build Coastguard Worker
404*8975f5c5SAndroid Build Coastguard Worker    tool("solink") {
405*8975f5c5SAndroid Build Coastguard Worker      soname = "{{target_output_name}}{{output_extension}}"  # e.g. "libfoo.so".
406*8975f5c5SAndroid Build Coastguard Worker      sofile = "{{output_dir}}/$soname"  # Possibly including toolchain dir.
407*8975f5c5SAndroid Build Coastguard Worker      rspfile = sofile + ".rsp"
408*8975f5c5SAndroid Build Coastguard Worker
409*8975f5c5SAndroid Build Coastguard Worker      pool = "//build/toolchain:link_pool($default_toolchain)"
410*8975f5c5SAndroid Build Coastguard Worker
411*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.strip)) {
412*8975f5c5SAndroid Build Coastguard Worker        unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname"
413*8975f5c5SAndroid Build Coastguard Worker      } else {
414*8975f5c5SAndroid Build Coastguard Worker        unstripped_sofile = sofile
415*8975f5c5SAndroid Build Coastguard Worker      }
416*8975f5c5SAndroid Build Coastguard Worker
417*8975f5c5SAndroid Build Coastguard Worker      # These variables are not built into GN but are helpers that
418*8975f5c5SAndroid Build Coastguard Worker      # implement (1) linking to produce a .so, (2) extracting the symbols
419*8975f5c5SAndroid Build Coastguard Worker      # from that file (3) if the extracted list differs from the existing
420*8975f5c5SAndroid Build Coastguard Worker      # .TOC file, overwrite it, otherwise, don't change it.
421*8975f5c5SAndroid Build Coastguard Worker      tocfile = sofile + ".TOC"
422*8975f5c5SAndroid Build Coastguard Worker
423*8975f5c5SAndroid Build Coastguard Worker      soname_flag = ""
424*8975f5c5SAndroid Build Coastguard Worker      if (current_os != "aix") {
425*8975f5c5SAndroid Build Coastguard Worker        # -soname flag is not available on aix ld
426*8975f5c5SAndroid Build Coastguard Worker        soname_flag = "-Wl,-soname=\"$soname\""
427*8975f5c5SAndroid Build Coastguard Worker      }
428*8975f5c5SAndroid Build Coastguard Worker      link_command = "$ld -shared $soname_flag {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" @\"$rspfile\" {{rlibs}}"
429*8975f5c5SAndroid Build Coastguard Worker
430*8975f5c5SAndroid Build Coastguard Worker      # Generate a map file to be used for binary size analysis.
431*8975f5c5SAndroid Build Coastguard Worker      # Map file adds ~10% to the link time on a z620.
432*8975f5c5SAndroid Build Coastguard Worker      # With target_os="android", libchrome.so.map.gz is ~20MB.
433*8975f5c5SAndroid Build Coastguard Worker      map_switch = ""
434*8975f5c5SAndroid Build Coastguard Worker      if (enable_linker_map) {
435*8975f5c5SAndroid Build Coastguard Worker        map_file = "$unstripped_sofile.map.gz"
436*8975f5c5SAndroid Build Coastguard Worker        map_switch = " --map-file \"$map_file\""
437*8975f5c5SAndroid Build Coastguard Worker      }
438*8975f5c5SAndroid Build Coastguard Worker
439*8975f5c5SAndroid Build Coastguard Worker      assert(defined(readelf), "to solink you must have a readelf")
440*8975f5c5SAndroid Build Coastguard Worker      assert(defined(nm), "to solink you must have an nm")
441*8975f5c5SAndroid Build Coastguard Worker      strip_switch = ""
442*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.strip)) {
443*8975f5c5SAndroid Build Coastguard Worker        strip_switch = "--strip=${invoker.strip} "
444*8975f5c5SAndroid Build Coastguard Worker      }
445*8975f5c5SAndroid Build Coastguard Worker
446*8975f5c5SAndroid Build Coastguard Worker      # This needs a Python script to avoid using a complex shell command
447*8975f5c5SAndroid Build Coastguard Worker      # requiring sh control structures, pipelines, and POSIX utilities.
448*8975f5c5SAndroid Build Coastguard Worker      # The host might not have a POSIX shell and utilities (e.g. Windows).
449*8975f5c5SAndroid Build Coastguard Worker      solink_wrapper =
450*8975f5c5SAndroid Build Coastguard Worker          rebase_path("//build/toolchain/gcc_solink_wrapper.py", root_build_dir)
451*8975f5c5SAndroid Build Coastguard Worker      solink_extra_flags = ""
452*8975f5c5SAndroid Build Coastguard Worker      if (current_os == "aix") {
453*8975f5c5SAndroid Build Coastguard Worker        # to be intercepted by solink_wrapper, so that we exit immediately
454*8975f5c5SAndroid Build Coastguard Worker        # after linking the shared object, without generating the TOC file
455*8975f5c5SAndroid Build Coastguard Worker        # (skipped on Aix)
456*8975f5c5SAndroid Build Coastguard Worker        solink_extra_flags = "--partitioned-library"
457*8975f5c5SAndroid Build Coastguard Worker      }
458*8975f5c5SAndroid Build Coastguard Worker      command = "\"$python_path\" \"$solink_wrapper\" --readelf=\"$readelf\" --nm=\"$nm\" $strip_switch$dwp_switch --sofile=\"$unstripped_sofile\" --tocfile=\"$tocfile\"$map_switch --output=\"$sofile\" -- $link_command $solink_extra_flags"
459*8975f5c5SAndroid Build Coastguard Worker
460*8975f5c5SAndroid Build Coastguard Worker      if (target_cpu == "mipsel" && is_component_build && is_android) {
461*8975f5c5SAndroid Build Coastguard Worker        rspfile_content = "-Wl,--start-group -Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive {{libs}} -Wl,--end-group"
462*8975f5c5SAndroid Build Coastguard Worker      } else if (current_os == "aix") {
463*8975f5c5SAndroid Build Coastguard Worker        # --whole-archive, --no-whole-archive flags are not available on the aix
464*8975f5c5SAndroid Build Coastguard Worker        # ld.
465*8975f5c5SAndroid Build Coastguard Worker        rspfile_content = "{{inputs}} {{solibs}} {{libs}}"
466*8975f5c5SAndroid Build Coastguard Worker      } else {
467*8975f5c5SAndroid Build Coastguard Worker        rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive {{libs}}"
468*8975f5c5SAndroid Build Coastguard Worker      }
469*8975f5c5SAndroid Build Coastguard Worker
470*8975f5c5SAndroid Build Coastguard Worker      description = "SOLINK $sofile"
471*8975f5c5SAndroid Build Coastguard Worker
472*8975f5c5SAndroid Build Coastguard Worker      # Use this for {{output_extension}} expansions unless a target manually
473*8975f5c5SAndroid Build Coastguard Worker      # overrides it (in which case {{output_extension}} will be what the target
474*8975f5c5SAndroid Build Coastguard Worker      # specifies).
475*8975f5c5SAndroid Build Coastguard Worker      default_output_extension = default_shlib_extension
476*8975f5c5SAndroid Build Coastguard Worker
477*8975f5c5SAndroid Build Coastguard Worker      default_output_dir = "{{root_out_dir}}${default_shlib_subdir}"
478*8975f5c5SAndroid Build Coastguard Worker
479*8975f5c5SAndroid Build Coastguard Worker      output_prefix = "lib"
480*8975f5c5SAndroid Build Coastguard Worker
481*8975f5c5SAndroid Build Coastguard Worker      # Since the above commands only updates the .TOC file when it changes, ask
482*8975f5c5SAndroid Build Coastguard Worker      # Ninja to check if the timestamp actually changed to know if downstream
483*8975f5c5SAndroid Build Coastguard Worker      # dependencies should be recompiled.
484*8975f5c5SAndroid Build Coastguard Worker      restat = true
485*8975f5c5SAndroid Build Coastguard Worker
486*8975f5c5SAndroid Build Coastguard Worker      # Tell GN about the output files. It will link to the sofile but use the
487*8975f5c5SAndroid Build Coastguard Worker      # tocfile for dependency management.
488*8975f5c5SAndroid Build Coastguard Worker      outputs = [
489*8975f5c5SAndroid Build Coastguard Worker        sofile,
490*8975f5c5SAndroid Build Coastguard Worker        tocfile,
491*8975f5c5SAndroid Build Coastguard Worker      ]
492*8975f5c5SAndroid Build Coastguard Worker      if (sofile != unstripped_sofile) {
493*8975f5c5SAndroid Build Coastguard Worker        outputs += [ unstripped_sofile ]
494*8975f5c5SAndroid Build Coastguard Worker        if (defined(invoker.use_unstripped_as_runtime_outputs) &&
495*8975f5c5SAndroid Build Coastguard Worker            invoker.use_unstripped_as_runtime_outputs) {
496*8975f5c5SAndroid Build Coastguard Worker          runtime_outputs = [ unstripped_sofile ]
497*8975f5c5SAndroid Build Coastguard Worker        }
498*8975f5c5SAndroid Build Coastguard Worker      }
499*8975f5c5SAndroid Build Coastguard Worker
500*8975f5c5SAndroid Build Coastguard Worker      # Clank build will generate DWP files when Fission is used.
501*8975f5c5SAndroid Build Coastguard Worker      # Other builds generate DWP files outside of the gn link targets, if at
502*8975f5c5SAndroid Build Coastguard Worker      # all.
503*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.dwp)) {
504*8975f5c5SAndroid Build Coastguard Worker        outputs += [ unstripped_sofile + ".dwp" ]
505*8975f5c5SAndroid Build Coastguard Worker        if (defined(invoker.use_unstripped_as_runtime_outputs) &&
506*8975f5c5SAndroid Build Coastguard Worker            invoker.use_unstripped_as_runtime_outputs) {
507*8975f5c5SAndroid Build Coastguard Worker          runtime_outputs += [ unstripped_sofile + ".dwp" ]
508*8975f5c5SAndroid Build Coastguard Worker        }
509*8975f5c5SAndroid Build Coastguard Worker      }
510*8975f5c5SAndroid Build Coastguard Worker      if (defined(map_file)) {
511*8975f5c5SAndroid Build Coastguard Worker        outputs += [ map_file ]
512*8975f5c5SAndroid Build Coastguard Worker      }
513*8975f5c5SAndroid Build Coastguard Worker      link_output = sofile
514*8975f5c5SAndroid Build Coastguard Worker      depend_output = tocfile
515*8975f5c5SAndroid Build Coastguard Worker    }
516*8975f5c5SAndroid Build Coastguard Worker
517*8975f5c5SAndroid Build Coastguard Worker    tool("solink_module") {
518*8975f5c5SAndroid Build Coastguard Worker      soname = "{{target_output_name}}{{output_extension}}"  # e.g. "libfoo.so".
519*8975f5c5SAndroid Build Coastguard Worker      sofile = "{{output_dir}}/$soname"
520*8975f5c5SAndroid Build Coastguard Worker      rspfile = sofile + ".rsp"
521*8975f5c5SAndroid Build Coastguard Worker
522*8975f5c5SAndroid Build Coastguard Worker      pool = "//build/toolchain:link_pool($default_toolchain)"
523*8975f5c5SAndroid Build Coastguard Worker
524*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.strip)) {
525*8975f5c5SAndroid Build Coastguard Worker        unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname"
526*8975f5c5SAndroid Build Coastguard Worker      } else {
527*8975f5c5SAndroid Build Coastguard Worker        unstripped_sofile = sofile
528*8975f5c5SAndroid Build Coastguard Worker      }
529*8975f5c5SAndroid Build Coastguard Worker
530*8975f5c5SAndroid Build Coastguard Worker      soname_flag = ""
531*8975f5c5SAndroid Build Coastguard Worker      whole_archive_flag = ""
532*8975f5c5SAndroid Build Coastguard Worker      no_whole_archive_flag = ""
533*8975f5c5SAndroid Build Coastguard Worker      if (current_os != "aix") {
534*8975f5c5SAndroid Build Coastguard Worker        # -soname, --whole-archive, --no-whole-archive flags are not available
535*8975f5c5SAndroid Build Coastguard Worker        # on aix ld
536*8975f5c5SAndroid Build Coastguard Worker        soname_flag = "-Wl,-soname=\"$soname\""
537*8975f5c5SAndroid Build Coastguard Worker        whole_archive_flag = "-Wl,--whole-archive"
538*8975f5c5SAndroid Build Coastguard Worker        no_whole_archive_flag = "-Wl,--no-whole-archive"
539*8975f5c5SAndroid Build Coastguard Worker      }
540*8975f5c5SAndroid Build Coastguard Worker      command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" $soname_flag @\"$rspfile\""
541*8975f5c5SAndroid Build Coastguard Worker
542*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.strip)) {
543*8975f5c5SAndroid Build Coastguard Worker        strip_command = "${invoker.strip} -o \"$sofile\" \"$unstripped_sofile\""
544*8975f5c5SAndroid Build Coastguard Worker        command += " && " + strip_command
545*8975f5c5SAndroid Build Coastguard Worker      }
546*8975f5c5SAndroid Build Coastguard Worker      rspfile_content = "$whole_archive_flag {{inputs}} {{solibs}} $no_whole_archive_flag {{libs}} {{rlibs}}"
547*8975f5c5SAndroid Build Coastguard Worker
548*8975f5c5SAndroid Build Coastguard Worker      description = "SOLINK_MODULE $sofile"
549*8975f5c5SAndroid Build Coastguard Worker
550*8975f5c5SAndroid Build Coastguard Worker      # Use this for {{output_extension}} expansions unless a target manually
551*8975f5c5SAndroid Build Coastguard Worker      # overrides it (in which case {{output_extension}} will be what the target
552*8975f5c5SAndroid Build Coastguard Worker      # specifies).
553*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.loadable_module_extension)) {
554*8975f5c5SAndroid Build Coastguard Worker        default_output_extension = invoker.loadable_module_extension
555*8975f5c5SAndroid Build Coastguard Worker      } else {
556*8975f5c5SAndroid Build Coastguard Worker        default_output_extension = default_shlib_extension
557*8975f5c5SAndroid Build Coastguard Worker      }
558*8975f5c5SAndroid Build Coastguard Worker
559*8975f5c5SAndroid Build Coastguard Worker      default_output_dir = "{{root_out_dir}}${default_shlib_subdir}"
560*8975f5c5SAndroid Build Coastguard Worker
561*8975f5c5SAndroid Build Coastguard Worker      output_prefix = "lib"
562*8975f5c5SAndroid Build Coastguard Worker
563*8975f5c5SAndroid Build Coastguard Worker      outputs = [ sofile ]
564*8975f5c5SAndroid Build Coastguard Worker      if (sofile != unstripped_sofile) {
565*8975f5c5SAndroid Build Coastguard Worker        outputs += [ unstripped_sofile ]
566*8975f5c5SAndroid Build Coastguard Worker        if (defined(invoker.use_unstripped_as_runtime_outputs) &&
567*8975f5c5SAndroid Build Coastguard Worker            invoker.use_unstripped_as_runtime_outputs) {
568*8975f5c5SAndroid Build Coastguard Worker          runtime_outputs = [ unstripped_sofile ]
569*8975f5c5SAndroid Build Coastguard Worker        }
570*8975f5c5SAndroid Build Coastguard Worker      }
571*8975f5c5SAndroid Build Coastguard Worker    }
572*8975f5c5SAndroid Build Coastguard Worker
573*8975f5c5SAndroid Build Coastguard Worker    tool("link") {
574*8975f5c5SAndroid Build Coastguard Worker      exename = "{{target_output_name}}{{output_extension}}"
575*8975f5c5SAndroid Build Coastguard Worker      outfile = "{{output_dir}}/$exename"
576*8975f5c5SAndroid Build Coastguard Worker      rspfile = "$outfile.rsp"
577*8975f5c5SAndroid Build Coastguard Worker      unstripped_outfile = outfile
578*8975f5c5SAndroid Build Coastguard Worker
579*8975f5c5SAndroid Build Coastguard Worker      pool = "//build/toolchain:link_pool($default_toolchain)"
580*8975f5c5SAndroid Build Coastguard Worker
581*8975f5c5SAndroid Build Coastguard Worker      # Use this for {{output_extension}} expansions unless a target manually
582*8975f5c5SAndroid Build Coastguard Worker      # overrides it (in which case {{output_extension}} will be what the target
583*8975f5c5SAndroid Build Coastguard Worker      # specifies).
584*8975f5c5SAndroid Build Coastguard Worker      default_output_extension = default_executable_extension
585*8975f5c5SAndroid Build Coastguard Worker
586*8975f5c5SAndroid Build Coastguard Worker      default_output_dir = "{{root_out_dir}}"
587*8975f5c5SAndroid Build Coastguard Worker
588*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.strip)) {
589*8975f5c5SAndroid Build Coastguard Worker        unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename"
590*8975f5c5SAndroid Build Coastguard Worker      }
591*8975f5c5SAndroid Build Coastguard Worker
592*8975f5c5SAndroid Build Coastguard Worker      start_group_flag = ""
593*8975f5c5SAndroid Build Coastguard Worker      end_group_flag = ""
594*8975f5c5SAndroid Build Coastguard Worker      if (current_os != "aix") {
595*8975f5c5SAndroid Build Coastguard Worker        # the "--start-group .. --end-group" feature isn't available on the aix
596*8975f5c5SAndroid Build Coastguard Worker        # ld.
597*8975f5c5SAndroid Build Coastguard Worker        start_group_flag = "-Wl,--start-group"
598*8975f5c5SAndroid Build Coastguard Worker        end_group_flag = "-Wl,--end-group "
599*8975f5c5SAndroid Build Coastguard Worker      }
600*8975f5c5SAndroid Build Coastguard Worker
601*8975f5c5SAndroid Build Coastguard Worker      # We need to specify link groups, at least, for single pass linkers. I.e.
602*8975f5c5SAndroid Build Coastguard Worker      # Rust libraries are alpha-sorted instead of by dependencies so they fail
603*8975f5c5SAndroid Build Coastguard Worker      # to link if not properly ordered or grouped.
604*8975f5c5SAndroid Build Coastguard Worker      link_command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\" $start_group_flag @\"$rspfile\" $end_group_flag {{solibs}} {{libs}} $start_group_flag {{rlibs}} $end_group_flag"
605*8975f5c5SAndroid Build Coastguard Worker
606*8975f5c5SAndroid Build Coastguard Worker      # Generate a map file to be used for binary size analysis.
607*8975f5c5SAndroid Build Coastguard Worker      # Map file adds ~10% to the link time on a z620.
608*8975f5c5SAndroid Build Coastguard Worker      # With target_os="android", libchrome.so.map.gz is ~20MB.
609*8975f5c5SAndroid Build Coastguard Worker      map_switch = ""
610*8975f5c5SAndroid Build Coastguard Worker      if (enable_linker_map) {
611*8975f5c5SAndroid Build Coastguard Worker        map_file = "$unstripped_outfile.map.gz"
612*8975f5c5SAndroid Build Coastguard Worker        map_switch = " --map-file \"$map_file\""
613*8975f5c5SAndroid Build Coastguard Worker      }
614*8975f5c5SAndroid Build Coastguard Worker
615*8975f5c5SAndroid Build Coastguard Worker      strip_switch = ""
616*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.strip)) {
617*8975f5c5SAndroid Build Coastguard Worker        strip_switch = " --strip=\"${invoker.strip}\" --unstripped-file=\"$unstripped_outfile\""
618*8975f5c5SAndroid Build Coastguard Worker      }
619*8975f5c5SAndroid Build Coastguard Worker
620*8975f5c5SAndroid Build Coastguard Worker      link_wrapper =
621*8975f5c5SAndroid Build Coastguard Worker          rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir)
622*8975f5c5SAndroid Build Coastguard Worker      command = "\"$python_path\" \"$link_wrapper\" --output=\"$outfile\"$strip_switch$map_switch$dwp_switch -- $link_command"
623*8975f5c5SAndroid Build Coastguard Worker
624*8975f5c5SAndroid Build Coastguard Worker      description = "LINK $outfile"
625*8975f5c5SAndroid Build Coastguard Worker
626*8975f5c5SAndroid Build Coastguard Worker      rspfile_content = "{{inputs}}"
627*8975f5c5SAndroid Build Coastguard Worker      outputs = [ outfile ]
628*8975f5c5SAndroid Build Coastguard Worker      if (outfile != unstripped_outfile) {
629*8975f5c5SAndroid Build Coastguard Worker        outputs += [ unstripped_outfile ]
630*8975f5c5SAndroid Build Coastguard Worker        if (defined(invoker.use_unstripped_as_runtime_outputs) &&
631*8975f5c5SAndroid Build Coastguard Worker            invoker.use_unstripped_as_runtime_outputs) {
632*8975f5c5SAndroid Build Coastguard Worker          runtime_outputs = [ unstripped_outfile ]
633*8975f5c5SAndroid Build Coastguard Worker        }
634*8975f5c5SAndroid Build Coastguard Worker      }
635*8975f5c5SAndroid Build Coastguard Worker
636*8975f5c5SAndroid Build Coastguard Worker      # Clank build will generate DWP files when Fission is used.
637*8975f5c5SAndroid Build Coastguard Worker      # Other builds generate DWP files outside of the gn link targets, if at
638*8975f5c5SAndroid Build Coastguard Worker      # all.
639*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.dwp)) {
640*8975f5c5SAndroid Build Coastguard Worker        outputs += [ unstripped_outfile + ".dwp" ]
641*8975f5c5SAndroid Build Coastguard Worker        if (defined(invoker.use_unstripped_as_runtime_outputs) &&
642*8975f5c5SAndroid Build Coastguard Worker            invoker.use_unstripped_as_runtime_outputs) {
643*8975f5c5SAndroid Build Coastguard Worker          runtime_outputs += [ unstripped_outfile + ".dwp" ]
644*8975f5c5SAndroid Build Coastguard Worker        }
645*8975f5c5SAndroid Build Coastguard Worker      }
646*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.link_outputs)) {
647*8975f5c5SAndroid Build Coastguard Worker        outputs += invoker.link_outputs
648*8975f5c5SAndroid Build Coastguard Worker      }
649*8975f5c5SAndroid Build Coastguard Worker      if (defined(map_file)) {
650*8975f5c5SAndroid Build Coastguard Worker        outputs += [ map_file ]
651*8975f5c5SAndroid Build Coastguard Worker      }
652*8975f5c5SAndroid Build Coastguard Worker    }
653*8975f5c5SAndroid Build Coastguard Worker
654*8975f5c5SAndroid Build Coastguard Worker    # These two are really entirely generic, but have to be repeated in
655*8975f5c5SAndroid Build Coastguard Worker    # each toolchain because GN doesn't allow a template to be used here.
656*8975f5c5SAndroid Build Coastguard Worker    # See //build/toolchain/toolchain.gni for details.
657*8975f5c5SAndroid Build Coastguard Worker    tool("stamp") {
658*8975f5c5SAndroid Build Coastguard Worker      command = stamp_command
659*8975f5c5SAndroid Build Coastguard Worker      description = stamp_description
660*8975f5c5SAndroid Build Coastguard Worker    }
661*8975f5c5SAndroid Build Coastguard Worker    tool("copy") {
662*8975f5c5SAndroid Build Coastguard Worker      command = copy_command
663*8975f5c5SAndroid Build Coastguard Worker      description = copy_description
664*8975f5c5SAndroid Build Coastguard Worker    }
665*8975f5c5SAndroid Build Coastguard Worker
666*8975f5c5SAndroid Build Coastguard Worker    tool("action") {
667*8975f5c5SAndroid Build Coastguard Worker      pool = "//build/toolchain:action_pool($default_toolchain)"
668*8975f5c5SAndroid Build Coastguard Worker    }
669*8975f5c5SAndroid Build Coastguard Worker
670*8975f5c5SAndroid Build Coastguard Worker    if (toolchain_has_rust) {
671*8975f5c5SAndroid Build Coastguard Worker      if (!defined(rust_compiler_prefix)) {
672*8975f5c5SAndroid Build Coastguard Worker        rust_compiler_prefix = ""
673*8975f5c5SAndroid Build Coastguard Worker      }
674*8975f5c5SAndroid Build Coastguard Worker      rust_sysroot_relative = rebase_path(rust_sysroot, root_build_dir)
675*8975f5c5SAndroid Build Coastguard Worker      rustc_bin = "$rust_sysroot_relative/bin/rustc"
676*8975f5c5SAndroid Build Coastguard Worker      rustc = "$rust_compiler_prefix${rustc_bin}"
677*8975f5c5SAndroid Build Coastguard Worker      rustc_wrapper =
678*8975f5c5SAndroid Build Coastguard Worker          rebase_path("//build/rust/rustc_wrapper.py", root_build_dir)
679*8975f5c5SAndroid Build Coastguard Worker
680*8975f5c5SAndroid Build Coastguard Worker      # RSP manipulation due to https://bugs.chromium.org/p/gn/issues/detail?id=249
681*8975f5c5SAndroid Build Coastguard Worker      tool("rust_staticlib") {
682*8975f5c5SAndroid Build Coastguard Worker        libname = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
683*8975f5c5SAndroid Build Coastguard Worker        rspfile = "$libname.rsp"
684*8975f5c5SAndroid Build Coastguard Worker        depfile = "$libname.d"
685*8975f5c5SAndroid Build Coastguard Worker
686*8975f5c5SAndroid Build Coastguard Worker        default_output_extension = ".a"
687*8975f5c5SAndroid Build Coastguard Worker        output_prefix = "lib"
688*8975f5c5SAndroid Build Coastguard Worker
689*8975f5c5SAndroid Build Coastguard Worker        # Static libraries go in the target out directory by default so we can
690*8975f5c5SAndroid Build Coastguard Worker        # generate different targets with the same name and not have them
691*8975f5c5SAndroid Build Coastguard Worker        # collide.
692*8975f5c5SAndroid Build Coastguard Worker        default_output_dir = "{{target_out_dir}}"
693*8975f5c5SAndroid Build Coastguard Worker        description = "RUST(STATICLIB) {{output}}"
694*8975f5c5SAndroid Build Coastguard Worker        outputs = [ libname ]
695*8975f5c5SAndroid Build Coastguard Worker
696*8975f5c5SAndroid Build Coastguard Worker        rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}"
697*8975f5c5SAndroid Build Coastguard Worker        command = "\"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $libname LDFLAGS RUSTENV {{rustenv}}"
698*8975f5c5SAndroid Build Coastguard Worker        rust_sysroot = rust_sysroot_relative
699*8975f5c5SAndroid Build Coastguard Worker      }
700*8975f5c5SAndroid Build Coastguard Worker
701*8975f5c5SAndroid Build Coastguard Worker      tool("rust_rlib") {
702*8975f5c5SAndroid Build Coastguard Worker        # We must always prefix with `lib` even if the library already starts
703*8975f5c5SAndroid Build Coastguard Worker        # with that prefix or else our stdlib is unable to find libc.rlib (or
704*8975f5c5SAndroid Build Coastguard Worker        # actually liblibc.rlib).
705*8975f5c5SAndroid Build Coastguard Worker        rlibname =
706*8975f5c5SAndroid Build Coastguard Worker            "{{output_dir}}/lib{{target_output_name}}{{output_extension}}"
707*8975f5c5SAndroid Build Coastguard Worker        rspfile = "$rlibname.rsp"
708*8975f5c5SAndroid Build Coastguard Worker        depfile = "$rlibname.d"
709*8975f5c5SAndroid Build Coastguard Worker
710*8975f5c5SAndroid Build Coastguard Worker        default_output_extension = ".rlib"
711*8975f5c5SAndroid Build Coastguard Worker
712*8975f5c5SAndroid Build Coastguard Worker        # This is prefixed unconditionally in `rlibname`.
713*8975f5c5SAndroid Build Coastguard Worker        # output_prefix = "lib"
714*8975f5c5SAndroid Build Coastguard Worker        # Static libraries go in the target out directory by default so we can
715*8975f5c5SAndroid Build Coastguard Worker        # generate different targets with the same name and not have them
716*8975f5c5SAndroid Build Coastguard Worker        # collide.
717*8975f5c5SAndroid Build Coastguard Worker        default_output_dir = "{{target_out_dir}}"
718*8975f5c5SAndroid Build Coastguard Worker        description = "RUST {{output}}"
719*8975f5c5SAndroid Build Coastguard Worker        outputs = [ rlibname ]
720*8975f5c5SAndroid Build Coastguard Worker
721*8975f5c5SAndroid Build Coastguard Worker        rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}"
722*8975f5c5SAndroid Build Coastguard Worker        command = "\"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rlibname LDFLAGS RUSTENV {{rustenv}}"
723*8975f5c5SAndroid Build Coastguard Worker        rust_sysroot = rust_sysroot_relative
724*8975f5c5SAndroid Build Coastguard Worker      }
725*8975f5c5SAndroid Build Coastguard Worker
726*8975f5c5SAndroid Build Coastguard Worker      tool("rust_bin") {
727*8975f5c5SAndroid Build Coastguard Worker        exename = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
728*8975f5c5SAndroid Build Coastguard Worker        depfile = "$exename.d"
729*8975f5c5SAndroid Build Coastguard Worker        rspfile = "$exename.rsp"
730*8975f5c5SAndroid Build Coastguard Worker        pool = "//build/toolchain:link_pool($default_toolchain)"
731*8975f5c5SAndroid Build Coastguard Worker
732*8975f5c5SAndroid Build Coastguard Worker        default_output_extension = default_executable_extension
733*8975f5c5SAndroid Build Coastguard Worker        default_output_dir = "{{root_out_dir}}"
734*8975f5c5SAndroid Build Coastguard Worker        description = "RUST(BIN) {{output}}"
735*8975f5c5SAndroid Build Coastguard Worker        outputs = [ exename ]
736*8975f5c5SAndroid Build Coastguard Worker
737*8975f5c5SAndroid Build Coastguard Worker        rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}"
738*8975f5c5SAndroid Build Coastguard Worker        command = "\"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $exename LDFLAGS {{ldflags}} ${extra_ldflags} RUSTENV {{rustenv}}"
739*8975f5c5SAndroid Build Coastguard Worker        rust_sysroot = rust_sysroot_relative
740*8975f5c5SAndroid Build Coastguard Worker      }
741*8975f5c5SAndroid Build Coastguard Worker
742*8975f5c5SAndroid Build Coastguard Worker      tool("rust_cdylib") {
743*8975f5c5SAndroid Build Coastguard Worker        dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
744*8975f5c5SAndroid Build Coastguard Worker        depfile = "$dllname.d"
745*8975f5c5SAndroid Build Coastguard Worker        rspfile = "$dllname.rsp"
746*8975f5c5SAndroid Build Coastguard Worker        pool = "//build/toolchain:link_pool($default_toolchain)"
747*8975f5c5SAndroid Build Coastguard Worker
748*8975f5c5SAndroid Build Coastguard Worker        default_output_extension = default_shlib_extension
749*8975f5c5SAndroid Build Coastguard Worker        output_prefix = "lib"
750*8975f5c5SAndroid Build Coastguard Worker        default_output_dir = "{{root_out_dir}}${default_shlib_subdir}"
751*8975f5c5SAndroid Build Coastguard Worker        description = "RUST(CDYLIB) {{output}}"
752*8975f5c5SAndroid Build Coastguard Worker        outputs = [ dllname ]
753*8975f5c5SAndroid Build Coastguard Worker
754*8975f5c5SAndroid Build Coastguard Worker        rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}"
755*8975f5c5SAndroid Build Coastguard Worker        command = "\"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $dllname LDFLAGS {{ldflags}} ${extra_ldflags} RUSTENV {{rustenv}}"
756*8975f5c5SAndroid Build Coastguard Worker        rust_sysroot = rust_sysroot_relative
757*8975f5c5SAndroid Build Coastguard Worker      }
758*8975f5c5SAndroid Build Coastguard Worker
759*8975f5c5SAndroid Build Coastguard Worker      tool("rust_macro") {
760*8975f5c5SAndroid Build Coastguard Worker        dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
761*8975f5c5SAndroid Build Coastguard Worker        depfile = "$dllname.d"
762*8975f5c5SAndroid Build Coastguard Worker        rspfile = "$dllname.rsp"
763*8975f5c5SAndroid Build Coastguard Worker        pool = "//build/toolchain:link_pool($default_toolchain)"
764*8975f5c5SAndroid Build Coastguard Worker
765*8975f5c5SAndroid Build Coastguard Worker        default_output_extension = default_shlib_extension
766*8975f5c5SAndroid Build Coastguard Worker        output_prefix = "lib"
767*8975f5c5SAndroid Build Coastguard Worker        default_output_dir = "{{root_out_dir}}${default_shlib_subdir}"
768*8975f5c5SAndroid Build Coastguard Worker        description = "RUST(MACRO) {{output}}"
769*8975f5c5SAndroid Build Coastguard Worker        outputs = [ dllname ]
770*8975f5c5SAndroid Build Coastguard Worker
771*8975f5c5SAndroid Build Coastguard Worker        rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}"
772*8975f5c5SAndroid Build Coastguard Worker        command = "\"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $dllname LDFLAGS {{ldflags}} ${extra_ldflags} RUSTENV {{rustenv}}"
773*8975f5c5SAndroid Build Coastguard Worker        rust_sysroot = rust_sysroot_relative
774*8975f5c5SAndroid Build Coastguard Worker      }
775*8975f5c5SAndroid Build Coastguard Worker    }
776*8975f5c5SAndroid Build Coastguard Worker
777*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
778*8975f5c5SAndroid Build Coastguard Worker                           [
779*8975f5c5SAndroid Build Coastguard Worker                             "deps",
780*8975f5c5SAndroid Build Coastguard Worker                             "propagates_configs",
781*8975f5c5SAndroid Build Coastguard Worker                           ])
782*8975f5c5SAndroid Build Coastguard Worker  }
783*8975f5c5SAndroid Build Coastguard Worker}
784*8975f5c5SAndroid Build Coastguard Worker
785*8975f5c5SAndroid Build Coastguard Worker# Make an additional toolchain which is used for making tools that are run
786*8975f5c5SAndroid Build Coastguard Worker# on the host machine as part of the build process (such as proc macros
787*8975f5c5SAndroid Build Coastguard Worker# and Cargo build scripts). This toolchain uses the prebuilt stdlib that
788*8975f5c5SAndroid Build Coastguard Worker# comes with the compiler, so it doesn't have to wait for the stdlib to be
789*8975f5c5SAndroid Build Coastguard Worker# built before building other stuff. And this ensures its proc macro
790*8975f5c5SAndroid Build Coastguard Worker# outputs have the right ABI to be loaded by the compiler, and it can be
791*8975f5c5SAndroid Build Coastguard Worker# used to compile build scripts that are part of the stdlib that is built
792*8975f5c5SAndroid Build Coastguard Worker# for the default toolchain.
793*8975f5c5SAndroid Build Coastguard Workertemplate("gcc_rust_host_build_tools_toolchain") {
794*8975f5c5SAndroid Build Coastguard Worker  single_gcc_toolchain(target_name) {
795*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.toolchain_args),
796*8975f5c5SAndroid Build Coastguard Worker           "Toolchains must declare toolchain_args")
797*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
798*8975f5c5SAndroid Build Coastguard Worker                           "*",
799*8975f5c5SAndroid Build Coastguard Worker                           TESTONLY_AND_VISIBILITY + [ "toolchain_args" ])
800*8975f5c5SAndroid Build Coastguard Worker    toolchain_args = {
801*8975f5c5SAndroid Build Coastguard Worker      # Populate toolchain args from the invoker.
802*8975f5c5SAndroid Build Coastguard Worker      forward_variables_from(invoker.toolchain_args, "*")
803*8975f5c5SAndroid Build Coastguard Worker      toolchain_for_rust_host_build_tools = true
804*8975f5c5SAndroid Build Coastguard Worker
805*8975f5c5SAndroid Build Coastguard Worker      # The host build tools are static release builds to make the Chromium
806*8975f5c5SAndroid Build Coastguard Worker      # build faster.
807*8975f5c5SAndroid Build Coastguard Worker      is_debug = false
808*8975f5c5SAndroid Build Coastguard Worker      is_component_build = false
809*8975f5c5SAndroid Build Coastguard Worker      is_official_build = false
810*8975f5c5SAndroid Build Coastguard Worker      use_clang_coverage = false
811*8975f5c5SAndroid Build Coastguard Worker      use_sanitizer_coverage = false
812*8975f5c5SAndroid Build Coastguard Worker      generate_linker_map = false
813*8975f5c5SAndroid Build Coastguard Worker      use_thin_lto = false
814*8975f5c5SAndroid Build Coastguard Worker    }
815*8975f5c5SAndroid Build Coastguard Worker
816*8975f5c5SAndroid Build Coastguard Worker    # When cross-compiling we don't want to use the target platform's file
817*8975f5c5SAndroid Build Coastguard Worker    # extensions.
818*8975f5c5SAndroid Build Coastguard Worker    shlib_extension = host_shlib_extension
819*8975f5c5SAndroid Build Coastguard Worker  }
820*8975f5c5SAndroid Build Coastguard Worker}
821*8975f5c5SAndroid Build Coastguard Worker
822*8975f5c5SAndroid Build Coastguard Worker# If PartitionAlloc is part of the build (even as a transitive dependency), then
823*8975f5c5SAndroid Build Coastguard Worker# it replaces the system allocator. If this toolchain is used, that will be
824*8975f5c5SAndroid Build Coastguard Worker# overridden and the system allocator will be used regardless. This is important
825*8975f5c5SAndroid Build Coastguard Worker# in some third-party binaries outside of Chrome.
826*8975f5c5SAndroid Build Coastguard Workertemplate("gcc_system_allocator_toolchain") {
827*8975f5c5SAndroid Build Coastguard Worker  single_gcc_toolchain(target_name) {
828*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.toolchain_args),
829*8975f5c5SAndroid Build Coastguard Worker           "Toolchains must declare toolchain_args")
830*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
831*8975f5c5SAndroid Build Coastguard Worker                           "*",
832*8975f5c5SAndroid Build Coastguard Worker                           TESTONLY_AND_VISIBILITY + [ "toolchain_args" ])
833*8975f5c5SAndroid Build Coastguard Worker    toolchain_args = {
834*8975f5c5SAndroid Build Coastguard Worker      # Populate toolchain args from the invoker.
835*8975f5c5SAndroid Build Coastguard Worker      forward_variables_from(invoker.toolchain_args, "*")
836*8975f5c5SAndroid Build Coastguard Worker      toolchain_allows_use_partition_alloc_as_malloc = false
837*8975f5c5SAndroid Build Coastguard Worker
838*8975f5c5SAndroid Build Coastguard Worker      # Disable component build so that we can copy the exes to the
839*8975f5c5SAndroid Build Coastguard Worker      # root_build_dir and support the default_toolchain redirection on Windows.
840*8975f5c5SAndroid Build Coastguard Worker      # See also the comment in //build/symlink.gni.
841*8975f5c5SAndroid Build Coastguard Worker      is_component_build = false
842*8975f5c5SAndroid Build Coastguard Worker
843*8975f5c5SAndroid Build Coastguard Worker      # Only one toolchain can be configured with MSAN support with our current
844*8975f5c5SAndroid Build Coastguard Worker      # GN setup, or they all try to make the instrumented libraries and
845*8975f5c5SAndroid Build Coastguard Worker      # collide.
846*8975f5c5SAndroid Build Coastguard Worker      is_msan = false
847*8975f5c5SAndroid Build Coastguard Worker    }
848*8975f5c5SAndroid Build Coastguard Worker  }
849*8975f5c5SAndroid Build Coastguard Worker}
850*8975f5c5SAndroid Build Coastguard Worker
851*8975f5c5SAndroid Build Coastguard Worker# Makes a GCC toolchain for the target, and an equivalent toolchain with the
852*8975f5c5SAndroid Build Coastguard Worker# prebuilt Rust stdlib for building proc macros (and other for-build-use
853*8975f5c5SAndroid Build Coastguard Worker# artifacts).
854*8975f5c5SAndroid Build Coastguard Workertemplate("gcc_toolchain") {
855*8975f5c5SAndroid Build Coastguard Worker  single_gcc_toolchain(target_name) {
856*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.toolchain_args),
857*8975f5c5SAndroid Build Coastguard Worker           "Toolchains must declare toolchain_args")
858*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
859*8975f5c5SAndroid Build Coastguard Worker
860*8975f5c5SAndroid Build Coastguard Worker    # No need to forward visibility and test_only as they apply to targets not
861*8975f5c5SAndroid Build Coastguard Worker    # toolchains, but presubmit checks require that we explicitly exclude them
862*8975f5c5SAndroid Build Coastguard Worker  }
863*8975f5c5SAndroid Build Coastguard Worker
864*8975f5c5SAndroid Build Coastguard Worker  gcc_rust_host_build_tools_toolchain(
865*8975f5c5SAndroid Build Coastguard Worker      "${target_name}_for_rust_host_build_tools") {
866*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.toolchain_args),
867*8975f5c5SAndroid Build Coastguard Worker           "Toolchains must declare toolchain_args")
868*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
869*8975f5c5SAndroid Build Coastguard Worker  }
870*8975f5c5SAndroid Build Coastguard Worker
871*8975f5c5SAndroid Build Coastguard Worker  gcc_system_allocator_toolchain("${target_name}_host_with_system_allocator") {
872*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.toolchain_args),
873*8975f5c5SAndroid Build Coastguard Worker           "Toolchains must declare toolchain_args")
874*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
875*8975f5c5SAndroid Build Coastguard Worker  }
876*8975f5c5SAndroid Build Coastguard Worker  gcc_system_allocator_toolchain("${target_name}_with_system_allocator") {
877*8975f5c5SAndroid Build Coastguard Worker    assert(defined(invoker.toolchain_args),
878*8975f5c5SAndroid Build Coastguard Worker           "Toolchains must declare toolchain_args")
879*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
880*8975f5c5SAndroid Build Coastguard Worker  }
881*8975f5c5SAndroid Build Coastguard Worker}
882*8975f5c5SAndroid Build Coastguard Worker
883*8975f5c5SAndroid Build Coastguard Worker# This is a shorthand for gcc_toolchain instances based on the Chromium-built
884*8975f5c5SAndroid Build Coastguard Worker# version of Clang. Only the toolchain_cpu and toolchain_os variables need to
885*8975f5c5SAndroid Build Coastguard Worker# be specified by the invoker, and optionally toolprefix if it's a
886*8975f5c5SAndroid Build Coastguard Worker# cross-compile case. Note that for a cross-compile case this toolchain
887*8975f5c5SAndroid Build Coastguard Worker# requires a config to pass the appropriate -target option, or else it will
888*8975f5c5SAndroid Build Coastguard Worker# actually just be doing a native compile.
889*8975f5c5SAndroid Build Coastguard Workertemplate("clang_toolchain") {
890*8975f5c5SAndroid Build Coastguard Worker  gcc_toolchain(target_name) {
891*8975f5c5SAndroid Build Coastguard Worker    _path = "$clang_base_path/bin"
892*8975f5c5SAndroid Build Coastguard Worker    _is_path_absolute = get_path_info(_path, "abspath") == _path
893*8975f5c5SAndroid Build Coastguard Worker
894*8975f5c5SAndroid Build Coastguard Worker    # Preserve absolute paths for tools like distcc.
895*8975f5c5SAndroid Build Coastguard Worker    if (_is_path_absolute && filter_include([ _path ], [ "//*" ]) == []) {
896*8975f5c5SAndroid Build Coastguard Worker      prefix = _path
897*8975f5c5SAndroid Build Coastguard Worker    } else {
898*8975f5c5SAndroid Build Coastguard Worker      prefix = rebase_path(_path, root_build_dir)
899*8975f5c5SAndroid Build Coastguard Worker    }
900*8975f5c5SAndroid Build Coastguard Worker
901*8975f5c5SAndroid Build Coastguard Worker    cc = "${prefix}/clang"
902*8975f5c5SAndroid Build Coastguard Worker    cxx = "${prefix}/clang++"
903*8975f5c5SAndroid Build Coastguard Worker    ld = cxx
904*8975f5c5SAndroid Build Coastguard Worker    readelf = "${prefix}/llvm-readelf"
905*8975f5c5SAndroid Build Coastguard Worker    ar = "${prefix}/llvm-ar"
906*8975f5c5SAndroid Build Coastguard Worker    nm = "${prefix}/llvm-nm"
907*8975f5c5SAndroid Build Coastguard Worker
908*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, "*", [ "toolchain_args" ])
909*8975f5c5SAndroid Build Coastguard Worker
910*8975f5c5SAndroid Build Coastguard Worker    toolchain_args = {
911*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.toolchain_args)) {
912*8975f5c5SAndroid Build Coastguard Worker        forward_variables_from(invoker.toolchain_args, "*")
913*8975f5c5SAndroid Build Coastguard Worker      }
914*8975f5c5SAndroid Build Coastguard Worker      is_clang = true
915*8975f5c5SAndroid Build Coastguard Worker    }
916*8975f5c5SAndroid Build Coastguard Worker  }
917*8975f5c5SAndroid Build Coastguard Worker}
918