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, "lib") + ":libs"] = { 74 "type": "glob", 75 "includes": ["*.so", "*.so.*", "*.a", "*.o"], 76 } 77 fg[path.join(toolchain, "lib64") + ":libs"] = { 78 "type": "glob", 79 "includes": ["*.so", "*.so.*", "*.a", "*.o"], 80 } 81 fg[path.join(toolchain, "usr/lib64") + ":libs"] = { 82 "type": "glob", 83 "includes": ["*.so", "*.so.*", "*.a", "*.o"], 84 } 85 fg[path.join(toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs"] = { 86 "type": "glob", 87 "includes": ["*.so", "*.so.*", "*.a", "*.o"], 88 } 89 fg[path.join(toolchain, "usr/bin") + ":clang"] = { 90 "type": "glob", 91 "includes": [ 92 "*clang*", 93 "sysroot_wrapper.hardened.ccache*", 94 ], 95 } 96 97 for sysroot in [ 98 cros_args.get("target_sysroot"), 99 cros_args.get("cros_nacl_helper_arm32_sysroot"), 100 ]: 101 if not sysroot: 102 continue 103 print("sysroot = %s" % sysroot) 104 fg[path.join(sysroot, "usr/include") + ":include"] = { 105 "type": "glob", 106 "includes": ["*"], 107 # needs bits/stab.def, c++/* 108 } 109 fg[path.join(sysroot, "usr/lib") + ":headers"] = { 110 "type": "glob", 111 "includes": ["*.h", "crtbegin.o"], 112 } 113 fg[path.join(sysroot, "usr/lib64") + ":headers"] = { 114 "type": "glob", 115 "includes": ["*.h"], 116 } 117 fg[sysroot + ":libs"] = { 118 "type": "glob", 119 "includes": ["*.so", "*.so.*", "*.a", "*.o"], 120 } 121 print(fg) 122 return fg 123 124def __step_config(ctx, step_config): 125 cros_args = __cros_gn_args(ctx) 126 toolchain = cros_args.get("cros_toolchain") 127 cros_nacl_helper_arm32_toolchain = cros_args.get("cros_nacl_helper_arm32_toolchain") 128 cros_nacl_helper_arm32_sysroot = cros_args.get("cros_nacl_helper_arm32_sysroot") 129 sysroot = cros_args.get("target_sysroot") 130 if not (toolchain and sysroot): 131 return step_config 132 133 cros_target_cxx = cros_args.get("cros_target_cxx") 134 if cros_target_cxx: 135 step_config["rules"].extend([ 136 { 137 "name": "clang-cros/cxx", 138 "action": "(.*_)?cxx", 139 "command_prefix": path.join("../../", cros_target_cxx), 140 "remote": True, 141 "canonicalize_dir": True, 142 "timeout": "5m", 143 }, 144 ]) 145 146 cros_target_cc = cros_args.get("cros_target_cc") 147 if cros_target_cxx: 148 step_config["rules"].extend([ 149 { 150 "name": "clang-cros/cc", 151 "action": "(.*_)?cc", 152 "command_prefix": path.join("../../", cros_target_cc), 153 "remote": True, 154 "canonicalize_dir": True, 155 "timeout": "5m", 156 }, 157 ]) 158 159 cros_target_ar = cros_args.get("cros_target_ar") 160 if cros_target_ar: 161 step_config["rules"].extend([ 162 { 163 "name": "clang-cros/alink/llvm-ar", 164 # Other alink steps should use clang/alink/llvm-ar rule or a 165 # nacl rule. 166 "action": "(target_with_system_allocator_)?alink", 167 "inputs": [ 168 cros_target_ar, 169 ], 170 "exclude_input_patterns": [ 171 "*.cc", 172 "*.h", 173 "*.js", 174 "*.pak", 175 "*.py", 176 "*.stamp", 177 ], 178 "handler": "clang_alink", 179 "remote": config.get(ctx, "remote-link"), 180 "canonicalize_dir": True, 181 "timeout": "5m", 182 "platform_ref": "large", 183 "accumulate": True, 184 }, 185 ]) 186 step_config["input_deps"].update({ 187 cros_target_ar: [ 188 path.join(toolchain, "bin/llvm-ar.elf"), 189 path.join(toolchain, "lib") + ":libs", 190 path.join(toolchain, "usr/lib64") + ":libs", 191 ], 192 }) 193 194 cros_nacl_helper_arm32_cxx = cros_args.get("cros_nacl_helper_arm32_cxx") 195 if cros_nacl_helper_arm32_cxx: 196 step_config["rules"].extend([ 197 { 198 "name": "clang-cros/nacl_helper_arm32_cxx", 199 "action": "nacl_helper_arm32_cxx", 200 "command_prefix": path.join("../../", cros_nacl_helper_arm32_cxx), 201 "remote": True, 202 "canonicalize_dir": True, 203 "timeout": "5m", 204 }, 205 ]) 206 207 cros_nacl_helper_arm32_cc = cros_args.get("cros_nacl_helper_arm32_cc") 208 if cros_nacl_helper_arm32_cxx: 209 step_config["rules"].extend([ 210 { 211 "name": "clang-cros/nacl_helper_arm32_cc", 212 "action": "nacl_helper_arm32_cc", 213 "command_prefix": path.join("../../", cros_nacl_helper_arm32_cc), 214 "remote": True, 215 "canonicalize_dir": True, 216 "timeout": "5m", 217 }, 218 ]) 219 220 cros_nacl_helper_arm32_ar = cros_args.get("cros_nacl_helper_arm32_ar") 221 if cros_nacl_helper_arm32_ar: 222 step_config["rules"].extend([ 223 { 224 "name": "clang-cros/alink/nacl_helper_arm32_llvm-ar", 225 # Other alink steps should use clang/alink/llvm-ar rule or a 226 # nacl rule. 227 "action": "nacl_helper_arm32_alink", 228 "inputs": [ 229 cros_nacl_helper_arm32_ar, 230 ], 231 "exclude_input_patterns": [ 232 "*.cc", 233 "*.h", 234 "*.js", 235 "*.pak", 236 "*.py", 237 "*.stamp", 238 ], 239 "handler": "clang_alink", 240 "remote": config.get(ctx, "remote-link"), 241 "canonicalize_dir": True, 242 "timeout": "5m", 243 "platform_ref": "large", 244 "accumulate": True, 245 }, 246 ]) 247 step_config["input_deps"].update({ 248 cros_nacl_helper_arm32_ar: [ 249 path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"), 250 path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs", 251 path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs", 252 ], 253 }) 254 255 step_config["rules"].extend([ 256 { 257 "name": "clang-cros/solink/gcc_solink_wrapper", 258 "action": "(target_with_system_allocator_)?solink", 259 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"", 260 "inputs": [ 261 "build/toolchain/gcc_solink_wrapper.py", 262 path.join(toolchain, "bin/ld.lld"), 263 ], 264 "exclude_input_patterns": [ 265 "*.cc", 266 "*.h", 267 "*.js", 268 "*.pak", 269 "*.py", 270 "*.stamp", 271 ], 272 "remote": config.get(ctx, "remote-link"), 273 # TODO: Do not use absolute paths for custom toolchain/sysroot GN 274 # args. 275 "input_root_absolute_path": True, 276 "platform_ref": "large", 277 "timeout": "2m", 278 }, 279 { 280 "name": "clang-cros/link/gcc_link_wrapper", 281 "action": "(target_with_system_allocator_)?link", 282 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"", 283 "handler": "clang_link", 284 "inputs": [ 285 "build/toolchain/gcc_link_wrapper.py", 286 path.join(toolchain, "bin/ld.lld"), 287 ], 288 "exclude_input_patterns": [ 289 "*.cc", 290 "*.h", 291 "*.js", 292 "*.pak", 293 "*.py", 294 "*.stamp", 295 ], 296 "remote": config.get(ctx, "remote-link"), 297 "canonicalize_dir": True, 298 "platform_ref": "large", 299 "timeout": "10m", 300 }, 301 ]) 302 step_config["input_deps"].update({ 303 sysroot + ":headers": [ 304 path.join(sysroot, "usr/include") + ":include", 305 path.join(sysroot, "usr/lib") + ":headers", 306 path.join(sysroot, "usr/lib64") + ":headers", 307 ], 308 path.join(toolchain, "bin/llvm-ar"): [ 309 path.join(toolchain, "bin/llvm-ar.elf"), 310 path.join(toolchain, "lib") + ":libs", 311 path.join(toolchain, "usr/lib64") + ":libs", 312 ], 313 path.join(toolchain, "bin/ld.lld"): [ 314 path.join(toolchain, "bin:llddeps"), 315 path.join(toolchain, "lib") + ":libs", 316 path.join(toolchain, "lib64") + ":libs", 317 path.join(toolchain, "usr/bin:clang"), 318 path.join(toolchain, "usr/lib64") + ":libs", 319 sysroot + ":libs", 320 ], 321 }) 322 323 if cros_nacl_helper_arm32_toolchain and cros_nacl_helper_arm32_sysroot: 324 step_config["rules"].extend([ 325 { 326 "name": "clang-cros/nacl_helper_arm32_solink/gcc_solink_wrapper", 327 "action": "nacl_helper_arm32_solink", 328 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"", 329 "inputs": [ 330 "build/toolchain/gcc_solink_wrapper.py", 331 path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"), 332 ], 333 "exclude_input_patterns": [ 334 "*.cc", 335 "*.h", 336 "*.js", 337 "*.pak", 338 "*.py", 339 "*.stamp", 340 ], 341 "remote": config.get(ctx, "remote-link"), 342 # TODO: Do not use absolute paths for custom toolchain/sysroot GN 343 # args. 344 "input_root_absolute_path": True, 345 "platform_ref": "large", 346 "timeout": "2m", 347 }, 348 { 349 "name": "clang-cros/nacl_helper_arm32_link/gcc_link_wrapper", 350 "action": "nacl_helper_arm32_link", 351 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"", 352 "handler": "clang_link", 353 "inputs": [ 354 "build/toolchain/gcc_link_wrapper.py", 355 path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"), 356 ], 357 "exclude_input_patterns": [ 358 "*.cc", 359 "*.h", 360 "*.js", 361 "*.pak", 362 "*.py", 363 "*.stamp", 364 ], 365 "remote": config.get(ctx, "remote-link"), 366 "canonicalize_dir": True, 367 "platform_ref": "large", 368 "timeout": "10m", 369 }, 370 ]) 371 step_config["input_deps"].update({ 372 cros_nacl_helper_arm32_sysroot + ":headers": [ 373 path.join(cros_nacl_helper_arm32_sysroot, "usr/include") + ":include", 374 path.join(cros_nacl_helper_arm32_sysroot, "usr/lib") + ":headers", 375 path.join(cros_nacl_helper_arm32_sysroot, "usr/lib64") + ":headers", 376 ], 377 path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar"): [ 378 path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"), 379 path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs", 380 path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs", 381 ], 382 path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"): [ 383 path.join(cros_nacl_helper_arm32_toolchain, "bin:llddeps"), 384 path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs", 385 path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs", 386 path.join(cros_nacl_helper_arm32_toolchain, "usr/bin:clang"), 387 path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs", 388 path.join(cros_nacl_helper_arm32_toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs", 389 path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs", 390 cros_nacl_helper_arm32_sysroot + ":libs", 391 ], 392 }) 393 394 return step_config 395 396cros = module( 397 "cros", 398 filegroups = __filegroups, 399 handlers = {}, 400 step_config = __step_config, 401) 402