xref: /aosp_15_r20/external/angle/build/rust/cargo_crate.gni (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker# Copyright 2021 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/rust/rust_executable.gni")
6*8975f5c5SAndroid Build Coastguard Workerimport("//build/rust/rust_macro.gni")
7*8975f5c5SAndroid Build Coastguard Workerimport("//build/rust/rust_static_library.gni")
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker# This template allows for building Cargo crates within gn.
10*8975f5c5SAndroid Build Coastguard Worker#
11*8975f5c5SAndroid Build Coastguard Worker# It is intended for use with pre-existing (third party) code and
12*8975f5c5SAndroid Build Coastguard Worker# is none too efficient. (It will stall the build pipeline whilst
13*8975f5c5SAndroid Build Coastguard Worker# it runs build scripts to work out what flags are needed). First
14*8975f5c5SAndroid Build Coastguard Worker# party code should directly use first-class gn targets, such as
15*8975f5c5SAndroid Build Coastguard Worker# //build/rust/rust_static_library.gni or similar.
16*8975f5c5SAndroid Build Coastguard Worker#
17*8975f5c5SAndroid Build Coastguard Worker# Because it's intended for third-party code, it automatically
18*8975f5c5SAndroid Build Coastguard Worker# defaults to //build/config/compiler:no_chromium_code which
19*8975f5c5SAndroid Build Coastguard Worker# suppresses some warnings. If you *do* use this for first party
20*8975f5c5SAndroid Build Coastguard Worker# code, you should remove that config and add the equivalent
21*8975f5c5SAndroid Build Coastguard Worker# //build/config/compiler:chromium_code config.
22*8975f5c5SAndroid Build Coastguard Worker#
23*8975f5c5SAndroid Build Coastguard Worker# Arguments:
24*8975f5c5SAndroid Build Coastguard Worker#  sources
25*8975f5c5SAndroid Build Coastguard Worker#  crate_root
26*8975f5c5SAndroid Build Coastguard Worker#  deps
27*8975f5c5SAndroid Build Coastguard Worker#  aliased_deps
28*8975f5c5SAndroid Build Coastguard Worker#  features
29*8975f5c5SAndroid Build Coastguard Worker#  build_native_rust_unit_tests
30*8975f5c5SAndroid Build Coastguard Worker#  edition
31*8975f5c5SAndroid Build Coastguard Worker#  crate_name
32*8975f5c5SAndroid Build Coastguard Worker#    All just as in rust_static_library.gni
33*8975f5c5SAndroid Build Coastguard Worker#  library_configs/executable_configs
34*8975f5c5SAndroid Build Coastguard Worker#    All just as in rust_target.gni
35*8975f5c5SAndroid Build Coastguard Worker#
36*8975f5c5SAndroid Build Coastguard Worker#  epoch (optional)
37*8975f5c5SAndroid Build Coastguard Worker#    The major version of the library, which is used to differentiate between
38*8975f5c5SAndroid Build Coastguard Worker#    multiple versions of the same library name. This includes all leading 0s
39*8975f5c5SAndroid Build Coastguard Worker#    and the first non-zero value in the crate's version. This should be left
40*8975f5c5SAndroid Build Coastguard Worker#    as the default, which is "0", for first-party code unless there are
41*8975f5c5SAndroid Build Coastguard Worker#    multiple versions of a crate present. For third-party code, the version
42*8975f5c5SAndroid Build Coastguard Worker#    epoch (matching the directory it is found in) should be specified.
43*8975f5c5SAndroid Build Coastguard Worker#
44*8975f5c5SAndroid Build Coastguard Worker#    Examples:
45*8975f5c5SAndroid Build Coastguard Worker#      1.0.2 => epoch = "1"
46*8975f5c5SAndroid Build Coastguard Worker#      4.2.0 => epoch = "4"
47*8975f5c5SAndroid Build Coastguard Worker#      0.2.7 => epoch = "0.2"
48*8975f5c5SAndroid Build Coastguard Worker#      0.0.3 => epoch = "0.0.3"
49*8975f5c5SAndroid Build Coastguard Worker#
50*8975f5c5SAndroid Build Coastguard Worker#  dev_deps
51*8975f5c5SAndroid Build Coastguard Worker#    Same meaning as test_deps in rust_static_library.gni, but called
52*8975f5c5SAndroid Build Coastguard Worker#    dev_deps to match Cargo.toml better.
53*8975f5c5SAndroid Build Coastguard Worker#
54*8975f5c5SAndroid Build Coastguard Worker#  build_root (optional)
55*8975f5c5SAndroid Build Coastguard Worker#    Filename of build.rs build script.
56*8975f5c5SAndroid Build Coastguard Worker#
57*8975f5c5SAndroid Build Coastguard Worker#  build_deps (optional)
58*8975f5c5SAndroid Build Coastguard Worker#    Build script dependencies
59*8975f5c5SAndroid Build Coastguard Worker#
60*8975f5c5SAndroid Build Coastguard Worker#  build_sources (optional)
61*8975f5c5SAndroid Build Coastguard Worker#    List of sources for build script. Must be specified if
62*8975f5c5SAndroid Build Coastguard Worker#    build_root is specified.
63*8975f5c5SAndroid Build Coastguard Worker#
64*8975f5c5SAndroid Build Coastguard Worker#  build_script_outputs (optional)
65*8975f5c5SAndroid Build Coastguard Worker#    List of .rs files generated by the build script, if any.
66*8975f5c5SAndroid Build Coastguard Worker#    Fine to leave undefined even if you have a build script.
67*8975f5c5SAndroid Build Coastguard Worker#    This doesn't directly correspond to any Cargo variable,
68*8975f5c5SAndroid Build Coastguard Worker#    but unfortunately is necessary for gn to build its dependency
69*8975f5c5SAndroid Build Coastguard Worker#    trees automatically.
70*8975f5c5SAndroid Build Coastguard Worker#    Many build scripts just output --cfg directives, in which case
71*8975f5c5SAndroid Build Coastguard Worker#    no source code is generated and this can remain empty.
72*8975f5c5SAndroid Build Coastguard Worker#
73*8975f5c5SAndroid Build Coastguard Worker#  build_script_inputs (optional)
74*8975f5c5SAndroid Build Coastguard Worker#    If the build script reads any files generated by build_deps,
75*8975f5c5SAndroid Build Coastguard Worker#    as opposed to merely linking against them, add a list of such
76*8975f5c5SAndroid Build Coastguard Worker#    files here. Again, this doesn't correspond to a Cargo variable
77*8975f5c5SAndroid Build Coastguard Worker#    but is necessary for gn.
78*8975f5c5SAndroid Build Coastguard Worker#
79*8975f5c5SAndroid Build Coastguard Worker#  native_libs (optional)
80*8975f5c5SAndroid Build Coastguard Worker#    Paths to library files that need to be in the linking search path when
81*8975f5c5SAndroid Build Coastguard Worker#    depending on the crate's library, as it links against them via #[link]
82*8975f5c5SAndroid Build Coastguard Worker#    directives.
83*8975f5c5SAndroid Build Coastguard Worker#
84*8975f5c5SAndroid Build Coastguard Worker#  crate_type "bin", "proc-macro" or "rlib" (optional)
85*8975f5c5SAndroid Build Coastguard Worker#    Whether to build an executable. The default is "rlib".
86*8975f5c5SAndroid Build Coastguard Worker#    At present others are not supported.
87*8975f5c5SAndroid Build Coastguard Worker#
88*8975f5c5SAndroid Build Coastguard Worker#  cargo_pkg_authors
89*8975f5c5SAndroid Build Coastguard Worker#  cargo_pkg_version
90*8975f5c5SAndroid Build Coastguard Worker#  cargo_pkg_name
91*8975f5c5SAndroid Build Coastguard Worker#  cargo_pkg_description
92*8975f5c5SAndroid Build Coastguard Worker#    Strings as found within 'version' and similar fields within Cargo.toml.
93*8975f5c5SAndroid Build Coastguard Worker#    Converted to environment variables passed to rustc, in case the crate
94*8975f5c5SAndroid Build Coastguard Worker#    uses clap `crate_version!` or `crate_authors!` macros (fairly common in
95*8975f5c5SAndroid Build Coastguard Worker#    command line tool help)
96*8975f5c5SAndroid Build Coastguard Worker
97*8975f5c5SAndroid Build Coastguard Workertemplate("cargo_crate") {
98*8975f5c5SAndroid Build Coastguard Worker  _orig_target_name = target_name
99*8975f5c5SAndroid Build Coastguard Worker
100*8975f5c5SAndroid Build Coastguard Worker  _crate_name = _orig_target_name
101*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.crate_name)) {
102*8975f5c5SAndroid Build Coastguard Worker    _crate_name = invoker.crate_name
103*8975f5c5SAndroid Build Coastguard Worker  }
104*8975f5c5SAndroid Build Coastguard Worker
105*8975f5c5SAndroid Build Coastguard Worker  # Construct metadata from the crate epoch or an explicitly provided metadata
106*8975f5c5SAndroid Build Coastguard Worker  # field.
107*8975f5c5SAndroid Build Coastguard Worker  _rustc_metadata = ""
108*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.rustc_metadata)) {
109*8975f5c5SAndroid Build Coastguard Worker    _rustc_metadata = invoker.rustc_metadata
110*8975f5c5SAndroid Build Coastguard Worker  } else if (defined(invoker.epoch)) {
111*8975f5c5SAndroid Build Coastguard Worker    _rustc_metadata = "${_crate_name}-${invoker.epoch}"
112*8975f5c5SAndroid Build Coastguard Worker  }
113*8975f5c5SAndroid Build Coastguard Worker
114*8975f5c5SAndroid Build Coastguard Worker  # Executables need to have unique names. Work out a prefix.
115*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.build_root)) {
116*8975f5c5SAndroid Build Coastguard Worker    _epochlabel = "vunknown"
117*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.epoch)) {
118*8975f5c5SAndroid Build Coastguard Worker      _tempepoch = string_replace(invoker.epoch, ".", "_")
119*8975f5c5SAndroid Build Coastguard Worker      _epochlabel = "v${_tempepoch}"
120*8975f5c5SAndroid Build Coastguard Worker    }
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker    # This name includes the target name to ensure it's unique for each possible
123*8975f5c5SAndroid Build Coastguard Worker    # build target in the same BUILD.gn file.
124*8975f5c5SAndroid Build Coastguard Worker    _build_script_name =
125*8975f5c5SAndroid Build Coastguard Worker        "${_crate_name}_${target_name}_${_epochlabel}_build_script"
126*8975f5c5SAndroid Build Coastguard Worker
127*8975f5c5SAndroid Build Coastguard Worker    # Where the OUT_DIR will point when running the build script exe, and
128*8975f5c5SAndroid Build Coastguard Worker    # compiling the crate library/binaries. This directory must include the
129*8975f5c5SAndroid Build Coastguard Worker    # target name to avoid collisions between multiple GN targets that exist
130*8975f5c5SAndroid Build Coastguard Worker    # in the same BUILD.gn.
131*8975f5c5SAndroid Build Coastguard Worker    _build_script_env_out_dir = "$target_gen_dir/$target_name"
132*8975f5c5SAndroid Build Coastguard Worker  }
133*8975f5c5SAndroid Build Coastguard Worker
134*8975f5c5SAndroid Build Coastguard Worker  _rustenv = []
135*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.rustenv)) {
136*8975f5c5SAndroid Build Coastguard Worker    _rustenv = invoker.rustenv
137*8975f5c5SAndroid Build Coastguard Worker  }
138*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.cargo_pkg_authors)) {
139*8975f5c5SAndroid Build Coastguard Worker    _rustenv += [ "CARGO_PKG_AUTHORS=${invoker.cargo_pkg_authors}" ]
140*8975f5c5SAndroid Build Coastguard Worker  }
141*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.cargo_pkg_version)) {
142*8975f5c5SAndroid Build Coastguard Worker    _rustenv += [ "CARGO_PKG_VERSION=${invoker.cargo_pkg_version}" ]
143*8975f5c5SAndroid Build Coastguard Worker  }
144*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.cargo_pkg_name)) {
145*8975f5c5SAndroid Build Coastguard Worker    _rustenv += [ "CARGO_PKG_NAME=${invoker.cargo_pkg_name}" ]
146*8975f5c5SAndroid Build Coastguard Worker  }
147*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.cargo_pkg_description)) {
148*8975f5c5SAndroid Build Coastguard Worker    _rustenv += [ "CARGO_PKG_DESCRIPTION=${invoker.cargo_pkg_description}" ]
149*8975f5c5SAndroid Build Coastguard Worker  }
150*8975f5c5SAndroid Build Coastguard Worker
151*8975f5c5SAndroid Build Coastguard Worker  # Try to determine the CARGO_MANIFEST_DIR, preferring the directory
152*8975f5c5SAndroid Build Coastguard Worker  # with build.rs and otherwise assuming that the target contains a
153*8975f5c5SAndroid Build Coastguard Worker  # `crate/` subdirectory.
154*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.build_root)) {
155*8975f5c5SAndroid Build Coastguard Worker    manifest_dir = "."
156*8975f5c5SAndroid Build Coastguard Worker  } else {
157*8975f5c5SAndroid Build Coastguard Worker    build_gn_dir = get_label_info(target_name, "dir")
158*8975f5c5SAndroid Build Coastguard Worker    manifest_dir = rebase_path(build_gn_dir + "/crate", root_build_dir)
159*8975f5c5SAndroid Build Coastguard Worker  }
160*8975f5c5SAndroid Build Coastguard Worker  _rustenv += [ "CARGO_MANIFEST_DIR=${manifest_dir}" ]
161*8975f5c5SAndroid Build Coastguard Worker
162*8975f5c5SAndroid Build Coastguard Worker  # cargo_crate() should set library_configs, executable_configs,
163*8975f5c5SAndroid Build Coastguard Worker  # proc_macro_configs. Not configs.
164*8975f5c5SAndroid Build Coastguard Worker  assert(!defined(invoker.configs))
165*8975f5c5SAndroid Build Coastguard Worker
166*8975f5c5SAndroid Build Coastguard Worker  # Work out what we're building.
167*8975f5c5SAndroid Build Coastguard Worker  _crate_type = "rlib"
168*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.crate_type)) {
169*8975f5c5SAndroid Build Coastguard Worker    _crate_type = invoker.crate_type
170*8975f5c5SAndroid Build Coastguard Worker  }
171*8975f5c5SAndroid Build Coastguard Worker  if (_crate_type == "cdylib") {
172*8975f5c5SAndroid Build Coastguard Worker    # Crates are rarely cdylibs. The example encountered so far aims
173*8975f5c5SAndroid Build Coastguard Worker    # to expose a C API to other code. In a Chromium context, we don't
174*8975f5c5SAndroid Build Coastguard Worker    # want to build that as a dylib for a couple of reasons:
175*8975f5c5SAndroid Build Coastguard Worker    # * rust_shared_library does not work on Mac. rustc does not know
176*8975f5c5SAndroid Build Coastguard Worker    #   how to export the __llvm_profile_raw_version symbol.
177*8975f5c5SAndroid Build Coastguard Worker    # * even if it did work, this might require us to distribute extra
178*8975f5c5SAndroid Build Coastguard Worker    #   binaries (.so/.dylib etc.)
179*8975f5c5SAndroid Build Coastguard Worker    # For the only case we've had so far, it makes more sense to build
180*8975f5c5SAndroid Build Coastguard Worker    # the code as a static library which we can then link into downstream
181*8975f5c5SAndroid Build Coastguard Worker    # binaries.
182*8975f5c5SAndroid Build Coastguard Worker    _crate_type = "rlib"
183*8975f5c5SAndroid Build Coastguard Worker  }
184*8975f5c5SAndroid Build Coastguard Worker  if (_crate_type == "bin") {
185*8975f5c5SAndroid Build Coastguard Worker    _target_type = "rust_executable"
186*8975f5c5SAndroid Build Coastguard Worker    assert(!defined(invoker.epoch))
187*8975f5c5SAndroid Build Coastguard Worker    _configs = invoker.executable_configs
188*8975f5c5SAndroid Build Coastguard Worker  } else if (_crate_type == "proc-macro") {
189*8975f5c5SAndroid Build Coastguard Worker    _target_type = "rust_macro"
190*8975f5c5SAndroid Build Coastguard Worker    _configs = invoker.proc_macro_configs
191*8975f5c5SAndroid Build Coastguard Worker  } else {
192*8975f5c5SAndroid Build Coastguard Worker    assert(_crate_type == "rlib")
193*8975f5c5SAndroid Build Coastguard Worker    _target_type = "rust_static_library"
194*8975f5c5SAndroid Build Coastguard Worker    _configs = invoker.library_configs
195*8975f5c5SAndroid Build Coastguard Worker  }
196*8975f5c5SAndroid Build Coastguard Worker
197*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.output_name)) {
198*8975f5c5SAndroid Build Coastguard Worker    _output_name = invoker.output_name
199*8975f5c5SAndroid Build Coastguard Worker  } else if (_crate_type != "bin") {
200*8975f5c5SAndroid Build Coastguard Worker    # Note that file names of libraries must start with the crate name in
201*8975f5c5SAndroid Build Coastguard Worker    # order for the compiler to find transitive dependencies in the
202*8975f5c5SAndroid Build Coastguard Worker    # directory search paths (since they are not all explicitly specified).
203*8975f5c5SAndroid Build Coastguard Worker    #
204*8975f5c5SAndroid Build Coastguard Worker    # For bin targets, we expect the target name to be unique, and the name
205*8975f5c5SAndroid Build Coastguard Worker    # of the exe should not add magic stuff to it. And bin crates can not be
206*8975f5c5SAndroid Build Coastguard Worker    # transitive dependencies.
207*8975f5c5SAndroid Build Coastguard Worker    _output_name = "${_crate_name}_${_orig_target_name}"
208*8975f5c5SAndroid Build Coastguard Worker  }
209*8975f5c5SAndroid Build Coastguard Worker
210*8975f5c5SAndroid Build Coastguard Worker  _testonly = false
211*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.testonly)) {
212*8975f5c5SAndroid Build Coastguard Worker    _testonly = invoker.testonly
213*8975f5c5SAndroid Build Coastguard Worker  }
214*8975f5c5SAndroid Build Coastguard Worker
215*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.native_libs)) {
216*8975f5c5SAndroid Build Coastguard Worker    _native_libs_action = "copy_${target_name}_native_libs"
217*8975f5c5SAndroid Build Coastguard Worker    _native_libs_config = "config_${target_name}_native_libs"
218*8975f5c5SAndroid Build Coastguard Worker    _native_libs_dir =
219*8975f5c5SAndroid Build Coastguard Worker        "${root_out_dir}/rustlib/${_crate_name}_${target_name}_${_epochlabel}"
220*8975f5c5SAndroid Build Coastguard Worker
221*8975f5c5SAndroid Build Coastguard Worker    copy(_native_libs_action) {
222*8975f5c5SAndroid Build Coastguard Worker      testonly = _testonly
223*8975f5c5SAndroid Build Coastguard Worker      visibility = [ ":$target_name" ]
224*8975f5c5SAndroid Build Coastguard Worker      sources = invoker.native_libs
225*8975f5c5SAndroid Build Coastguard Worker      outputs = [ "${_native_libs_dir}/{{source_file_part}}" ]
226*8975f5c5SAndroid Build Coastguard Worker    }
227*8975f5c5SAndroid Build Coastguard Worker    config(_native_libs_config) {
228*8975f5c5SAndroid Build Coastguard Worker      lib_dirs = [ "${_native_libs_dir}" ]
229*8975f5c5SAndroid Build Coastguard Worker    }
230*8975f5c5SAndroid Build Coastguard Worker  }
231*8975f5c5SAndroid Build Coastguard Worker
232*8975f5c5SAndroid Build Coastguard Worker  # The main target, either a Rust source set or an executable.
233*8975f5c5SAndroid Build Coastguard Worker  target(_target_type, target_name) {
234*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
235*8975f5c5SAndroid Build Coastguard Worker                           "*",
236*8975f5c5SAndroid Build Coastguard Worker                           TESTONLY_AND_VISIBILITY + [
237*8975f5c5SAndroid Build Coastguard Worker                                 "build_root",
238*8975f5c5SAndroid Build Coastguard Worker                                 "build_deps",
239*8975f5c5SAndroid Build Coastguard Worker                                 "build_sources",
240*8975f5c5SAndroid Build Coastguard Worker                                 "build_script_inputs",
241*8975f5c5SAndroid Build Coastguard Worker                                 "build_script_outputs",
242*8975f5c5SAndroid Build Coastguard Worker                                 "epoch",
243*8975f5c5SAndroid Build Coastguard Worker                                 "unit_test_target",
244*8975f5c5SAndroid Build Coastguard Worker                                 "configs",
245*8975f5c5SAndroid Build Coastguard Worker                                 "executable_configs",
246*8975f5c5SAndroid Build Coastguard Worker                                 "library_configs",
247*8975f5c5SAndroid Build Coastguard Worker                                 "proc_macro_configs",
248*8975f5c5SAndroid Build Coastguard Worker                                 "rustenv",
249*8975f5c5SAndroid Build Coastguard Worker                                 "dev_deps",
250*8975f5c5SAndroid Build Coastguard Worker                                 "native_libs_dir",
251*8975f5c5SAndroid Build Coastguard Worker                               ])
252*8975f5c5SAndroid Build Coastguard Worker
253*8975f5c5SAndroid Build Coastguard Worker    testonly = _testonly
254*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.visibility)) {
255*8975f5c5SAndroid Build Coastguard Worker      visibility = invoker.visibility
256*8975f5c5SAndroid Build Coastguard Worker    }
257*8975f5c5SAndroid Build Coastguard Worker    if (defined(crate_type) && crate_type == "cdylib") {
258*8975f5c5SAndroid Build Coastguard Worker      # See comments above about cdylib.
259*8975f5c5SAndroid Build Coastguard Worker      crate_type = "rlib"
260*8975f5c5SAndroid Build Coastguard Worker    }
261*8975f5c5SAndroid Build Coastguard Worker    crate_name = _crate_name
262*8975f5c5SAndroid Build Coastguard Worker
263*8975f5c5SAndroid Build Coastguard Worker    if (defined(_output_name)) {
264*8975f5c5SAndroid Build Coastguard Worker      output_name = _output_name
265*8975f5c5SAndroid Build Coastguard Worker    }
266*8975f5c5SAndroid Build Coastguard Worker
267*8975f5c5SAndroid Build Coastguard Worker    # Don't import the `chromium` crate into third-party code.
268*8975f5c5SAndroid Build Coastguard Worker    no_chromium_prelude = true
269*8975f5c5SAndroid Build Coastguard Worker
270*8975f5c5SAndroid Build Coastguard Worker    rustc_metadata = _rustc_metadata
271*8975f5c5SAndroid Build Coastguard Worker
272*8975f5c5SAndroid Build Coastguard Worker    # TODO(crbug.com/40259764): don't default to true. This requires changes to
273*8975f5c5SAndroid Build Coastguard Worker    # third_party.toml and gnrt when generating third-party build targets.
274*8975f5c5SAndroid Build Coastguard Worker    allow_unsafe = true
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker    configs = []
277*8975f5c5SAndroid Build Coastguard Worker    configs = _configs
278*8975f5c5SAndroid Build Coastguard Worker    if (_crate_type == "rlib") {
279*8975f5c5SAndroid Build Coastguard Worker      # Forward configs for unit tests.
280*8975f5c5SAndroid Build Coastguard Worker      executable_configs = invoker.executable_configs
281*8975f5c5SAndroid Build Coastguard Worker    }
282*8975f5c5SAndroid Build Coastguard Worker
283*8975f5c5SAndroid Build Coastguard Worker    if (!defined(rustflags)) {
284*8975f5c5SAndroid Build Coastguard Worker      rustflags = []
285*8975f5c5SAndroid Build Coastguard Worker    }
286*8975f5c5SAndroid Build Coastguard Worker    rustenv = _rustenv
287*8975f5c5SAndroid Build Coastguard Worker
288*8975f5c5SAndroid Build Coastguard Worker    if (!defined(build_native_rust_unit_tests)) {
289*8975f5c5SAndroid Build Coastguard Worker      build_native_rust_unit_tests = _crate_type != "proc-macro"
290*8975f5c5SAndroid Build Coastguard Worker    }
291*8975f5c5SAndroid Build Coastguard Worker    if (build_native_rust_unit_tests) {
292*8975f5c5SAndroid Build Coastguard Worker      # Unit tests in a proc-macro crate type don't make sense, you can't
293*8975f5c5SAndroid Build Coastguard Worker      # compile executables against the `proc_macro` crate.
294*8975f5c5SAndroid Build Coastguard Worker      assert(_crate_type != "proc-macro")
295*8975f5c5SAndroid Build Coastguard Worker    }
296*8975f5c5SAndroid Build Coastguard Worker
297*8975f5c5SAndroid Build Coastguard Worker    # The unit tests for each target, if generated, should be unique as well.
298*8975f5c5SAndroid Build Coastguard Worker    # a) It needs to be unique even if multiple build targets have the same
299*8975f5c5SAndroid Build Coastguard Worker    #    `crate_name`, but different target names.
300*8975f5c5SAndroid Build Coastguard Worker    # b) It needs to be unique even if multiple build targets have the same
301*8975f5c5SAndroid Build Coastguard Worker    #    `crate_name` and target name, but different epochs.
302*8975f5c5SAndroid Build Coastguard Worker    _unit_test_unique_target_name = ""
303*8975f5c5SAndroid Build Coastguard Worker    if (_crate_name != _orig_target_name) {
304*8975f5c5SAndroid Build Coastguard Worker      _unit_test_unique_target_name = "${_orig_target_name}_"
305*8975f5c5SAndroid Build Coastguard Worker    }
306*8975f5c5SAndroid Build Coastguard Worker    _unit_test_unique_epoch = ""
307*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.epoch)) {
308*8975f5c5SAndroid Build Coastguard Worker      _epoch_str = string_replace(invoker.epoch, ".", "_")
309*8975f5c5SAndroid Build Coastguard Worker      _unit_test_unique_epoch = "v${_epoch_str}_"
310*8975f5c5SAndroid Build Coastguard Worker    }
311*8975f5c5SAndroid Build Coastguard Worker    if (defined(output_dir) && output_dir != "") {
312*8975f5c5SAndroid Build Coastguard Worker      unit_test_output_dir = output_dir
313*8975f5c5SAndroid Build Coastguard Worker    }
314*8975f5c5SAndroid Build Coastguard Worker    unit_test_target = "${_unit_test_unique_target_name}${_crate_name}_${_unit_test_unique_epoch}unittests"
315*8975f5c5SAndroid Build Coastguard Worker
316*8975f5c5SAndroid Build Coastguard Worker    if ((!defined(output_dir) || output_dir == "") && _crate_type == "rlib") {
317*8975f5c5SAndroid Build Coastguard Worker      # Cargo crate rlibs can be compiled differently for tests, and must not
318*8975f5c5SAndroid Build Coastguard Worker      # collide with the production outputs. This does *not* override the
319*8975f5c5SAndroid Build Coastguard Worker      # unit_test_output_dir, which is set above, as that target is not an rlib.
320*8975f5c5SAndroid Build Coastguard Worker      output_dir = "$target_out_dir/$_orig_target_name"
321*8975f5c5SAndroid Build Coastguard Worker    }
322*8975f5c5SAndroid Build Coastguard Worker
323*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.dev_deps)) {
324*8975f5c5SAndroid Build Coastguard Worker      test_deps = invoker.dev_deps
325*8975f5c5SAndroid Build Coastguard Worker    }
326*8975f5c5SAndroid Build Coastguard Worker
327*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.build_root)) {
328*8975f5c5SAndroid Build Coastguard Worker      # Uh-oh, we have a build script
329*8975f5c5SAndroid Build Coastguard Worker      if (!defined(deps)) {
330*8975f5c5SAndroid Build Coastguard Worker        deps = []
331*8975f5c5SAndroid Build Coastguard Worker      }
332*8975f5c5SAndroid Build Coastguard Worker      if (!defined(sources)) {
333*8975f5c5SAndroid Build Coastguard Worker        sources = []
334*8975f5c5SAndroid Build Coastguard Worker      }
335*8975f5c5SAndroid Build Coastguard Worker      if (!defined(inputs)) {
336*8975f5c5SAndroid Build Coastguard Worker        inputs = []
337*8975f5c5SAndroid Build Coastguard Worker      }
338*8975f5c5SAndroid Build Coastguard Worker
339*8975f5c5SAndroid Build Coastguard Worker      # This... is a bit weird. We generate a file called cargo_flags.rs which
340*8975f5c5SAndroid Build Coastguard Worker      # does not actually contain Rust code, but instead some flags to add
341*8975f5c5SAndroid Build Coastguard Worker      # to the rustc command line. We need it to end in a .rs extension so that
342*8975f5c5SAndroid Build Coastguard Worker      # we can include it in the 'sources' line and thus have dependency
343*8975f5c5SAndroid Build Coastguard Worker      # calculation done correctly. data_deps won't work because targets don't
344*8975f5c5SAndroid Build Coastguard Worker      # require them to be present until runtime.
345*8975f5c5SAndroid Build Coastguard Worker      flags_file = "$_build_script_env_out_dir/cargo_flags.rs"
346*8975f5c5SAndroid Build Coastguard Worker      rustflags += [ "@" + rebase_path(flags_file, root_build_dir) ]
347*8975f5c5SAndroid Build Coastguard Worker      sources += [ flags_file ]
348*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.build_script_outputs)) {
349*8975f5c5SAndroid Build Coastguard Worker        # Build scripts may output arbitrary files. They are usually included in
350*8975f5c5SAndroid Build Coastguard Worker        # the main Rust target using include! or include_str! and therefore the
351*8975f5c5SAndroid Build Coastguard Worker        # filename may be .rs or may be arbitrary. We want to educate ninja
352*8975f5c5SAndroid Build Coastguard Worker        # about the dependency either way.
353*8975f5c5SAndroid Build Coastguard Worker        foreach(extra_source,
354*8975f5c5SAndroid Build Coastguard Worker                filter_include(invoker.build_script_outputs, [ "*.rs" ])) {
355*8975f5c5SAndroid Build Coastguard Worker          sources += [ "$_build_script_env_out_dir/$extra_source" ]
356*8975f5c5SAndroid Build Coastguard Worker        }
357*8975f5c5SAndroid Build Coastguard Worker        foreach(extra_source,
358*8975f5c5SAndroid Build Coastguard Worker                filter_exclude(invoker.build_script_outputs, [ "*.rs" ])) {
359*8975f5c5SAndroid Build Coastguard Worker          inputs += [ "$_build_script_env_out_dir/$extra_source" ]
360*8975f5c5SAndroid Build Coastguard Worker        }
361*8975f5c5SAndroid Build Coastguard Worker      }
362*8975f5c5SAndroid Build Coastguard Worker      deps += [ ":${_build_script_name}_output" ]
363*8975f5c5SAndroid Build Coastguard Worker      if (defined(_native_libs_action)) {
364*8975f5c5SAndroid Build Coastguard Worker        deps += [ ":${_native_libs_action}" ]
365*8975f5c5SAndroid Build Coastguard Worker        configs += [ ":${_native_libs_config}" ]
366*8975f5c5SAndroid Build Coastguard Worker      }
367*8975f5c5SAndroid Build Coastguard Worker    }
368*8975f5c5SAndroid Build Coastguard Worker  }
369*8975f5c5SAndroid Build Coastguard Worker
370*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.build_root)) {
371*8975f5c5SAndroid Build Coastguard Worker    action("${_build_script_name}_write_rustflags") {
372*8975f5c5SAndroid Build Coastguard Worker      _rustflags_txt = "$_build_script_env_out_dir/rustflags.txt"
373*8975f5c5SAndroid Build Coastguard Worker      outputs = [ _rustflags_txt ]
374*8975f5c5SAndroid Build Coastguard Worker      script = rebase_path("//build/rust/write_rustflags.py")
375*8975f5c5SAndroid Build Coastguard Worker      args = [
376*8975f5c5SAndroid Build Coastguard Worker        "--output",
377*8975f5c5SAndroid Build Coastguard Worker        rebase_path(_rustflags_txt, root_build_dir),
378*8975f5c5SAndroid Build Coastguard Worker        "--",
379*8975f5c5SAndroid Build Coastguard Worker        "{{rustflags}}",
380*8975f5c5SAndroid Build Coastguard Worker      ]
381*8975f5c5SAndroid Build Coastguard Worker
382*8975f5c5SAndroid Build Coastguard Worker      # The configs are required to get `{{rustflags}}` so that the build script
383*8975f5c5SAndroid Build Coastguard Worker      # is compiled with the same flags as the library/binary will be. The build
384*8975f5c5SAndroid Build Coastguard Worker      # script is an executable so it also gets the executable configs. If this
385*8975f5c5SAndroid Build Coastguard Worker      # is ever a problem we can add a separate build_script_configs to the
386*8975f5c5SAndroid Build Coastguard Worker      # cargo_crate template and just have it default to the same thing as
387*8975f5c5SAndroid Build Coastguard Worker      # executable_configs.
388*8975f5c5SAndroid Build Coastguard Worker      configs = invoker.executable_configs
389*8975f5c5SAndroid Build Coastguard Worker    }
390*8975f5c5SAndroid Build Coastguard Worker
391*8975f5c5SAndroid Build Coastguard Worker    # Extra targets required to make build script work
392*8975f5c5SAndroid Build Coastguard Worker    action("${_build_script_name}_output") {
393*8975f5c5SAndroid Build Coastguard Worker      script = rebase_path("//build/rust/run_build_script.py")
394*8975f5c5SAndroid Build Coastguard Worker      _write_rustflags_outputs =
395*8975f5c5SAndroid Build Coastguard Worker          get_target_outputs(":${_build_script_name}_write_rustflags")
396*8975f5c5SAndroid Build Coastguard Worker      _rustflags_txt = _write_rustflags_outputs[0]
397*8975f5c5SAndroid Build Coastguard Worker      inputs = [
398*8975f5c5SAndroid Build Coastguard Worker        "//build/action_helpers.py",
399*8975f5c5SAndroid Build Coastguard Worker        "//build/gn_helpers.py",
400*8975f5c5SAndroid Build Coastguard Worker        _rustflags_txt,
401*8975f5c5SAndroid Build Coastguard Worker      ]
402*8975f5c5SAndroid Build Coastguard Worker      build_script_target = ":${_build_script_name}($rust_macro_toolchain)"
403*8975f5c5SAndroid Build Coastguard Worker      deps = [
404*8975f5c5SAndroid Build Coastguard Worker        ":${_build_script_name}_write_rustflags",
405*8975f5c5SAndroid Build Coastguard Worker        build_script_target,
406*8975f5c5SAndroid Build Coastguard Worker      ]
407*8975f5c5SAndroid Build Coastguard Worker      testonly = _testonly
408*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.visibility)) {
409*8975f5c5SAndroid Build Coastguard Worker        visibility = invoker.visibility
410*8975f5c5SAndroid Build Coastguard Worker      }
411*8975f5c5SAndroid Build Coastguard Worker
412*8975f5c5SAndroid Build Coastguard Worker      # The build script may be built with a different toolchain when
413*8975f5c5SAndroid Build Coastguard Worker      # cross-compiling (the host toolchain) so we must find the path relative
414*8975f5c5SAndroid Build Coastguard Worker      # to that.
415*8975f5c5SAndroid Build Coastguard Worker      _build_script_root_out_dir =
416*8975f5c5SAndroid Build Coastguard Worker          get_label_info(build_script_target, "root_out_dir")
417*8975f5c5SAndroid Build Coastguard Worker      _build_script_exe = "$_build_script_root_out_dir/$_build_script_name"
418*8975f5c5SAndroid Build Coastguard Worker
419*8975f5c5SAndroid Build Coastguard Worker      # The executable is always built with the `rust_macro_toolchain` which
420*8975f5c5SAndroid Build Coastguard Worker      # targets the `host_os`. The rule here is on the `target_toolchain` which
421*8975f5c5SAndroid Build Coastguard Worker      # can be different (e.g. compiling on Linux, targeting Windows).
422*8975f5c5SAndroid Build Coastguard Worker      if (host_os == "win") {
423*8975f5c5SAndroid Build Coastguard Worker        _build_script_exe = "${_build_script_exe}.exe"
424*8975f5c5SAndroid Build Coastguard Worker      }
425*8975f5c5SAndroid Build Coastguard Worker
426*8975f5c5SAndroid Build Coastguard Worker      _flags_file = "$_build_script_env_out_dir/cargo_flags.rs"
427*8975f5c5SAndroid Build Coastguard Worker
428*8975f5c5SAndroid Build Coastguard Worker      inputs += [ _build_script_exe ]
429*8975f5c5SAndroid Build Coastguard Worker      outputs = [ _flags_file ]
430*8975f5c5SAndroid Build Coastguard Worker      args = [
431*8975f5c5SAndroid Build Coastguard Worker        "--build-script",
432*8975f5c5SAndroid Build Coastguard Worker        rebase_path(_build_script_exe, root_build_dir),
433*8975f5c5SAndroid Build Coastguard Worker        "--output",
434*8975f5c5SAndroid Build Coastguard Worker        rebase_path(_flags_file, root_build_dir),
435*8975f5c5SAndroid Build Coastguard Worker        "--rust-prefix",
436*8975f5c5SAndroid Build Coastguard Worker        rebase_path("${rust_sysroot}/bin", root_build_dir),
437*8975f5c5SAndroid Build Coastguard Worker        "--out-dir",
438*8975f5c5SAndroid Build Coastguard Worker        rebase_path(_build_script_env_out_dir, root_build_dir),
439*8975f5c5SAndroid Build Coastguard Worker        "--src-dir",
440*8975f5c5SAndroid Build Coastguard Worker        rebase_path(get_path_info(invoker.build_root, "dir"), root_build_dir),
441*8975f5c5SAndroid Build Coastguard Worker        "--target",
442*8975f5c5SAndroid Build Coastguard Worker        rust_abi_target,
443*8975f5c5SAndroid Build Coastguard Worker        "--rustflags",
444*8975f5c5SAndroid Build Coastguard Worker        rebase_path(_rustflags_txt, root_build_dir),
445*8975f5c5SAndroid Build Coastguard Worker      ]
446*8975f5c5SAndroid Build Coastguard Worker      if (cargo_target_abi != "") {
447*8975f5c5SAndroid Build Coastguard Worker        args += [
448*8975f5c5SAndroid Build Coastguard Worker          "--target-abi",
449*8975f5c5SAndroid Build Coastguard Worker          cargo_target_abi,
450*8975f5c5SAndroid Build Coastguard Worker        ]
451*8975f5c5SAndroid Build Coastguard Worker      }
452*8975f5c5SAndroid Build Coastguard Worker      if (current_cpu == "arm64" || current_cpu == "x64" ||
453*8975f5c5SAndroid Build Coastguard Worker          current_cpu == "loong64" || current_cpu == "riscv64") {
454*8975f5c5SAndroid Build Coastguard Worker        args += [
455*8975f5c5SAndroid Build Coastguard Worker          "--pointer-width",
456*8975f5c5SAndroid Build Coastguard Worker          "64",
457*8975f5c5SAndroid Build Coastguard Worker        ]
458*8975f5c5SAndroid Build Coastguard Worker      } else if (current_cpu == "arm" || current_cpu == "x86") {
459*8975f5c5SAndroid Build Coastguard Worker        args += [
460*8975f5c5SAndroid Build Coastguard Worker          "--pointer-width",
461*8975f5c5SAndroid Build Coastguard Worker          "32",
462*8975f5c5SAndroid Build Coastguard Worker        ]
463*8975f5c5SAndroid Build Coastguard Worker      } else {
464*8975f5c5SAndroid Build Coastguard Worker        assert(false, "Architecture not supported")
465*8975f5c5SAndroid Build Coastguard Worker      }
466*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.features)) {
467*8975f5c5SAndroid Build Coastguard Worker        args += [ "--features" ]
468*8975f5c5SAndroid Build Coastguard Worker        args += invoker.features
469*8975f5c5SAndroid Build Coastguard Worker      }
470*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.build_script_outputs)) {
471*8975f5c5SAndroid Build Coastguard Worker        args += [ "--generated-files" ]
472*8975f5c5SAndroid Build Coastguard Worker        args += invoker.build_script_outputs
473*8975f5c5SAndroid Build Coastguard Worker        foreach(generated_file, invoker.build_script_outputs) {
474*8975f5c5SAndroid Build Coastguard Worker          outputs += [ "$_build_script_env_out_dir/$generated_file" ]
475*8975f5c5SAndroid Build Coastguard Worker        }
476*8975f5c5SAndroid Build Coastguard Worker      }
477*8975f5c5SAndroid Build Coastguard Worker      if (_rustenv != []) {
478*8975f5c5SAndroid Build Coastguard Worker        args += [ "--env" ]
479*8975f5c5SAndroid Build Coastguard Worker        args += _rustenv
480*8975f5c5SAndroid Build Coastguard Worker      }
481*8975f5c5SAndroid Build Coastguard Worker      if (defined(invoker.build_script_inputs)) {
482*8975f5c5SAndroid Build Coastguard Worker        inputs += invoker.build_script_inputs
483*8975f5c5SAndroid Build Coastguard Worker      }
484*8975f5c5SAndroid Build Coastguard Worker    }
485*8975f5c5SAndroid Build Coastguard Worker
486*8975f5c5SAndroid Build Coastguard Worker    if (toolchain_for_rust_host_build_tools) {
487*8975f5c5SAndroid Build Coastguard Worker      # The build script is only available to be built on the host, and we use
488*8975f5c5SAndroid Build Coastguard Worker      # the rust_macro_toolchain for it to unblock building them while the
489*8975f5c5SAndroid Build Coastguard Worker      # Chromium stdlib is still being compiled.
490*8975f5c5SAndroid Build Coastguard Worker      rust_executable(_build_script_name) {
491*8975f5c5SAndroid Build Coastguard Worker        crate_name = _build_script_name
492*8975f5c5SAndroid Build Coastguard Worker        sources = invoker.build_sources
493*8975f5c5SAndroid Build Coastguard Worker        crate_root = invoker.build_root
494*8975f5c5SAndroid Build Coastguard Worker        testonly = _testonly
495*8975f5c5SAndroid Build Coastguard Worker        if (defined(invoker.visibility)) {
496*8975f5c5SAndroid Build Coastguard Worker          visibility = invoker.visibility
497*8975f5c5SAndroid Build Coastguard Worker        }
498*8975f5c5SAndroid Build Coastguard Worker        if (defined(invoker.build_deps)) {
499*8975f5c5SAndroid Build Coastguard Worker          deps = invoker.build_deps
500*8975f5c5SAndroid Build Coastguard Worker        }
501*8975f5c5SAndroid Build Coastguard Worker        if (defined(invoker.build_script_inputs)) {
502*8975f5c5SAndroid Build Coastguard Worker          inputs = invoker.build_script_inputs
503*8975f5c5SAndroid Build Coastguard Worker        }
504*8975f5c5SAndroid Build Coastguard Worker
505*8975f5c5SAndroid Build Coastguard Worker        # Don't import the `chromium` crate into third-party code.
506*8975f5c5SAndroid Build Coastguard Worker        no_chromium_prelude = true
507*8975f5c5SAndroid Build Coastguard Worker
508*8975f5c5SAndroid Build Coastguard Worker        # The ${_build_script_name}_output target looks for the exe in this
509*8975f5c5SAndroid Build Coastguard Worker        # location. Due to how the Windows component build works, this has to
510*8975f5c5SAndroid Build Coastguard Worker        # be $root_out_dir for all EXEs. In component build, C++ links to the
511*8975f5c5SAndroid Build Coastguard Worker        # CRT as a DLL, and if Rust does not match, we can't link mixed target
512*8975f5c5SAndroid Build Coastguard Worker        # Rust EXE/DLLs, as the headers in C++ said something different than
513*8975f5c5SAndroid Build Coastguard Worker        # what Rust links. Since the CRT DLL is placed in the $root_out_dir,
514*8975f5c5SAndroid Build Coastguard Worker        # an EXE can find it if it's also placed in that dir.
515*8975f5c5SAndroid Build Coastguard Worker        output_dir = root_out_dir
516*8975f5c5SAndroid Build Coastguard Worker        rustenv = _rustenv
517*8975f5c5SAndroid Build Coastguard Worker        forward_variables_from(invoker,
518*8975f5c5SAndroid Build Coastguard Worker                               [
519*8975f5c5SAndroid Build Coastguard Worker                                 "features",
520*8975f5c5SAndroid Build Coastguard Worker                                 "edition",
521*8975f5c5SAndroid Build Coastguard Worker                                 "rustflags",
522*8975f5c5SAndroid Build Coastguard Worker                               ])
523*8975f5c5SAndroid Build Coastguard Worker        configs -= [
524*8975f5c5SAndroid Build Coastguard Worker          "//build/config/compiler:chromium_code",
525*8975f5c5SAndroid Build Coastguard Worker
526*8975f5c5SAndroid Build Coastguard Worker          # Avoid generating profiling data for build scripts.
527*8975f5c5SAndroid Build Coastguard Worker          #
528*8975f5c5SAndroid Build Coastguard Worker          # TODO(crbug.com/40261306): determine for sure whether to remove this
529*8975f5c5SAndroid Build Coastguard Worker          # config. I'm not sure of the overlap between PGO instrumentation and
530*8975f5c5SAndroid Build Coastguard Worker          # code coverage instrumentation, but we definitely don't want build
531*8975f5c5SAndroid Build Coastguard Worker          # script coverage for PGO, while we might for test coverage metrics.
532*8975f5c5SAndroid Build Coastguard Worker          #
533*8975f5c5SAndroid Build Coastguard Worker          # If we do include build script output in test metrics, it could be
534*8975f5c5SAndroid Build Coastguard Worker          # misleading: exercising some code from a build script doesn't give us
535*8975f5c5SAndroid Build Coastguard Worker          # the same signal as an actual test.
536*8975f5c5SAndroid Build Coastguard Worker          "//build/config/coverage:default_coverage",
537*8975f5c5SAndroid Build Coastguard Worker        ]
538*8975f5c5SAndroid Build Coastguard Worker        configs += [ "//build/config/compiler:no_chromium_code" ]
539*8975f5c5SAndroid Build Coastguard Worker      }
540*8975f5c5SAndroid Build Coastguard Worker    } else {
541*8975f5c5SAndroid Build Coastguard Worker      not_needed(invoker,
542*8975f5c5SAndroid Build Coastguard Worker                 [
543*8975f5c5SAndroid Build Coastguard Worker                   "build_sources",
544*8975f5c5SAndroid Build Coastguard Worker                   "build_deps",
545*8975f5c5SAndroid Build Coastguard Worker                   "build_root",
546*8975f5c5SAndroid Build Coastguard Worker                   "build_script_inputs",
547*8975f5c5SAndroid Build Coastguard Worker                   "build_script_outputs",
548*8975f5c5SAndroid Build Coastguard Worker                 ])
549*8975f5c5SAndroid Build Coastguard Worker    }
550*8975f5c5SAndroid Build Coastguard Worker  } else {
551*8975f5c5SAndroid Build Coastguard Worker    not_needed([
552*8975f5c5SAndroid Build Coastguard Worker                 "_name_specific_output_dir",
553*8975f5c5SAndroid Build Coastguard Worker                 "_orig_target_name",
554*8975f5c5SAndroid Build Coastguard Worker               ])
555*8975f5c5SAndroid Build Coastguard Worker  }
556*8975f5c5SAndroid Build Coastguard Worker}
557*8975f5c5SAndroid Build Coastguard Worker
558*8975f5c5SAndroid Build Coastguard Workerset_defaults("cargo_crate") {
559*8975f5c5SAndroid Build Coastguard Worker  library_configs = default_compiler_configs
560*8975f5c5SAndroid Build Coastguard Worker  executable_configs = default_executable_configs
561*8975f5c5SAndroid Build Coastguard Worker  proc_macro_configs = default_rust_proc_macro_configs
562*8975f5c5SAndroid Build Coastguard Worker}
563