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