1*8975f5c5SAndroid Build Coastguard Worker# -*- bazel-starlark -*- 2*8975f5c5SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors 3*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker"""Siso configuration for rust/linux.""" 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Workerload("@builtin//path.star", "path") 8*8975f5c5SAndroid Build Coastguard Workerload("@builtin//struct.star", "module") 9*8975f5c5SAndroid Build Coastguard Workerload("./config.star", "config") 10*8975f5c5SAndroid Build Coastguard Workerload("./fuchsia.star", "fuchsia") 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Workerdef __filegroups(ctx): 13*8975f5c5SAndroid Build Coastguard Worker fg = { 14*8975f5c5SAndroid Build Coastguard Worker "third_party/rust-toolchain:toolchain": { 15*8975f5c5SAndroid Build Coastguard Worker "type": "glob", 16*8975f5c5SAndroid Build Coastguard Worker "includes": [ 17*8975f5c5SAndroid Build Coastguard Worker "bin/rustc", 18*8975f5c5SAndroid Build Coastguard Worker "lib/*.so", 19*8975f5c5SAndroid Build Coastguard Worker "lib/libclang.so.*", 20*8975f5c5SAndroid Build Coastguard Worker "lib/rustlib/src/rust/library/std/src/lib.rs", 21*8975f5c5SAndroid Build Coastguard Worker "lib/rustlib/x86_64-unknown-linux-gnu/lib/*", 22*8975f5c5SAndroid Build Coastguard Worker ], 23*8975f5c5SAndroid Build Coastguard Worker }, 24*8975f5c5SAndroid Build Coastguard Worker "third_party/rust:rustlib": { 25*8975f5c5SAndroid Build Coastguard Worker "type": "glob", 26*8975f5c5SAndroid Build Coastguard Worker "includes": [ 27*8975f5c5SAndroid Build Coastguard Worker "*.rs", 28*8975f5c5SAndroid Build Coastguard Worker ], 29*8975f5c5SAndroid Build Coastguard Worker }, 30*8975f5c5SAndroid Build Coastguard Worker "build/linux/debian_bullseye_amd64-sysroot:rustlink": { 31*8975f5c5SAndroid Build Coastguard Worker "type": "glob", 32*8975f5c5SAndroid Build Coastguard Worker "includes": [ 33*8975f5c5SAndroid Build Coastguard Worker "*.so", 34*8975f5c5SAndroid Build Coastguard Worker "*.so.*", 35*8975f5c5SAndroid Build Coastguard Worker "*.o", 36*8975f5c5SAndroid Build Coastguard Worker "*.a", 37*8975f5c5SAndroid Build Coastguard Worker ], 38*8975f5c5SAndroid Build Coastguard Worker }, 39*8975f5c5SAndroid Build Coastguard Worker "third_party/llvm-build/Release+Asserts:rustlink": { 40*8975f5c5SAndroid Build Coastguard Worker "type": "glob", 41*8975f5c5SAndroid Build Coastguard Worker "includes": [ 42*8975f5c5SAndroid Build Coastguard Worker "bin/clang", 43*8975f5c5SAndroid Build Coastguard Worker "bin/clang++", 44*8975f5c5SAndroid Build Coastguard Worker "bin/*lld", 45*8975f5c5SAndroid Build Coastguard Worker "libclang*.a", 46*8975f5c5SAndroid Build Coastguard Worker ], 47*8975f5c5SAndroid Build Coastguard Worker }, 48*8975f5c5SAndroid Build Coastguard Worker } 49*8975f5c5SAndroid Build Coastguard Worker if fuchsia.enabled(ctx): 50*8975f5c5SAndroid Build Coastguard Worker fg.update(fuchsia.filegroups(ctx)) 51*8975f5c5SAndroid Build Coastguard Worker return fg 52*8975f5c5SAndroid Build Coastguard Worker 53*8975f5c5SAndroid Build Coastguard Workerdef __rust_link_handler(ctx, cmd): 54*8975f5c5SAndroid Build Coastguard Worker inputs = [] 55*8975f5c5SAndroid Build Coastguard Worker use_android_toolchain = None 56*8975f5c5SAndroid Build Coastguard Worker target = None 57*8975f5c5SAndroid Build Coastguard Worker args = cmd.args 58*8975f5c5SAndroid Build Coastguard Worker 59*8975f5c5SAndroid Build Coastguard Worker # there is a case that command line sets environment variable 60*8975f5c5SAndroid Build Coastguard Worker # like `TOOL_VERSION=xxxx "python3" ..` 61*8975f5c5SAndroid Build Coastguard Worker if args[0] == "/bin/sh": 62*8975f5c5SAndroid Build Coastguard Worker args = args[2].split(" ") 63*8975f5c5SAndroid Build Coastguard Worker for i, arg in enumerate(args): 64*8975f5c5SAndroid Build Coastguard Worker if arg.startswith("--sysroot=../../third_party/fuchsia-sdk/sdk"): 65*8975f5c5SAndroid Build Coastguard Worker sysroot = ctx.fs.canonpath(arg.removeprefix("--sysroot=")) 66*8975f5c5SAndroid Build Coastguard Worker libpath = path.join(path.dir(sysroot), "lib") 67*8975f5c5SAndroid Build Coastguard Worker inputs.extend([ 68*8975f5c5SAndroid Build Coastguard Worker sysroot + ":link", 69*8975f5c5SAndroid Build Coastguard Worker libpath + ":link", 70*8975f5c5SAndroid Build Coastguard Worker ]) 71*8975f5c5SAndroid Build Coastguard Worker elif arg.startswith("--sysroot=../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot"): 72*8975f5c5SAndroid Build Coastguard Worker use_android_toolchain = True 73*8975f5c5SAndroid Build Coastguard Worker inputs.append("third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot:headers") 74*8975f5c5SAndroid Build Coastguard Worker if arg == "-isysroot": 75*8975f5c5SAndroid Build Coastguard Worker sysroot = ctx.fs.canonpath(args[i + 1]) 76*8975f5c5SAndroid Build Coastguard Worker inputs.extend([ 77*8975f5c5SAndroid Build Coastguard Worker sysroot + ":link", 78*8975f5c5SAndroid Build Coastguard Worker ]) 79*8975f5c5SAndroid Build Coastguard Worker if arg.startswith("--target="): 80*8975f5c5SAndroid Build Coastguard Worker target = arg.removeprefix("--target=") 81*8975f5c5SAndroid Build Coastguard Worker if arg.startswith("-Clinker="): 82*8975f5c5SAndroid Build Coastguard Worker linker = arg.removeprefix("-Clinker=") 83*8975f5c5SAndroid Build Coastguard Worker if linker.startswith("\""): 84*8975f5c5SAndroid Build Coastguard Worker linker = linker[1:len(linker) - 1] 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker # TODO(crbug.com/380798907): expand input_deps, instead of using label? 87*8975f5c5SAndroid Build Coastguard Worker inputs.append(ctx.fs.canonpath(linker) + ":link") 88*8975f5c5SAndroid Build Coastguard Worker if use_android_toolchain and target: 89*8975f5c5SAndroid Build Coastguard Worker # e.g. target=aarch64-linux-android26 90*8975f5c5SAndroid Build Coastguard Worker android_ver = "" 91*8975f5c5SAndroid Build Coastguard Worker i = target.find("android") 92*8975f5c5SAndroid Build Coastguard Worker if i >= 0: 93*8975f5c5SAndroid Build Coastguard Worker android_ver = target[i:].removeprefix("android").removeprefix("eabi") 94*8975f5c5SAndroid Build Coastguard Worker if android_ver: 95*8975f5c5SAndroid Build Coastguard Worker android_arch = target.removesuffix(android_ver) 96*8975f5c5SAndroid Build Coastguard Worker filegroup = "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/%s/%s:link" % (android_arch, android_ver) 97*8975f5c5SAndroid Build Coastguard Worker inputs.append(filegroup) 98*8975f5c5SAndroid Build Coastguard Worker ctx.actions.fix(inputs = cmd.inputs + inputs) 99*8975f5c5SAndroid Build Coastguard Worker 100*8975f5c5SAndroid Build Coastguard Workerdef __rust_build_handler(ctx, cmd): 101*8975f5c5SAndroid Build Coastguard Worker inputs = [] 102*8975f5c5SAndroid Build Coastguard Worker for i, arg in enumerate(cmd.args): 103*8975f5c5SAndroid Build Coastguard Worker if arg == "--src-dir": 104*8975f5c5SAndroid Build Coastguard Worker inputs.append(ctx.fs.canonpath(cmd.args[i + 1])) 105*8975f5c5SAndroid Build Coastguard Worker ctx.actions.fix(inputs = cmd.inputs + inputs) 106*8975f5c5SAndroid Build Coastguard Worker 107*8975f5c5SAndroid Build Coastguard Worker__handlers = { 108*8975f5c5SAndroid Build Coastguard Worker "rust_link_handler": __rust_link_handler, 109*8975f5c5SAndroid Build Coastguard Worker "rust_build_handler": __rust_build_handler, 110*8975f5c5SAndroid Build Coastguard Worker} 111*8975f5c5SAndroid Build Coastguard Worker 112*8975f5c5SAndroid Build Coastguard Workerdef __step_config(ctx, step_config): 113*8975f5c5SAndroid Build Coastguard Worker platform_ref = "large" # Rust actions run faster on large workers. 114*8975f5c5SAndroid Build Coastguard Worker clang_inputs = [ 115*8975f5c5SAndroid Build Coastguard Worker "build/linux/debian_bullseye_amd64-sysroot:rustlink", 116*8975f5c5SAndroid Build Coastguard Worker "third_party/llvm-build/Release+Asserts:rustlink", 117*8975f5c5SAndroid Build Coastguard Worker ] 118*8975f5c5SAndroid Build Coastguard Worker rust_toolchain = [ 119*8975f5c5SAndroid Build Coastguard Worker # TODO(b/285225184): use precomputed subtree 120*8975f5c5SAndroid Build Coastguard Worker "third_party/rust-toolchain:toolchain", 121*8975f5c5SAndroid Build Coastguard Worker ] 122*8975f5c5SAndroid Build Coastguard Worker rust_inputs = [ 123*8975f5c5SAndroid Build Coastguard Worker "build/action_helpers.py", 124*8975f5c5SAndroid Build Coastguard Worker "build/gn_helpers.py", 125*8975f5c5SAndroid Build Coastguard Worker "build/rust/rustc_wrapper.py", 126*8975f5c5SAndroid Build Coastguard Worker ] + rust_toolchain 127*8975f5c5SAndroid Build Coastguard Worker rust_indirect_inputs = { 128*8975f5c5SAndroid Build Coastguard Worker "includes": [ 129*8975f5c5SAndroid Build Coastguard Worker "*.h", 130*8975f5c5SAndroid Build Coastguard Worker "*.o", 131*8975f5c5SAndroid Build Coastguard Worker "*.rlib", 132*8975f5c5SAndroid Build Coastguard Worker "*.rs", 133*8975f5c5SAndroid Build Coastguard Worker "*.so", 134*8975f5c5SAndroid Build Coastguard Worker ], 135*8975f5c5SAndroid Build Coastguard Worker } 136*8975f5c5SAndroid Build Coastguard Worker step_config["rules"].extend([ 137*8975f5c5SAndroid Build Coastguard Worker { 138*8975f5c5SAndroid Build Coastguard Worker "name": "rust_bin", 139*8975f5c5SAndroid Build Coastguard Worker "action": "(.*_)?rust_bin", 140*8975f5c5SAndroid Build Coastguard Worker "inputs": rust_inputs + clang_inputs, 141*8975f5c5SAndroid Build Coastguard Worker "indirect_inputs": rust_indirect_inputs, 142*8975f5c5SAndroid Build Coastguard Worker "handler": "rust_link_handler", 143*8975f5c5SAndroid Build Coastguard Worker "deps": "none", # disable gcc scandeps 144*8975f5c5SAndroid Build Coastguard Worker "remote": True, 145*8975f5c5SAndroid Build Coastguard Worker # "canonicalize_dir": True, # TODO(b/300352286) 146*8975f5c5SAndroid Build Coastguard Worker "timeout": "2m", 147*8975f5c5SAndroid Build Coastguard Worker "platform_ref": platform_ref, 148*8975f5c5SAndroid Build Coastguard Worker }, 149*8975f5c5SAndroid Build Coastguard Worker { 150*8975f5c5SAndroid Build Coastguard Worker "name": "rust_cdylib", 151*8975f5c5SAndroid Build Coastguard Worker "action": "(.*_)?rust_cdylib", 152*8975f5c5SAndroid Build Coastguard Worker "inputs": rust_inputs + clang_inputs, 153*8975f5c5SAndroid Build Coastguard Worker "indirect_inputs": rust_indirect_inputs, 154*8975f5c5SAndroid Build Coastguard Worker "handler": "rust_link_handler", 155*8975f5c5SAndroid Build Coastguard Worker "deps": "none", # disable gcc scandeps 156*8975f5c5SAndroid Build Coastguard Worker "remote": True, 157*8975f5c5SAndroid Build Coastguard Worker # "canonicalize_dir": True, # TODO(b/300352286) 158*8975f5c5SAndroid Build Coastguard Worker "timeout": "2m", 159*8975f5c5SAndroid Build Coastguard Worker "platform_ref": platform_ref, 160*8975f5c5SAndroid Build Coastguard Worker }, 161*8975f5c5SAndroid Build Coastguard Worker { 162*8975f5c5SAndroid Build Coastguard Worker "name": "rust_macro", 163*8975f5c5SAndroid Build Coastguard Worker "action": "(.*_)?rust_macro", 164*8975f5c5SAndroid Build Coastguard Worker "inputs": rust_inputs + clang_inputs, 165*8975f5c5SAndroid Build Coastguard Worker "indirect_inputs": rust_indirect_inputs, 166*8975f5c5SAndroid Build Coastguard Worker "handler": "rust_link_handler", 167*8975f5c5SAndroid Build Coastguard Worker "deps": "none", # disable gcc scandeps 168*8975f5c5SAndroid Build Coastguard Worker # "canonicalize_dir": True, # TODO(b/300352286) 169*8975f5c5SAndroid Build Coastguard Worker "remote": True, 170*8975f5c5SAndroid Build Coastguard Worker "timeout": "2m", 171*8975f5c5SAndroid Build Coastguard Worker "platform_ref": platform_ref, 172*8975f5c5SAndroid Build Coastguard Worker }, 173*8975f5c5SAndroid Build Coastguard Worker { 174*8975f5c5SAndroid Build Coastguard Worker "name": "rust_rlib", 175*8975f5c5SAndroid Build Coastguard Worker "action": "(.*_)?rust_rlib", 176*8975f5c5SAndroid Build Coastguard Worker "inputs": rust_inputs, 177*8975f5c5SAndroid Build Coastguard Worker "indirect_inputs": rust_indirect_inputs, 178*8975f5c5SAndroid Build Coastguard Worker "deps": "none", # disable gcc scandeps 179*8975f5c5SAndroid Build Coastguard Worker "remote": True, 180*8975f5c5SAndroid Build Coastguard Worker # "canonicalize_dir": True, # TODO(b/300352286) 181*8975f5c5SAndroid Build Coastguard Worker "timeout": "2m", 182*8975f5c5SAndroid Build Coastguard Worker "platform_ref": platform_ref, 183*8975f5c5SAndroid Build Coastguard Worker }, 184*8975f5c5SAndroid Build Coastguard Worker { 185*8975f5c5SAndroid Build Coastguard Worker "name": "rust_staticlib", 186*8975f5c5SAndroid Build Coastguard Worker "action": "(.*_)?rust_staticlib", 187*8975f5c5SAndroid Build Coastguard Worker "inputs": rust_inputs, 188*8975f5c5SAndroid Build Coastguard Worker "indirect_inputs": rust_indirect_inputs, 189*8975f5c5SAndroid Build Coastguard Worker "deps": "none", # disable gcc scandeps 190*8975f5c5SAndroid Build Coastguard Worker "remote": True, 191*8975f5c5SAndroid Build Coastguard Worker # "canonicalize_dir": True, # TODO(b/300352286) 192*8975f5c5SAndroid Build Coastguard Worker "timeout": "2m", 193*8975f5c5SAndroid Build Coastguard Worker "platform_ref": platform_ref, 194*8975f5c5SAndroid Build Coastguard Worker }, 195*8975f5c5SAndroid Build Coastguard Worker { 196*8975f5c5SAndroid Build Coastguard Worker "name": "rust/run_build_script", 197*8975f5c5SAndroid Build Coastguard Worker "command_prefix": "python3 ../../build/rust/run_build_script.py", 198*8975f5c5SAndroid Build Coastguard Worker "inputs": [ 199*8975f5c5SAndroid Build Coastguard Worker "third_party/rust-toolchain:toolchain", 200*8975f5c5SAndroid Build Coastguard Worker "third_party/rust:rustlib", 201*8975f5c5SAndroid Build Coastguard Worker ], 202*8975f5c5SAndroid Build Coastguard Worker "handler": "rust_build_handler", 203*8975f5c5SAndroid Build Coastguard Worker "remote": config.get(ctx, "cog"), 204*8975f5c5SAndroid Build Coastguard Worker "input_root_absolute_path": True, 205*8975f5c5SAndroid Build Coastguard Worker "timeout": "2m", 206*8975f5c5SAndroid Build Coastguard Worker }, 207*8975f5c5SAndroid Build Coastguard Worker { 208*8975f5c5SAndroid Build Coastguard Worker "name": "rust/find_std_rlibs", 209*8975f5c5SAndroid Build Coastguard Worker "command_prefix": "python3 ../../build/rust/std/find_std_rlibs.py", 210*8975f5c5SAndroid Build Coastguard Worker "inputs": [ 211*8975f5c5SAndroid Build Coastguard Worker "third_party/rust-toolchain:toolchain", 212*8975f5c5SAndroid Build Coastguard Worker "third_party/rust-toolchain/lib/rustlib:rlib", 213*8975f5c5SAndroid Build Coastguard Worker ], 214*8975f5c5SAndroid Build Coastguard Worker "remote": config.get(ctx, "cog"), 215*8975f5c5SAndroid Build Coastguard Worker "input_root_absolute_path": True, 216*8975f5c5SAndroid Build Coastguard Worker "timeout": "2m", 217*8975f5c5SAndroid Build Coastguard Worker }, 218*8975f5c5SAndroid Build Coastguard Worker { 219*8975f5c5SAndroid Build Coastguard Worker # rust/bindgen fails remotely when *.d does not exist. 220*8975f5c5SAndroid Build Coastguard Worker # TODO(b/356496947): need to run scandeps? 221*8975f5c5SAndroid Build Coastguard Worker "name": "rust/bindgen", 222*8975f5c5SAndroid Build Coastguard Worker "command_prefix": "python3 ../../build/rust/run_bindgen.py", 223*8975f5c5SAndroid Build Coastguard Worker "inputs": rust_toolchain + clang_inputs, 224*8975f5c5SAndroid Build Coastguard Worker "remote": False, 225*8975f5c5SAndroid Build Coastguard Worker "timeout": "2m", 226*8975f5c5SAndroid Build Coastguard Worker }, 227*8975f5c5SAndroid Build Coastguard Worker ]) 228*8975f5c5SAndroid Build Coastguard Worker return step_config 229*8975f5c5SAndroid Build Coastguard Worker 230*8975f5c5SAndroid Build Coastguard Workerrust = module( 231*8975f5c5SAndroid Build Coastguard Worker "rust", 232*8975f5c5SAndroid Build Coastguard Worker filegroups = __filegroups, 233*8975f5c5SAndroid Build Coastguard Worker handlers = __handlers, 234*8975f5c5SAndroid Build Coastguard Worker step_config = __step_config, 235*8975f5c5SAndroid Build Coastguard Worker) 236