xref: /aosp_15_r20/external/angle/build/config/siso/rust_linux.star (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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