# -*- 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 linux."""

load("@builtin//struct.star", "module")
load("./android.star", "android")
load("./clang_linux.star", "clang")
load("./config.star", "config")
load("./cros.star", "cros")
load("./devtools_frontend.star", "devtools_frontend")
load("./nacl_linux.star", "nacl")
load("./nasm_linux.star", "nasm")
load("./proto_linux.star", "proto")
load("./reproxy.star", "reproxy")
load("./typescript_unix.star", "typescript")
load("./v8.star", "v8")

def __filegroups(ctx):
    fg = {}
    fg.update(android.filegroups(ctx))
    fg.update(clang.filegroups(ctx))
    fg.update(cros.filegroups(ctx))
    fg.update(devtools_frontend.filegroups(ctx))
    fg.update(nacl.filegroups(ctx))
    fg.update(nasm.filegroups(ctx))
    fg.update(proto.filegroups(ctx))
    fg.update(typescript.filegroups(ctx))
    fg["third_party/perfetto/python:python"] = {
        "type": "glob",
        "includes": ["*.py"],
    }
    fg["third_party/perfetto/src/trace_processor:trace_processor"] = {
        "type": "glob",
        "includes": ["*.py"],
    }
    return fg

__handlers = {}
__handlers.update(android.handlers)
__handlers.update(clang.handlers)
__handlers.update(cros.handlers)
__handlers.update(devtools_frontend.handlers)
__handlers.update(nacl.handlers)
__handlers.update(nasm.handlers)
__handlers.update(proto.handlers)
__handlers.update(typescript.handlers)

def __step_config(ctx, step_config):
    config.check(ctx)

    if android.enabled(ctx):
        step_config = android.step_config(ctx, step_config)

    # nacl and cros rules should be added before clang rules for link action.
    step_config = nacl.step_config(ctx, step_config)

    # cros rules are necessary only for the Siso's builtin RBE client mode.
    if not reproxy.enabled(ctx):
        step_config = cros.step_config(ctx, step_config)

    step_config = clang.step_config(ctx, step_config)
    step_config = devtools_frontend.step_config(ctx, step_config)
    step_config = nasm.step_config(ctx, step_config)
    step_config = proto.step_config(ctx, step_config)
    step_config = typescript.step_config(ctx, step_config)
    step_config = v8.step_config(ctx, step_config)

    step_config["rules"].extend([
        {
            "name": "write_buildflag_header",
            "command_prefix": "python3 ../../build/write_buildflag_header.py",
            "remote": config.get(ctx, "cog"),
            "canonicalize_dir": True,
            "timeout": "2m",
        },
        {
            "name": "write_build_date_header",
            "command_prefix": "python3 ../../base/write_build_date_header.py",
            "remote": config.get(ctx, "cog"),
            "canonicalize_dir": True,
            "timeout": "2m",
        },
        {
            "name": "version_py",
            "command_prefix": "python3 ../../build/util/version.py",
            "remote": config.get(ctx, "cog"),
            "canonicalize_dir": True,
            "timeout": "2m",
        },
        {
            "name": "perfetto/touch_file",
            "command_prefix": "python3 ../../third_party/perfetto/tools/touch_file.py",
            "remote": config.get(ctx, "cog"),
            "replace": True,
            "canonicalize_dir": True,
            "timeout": "2m",
        },
        {
            "name": "perfetto/write_buildflag_header",
            "command_prefix": "python3 ../../third_party/perfetto/gn/write_buildflag_header.py",
            "remote": config.get(ctx, "cog"),
            "canonicalize_dir": True,
            "timeout": "2m",
        },
        {
            "name": "perfetto/gen_tp_table_headers",
            "command_prefix": "python3 ../../third_party/perfetto/tools/gen_tp_table_headers.py",
            "inputs": [
                "third_party/perfetto/python:python",
                "third_party/perfetto/src/trace_processor:trace_processor",
            ],
            "remote": config.get(ctx, "cog"),
            "canonicalize_dir": True,
            "timeout": "2m",
        },
        {
            "name": "perfetto/gen_cc_proto_descriptor",
            "command_prefix": "python3 ../../third_party/perfetto/tools/gen_cc_proto_descriptor.py",
            "remote": config.get(ctx, "cog"),
            "canonicalize_dir": True,
            "timeout": "2m",
        },
        {
            # b/331716896: local fails due to link(2) error.
            "name": "generate_fontconfig_cache",
            "command_prefix": "python3 ../../build/gn_run_binary.py generate_fontconfig_caches",
            "remote": config.get(ctx, "cog"),
            "canonicalize_dir": True,
            "timeout": "2m",
        },
    ])

    return step_config

chromium = module(
    "chromium",
    step_config = __step_config,
    filegroups = __filegroups,
    handlers = __handlers,
)
