• 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 clang/linux."""
6
7load("@builtin//path.star", "path")
8load("@builtin//struct.star", "module")
9load("./android.star", "android")
10load("./clang_all.star", "clang_all")
11load("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper")
12load("./config.star", "config")
13load("./cros.star", "cros")
14load("./gn_logs.star", "gn_logs")
15
16# TODO: b/323091468 - Propagate target android ABI and android SDK version
17# from GN, and remove the hardcoded filegroups.
18android_archs = [
19    "aarch64-linux-android",
20    "arm-linux-androideabi",
21    "i686-linux-android",
22    "riscv64-linux-android",
23    "x86_64-linux-android",
24]
25
26android_versions = list(range(21, 35))
27
28def __filegroups(ctx):
29    fg = {
30        # for precomputed subtrees
31        "build/linux/debian_bullseye_amd64-sysroot/usr/include:include": {
32            "type": "glob",
33            "includes": ["*"],
34            # need bits/stab.def, c++/*
35        },
36        "build/linux/debian_bullseye_amd64-sysroot/usr/lib:headers": {
37            "type": "glob",
38            "includes": ["*.h", "crtbegin.o"],
39        },
40        "build/linux/debian_bullseye_i386-sysroot/usr/include:include": {
41            "type": "glob",
42            "includes": ["*"],
43            # need bits/stab.def, c++/*
44        },
45        "build/linux/debian_bullseye_i386-sysroot/usr/lib:headers": {
46            "type": "glob",
47            "includes": ["*.h", "crtbegin.o"],
48        },
49        "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include": {
50            "type": "glob",
51            "includes": ["*"],
52            # can't use "*.h", because c++ headers have no extension.
53        },
54        "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include:include": {
55            "type": "glob",
56            "includes": ["*"],
57        },
58        "third_party/llvm-build/Release+Asserts/lib/clang:libs": {
59            "type": "glob",
60            "includes": ["*/lib/*/*", "*/lib/*", "*/share/*"],
61        },
62        "build/linux/debian_bullseye_amd64-sysroot/lib/x86_64-linux-gnu:libso": {
63            "type": "glob",
64            "includes": ["*.so*"],
65        },
66        "build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu:libs": {
67            "type": "glob",
68            "includes": ["*.o", "*.so*", "lib*.a"],
69        },
70        "build/linux/debian_bullseye_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu:libgcc": {
71            "type": "glob",
72            "includes": ["*.o", "*.a", "*.so"],
73        },
74    }
75    if android.enabled(ctx):
76        for arch in android_archs:
77            for ver in android_versions:
78                group = "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/%s/%d:link" % (arch, ver)
79                fg[group] = {
80                    "type": "glob",
81                    "includes": ["*"],
82                }
83
84    fg.update(clang_all.filegroups(ctx))
85    return fg
86
87def __clang_compile_coverage(ctx, cmd):
88    clang_command = clang_code_coverage_wrapper.run(ctx, list(cmd.args))
89    ctx.actions.fix(args = clang_command)
90
91__handlers = {
92    "clang_compile_coverage": __clang_compile_coverage,
93}
94
95def __step_config(ctx, step_config):
96    step_config["input_deps"].update({
97        # sysroot headers for precomputed subtrees
98        "build/linux/debian_bullseye_amd64-sysroot:headers": [
99            "build/linux/debian_bullseye_amd64-sysroot/usr/include:include",
100            "build/linux/debian_bullseye_amd64-sysroot/usr/lib:headers",
101        ],
102        "build/linux/debian_bullseye_i386-sysroot:headers": [
103            "build/linux/debian_bullseye_i386-sysroot/usr/include:include",
104            "build/linux/debian_bullseye_i386-sysroot/usr/lib:headers",
105        ],
106        "build/linux/debian_bullseye_amd64-sysroot:link": [
107            "build/linux/debian_bullseye_amd64-sysroot/lib/x86_64-linux-gnu:libso",
108            "build/linux/debian_bullseye_amd64-sysroot/lib64/ld-linux-x86-64.so.2",
109            "build/linux/debian_bullseye_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu:libgcc",
110            "build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu:libs",
111            "third_party/llvm-build/Release+Asserts/bin/clang",
112            "third_party/llvm-build/Release+Asserts/bin/clang++",
113            "third_party/llvm-build/Release+Asserts/bin/ld.lld",
114            "third_party/llvm-build/Release+Asserts/bin/lld",
115            "third_party/llvm-build/Release+Asserts/bin/llvm-nm",
116            "third_party/llvm-build/Release+Asserts/bin/llvm-readelf",
117            "third_party/llvm-build/Release+Asserts/bin/llvm-readobj",
118            # The following inputs are used for sanitizer builds.
119            # It might be better to add them only for sanitizer builds if there is a performance issue.
120            "third_party/llvm-build/Release+Asserts/lib/clang:libs",
121        ],
122        "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot:headers": [
123            "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include",
124            "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include:include",
125        ],
126    })
127    step_config["input_deps"].update(clang_all.input_deps)
128
129    input_root_absolute_path = gn_logs.read(ctx).get("clang_need_input_root_absolute_path") == "true"
130    canonicalize_dir = not input_root_absolute_path
131
132    step_config["rules"].extend([
133        {
134            "name": "clang/cxx",
135            "action": "(.*_)?cxx",
136            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++ ",
137            "inputs": [
138                "third_party/llvm-build/Release+Asserts/bin/clang++",
139            ],
140            "exclude_input_patterns": ["*.stamp"],
141            "remote": True,
142            "input_root_absolute_path": input_root_absolute_path,
143            "canonicalize_dir": canonicalize_dir,
144            "timeout": "2m",
145        },
146        {
147            "name": "clang/cc",
148            "action": "(.*_)?cc",
149            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang ",
150            "inputs": [
151                "third_party/llvm-build/Release+Asserts/bin/clang",
152            ],
153            "exclude_input_patterns": ["*.stamp"],
154            "remote": True,
155            "input_root_absolute_path": input_root_absolute_path,
156            "canonicalize_dir": canonicalize_dir,
157            "timeout": "2m",
158        },
159        {
160            "name": "clang/asm",
161            "action": "(.*_)?asm",
162            "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang",
163            "inputs": [
164                "third_party/llvm-build/Release+Asserts/bin/clang",
165            ],
166            "remote": config.get(ctx, "cog"),
167            "input_root_absolute_path": input_root_absolute_path,
168            "canonicalize_dir": canonicalize_dir,
169            "timeout": "2m",
170        },
171        {
172            "name": "clang-coverage/cxx",
173            "action": "(.*_)?cxx",
174            "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py",
175            "inputs": [
176                "third_party/llvm-build/Release+Asserts/bin/clang++",
177            ],
178            "exclude_input_patterns": ["*.stamp"],
179            "handler": "clang_compile_coverage",
180            "remote": True,
181            "input_root_absolute_path": input_root_absolute_path,
182            "canonicalize_dir": canonicalize_dir,
183            "timeout": "2m",
184        },
185        {
186            "name": "clang-coverage/cc",
187            "action": "(.*_)?cc",
188            "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py",
189            "inputs": [
190                "third_party/llvm-build/Release+Asserts/bin/clang",
191            ],
192            "exclude_input_patterns": ["*.stamp"],
193            "handler": "clang_compile_coverage",
194            "remote": True,
195            "input_root_absolute_path": input_root_absolute_path,
196            "canonicalize_dir": canonicalize_dir,
197            "timeout": "2m",
198        },
199    ])
200
201    # TODO: b/316267242 - Enable remote links for Android and CrOS toolchain builds.
202    if not android.enabled(ctx) and not (cros.custom_toolchain(ctx) or cros.custom_sysroot(ctx)):
203        step_config["rules"].extend([
204            {
205                "name": "clang/alink/llvm-ar",
206                "action": "(.*_)?alink",
207                "inputs": [
208                    # TODO: b/316267242 - Add inputs to GN config.
209                    "third_party/llvm-build/Release+Asserts/bin/llvm-ar",
210                ],
211                "exclude_input_patterns": [
212                    "*.cc",
213                    "*.h",
214                    "*.js",
215                    "*.pak",
216                    "*.py",
217                    "*.stamp",
218                ],
219                "remote": config.get(ctx, "remote-library-link"),
220                "canonicalize_dir": True,
221                "timeout": "2m",
222                "platform_ref": "large",
223                "accumulate": True,
224            },
225            {
226                "name": "clang/solink/gcc_solink_wrapper",
227                "action": "(.*_)?solink",
228                "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"",
229                "inputs": [
230                    # TODO: b/316267242 - Add inputs to GN config.
231                    "build/toolchain/gcc_solink_wrapper.py",
232                    "build/toolchain/whole_archive.py",
233                    "build/toolchain/wrapper_utils.py",
234                    "build/linux/debian_bullseye_amd64-sysroot:link",
235                ],
236                "exclude_input_patterns": [
237                    "*.cc",
238                    "*.h",
239                    "*.js",
240                    "*.pak",
241                    "*.py",
242                    "*.stamp",
243                ],
244                "remote": config.get(ctx, "remote-library-link"),
245                "canonicalize_dir": True,
246                "platform_ref": "large",
247                "timeout": "2m",
248            },
249            {
250                "name": "clang/link/gcc_link_wrapper",
251                "action": "(.*_)?link",
252                "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"",
253                "inputs": [
254                    # TODO: b/316267242 - Add inputs to GN config.
255                    "build/toolchain/gcc_link_wrapper.py",
256                    "build/toolchain/whole_archive.py",
257                    "build/toolchain/wrapper_utils.py",
258                    "build/linux/debian_bullseye_amd64-sysroot:link",
259                ],
260                "exclude_input_patterns": [
261                    "*.cc",
262                    "*.h",
263                    "*.js",
264                    "*.pak",
265                    "*.py",
266                    "*.stamp",
267                ],
268                "remote": config.get(ctx, "remote-exec-link"),
269                "canonicalize_dir": True,
270                "platform_ref": "large",
271                "timeout": "10m",
272            },
273        ])
274    return step_config
275
276clang = module(
277    "clang",
278    step_config = __step_config,
279    filegroups = __filegroups,
280    handlers = __handlers,
281)
282