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 clang/linux.""" 6 7load("@builtin//path.star", "path") 8load("@builtin//struct.star", "module") 9load("./android.star", "android") 10load("./clang_all.star", "clang_all") 11load("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper") 12load("./config.star", "config") 13load("./cros.star", "cros") 14load("./gn_logs.star", "gn_logs") 15 16# TODO: b/323091468 - Propagate target android ABI and android SDK version 17# from GN, and remove the hardcoded filegroups. 18android_archs = [ 19 "aarch64-linux-android", 20 "arm-linux-androideabi", 21 "i686-linux-android", 22 "riscv64-linux-android", 23 "x86_64-linux-android", 24] 25 26android_versions = list(range(21, 35)) 27 28def __filegroups(ctx): 29 fg = { 30 # for precomputed subtrees 31 "build/linux/debian_bullseye_amd64-sysroot/usr/include:include": { 32 "type": "glob", 33 "includes": ["*"], 34 # need bits/stab.def, c++/* 35 }, 36 "build/linux/debian_bullseye_amd64-sysroot/usr/lib:headers": { 37 "type": "glob", 38 "includes": ["*.h", "crtbegin.o"], 39 }, 40 "build/linux/debian_bullseye_i386-sysroot/usr/include:include": { 41 "type": "glob", 42 "includes": ["*"], 43 # need bits/stab.def, c++/* 44 }, 45 "build/linux/debian_bullseye_i386-sysroot/usr/lib:headers": { 46 "type": "glob", 47 "includes": ["*.h", "crtbegin.o"], 48 }, 49 "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include": { 50 "type": "glob", 51 "includes": ["*"], 52 # can't use "*.h", because c++ headers have no extension. 53 }, 54 "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include:include": { 55 "type": "glob", 56 "includes": ["*"], 57 }, 58 "third_party/llvm-build/Release+Asserts/lib/clang:libs": { 59 "type": "glob", 60 "includes": ["*/lib/*/*", "*/lib/*", "*/share/*"], 61 }, 62 "build/linux/debian_bullseye_amd64-sysroot/lib/x86_64-linux-gnu:libso": { 63 "type": "glob", 64 "includes": ["*.so*"], 65 }, 66 "build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu:libs": { 67 "type": "glob", 68 "includes": ["*.o", "*.so*", "lib*.a"], 69 }, 70 "build/linux/debian_bullseye_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu:libgcc": { 71 "type": "glob", 72 "includes": ["*.o", "*.a", "*.so"], 73 }, 74 } 75 if android.enabled(ctx): 76 for arch in android_archs: 77 for ver in android_versions: 78 group = "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/%s/%d:link" % (arch, ver) 79 fg[group] = { 80 "type": "glob", 81 "includes": ["*"], 82 } 83 84 fg.update(clang_all.filegroups(ctx)) 85 return fg 86 87def __clang_compile_coverage(ctx, cmd): 88 clang_command = clang_code_coverage_wrapper.run(ctx, list(cmd.args)) 89 ctx.actions.fix(args = clang_command) 90 91__handlers = { 92 "clang_compile_coverage": __clang_compile_coverage, 93} 94 95def __step_config(ctx, step_config): 96 step_config["input_deps"].update({ 97 # sysroot headers for precomputed subtrees 98 "build/linux/debian_bullseye_amd64-sysroot:headers": [ 99 "build/linux/debian_bullseye_amd64-sysroot/usr/include:include", 100 "build/linux/debian_bullseye_amd64-sysroot/usr/lib:headers", 101 ], 102 "build/linux/debian_bullseye_i386-sysroot:headers": [ 103 "build/linux/debian_bullseye_i386-sysroot/usr/include:include", 104 "build/linux/debian_bullseye_i386-sysroot/usr/lib:headers", 105 ], 106 "build/linux/debian_bullseye_amd64-sysroot:link": [ 107 "build/linux/debian_bullseye_amd64-sysroot/lib/x86_64-linux-gnu:libso", 108 "build/linux/debian_bullseye_amd64-sysroot/lib64/ld-linux-x86-64.so.2", 109 "build/linux/debian_bullseye_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu:libgcc", 110 "build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu:libs", 111 "third_party/llvm-build/Release+Asserts/bin/clang", 112 "third_party/llvm-build/Release+Asserts/bin/clang++", 113 "third_party/llvm-build/Release+Asserts/bin/ld.lld", 114 "third_party/llvm-build/Release+Asserts/bin/lld", 115 "third_party/llvm-build/Release+Asserts/bin/llvm-nm", 116 "third_party/llvm-build/Release+Asserts/bin/llvm-readelf", 117 "third_party/llvm-build/Release+Asserts/bin/llvm-readobj", 118 # The following inputs are used for sanitizer builds. 119 # It might be better to add them only for sanitizer builds if there is a performance issue. 120 "third_party/llvm-build/Release+Asserts/lib/clang:libs", 121 ], 122 "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot:headers": [ 123 "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include", 124 "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include:include", 125 ], 126 }) 127 step_config["input_deps"].update(clang_all.input_deps) 128 129 input_root_absolute_path = gn_logs.read(ctx).get("clang_need_input_root_absolute_path") == "true" 130 canonicalize_dir = not input_root_absolute_path 131 132 step_config["rules"].extend([ 133 { 134 "name": "clang/cxx", 135 "action": "(.*_)?cxx", 136 "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++ ", 137 "inputs": [ 138 "third_party/llvm-build/Release+Asserts/bin/clang++", 139 ], 140 "exclude_input_patterns": ["*.stamp"], 141 "remote": True, 142 "input_root_absolute_path": input_root_absolute_path, 143 "canonicalize_dir": canonicalize_dir, 144 "timeout": "2m", 145 }, 146 { 147 "name": "clang/cc", 148 "action": "(.*_)?cc", 149 "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang ", 150 "inputs": [ 151 "third_party/llvm-build/Release+Asserts/bin/clang", 152 ], 153 "exclude_input_patterns": ["*.stamp"], 154 "remote": True, 155 "input_root_absolute_path": input_root_absolute_path, 156 "canonicalize_dir": canonicalize_dir, 157 "timeout": "2m", 158 }, 159 { 160 "name": "clang/asm", 161 "action": "(.*_)?asm", 162 "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang", 163 "inputs": [ 164 "third_party/llvm-build/Release+Asserts/bin/clang", 165 ], 166 "remote": config.get(ctx, "cog"), 167 "input_root_absolute_path": input_root_absolute_path, 168 "canonicalize_dir": canonicalize_dir, 169 "timeout": "2m", 170 }, 171 { 172 "name": "clang-coverage/cxx", 173 "action": "(.*_)?cxx", 174 "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py", 175 "inputs": [ 176 "third_party/llvm-build/Release+Asserts/bin/clang++", 177 ], 178 "exclude_input_patterns": ["*.stamp"], 179 "handler": "clang_compile_coverage", 180 "remote": True, 181 "input_root_absolute_path": input_root_absolute_path, 182 "canonicalize_dir": canonicalize_dir, 183 "timeout": "2m", 184 }, 185 { 186 "name": "clang-coverage/cc", 187 "action": "(.*_)?cc", 188 "command_prefix": "\"python3\" ../../build/toolchain/clang_code_coverage_wrapper.py", 189 "inputs": [ 190 "third_party/llvm-build/Release+Asserts/bin/clang", 191 ], 192 "exclude_input_patterns": ["*.stamp"], 193 "handler": "clang_compile_coverage", 194 "remote": True, 195 "input_root_absolute_path": input_root_absolute_path, 196 "canonicalize_dir": canonicalize_dir, 197 "timeout": "2m", 198 }, 199 ]) 200 201 # TODO: b/316267242 - Enable remote links for Android and CrOS toolchain builds. 202 if not android.enabled(ctx) and not (cros.custom_toolchain(ctx) or cros.custom_sysroot(ctx)): 203 step_config["rules"].extend([ 204 { 205 "name": "clang/alink/llvm-ar", 206 "action": "(.*_)?alink", 207 "inputs": [ 208 # TODO: b/316267242 - Add inputs to GN config. 209 "third_party/llvm-build/Release+Asserts/bin/llvm-ar", 210 ], 211 "exclude_input_patterns": [ 212 "*.cc", 213 "*.h", 214 "*.js", 215 "*.pak", 216 "*.py", 217 "*.stamp", 218 ], 219 "remote": config.get(ctx, "remote-library-link"), 220 "canonicalize_dir": True, 221 "timeout": "2m", 222 "platform_ref": "large", 223 "accumulate": True, 224 }, 225 { 226 "name": "clang/solink/gcc_solink_wrapper", 227 "action": "(.*_)?solink", 228 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"", 229 "inputs": [ 230 # TODO: b/316267242 - Add inputs to GN config. 231 "build/toolchain/gcc_solink_wrapper.py", 232 "build/toolchain/whole_archive.py", 233 "build/toolchain/wrapper_utils.py", 234 "build/linux/debian_bullseye_amd64-sysroot:link", 235 ], 236 "exclude_input_patterns": [ 237 "*.cc", 238 "*.h", 239 "*.js", 240 "*.pak", 241 "*.py", 242 "*.stamp", 243 ], 244 "remote": config.get(ctx, "remote-library-link"), 245 "canonicalize_dir": True, 246 "platform_ref": "large", 247 "timeout": "2m", 248 }, 249 { 250 "name": "clang/link/gcc_link_wrapper", 251 "action": "(.*_)?link", 252 "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"", 253 "inputs": [ 254 # TODO: b/316267242 - Add inputs to GN config. 255 "build/toolchain/gcc_link_wrapper.py", 256 "build/toolchain/whole_archive.py", 257 "build/toolchain/wrapper_utils.py", 258 "build/linux/debian_bullseye_amd64-sysroot:link", 259 ], 260 "exclude_input_patterns": [ 261 "*.cc", 262 "*.h", 263 "*.js", 264 "*.pak", 265 "*.py", 266 "*.stamp", 267 ], 268 "remote": config.get(ctx, "remote-exec-link"), 269 "canonicalize_dir": True, 270 "platform_ref": "large", 271 "timeout": "10m", 272 }, 273 ]) 274 return step_config 275 276clang = module( 277 "clang", 278 step_config = __step_config, 279 filegroups = __filegroups, 280 handlers = __handlers, 281) 282