xref: /aosp_15_r20/external/angle/build/config/siso/cros.star (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1# -*- bazel-starlark -*-
2# Copyright 2023 The Chromium Authors
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5"""Siso configuration for ChromeOS builds."""
6
7load("@builtin//lib/gn.star", "gn")
8load("@builtin//path.star", "path")
9load("@builtin//struct.star", "module")
10load("./config.star", "config")
11
12def __cros_gn_args(ctx):
13    """Returns all CrOS specific toolchain and sysroot GN args."""
14    if not "args.gn" in ctx.metadata:
15        print("no args.gn")
16        return {}
17    gn_args = gn.args(ctx)
18    if gn_args.get("target_os") != '"chromeos"':
19        return {}
20
21    cros_args = {}
22    for arg in [
23        "cros_target_ar",
24        "cros_target_cc",
25        "cros_target_cxx",
26        "cros_target_ld",
27        "cros_target_nm",
28        "cros_target_readelf",
29        "cros_nacl_helper_arm32_ar",
30        "cros_nacl_helper_arm32_cc",
31        "cros_nacl_helper_arm32_cxx",
32        "cros_nacl_helper_arm32_ld",
33        "cros_nacl_helper_arm32_readelf",
34        "cros_nacl_helper_arm32_sysroot",
35        "target_sysroot",
36    ]:
37        if arg not in gn_args:
38            print("no " + arg)
39            continue
40        fp = ctx.fs.canonpath(gn_args.get(arg).strip('"'))
41        cros_args[arg] = fp
42        if arg == "cros_target_cxx":
43            cros_args["cros_toolchain"] = path.dir(path.dir(fp))
44        if arg == "cros_nacl_helper_arm32_cxx":
45            cros_args["cros_nacl_helper_arm32_toolchain"] = path.dir(path.dir(fp))
46    return cros_args
47
48def __filegroups(ctx):
49    fg = {}
50    cros_args = __cros_gn_args(ctx)
51    for toolchain in [
52        cros_args.get("cros_toolchain"),
53        cros_args.get("cros_nacl_helper_arm32_toolchain"),
54    ]:
55        if not toolchain:
56            continue
57        print("toolchain = %s" % toolchain)
58        fg[toolchain + ":headers"] = {
59            "type": "glob",
60            # TODO: Avoid using "*" to include only required files.
61            "includes": ["*"],
62        }
63        fg[path.join(toolchain, "bin") + ":llddeps"] = {
64            "type": "glob",
65            "includes": [
66                "*lld*",
67                "*clang*",
68                "llvm-nm*",
69                "llvm-readelf*",
70                "llvm-readobj*",
71            ],
72        }
73        fg[path.join(toolchain, "lib") + ":libs"] = {
74            "type": "glob",
75            "includes": ["*.so", "*.so.*", "*.a", "*.o"],
76        }
77        fg[path.join(toolchain, "lib64") + ":libs"] = {
78            "type": "glob",
79            "includes": ["*.so", "*.so.*", "*.a", "*.o"],
80        }
81        fg[path.join(toolchain, "usr/lib64") + ":libs"] = {
82            "type": "glob",
83            "includes": ["*.so", "*.so.*", "*.a", "*.o"],
84        }
85        fg[path.join(toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs"] = {
86            "type": "glob",
87            "includes": ["*.so", "*.so.*", "*.a", "*.o"],
88        }
89        fg[path.join(toolchain, "usr/bin") + ":clang"] = {
90            "type": "glob",
91            "includes": [
92                "*clang*",
93                "sysroot_wrapper.hardened.ccache*",
94            ],
95        }
96
97    for sysroot in [
98        cros_args.get("target_sysroot"),
99        cros_args.get("cros_nacl_helper_arm32_sysroot"),
100    ]:
101        if not sysroot:
102            continue
103        print("sysroot = %s" % sysroot)
104        fg[path.join(sysroot, "usr/include") + ":include"] = {
105            "type": "glob",
106            "includes": ["*"],
107            # needs bits/stab.def, c++/*
108        }
109        fg[path.join(sysroot, "usr/lib") + ":headers"] = {
110            "type": "glob",
111            "includes": ["*.h", "crtbegin.o"],
112        }
113        fg[path.join(sysroot, "usr/lib64") + ":headers"] = {
114            "type": "glob",
115            "includes": ["*.h"],
116        }
117        fg[sysroot + ":libs"] = {
118            "type": "glob",
119            "includes": ["*.so", "*.so.*", "*.a", "*.o"],
120        }
121    print(fg)
122    return fg
123
124def __step_config(ctx, step_config):
125    cros_args = __cros_gn_args(ctx)
126    toolchain = cros_args.get("cros_toolchain")
127    cros_nacl_helper_arm32_toolchain = cros_args.get("cros_nacl_helper_arm32_toolchain")
128    cros_nacl_helper_arm32_sysroot = cros_args.get("cros_nacl_helper_arm32_sysroot")
129    sysroot = cros_args.get("target_sysroot")
130    if not (toolchain and sysroot):
131        return step_config
132
133    cros_target_cxx = cros_args.get("cros_target_cxx")
134    if cros_target_cxx:
135        step_config["rules"].extend([
136            {
137                "name": "clang-cros/cxx",
138                "action": "(.*_)?cxx",
139                "command_prefix": path.join("../../", cros_target_cxx),
140                "remote": True,
141                "canonicalize_dir": True,
142                "timeout": "5m",
143            },
144        ])
145
146    cros_target_cc = cros_args.get("cros_target_cc")
147    if cros_target_cxx:
148        step_config["rules"].extend([
149            {
150                "name": "clang-cros/cc",
151                "action": "(.*_)?cc",
152                "command_prefix": path.join("../../", cros_target_cc),
153                "remote": True,
154                "canonicalize_dir": True,
155                "timeout": "5m",
156            },
157        ])
158
159    cros_target_ar = cros_args.get("cros_target_ar")
160    if cros_target_ar:
161        step_config["rules"].extend([
162            {
163                "name": "clang-cros/alink/llvm-ar",
164                # Other alink steps should use clang/alink/llvm-ar rule or a
165                # nacl rule.
166                "action": "(target_with_system_allocator_)?alink",
167                "inputs": [
168                    cros_target_ar,
169                ],
170                "exclude_input_patterns": [
171                    "*.cc",
172                    "*.h",
173                    "*.js",
174                    "*.pak",
175                    "*.py",
176                    "*.stamp",
177                ],
178                "handler": "clang_alink",
179                "remote": config.get(ctx, "remote-link"),
180                "canonicalize_dir": True,
181                "timeout": "5m",
182                "platform_ref": "large",
183                "accumulate": True,
184            },
185        ])
186        step_config["input_deps"].update({
187            cros_target_ar: [
188                path.join(toolchain, "bin/llvm-ar.elf"),
189                path.join(toolchain, "lib") + ":libs",
190                path.join(toolchain, "usr/lib64") + ":libs",
191            ],
192        })
193
194    cros_nacl_helper_arm32_cxx = cros_args.get("cros_nacl_helper_arm32_cxx")
195    if cros_nacl_helper_arm32_cxx:
196        step_config["rules"].extend([
197            {
198                "name": "clang-cros/nacl_helper_arm32_cxx",
199                "action": "nacl_helper_arm32_cxx",
200                "command_prefix": path.join("../../", cros_nacl_helper_arm32_cxx),
201                "remote": True,
202                "canonicalize_dir": True,
203                "timeout": "5m",
204            },
205        ])
206
207    cros_nacl_helper_arm32_cc = cros_args.get("cros_nacl_helper_arm32_cc")
208    if cros_nacl_helper_arm32_cxx:
209        step_config["rules"].extend([
210            {
211                "name": "clang-cros/nacl_helper_arm32_cc",
212                "action": "nacl_helper_arm32_cc",
213                "command_prefix": path.join("../../", cros_nacl_helper_arm32_cc),
214                "remote": True,
215                "canonicalize_dir": True,
216                "timeout": "5m",
217            },
218        ])
219
220    cros_nacl_helper_arm32_ar = cros_args.get("cros_nacl_helper_arm32_ar")
221    if cros_nacl_helper_arm32_ar:
222        step_config["rules"].extend([
223            {
224                "name": "clang-cros/alink/nacl_helper_arm32_llvm-ar",
225                # Other alink steps should use clang/alink/llvm-ar rule or a
226                # nacl rule.
227                "action": "nacl_helper_arm32_alink",
228                "inputs": [
229                    cros_nacl_helper_arm32_ar,
230                ],
231                "exclude_input_patterns": [
232                    "*.cc",
233                    "*.h",
234                    "*.js",
235                    "*.pak",
236                    "*.py",
237                    "*.stamp",
238                ],
239                "handler": "clang_alink",
240                "remote": config.get(ctx, "remote-link"),
241                "canonicalize_dir": True,
242                "timeout": "5m",
243                "platform_ref": "large",
244                "accumulate": True,
245            },
246        ])
247        step_config["input_deps"].update({
248            cros_nacl_helper_arm32_ar: [
249                path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"),
250                path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs",
251                path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs",
252            ],
253        })
254
255    step_config["rules"].extend([
256        {
257            "name": "clang-cros/solink/gcc_solink_wrapper",
258            "action": "(target_with_system_allocator_)?solink",
259            "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"",
260            "inputs": [
261                "build/toolchain/gcc_solink_wrapper.py",
262                path.join(toolchain, "bin/ld.lld"),
263            ],
264            "exclude_input_patterns": [
265                "*.cc",
266                "*.h",
267                "*.js",
268                "*.pak",
269                "*.py",
270                "*.stamp",
271            ],
272            "remote": config.get(ctx, "remote-link"),
273            # TODO: Do not use absolute paths for custom toolchain/sysroot GN
274            # args.
275            "input_root_absolute_path": True,
276            "platform_ref": "large",
277            "timeout": "2m",
278        },
279        {
280            "name": "clang-cros/link/gcc_link_wrapper",
281            "action": "(target_with_system_allocator_)?link",
282            "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"",
283            "handler": "clang_link",
284            "inputs": [
285                "build/toolchain/gcc_link_wrapper.py",
286                path.join(toolchain, "bin/ld.lld"),
287            ],
288            "exclude_input_patterns": [
289                "*.cc",
290                "*.h",
291                "*.js",
292                "*.pak",
293                "*.py",
294                "*.stamp",
295            ],
296            "remote": config.get(ctx, "remote-link"),
297            "canonicalize_dir": True,
298            "platform_ref": "large",
299            "timeout": "10m",
300        },
301    ])
302    step_config["input_deps"].update({
303        sysroot + ":headers": [
304            path.join(sysroot, "usr/include") + ":include",
305            path.join(sysroot, "usr/lib") + ":headers",
306            path.join(sysroot, "usr/lib64") + ":headers",
307        ],
308        path.join(toolchain, "bin/llvm-ar"): [
309            path.join(toolchain, "bin/llvm-ar.elf"),
310            path.join(toolchain, "lib") + ":libs",
311            path.join(toolchain, "usr/lib64") + ":libs",
312        ],
313        path.join(toolchain, "bin/ld.lld"): [
314            path.join(toolchain, "bin:llddeps"),
315            path.join(toolchain, "lib") + ":libs",
316            path.join(toolchain, "lib64") + ":libs",
317            path.join(toolchain, "usr/bin:clang"),
318            path.join(toolchain, "usr/lib64") + ":libs",
319            sysroot + ":libs",
320        ],
321    })
322
323    if cros_nacl_helper_arm32_toolchain and cros_nacl_helper_arm32_sysroot:
324        step_config["rules"].extend([
325            {
326                "name": "clang-cros/nacl_helper_arm32_solink/gcc_solink_wrapper",
327                "action": "nacl_helper_arm32_solink",
328                "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"",
329                "inputs": [
330                    "build/toolchain/gcc_solink_wrapper.py",
331                    path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"),
332                ],
333                "exclude_input_patterns": [
334                    "*.cc",
335                    "*.h",
336                    "*.js",
337                    "*.pak",
338                    "*.py",
339                    "*.stamp",
340                ],
341                "remote": config.get(ctx, "remote-link"),
342                # TODO: Do not use absolute paths for custom toolchain/sysroot GN
343                # args.
344                "input_root_absolute_path": True,
345                "platform_ref": "large",
346                "timeout": "2m",
347            },
348            {
349                "name": "clang-cros/nacl_helper_arm32_link/gcc_link_wrapper",
350                "action": "nacl_helper_arm32_link",
351                "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"",
352                "handler": "clang_link",
353                "inputs": [
354                    "build/toolchain/gcc_link_wrapper.py",
355                    path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"),
356                ],
357                "exclude_input_patterns": [
358                    "*.cc",
359                    "*.h",
360                    "*.js",
361                    "*.pak",
362                    "*.py",
363                    "*.stamp",
364                ],
365                "remote": config.get(ctx, "remote-link"),
366                "canonicalize_dir": True,
367                "platform_ref": "large",
368                "timeout": "10m",
369            },
370        ])
371        step_config["input_deps"].update({
372            cros_nacl_helper_arm32_sysroot + ":headers": [
373                path.join(cros_nacl_helper_arm32_sysroot, "usr/include") + ":include",
374                path.join(cros_nacl_helper_arm32_sysroot, "usr/lib") + ":headers",
375                path.join(cros_nacl_helper_arm32_sysroot, "usr/lib64") + ":headers",
376            ],
377            path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar"): [
378                path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"),
379                path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs",
380                path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs",
381            ],
382            path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"): [
383                path.join(cros_nacl_helper_arm32_toolchain, "bin:llddeps"),
384                path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs",
385                path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs",
386                path.join(cros_nacl_helper_arm32_toolchain, "usr/bin:clang"),
387                path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs",
388                path.join(cros_nacl_helper_arm32_toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs",
389                path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs",
390                cros_nacl_helper_arm32_sysroot + ":libs",
391            ],
392        })
393
394    return step_config
395
396cros = module(
397    "cros",
398    filegroups = __filegroups,
399    handlers = {},
400    step_config = __step_config,
401)
402