• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# -*- bazel-starlark -*-
2# Copyright 2024 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 clang/unix."""
6
7load("@builtin//path.star", "path")
8load("@builtin//struct.star", "module")
9load("./android.star", "android")
10load("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper")
11load("./config.star", "config")
12load("./gn_logs.star", "gn_logs")
13load("./win_sdk.star", "win_sdk")
14
15def __clang_compile_coverage(ctx, cmd):
16    clang_command = clang_code_coverage_wrapper.run(ctx, list(cmd.args))
17    ctx.actions.fix(args = clang_command)
18
19def __clang_link(ctx, cmd):
20    if not config.get(ctx, "remote-link"):
21        return
22    inputs = []
23    sysroot = ""
24    target = ""
25    args = cmd.args
26    if args[0] == "/bin/sh":
27        args = args[2].split(" ")
28    for i, arg in enumerate(args):
29        if i == 0 and not "python3" in arg:
30            clang_base = ctx.fs.canonpath(path.dir(path.dir(arg)))
31            inputs.append(clang_base + ":link")
32            continue
33        if i == 1:
34            driver = ctx.fs.canonpath(arg)  # driver script
35            if ctx.fs.exists(driver):
36                inputs.append(driver + ":link")
37            continue
38        if arg.startswith("--sysroot="):
39            sysroot = arg.removeprefix("--sysroot=")
40            sysroot = ctx.fs.canonpath(sysroot)
41            inputs.append(sysroot + ":link")
42        elif arg == "-isysroot":
43            sysroot = ctx.fs.canonpath(args[i + 1])
44            inputs.append(sysroot + ":link")
45        elif arg.startswith("--target="):
46            target = arg.removeprefix("--target=")
47        elif arg.startswith("-L"):
48            lib_path = ctx.fs.canonpath(arg.removeprefix("-L"))
49            inputs.append(lib_path + ":link")
50        elif arg.startswith("-Wl,-exported_symbols_list,"):
51            export_path = ctx.fs.canonpath(arg.removeprefix("-Wl,-exported_symbols_list,"))
52            inputs.append(export_path)
53        elif arg == "-sectcreate":
54            # -sectcreate <arg1> <arg2> <arg3>
55            inputs.append(ctx.fs.canonpath(args[i + 3]))
56        elif arg.startswith("-Wcrl,"):
57            crls = arg.removeprefix("-Wcrl,").split(",")
58            if len(crls) == 2:
59                crl = ctx.fs.canonpath(crls[1])
60                if ctx.fs.exists(crl):
61                    inputs.append(crl + ":link")
62        elif arg == "--":
63            clang_base = ctx.fs.canonpath(path.dir(path.dir(cmd.args[i + 1])))
64            inputs.append(clang_base + ":link")
65
66    for arch in android.archs:
67        if target.startswith(arch):
68            android_ver = target.removeprefix(arch)
69            inputs.extend([
70                sysroot + "/usr/lib/" + arch + "/" + android_ver + ":link",
71            ])
72            break
73
74    ctx.actions.fix(inputs = cmd.inputs + inputs)
75
76__handlers = {
77    "clang_compile_coverage": __clang_compile_coverage,
78    "clang_link": __clang_link,
79}
80
81def __rules(ctx):
82    gn_logs_data = gn_logs.read(ctx)
83    input_root_absolute_path = gn_logs_data.get("clang_need_input_root_absolute_path") == "true"
84    input_root_absolute_path_for_objc = gn_logs_data.get("clang_need_input_root_absolute_path_for_objc") == "true"
85
86    canonicalize_dir = not input_root_absolute_path
87    canonicalize_dir_for_objc = not input_root_absolute_path_for_objc
88
89    rules = []
90    if win_sdk.enabled(ctx):
91        rules.extend([
92            {
93                "name": "clang-cl/cxx",
94                "action": "(.*_)?cxx",
95                "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang-cl ",
96                "inputs": [
97                    "third_party/llvm-build/Release+Asserts/bin/clang-cl",
98                ],
99                "exclude_input_patterns": ["*.stamp"],
100                "remote": True,
101                "input_root_absolute_path": input_root_absolute_path,
102                "canonicalize_dir": canonicalize_dir,
103                "timeout": "2m",
104            },
105            {
106                "name": "clang-cl/cc",
107                "action": "(.*_)?cc",
108                "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang-cl ",
109                "inputs": [
110                    "third_party/llvm-build/Release+Asserts/bin/clang-cl",
111                ],
112                "exclude_input_patterns": ["*.stamp"],
113                "remote": True,
114                "input_root_absolute_path": input_root_absolute_path,
115                "canonicalize_dir": canonicalize_dir,
116                "timeout": "2m",
117            },
118            {
119                "name": "lld-link/alink",
120                "action": "(.*_)?alink",
121                "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/lld-link /lib",
122                "handler": "lld_thin_archive",
123                "remote": False,
124                "accumulate": True,
125            },
126            {
127                "name": "lld-link/solink",
128                "action": "(.*_)?solink",
129                "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/lld-link",
130                "handler": "lld_link",
131                "inputs": [
132                    "third_party/llvm-build/Release+Asserts/bin/lld-link",
133                    win_sdk.toolchain_dir(ctx) + ":libs",
134                ],
135                "exclude_input_patterns": [
136                    "*.cc",
137                    "*.h",
138                    "*.js",
139                    "*.pak",
140                    "*.py",
141                ],
142                "remote": config.get(ctx, "remote-link"),
143                "platform_ref": "large",
144                "input_root_absolute_path": input_root_absolute_path,
145                "canonicalize_dir": canonicalize_dir,
146                "timeout": "2m",
147            },
148            {
149                "name": "lld-link/solink_module",
150                "action": "(.*_)?solink_module",
151                "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/lld-link",
152                "handler": "lld_link",
153                "inputs": [
154                    "third_party/llvm-build/Release+Asserts/bin/lld-link",
155                    win_sdk.toolchain_dir(ctx) + ":libs",
156                ],
157                "exclude_input_patterns": [
158                    "*.cc",
159                    "*.h",
160                    "*.js",
161                    "*.pak",
162                    "*.py",
163                ],
164                "remote": config.get(ctx, "remote-link"),
165                "platform_ref": "large",
166                "input_root_absolute_path": input_root_absolute_path,
167                "canonicalize_dir": canonicalize_dir,
168                "timeout": "2m",
169            },
170            {
171                "name": "lld-link/link",
172                "action": "(.*_)?link",
173                "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/lld-link",
174                "handler": "lld_link",
175                "inputs": [
176                    "third_party/llvm-build/Release+Asserts/bin/lld-link",
177                    win_sdk.toolchain_dir(ctx) + ":libs",
178                ],
179                "exclude_input_patterns": [
180                    "*.cc",
181                    "*.h",
182                    "*.js",
183                    "*.pak",
184                    "*.py",
185                ],
186                "remote": config.get(ctx, "remote-link"),
187                "platform_ref": "large",
188                "input_root_absolute_path": input_root_absolute_path,
189                "canonicalize_dir": canonicalize_dir,
190                "timeout": "2m",
191            },
192        ])
193
194    rules.extend([
195        {
196            "name": "clang/cxx",
197            "action": "(.*_)?cxx",
198            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++ ",
199            "inputs": [
200                "third_party/llvm-build/Release+Asserts/bin/clang++",
201            ],
202            "exclude_input_patterns": ["*.stamp"],
203            "remote": True,
204            "input_root_absolute_path": input_root_absolute_path,
205            "canonicalize_dir": canonicalize_dir,
206            "timeout": "2m",
207        },
208        {
209            "name": "clang/cxx_module",
210            "action": "(.*_)?cxx_module",
211            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++ ",
212            "inputs": [
213                "third_party/llvm-build/Release+Asserts/bin/clang++",
214            ],
215            "exclude_input_patterns": ["*.stamp"],
216            "remote": True,
217            "input_root_absolute_path": input_root_absolute_path,
218            "canonicalize_dir": canonicalize_dir,
219            "timeout": "2m",
220        },
221        {
222            "name": "clang/cc",
223            "action": "(.*_)?cc",
224            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang ",
225            "inputs": [
226                "third_party/llvm-build/Release+Asserts/bin/clang",
227            ],
228            "exclude_input_patterns": ["*.stamp"],
229            "remote": True,
230            "input_root_absolute_path": input_root_absolute_path,
231            "canonicalize_dir": canonicalize_dir,
232            "timeout": "2m",
233        },
234        {
235            "name": "clang/objcxx",
236            "action": "(.*_)?objcxx",
237            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++",
238            "inputs": [
239                "third_party/llvm-build/Release+Asserts/bin/clang++",
240            ],
241            "exclude_input_patterns": ["*.stamp"],
242            "remote": True,
243            "timeout": "2m",
244            "input_root_absolute_path": input_root_absolute_path_for_objc,
245            "canonicalize_dir": canonicalize_dir_for_objc,
246        },
247        {
248            "name": "clang/objc",
249            "action": "(.*_)?objc",
250            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang",
251            "inputs": [
252                "third_party/llvm-build/Release+Asserts/bin/clang",
253            ],
254            "exclude_input_patterns": ["*.stamp"],
255            "remote": True,
256            "timeout": "2m",
257            "input_root_absolute_path": input_root_absolute_path_for_objc,
258            "canonicalize_dir": canonicalize_dir_for_objc,
259        },
260        {
261            "name": "clang/asm",
262            "action": "(.*_)?asm",
263            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang",
264            "inputs": [
265                "third_party/llvm-build/Release+Asserts/bin/clang",
266            ],
267            "remote": config.get(ctx, "cog"),
268            "input_root_absolute_path": input_root_absolute_path,
269            "canonicalize_dir": canonicalize_dir,
270            "timeout": "2m",
271        },
272        {
273            "name": "clang-coverage/cxx",
274            "action": "(.*_)?cxx",
275            "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py",
276            "inputs": [
277                "third_party/llvm-build/Release+Asserts/bin/clang++",
278            ],
279            "exclude_input_patterns": ["*.stamp"],
280            "handler": "clang_compile_coverage",
281            "remote": True,
282            "input_root_absolute_path": input_root_absolute_path,
283            "canonicalize_dir": canonicalize_dir,
284            "timeout": "2m",
285        },
286        {
287            "name": "clang-coverage/cc",
288            "action": "(.*_)?cc",
289            "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py",
290            "inputs": [
291                "third_party/llvm-build/Release+Asserts/bin/clang",
292            ],
293            "exclude_input_patterns": ["*.stamp"],
294            "handler": "clang_compile_coverage",
295            "remote": True,
296            "input_root_absolute_path": input_root_absolute_path,
297            "canonicalize_dir": canonicalize_dir,
298            "timeout": "2m",
299        },
300        {
301            "name": "clang-coverage/objcxx",
302            "action": "(.*_)?objcxx",
303            "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py",
304            "inputs": [
305                "third_party/llvm-build/Release+Asserts/bin/clang++",
306            ],
307            "exclude_input_patterns": ["*.stamp"],
308            "handler": "clang_compile_coverage",
309            "remote": True,
310            "timeout": "2m",
311            "input_root_absolute_path": input_root_absolute_path_for_objc,
312            "canonicalize_dir": canonicalize_dir_for_objc,
313        },
314        {
315            "name": "clang-coverage/objc",
316            "action": "(.*_)?objc",
317            "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py",
318            "inputs": [
319                "third_party/llvm-build/Release+Asserts/bin/clang",
320            ],
321            "exclude_input_patterns": ["*.stamp"],
322            "handler": "clang_compile_coverage",
323            "remote": True,
324            "timeout": "2m",
325            "input_root_absolute_path": input_root_absolute_path_for_objc,
326            "canonicalize_dir": canonicalize_dir_for_objc,
327        },
328        {
329            "name": "clang/alink/llvm-ar",
330            "action": "(.*_)?alink",
331            "inputs": [
332                # TODO: crbug.com/316267242 - Add inputs to GN config.
333                "third_party/llvm-build/Release+Asserts/bin/llvm-ar",
334            ],
335            "exclude_input_patterns": [
336                "*.cc",
337                "*.h",
338                "*.js",
339                "*.pak",
340                "*.py",
341                "*.stamp",
342            ],
343            "handler": "lld_thin_archive",
344            "remote": config.get(ctx, "remote-link"),
345            "canonicalize_dir": True,
346            "timeout": "2m",
347            "platform_ref": "large",
348            "accumulate": True,
349        },
350        {
351            "name": "clang/solink",
352            "action": "(.*_)?solink",
353            "handler": "clang_link",
354            "exclude_input_patterns": [
355                "*.cc",
356                "*.h",
357                "*.js",
358                "*.pak",
359                "*.py",
360                "*.stamp",
361            ],
362            "remote": config.get(ctx, "remote-link"),
363            "restat_content": True,
364            "canonicalize_dir": True,
365            "platform_ref": "large",
366            "timeout": "4m",
367        },
368        {
369            "name": "clang/solink_module",
370            "action": "(.*)?solink_module",
371            "handler": "clang_link",
372            "exclude_input_patterns": [
373                "*.cc",
374                "*.h",
375                "*.js",
376                "*.pak",
377                "*.py",
378                "*.stamp",
379            ],
380            "remote": config.get(ctx, "remote-link"),
381            "canonicalize_dir": True,
382            "platform_ref": "large",
383            "timeout": "4m",
384        },
385        {
386            "name": "clang/link",
387            "action": "(.*_)?link",
388            "handler": "clang_link",
389            "exclude_input_patterns": [
390                "*.cc",
391                "*.h",
392                "*.js",
393                "*.pak",
394                "*.py",
395                "*.stamp",
396            ],
397            "remote": config.get(ctx, "remote-link"),
398            "canonicalize_dir": True,
399            "platform_ref": "large",
400            "timeout": "10m",
401        },
402    ])
403    return rules
404
405clang_unix = module(
406    "clang_unix",
407    handlers = __handlers,
408    rules = __rules,
409)
410