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