1*6777b538SAndroid Build Coastguard Worker# Copyright 2013 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# TODO(brettw) Use "gcc_toolchain.gni" like the Linux toolchains. This requires 6*6777b538SAndroid Build Coastguard Worker# some enhancements since the commands on Mac are slightly different than on 7*6777b538SAndroid Build Coastguard Worker# Linux. 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Workerimport("//build/config/apple/symbols.gni") 10*6777b538SAndroid Build Coastguard Workerimport("//build/config/clang/clang.gni") 11*6777b538SAndroid Build Coastguard Workerimport("//build/config/compiler/compiler.gni") 12*6777b538SAndroid Build Coastguard Workerimport("//build/config/coverage/coverage.gni") 13*6777b538SAndroid Build Coastguard Workerimport("//build/config/rust.gni") 14*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/cc_wrapper.gni") 15*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/rbe.gni") 16*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/toolchain.gni") 17*6777b538SAndroid Build Coastguard Workerimport("//build_overrides/build.gni") 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker# TODO(crbug.com/1370527): This import is required to detect whether the 20*6777b538SAndroid Build Coastguard Worker# build is for the catalyst environment in order to disable the hermetic 21*6777b538SAndroid Build Coastguard Worker# swift compiler (as it does not include support for catalyst). Remove it 22*6777b538SAndroid Build Coastguard Worker# once the support is available. 23*6777b538SAndroid Build Coastguard Workerif (is_ios) { 24*6777b538SAndroid Build Coastguard Worker import("//build/config/ios/config.gni") 25*6777b538SAndroid Build Coastguard Worker import("//build/config/ios/ios_sdk.gni") 26*6777b538SAndroid Build Coastguard Worker} 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Workerassert((target_os == "ios" && host_os == "mac") || host_os != "win") 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Workerdeclare_args() { 31*6777b538SAndroid Build Coastguard Worker # This controls whether whole module optimization is enabled when building 32*6777b538SAndroid Build Coastguard Worker # Swift modules. If enabled, the compiler will compile the module as one 33*6777b538SAndroid Build Coastguard Worker # unit, generating just one single object file. Otherwise, it will generate 34*6777b538SAndroid Build Coastguard Worker # one object file per .swift file. If unspecified, will default to "true" 35*6777b538SAndroid Build Coastguard Worker # for official builds, and "false" for all other builds. 36*6777b538SAndroid Build Coastguard Worker swift_whole_module_optimization = -1 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker # If true, the intermediate build products of swift module compilation will 39*6777b538SAndroid Build Coastguard Worker # be kept after the invocation of the swiftc compiler. Otherwise they will 40*6777b538SAndroid Build Coastguard Worker # deleted between each invocation. 41*6777b538SAndroid Build Coastguard Worker swift_keep_intermediate_files = false 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker # If unspecified, will use the toolchain downloaded via deps. 44*6777b538SAndroid Build Coastguard Worker swift_toolchain_path = -1 45*6777b538SAndroid Build Coastguard Worker} 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker# TODO(crbug.com/1370527): Remove this and replace with `build_with_chromium` 48*6777b538SAndroid Build Coastguard Worker# once the support for catalyst is available in the hermetic swift compiler. 49*6777b538SAndroid Build Coastguard Worker_can_use_hermetic_swift = 50*6777b538SAndroid Build Coastguard Worker build_with_chromium && is_ios && target_environment != "catalyst" 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Workerif (swift_toolchain_path == -1) { 53*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1451611) The custom swift toolchain not does currently work 54*6777b538SAndroid Build Coastguard Worker # with Xcode 15 beta 1. 55*6777b538SAndroid Build Coastguard Worker if (_can_use_hermetic_swift && !(is_ios && xcode_version_int >= 1500)) { 56*6777b538SAndroid Build Coastguard Worker # Version of the hermetic compiler. Needs to be updated when a new version of 57*6777b538SAndroid Build Coastguard Worker # the compiler is rolled to ensure that all outputs are regenerated. It must 58*6777b538SAndroid Build Coastguard Worker # be kept in sync with the `version` of `third_party/swift-toolchain` in 59*6777b538SAndroid Build Coastguard Worker # //DEPS. 60*6777b538SAndroid Build Coastguard Worker swiftc_version = "swift-5.8-release" 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker # Use the hermetic swift toolchain. 63*6777b538SAndroid Build Coastguard Worker swift_toolchain_path = "//third_party/swift-toolchain/" 64*6777b538SAndroid Build Coastguard Worker } else { 65*6777b538SAndroid Build Coastguard Worker swift_toolchain_path = "" 66*6777b538SAndroid Build Coastguard Worker } 67*6777b538SAndroid Build Coastguard Worker} 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Workerif (swift_whole_module_optimization == -1) { 70*6777b538SAndroid Build Coastguard Worker swift_whole_module_optimization = is_official_build 71*6777b538SAndroid Build Coastguard Worker} 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker# When implementing tools using Python scripts, a TOOL_VERSION=N env 74*6777b538SAndroid Build Coastguard Worker# variable is placed in front of the command. The N should be incremented 75*6777b538SAndroid Build Coastguard Worker# whenever the script is changed, so that the build system rebuilds all 76*6777b538SAndroid Build Coastguard Worker# edges that utilize the script. Ideally this should be changed to use 77*6777b538SAndroid Build Coastguard Worker# proper input-dirty checking, but that could be expensive. Instead, use a 78*6777b538SAndroid Build Coastguard Worker# script to get the tool scripts' modification time to use as the version. 79*6777b538SAndroid Build Coastguard Worker# This won't cause a re-generation of GN files when the tool script changes 80*6777b538SAndroid Build Coastguard Worker# but it will cause edges to be marked as dirty if the ninja files are 81*6777b538SAndroid Build Coastguard Worker# regenerated. See https://crbug.com/619083 for details. A proper fix 82*6777b538SAndroid Build Coastguard Worker# would be to have inputs to tools (https://crbug.com/621119). 83*6777b538SAndroid Build Coastguard Workertool_versions = exec_script( 84*6777b538SAndroid Build Coastguard Worker "get_tool_mtime.py", 85*6777b538SAndroid Build Coastguard Worker rebase_path([ 86*6777b538SAndroid Build Coastguard Worker "//build/toolchain/apple/filter_libtool.py", 87*6777b538SAndroid Build Coastguard Worker "//build/toolchain/apple/linker_driver.py", 88*6777b538SAndroid Build Coastguard Worker "//build/toolchain/ios/compile_xcassets.py", 89*6777b538SAndroid Build Coastguard Worker "//build/toolchain/ios/const_extract_protocols.json", 90*6777b538SAndroid Build Coastguard Worker "//build/toolchain/ios/swiftc.py", 91*6777b538SAndroid Build Coastguard Worker ], 92*6777b538SAndroid Build Coastguard Worker root_build_dir), 93*6777b538SAndroid Build Coastguard Worker "trim scope") 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker# Shared toolchain definition. Invocations should set current_os to set the 96*6777b538SAndroid Build Coastguard Worker# build args in this definition. This is titled "single_apple_toolchain" 97*6777b538SAndroid Build Coastguard Worker# because it makes exactly one toolchain. Callers will normally want to 98*6777b538SAndroid Build Coastguard Worker# invoke instead "apple_toolchain" which makes an additional toolchain for 99*6777b538SAndroid Build Coastguard Worker# Rust targets that are build-time artificts such as proc macros. 100*6777b538SAndroid Build Coastguard Workertemplate("single_apple_toolchain") { 101*6777b538SAndroid Build Coastguard Worker toolchain(target_name) { 102*6777b538SAndroid Build Coastguard Worker # When invoking this toolchain not as the default one, these args will be 103*6777b538SAndroid Build Coastguard Worker # passed to the build. They are ignored when this is the default toolchain. 104*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.toolchain_args), 105*6777b538SAndroid Build Coastguard Worker "Toolchains must declare toolchain_args") 106*6777b538SAndroid Build Coastguard Worker toolchain_args = { 107*6777b538SAndroid Build Coastguard Worker # Populate toolchain args from the invoker. 108*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker.toolchain_args, "*") 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker # The host toolchain value computed by the default toolchain's setup 111*6777b538SAndroid Build Coastguard Worker # needs to be passed through unchanged to all secondary toolchains to 112*6777b538SAndroid Build Coastguard Worker # ensure that it's always the same, regardless of the values that may be 113*6777b538SAndroid Build Coastguard Worker # set on those toolchains. 114*6777b538SAndroid Build Coastguard Worker host_toolchain = host_toolchain 115*6777b538SAndroid Build Coastguard Worker } 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker # When the invoker has explicitly overridden cc_wrapper in the 118*6777b538SAndroid Build Coastguard Worker # toolchain args, use those values, otherwise default to the global one. 119*6777b538SAndroid Build Coastguard Worker # This works because the only reasonable override that toolchains might 120*6777b538SAndroid Build Coastguard Worker # supply for these values are to force-disable them. 121*6777b538SAndroid Build Coastguard Worker if (defined(toolchain_args.use_remoteexec)) { 122*6777b538SAndroid Build Coastguard Worker toolchain_uses_remoteexec = toolchain_args.use_remoteexec 123*6777b538SAndroid Build Coastguard Worker } else { 124*6777b538SAndroid Build Coastguard Worker toolchain_uses_remoteexec = use_remoteexec 125*6777b538SAndroid Build Coastguard Worker } 126*6777b538SAndroid Build Coastguard Worker if (defined(toolchain_args.cc_wrapper)) { 127*6777b538SAndroid Build Coastguard Worker toolchain_cc_wrapper = toolchain_args.cc_wrapper 128*6777b538SAndroid Build Coastguard Worker } else { 129*6777b538SAndroid Build Coastguard Worker toolchain_cc_wrapper = cc_wrapper 130*6777b538SAndroid Build Coastguard Worker } 131*6777b538SAndroid Build Coastguard Worker assert(!(toolchain_cc_wrapper != "" && toolchain_uses_remoteexec), 132*6777b538SAndroid Build Coastguard Worker "re-client and cc_wrapper can't be used together.") 133*6777b538SAndroid Build Coastguard Worker 134*6777b538SAndroid Build Coastguard Worker if (defined(toolchain_args.use_lld)) { 135*6777b538SAndroid Build Coastguard Worker toolchain_uses_lld = toolchain_args.use_lld 136*6777b538SAndroid Build Coastguard Worker } else { 137*6777b538SAndroid Build Coastguard Worker toolchain_uses_lld = use_lld 138*6777b538SAndroid Build Coastguard Worker } 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker # The value of all global variables (such as `is_component_build`) is the 141*6777b538SAndroid Build Coastguard Worker # one from the default toolchain when evaluating a secondary toolchain 142*6777b538SAndroid Build Coastguard Worker # (see https://crbug.com/gn/286). This mean that the value may change when 143*6777b538SAndroid Build Coastguard Worker # evaluating target/configs in the new toolchain if the variable default 144*6777b538SAndroid Build Coastguard Worker # value depends on variable set in `toolchain_args`. 145*6777b538SAndroid Build Coastguard Worker # 146*6777b538SAndroid Build Coastguard Worker # For this reason, "ios" needs to override `is_component_build` as its 147*6777b538SAndroid Build Coastguard Worker # default value depends on `current_os`. Use the overridden value if it 148*6777b538SAndroid Build Coastguard Worker # is set in `toolchain_args`. 149*6777b538SAndroid Build Coastguard Worker if (defined(toolchain_args.is_component_build)) { 150*6777b538SAndroid Build Coastguard Worker toolchain_is_component_build = toolchain_args.is_component_build 151*6777b538SAndroid Build Coastguard Worker } else { 152*6777b538SAndroid Build Coastguard Worker toolchain_is_component_build = is_component_build 153*6777b538SAndroid Build Coastguard Worker } 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker prefix = rebase_path("$clang_base_path/bin/", root_build_dir) 156*6777b538SAndroid Build Coastguard Worker _cc = "${prefix}clang" 157*6777b538SAndroid Build Coastguard Worker _cxx = "${prefix}clang++" 158*6777b538SAndroid Build Coastguard Worker 159*6777b538SAndroid Build Coastguard Worker swiftmodule_switch = "-Wl,-add_ast_path," 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker # Compute the compiler prefix. 162*6777b538SAndroid Build Coastguard Worker if (toolchain_uses_remoteexec) { 163*6777b538SAndroid Build Coastguard Worker if (defined(toolchain_args.rbe_cc_cfg_file)) { 164*6777b538SAndroid Build Coastguard Worker toolchain_rbe_cc_cfg_file = toolchain_args.rbe_cc_cfg_file 165*6777b538SAndroid Build Coastguard Worker } else { 166*6777b538SAndroid Build Coastguard Worker toolchain_rbe_cc_cfg_file = rbe_cc_cfg_file 167*6777b538SAndroid Build Coastguard Worker } 168*6777b538SAndroid Build Coastguard Worker 169*6777b538SAndroid Build Coastguard Worker # C/C++ (clang) rewrapper prefix to use when use_remoteexec is true. 170*6777b538SAndroid Build Coastguard Worker compiler_prefix = "${rbe_bin_dir}/rewrapper -cfg=${toolchain_rbe_cc_cfg_file}${rbe_bug_326584510_missing_inputs} -exec_root=${rbe_exec_root} " 171*6777b538SAndroid Build Coastguard Worker } else if (toolchain_cc_wrapper != "") { 172*6777b538SAndroid Build Coastguard Worker compiler_prefix = toolchain_cc_wrapper + " " 173*6777b538SAndroid Build Coastguard Worker } else { 174*6777b538SAndroid Build Coastguard Worker compiler_prefix = "" 175*6777b538SAndroid Build Coastguard Worker } 176*6777b538SAndroid Build Coastguard Worker 177*6777b538SAndroid Build Coastguard Worker cc = compiler_prefix + _cc 178*6777b538SAndroid Build Coastguard Worker cxx = compiler_prefix + _cxx 179*6777b538SAndroid Build Coastguard Worker ld = _cxx 180*6777b538SAndroid Build Coastguard Worker 181*6777b538SAndroid Build Coastguard Worker # Set the explicit search path for clang++ so it uses the right linker 182*6777b538SAndroid Build Coastguard Worker # binary. 183*6777b538SAndroid Build Coastguard Worker if (!toolchain_uses_lld) { 184*6777b538SAndroid Build Coastguard Worker ld += " -B " + invoker.bin_path 185*6777b538SAndroid Build Coastguard Worker } 186*6777b538SAndroid Build Coastguard Worker 187*6777b538SAndroid Build Coastguard Worker if (defined(toolchain_args.coverage_instrumentation_input_file)) { 188*6777b538SAndroid Build Coastguard Worker toolchain_coverage_instrumentation_input_file = 189*6777b538SAndroid Build Coastguard Worker toolchain_args.coverage_instrumentation_input_file 190*6777b538SAndroid Build Coastguard Worker } else { 191*6777b538SAndroid Build Coastguard Worker toolchain_coverage_instrumentation_input_file = 192*6777b538SAndroid Build Coastguard Worker coverage_instrumentation_input_file 193*6777b538SAndroid Build Coastguard Worker } 194*6777b538SAndroid Build Coastguard Worker _use_clang_coverage_wrapper = 195*6777b538SAndroid Build Coastguard Worker toolchain_coverage_instrumentation_input_file != "" 196*6777b538SAndroid Build Coastguard Worker if (_use_clang_coverage_wrapper) { 197*6777b538SAndroid Build Coastguard Worker _coverage_wrapper = 198*6777b538SAndroid Build Coastguard Worker rebase_path("//build/toolchain/clang_code_coverage_wrapper.py", 199*6777b538SAndroid Build Coastguard Worker root_build_dir) + " --files-to-instrument=" + 200*6777b538SAndroid Build Coastguard Worker rebase_path(toolchain_coverage_instrumentation_input_file, 201*6777b538SAndroid Build Coastguard Worker root_build_dir) + " --target-os=" + target_os 202*6777b538SAndroid Build Coastguard Worker cc = "$python_path $_coverage_wrapper ${cc}" 203*6777b538SAndroid Build Coastguard Worker cxx = "$python_path $_coverage_wrapper ${cxx}" 204*6777b538SAndroid Build Coastguard Worker } 205*6777b538SAndroid Build Coastguard Worker 206*6777b538SAndroid Build Coastguard Worker linker_driver_env = "TOOL_VERSION=${tool_versions.linker_driver}" 207*6777b538SAndroid Build Coastguard Worker linker_driver = 208*6777b538SAndroid Build Coastguard Worker rebase_path("//build/toolchain/apple/linker_driver.py", root_build_dir) 209*6777b538SAndroid Build Coastguard Worker linker_driver_args = "-Wcrl,driver,$ld" 210*6777b538SAndroid Build Coastguard Worker 211*6777b538SAndroid Build Coastguard Worker # Specify an explicit path for the strip binary. 212*6777b538SAndroid Build Coastguard Worker _strippath = invoker.bin_path + "strip" 213*6777b538SAndroid Build Coastguard Worker _installnametoolpath = "${prefix}llvm-install-name-tool" 214*6777b538SAndroid Build Coastguard Worker linker_driver_args += " -Wcrl,strippath,${_strippath} -Wcrl,installnametoolpath,${_installnametoolpath}" 215*6777b538SAndroid Build Coastguard Worker _enable_dsyms = enable_dsyms 216*6777b538SAndroid Build Coastguard Worker _save_unstripped_output = save_unstripped_output 217*6777b538SAndroid Build Coastguard Worker 218*6777b538SAndroid Build Coastguard Worker # Make these apply to all tools below. 219*6777b538SAndroid Build Coastguard Worker lib_switch = "-l" 220*6777b538SAndroid Build Coastguard Worker lib_dir_switch = "-L" 221*6777b538SAndroid Build Coastguard Worker 222*6777b538SAndroid Build Coastguard Worker # Object files go in this directory. Use label_name instead of 223*6777b538SAndroid Build Coastguard Worker # target_output_name since labels will generally have no spaces and will be 224*6777b538SAndroid Build Coastguard Worker # unique in the directory. 225*6777b538SAndroid Build Coastguard Worker object_subdir = "{{target_out_dir}}/{{label_name}}" 226*6777b538SAndroid Build Coastguard Worker 227*6777b538SAndroid Build Coastguard Worker # If dSYMs are enabled, this flag will be added to the link tools. 228*6777b538SAndroid Build Coastguard Worker if (_enable_dsyms) { 229*6777b538SAndroid Build Coastguard Worker dsym_switch = " -Wcrl,dsym,{{root_out_dir}} " 230*6777b538SAndroid Build Coastguard Worker dsym_switch += "-Wcrl,dsymutilpath," + 231*6777b538SAndroid Build Coastguard Worker rebase_path("//tools/clang/dsymutil/bin/dsymutil", 232*6777b538SAndroid Build Coastguard Worker root_build_dir) + " " 233*6777b538SAndroid Build Coastguard Worker 234*6777b538SAndroid Build Coastguard Worker dsym_output_dir = 235*6777b538SAndroid Build Coastguard Worker "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.dSYM" 236*6777b538SAndroid Build Coastguard Worker dsym_output = [ 237*6777b538SAndroid Build Coastguard Worker "$dsym_output_dir/Contents/Info.plist", 238*6777b538SAndroid Build Coastguard Worker "$dsym_output_dir/Contents/Resources/DWARF/" + 239*6777b538SAndroid Build Coastguard Worker "{{target_output_name}}{{output_extension}}", 240*6777b538SAndroid Build Coastguard Worker ] 241*6777b538SAndroid Build Coastguard Worker } else { 242*6777b538SAndroid Build Coastguard Worker dsym_switch = "" 243*6777b538SAndroid Build Coastguard Worker } 244*6777b538SAndroid Build Coastguard Worker 245*6777b538SAndroid Build Coastguard Worker if (_save_unstripped_output) { 246*6777b538SAndroid Build Coastguard Worker _unstripped_output = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.unstripped" 247*6777b538SAndroid Build Coastguard Worker } 248*6777b538SAndroid Build Coastguard Worker 249*6777b538SAndroid Build Coastguard Worker if (toolchain_has_rust) { 250*6777b538SAndroid Build Coastguard Worker if (!defined(rust_compiler_prefix)) { 251*6777b538SAndroid Build Coastguard Worker rust_compiler_prefix = "" 252*6777b538SAndroid Build Coastguard Worker } 253*6777b538SAndroid Build Coastguard Worker rust_sysroot_relative = rebase_path(rust_sysroot, root_build_dir) 254*6777b538SAndroid Build Coastguard Worker rustc_bin = "$rust_sysroot_relative/bin/rustc" 255*6777b538SAndroid Build Coastguard Worker rustc = "$rust_compiler_prefix${rustc_bin}" 256*6777b538SAndroid Build Coastguard Worker rustc_wrapper = 257*6777b538SAndroid Build Coastguard Worker rebase_path("//build/rust/rustc_wrapper.py", root_build_dir) 258*6777b538SAndroid Build Coastguard Worker 259*6777b538SAndroid Build Coastguard Worker tool("rust_staticlib") { 260*6777b538SAndroid Build Coastguard Worker libname = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 261*6777b538SAndroid Build Coastguard Worker rspfile = "$libname.rsp" 262*6777b538SAndroid Build Coastguard Worker depfile = "$libname.d" 263*6777b538SAndroid Build Coastguard Worker 264*6777b538SAndroid Build Coastguard Worker default_output_extension = ".a" 265*6777b538SAndroid Build Coastguard Worker output_prefix = "lib" 266*6777b538SAndroid Build Coastguard Worker 267*6777b538SAndroid Build Coastguard Worker # Static libraries go in the target out directory by default so we can 268*6777b538SAndroid Build Coastguard Worker # generate different targets with the same name and not have them 269*6777b538SAndroid Build Coastguard Worker # collide. 270*6777b538SAndroid Build Coastguard Worker default_output_dir = "{{target_out_dir}}" 271*6777b538SAndroid Build Coastguard Worker description = "RUST(STATICLIB) {{output}}" 272*6777b538SAndroid Build Coastguard Worker outputs = [ libname ] 273*6777b538SAndroid Build Coastguard Worker 274*6777b538SAndroid Build Coastguard Worker # TODO(danakj): When `!toolchain_uses_lld` do we need to specify a path 275*6777b538SAndroid Build Coastguard Worker # to libtool like the "alink" rule? 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}" 278*6777b538SAndroid Build Coastguard Worker command = "\"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"$_cxx\" $rustc_common_args --emit=dep-info=$depfile,link -o $libname LDFLAGS RUSTENV {{rustenv}}" 279*6777b538SAndroid Build Coastguard Worker rust_sysroot = rust_sysroot_relative 280*6777b538SAndroid Build Coastguard Worker } 281*6777b538SAndroid Build Coastguard Worker 282*6777b538SAndroid Build Coastguard Worker tool("rust_rlib") { 283*6777b538SAndroid Build Coastguard Worker # We must always prefix with `lib` even if the library already starts 284*6777b538SAndroid Build Coastguard Worker # with that prefix or else our stdlib is unable to find libc.rlib (or 285*6777b538SAndroid Build Coastguard Worker # actually liblibc.rlib). 286*6777b538SAndroid Build Coastguard Worker rlibname = 287*6777b538SAndroid Build Coastguard Worker "{{output_dir}}/lib{{target_output_name}}{{output_extension}}" 288*6777b538SAndroid Build Coastguard Worker rspfile = "$rlibname.rsp" 289*6777b538SAndroid Build Coastguard Worker depfile = "$rlibname.d" 290*6777b538SAndroid Build Coastguard Worker 291*6777b538SAndroid Build Coastguard Worker default_output_extension = ".rlib" 292*6777b538SAndroid Build Coastguard Worker 293*6777b538SAndroid Build Coastguard Worker # This is prefixed unconditionally in `rlibname`. 294*6777b538SAndroid Build Coastguard Worker # output_prefix = "lib" 295*6777b538SAndroid Build Coastguard Worker 296*6777b538SAndroid Build Coastguard Worker # Static libraries go in the target out directory by default so we can 297*6777b538SAndroid Build Coastguard Worker # generate different targets with the same name and not have them 298*6777b538SAndroid Build Coastguard Worker # collide. 299*6777b538SAndroid Build Coastguard Worker default_output_dir = "{{target_out_dir}}" 300*6777b538SAndroid Build Coastguard Worker description = "RUST {{output}}" 301*6777b538SAndroid Build Coastguard Worker outputs = [ rlibname ] 302*6777b538SAndroid Build Coastguard Worker 303*6777b538SAndroid Build Coastguard Worker rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}" 304*6777b538SAndroid Build Coastguard Worker command = "\"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"$_cxx\" $rustc_common_args {{rustdeps}} {{externs}} --emit=dep-info=$depfile,link -o $rlibname LDFLAGS RUSTENV {{rustenv}}" 305*6777b538SAndroid Build Coastguard Worker rust_sysroot = rust_sysroot_relative 306*6777b538SAndroid Build Coastguard Worker } 307*6777b538SAndroid Build Coastguard Worker 308*6777b538SAndroid Build Coastguard Worker tool("rust_bin") { 309*6777b538SAndroid Build Coastguard Worker exename = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 310*6777b538SAndroid Build Coastguard Worker rspfile = "$exename.rsp" 311*6777b538SAndroid Build Coastguard Worker depfile = "$exename.d" 312*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain:link_pool($default_toolchain)" 313*6777b538SAndroid Build Coastguard Worker 314*6777b538SAndroid Build Coastguard Worker # TODO(danakj): solink can generate TOC files for re-exporting library 315*6777b538SAndroid Build Coastguard Worker # symbols, and we should do the same here. 316*6777b538SAndroid Build Coastguard Worker 317*6777b538SAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 318*6777b538SAndroid Build Coastguard Worker description = "RUST(BIN) {{output}}" 319*6777b538SAndroid Build Coastguard Worker outputs = [ exename ] 320*6777b538SAndroid Build Coastguard Worker 321*6777b538SAndroid Build Coastguard Worker # TODO(danakj): Support dsym_switch like C++ targets. 322*6777b538SAndroid Build Coastguard Worker # link_command += dsym_switch 323*6777b538SAndroid Build Coastguard Worker # if (_enable_dsyms) { 324*6777b538SAndroid Build Coastguard Worker # outputs += dsym_output 325*6777b538SAndroid Build Coastguard Worker # } 326*6777b538SAndroid Build Coastguard Worker # if (_save_unstripped_output) { 327*6777b538SAndroid Build Coastguard Worker # outputs += [ _unstripped_output ] 328*6777b538SAndroid Build Coastguard Worker # } 329*6777b538SAndroid Build Coastguard Worker 330*6777b538SAndroid Build Coastguard Worker rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}" 331*6777b538SAndroid Build Coastguard Worker command = "$linker_driver_env \"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"$linker_driver\" $rustc_common_args --emit=dep-info=$depfile,link -o $exename LDFLAGS $linker_driver_args {{ldflags}} RUSTENV {{rustenv}}" 332*6777b538SAndroid Build Coastguard Worker rust_sysroot = rust_sysroot_relative 333*6777b538SAndroid Build Coastguard Worker } 334*6777b538SAndroid Build Coastguard Worker 335*6777b538SAndroid Build Coastguard Worker tool("rust_cdylib") { 336*6777b538SAndroid Build Coastguard Worker dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 337*6777b538SAndroid Build Coastguard Worker rspfile = "$dllname.rsp" 338*6777b538SAndroid Build Coastguard Worker depfile = "$dllname.d" 339*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain:link_pool($default_toolchain)" 340*6777b538SAndroid Build Coastguard Worker 341*6777b538SAndroid Build Coastguard Worker # TODO(danakj): solink can generate TOC files for re-exporting library 342*6777b538SAndroid Build Coastguard Worker # symbols, and we should do the same here. 343*6777b538SAndroid Build Coastguard Worker 344*6777b538SAndroid Build Coastguard Worker default_output_extension = ".dylib" 345*6777b538SAndroid Build Coastguard Worker output_prefix = "lib" 346*6777b538SAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 347*6777b538SAndroid Build Coastguard Worker description = "RUST(CDYLIB) {{output}}" 348*6777b538SAndroid Build Coastguard Worker outputs = [ dllname ] 349*6777b538SAndroid Build Coastguard Worker 350*6777b538SAndroid Build Coastguard Worker # TODO(danakj): Support dsym_switch like C++ targets. 351*6777b538SAndroid Build Coastguard Worker # link_command += dsym_switch 352*6777b538SAndroid Build Coastguard Worker # if (_enable_dsyms) { 353*6777b538SAndroid Build Coastguard Worker # outputs += dsym_output 354*6777b538SAndroid Build Coastguard Worker # } 355*6777b538SAndroid Build Coastguard Worker # if (_save_unstripped_output) { 356*6777b538SAndroid Build Coastguard Worker # outputs += [ _unstripped_output ] 357*6777b538SAndroid Build Coastguard Worker # } 358*6777b538SAndroid Build Coastguard Worker 359*6777b538SAndroid Build Coastguard Worker rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}" 360*6777b538SAndroid Build Coastguard Worker command = "$linker_driver_env \"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"$linker_driver\" $rustc_common_args --emit=dep-info=$depfile,link -o $dllname LDFLAGS $linker_driver_args {{ldflags}} RUSTENV {{rustenv}}" 361*6777b538SAndroid Build Coastguard Worker rust_sysroot = rust_sysroot_relative 362*6777b538SAndroid Build Coastguard Worker } 363*6777b538SAndroid Build Coastguard Worker 364*6777b538SAndroid Build Coastguard Worker tool("rust_macro") { 365*6777b538SAndroid Build Coastguard Worker dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 366*6777b538SAndroid Build Coastguard Worker rspfile = "$dllname.rsp" 367*6777b538SAndroid Build Coastguard Worker depfile = "$dllname.d" 368*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain:link_pool($default_toolchain)" 369*6777b538SAndroid Build Coastguard Worker 370*6777b538SAndroid Build Coastguard Worker # TODO(danakj): solink can generate TOC files for re-exporting library 371*6777b538SAndroid Build Coastguard Worker # symbols, and we should do the same here. 372*6777b538SAndroid Build Coastguard Worker 373*6777b538SAndroid Build Coastguard Worker default_output_extension = ".dylib" 374*6777b538SAndroid Build Coastguard Worker output_prefix = "lib" 375*6777b538SAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 376*6777b538SAndroid Build Coastguard Worker description = "RUST(MACRO) {{output}}" 377*6777b538SAndroid Build Coastguard Worker outputs = [ dllname ] 378*6777b538SAndroid Build Coastguard Worker 379*6777b538SAndroid Build Coastguard Worker # TODO(danakj): Support dsym_switch like C++ targets. 380*6777b538SAndroid Build Coastguard Worker # link_command += dsym_switch 381*6777b538SAndroid Build Coastguard Worker # if (_enable_dsyms) { 382*6777b538SAndroid Build Coastguard Worker # outputs += dsym_output 383*6777b538SAndroid Build Coastguard Worker # } 384*6777b538SAndroid Build Coastguard Worker # if (_save_unstripped_output) { 385*6777b538SAndroid Build Coastguard Worker # outputs += [ _unstripped_output ] 386*6777b538SAndroid Build Coastguard Worker # } 387*6777b538SAndroid Build Coastguard Worker 388*6777b538SAndroid Build Coastguard Worker rspfile_content = "{{rustdeps}} {{externs}} SOURCES {{sources}}" 389*6777b538SAndroid Build Coastguard Worker command = "\"$python_path\" \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${_cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $dllname LDFLAGS {{ldflags}} RUSTENV {{rustenv}}" 390*6777b538SAndroid Build Coastguard Worker rust_sysroot = rust_sysroot_relative 391*6777b538SAndroid Build Coastguard Worker } 392*6777b538SAndroid Build Coastguard Worker } 393*6777b538SAndroid Build Coastguard Worker 394*6777b538SAndroid Build Coastguard Worker tool("cc") { 395*6777b538SAndroid Build Coastguard Worker depfile = "{{output}}.d" 396*6777b538SAndroid Build Coastguard Worker precompiled_header_type = "gcc" 397*6777b538SAndroid Build Coastguard Worker command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" 398*6777b538SAndroid Build Coastguard Worker depsformat = "gcc" 399*6777b538SAndroid Build Coastguard Worker description = "CC {{output}}" 400*6777b538SAndroid Build Coastguard Worker outputs = [ "$object_subdir/{{source_name_part}}.o" ] 401*6777b538SAndroid Build Coastguard Worker } 402*6777b538SAndroid Build Coastguard Worker 403*6777b538SAndroid Build Coastguard Worker tool("cxx") { 404*6777b538SAndroid Build Coastguard Worker depfile = "{{output}}.d" 405*6777b538SAndroid Build Coastguard Worker precompiled_header_type = "gcc" 406*6777b538SAndroid Build Coastguard Worker command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}" 407*6777b538SAndroid Build Coastguard Worker depsformat = "gcc" 408*6777b538SAndroid Build Coastguard Worker description = "CXX {{output}}" 409*6777b538SAndroid Build Coastguard Worker outputs = [ "$object_subdir/{{source_name_part}}.o" ] 410*6777b538SAndroid Build Coastguard Worker } 411*6777b538SAndroid Build Coastguard Worker 412*6777b538SAndroid Build Coastguard Worker tool("asm") { 413*6777b538SAndroid Build Coastguard Worker # For GCC we can just use the C compiler to compile assembly. 414*6777b538SAndroid Build Coastguard Worker depfile = "{{output}}.d" 415*6777b538SAndroid Build Coastguard Worker command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" 416*6777b538SAndroid Build Coastguard Worker depsformat = "gcc" 417*6777b538SAndroid Build Coastguard Worker description = "ASM {{output}}" 418*6777b538SAndroid Build Coastguard Worker outputs = [ "$object_subdir/{{source_name_part}}.o" ] 419*6777b538SAndroid Build Coastguard Worker } 420*6777b538SAndroid Build Coastguard Worker 421*6777b538SAndroid Build Coastguard Worker tool("objc") { 422*6777b538SAndroid Build Coastguard Worker depfile = "{{output}}.d" 423*6777b538SAndroid Build Coastguard Worker precompiled_header_type = "gcc" 424*6777b538SAndroid Build Coastguard Worker command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}" 425*6777b538SAndroid Build Coastguard Worker depsformat = "gcc" 426*6777b538SAndroid Build Coastguard Worker description = "OBJC {{output}}" 427*6777b538SAndroid Build Coastguard Worker outputs = [ "$object_subdir/{{source_name_part}}.o" ] 428*6777b538SAndroid Build Coastguard Worker } 429*6777b538SAndroid Build Coastguard Worker 430*6777b538SAndroid Build Coastguard Worker tool("objcxx") { 431*6777b538SAndroid Build Coastguard Worker depfile = "{{output}}.d" 432*6777b538SAndroid Build Coastguard Worker precompiled_header_type = "gcc" 433*6777b538SAndroid Build Coastguard Worker command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objcc}} -c {{source}} -o {{output}}" 434*6777b538SAndroid Build Coastguard Worker depsformat = "gcc" 435*6777b538SAndroid Build Coastguard Worker description = "OBJCXX {{output}}" 436*6777b538SAndroid Build Coastguard Worker outputs = [ "$object_subdir/{{source_name_part}}.o" ] 437*6777b538SAndroid Build Coastguard Worker } 438*6777b538SAndroid Build Coastguard Worker 439*6777b538SAndroid Build Coastguard Worker tool("alink") { 440*6777b538SAndroid Build Coastguard Worker rspfile = "{{output}}.rsp" 441*6777b538SAndroid Build Coastguard Worker rspfile_content = "{{inputs}}" 442*6777b538SAndroid Build Coastguard Worker 443*6777b538SAndroid Build Coastguard Worker if (!toolchain_uses_lld) { 444*6777b538SAndroid Build Coastguard Worker script = rebase_path("//build/toolchain/apple/filter_libtool.py", 445*6777b538SAndroid Build Coastguard Worker root_build_dir) 446*6777b538SAndroid Build Coastguard Worker 447*6777b538SAndroid Build Coastguard Worker # Specify explicit path for libtool. 448*6777b538SAndroid Build Coastguard Worker libtool = invoker.bin_path + "libtool" 449*6777b538SAndroid Build Coastguard Worker command = "rm -f {{output}} && TOOL_VERSION=${tool_versions.filter_libtool} $python_path $script $libtool -static -D {{arflags}} -o {{output}} @$rspfile" 450*6777b538SAndroid Build Coastguard Worker description = "LIBTOOL-STATIC {{output}}" 451*6777b538SAndroid Build Coastguard Worker } else { 452*6777b538SAndroid Build Coastguard Worker ar = "${prefix}llvm-ar" 453*6777b538SAndroid Build Coastguard Worker command = "\"$ar\" {{arflags}} -r -c -s -D {{output}} @$rspfile" 454*6777b538SAndroid Build Coastguard Worker 455*6777b538SAndroid Build Coastguard Worker # Remove the output file first so that ar doesn't try to modify the 456*6777b538SAndroid Build Coastguard Worker # existing file. 457*6777b538SAndroid Build Coastguard Worker command = "rm -f {{output}} && $command" 458*6777b538SAndroid Build Coastguard Worker description = "AR {{output}}" 459*6777b538SAndroid Build Coastguard Worker } 460*6777b538SAndroid Build Coastguard Worker outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ] 461*6777b538SAndroid Build Coastguard Worker default_output_dir = "{{target_out_dir}}" 462*6777b538SAndroid Build Coastguard Worker default_output_extension = ".a" 463*6777b538SAndroid Build Coastguard Worker output_prefix = "lib" 464*6777b538SAndroid Build Coastguard Worker } 465*6777b538SAndroid Build Coastguard Worker 466*6777b538SAndroid Build Coastguard Worker tool("solink") { 467*6777b538SAndroid Build Coastguard Worker # E.g. "./libfoo.dylib": 468*6777b538SAndroid Build Coastguard Worker dylib = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 469*6777b538SAndroid Build Coastguard Worker rspfile = dylib + ".rsp" 470*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain:link_pool($default_toolchain)" 471*6777b538SAndroid Build Coastguard Worker 472*6777b538SAndroid Build Coastguard Worker # These variables are not built into GN but are helpers that implement 473*6777b538SAndroid Build Coastguard Worker # (1) linking to produce a .dylib, (2) extracting the symbols from that 474*6777b538SAndroid Build Coastguard Worker # file to a temporary file, (3) if the temporary file has differences from 475*6777b538SAndroid Build Coastguard Worker # the existing .TOC file, overwrite it, otherwise, don't change it. 476*6777b538SAndroid Build Coastguard Worker # 477*6777b538SAndroid Build Coastguard Worker # As a special case, if the library reexports symbols from other dynamic 478*6777b538SAndroid Build Coastguard Worker # libraries, we always update the .TOC and skip the temporary file and 479*6777b538SAndroid Build Coastguard Worker # diffing steps, since that library always needs to be re-linked. 480*6777b538SAndroid Build Coastguard Worker tocname = dylib + ".TOC" 481*6777b538SAndroid Build Coastguard Worker temporary_tocname = dylib + ".tmp" 482*6777b538SAndroid Build Coastguard Worker 483*6777b538SAndroid Build Coastguard Worker # Use explicit paths to binaries. The binaries present on the default 484*6777b538SAndroid Build Coastguard Worker # search path in /usr/bin are thin wrappers around xcrun, which requires a 485*6777b538SAndroid Build Coastguard Worker # full CommandLineTools or Xcode install, and still may not choose the 486*6777b538SAndroid Build Coastguard Worker # appropriate binary if there are multiple installs. 487*6777b538SAndroid Build Coastguard Worker if (host_os == "mac") { 488*6777b538SAndroid Build Coastguard Worker nm = invoker.bin_path + "nm" 489*6777b538SAndroid Build Coastguard Worker otool = invoker.bin_path + "otool" 490*6777b538SAndroid Build Coastguard Worker } else { 491*6777b538SAndroid Build Coastguard Worker nm = "${prefix}llvm-nm" 492*6777b538SAndroid Build Coastguard Worker otool = "${prefix}llvm-otool" 493*6777b538SAndroid Build Coastguard Worker } 494*6777b538SAndroid Build Coastguard Worker 495*6777b538SAndroid Build Coastguard Worker does_reexport_command = "[ ! -e \"$dylib\" -o ! -e \"$tocname\" ] || $otool -l \"$dylib\" | grep -q LC_REEXPORT_DYLIB" 496*6777b538SAndroid Build Coastguard Worker 497*6777b538SAndroid Build Coastguard Worker link_command = 498*6777b538SAndroid Build Coastguard Worker "$linker_driver_env $linker_driver $linker_driver_args -shared " 499*6777b538SAndroid Build Coastguard Worker if (toolchain_is_component_build) { 500*6777b538SAndroid Build Coastguard Worker link_command += " -Wl,-install_name,@rpath/\"{{target_output_name}}{{output_extension}}\" " 501*6777b538SAndroid Build Coastguard Worker } 502*6777b538SAndroid Build Coastguard Worker link_command += dsym_switch 503*6777b538SAndroid Build Coastguard Worker link_command += "{{ldflags}} -o \"$dylib\" \"@$rspfile\" {{rlibs}}" 504*6777b538SAndroid Build Coastguard Worker 505*6777b538SAndroid Build Coastguard Worker replace_command = "if ! cmp -s \"$temporary_tocname\" \"$tocname\"; then mv \"$temporary_tocname\" \"$tocname\"" 506*6777b538SAndroid Build Coastguard Worker extract_toc_command = "{ $otool -l \"$dylib\" | grep LC_ID_DYLIB -A 5; $nm -gPp \"$dylib\" | cut -f1-2 -d' ' | grep -v U\$\$; true; }" 507*6777b538SAndroid Build Coastguard Worker 508*6777b538SAndroid Build Coastguard Worker command = "if $does_reexport_command ; then $link_command && $extract_toc_command > \"$tocname\"; else $link_command && $extract_toc_command > \"$temporary_tocname\" && $replace_command ; fi; fi" 509*6777b538SAndroid Build Coastguard Worker 510*6777b538SAndroid Build Coastguard Worker rspfile_content = 511*6777b538SAndroid Build Coastguard Worker "{{inputs}} {{frameworks}} {{swiftmodules}} {{solibs}} {{libs}}" 512*6777b538SAndroid Build Coastguard Worker 513*6777b538SAndroid Build Coastguard Worker description = "SOLINK {{output}}" 514*6777b538SAndroid Build Coastguard Worker 515*6777b538SAndroid Build Coastguard Worker # Use this for {{output_extension}} expansions unless a target manually 516*6777b538SAndroid Build Coastguard Worker # overrides it (in which case {{output_extension}} will be what the target 517*6777b538SAndroid Build Coastguard Worker # specifies). 518*6777b538SAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 519*6777b538SAndroid Build Coastguard Worker default_output_extension = ".dylib" 520*6777b538SAndroid Build Coastguard Worker 521*6777b538SAndroid Build Coastguard Worker output_prefix = "lib" 522*6777b538SAndroid Build Coastguard Worker 523*6777b538SAndroid Build Coastguard Worker # Since the above commands only updates the .TOC file when it changes, ask 524*6777b538SAndroid Build Coastguard Worker # Ninja to check if the timestamp actually changed to know if downstream 525*6777b538SAndroid Build Coastguard Worker # dependencies should be recompiled. 526*6777b538SAndroid Build Coastguard Worker restat = true 527*6777b538SAndroid Build Coastguard Worker 528*6777b538SAndroid Build Coastguard Worker # Tell GN about the output files. It will link to the dylib but use the 529*6777b538SAndroid Build Coastguard Worker # tocname for dependency management. 530*6777b538SAndroid Build Coastguard Worker outputs = [ 531*6777b538SAndroid Build Coastguard Worker dylib, 532*6777b538SAndroid Build Coastguard Worker tocname, 533*6777b538SAndroid Build Coastguard Worker ] 534*6777b538SAndroid Build Coastguard Worker link_output = dylib 535*6777b538SAndroid Build Coastguard Worker depend_output = tocname 536*6777b538SAndroid Build Coastguard Worker 537*6777b538SAndroid Build Coastguard Worker if (_enable_dsyms) { 538*6777b538SAndroid Build Coastguard Worker outputs += dsym_output 539*6777b538SAndroid Build Coastguard Worker } 540*6777b538SAndroid Build Coastguard Worker if (_save_unstripped_output) { 541*6777b538SAndroid Build Coastguard Worker outputs += [ _unstripped_output ] 542*6777b538SAndroid Build Coastguard Worker } 543*6777b538SAndroid Build Coastguard Worker } 544*6777b538SAndroid Build Coastguard Worker 545*6777b538SAndroid Build Coastguard Worker tool("solink_module") { 546*6777b538SAndroid Build Coastguard Worker # E.g. "./libfoo.so": 547*6777b538SAndroid Build Coastguard Worker sofile = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 548*6777b538SAndroid Build Coastguard Worker rspfile = sofile + ".rsp" 549*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain:link_pool($default_toolchain)" 550*6777b538SAndroid Build Coastguard Worker 551*6777b538SAndroid Build Coastguard Worker link_command = "$linker_driver_env $linker_driver $linker_driver_args -bundle {{ldflags}} -o \"$sofile\" \"@$rspfile\" {{rlibs}}" 552*6777b538SAndroid Build Coastguard Worker link_command += dsym_switch 553*6777b538SAndroid Build Coastguard Worker command = link_command 554*6777b538SAndroid Build Coastguard Worker 555*6777b538SAndroid Build Coastguard Worker rspfile_content = 556*6777b538SAndroid Build Coastguard Worker "{{inputs}} {{frameworks}} {{swiftmodules}} {{solibs}} {{libs}}" 557*6777b538SAndroid Build Coastguard Worker 558*6777b538SAndroid Build Coastguard Worker description = "SOLINK_MODULE {{output}}" 559*6777b538SAndroid Build Coastguard Worker 560*6777b538SAndroid Build Coastguard Worker # Use this for {{output_extension}} expansions unless a target manually 561*6777b538SAndroid Build Coastguard Worker # overrides it (in which case {{output_extension}} will be what the target 562*6777b538SAndroid Build Coastguard Worker # specifies). 563*6777b538SAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 564*6777b538SAndroid Build Coastguard Worker default_output_extension = ".so" 565*6777b538SAndroid Build Coastguard Worker 566*6777b538SAndroid Build Coastguard Worker outputs = [ sofile ] 567*6777b538SAndroid Build Coastguard Worker 568*6777b538SAndroid Build Coastguard Worker if (_enable_dsyms) { 569*6777b538SAndroid Build Coastguard Worker outputs += dsym_output 570*6777b538SAndroid Build Coastguard Worker } 571*6777b538SAndroid Build Coastguard Worker if (_save_unstripped_output) { 572*6777b538SAndroid Build Coastguard Worker outputs += [ _unstripped_output ] 573*6777b538SAndroid Build Coastguard Worker } 574*6777b538SAndroid Build Coastguard Worker } 575*6777b538SAndroid Build Coastguard Worker 576*6777b538SAndroid Build Coastguard Worker tool("link") { 577*6777b538SAndroid Build Coastguard Worker outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 578*6777b538SAndroid Build Coastguard Worker rspfile = "$outfile.rsp" 579*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain:link_pool($default_toolchain)" 580*6777b538SAndroid Build Coastguard Worker 581*6777b538SAndroid Build Coastguard Worker command = "$linker_driver_env $linker_driver $linker_driver_args $dsym_switch {{ldflags}} -o \"$outfile\" \"@$rspfile\" {{rlibs}}" 582*6777b538SAndroid Build Coastguard Worker description = "LINK $outfile" 583*6777b538SAndroid Build Coastguard Worker rspfile_content = 584*6777b538SAndroid Build Coastguard Worker "{{inputs}} {{frameworks}} {{swiftmodules}} {{solibs}} {{libs}}" 585*6777b538SAndroid Build Coastguard Worker outputs = [ outfile ] 586*6777b538SAndroid Build Coastguard Worker 587*6777b538SAndroid Build Coastguard Worker if (_enable_dsyms) { 588*6777b538SAndroid Build Coastguard Worker outputs += dsym_output 589*6777b538SAndroid Build Coastguard Worker } 590*6777b538SAndroid Build Coastguard Worker if (_save_unstripped_output) { 591*6777b538SAndroid Build Coastguard Worker outputs += [ _unstripped_output ] 592*6777b538SAndroid Build Coastguard Worker } 593*6777b538SAndroid Build Coastguard Worker 594*6777b538SAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 595*6777b538SAndroid Build Coastguard Worker } 596*6777b538SAndroid Build Coastguard Worker 597*6777b538SAndroid Build Coastguard Worker # These two are really entirely generic, but have to be repeated in 598*6777b538SAndroid Build Coastguard Worker # each toolchain because GN doesn't allow a template to be used here. 599*6777b538SAndroid Build Coastguard Worker # See //build/toolchain/toolchain.gni for details. 600*6777b538SAndroid Build Coastguard Worker tool("stamp") { 601*6777b538SAndroid Build Coastguard Worker command = stamp_command 602*6777b538SAndroid Build Coastguard Worker description = stamp_description 603*6777b538SAndroid Build Coastguard Worker } 604*6777b538SAndroid Build Coastguard Worker tool("copy") { 605*6777b538SAndroid Build Coastguard Worker command = copy_command 606*6777b538SAndroid Build Coastguard Worker description = copy_description 607*6777b538SAndroid Build Coastguard Worker } 608*6777b538SAndroid Build Coastguard Worker 609*6777b538SAndroid Build Coastguard Worker tool("copy_bundle_data") { 610*6777b538SAndroid Build Coastguard Worker # copy_command use hardlink if possible but this does not work with 611*6777b538SAndroid Build Coastguard Worker # directories. Also when running EG2 tests from Xcode, Xcode tries to 612*6777b538SAndroid Build Coastguard Worker # copy some files into the application bundle which fails if source 613*6777b538SAndroid Build Coastguard Worker # and destination are hardlinked together. 614*6777b538SAndroid Build Coastguard Worker # 615*6777b538SAndroid Build Coastguard Worker # Instead use clonefile to copy the files which is as efficient as 616*6777b538SAndroid Build Coastguard Worker # hardlink but ensure the file have distinct metadata (thus avoid the 617*6777b538SAndroid Build Coastguard Worker # error with ditto, see https://crbug.com/1042182). 618*6777b538SAndroid Build Coastguard Worker if (host_os == "mac") { 619*6777b538SAndroid Build Coastguard Worker command = "rm -rf {{output}} && /bin/cp -Rc {{source}} {{output}}" 620*6777b538SAndroid Build Coastguard Worker } else { 621*6777b538SAndroid Build Coastguard Worker command = "rm -rf {{output}} && /bin/cp -Rld {{source}} {{output}}" 622*6777b538SAndroid Build Coastguard Worker } 623*6777b538SAndroid Build Coastguard Worker description = "COPY_BUNDLE_DATA {{source}} {{output}}" 624*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain/apple:bundle_pool($default_toolchain)" 625*6777b538SAndroid Build Coastguard Worker } 626*6777b538SAndroid Build Coastguard Worker 627*6777b538SAndroid Build Coastguard Worker # Swift is only used on iOS, not macOS. We want to minimize the number 628*6777b538SAndroid Build Coastguard Worker # of Xcode-based tools used by the macOS toolchain, so we intentionally 629*6777b538SAndroid Build Coastguard Worker # disallow future uses of Swift on macOS. https://crbug.com/965663. 630*6777b538SAndroid Build Coastguard Worker if (toolchain_args.current_os == "ios") { 631*6777b538SAndroid Build Coastguard Worker tool("swift") { 632*6777b538SAndroid Build Coastguard Worker _tool = rebase_path("//build/toolchain/ios/swiftc.py", root_build_dir) 633*6777b538SAndroid Build Coastguard Worker 634*6777b538SAndroid Build Coastguard Worker depfile = "{{target_out_dir}}/{{module_name}}.d" 635*6777b538SAndroid Build Coastguard Worker depsformat = "gcc" 636*6777b538SAndroid Build Coastguard Worker 637*6777b538SAndroid Build Coastguard Worker _header_path = "{{target_gen_dir}}/{{target_output_name}}.h" 638*6777b538SAndroid Build Coastguard Worker _output_dir = "{{target_out_dir}}/{{label_name}}" 639*6777b538SAndroid Build Coastguard Worker 640*6777b538SAndroid Build Coastguard Worker outputs = [ 641*6777b538SAndroid Build Coastguard Worker _header_path, 642*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}-OutputFileMap.json", 643*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}.SwiftFileList", 644*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}.abi.json", 645*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}.d", 646*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}.dia", 647*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}.swiftdoc", 648*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}.swiftmodule", 649*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}.swiftsourceinfo", 650*6777b538SAndroid Build Coastguard Worker ] 651*6777b538SAndroid Build Coastguard Worker 652*6777b538SAndroid Build Coastguard Worker partial_outputs = [ "$_output_dir/{{source_name_part}}.o" ] 653*6777b538SAndroid Build Coastguard Worker 654*6777b538SAndroid Build Coastguard Worker # The list of outputs and partial_outputs change whether the whole 655*6777b538SAndroid Build Coastguard Worker # module optimization is enabled or not. 656*6777b538SAndroid Build Coastguard Worker if (swift_whole_module_optimization) { 657*6777b538SAndroid Build Coastguard Worker outputs += [ 658*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}.swiftconstvalues", 659*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{module_name}}.swiftdeps", 660*6777b538SAndroid Build Coastguard Worker ] 661*6777b538SAndroid Build Coastguard Worker } else { 662*6777b538SAndroid Build Coastguard Worker outputs += [ "$_output_dir/{{module_name}}.priors" ] 663*6777b538SAndroid Build Coastguard Worker partial_outputs += [ 664*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{source_name_part}}.d", 665*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{source_name_part}}.dia", 666*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{source_name_part}}.swiftdeps", 667*6777b538SAndroid Build Coastguard Worker "$_output_dir/{{source_name_part}}.swiftconstvalues", 668*6777b538SAndroid Build Coastguard Worker ] 669*6777b538SAndroid Build Coastguard Worker } 670*6777b538SAndroid Build Coastguard Worker 671*6777b538SAndroid Build Coastguard Worker # If configured to keep the intermediate build files, pass the flag 672*6777b538SAndroid Build Coastguard Worker # to the script and inform gn of the stamp file only (as the other 673*6777b538SAndroid Build Coastguard Worker # files have names that cannot be predicted without invoking swiftc). 674*6777b538SAndroid Build Coastguard Worker if (swift_keep_intermediate_files) { 675*6777b538SAndroid Build Coastguard Worker _derived_data_dir = "$_output_dir/DerivedData" 676*6777b538SAndroid Build Coastguard Worker outputs += [ "$_derived_data_dir/{{module_name}}.stamp" ] 677*6777b538SAndroid Build Coastguard Worker } 678*6777b538SAndroid Build Coastguard Worker 679*6777b538SAndroid Build Coastguard Worker # Additional flags passed to the wrapper script but that are only 680*6777b538SAndroid Build Coastguard Worker # set conditionally. 681*6777b538SAndroid Build Coastguard Worker _extra_flags = "" 682*6777b538SAndroid Build Coastguard Worker 683*6777b538SAndroid Build Coastguard Worker # Environment variables passed to the wrapper script. Considered 684*6777b538SAndroid Build Coastguard Worker # part of the command-line by ninja (and thus cause the build to 685*6777b538SAndroid Build Coastguard Worker # be considered dirty if they change) without having to be parsed 686*6777b538SAndroid Build Coastguard Worker # by the script. 687*6777b538SAndroid Build Coastguard Worker _env_vars = "TOOL_VERSION=${tool_versions.swiftc} " + 688*6777b538SAndroid Build Coastguard Worker "JSON_VERSION=${tool_versions.const_extract_protocols}" 689*6777b538SAndroid Build Coastguard Worker 690*6777b538SAndroid Build Coastguard Worker # Include the version of the compiler on the command-line. This causes 691*6777b538SAndroid Build Coastguard Worker # `ninja` to consider all the compilation output to be dirty when the 692*6777b538SAndroid Build Coastguard Worker # version changes. 693*6777b538SAndroid Build Coastguard Worker if (defined(swiftc_version)) { 694*6777b538SAndroid Build Coastguard Worker _env_vars += " SWIFTC_VERSION=$swiftc_version" 695*6777b538SAndroid Build Coastguard Worker } 696*6777b538SAndroid Build Coastguard Worker 697*6777b538SAndroid Build Coastguard Worker # Include the version of Xcode on the command-line (if specified via 698*6777b538SAndroid Build Coastguard Worker # toolchain_args). This causes `ninja` to consider all the compilation 699*6777b538SAndroid Build Coastguard Worker # outputs to be dirty when the version change. 700*6777b538SAndroid Build Coastguard Worker # 701*6777b538SAndroid Build Coastguard Worker # This is required because sometimes module dependency changes between 702*6777b538SAndroid Build Coastguard Worker # different version of Xcode (e.g. when moving from Xcode 14 beta 6 to 703*6777b538SAndroid Build Coastguard Worker # Xcode 14 RC). If the swiftmodule are not rebuilt when the version 704*6777b538SAndroid Build Coastguard Worker # changes, they may encode dependency on now non-existing frameworks 705*6777b538SAndroid Build Coastguard Worker # causing linker failures ultimately. 706*6777b538SAndroid Build Coastguard Worker if (defined(toolchain_args.xcode_build)) { 707*6777b538SAndroid Build Coastguard Worker _env_vars += " XCODE_VERSION=${toolchain_args.xcode_build}" 708*6777b538SAndroid Build Coastguard Worker } 709*6777b538SAndroid Build Coastguard Worker 710*6777b538SAndroid Build Coastguard Worker if (invoker.sdk_developer_dir != "") { 711*6777b538SAndroid Build Coastguard Worker _env_vars += " DEVELOPER_DIR=${toolchain_args.sdk_developer_dir}" 712*6777b538SAndroid Build Coastguard Worker } 713*6777b538SAndroid Build Coastguard Worker 714*6777b538SAndroid Build Coastguard Worker if (swift_toolchain_path != "") { 715*6777b538SAndroid Build Coastguard Worker _extra_flags += " --swift-toolchain-path " + 716*6777b538SAndroid Build Coastguard Worker rebase_path(swift_toolchain_path, root_build_dir) 717*6777b538SAndroid Build Coastguard Worker } 718*6777b538SAndroid Build Coastguard Worker 719*6777b538SAndroid Build Coastguard Worker if (swift_whole_module_optimization) { 720*6777b538SAndroid Build Coastguard Worker _extra_flags += " --whole-module-optimization" 721*6777b538SAndroid Build Coastguard Worker } 722*6777b538SAndroid Build Coastguard Worker 723*6777b538SAndroid Build Coastguard Worker if (swift_keep_intermediate_files) { 724*6777b538SAndroid Build Coastguard Worker _extra_flags += " --derived-data-dir $_derived_data_dir" 725*6777b538SAndroid Build Coastguard Worker } 726*6777b538SAndroid Build Coastguard Worker 727*6777b538SAndroid Build Coastguard Worker # The Swift compiler assumes that the generated header will be used by 728*6777b538SAndroid Build Coastguard Worker # Objective-C code compiled with module support enabled (-fmodules). 729*6777b538SAndroid Build Coastguard Worker # 730*6777b538SAndroid Build Coastguard Worker # As Chromium code is compiled without support for modules (i.e. the 731*6777b538SAndroid Build Coastguard Worker # code is compiled without `-fmodules`), the dependent modules are not 732*6777b538SAndroid Build Coastguard Worker # imported from the generated header, which causes compilation failure 733*6777b538SAndroid Build Coastguard Worker # if the client code does not first import the required modules (see 734*6777b538SAndroid Build Coastguard Worker # https://crbug.com/1316061 for details). 735*6777b538SAndroid Build Coastguard Worker # 736*6777b538SAndroid Build Coastguard Worker # Secondly, the Swift compiler uses absolute path when importing other 737*6777b538SAndroid Build Coastguard Worker # modules' generated headers or Objective-C bridging headers. This 738*6777b538SAndroid Build Coastguard Worker # causes issues with the distributed compiler (i.e. reclient or siso) 739*6777b538SAndroid Build Coastguard Worker # as they want all paths to be relative to the source directory. 740*6777b538SAndroid Build Coastguard Worker # 741*6777b538SAndroid Build Coastguard Worker # Instruct swiftc.py to rewrite the generated header use relative 742*6777b538SAndroid Build Coastguard Worker # import and to use the old #import syntax for system frameworks. 743*6777b538SAndroid Build Coastguard Worker _extra_flags += " --fix-generated-header" 744*6777b538SAndroid Build Coastguard Worker 745*6777b538SAndroid Build Coastguard Worker _src_dir = rebase_path("//", root_build_dir) 746*6777b538SAndroid Build Coastguard Worker _gen_dir = rebase_path(root_gen_dir, root_build_dir) 747*6777b538SAndroid Build Coastguard Worker _const_gather_protocols_file = 748*6777b538SAndroid Build Coastguard Worker rebase_path("//build/toolchain/ios/const_extract_protocols.json", 749*6777b538SAndroid Build Coastguard Worker root_build_dir) 750*6777b538SAndroid Build Coastguard Worker 751*6777b538SAndroid Build Coastguard Worker command = 752*6777b538SAndroid Build Coastguard Worker "$_env_vars $python_path $_tool --module-name {{module_name}} " + 753*6777b538SAndroid Build Coastguard Worker "--header-path $_header_path --target-out-dir $_output_dir " + 754*6777b538SAndroid Build Coastguard Worker "--const-gather-protocols-file $_const_gather_protocols_file " + 755*6777b538SAndroid Build Coastguard Worker "--depfile-path $depfile --src-dir $_src_dir --gen-dir $_gen_dir " + 756*6777b538SAndroid Build Coastguard Worker "--bridge-header {{bridge_header}} {{include_dirs}} " + 757*6777b538SAndroid Build Coastguard Worker "{{module_dirs}} {{swiftflags}} {{inputs}}$_extra_flags" 758*6777b538SAndroid Build Coastguard Worker 759*6777b538SAndroid Build Coastguard Worker description = "SWIFT $_output_dir/{{module_name}}.swiftmodule" 760*6777b538SAndroid Build Coastguard Worker } 761*6777b538SAndroid Build Coastguard Worker } 762*6777b538SAndroid Build Coastguard Worker 763*6777b538SAndroid Build Coastguard Worker # xcassets are only used on iOS, not macOS. We want to minimize the number 764*6777b538SAndroid Build Coastguard Worker # of Xcode-based tools used by the macOS toolchain, so we intentionally 765*6777b538SAndroid Build Coastguard Worker # disallow future uses of xcassets on macOS. https://crbug.com/965663. 766*6777b538SAndroid Build Coastguard Worker if (toolchain_args.current_os == "ios") { 767*6777b538SAndroid Build Coastguard Worker tool("compile_xcassets") { 768*6777b538SAndroid Build Coastguard Worker _tool = rebase_path("//build/toolchain/ios/compile_xcassets.py", 769*6777b538SAndroid Build Coastguard Worker root_build_dir) 770*6777b538SAndroid Build Coastguard Worker 771*6777b538SAndroid Build Coastguard Worker _env_vars = "TOOL_VERSION=${tool_versions.compile_xcassets}" 772*6777b538SAndroid Build Coastguard Worker if (invoker.sdk_developer_dir != "") { 773*6777b538SAndroid Build Coastguard Worker _env_vars += " DEVELOPER_DIR=${toolchain_args.sdk_developer_dir}" 774*6777b538SAndroid Build Coastguard Worker } 775*6777b538SAndroid Build Coastguard Worker 776*6777b538SAndroid Build Coastguard Worker command = 777*6777b538SAndroid Build Coastguard Worker "$_env_vars $python_path $_tool " + 778*6777b538SAndroid Build Coastguard Worker "-p '${toolchain_args.current_os}' " + 779*6777b538SAndroid Build Coastguard Worker "-e '${invoker.target_environment}' " + 780*6777b538SAndroid Build Coastguard Worker "-t '${invoker.deployment_target}' " + 781*6777b538SAndroid Build Coastguard Worker "-T '{{bundle_product_type}}' " + 782*6777b538SAndroid Build Coastguard Worker "-P '{{bundle_partial_info_plist}}' " + "-o {{output}} {{inputs}}" 783*6777b538SAndroid Build Coastguard Worker 784*6777b538SAndroid Build Coastguard Worker description = "COMPILE_XCASSETS {{output}}" 785*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain/apple:bundle_pool($default_toolchain)" 786*6777b538SAndroid Build Coastguard Worker } 787*6777b538SAndroid Build Coastguard Worker } 788*6777b538SAndroid Build Coastguard Worker 789*6777b538SAndroid Build Coastguard Worker tool("action") { 790*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain:action_pool($default_toolchain)" 791*6777b538SAndroid Build Coastguard Worker } 792*6777b538SAndroid Build Coastguard Worker } 793*6777b538SAndroid Build Coastguard Worker} 794*6777b538SAndroid Build Coastguard Worker 795*6777b538SAndroid Build Coastguard Worker# Makes an Apple toolchain for the target, and an equivalent toolchain with the 796*6777b538SAndroid Build Coastguard Worker# prebuilt Rust stdlib for building proc macros (and other for-build-use 797*6777b538SAndroid Build Coastguard Worker# artifacts). 798*6777b538SAndroid Build Coastguard Workertemplate("apple_toolchain") { 799*6777b538SAndroid Build Coastguard Worker single_apple_toolchain(target_name) { 800*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.toolchain_args), 801*6777b538SAndroid Build Coastguard Worker "Toolchains must declare toolchain_args") 802*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, 803*6777b538SAndroid Build Coastguard Worker "*", 804*6777b538SAndroid Build Coastguard Worker [ 805*6777b538SAndroid Build Coastguard Worker "visibility", 806*6777b538SAndroid Build Coastguard Worker "test_only", 807*6777b538SAndroid Build Coastguard Worker ]) 808*6777b538SAndroid Build Coastguard Worker 809*6777b538SAndroid Build Coastguard Worker # No need to forward visibility and test_only as they apply to targets not 810*6777b538SAndroid Build Coastguard Worker # toolchains, but presubmit checks require that we explicitly exclude them 811*6777b538SAndroid Build Coastguard Worker } 812*6777b538SAndroid Build Coastguard Worker 813*6777b538SAndroid Build Coastguard Worker if (enable_rust && current_toolchain == default_toolchain) { 814*6777b538SAndroid Build Coastguard Worker # Make an additional toolchain which is used for making tools that are run 815*6777b538SAndroid Build Coastguard Worker # on the host machine as part of the build process (such as proc macros 816*6777b538SAndroid Build Coastguard Worker # and Cargo build scripts). This toolchain uses the prebuilt stdlib that 817*6777b538SAndroid Build Coastguard Worker # comes with the compiler, so it doesn't have to wait for the stdlib to be 818*6777b538SAndroid Build Coastguard Worker # built before building other stuff. And this ensures its proc macro 819*6777b538SAndroid Build Coastguard Worker # outputs have the right ABI to be loaded by the compiler, and it can be 820*6777b538SAndroid Build Coastguard Worker # used to compile build scripts that are part of the stdlib that is built 821*6777b538SAndroid Build Coastguard Worker # for the default toolchain. 822*6777b538SAndroid Build Coastguard Worker single_apple_toolchain("${target_name}_for_rust_host_build_tools") { 823*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.toolchain_args), 824*6777b538SAndroid Build Coastguard Worker "Toolchains must declare toolchain_args") 825*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, 826*6777b538SAndroid Build Coastguard Worker "*", 827*6777b538SAndroid Build Coastguard Worker [ 828*6777b538SAndroid Build Coastguard Worker "toolchain_args", 829*6777b538SAndroid Build Coastguard Worker "visibility", 830*6777b538SAndroid Build Coastguard Worker "test_only", 831*6777b538SAndroid Build Coastguard Worker ]) 832*6777b538SAndroid Build Coastguard Worker toolchain_args = { 833*6777b538SAndroid Build Coastguard Worker # Populate toolchain args from the invoker. 834*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker.toolchain_args, "*") 835*6777b538SAndroid Build Coastguard Worker toolchain_for_rust_host_build_tools = true 836*6777b538SAndroid Build Coastguard Worker 837*6777b538SAndroid Build Coastguard Worker # The host build tools are static release builds to make the Chromium 838*6777b538SAndroid Build Coastguard Worker # build faster. They do not need PGO etc, so no official builds. 839*6777b538SAndroid Build Coastguard Worker is_debug = false 840*6777b538SAndroid Build Coastguard Worker is_component_build = false 841*6777b538SAndroid Build Coastguard Worker is_official_build = false 842*6777b538SAndroid Build Coastguard Worker use_clang_coverage = false 843*6777b538SAndroid Build Coastguard Worker use_sanitizer_coverage = false 844*6777b538SAndroid Build Coastguard Worker generate_linker_map = false 845*6777b538SAndroid Build Coastguard Worker use_thin_lto = false 846*6777b538SAndroid Build Coastguard Worker } 847*6777b538SAndroid Build Coastguard Worker } 848*6777b538SAndroid Build Coastguard Worker } 849*6777b538SAndroid Build Coastguard Worker} 850