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 ChromeOS builds.""" 6 7load("@builtin//lib/gn.star", "gn") 8load("@builtin//path.star", "path") 9load("@builtin//struct.star", "module") 10load("./config.star", "config") 11 12def __cros_gn_args(ctx): 13 """Returns all CrOS specific toolchain and sysroot GN args.""" 14 if not "args.gn" in ctx.metadata: 15 print("no args.gn") 16 return {} 17 gn_args = gn.args(ctx) 18 if gn_args.get("target_os") != '"chromeos"': 19 return {} 20 21 cros_args = {} 22 for arg in [ 23 "cros_target_ar", 24 "cros_target_cc", 25 "cros_target_cxx", 26 "cros_target_ld", 27 "cros_target_nm", 28 "cros_target_readelf", 29 "cros_nacl_helper_arm32_ar", 30 "cros_nacl_helper_arm32_cc", 31 "cros_nacl_helper_arm32_cxx", 32 "cros_nacl_helper_arm32_ld", 33 "cros_nacl_helper_arm32_readelf", 34 "cros_nacl_helper_arm32_sysroot", 35 "target_sysroot", 36 ]: 37 if arg not in gn_args: 38 print("no " + arg) 39 continue 40 fp = ctx.fs.canonpath(gn_args.get(arg).strip('"')) 41 cros_args[arg] = fp 42 if arg == "cros_target_cxx": 43 cros_args["cros_toolchain"] = path.dir(path.dir(fp)) 44 if arg == "cros_nacl_helper_arm32_cxx": 45 cros_args["cros_nacl_helper_arm32_toolchain"] = path.dir(path.dir(fp)) 46 return cros_args 47 48def __filegroups(ctx): 49 fg = {} 50 cros_args = __cros_gn_args(ctx) 51 for toolchain in [ 52 cros_args.get("cros_toolchain"), 53 cros_args.get("cros_nacl_helper_arm32_toolchain"), 54 ]: 55 if not toolchain: 56 continue 57 print("toolchain = %s" % toolchain) 58 fg[toolchain + ":headers"] = { 59 "type": "glob", 60 # TODO: Avoid using "*" to include only required files. 61 "includes": ["*"], 62 } 63 fg[path.join(toolchain, "bin") + ":llddeps"] = { 64 "type": "glob", 65 "includes": [ 66 "*lld*", 67 "*clang*", 68 "llvm-nm*", 69 "llvm-readelf*", 70 "llvm-readobj*", 71 ], 72 } 73 fg[path.join(toolchain, "usr/bin") + ":llddeps"] = { 74 "type": "glob", 75 "includes": [ 76 "*lld*", 77 "*clang*", 78 "sysroot_wrapper*", 79 "llvm-nm*", 80 "llvm-readelf*", 81 "llvm-readobj*", 82 ], 83 } 84 fg[path.join(toolchain, "lib") + ":libs"] = { 85 "type": "glob", 86 "includes": ["*.so", "*.so.*", "*.a", "*.o"], 87 } 88 fg[path.join(toolchain, "lib64") + ":libs"] = { 89 "type": "glob", 90 "includes": ["*.so", "*.so.*", "*.a", "*.o"], 91 } 92 fg[path.join(toolchain, "usr/lib64") + ":libs"] = { 93 "type": "glob", 94 "includes": ["*.so", "*.so.*", "*.a", "*.o", "cfi_ignorelist.txt"], 95 } 96 fg[path.join(toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs"] = { 97 "type": "glob", 98 "includes": ["*.so", "*.so.*", "*.a", "*.o"], 99 } 100 fg[path.join(toolchain, "usr/bin") + ":clang"] = { 101 "type": "glob", 102 "includes": [ 103 "*clang*", 104 "sysroot_wrapper.hardened.ccache*", 105 ], 106 } 107 108 for sysroot in [ 109 cros_args.get("target_sysroot"), 110 cros_args.get("cros_nacl_helper_arm32_sysroot"), 111 ]: 112 if not sysroot: 113 continue 114 print("sysroot = %s" % sysroot) 115 fg[path.join(sysroot, "usr/include") + ":include"] = { 116 "type": "glob", 117 "includes": ["*"], 118 # needs bits/stab.def, c++/* 119 } 120 fg[path.join(sysroot, "usr/lib") + ":headers"] = { 121 "type": "glob", 122 "includes": ["*.h", "crtbegin.o"], 123 } 124 fg[path.join(sysroot, "usr/lib64") + ":headers"] = { 125 "type": "glob", 126 "includes": ["*.h"], 127 } 128 fg[sysroot + ":libs"] = { 129 "type": "glob", 130 "includes": ["*.so", "*.so.*", "*.a", "*.o"], 131 } 132 print(fg) 133 return fg 134 135def __step_config(ctx, step_config): 136 cros_args = __cros_gn_args(ctx) 137 toolchain = cros_args.get("cros_toolchain") 138 cros_nacl_helper_arm32_toolchain = cros_args.get("cros_nacl_helper_arm32_toolchain") 139 cros_nacl_helper_arm32_sysroot = cros_args.get("cros_nacl_helper_arm32_sysroot") 140 sysroot = cros_args.get("target_sysroot") 141 if not (toolchain and sysroot): 142 return step_config 143 144 cros_target_cxx = cros_args.get("cros_target_cxx") 145 if cros_target_cxx: 146 step_config["rules"].extend([ 147 { 148 "name": "clang-cros/cxx", 149 "action": "(.*_)?cxx", 150 "command_prefix": path.join("../../", cros_target_cxx), 151 "remote": True, 152 # fast-deps is not safe with cros toolchain. crbug.com/391160876 153 "no_fast_deps": True, 154 "canonicalize_dir": True, 155 "timeout": "5m", 156 }, 157 ]) 158 159 cros_target_cc = cros_args.get("cros_target_cc") 160 if cros_target_cxx: 161 step_config["rules"].extend([ 162 { 163 "name": "clang-cros/cc", 164 "action": "(.*_)?cc", 165 "command_prefix": path.join("../../", cros_target_cc), 166 "remote": True, 167 # fast-deps is not safe with cros toolchain. crbug.com/391160876 168 "no_fast_deps": True, 169 "canonicalize_dir": True, 170 "timeout": "5m", 171 }, 172 ]) 173 174 cros_target_ar = cros_args.get("cros_target_ar") 175 if cros_target_ar: 176 step_config["rules"].extend([ 177 { 178 "name": "clang-cros/alink/llvm-ar", 179 # Other alink steps should use clang/alink/llvm-ar rule or a 180 # nacl rule. 181 "action": "(target_with_system_allocator_)?alink", 182 "inputs": [ 183 cros_target_ar, 184 ], 185 "exclude_input_patterns": [ 186 "*.cc", 187 "*.h", 188 "*.js", 189 "*.pak", 190 "*.py", 191 ], 192 "handler": "lld_thin_archive", 193 "remote": config.get(ctx, "remote-link"), 194 "canonicalize_dir": True, 195 "timeout": "5m", 196 "platform_ref": "large", 197 "accumulate": True, 198 }, 199 ]) 200 step_config["input_deps"].update({ 201 cros_target_ar: [ 202 path.join(toolchain, "bin/llvm-ar.elf"), 203 path.join(toolchain, "lib") + ":libs", 204 path.join(toolchain, "usr/lib64") + ":libs", 205 ], 206 }) 207 208 cros_nacl_helper_arm32_cxx = cros_args.get("cros_nacl_helper_arm32_cxx") 209 if cros_nacl_helper_arm32_cxx: 210 step_config["rules"].extend([ 211 { 212 "name": "clang-cros/nacl_helper_arm32_cxx", 213 "action": "nacl_helper_arm32_cxx", 214 "command_prefix": path.join("../../", cros_nacl_helper_arm32_cxx), 215 "remote": True, 216 "canonicalize_dir": True, 217 "timeout": "5m", 218 }, 219 ]) 220 221 cros_nacl_helper_arm32_cc = cros_args.get("cros_nacl_helper_arm32_cc") 222 if cros_nacl_helper_arm32_cxx: 223 step_config["rules"].extend([ 224 { 225 "name": "clang-cros/nacl_helper_arm32_cc", 226 "action": "nacl_helper_arm32_cc", 227 "command_prefix": path.join("../../", cros_nacl_helper_arm32_cc), 228 "remote": True, 229 "canonicalize_dir": True, 230 "timeout": "5m", 231 }, 232 ]) 233 234 cros_nacl_helper_arm32_ar = cros_args.get("cros_nacl_helper_arm32_ar") 235 if cros_nacl_helper_arm32_ar: 236 step_config["rules"].extend([ 237 { 238 "name": "clang-cros/alink/nacl_helper_arm32_llvm-ar", 239 # Other alink steps should use clang/alink/llvm-ar rule or a 240 # nacl rule. 241 "action": "nacl_helper_arm32_alink", 242 "inputs": [ 243 cros_nacl_helper_arm32_ar, 244 ], 245 "exclude_input_patterns": [ 246 "*.cc", 247 "*.h", 248 "*.js", 249 "*.pak", 250 "*.py", 251 ], 252 "handler": "lld_thin_archive", 253 "remote": config.get(ctx, "remote-link"), 254 "canonicalize_dir": True, 255 "timeout": "5m", 256 "platform_ref": "large", 257 "accumulate": True, 258 }, 259 ]) 260 step_config["input_deps"].update({ 261 cros_nacl_helper_arm32_ar: [ 262 path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"), 263 path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs", 264 path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs", 265 ], 266 }) 267 268 step_config["rules"].extend([ 269 { 270 "name": "clang-cros/solink/gcc_solink_wrapper", 271 "action": "(target_with_system_allocator_)?solink", 272 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"", 273 "inputs": [ 274 "build/toolchain/gcc_solink_wrapper.py", 275 path.join(toolchain, "bin/ld.lld"), 276 ], 277 "exclude_input_patterns": [ 278 "*.cc", 279 "*.h", 280 "*.js", 281 "*.pak", 282 "*.py", 283 ], 284 "remote": config.get(ctx, "remote-link"), 285 # TODO: Do not use absolute paths for custom toolchain/sysroot GN 286 # args. 287 "input_root_absolute_path": True, 288 "platform_ref": "large", 289 "timeout": "2m", 290 }, 291 { 292 "name": "clang-cros/link/gcc_link_wrapper", 293 "action": "(target_with_system_allocator_)?link", 294 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"", 295 "handler": "clang_link", 296 "inputs": [ 297 "build/toolchain/gcc_link_wrapper.py", 298 path.join(toolchain, "bin/ld.lld"), 299 ], 300 "exclude_input_patterns": [ 301 "*.cc", 302 "*.h", 303 "*.js", 304 "*.pak", 305 "*.py", 306 ], 307 "remote": config.get(ctx, "remote-link"), 308 "canonicalize_dir": True, 309 "platform_ref": "large", 310 "timeout": "10m", 311 }, 312 ]) 313 step_config["input_deps"].update({ 314 sysroot + ":headers": [ 315 path.join(sysroot, "usr/include") + ":include", 316 path.join(sysroot, "usr/lib") + ":headers", 317 path.join(sysroot, "usr/lib64") + ":headers", 318 ], 319 path.join(toolchain, "bin/llvm-ar"): [ 320 path.join(toolchain, "bin/llvm-ar.elf"), 321 path.join(toolchain, "lib") + ":libs", 322 path.join(toolchain, "usr/lib64") + ":libs", 323 ], 324 path.join(toolchain, "bin/ld.lld"): [ 325 path.join(toolchain, "bin:llddeps"), 326 path.join(toolchain, "lib") + ":libs", 327 path.join(toolchain, "lib64") + ":libs", 328 path.join(toolchain, "usr/bin:clang"), 329 path.join(toolchain, "usr/lib64") + ":libs", 330 sysroot + ":libs", 331 ], 332 toolchain + ":link": [ 333 path.join(toolchain, "bin") + ":llddeps", 334 path.join(toolchain, "lib") + ":libs", 335 path.join(toolchain, "lib64") + ":libs", 336 path.join(toolchain, "usr/bin") + ":llddeps", 337 path.join(toolchain, "usr/lib64") + ":libs", 338 ], 339 sysroot + ":link": [ 340 sysroot + ":libs", 341 ], 342 }) 343 344 if cros_nacl_helper_arm32_toolchain and cros_nacl_helper_arm32_sysroot: 345 step_config["rules"].extend([ 346 { 347 "name": "clang-cros/nacl_helper_arm32_solink/gcc_solink_wrapper", 348 "action": "nacl_helper_arm32_solink", 349 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"", 350 "inputs": [ 351 "build/toolchain/gcc_solink_wrapper.py", 352 path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"), 353 ], 354 "exclude_input_patterns": [ 355 "*.cc", 356 "*.h", 357 "*.js", 358 "*.pak", 359 "*.py", 360 ], 361 "remote": config.get(ctx, "remote-link"), 362 # TODO: Do not use absolute paths for custom toolchain/sysroot GN 363 # args. 364 "input_root_absolute_path": True, 365 "platform_ref": "large", 366 "timeout": "2m", 367 }, 368 { 369 "name": "clang-cros/nacl_helper_arm32_link/gcc_link_wrapper", 370 "action": "nacl_helper_arm32_link", 371 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"", 372 "handler": "clang_link", 373 "inputs": [ 374 "build/toolchain/gcc_link_wrapper.py", 375 path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"), 376 ], 377 "exclude_input_patterns": [ 378 "*.cc", 379 "*.h", 380 "*.js", 381 "*.pak", 382 "*.py", 383 ], 384 "remote": config.get(ctx, "remote-link"), 385 "canonicalize_dir": True, 386 "platform_ref": "large", 387 "timeout": "10m", 388 }, 389 ]) 390 step_config["input_deps"].update({ 391 cros_nacl_helper_arm32_sysroot + ":headers": [ 392 path.join(cros_nacl_helper_arm32_sysroot, "usr/include") + ":include", 393 path.join(cros_nacl_helper_arm32_sysroot, "usr/lib") + ":headers", 394 path.join(cros_nacl_helper_arm32_sysroot, "usr/lib64") + ":headers", 395 ], 396 path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar"): [ 397 path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"), 398 path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs", 399 path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs", 400 ], 401 path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"): [ 402 path.join(cros_nacl_helper_arm32_toolchain, "bin:llddeps"), 403 path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs", 404 path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs", 405 path.join(cros_nacl_helper_arm32_toolchain, "usr/bin:clang"), 406 path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs", 407 path.join(cros_nacl_helper_arm32_toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs", 408 path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs", 409 cros_nacl_helper_arm32_sysroot + ":libs", 410 ], 411 }) 412 413 return step_config 414 415cros = module( 416 "cros", 417 filegroups = __filegroups, 418 handlers = {}, 419 step_config = __step_config, 420) 421