1*6777b538SAndroid Build Coastguard Worker# -*- bazel-starlark -*- 2*6777b538SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker"""Siso configuration for ChromeOS builds.""" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Workerload("@builtin//lib/gn.star", "gn") 8*6777b538SAndroid Build Coastguard Workerload("@builtin//path.star", "path") 9*6777b538SAndroid Build Coastguard Workerload("@builtin//struct.star", "module") 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Workerdef __custom_toolchain(ctx): 12*6777b538SAndroid Build Coastguard Worker if not "args.gn" in ctx.metadata: 13*6777b538SAndroid Build Coastguard Worker print("no args.gn") 14*6777b538SAndroid Build Coastguard Worker return None 15*6777b538SAndroid Build Coastguard Worker gn_args = gn.args(ctx) 16*6777b538SAndroid Build Coastguard Worker if gn_args.get("target_os") != '"chromeos"': 17*6777b538SAndroid Build Coastguard Worker return None 18*6777b538SAndroid Build Coastguard Worker if not "cros_target_cxx" in gn_args: 19*6777b538SAndroid Build Coastguard Worker print("no cros_target_cxx") 20*6777b538SAndroid Build Coastguard Worker return None 21*6777b538SAndroid Build Coastguard Worker cros_target_cxx = gn_args.get("cros_target_cxx") 22*6777b538SAndroid Build Coastguard Worker cros_target_cxx = cros_target_cxx.strip('"') 23*6777b538SAndroid Build Coastguard Worker cros_target_cxx = ctx.fs.canonpath(cros_target_cxx) 24*6777b538SAndroid Build Coastguard Worker toolchain = path.dir(path.dir(cros_target_cxx)) 25*6777b538SAndroid Build Coastguard Worker if not toolchain: 26*6777b538SAndroid Build Coastguard Worker fail("failed to detect cros custom toolchain. cros_target_cxx = %s" % gn_args.get("cros_target_cxx")) 27*6777b538SAndroid Build Coastguard Worker return toolchain 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Workerdef __custom_sysroot(ctx): 30*6777b538SAndroid Build Coastguard Worker if not "args.gn" in ctx.metadata: 31*6777b538SAndroid Build Coastguard Worker print("no args.gn") 32*6777b538SAndroid Build Coastguard Worker return None 33*6777b538SAndroid Build Coastguard Worker gn_args = gn.args(ctx) 34*6777b538SAndroid Build Coastguard Worker if gn_args.get("target_os") != '"chromeos"': 35*6777b538SAndroid Build Coastguard Worker return None 36*6777b538SAndroid Build Coastguard Worker if not "target_sysroot" in gn_args: 37*6777b538SAndroid Build Coastguard Worker print("no target_sysroot") 38*6777b538SAndroid Build Coastguard Worker return None 39*6777b538SAndroid Build Coastguard Worker sysroot = gn_args.get("target_sysroot") 40*6777b538SAndroid Build Coastguard Worker sysroot = sysroot.strip('"') 41*6777b538SAndroid Build Coastguard Worker sysroot = ctx.fs.canonpath(sysroot) 42*6777b538SAndroid Build Coastguard Worker if not sysroot: 43*6777b538SAndroid Build Coastguard Worker fail("failed to detect cros custom sysroot. target_sysroot = %s" % gn_args.get("target_sysroot")) 44*6777b538SAndroid Build Coastguard Worker return sysroot 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Workerdef __filegroups(ctx): 47*6777b538SAndroid Build Coastguard Worker fg = {} 48*6777b538SAndroid Build Coastguard Worker toolchain = __custom_toolchain(ctx) 49*6777b538SAndroid Build Coastguard Worker print("toolchain = %s" % toolchain) 50*6777b538SAndroid Build Coastguard Worker if toolchain: 51*6777b538SAndroid Build Coastguard Worker fg[toolchain + ":headers"] = { 52*6777b538SAndroid Build Coastguard Worker "type": "glob", 53*6777b538SAndroid Build Coastguard Worker "includes": ["*"], 54*6777b538SAndroid Build Coastguard Worker } 55*6777b538SAndroid Build Coastguard Worker sysroot = __custom_sysroot(ctx) 56*6777b538SAndroid Build Coastguard Worker print("sysroot = %s" % sysroot) 57*6777b538SAndroid Build Coastguard Worker if sysroot: 58*6777b538SAndroid Build Coastguard Worker fg[path.join(sysroot, "usr/include") + ":include"] = { 59*6777b538SAndroid Build Coastguard Worker "type": "glob", 60*6777b538SAndroid Build Coastguard Worker "includes": ["*"], 61*6777b538SAndroid Build Coastguard Worker # needs bits/stab.def, c++/* 62*6777b538SAndroid Build Coastguard Worker } 63*6777b538SAndroid Build Coastguard Worker fg[path.join(sysroot, "usr/lib") + ":headers"] = { 64*6777b538SAndroid Build Coastguard Worker "type": "glob", 65*6777b538SAndroid Build Coastguard Worker "includes": ["*.h", "crtbegin.o"], 66*6777b538SAndroid Build Coastguard Worker } 67*6777b538SAndroid Build Coastguard Worker fg[path.join(sysroot, "usr/lib64") + ":headers"] = { 68*6777b538SAndroid Build Coastguard Worker "type": "glob", 69*6777b538SAndroid Build Coastguard Worker "includes": ["*.h"], 70*6777b538SAndroid Build Coastguard Worker } 71*6777b538SAndroid Build Coastguard Worker print(fg) 72*6777b538SAndroid Build Coastguard Worker return fg 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Workerdef __cros_compiler(ctx, cmd): 75*6777b538SAndroid Build Coastguard Worker tool_inputs = cmd.tool_inputs 76*6777b538SAndroid Build Coastguard Worker for i, arg in enumerate(cmd.args): 77*6777b538SAndroid Build Coastguard Worker if arg.startswith("-fprofile-sample-use="): 78*6777b538SAndroid Build Coastguard Worker # profile data is in ninja input (direct or indirect), 79*6777b538SAndroid Build Coastguard Worker # but siso doesn't include ninja inputs for deps=gcc 80*6777b538SAndroid Build Coastguard Worker # (it would include lots of unnecessary inputs) 81*6777b538SAndroid Build Coastguard Worker # so just add profdata by checking command line flag. 82*6777b538SAndroid Build Coastguard Worker profdata = ctx.fs.canonpath(arg.removeprefix("-fprofile-sample-use=")) 83*6777b538SAndroid Build Coastguard Worker tool_inputs.append(profdata) 84*6777b538SAndroid Build Coastguard Worker ctx.actions.fix(tool_inputs = tool_inputs) 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker__handlers = { 87*6777b538SAndroid Build Coastguard Worker "cros_compiler": __cros_compiler, 88*6777b538SAndroid Build Coastguard Worker} 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Workerdef __step_config(ctx, step_config): 91*6777b538SAndroid Build Coastguard Worker if __custom_toolchain(ctx): 92*6777b538SAndroid Build Coastguard Worker step_config["rules"].extend([ 93*6777b538SAndroid Build Coastguard Worker { 94*6777b538SAndroid Build Coastguard Worker "name": "clang-cros/cxx", 95*6777b538SAndroid Build Coastguard Worker "action": "(.*_)?cxx", 96*6777b538SAndroid Build Coastguard Worker "command_prefix": "../../build/cros_cache/chrome-sdk/", 97*6777b538SAndroid Build Coastguard Worker "remote": True, 98*6777b538SAndroid Build Coastguard Worker "handler": "cros_compiler", 99*6777b538SAndroid Build Coastguard Worker "canonicalize_dir": True, 100*6777b538SAndroid Build Coastguard Worker "timeout": "5m", 101*6777b538SAndroid Build Coastguard Worker }, 102*6777b538SAndroid Build Coastguard Worker { 103*6777b538SAndroid Build Coastguard Worker "name": "clang-cros/cc", 104*6777b538SAndroid Build Coastguard Worker "action": "(.*_)?cc", 105*6777b538SAndroid Build Coastguard Worker "command_prefix": "../../build/cros_cache/chrome-sdk/", 106*6777b538SAndroid Build Coastguard Worker "remote": True, 107*6777b538SAndroid Build Coastguard Worker "handler": "cros_compiler", 108*6777b538SAndroid Build Coastguard Worker "canonicalize_dir": True, 109*6777b538SAndroid Build Coastguard Worker "timeout": "5m", 110*6777b538SAndroid Build Coastguard Worker }, 111*6777b538SAndroid Build Coastguard Worker ]) 112*6777b538SAndroid Build Coastguard Worker sysroot = __custom_sysroot(ctx) 113*6777b538SAndroid Build Coastguard Worker if sysroot: 114*6777b538SAndroid Build Coastguard Worker step_config["input_deps"].update({ 115*6777b538SAndroid Build Coastguard Worker sysroot + ":headers": [ 116*6777b538SAndroid Build Coastguard Worker path.join(sysroot, "usr/include") + ":include", 117*6777b538SAndroid Build Coastguard Worker path.join(sysroot, "usr/lib") + ":headers", 118*6777b538SAndroid Build Coastguard Worker path.join(sysroot, "usr/lib64") + ":headers", 119*6777b538SAndroid Build Coastguard Worker ], 120*6777b538SAndroid Build Coastguard Worker }) 121*6777b538SAndroid Build Coastguard Worker return step_config 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Workercros = module( 124*6777b538SAndroid Build Coastguard Worker "cros", 125*6777b538SAndroid Build Coastguard Worker custom_toolchain = __custom_toolchain, 126*6777b538SAndroid Build Coastguard Worker custom_sysroot = __custom_sysroot, 127*6777b538SAndroid Build Coastguard Worker filegroups = __filegroups, 128*6777b538SAndroid Build Coastguard Worker handlers = __handlers, 129*6777b538SAndroid Build Coastguard Worker step_config = __step_config, 130*6777b538SAndroid Build Coastguard Worker) 131