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