1# NOTE: THIS FILE IS EXPERIMENTAL FOR THE BAZEL MIGRATION AND NOT USED FOR 2# YOUR BUILDS CURRENTLY. 3# 4# It is not yet the source of truth for your build. If you're looking to modify 5# the build file, modify the Android.bp file instead. Do *not* modify this file 6# unless you have coordinated with the team managing the Soong to Bazel 7# migration. 8 9""" 10Toolchain config 11""" 12 13load("@bazel_skylib//rules:common_settings.bzl", "string_flag") 14load("@env//:env.bzl", "env") 15load( 16 "//build/bazel/toolchains/clang/host/linux-x86:cc_toolchain_config.bzl", 17 "CLANG_TOOLS", 18 "android_cc_toolchain", 19 "clang_tool_output_group", 20 "clang_version_info", 21 "expand_feature_flags", 22 "toolchain_definition", 23) 24load( 25 "//build/bazel/toolchains/clang/host/linux-x86:cc_toolchain_constants.bzl", 26 "arch_to_variants", 27 "arches", 28 "device_compatibility_flags_non_darwin", 29 "device_compatibility_flags_non_windows", 30 "generated_config_constants", 31 "libclang_rt_prebuilt_map", 32 "libclang_ubsan_minimal_rt_prebuilt_map", 33 "variant_name", 34 "x86_64_host_toolchains", 35 "x86_64_musl_host_toolchains", 36 "x86_host_toolchains", 37 "x86_musl_host_toolchains", 38 _bionic_crt = "bionic_crt", 39 _musl_crt = "musl_crt", 40) 41load("//build/bazel/platforms/arch/variants:constants.bzl", _arch_constants = "constants") 42 43filegroup(name = "empty") 44 45# Different clang versions are configured here. 46clang_version_info( 47 name = "clang", 48 clang_files = glob(["**/*"]), 49 clang_short_version = ":clang_short_version", 50 clang_version = ":clang_version", 51) 52 53# x86_64 toolchain definitions 54[ 55 android_cc_toolchain( 56 name = "cc_toolchain_x86_64" + variant_name(variant), 57 clang_version = ":clang", 58 compiler_flags = generated_config_constants.X86_64ToolchainCflags + 59 generated_config_constants.X86_64ArchVariantCflags[variant.arch_variant] + 60 expand_feature_flags( 61 variant.arch_variant, 62 _arch_constants.AndroidArchToVariantToFeatures[arches.X86_64], 63 generated_config_constants.X86_64ArchFeatureCflags, 64 ) + generated_config_constants.X86_64Cflags, 65 crt = _bionic_crt, 66 libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_x86_64"], 67 libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_x86_64"], 68 linker_flags = generated_config_constants.X86_64ToolchainLdflags + generated_config_constants.X86_64Lldflags, 69 target_arch = arches.X86_64, 70 target_os = "android", 71 toolchain_identifier = "x86_64-toolchain", 72 ) 73 for variant in arch_to_variants[arches.X86_64] 74] 75 76# x86 toolchain definitions. 77[ 78 android_cc_toolchain( 79 name = "cc_toolchain_x86" + variant_name(variant), 80 clang_version = ":clang", 81 compiler_flags = generated_config_constants.X86ToolchainCflags + 82 generated_config_constants.X86ArchVariantCflags[variant.arch_variant] + 83 expand_feature_flags( 84 variant.arch_variant, 85 _arch_constants.AndroidArchToVariantToFeatures[arches.X86], 86 generated_config_constants.X86ArchFeatureCflags, 87 ) + generated_config_constants.X86Cflags, 88 crt = _bionic_crt, 89 libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_x86"], 90 libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_x86"], 91 linker_flags = generated_config_constants.X86ToolchainLdflags + generated_config_constants.X86Lldflags, 92 target_arch = arches.X86, 93 target_os = "android", 94 toolchain_identifier = "x86-toolchain", 95 ) 96 for variant in arch_to_variants[arches.X86] 97] 98 99# arm64 toolchain definitions. 100[ 101 android_cc_toolchain( 102 name = "cc_toolchain_arm64" + variant_name(variant), 103 clang_version = ":clang", 104 compiler_flags = generated_config_constants.Arm64Cflags + 105 generated_config_constants.Arm64ArchVariantCflags[variant.arch_variant] + 106 generated_config_constants.Arm64CpuVariantCflags.get( 107 variant.cpu_variant, 108 [], 109 ), 110 crt = _bionic_crt, 111 libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_arm64"], 112 libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_arm64"], 113 linker_flags = generated_config_constants.Arm64CpuVariantLdflags.get( 114 variant.cpu_variant, 115 [], 116 ) + generated_config_constants.Arm64Lldflags, 117 target_arch = arches.Arm64, 118 target_os = "android", 119 toolchain_identifier = "arm64-toolchain", 120 ) 121 for variant in arch_to_variants[arches.Arm64] 122] 123 124# arm32 toolchain definitions. 125[ 126 android_cc_toolchain( 127 name = "cc_toolchain_arm" + variant_name(variant), 128 clang_version = ":clang", 129 compiler_flags = generated_config_constants.ArmCflags + 130 generated_config_constants.ArmToolchainCflags + 131 generated_config_constants.ArmArchVariantCflags[variant.arch_variant] + 132 generated_config_constants.ArmCpuVariantCflags.get( 133 variant.cpu_variant, 134 [], 135 ), 136 crt = _bionic_crt, 137 libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_arm"], 138 libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_arm"], 139 # do not pass "ld"-only flags as Bazel is only using lld. Ensure that all flags are lld-compatible. 140 linker_flags = generated_config_constants.ArmLldflags, 141 target_arch = arches.Arm, 142 target_os = "android", 143 toolchain_identifier = "arm-toolchain", 144 ) 145 for variant in arch_to_variants[arches.Arm] 146] 147 148# Toolchain to compile for the linux host. 149# TODO(b/186628704): automatically generate from Soong. 150android_cc_toolchain( 151 name = "cc_toolchain_x86_64_linux_host", 152 clang_version = ":clang", 153 compiler_flags = generated_config_constants.LinuxCflags + 154 generated_config_constants.LinuxGlibcCflags + 155 generated_config_constants.LinuxX8664Cflags + 156 # Added by stl.go for non-bionic toolchains. 157 [ 158 "-nostdinc++", 159 ], 160 crt = False, 161 gcc_toolchain = generated_config_constants.LinuxGccRoot, 162 libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86_64"], 163 libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86_64"], 164 linker_flags = generated_config_constants.LinuxGlibcLdflags + 165 generated_config_constants.LinuxLdflags + 166 generated_config_constants.LinuxX8664Ldflags + 167 device_compatibility_flags_non_windows + 168 device_compatibility_flags_non_darwin, 169 rtti_toggle = False, 170 target_arch = "x86_64", 171 target_flags = ["--target=x86_64-linux-gnu"], 172 target_os = "linux_glibc", 173 toolchain_identifier = "x86_64-toolchain", 174) 175 176# Toolchain to compile for the linux x86 target. 177android_cc_toolchain( 178 name = "cc_toolchain_x86_linux_host", 179 clang_version = ":clang", 180 compiler_flags = generated_config_constants.LinuxCflags + 181 generated_config_constants.LinuxGlibcCflags + 182 generated_config_constants.LinuxX86Cflags + 183 # Added by stl.go for non-bionic toolchains. 184 [ 185 "-nostdinc++", 186 ], 187 crt = False, 188 gcc_toolchain = generated_config_constants.LinuxGccRoot, 189 libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86"], 190 libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86"], 191 linker_flags = generated_config_constants.LinuxGlibcLdflags + 192 generated_config_constants.LinuxLdflags + 193 generated_config_constants.LinuxX86Ldflags + 194 device_compatibility_flags_non_windows + 195 device_compatibility_flags_non_darwin, 196 rtti_toggle = False, 197 target_arch = "x86", 198 target_flags = ["--target=i686-linux-gnu"], 199 target_os = "linux_glibc", 200 toolchain_identifier = "x86-toolchain", 201) 202 203# Toolchain to compile for the linux host with musl libc. 204android_cc_toolchain( 205 name = "cc_toolchain_x86_64_linux_musl_host", 206 clang_version = ":clang", 207 compiler_flags = generated_config_constants.LinuxCflags + 208 generated_config_constants.LinuxMuslCflags + 209 generated_config_constants.LinuxX8664Cflags + 210 # Added by stl.go for non-bionic toolchains. 211 [ 212 "-nostdinc++", 213 ], 214 crt = _musl_crt, 215 gcc_toolchain = generated_config_constants.LinuxGccRoot, 216 libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_musl_x86_64"], 217 libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_musl_x86_64"], 218 linker_flags = generated_config_constants.LinuxMuslLdflags + 219 generated_config_constants.LinuxLdflags + 220 generated_config_constants.LinuxX8664Ldflags, 221 rtti_toggle = False, 222 target_arch = "x86_64", 223 target_flags = ["--target=x86_64-linux-musl"], 224 target_os = "linux_musl", 225 toolchain_identifier = "x86_64-toolchain", 226) 227 228# Toolchain to compile for the linux x86 host with musl libc. 229android_cc_toolchain( 230 name = "cc_toolchain_x86_linux_musl_host", 231 clang_version = ":clang", 232 compiler_flags = generated_config_constants.LinuxCflags + 233 generated_config_constants.LinuxMuslCflags + 234 generated_config_constants.LinuxX86Cflags + 235 # Added by stl.go for non-bionic toolchains. 236 [ 237 "-nostdinc++", 238 ], 239 crt = _musl_crt, 240 gcc_toolchain = generated_config_constants.LinuxGccRoot, 241 libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_musl_x86"], 242 libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_musl_x86"], 243 linker_flags = generated_config_constants.LinuxMuslLdflags + 244 generated_config_constants.LinuxLdflags + 245 generated_config_constants.LinuxX86Ldflags, 246 rtti_toggle = False, 247 target_arch = "x86", 248 target_flags = ["--target=i686-linux-musl"], 249 target_os = "linux_musl", 250 toolchain_identifier = "x86-toolchain", 251) 252 253toolchain_type(name = "nocrt_toolchain") 254 255# Device toolchains 256[ 257 [ 258 [ 259 toolchain_definition(arch, variant, nocrt) 260 for nocrt in [ 261 True, 262 False, 263 ] 264 ] 265 for variant in variants 266 ] 267 for arch, variants in arch_to_variants.items() 268] 269 270# Toolchains for linux host (x86_64) archs 271[ 272 toolchain( 273 name = "%s_def" % toolchain_name, 274 exec_compatible_with = [ 275 "//build/bazel_common_rules/platforms/arch:x86_64", 276 "//build/bazel_common_rules/platforms/os:linux_glibc", 277 ], 278 target_compatible_with = [ 279 "//build/bazel_common_rules/platforms/arch:x86_64", 280 "//build/bazel_common_rules/platforms/os:linux_glibc", 281 ], 282 toolchain = toolchain_name, 283 toolchain_type = toolchain_type, 284 ) 285 for (toolchain_name, toolchain_type) in x86_64_host_toolchains 286] 287 288# Toolchains for linux target (non-host) x86 arch 289[ 290 toolchain( 291 name = "%s_def" % toolchain_name, 292 exec_compatible_with = [ 293 "//build/bazel_common_rules/platforms/arch:x86_64", 294 "//build/bazel_common_rules/platforms/os:linux_glibc", 295 ], 296 target_compatible_with = [ 297 "//build/bazel_common_rules/platforms/arch:x86", 298 "//build/bazel_common_rules/platforms/os:linux_glibc", 299 ], 300 toolchain = toolchain_name, 301 toolchain_type = toolchain_type, 302 ) 303 for (toolchain_name, toolchain_type) in x86_host_toolchains 304] 305 306# Toolchains for linux musl host (x86_64) archs 307[ 308 toolchain( 309 name = "%s_def" % toolchain_name, 310 exec_compatible_with = [ 311 "//build/bazel_common_rules/platforms/arch:x86_64", 312 "//build/bazel_common_rules/platforms/os:linux_musl", 313 ], 314 target_compatible_with = [ 315 "//build/bazel_common_rules/platforms/arch:x86_64", 316 "//build/bazel_common_rules/platforms/os:linux_musl", 317 ], 318 toolchain = toolchain_name, 319 toolchain_type = toolchain_type, 320 ) 321 for (toolchain_name, toolchain_type) in x86_64_musl_host_toolchains 322] 323 324# Toolchains for linux musl target (non-host) x86 arch 325[ 326 toolchain( 327 name = "%s_def" % toolchain_name, 328 exec_compatible_with = [ 329 "//build/bazel_common_rules/platforms/arch:x86_64", 330 "//build/bazel_common_rules/platforms/os:linux_musl", 331 ], 332 target_compatible_with = [ 333 "//build/bazel_common_rules/platforms/arch:x86", 334 "//build/bazel_common_rules/platforms/os:linux_musl", 335 ], 336 toolchain = toolchain_name, 337 toolchain_type = toolchain_type, 338 ) 339 for (toolchain_name, toolchain_type) in x86_musl_host_toolchains 340] 341 342[ 343 filegroup( 344 name = "libclang_rt_%s_%s_%s" % (prefix, os, arch), 345 srcs = [":clang"], 346 output_group = "libclang_rt_%s_%s_%s" % (prefix, os, arch), 347 ) 348 for os, arches in { 349 "android": [ 350 "arm", 351 "arm64", 352 "x86", 353 "x86_64", 354 ], 355 "linux": [ 356 "bionic_x86_64", 357 "glibc_x86", 358 "glibc_x86_64", 359 "musl_x86", 360 "musl_x86_64", 361 ], 362 }.items() 363 for arch in arches 364 for prefix in [ 365 "builtins", 366 "ubsan_minimal", 367 ] 368] 369 370cc_import( 371 name = "libclang_rt", 372 static_library = select(libclang_rt_prebuilt_map), 373) 374 375[ 376 filegroup( 377 name = tool, 378 srcs = [":clang"], 379 output_group = clang_tool_output_group(tool), 380 visibility = ["//visibility:public"], 381 ) 382 for tool in CLANG_TOOLS 383] 384 385# Test tools used by Bazel tests. 386filegroup( 387 name = "test_tools", 388 srcs = [":clang"], 389 output_group = "clang_test_tools", 390 visibility = ["//build/bazel/tests:__subpackages__"], 391) 392 393string_flag( 394 name = "clang_version", 395 build_setting_default = env.get( 396 "LLVM_PREBUILTS_VERSION", 397 generated_config_constants.CLANG_DEFAULT_VERSION, 398 ), 399) 400 401string_flag( 402 name = "clang_short_version", 403 build_setting_default = env.get( 404 "LLVM_RELEASE_VERSION", 405 generated_config_constants.CLANG_DEFAULT_SHORT_VERSION, 406 ), 407) 408