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