• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, "usr/bin") + ":llddeps"] = {
74            "type": "glob",
75            "includes": [
76                "*lld*",
77                "*clang*",
78                "sysroot_wrapper*",
79                "llvm-nm*",
80                "llvm-readelf*",
81                "llvm-readobj*",
82            ],
83        }
84        fg[path.join(toolchain, "lib") + ":libs"] = {
85            "type": "glob",
86            "includes": ["*.so", "*.so.*", "*.a", "*.o"],
87        }
88        fg[path.join(toolchain, "lib64") + ":libs"] = {
89            "type": "glob",
90            "includes": ["*.so", "*.so.*", "*.a", "*.o"],
91        }
92        fg[path.join(toolchain, "usr/lib64") + ":libs"] = {
93            "type": "glob",
94            "includes": ["*.so", "*.so.*", "*.a", "*.o", "cfi_ignorelist.txt"],
95        }
96        fg[path.join(toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs"] = {
97            "type": "glob",
98            "includes": ["*.so", "*.so.*", "*.a", "*.o"],
99        }
100        fg[path.join(toolchain, "usr/bin") + ":clang"] = {
101            "type": "glob",
102            "includes": [
103                "*clang*",
104                "sysroot_wrapper.hardened.ccache*",
105            ],
106        }
107
108    for sysroot in [
109        cros_args.get("target_sysroot"),
110        cros_args.get("cros_nacl_helper_arm32_sysroot"),
111    ]:
112        if not sysroot:
113            continue
114        print("sysroot = %s" % sysroot)
115        fg[path.join(sysroot, "usr/include") + ":include"] = {
116            "type": "glob",
117            "includes": ["*"],
118            # needs bits/stab.def, c++/*
119        }
120        fg[path.join(sysroot, "usr/lib") + ":headers"] = {
121            "type": "glob",
122            "includes": ["*.h", "crtbegin.o"],
123        }
124        fg[path.join(sysroot, "usr/lib64") + ":headers"] = {
125            "type": "glob",
126            "includes": ["*.h"],
127        }
128        fg[sysroot + ":libs"] = {
129            "type": "glob",
130            "includes": ["*.so", "*.so.*", "*.a", "*.o"],
131        }
132    print(fg)
133    return fg
134
135def __step_config(ctx, step_config):
136    cros_args = __cros_gn_args(ctx)
137    toolchain = cros_args.get("cros_toolchain")
138    cros_nacl_helper_arm32_toolchain = cros_args.get("cros_nacl_helper_arm32_toolchain")
139    cros_nacl_helper_arm32_sysroot = cros_args.get("cros_nacl_helper_arm32_sysroot")
140    sysroot = cros_args.get("target_sysroot")
141    if not (toolchain and sysroot):
142        return step_config
143
144    cros_target_cxx = cros_args.get("cros_target_cxx")
145    if cros_target_cxx:
146        step_config["rules"].extend([
147            {
148                "name": "clang-cros/cxx",
149                "action": "(.*_)?cxx",
150                "command_prefix": path.join("../../", cros_target_cxx),
151                "remote": True,
152                # fast-deps is not safe with cros toolchain. crbug.com/391160876
153                "no_fast_deps": True,
154                "canonicalize_dir": True,
155                "timeout": "5m",
156            },
157        ])
158
159    cros_target_cc = cros_args.get("cros_target_cc")
160    if cros_target_cxx:
161        step_config["rules"].extend([
162            {
163                "name": "clang-cros/cc",
164                "action": "(.*_)?cc",
165                "command_prefix": path.join("../../", cros_target_cc),
166                "remote": True,
167                # fast-deps is not safe with cros toolchain. crbug.com/391160876
168                "no_fast_deps": True,
169                "canonicalize_dir": True,
170                "timeout": "5m",
171            },
172        ])
173
174    cros_target_ar = cros_args.get("cros_target_ar")
175    if cros_target_ar:
176        step_config["rules"].extend([
177            {
178                "name": "clang-cros/alink/llvm-ar",
179                # Other alink steps should use clang/alink/llvm-ar rule or a
180                # nacl rule.
181                "action": "(target_with_system_allocator_)?alink",
182                "inputs": [
183                    cros_target_ar,
184                ],
185                "exclude_input_patterns": [
186                    "*.cc",
187                    "*.h",
188                    "*.js",
189                    "*.pak",
190                    "*.py",
191                ],
192                "handler": "lld_thin_archive",
193                "remote": config.get(ctx, "remote-link"),
194                "canonicalize_dir": True,
195                "timeout": "5m",
196                "platform_ref": "large",
197                "accumulate": True,
198            },
199        ])
200        step_config["input_deps"].update({
201            cros_target_ar: [
202                path.join(toolchain, "bin/llvm-ar.elf"),
203                path.join(toolchain, "lib") + ":libs",
204                path.join(toolchain, "usr/lib64") + ":libs",
205            ],
206        })
207
208    cros_nacl_helper_arm32_cxx = cros_args.get("cros_nacl_helper_arm32_cxx")
209    if cros_nacl_helper_arm32_cxx:
210        step_config["rules"].extend([
211            {
212                "name": "clang-cros/nacl_helper_arm32_cxx",
213                "action": "nacl_helper_arm32_cxx",
214                "command_prefix": path.join("../../", cros_nacl_helper_arm32_cxx),
215                "remote": True,
216                "canonicalize_dir": True,
217                "timeout": "5m",
218            },
219        ])
220
221    cros_nacl_helper_arm32_cc = cros_args.get("cros_nacl_helper_arm32_cc")
222    if cros_nacl_helper_arm32_cxx:
223        step_config["rules"].extend([
224            {
225                "name": "clang-cros/nacl_helper_arm32_cc",
226                "action": "nacl_helper_arm32_cc",
227                "command_prefix": path.join("../../", cros_nacl_helper_arm32_cc),
228                "remote": True,
229                "canonicalize_dir": True,
230                "timeout": "5m",
231            },
232        ])
233
234    cros_nacl_helper_arm32_ar = cros_args.get("cros_nacl_helper_arm32_ar")
235    if cros_nacl_helper_arm32_ar:
236        step_config["rules"].extend([
237            {
238                "name": "clang-cros/alink/nacl_helper_arm32_llvm-ar",
239                # Other alink steps should use clang/alink/llvm-ar rule or a
240                # nacl rule.
241                "action": "nacl_helper_arm32_alink",
242                "inputs": [
243                    cros_nacl_helper_arm32_ar,
244                ],
245                "exclude_input_patterns": [
246                    "*.cc",
247                    "*.h",
248                    "*.js",
249                    "*.pak",
250                    "*.py",
251                ],
252                "handler": "lld_thin_archive",
253                "remote": config.get(ctx, "remote-link"),
254                "canonicalize_dir": True,
255                "timeout": "5m",
256                "platform_ref": "large",
257                "accumulate": True,
258            },
259        ])
260        step_config["input_deps"].update({
261            cros_nacl_helper_arm32_ar: [
262                path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"),
263                path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs",
264                path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs",
265            ],
266        })
267
268    step_config["rules"].extend([
269        {
270            "name": "clang-cros/solink/gcc_solink_wrapper",
271            "action": "(target_with_system_allocator_)?solink",
272            "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"",
273            "inputs": [
274                "build/toolchain/gcc_solink_wrapper.py",
275                path.join(toolchain, "bin/ld.lld"),
276            ],
277            "exclude_input_patterns": [
278                "*.cc",
279                "*.h",
280                "*.js",
281                "*.pak",
282                "*.py",
283            ],
284            "remote": config.get(ctx, "remote-link"),
285            # TODO: Do not use absolute paths for custom toolchain/sysroot GN
286            # args.
287            "input_root_absolute_path": True,
288            "platform_ref": "large",
289            "timeout": "2m",
290        },
291        {
292            "name": "clang-cros/link/gcc_link_wrapper",
293            "action": "(target_with_system_allocator_)?link",
294            "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"",
295            "handler": "clang_link",
296            "inputs": [
297                "build/toolchain/gcc_link_wrapper.py",
298                path.join(toolchain, "bin/ld.lld"),
299            ],
300            "exclude_input_patterns": [
301                "*.cc",
302                "*.h",
303                "*.js",
304                "*.pak",
305                "*.py",
306            ],
307            "remote": config.get(ctx, "remote-link"),
308            "canonicalize_dir": True,
309            "platform_ref": "large",
310            "timeout": "10m",
311        },
312    ])
313    step_config["input_deps"].update({
314        sysroot + ":headers": [
315            path.join(sysroot, "usr/include") + ":include",
316            path.join(sysroot, "usr/lib") + ":headers",
317            path.join(sysroot, "usr/lib64") + ":headers",
318        ],
319        path.join(toolchain, "bin/llvm-ar"): [
320            path.join(toolchain, "bin/llvm-ar.elf"),
321            path.join(toolchain, "lib") + ":libs",
322            path.join(toolchain, "usr/lib64") + ":libs",
323        ],
324        path.join(toolchain, "bin/ld.lld"): [
325            path.join(toolchain, "bin:llddeps"),
326            path.join(toolchain, "lib") + ":libs",
327            path.join(toolchain, "lib64") + ":libs",
328            path.join(toolchain, "usr/bin:clang"),
329            path.join(toolchain, "usr/lib64") + ":libs",
330            sysroot + ":libs",
331        ],
332        toolchain + ":link": [
333            path.join(toolchain, "bin") + ":llddeps",
334            path.join(toolchain, "lib") + ":libs",
335            path.join(toolchain, "lib64") + ":libs",
336            path.join(toolchain, "usr/bin") + ":llddeps",
337            path.join(toolchain, "usr/lib64") + ":libs",
338        ],
339        sysroot + ":link": [
340            sysroot + ":libs",
341        ],
342    })
343
344    if cros_nacl_helper_arm32_toolchain and cros_nacl_helper_arm32_sysroot:
345        step_config["rules"].extend([
346            {
347                "name": "clang-cros/nacl_helper_arm32_solink/gcc_solink_wrapper",
348                "action": "nacl_helper_arm32_solink",
349                "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"",
350                "inputs": [
351                    "build/toolchain/gcc_solink_wrapper.py",
352                    path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"),
353                ],
354                "exclude_input_patterns": [
355                    "*.cc",
356                    "*.h",
357                    "*.js",
358                    "*.pak",
359                    "*.py",
360                ],
361                "remote": config.get(ctx, "remote-link"),
362                # TODO: Do not use absolute paths for custom toolchain/sysroot GN
363                # args.
364                "input_root_absolute_path": True,
365                "platform_ref": "large",
366                "timeout": "2m",
367            },
368            {
369                "name": "clang-cros/nacl_helper_arm32_link/gcc_link_wrapper",
370                "action": "nacl_helper_arm32_link",
371                "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"",
372                "handler": "clang_link",
373                "inputs": [
374                    "build/toolchain/gcc_link_wrapper.py",
375                    path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"),
376                ],
377                "exclude_input_patterns": [
378                    "*.cc",
379                    "*.h",
380                    "*.js",
381                    "*.pak",
382                    "*.py",
383                ],
384                "remote": config.get(ctx, "remote-link"),
385                "canonicalize_dir": True,
386                "platform_ref": "large",
387                "timeout": "10m",
388            },
389        ])
390        step_config["input_deps"].update({
391            cros_nacl_helper_arm32_sysroot + ":headers": [
392                path.join(cros_nacl_helper_arm32_sysroot, "usr/include") + ":include",
393                path.join(cros_nacl_helper_arm32_sysroot, "usr/lib") + ":headers",
394                path.join(cros_nacl_helper_arm32_sysroot, "usr/lib64") + ":headers",
395            ],
396            path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar"): [
397                path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"),
398                path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs",
399                path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs",
400            ],
401            path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"): [
402                path.join(cros_nacl_helper_arm32_toolchain, "bin:llddeps"),
403                path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs",
404                path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs",
405                path.join(cros_nacl_helper_arm32_toolchain, "usr/bin:clang"),
406                path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs",
407                path.join(cros_nacl_helper_arm32_toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs",
408                path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs",
409                cros_nacl_helper_arm32_sysroot + ":libs",
410            ],
411        })
412
413    return step_config
414
415cros = module(
416    "cros",
417    filegroups = __filegroups,
418    handlers = {},
419    step_config = __step_config,
420)
421