xref: /aosp_15_r20/external/angle/build/config/siso/clang_linux.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 clang/linux."""
6
7load("@builtin//path.star", "path")
8load("@builtin//struct.star", "module")
9load("./android.star", "android")
10load("./ar.star", "ar")
11load("./clang_all.star", "clang_all")
12load("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper")
13load("./config.star", "config")
14load("./fuchsia.star", "fuchsia")
15load("./gn_logs.star", "gn_logs")
16load("./win_sdk.star", "win_sdk")
17
18# TODO: b/323091468 - Propagate target android ABI and android SDK version
19# from GN, and remove the hardcoded filegroups.
20android_archs = [
21    "aarch64-linux-android",
22    "arm-linux-androideabi",
23    "i686-linux-android",
24    "riscv64-linux-android",
25    "x86_64-linux-android",
26]
27
28android_versions = list(range(21, 35))
29
30def __filegroups(ctx):
31    fg = {
32        # for precomputed subtrees
33        "build/linux/debian_bullseye_amd64-sysroot/usr/include:include": {
34            "type": "glob",
35            "includes": ["*"],
36            # need bits/stab.def, c++/*
37        },
38        "build/linux/debian_bullseye_amd64-sysroot/usr/lib:headers": {
39            "type": "glob",
40            "includes": ["*.h", "crtbegin.o"],
41        },
42        "build/linux/debian_bullseye_arm64-sysroot/usr/include:include": {
43            "type": "glob",
44            "includes": ["*"],
45            # need bits/stab.def, c++/*
46        },
47        "build/linux/debian_bullseye_arm64-sysroot/usr/lib:headers": {
48            "type": "glob",
49            "includes": ["*.h", "crtbegin.o"],
50        },
51        "build/linux/debian_bullseye_i386-sysroot/usr/include:include": {
52            "type": "glob",
53            "includes": ["*"],
54            # need bits/stab.def, c++/*
55        },
56        "build/linux/debian_bullseye_i386-sysroot/usr/lib:headers": {
57            "type": "glob",
58            "includes": ["*.h", "crtbegin.o"],
59        },
60        "build/linux/debian_bullseye_armhf-sysroot/usr/include:include": {
61            "type": "glob",
62            "includes": ["*"],
63            # need bits/stab.def, c++/*
64        },
65        "build/linux/debian_bullseye_armhf-sysroot/usr/lib:headers": {
66            "type": "glob",
67            "includes": ["*.h", "crtbegin.o"],
68        },
69        "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include": {
70            "type": "glob",
71            "includes": ["*"],
72            # can't use "*.h", because c++ headers have no extension.
73        },
74        "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include:include": {
75            "type": "glob",
76            "includes": ["*"],
77        },
78        "third_party/llvm-build/Release+Asserts/bin:llddeps": {
79            "type": "glob",
80            "includes": [
81                "clang*",
82                "ld.lld",
83                "ld64.lld",
84                "lld",
85                "llvm-nm",
86                "llvm-objcopy",
87                "llvm-objdump",
88                "llvm-otool",
89                "llvm-readelf",
90                "llvm-readobj",
91                "llvm-strip",
92            ],
93        },
94        "third_party/llvm-build/Release+Asserts/lib/clang:libs": {
95            "type": "glob",
96            "includes": ["*/lib/*/*", "*/lib/*", "*/share/*"],
97        },
98        "build/linux/debian_bullseye_amd64-sysroot/lib/x86_64-linux-gnu:libso": {
99            "type": "glob",
100            "includes": ["*.so*"],
101        },
102        "build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu:libs": {
103            "type": "glob",
104            "includes": ["*.o", "*.so*", "lib*.a"],
105        },
106        "build/linux/debian_bullseye_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu:libgcc": {
107            "type": "glob",
108            "includes": ["*.o", "*.a", "*.so"],
109        },
110        "build/linux/debian_bullseye_i386-sysroot/lib:libso": {
111            "type": "glob",
112            "includes": ["*.so*"],
113        },
114        "build/linux/debian_bullseye_i386-sysroot/usr/lib/i386-linux-gnu:libs": {
115            "type": "glob",
116            "includes": ["*.o", "*.so*", "lib*.a"],
117        },
118        "build/linux/debian_bullseye_i386-sysroot/usr/lib/gcc/i686-linux-gnu:libgcc": {
119            "type": "glob",
120            "includes": ["*.o", "*.a", "*.so"],
121        },
122        "build/linux/debian_bullseye_armhf-sysroot/lib:libso": {
123            "type": "glob",
124            "includes": ["*.so*"],
125        },
126        "build/linux/debian_bullseye_armhf-sysroot/usr/lib/arm-linux-gnueabihf:libs": {
127            "type": "glob",
128            "includes": ["*.o", "*.so*", "lib*.a"],
129        },
130        "build/linux/debian_bullseye_armhf-sysroot/usr/lib/gcc/arm-linux-gnueabihf:libgcc": {
131            "type": "glob",
132            "includes": ["*.o", "*.a", "*.so"],
133        },
134    }
135    if android.enabled(ctx):
136        for arch in android_archs:
137            for ver in android_versions:
138                group = "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/%s/%d:link" % (arch, ver)
139                fg[group] = {
140                    "type": "glob",
141                    "includes": ["*"],
142                }
143    if fuchsia.enabled(ctx):
144        fg.update(fuchsia.filegroups(ctx))
145    fg.update(clang_all.filegroups(ctx))
146    return fg
147
148def __clang_compile_coverage(ctx, cmd):
149    clang_command = clang_code_coverage_wrapper.run(ctx, list(cmd.args))
150    ctx.actions.fix(args = clang_command)
151
152def __clang_alink(ctx, cmd):
153    # check command line to see "-T" and "-S".
154    # rm -f obj/third_party/angle/libangle_common.a && "../../third_party/llvm-build/Release+Asserts/bin/llvm-ar" -T -S -r -c -D obj/third_party/angle/libangle_common.a @"obj/third_party/angle/libangle_common.a.rsp"
155    if not ("-T" in cmd.args[-1] and "-S" in cmd.args[-1]):
156        print("not thin archive without symbol table")
157        return
158
159    # create thin archive without symbol table by handler.
160    rspfile_content = str(cmd.rspfile_content)
161    inputs = []
162    for fname in rspfile_content.split(" "):
163        inputs.append(ctx.fs.canonpath(fname))
164    data = ar.create(ctx, path.dir(cmd.outputs[0]), inputs)
165    ctx.actions.write(cmd.outputs[0], data)
166    ctx.actions.exit(exit_status = 0)
167
168def __clang_link(ctx, cmd):
169    inputs = []
170    sysroot = ""
171    target = ""
172    args = cmd.args
173    if args[0] == "/bin/sh":
174        args = args[2].split(" ")
175    for i, arg in enumerate(args):
176        if i == 1:
177            driver = ctx.fs.canonpath(arg)  # driver script
178            if ctx.fs.exists(driver):
179                inputs.append(driver + ":link")
180            continue
181        if arg.startswith("--sysroot="):
182            sysroot = arg.removeprefix("--sysroot=")
183            sysroot = ctx.fs.canonpath(sysroot)
184            inputs.append(sysroot + ":link")
185        elif arg == "-isysroot":
186            sysroot = ctx.fs.canonpath(args[i + 1])
187            inputs.append(sysroot + ":link")
188        elif arg.startswith("--target="):
189            target = arg.removeprefix("--target=")
190        elif arg.startswith("-L"):
191            lib_path = ctx.fs.canonpath(arg.removeprefix("-L"))
192            inputs.append(lib_path + ":link")
193        elif arg.startswith("-Wl,-exported_symbols_list,"):
194            export_path = ctx.fs.canonpath(arg.removeprefix("-Wl,-exported_symbols_list,"))
195            inputs.append(export_path)
196        elif arg == "-sectcreate":
197            # -sectcreate <arg1> <arg2> <arg3>
198            inputs.append(ctx.fs.canonpath(args[i + 3]))
199        elif arg.startswith("-Wcrl,"):
200            crls = arg.removeprefix("-Wcrl,").split(",")
201            crl = ctx.fs.canonpath(crls[1])
202            if ctx.fs.exists(crl):
203                inputs.append(crl + ":link")
204        elif arg == "--":
205            clang_base = ctx.fs.canonpath(path.dir(path.dir(cmd.args[i + 1])))
206            inputs.append(clang_base + ":link")
207
208    for arch in android_archs:
209        if target.startswith(arch):
210            android_ver = target.removeprefix(arch)
211            inputs.extend([
212                sysroot + "/usr/lib/" + arch + "/" + android_ver + ":link",
213            ])
214            break
215
216    ctx.actions.fix(inputs = cmd.inputs + inputs)
217
218__handlers = {
219    "clang_compile_coverage": __clang_compile_coverage,
220    "clang_alink": __clang_alink,
221    "clang_link": __clang_link,
222}
223
224def __step_config(ctx, step_config):
225    step_config["input_deps"].update({
226        # sysroot headers for precomputed subtrees
227        "build/linux/debian_bullseye_amd64-sysroot:headers": [
228            "build/linux/debian_bullseye_amd64-sysroot/usr/include:include",
229            "build/linux/debian_bullseye_amd64-sysroot/usr/lib:headers",
230        ],
231        "build/linux/debian_bullseye_arm64-sysroot:headers": [
232            "build/linux/debian_bullseye_arm64-sysroot/usr/include:include",
233            "build/linux/debian_bullseye_arm64-sysroot/usr/lib:headers",
234        ],
235        "build/linux/debian_bullseye_i386-sysroot:headers": [
236            "build/linux/debian_bullseye_i386-sysroot/usr/include:include",
237            "build/linux/debian_bullseye_i386-sysroot/usr/lib:headers",
238        ],
239        "build/linux/debian_bullseye_armhf-sysroot:headers": [
240            "build/linux/debian_bullseye_armhf-sysroot/usr/include:include",
241            "build/linux/debian_bullseye_armhf-sysroot/usr/lib:headers",
242        ],
243        "build/linux/debian_bullseye_amd64-sysroot:link": [
244            "build/linux/debian_bullseye_amd64-sysroot/lib/x86_64-linux-gnu:libso",
245            "build/linux/debian_bullseye_amd64-sysroot/lib64/ld-linux-x86-64.so.2",
246            "build/linux/debian_bullseye_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu:libgcc",
247            "build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu:libs",
248            "third_party/llvm-build/Release+Asserts/bin:llddeps",
249            # The following inputs are used for sanitizer builds.
250            # It might be better to add them only for sanitizer builds if there is a performance issue.
251            "third_party/llvm-build/Release+Asserts/lib/clang:libs",
252        ],
253        "build/linux/debian_bullseye_i386-sysroot:link": [
254            "build/linux/debian_bullseye_i386-sysroot/lib:libso",
255            "build/linux/debian_bullseye_i386-sysroot/usr/lib/gcc/i686-linux-gnu:libgcc",
256            "build/linux/debian_bullseye_i386-sysroot/usr/lib/i386-linux-gnu:libs",
257            "third_party/llvm-build/Release+Asserts/bin:llddeps",
258        ],
259        "build/linux/debian_bullseye_armhf-sysroot:link": [
260            "build/linux/debian_bullseye_armhf-sysroot/lib:libso",
261            "build/linux/debian_bullseye_armhf-sysroot/usr/lib/gcc/arm-linux-gnueabihf:libgcc",
262            "build/linux/debian_bullseye_armhf-sysroot/usr/lib/arm-linux-gnueabihf:libs",
263            "third_party/llvm-build/Release+Asserts/bin:llddeps",
264        ],
265        "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot:headers": [
266            "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include",
267            "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include:include",
268        ],
269        "third_party/llvm-build/Release+Asserts/bin/clang++:link": [
270            "third_party/llvm-build/Release+Asserts/bin:llddeps",
271        ],
272        "third_party/llvm-build/Release+Asserts:link": [
273            "third_party/llvm-build/Release+Asserts/bin:llddeps",
274            "third_party/llvm-build/Release+Asserts/lib/clang:libs",
275        ],
276    })
277    step_config["input_deps"].update(clang_all.input_deps)
278
279    input_root_absolute_path = gn_logs.read(ctx).get("clang_need_input_root_absolute_path") == "true"
280    canonicalize_dir = not input_root_absolute_path
281
282    step_config["rules"].extend([
283        {
284            "name": "clang/cxx",
285            "action": "(.*_)?cxx",
286            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++ ",
287            "inputs": [
288                "third_party/llvm-build/Release+Asserts/bin/clang++",
289            ],
290            "exclude_input_patterns": ["*.stamp"],
291            "remote": True,
292            "input_root_absolute_path": input_root_absolute_path,
293            "canonicalize_dir": canonicalize_dir,
294            "timeout": "2m",
295        },
296        {
297            "name": "clang/cc",
298            "action": "(.*_)?cc",
299            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang ",
300            "inputs": [
301                "third_party/llvm-build/Release+Asserts/bin/clang",
302            ],
303            "exclude_input_patterns": ["*.stamp"],
304            "remote": True,
305            "input_root_absolute_path": input_root_absolute_path,
306            "canonicalize_dir": canonicalize_dir,
307            "timeout": "2m",
308        },
309        {
310            "name": "clang/asm",
311            "action": "(.*_)?asm",
312            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang",
313            "inputs": [
314                "third_party/llvm-build/Release+Asserts/bin/clang",
315            ],
316            "remote": config.get(ctx, "cog"),
317            "input_root_absolute_path": input_root_absolute_path,
318            "canonicalize_dir": canonicalize_dir,
319            "timeout": "2m",
320        },
321        {
322            "name": "clang-coverage/cxx",
323            "action": "(.*_)?cxx",
324            "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py",
325            "inputs": [
326                "third_party/llvm-build/Release+Asserts/bin/clang++",
327            ],
328            "exclude_input_patterns": ["*.stamp"],
329            "handler": "clang_compile_coverage",
330            "remote": True,
331            "input_root_absolute_path": input_root_absolute_path,
332            "canonicalize_dir": canonicalize_dir,
333            "timeout": "2m",
334        },
335        {
336            "name": "clang-coverage/cc",
337            "action": "(.*_)?cc",
338            "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py",
339            "inputs": [
340                "third_party/llvm-build/Release+Asserts/bin/clang",
341            ],
342            "exclude_input_patterns": ["*.stamp"],
343            "handler": "clang_compile_coverage",
344            "remote": True,
345            "input_root_absolute_path": input_root_absolute_path,
346            "canonicalize_dir": canonicalize_dir,
347            "timeout": "2m",
348        },
349        {
350            "name": "clang/alink/llvm-ar",
351            "action": "(.*_)?alink",
352            "inputs": [
353                # TODO: b/316267242 - Add inputs to GN config.
354                "third_party/llvm-build/Release+Asserts/bin/llvm-ar",
355            ],
356            "exclude_input_patterns": [
357                "*.cc",
358                "*.h",
359                "*.js",
360                "*.pak",
361                "*.py",
362                "*.stamp",
363            ],
364            "handler": "clang_alink",
365            "remote": config.get(ctx, "remote-link"),
366            "canonicalize_dir": True,
367            "timeout": "2m",
368            "platform_ref": "large",
369            "accumulate": True,
370        },
371        {
372            "name": "clang/solink",
373            "action": "(.*_)?solink",
374            "handler": "clang_link",
375            "exclude_input_patterns": [
376                "*.cc",
377                "*.h",
378                "*.js",
379                "*.pak",
380                "*.py",
381                "*.stamp",
382            ],
383            "remote": config.get(ctx, "remote-link"),
384            "canonicalize_dir": True,
385            "platform_ref": "large",
386            "timeout": "2m",
387        },
388        {
389            "name": "clang/link",
390            "action": "(.*_)?link",
391            "handler": "clang_link",
392            "exclude_input_patterns": [
393                "*.cc",
394                "*.h",
395                "*.js",
396                "*.pak",
397                "*.py",
398                "*.stamp",
399            ],
400            "remote": config.get(ctx, "remote-link"),
401            "canonicalize_dir": True,
402            "platform_ref": "large",
403            "timeout": "10m",
404        },
405    ])
406    if win_sdk.enabled(ctx):
407        step_config["rules"].extend([
408            {
409                "name": "clang-cl/cxx",
410                "action": "(.*_)?cxx",
411                "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang-cl ",
412                "inputs": [
413                    "third_party/llvm-build/Release+Asserts/bin/clang-cl",
414                ],
415                "exclude_input_patterns": ["*.stamp"],
416                "remote": True,
417                "input_root_absolute_path": input_root_absolute_path,
418                "canonicalize_dir": canonicalize_dir,
419                "timeout": "2m",
420            },
421            {
422                "name": "clang-cl/cc",
423                "action": "(.*_)?cc",
424                "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang-cl ",
425                "inputs": [
426                    "third_party/llvm-build/Release+Asserts/bin/clang-cl",
427                ],
428                "exclude_input_patterns": ["*.stamp"],
429                "remote": True,
430                "input_root_absolute_path": input_root_absolute_path,
431                "canonicalize_dir": canonicalize_dir,
432                "timeout": "2m",
433            },
434        ])
435        win_sdk.step_config(ctx, step_config)
436    return step_config
437
438clang = module(
439    "clang",
440    step_config = __step_config,
441    filegroups = __filegroups,
442    handlers = __handlers,
443)
444