# -*- bazel-starlark -*- # Copyright 2024 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 clang/unix.""" load("@builtin//path.star", "path") load("@builtin//struct.star", "module") load("./android.star", "android") load("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper") load("./config.star", "config") load("./gn_logs.star", "gn_logs") load("./win_sdk.star", "win_sdk") def __clang_compile_coverage(ctx, cmd): clang_command = clang_code_coverage_wrapper.run(ctx, list(cmd.args)) ctx.actions.fix(args = clang_command) def __clang_link(ctx, cmd): if not config.get(ctx, "remote-link"): return inputs = [] sysroot = "" target = "" args = cmd.args if args[0] == "/bin/sh": args = args[2].split(" ") for i, arg in enumerate(args): if i == 0 and not "python3" in arg: clang_base = ctx.fs.canonpath(path.dir(path.dir(arg))) inputs.append(clang_base + ":link") continue if i == 1: driver = ctx.fs.canonpath(arg) # driver script if ctx.fs.exists(driver): inputs.append(driver + ":link") continue if arg.startswith("--sysroot="): sysroot = arg.removeprefix("--sysroot=") sysroot = ctx.fs.canonpath(sysroot) inputs.append(sysroot + ":link") elif arg == "-isysroot": sysroot = ctx.fs.canonpath(args[i + 1]) inputs.append(sysroot + ":link") elif arg.startswith("--target="): target = arg.removeprefix("--target=") elif arg.startswith("-L"): lib_path = ctx.fs.canonpath(arg.removeprefix("-L")) inputs.append(lib_path + ":link") elif arg.startswith("-Wl,-exported_symbols_list,"): export_path = ctx.fs.canonpath(arg.removeprefix("-Wl,-exported_symbols_list,")) inputs.append(export_path) elif arg == "-sectcreate": # -sectcreate inputs.append(ctx.fs.canonpath(args[i + 3])) elif arg.startswith("-Wcrl,"): crls = arg.removeprefix("-Wcrl,").split(",") if len(crls) == 2: crl = ctx.fs.canonpath(crls[1]) if ctx.fs.exists(crl): inputs.append(crl + ":link") elif arg == "--": clang_base = ctx.fs.canonpath(path.dir(path.dir(cmd.args[i + 1]))) inputs.append(clang_base + ":link") for arch in android.archs: if target.startswith(arch): android_ver = target.removeprefix(arch) inputs.extend([ sysroot + "/usr/lib/" + arch + "/" + android_ver + ":link", ]) break ctx.actions.fix(inputs = cmd.inputs + inputs) __handlers = { "clang_compile_coverage": __clang_compile_coverage, "clang_link": __clang_link, } def __rules(ctx): gn_logs_data = gn_logs.read(ctx) input_root_absolute_path = gn_logs_data.get("clang_need_input_root_absolute_path") == "true" input_root_absolute_path_for_objc = gn_logs_data.get("clang_need_input_root_absolute_path_for_objc") == "true" canonicalize_dir = not input_root_absolute_path canonicalize_dir_for_objc = not input_root_absolute_path_for_objc rules = [] if win_sdk.enabled(ctx): rules.extend([ { "name": "clang-cl/cxx", "action": "(.*_)?cxx", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang-cl ", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang-cl", ], "exclude_input_patterns": ["*.stamp"], "remote": True, "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "clang-cl/cc", "action": "(.*_)?cc", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang-cl ", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang-cl", ], "exclude_input_patterns": ["*.stamp"], "remote": True, "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "lld-link/alink", "action": "(.*_)?alink", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/lld-link /lib", "handler": "lld_thin_archive", "remote": False, "accumulate": True, }, { "name": "lld-link/solink", "action": "(.*_)?solink", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/lld-link", "handler": "lld_link", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/lld-link", win_sdk.toolchain_dir(ctx) + ":libs", ], "exclude_input_patterns": [ "*.cc", "*.h", "*.js", "*.pak", "*.py", ], "remote": config.get(ctx, "remote-link"), "platform_ref": "large", "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "lld-link/solink_module", "action": "(.*_)?solink_module", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/lld-link", "handler": "lld_link", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/lld-link", win_sdk.toolchain_dir(ctx) + ":libs", ], "exclude_input_patterns": [ "*.cc", "*.h", "*.js", "*.pak", "*.py", ], "remote": config.get(ctx, "remote-link"), "platform_ref": "large", "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "lld-link/link", "action": "(.*_)?link", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/lld-link", "handler": "lld_link", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/lld-link", win_sdk.toolchain_dir(ctx) + ":libs", ], "exclude_input_patterns": [ "*.cc", "*.h", "*.js", "*.pak", "*.py", ], "remote": config.get(ctx, "remote-link"), "platform_ref": "large", "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, ]) rules.extend([ { "name": "clang/cxx", "action": "(.*_)?cxx", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++ ", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], "exclude_input_patterns": ["*.stamp"], "remote": True, "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "clang/cxx_module", "action": "(.*_)?cxx_module", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++ ", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], "exclude_input_patterns": ["*.stamp"], "remote": True, "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "clang/cc", "action": "(.*_)?cc", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang ", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], "exclude_input_patterns": ["*.stamp"], "remote": True, "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "clang/objcxx", "action": "(.*_)?objcxx", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], "exclude_input_patterns": ["*.stamp"], "remote": True, "timeout": "2m", "input_root_absolute_path": input_root_absolute_path_for_objc, "canonicalize_dir": canonicalize_dir_for_objc, }, { "name": "clang/objc", "action": "(.*_)?objc", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], "exclude_input_patterns": ["*.stamp"], "remote": True, "timeout": "2m", "input_root_absolute_path": input_root_absolute_path_for_objc, "canonicalize_dir": canonicalize_dir_for_objc, }, { "name": "clang/asm", "action": "(.*_)?asm", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], "remote": config.get(ctx, "cog"), "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "clang-coverage/cxx", "action": "(.*_)?cxx", "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "remote": True, "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "clang-coverage/cc", "action": "(.*_)?cc", "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "remote": True, "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, "timeout": "2m", }, { "name": "clang-coverage/objcxx", "action": "(.*_)?objcxx", "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "remote": True, "timeout": "2m", "input_root_absolute_path": input_root_absolute_path_for_objc, "canonicalize_dir": canonicalize_dir_for_objc, }, { "name": "clang-coverage/objc", "action": "(.*_)?objc", "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py", "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "remote": True, "timeout": "2m", "input_root_absolute_path": input_root_absolute_path_for_objc, "canonicalize_dir": canonicalize_dir_for_objc, }, { "name": "clang/alink/llvm-ar", "action": "(.*_)?alink", "inputs": [ # TODO: crbug.com/316267242 - Add inputs to GN config. "third_party/llvm-build/Release+Asserts/bin/llvm-ar", ], "exclude_input_patterns": [ "*.cc", "*.h", "*.js", "*.pak", "*.py", "*.stamp", ], "handler": "lld_thin_archive", "remote": config.get(ctx, "remote-link"), "canonicalize_dir": True, "timeout": "2m", "platform_ref": "large", "accumulate": True, }, { "name": "clang/solink", "action": "(.*_)?solink", "handler": "clang_link", "exclude_input_patterns": [ "*.cc", "*.h", "*.js", "*.pak", "*.py", "*.stamp", ], "remote": config.get(ctx, "remote-link"), "restat_content": True, "canonicalize_dir": True, "platform_ref": "large", "timeout": "4m", }, { "name": "clang/solink_module", "action": "(.*)?solink_module", "handler": "clang_link", "exclude_input_patterns": [ "*.cc", "*.h", "*.js", "*.pak", "*.py", "*.stamp", ], "remote": config.get(ctx, "remote-link"), "canonicalize_dir": True, "platform_ref": "large", "timeout": "4m", }, { "name": "clang/link", "action": "(.*_)?link", "handler": "clang_link", "exclude_input_patterns": [ "*.cc", "*.h", "*.js", "*.pak", "*.py", "*.stamp", ], "remote": config.get(ctx, "remote-link"), "canonicalize_dir": True, "platform_ref": "large", "timeout": "10m", }, ]) return rules clang_unix = module( "clang_unix", handlers = __handlers, rules = __rules, )