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