xref: /aosp_15_r20/external/cronet/build/rust/std/BUILD.gn (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2021 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker# This file provides the Rust standard library for GN targets.
6*6777b538SAndroid Build Coastguard Worker#
7*6777b538SAndroid Build Coastguard Worker# For Rust targets, it either copies a prebuilt stdlib or builds a stdlib, and
8*6777b538SAndroid Build Coastguard Worker# then points rustc to it with `--sysroot`.
9*6777b538SAndroid Build Coastguard Worker#
10*6777b538SAndroid Build Coastguard Worker# When linking it ensures the libraries (and their C library dependencies) are
11*6777b538SAndroid Build Coastguard Worker# part of the linker line. If Rust drives the linking, this is redundant but if
12*6777b538SAndroid Build Coastguard Worker# Clang drives the linking it is required.
13*6777b538SAndroid Build Coastguard Worker#
14*6777b538SAndroid Build Coastguard Worker# Part of the standard library provided here is "remap_alloc" which maps
15*6777b538SAndroid Build Coastguard Worker# allocator functions into the shim provided by PartitionAlloc so that Rust and
16*6777b538SAndroid Build Coastguard Worker# C++ use the same allocator backend.
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Workerimport("//build/config/compiler/compiler.gni")
19*6777b538SAndroid Build Coastguard Workerimport("//build/config/coverage/coverage.gni")
20*6777b538SAndroid Build Coastguard Workerimport("//build/config/rust.gni")
21*6777b538SAndroid Build Coastguard Workerimport("//build/config/sanitizers/sanitizers.gni")
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Workerif (toolchain_has_rust) {
24*6777b538SAndroid Build Coastguard Worker  # Equivalent of allocator symbols injected by rustc.
25*6777b538SAndroid Build Coastguard Worker  source_set("remap_alloc") {
26*6777b538SAndroid Build Coastguard Worker    sources = [
27*6777b538SAndroid Build Coastguard Worker      # `alias.*`, `compiler_specific.h`, and `immediate_crash.*` have been
28*6777b538SAndroid Build Coastguard Worker      # copied from `//base`.
29*6777b538SAndroid Build Coastguard Worker      # TODO(https://crbug.com/1475734): Avoid duplication / reuse code.
30*6777b538SAndroid Build Coastguard Worker      "alias.cc",
31*6777b538SAndroid Build Coastguard Worker      "alias.h",
32*6777b538SAndroid Build Coastguard Worker      "compiler_specific.h",
33*6777b538SAndroid Build Coastguard Worker      "immediate_crash.h",
34*6777b538SAndroid Build Coastguard Worker      "remap_alloc.cc",
35*6777b538SAndroid Build Coastguard Worker    ]
36*6777b538SAndroid Build Coastguard Worker  }
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker  # List of Rust stdlib rlibs which are present in the official Rust toolchain
39*6777b538SAndroid Build Coastguard Worker  # we are using from the Android team. This is usually a version or two behind
40*6777b538SAndroid Build Coastguard Worker  # nightly. Generally this matches the toolchain we build ourselves, but if
41*6777b538SAndroid Build Coastguard Worker  # they differ, append or remove libraries based on the
42*6777b538SAndroid Build Coastguard Worker  # `use_chromium_rust_toolchain` GN variable.
43*6777b538SAndroid Build Coastguard Worker  #
44*6777b538SAndroid Build Coastguard Worker  # If the build fails due to missing symbols, it would be because of a missing
45*6777b538SAndroid Build Coastguard Worker  # library that needs to be added here in a newer stdlib.
46*6777b538SAndroid Build Coastguard Worker  stdlib_files = [
47*6777b538SAndroid Build Coastguard Worker    "std",  # List first because it makes depfiles more debuggable (see below)
48*6777b538SAndroid Build Coastguard Worker    "alloc",
49*6777b538SAndroid Build Coastguard Worker    "cfg_if",
50*6777b538SAndroid Build Coastguard Worker    "compiler_builtins",
51*6777b538SAndroid Build Coastguard Worker    "core",
52*6777b538SAndroid Build Coastguard Worker    "getopts",
53*6777b538SAndroid Build Coastguard Worker    "hashbrown",
54*6777b538SAndroid Build Coastguard Worker    "libc",
55*6777b538SAndroid Build Coastguard Worker    "panic_abort",
56*6777b538SAndroid Build Coastguard Worker    "panic_unwind",
57*6777b538SAndroid Build Coastguard Worker    "rustc_demangle",
58*6777b538SAndroid Build Coastguard Worker    "std_detect",
59*6777b538SAndroid Build Coastguard Worker    "test",
60*6777b538SAndroid Build Coastguard Worker    "unicode_width",
61*6777b538SAndroid Build Coastguard Worker    "unwind",
62*6777b538SAndroid Build Coastguard Worker  ]
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker  if (!is_win) {
65*6777b538SAndroid Build Coastguard Worker    # These are no longer present in the Windows toolchain.
66*6777b538SAndroid Build Coastguard Worker    stdlib_files += [
67*6777b538SAndroid Build Coastguard Worker      "addr2line",
68*6777b538SAndroid Build Coastguard Worker      "adler",
69*6777b538SAndroid Build Coastguard Worker      "gimli",
70*6777b538SAndroid Build Coastguard Worker      "memchr",
71*6777b538SAndroid Build Coastguard Worker      "miniz_oxide",
72*6777b538SAndroid Build Coastguard Worker      "object",
73*6777b538SAndroid Build Coastguard Worker    ]
74*6777b538SAndroid Build Coastguard Worker  }
75*6777b538SAndroid Build Coastguard Worker
76*6777b538SAndroid Build Coastguard Worker  if (toolchain_for_rust_host_build_tools) {
77*6777b538SAndroid Build Coastguard Worker    # When building proc macros, include the proc_macro crate in what should be
78*6777b538SAndroid Build Coastguard Worker    # copied with find_stdlib. Otherwise it is not copied since it will be
79*6777b538SAndroid Build Coastguard Worker    # unused.
80*6777b538SAndroid Build Coastguard Worker    stdlib_files += [ "proc_macro" ]
81*6777b538SAndroid Build Coastguard Worker  }
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker  # Different Rust toolchains may add or remove files relative to the above
84*6777b538SAndroid Build Coastguard Worker  # list. That can be specified in gn args for anyone using (for instance)
85*6777b538SAndroid Build Coastguard Worker  # nightly or some other experimental toolchain, prior to it becoming official.
86*6777b538SAndroid Build Coastguard Worker  stdlib_files -= removed_rust_stdlib_libs
87*6777b538SAndroid Build Coastguard Worker  stdlib_files += added_rust_stdlib_libs
88*6777b538SAndroid Build Coastguard Worker
89*6777b538SAndroid Build Coastguard Worker  # rlib files which are distributed alongside Rust's prebuilt stdlib, but we
90*6777b538SAndroid Build Coastguard Worker  # don't need to pass to the C++ linker because they're used for specialized
91*6777b538SAndroid Build Coastguard Worker  # purposes.
92*6777b538SAndroid Build Coastguard Worker  skip_stdlib_files = [
93*6777b538SAndroid Build Coastguard Worker    "profiler_builtins",
94*6777b538SAndroid Build Coastguard Worker    "rustc_std_workspace_alloc",
95*6777b538SAndroid Build Coastguard Worker    "rustc_std_workspace_core",
96*6777b538SAndroid Build Coastguard Worker    "rustc_std_workspace_std",
97*6777b538SAndroid Build Coastguard Worker  ]
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker  config("stdlib_dependent_libs") {
100*6777b538SAndroid Build Coastguard Worker    # TODO(crbug.com/1434092): These should really be `libs`, however that
101*6777b538SAndroid Build Coastguard Worker    # breaks. Normally, we specify lib files with the `.lib` suffix but
102*6777b538SAndroid Build Coastguard Worker    # then when rustc links an EXE, it invokes lld-link with `.lib.lib`
103*6777b538SAndroid Build Coastguard Worker    # instead.
104*6777b538SAndroid Build Coastguard Worker    #
105*6777b538SAndroid Build Coastguard Worker    # Omitting the `.lib` suffix breaks linking as well, when clang drives
106*6777b538SAndroid Build Coastguard Worker    # the linking step of a C++ EXE that depends on Rust.
107*6777b538SAndroid Build Coastguard Worker    if (is_win) {
108*6777b538SAndroid Build Coastguard Worker      # The libc crate tries to link in the Windows CRT, but we specify the CRT
109*6777b538SAndroid Build Coastguard Worker      # library ourselves in //build/config/win:dynamic_crt and
110*6777b538SAndroid Build Coastguard Worker      # //build/config/win:static_crt because Rustc does not allow us to specify
111*6777b538SAndroid Build Coastguard Worker      # using the debug CRT: https://github.com/rust-lang/rust/issues/39016
112*6777b538SAndroid Build Coastguard Worker      #
113*6777b538SAndroid Build Coastguard Worker      # As such, we have disabled all #[link] directives from the libc crate,
114*6777b538SAndroid Build Coastguard Worker      # and we need to add any non-CRT libs here.
115*6777b538SAndroid Build Coastguard Worker      ldflags = [ "legacy_stdio_definitions.lib" ]
116*6777b538SAndroid Build Coastguard Worker    }
117*6777b538SAndroid Build Coastguard Worker  }
118*6777b538SAndroid Build Coastguard Worker  config("stdlib_public_dependent_libs") {
119*6777b538SAndroid Build Coastguard Worker    # TODO(crbug.com/1434092): These should really be `libs`, however that
120*6777b538SAndroid Build Coastguard Worker    # breaks. Normally, we specify lib files with the `.lib` suffix but
121*6777b538SAndroid Build Coastguard Worker    # then when rustc links an EXE, it invokes lld-link with `.lib.lib`
122*6777b538SAndroid Build Coastguard Worker    # instead.
123*6777b538SAndroid Build Coastguard Worker    #
124*6777b538SAndroid Build Coastguard Worker    # Omitting the `.lib` suffix breaks linking as well, when clang drives
125*6777b538SAndroid Build Coastguard Worker    # the linking step of a C++ EXE that depends on Rust.
126*6777b538SAndroid Build Coastguard Worker    if (is_win) {
127*6777b538SAndroid Build Coastguard Worker      # These libs provide functions that are used by the stdlib. Rust crates
128*6777b538SAndroid Build Coastguard Worker      # will try to link them in with #[link] directives. However these don't
129*6777b538SAndroid Build Coastguard Worker      # get propagated to the linker if Rust isn't driving the linking (a C++
130*6777b538SAndroid Build Coastguard Worker      # target that depends on a Rust rlib). So these need to be specified
131*6777b538SAndroid Build Coastguard Worker      # explicitly.
132*6777b538SAndroid Build Coastguard Worker      ldflags = [
133*6777b538SAndroid Build Coastguard Worker        "advapi32.lib",
134*6777b538SAndroid Build Coastguard Worker        "bcrypt.lib",
135*6777b538SAndroid Build Coastguard Worker        "kernel32.lib",
136*6777b538SAndroid Build Coastguard Worker        "ntdll.lib",
137*6777b538SAndroid Build Coastguard Worker        "synchronization.lib",
138*6777b538SAndroid Build Coastguard Worker        "userenv.lib",
139*6777b538SAndroid Build Coastguard Worker        "ws2_32.lib",
140*6777b538SAndroid Build Coastguard Worker      ]
141*6777b538SAndroid Build Coastguard Worker    }
142*6777b538SAndroid Build Coastguard Worker
143*6777b538SAndroid Build Coastguard Worker    # From rust/library/std/src/sys/unix/mod.rs.
144*6777b538SAndroid Build Coastguard Worker    # TODO(danakj): We should generate this list somehow when building or rolling
145*6777b538SAndroid Build Coastguard Worker    # the Rust toolchain?
146*6777b538SAndroid Build Coastguard Worker    if (is_android) {
147*6777b538SAndroid Build Coastguard Worker      libs = [ "dl" ]
148*6777b538SAndroid Build Coastguard Worker    } else if (target_os == "freebsd") {
149*6777b538SAndroid Build Coastguard Worker      libs = [
150*6777b538SAndroid Build Coastguard Worker        "execinfo",
151*6777b538SAndroid Build Coastguard Worker        "pthread",
152*6777b538SAndroid Build Coastguard Worker      ]
153*6777b538SAndroid Build Coastguard Worker    } else if (target_os == "netbsd") {
154*6777b538SAndroid Build Coastguard Worker      libs = [
155*6777b538SAndroid Build Coastguard Worker        "rt",
156*6777b538SAndroid Build Coastguard Worker        "pthread",
157*6777b538SAndroid Build Coastguard Worker      ]
158*6777b538SAndroid Build Coastguard Worker    } else if (is_mac) {
159*6777b538SAndroid Build Coastguard Worker      libs = [ "System" ]
160*6777b538SAndroid Build Coastguard Worker    } else if (is_ios) {
161*6777b538SAndroid Build Coastguard Worker      libs = [
162*6777b538SAndroid Build Coastguard Worker        "System",
163*6777b538SAndroid Build Coastguard Worker        "objc",
164*6777b538SAndroid Build Coastguard Worker      ]
165*6777b538SAndroid Build Coastguard Worker      frameworks = [
166*6777b538SAndroid Build Coastguard Worker        "Security.framework",
167*6777b538SAndroid Build Coastguard Worker        "Foundation.framework",
168*6777b538SAndroid Build Coastguard Worker      ]
169*6777b538SAndroid Build Coastguard Worker    } else if (is_fuchsia) {
170*6777b538SAndroid Build Coastguard Worker      libs = [
171*6777b538SAndroid Build Coastguard Worker        "zircon",
172*6777b538SAndroid Build Coastguard Worker        "fdio",
173*6777b538SAndroid Build Coastguard Worker      ]
174*6777b538SAndroid Build Coastguard Worker    }
175*6777b538SAndroid Build Coastguard Worker  }
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker  # Construct sysroots for rustc invocations to better control what libraries
178*6777b538SAndroid Build Coastguard Worker  # are linked. We have two: one with copied prebuilt libraries, and one with
179*6777b538SAndroid Build Coastguard Worker  # our locally-built std. Both reside in root_out_dir: we must only have one of
180*6777b538SAndroid Build Coastguard Worker  # each per GN toolchain anyway.
181*6777b538SAndroid Build Coastguard Worker
182*6777b538SAndroid Build Coastguard Worker  sysroot_lib_subdir = "lib/rustlib/$rust_abi_target/lib"
183*6777b538SAndroid Build Coastguard Worker
184*6777b538SAndroid Build Coastguard Worker  if (!rust_prebuilt_stdlib) {
185*6777b538SAndroid Build Coastguard Worker    local_rustc_sysroot = "$root_out_dir/local_rustc_sysroot"
186*6777b538SAndroid Build Coastguard Worker
187*6777b538SAndroid Build Coastguard Worker    # All std targets starting with core build with our sysroot. It starts empty
188*6777b538SAndroid Build Coastguard Worker    # and is incrementally built. The directory must exist at the start.
189*6777b538SAndroid Build Coastguard Worker    generated_file("empty_sysroot_for_std_build") {
190*6777b538SAndroid Build Coastguard Worker      outputs = [ "$local_rustc_sysroot/$sysroot_lib_subdir/.empty" ]
191*6777b538SAndroid Build Coastguard Worker      contents = ""
192*6777b538SAndroid Build Coastguard Worker      visibility = [ ":*" ]
193*6777b538SAndroid Build Coastguard Worker    }
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker    # Target to be depended on by std build targets. Creates the initially empty
196*6777b538SAndroid Build Coastguard Worker    # sysroot.
197*6777b538SAndroid Build Coastguard Worker    group("std_build_deps") {
198*6777b538SAndroid Build Coastguard Worker      deps = [ ":empty_sysroot_for_std_build" ]
199*6777b538SAndroid Build Coastguard Worker      public_configs = [ ":local_stdlib_sysroot" ]
200*6777b538SAndroid Build Coastguard Worker      visibility = [ "rules:*" ]
201*6777b538SAndroid Build Coastguard Worker    }
202*6777b538SAndroid Build Coastguard Worker
203*6777b538SAndroid Build Coastguard Worker    profiler_builtins_crates = [
204*6777b538SAndroid Build Coastguard Worker      "core",
205*6777b538SAndroid Build Coastguard Worker      "compiler_builtins",
206*6777b538SAndroid Build Coastguard Worker      "profiler_builtins",
207*6777b538SAndroid Build Coastguard Worker    ]
208*6777b538SAndroid Build Coastguard Worker
209*6777b538SAndroid Build Coastguard Worker    # When using instrumentation, profiler_builtins and its deps must be built
210*6777b538SAndroid Build Coastguard Worker    # before other std crates. Other crates depend on this target so they are
211*6777b538SAndroid Build Coastguard Worker    # built in the right order.
212*6777b538SAndroid Build Coastguard Worker    group("profiler_builtins_group") {
213*6777b538SAndroid Build Coastguard Worker      deps = []
214*6777b538SAndroid Build Coastguard Worker      foreach(libname, profiler_builtins_crates) {
215*6777b538SAndroid Build Coastguard Worker        deps += [ "rules:$libname" ]
216*6777b538SAndroid Build Coastguard Worker      }
217*6777b538SAndroid Build Coastguard Worker      visibility = [ "rules:*" ]
218*6777b538SAndroid Build Coastguard Worker    }
219*6777b538SAndroid Build Coastguard Worker
220*6777b538SAndroid Build Coastguard Worker    config("local_stdlib_sysroot") {
221*6777b538SAndroid Build Coastguard Worker      sysroot = rebase_path(local_rustc_sysroot, root_build_dir)
222*6777b538SAndroid Build Coastguard Worker      rustflags = [ "--sysroot=$sysroot" ]
223*6777b538SAndroid Build Coastguard Worker      visibility = [ ":*" ]
224*6777b538SAndroid Build Coastguard Worker    }
225*6777b538SAndroid Build Coastguard Worker
226*6777b538SAndroid Build Coastguard Worker    # When given -Zsanitize=..., rustc insists on passing a sanitizer runtime to
227*6777b538SAndroid Build Coastguard Worker    # the linker it invokes. Unfortunately, our C++ ldflags already tell the
228*6777b538SAndroid Build Coastguard Worker    # linker to link against a C++ sanitizer runtime - which contains the same
229*6777b538SAndroid Build Coastguard Worker    # symbols. So, make a blank library.
230*6777b538SAndroid Build Coastguard Worker    # The list of relevant sanitizers here is taken from
231*6777b538SAndroid Build Coastguard Worker    # https://github.com/rust-lang/rust/blob/7e7483d26e3cec7a44ef00cf7ae6c9c8c918bec6/compiler/rustc_codegen_ssa/src/back/link.rs#L1148
232*6777b538SAndroid Build Coastguard Worker    template("rustc_sanitizer_runtime") {
233*6777b538SAndroid Build Coastguard Worker      rt_name = target_name
234*6777b538SAndroid Build Coastguard Worker      not_needed([ "invoker" ])
235*6777b538SAndroid Build Coastguard Worker      static_library("sanitizer_rt_$rt_name") {
236*6777b538SAndroid Build Coastguard Worker        sources = []
237*6777b538SAndroid Build Coastguard Worker        output_name = "librustc-${rust_channel}_rt.$rt_name"
238*6777b538SAndroid Build Coastguard Worker        output_dir = "$local_rustc_sysroot/$sysroot_lib_subdir"
239*6777b538SAndroid Build Coastguard Worker        if (is_win) {
240*6777b538SAndroid Build Coastguard Worker          arflags = [ "/llvmlibempty" ]
241*6777b538SAndroid Build Coastguard Worker        }
242*6777b538SAndroid Build Coastguard Worker      }
243*6777b538SAndroid Build Coastguard Worker    }
244*6777b538SAndroid Build Coastguard Worker    rustc_sanitizer_runtimes = []
245*6777b538SAndroid Build Coastguard Worker    if (is_asan) {
246*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtime("asan") {
247*6777b538SAndroid Build Coastguard Worker      }
248*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtimes += [ ":sanitizer_rt_asan" ]
249*6777b538SAndroid Build Coastguard Worker    }
250*6777b538SAndroid Build Coastguard Worker    if (is_lsan) {
251*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtime("lsan") {
252*6777b538SAndroid Build Coastguard Worker      }
253*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtimes += [ ":sanitizer_rt_lsan" ]
254*6777b538SAndroid Build Coastguard Worker    }
255*6777b538SAndroid Build Coastguard Worker    if (is_msan) {
256*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtime("msan") {
257*6777b538SAndroid Build Coastguard Worker      }
258*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtimes += [ ":sanitizer_rt_msan" ]
259*6777b538SAndroid Build Coastguard Worker    }
260*6777b538SAndroid Build Coastguard Worker    if (is_tsan) {
261*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtime("tsan") {
262*6777b538SAndroid Build Coastguard Worker      }
263*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtimes += [ ":sanitizer_rt_tsan" ]
264*6777b538SAndroid Build Coastguard Worker    }
265*6777b538SAndroid Build Coastguard Worker    if (is_hwasan) {
266*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtime("hwasan") {
267*6777b538SAndroid Build Coastguard Worker      }
268*6777b538SAndroid Build Coastguard Worker      rustc_sanitizer_runtimes += [ ":sanitizer_rt_hwasan" ]
269*6777b538SAndroid Build Coastguard Worker    }
270*6777b538SAndroid Build Coastguard Worker
271*6777b538SAndroid Build Coastguard Worker    group("local_stdlib_libs") {
272*6777b538SAndroid Build Coastguard Worker      assert(toolchain_has_rust,
273*6777b538SAndroid Build Coastguard Worker             "Some C++ target is depending on Rust code even though " +
274*6777b538SAndroid Build Coastguard Worker                 "toolchain_has_rust=false. Usually this would mean" +
275*6777b538SAndroid Build Coastguard Worker                 "a NaCl target is depending on Rust, as there's no Rust " +
276*6777b538SAndroid Build Coastguard Worker                 "toolchain targetting NaCl.")
277*6777b538SAndroid Build Coastguard Worker      all_dependent_configs = [ ":stdlib_dependent_libs" ]
278*6777b538SAndroid Build Coastguard Worker      deps = []
279*6777b538SAndroid Build Coastguard Worker      foreach(libname, stdlib_files + skip_stdlib_files) {
280*6777b538SAndroid Build Coastguard Worker        deps += [ "rules:$libname" ]
281*6777b538SAndroid Build Coastguard Worker      }
282*6777b538SAndroid Build Coastguard Worker      deps += rustc_sanitizer_runtimes
283*6777b538SAndroid Build Coastguard Worker      visibility = [ ":*" ]
284*6777b538SAndroid Build Coastguard Worker    }
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Worker    # Builds and links against the Rust stdlib. Used by targets for which
287*6777b538SAndroid Build Coastguard Worker    # linking is driven by C++.
288*6777b538SAndroid Build Coastguard Worker    group("std") {
289*6777b538SAndroid Build Coastguard Worker      all_dependent_configs = [
290*6777b538SAndroid Build Coastguard Worker        ":stdlib_public_dependent_libs",
291*6777b538SAndroid Build Coastguard Worker        ":local_stdlib_sysroot",
292*6777b538SAndroid Build Coastguard Worker      ]
293*6777b538SAndroid Build Coastguard Worker      public_deps = [
294*6777b538SAndroid Build Coastguard Worker        ":local_stdlib_libs",
295*6777b538SAndroid Build Coastguard Worker        ":remap_alloc",
296*6777b538SAndroid Build Coastguard Worker      ]
297*6777b538SAndroid Build Coastguard Worker    }
298*6777b538SAndroid Build Coastguard Worker  } else {
299*6777b538SAndroid Build Coastguard Worker    action("find_stdlib") {
300*6777b538SAndroid Build Coastguard Worker      # Collect prebuilt Rust libraries from toolchain package and copy to a
301*6777b538SAndroid Build Coastguard Worker      # known location.
302*6777b538SAndroid Build Coastguard Worker      #
303*6777b538SAndroid Build Coastguard Worker      # The Rust toolchain contains prebuilt rlibs for the standard library and
304*6777b538SAndroid Build Coastguard Worker      # its dependencies. However, they have unstable names: an unpredictable
305*6777b538SAndroid Build Coastguard Worker      # metadata hash is appended to the known crate name.
306*6777b538SAndroid Build Coastguard Worker      #
307*6777b538SAndroid Build Coastguard Worker      # We must depend on these rlibs explicitly when rustc is not in charge of
308*6777b538SAndroid Build Coastguard Worker      # linking. However, it is difficult to construct GN rules to do so when
309*6777b538SAndroid Build Coastguard Worker      # the names can't be known statically.
310*6777b538SAndroid Build Coastguard Worker      #
311*6777b538SAndroid Build Coastguard Worker      # This action copies the prebuilt rlibs to a known location, removing the
312*6777b538SAndroid Build Coastguard Worker      # metadata part of the name. In the process it verifies we have all the
313*6777b538SAndroid Build Coastguard Worker      # libraries we expect and none that we don't. A depfile is generated so
314*6777b538SAndroid Build Coastguard Worker      # this step is re-run when any libraries change. The action script
315*6777b538SAndroid Build Coastguard Worker      # additionally verifies rustc matches the expected version, which is
316*6777b538SAndroid Build Coastguard Worker      # unrelated but this is a convenient place to do so.
317*6777b538SAndroid Build Coastguard Worker      #
318*6777b538SAndroid Build Coastguard Worker      # The action refers to `stdlib_files`, `skip_stdlib_files`, and the
319*6777b538SAndroid Build Coastguard Worker      # associated //build/config/rust.gni vars `removed_rust_stdlib_libs` and
320*6777b538SAndroid Build Coastguard Worker      # `added_rust_stdlib_libs` for which rlib files to expect.
321*6777b538SAndroid Build Coastguard Worker      # `extra_sysroot_libs` is also used to copy non-std libs, if any.
322*6777b538SAndroid Build Coastguard Worker      script = "find_std_rlibs.py"
323*6777b538SAndroid Build Coastguard Worker      depfile = "$target_out_dir/stdlib.d"
324*6777b538SAndroid Build Coastguard Worker      out_libdir = rebase_path(target_out_dir, root_build_dir)
325*6777b538SAndroid Build Coastguard Worker      out_depfile = rebase_path(depfile, root_build_dir)
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker      # For the rustc sysroot we must include even the rlibs we don't pass to
328*6777b538SAndroid Build Coastguard Worker      # the C++ linker.
329*6777b538SAndroid Build Coastguard Worker      all_stdlibs_to_copy = stdlib_files + skip_stdlib_files
330*6777b538SAndroid Build Coastguard Worker      args = [
331*6777b538SAndroid Build Coastguard Worker        "--rust-bin-dir",
332*6777b538SAndroid Build Coastguard Worker        rebase_path("${rust_sysroot}/bin", root_build_dir),
333*6777b538SAndroid Build Coastguard Worker        "--output",
334*6777b538SAndroid Build Coastguard Worker        out_libdir,
335*6777b538SAndroid Build Coastguard Worker        "--depfile",
336*6777b538SAndroid Build Coastguard Worker        out_depfile,
337*6777b538SAndroid Build Coastguard Worker
338*6777b538SAndroid Build Coastguard Worker        # Due to limitations in Ninja's handling of .d files, we have to pick
339*6777b538SAndroid Build Coastguard Worker        # *the first* of our outputs. To make diagnostics more obviously
340*6777b538SAndroid Build Coastguard Worker        # related to the Rust standard library, we ensure libstd.rlib is first.
341*6777b538SAndroid Build Coastguard Worker        "--depfile-target",
342*6777b538SAndroid Build Coastguard Worker        stdlib_files[0],
343*6777b538SAndroid Build Coastguard Worker
344*6777b538SAndroid Build Coastguard Worker        # Create a dependency on the rustc version so this action is re-run when
345*6777b538SAndroid Build Coastguard Worker        # it changes. This argument is not actually read by the script.
346*6777b538SAndroid Build Coastguard Worker        "--rustc-revision",
347*6777b538SAndroid Build Coastguard Worker        rustc_revision,
348*6777b538SAndroid Build Coastguard Worker      ]
349*6777b538SAndroid Build Coastguard Worker
350*6777b538SAndroid Build Coastguard Worker      if (extra_sysroot_libs != []) {
351*6777b538SAndroid Build Coastguard Worker        args += [
352*6777b538SAndroid Build Coastguard Worker          "--extra-libs",
353*6777b538SAndroid Build Coastguard Worker          string_join(",", extra_sysroot_libs),
354*6777b538SAndroid Build Coastguard Worker        ]
355*6777b538SAndroid Build Coastguard Worker      }
356*6777b538SAndroid Build Coastguard Worker
357*6777b538SAndroid Build Coastguard Worker      args += [
358*6777b538SAndroid Build Coastguard Worker        "--target",
359*6777b538SAndroid Build Coastguard Worker        rust_abi_target,
360*6777b538SAndroid Build Coastguard Worker      ]
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard Worker      outputs = []
363*6777b538SAndroid Build Coastguard Worker      foreach(lib, all_stdlibs_to_copy) {
364*6777b538SAndroid Build Coastguard Worker        outputs += [ "$target_out_dir/lib$lib.rlib" ]
365*6777b538SAndroid Build Coastguard Worker      }
366*6777b538SAndroid Build Coastguard Worker      foreach(lib, extra_sysroot_libs) {
367*6777b538SAndroid Build Coastguard Worker        outputs += [ "$target_out_dir/$lib" ]
368*6777b538SAndroid Build Coastguard Worker      }
369*6777b538SAndroid Build Coastguard Worker
370*6777b538SAndroid Build Coastguard Worker      visibility = [ ":*" ]
371*6777b538SAndroid Build Coastguard Worker    }
372*6777b538SAndroid Build Coastguard Worker
373*6777b538SAndroid Build Coastguard Worker    prebuilt_rustc_sysroot = "$root_out_dir/prebuilt_rustc_sysroot"
374*6777b538SAndroid Build Coastguard Worker    copy("prebuilt_rustc_copy_to_sysroot") {
375*6777b538SAndroid Build Coastguard Worker      assert(enable_rust,
376*6777b538SAndroid Build Coastguard Worker             "Some C++ target is including Rust code even though " +
377*6777b538SAndroid Build Coastguard Worker                 "enable_rust=false")
378*6777b538SAndroid Build Coastguard Worker      deps = [ ":find_stdlib" ]
379*6777b538SAndroid Build Coastguard Worker      sources = get_target_outputs(":find_stdlib")
380*6777b538SAndroid Build Coastguard Worker      outputs =
381*6777b538SAndroid Build Coastguard Worker          [ "$prebuilt_rustc_sysroot/$sysroot_lib_subdir/{{source_file_part}}" ]
382*6777b538SAndroid Build Coastguard Worker
383*6777b538SAndroid Build Coastguard Worker      visibility = [ ":*" ]
384*6777b538SAndroid Build Coastguard Worker    }
385*6777b538SAndroid Build Coastguard Worker
386*6777b538SAndroid Build Coastguard Worker    config("prebuilt_stdlib_sysroot") {
387*6777b538SAndroid Build Coastguard Worker      # Match the output directory of :prebuilt_rustc_copy_to_sysroot
388*6777b538SAndroid Build Coastguard Worker      sysroot = rebase_path(prebuilt_rustc_sysroot, root_build_dir)
389*6777b538SAndroid Build Coastguard Worker      rustflags = [ "--sysroot=$sysroot" ]
390*6777b538SAndroid Build Coastguard Worker      visibility = [ ":*" ]
391*6777b538SAndroid Build Coastguard Worker    }
392*6777b538SAndroid Build Coastguard Worker
393*6777b538SAndroid Build Coastguard Worker    config("prebuilt_stdlib_libs") {
394*6777b538SAndroid Build Coastguard Worker      ldflags = []
395*6777b538SAndroid Build Coastguard Worker      lib_dir = rebase_path("$prebuilt_rustc_sysroot/$sysroot_lib_subdir",
396*6777b538SAndroid Build Coastguard Worker                            root_build_dir)
397*6777b538SAndroid Build Coastguard Worker
398*6777b538SAndroid Build Coastguard Worker      # We're unable to make these files regular gn dependencies because
399*6777b538SAndroid Build Coastguard Worker      # they're prebuilt. Instead, we'll pass them in the ldflags. This doesn't
400*6777b538SAndroid Build Coastguard Worker      # work for all types of build because ldflags propagate differently from
401*6777b538SAndroid Build Coastguard Worker      # actual dependencies and therefore can end up in different targets from
402*6777b538SAndroid Build Coastguard Worker      # the remap_alloc.cc above. For example, in a component build, we might
403*6777b538SAndroid Build Coastguard Worker      # apply the remap_alloc.cc file and these ldlags to shared object A,
404*6777b538SAndroid Build Coastguard Worker      # while shared object B (that depends upon A) might get only the ldflags
405*6777b538SAndroid Build Coastguard Worker      # but not remap_alloc.cc, and thus the build will fail. There is
406*6777b538SAndroid Build Coastguard Worker      # currently no known solution to this for the prebuilt stdlib - this
407*6777b538SAndroid Build Coastguard Worker      # problem does not apply with configurations where we build the stdlib
408*6777b538SAndroid Build Coastguard Worker      # ourselves, which is what we'll use in production.
409*6777b538SAndroid Build Coastguard Worker      foreach(lib, stdlib_files) {
410*6777b538SAndroid Build Coastguard Worker        this_file = "$lib_dir/lib$lib.rlib"
411*6777b538SAndroid Build Coastguard Worker        ldflags += [ this_file ]
412*6777b538SAndroid Build Coastguard Worker      }
413*6777b538SAndroid Build Coastguard Worker      visibility = [ ":*" ]
414*6777b538SAndroid Build Coastguard Worker    }
415*6777b538SAndroid Build Coastguard Worker
416*6777b538SAndroid Build Coastguard Worker    group("std") {
417*6777b538SAndroid Build Coastguard Worker      all_dependent_configs = [
418*6777b538SAndroid Build Coastguard Worker        ":prebuilt_stdlib_libs",
419*6777b538SAndroid Build Coastguard Worker        ":stdlib_public_dependent_libs",
420*6777b538SAndroid Build Coastguard Worker      ]
421*6777b538SAndroid Build Coastguard Worker      deps = [ ":prebuilt_rustc_copy_to_sysroot" ]
422*6777b538SAndroid Build Coastguard Worker
423*6777b538SAndroid Build Coastguard Worker      # The host builds tools toolchain supports Rust only and does not use
424*6777b538SAndroid Build Coastguard Worker      # the allocator remapping to point it to PartitionAlloc.
425*6777b538SAndroid Build Coastguard Worker      if (!toolchain_for_rust_host_build_tools) {
426*6777b538SAndroid Build Coastguard Worker        deps += [ ":remap_alloc" ]
427*6777b538SAndroid Build Coastguard Worker      }
428*6777b538SAndroid Build Coastguard Worker    }
429*6777b538SAndroid Build Coastguard Worker  }
430*6777b538SAndroid Build Coastguard Worker}
431