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