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