Source code

Revision control

Copy as Markdown

Other Tools

# -*- bazel-starlark -*-
# Copyright 2023 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Siso configuration for ChromeOS builds."""
load("@builtin//lib/gn.star", "gn")
load("@builtin//path.star", "path")
load("@builtin//struct.star", "module")
load("./config.star", "config")
def __cros_gn_args(ctx):
"""Returns all CrOS specific toolchain and sysroot GN args."""
if not "args.gn" in ctx.metadata:
print("no args.gn")
return {}
gn_args = gn.args(ctx)
if gn_args.get("target_os") != '"chromeos"':
return {}
cros_args = {}
for arg in [
"cros_target_ar",
"cros_target_cc",
"cros_target_cxx",
"cros_target_ld",
"cros_target_nm",
"cros_target_readelf",
"cros_nacl_helper_arm32_ar",
"cros_nacl_helper_arm32_cc",
"cros_nacl_helper_arm32_cxx",
"cros_nacl_helper_arm32_ld",
"cros_nacl_helper_arm32_readelf",
"cros_nacl_helper_arm32_sysroot",
"target_sysroot",
]:
if arg not in gn_args:
print("no " + arg)
continue
fp = ctx.fs.canonpath(gn_args.get(arg).strip('"'))
cros_args[arg] = fp
if arg == "cros_target_cxx":
cros_args["cros_toolchain"] = path.dir(path.dir(fp))
if arg == "cros_nacl_helper_arm32_cxx":
cros_args["cros_nacl_helper_arm32_toolchain"] = path.dir(path.dir(fp))
return cros_args
def __filegroups(ctx):
fg = {}
cros_args = __cros_gn_args(ctx)
for toolchain in [
cros_args.get("cros_toolchain"),
cros_args.get("cros_nacl_helper_arm32_toolchain"),
]:
if not toolchain:
continue
print("toolchain = %s" % toolchain)
fg[toolchain + ":headers"] = {
"type": "glob",
# TODO: Avoid using "*" to include only required files.
"includes": ["*"],
}
fg[path.join(toolchain, "bin") + ":llddeps"] = {
"type": "glob",
"includes": [
"*lld*",
"*clang*",
"llvm-nm*",
"llvm-readelf*",
"llvm-readobj*",
],
}
fg[path.join(toolchain, "usr/bin") + ":llddeps"] = {
"type": "glob",
"includes": [
"*lld*",
"*clang*",
"sysroot_wrapper*",
"llvm-nm*",
"llvm-readelf*",
"llvm-readobj*",
],
}
fg[path.join(toolchain, "lib") + ":libs"] = {
"type": "glob",
"includes": ["*.so", "*.so.*", "*.a", "*.o"],
}
fg[path.join(toolchain, "lib64") + ":libs"] = {
"type": "glob",
"includes": ["*.so", "*.so.*", "*.a", "*.o"],
}
fg[path.join(toolchain, "usr/lib64") + ":libs"] = {
"type": "glob",
"includes": ["*.so", "*.so.*", "*.a", "*.o", "cfi_ignorelist.txt"],
}
fg[path.join(toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs"] = {
"type": "glob",
"includes": ["*.so", "*.so.*", "*.a", "*.o"],
}
fg[path.join(toolchain, "usr/bin") + ":clang"] = {
"type": "glob",
"includes": [
"*clang*",
"sysroot_wrapper.hardened.ccache*",
],
}
for sysroot in [
cros_args.get("target_sysroot"),
cros_args.get("cros_nacl_helper_arm32_sysroot"),
]:
if not sysroot:
continue
print("sysroot = %s" % sysroot)
fg[path.join(sysroot, "usr/include") + ":include"] = {
"type": "glob",
"includes": ["*"],
# needs bits/stab.def, c++/*
}
fg[path.join(sysroot, "usr/lib") + ":headers"] = {
"type": "glob",
"includes": ["*.h", "crtbegin.o"],
}
fg[path.join(sysroot, "usr/lib64") + ":headers"] = {
"type": "glob",
"includes": ["*.h"],
}
fg[sysroot + ":libs"] = {
"type": "glob",
"includes": ["*.so", "*.so.*", "*.a", "*.o"],
}
print(fg)
return fg
def __step_config(ctx, step_config):
cros_args = __cros_gn_args(ctx)
toolchain = cros_args.get("cros_toolchain")
cros_nacl_helper_arm32_toolchain = cros_args.get("cros_nacl_helper_arm32_toolchain")
cros_nacl_helper_arm32_sysroot = cros_args.get("cros_nacl_helper_arm32_sysroot")
sysroot = cros_args.get("target_sysroot")
if not (toolchain and sysroot):
return step_config
cros_target_cxx = cros_args.get("cros_target_cxx")
if cros_target_cxx:
step_config["rules"].extend([
{
"name": "clang-cros/cxx",
"action": "(.*_)?cxx",
"command_prefix": path.join("../../", cros_target_cxx),
"remote": True,
# fast-deps is not safe with cros toolchain. crbug.com/391160876
"no_fast_deps": True,
"canonicalize_dir": True,
"timeout": "5m",
},
])
cros_target_cc = cros_args.get("cros_target_cc")
if cros_target_cxx:
step_config["rules"].extend([
{
"name": "clang-cros/cc",
"action": "(.*_)?cc",
"command_prefix": path.join("../../", cros_target_cc),
"remote": True,
# fast-deps is not safe with cros toolchain. crbug.com/391160876
"no_fast_deps": True,
"canonicalize_dir": True,
"timeout": "5m",
},
])
cros_target_ar = cros_args.get("cros_target_ar")
if cros_target_ar:
step_config["rules"].extend([
{
"name": "clang-cros/alink/llvm-ar",
# Other alink steps should use clang/alink/llvm-ar rule or a
# nacl rule.
"action": "(target_with_system_allocator_)?alink",
"inputs": [
cros_target_ar,
],
"exclude_input_patterns": [
"*.cc",
"*.h",
"*.js",
"*.pak",
"*.py",
],
"handler": "lld_thin_archive",
"remote": config.get(ctx, "remote-link"),
"canonicalize_dir": True,
"timeout": "5m",
"platform_ref": "large",
"accumulate": True,
},
])
step_config["input_deps"].update({
cros_target_ar: [
path.join(toolchain, "bin/llvm-ar.elf"),
path.join(toolchain, "lib") + ":libs",
path.join(toolchain, "usr/lib64") + ":libs",
],
})
cros_nacl_helper_arm32_cxx = cros_args.get("cros_nacl_helper_arm32_cxx")
if cros_nacl_helper_arm32_cxx:
step_config["rules"].extend([
{
"name": "clang-cros/nacl_helper_arm32_cxx",
"action": "nacl_helper_arm32_cxx",
"command_prefix": path.join("../../", cros_nacl_helper_arm32_cxx),
"remote": True,
"canonicalize_dir": True,
"timeout": "5m",
},
])
cros_nacl_helper_arm32_cc = cros_args.get("cros_nacl_helper_arm32_cc")
if cros_nacl_helper_arm32_cxx:
step_config["rules"].extend([
{
"name": "clang-cros/nacl_helper_arm32_cc",
"action": "nacl_helper_arm32_cc",
"command_prefix": path.join("../../", cros_nacl_helper_arm32_cc),
"remote": True,
"canonicalize_dir": True,
"timeout": "5m",
},
])
cros_nacl_helper_arm32_ar = cros_args.get("cros_nacl_helper_arm32_ar")
if cros_nacl_helper_arm32_ar:
step_config["rules"].extend([
{
"name": "clang-cros/alink/nacl_helper_arm32_llvm-ar",
# Other alink steps should use clang/alink/llvm-ar rule or a
# nacl rule.
"action": "nacl_helper_arm32_alink",
"inputs": [
cros_nacl_helper_arm32_ar,
],
"exclude_input_patterns": [
"*.cc",
"*.h",
"*.js",
"*.pak",
"*.py",
],
"handler": "lld_thin_archive",
"remote": config.get(ctx, "remote-link"),
"canonicalize_dir": True,
"timeout": "5m",
"platform_ref": "large",
"accumulate": True,
},
])
step_config["input_deps"].update({
cros_nacl_helper_arm32_ar: [
path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"),
path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs",
path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs",
],
})
step_config["rules"].extend([
{
"name": "clang-cros/solink/gcc_solink_wrapper",
"action": "(target_with_system_allocator_)?solink",
"command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"",
"inputs": [
"build/toolchain/gcc_solink_wrapper.py",
path.join(toolchain, "bin/ld.lld"),
],
"exclude_input_patterns": [
"*.cc",
"*.h",
"*.js",
"*.pak",
"*.py",
],
"remote": config.get(ctx, "remote-link"),
# TODO: Do not use absolute paths for custom toolchain/sysroot GN
# args.
"input_root_absolute_path": True,
"platform_ref": "large",
"timeout": "2m",
},
{
"name": "clang-cros/link/gcc_link_wrapper",
"action": "(target_with_system_allocator_)?link",
"command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"",
"handler": "clang_link",
"inputs": [
"build/toolchain/gcc_link_wrapper.py",
path.join(toolchain, "bin/ld.lld"),
],
"exclude_input_patterns": [
"*.cc",
"*.h",
"*.js",
"*.pak",
"*.py",
],
"remote": config.get(ctx, "remote-link"),
"canonicalize_dir": True,
"platform_ref": "large",
"timeout": "10m",
},
])
step_config["input_deps"].update({
sysroot + ":headers": [
path.join(sysroot, "usr/include") + ":include",
path.join(sysroot, "usr/lib") + ":headers",
path.join(sysroot, "usr/lib64") + ":headers",
],
path.join(toolchain, "bin/llvm-ar"): [
path.join(toolchain, "bin/llvm-ar.elf"),
path.join(toolchain, "lib") + ":libs",
path.join(toolchain, "usr/lib64") + ":libs",
],
path.join(toolchain, "bin/ld.lld"): [
path.join(toolchain, "bin:llddeps"),
path.join(toolchain, "lib") + ":libs",
path.join(toolchain, "lib64") + ":libs",
path.join(toolchain, "usr/bin:clang"),
path.join(toolchain, "usr/lib64") + ":libs",
sysroot + ":libs",
],
toolchain + ":link": [
path.join(toolchain, "bin") + ":llddeps",
path.join(toolchain, "lib") + ":libs",
path.join(toolchain, "lib64") + ":libs",
path.join(toolchain, "usr/bin") + ":llddeps",
path.join(toolchain, "usr/lib64") + ":libs",
],
sysroot + ":link": [
sysroot + ":libs",
],
})
if cros_nacl_helper_arm32_toolchain and cros_nacl_helper_arm32_sysroot:
step_config["rules"].extend([
{
"name": "clang-cros/nacl_helper_arm32_solink/gcc_solink_wrapper",
"action": "nacl_helper_arm32_solink",
"command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"",
"inputs": [
"build/toolchain/gcc_solink_wrapper.py",
path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"),
],
"exclude_input_patterns": [
"*.cc",
"*.h",
"*.js",
"*.pak",
"*.py",
],
"remote": config.get(ctx, "remote-link"),
# TODO: Do not use absolute paths for custom toolchain/sysroot GN
# args.
"input_root_absolute_path": True,
"platform_ref": "large",
"timeout": "2m",
},
{
"name": "clang-cros/nacl_helper_arm32_link/gcc_link_wrapper",
"action": "nacl_helper_arm32_link",
"command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"",
"handler": "clang_link",
"inputs": [
"build/toolchain/gcc_link_wrapper.py",
path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"),
],
"exclude_input_patterns": [
"*.cc",
"*.h",
"*.js",
"*.pak",
"*.py",
],
"remote": config.get(ctx, "remote-link"),
"canonicalize_dir": True,
"platform_ref": "large",
"timeout": "10m",
},
])
step_config["input_deps"].update({
cros_nacl_helper_arm32_sysroot + ":headers": [
path.join(cros_nacl_helper_arm32_sysroot, "usr/include") + ":include",
path.join(cros_nacl_helper_arm32_sysroot, "usr/lib") + ":headers",
path.join(cros_nacl_helper_arm32_sysroot, "usr/lib64") + ":headers",
],
path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar"): [
path.join(cros_nacl_helper_arm32_toolchain, "bin/llvm-ar.elf"),
path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs",
path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs",
],
path.join(cros_nacl_helper_arm32_toolchain, "bin/ld.lld"): [
path.join(cros_nacl_helper_arm32_toolchain, "bin:llddeps"),
path.join(cros_nacl_helper_arm32_toolchain, "lib") + ":libs",
path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs",
path.join(cros_nacl_helper_arm32_toolchain, "usr/bin:clang"),
path.join(cros_nacl_helper_arm32_toolchain, "usr/lib64") + ":libs",
path.join(cros_nacl_helper_arm32_toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs",
path.join(cros_nacl_helper_arm32_toolchain, "lib64") + ":libs",
cros_nacl_helper_arm32_sysroot + ":libs",
],
})
return step_config
cros = module(
"cros",
filegroups = __filegroups,
handlers = {},
step_config = __step_config,
)