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