blob: 706f15ebaaf50d9a8e5b5f827d3928981b37b9c7 [file] [log] [blame]
# Copyright 2022 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@fuchsia_sdk//:generated_constants.bzl", sdk_constants = "constants")
load(
"@fuchsia_sdk//fuchsia:defs.bzl",
"fuchsia_cpu_filter_dict",
"fuchsia_cpu_select",
"fuchsia_debug_symbols",
"fuchsia_package_resource_group",
)
load(
":cc_toolchain_config.bzl",
"cc_toolchain_config",
"feature_flag",
)
licenses(["notice"])
package(default_visibility = ["//visibility:public"])
cc_toolchain_suite(
name = "toolchain",
toolchains = fuchsia_cpu_filter_dict(
{
"arm64": {
"aarch64|llvm": ":cc-compiler-aarch64",
"aarch64": ":cc-compiler-aarch64",
},
"x64": {
"x86_64|llvm": ":cc-compiler-x86_64",
"x86_64": ":cc-compiler-x86_64",
},
"riscv64": {
"riscv64|llvm": ":cc-compiler-riscv64",
"riscv64": ":cc-compiler-riscv64",
},
},
sdk_constants.target_cpus,
),
)
_TO_BAZEL_CPU_MAP = {
"x64": "x86_64",
"arm64": "aarch64",
}
TARGET_CPUS = [_TO_BAZEL_CPU_MAP.get(cpu, cpu) for cpu in sdk_constants.target_cpus]
filegroup(
name = "empty",
)
exports_files([
"bin/clang-format",
"bin/clang-tidy",
"bin/llvm-readelf",
])
filegroup(
name = "cc-compiler-prebuilts",
srcs = [
"//:bin/clang",
"//:bin/clang++",
"//:bin/clang-cpp",
"//:bin/llvm-strip",
],
)
filegroup(
name = "cc-linker-prebuilts",
srcs = [
"//:bin/clang",
"//:bin/ld.lld",
"//:bin/ld64.lld",
"//:bin/lld",
"//:bin/lld-link",
],
)
filegroup(
name = "libunwind-headers",
srcs = [
"include/libunwind.h",
"include/libunwind.modulemap",
"include/mach-o/compact_unwind_encoding.h",
"include/mach-o/compact_unwind_encoding.modulemap",
"include/unwind.h",
"include/unwind_arm_ehabi.h",
"include/unwind_itanium.h",
],
)
[
filegroup(
name = "libcxx-headers-" + cpu,
srcs = glob([
"include/c++/v1/**",
]) + glob([
# TODO(https://fxbug.dev/42172715): Try not to hard code this path.
"lib/clang/%{CLANG_VERSION}/include/**",
]) + glob([
"include/%s-unknown-fuchsia/c++/v1/*" % cpu,
]),
)
for cpu in TARGET_CPUS
]
[
filegroup(
name = "libcxx-libraries-" + cpu,
srcs = glob([
"lib/%s-unknown-fuchsia/libc++.*" % cpu,
"lib/%s-unknown-fuchsia/libc++abi.*" % cpu,
"lib/%s-unknown-fuchsia/libunwind.*" % cpu,
"lib/%s-unknown-fuchsia/asan/libc++.*" % cpu,
"lib/%s-unknown-fuchsia/asan/libc++abi.*" % cpu,
"lib/%s-unknown-fuchsia/asan/libunwind.*" % cpu,
"lib/%s-unknown-fuchsia/hwasan/libc++.*" % cpu,
"lib/%s-unknown-fuchsia/hwasan/libc++abi.*" % cpu,
"lib/%s-unknown-fuchsia/hwasan/libunwind.*" % cpu,
]),
)
for cpu in TARGET_CPUS
]
filegroup(
name = "ar",
srcs = ["//:bin/llvm-ar"],
)
[
filegroup(
name = "fuchsia-sysroot-headers-" + cpu,
srcs = glob(["fuchsia_sysroot_" + cpu + "/include/**"]),
)
for cpu in TARGET_CPUS
]
[
filegroup(
name = "fuchsia-sysroot-libraries-" + cpu,
srcs = glob(["fuchsia_sysroot_" + cpu + "/lib/**"]),
)
for cpu in TARGET_CPUS
]
[
filegroup(
name = "compile-" + cpu,
srcs = [
":cc-compiler-prebuilts",
":libunwind-headers",
":libcxx-headers-" + cpu,
":fuchsia-sysroot-headers-" + cpu,
],
)
for cpu in TARGET_CPUS
]
filegroup(
name = "objcopy",
srcs = [
"//:bin/llvm-objcopy",
],
)
filegroup(
name = "strip",
srcs = [
"//:bin/llvm-strip",
],
)
filegroup(
name = "nm",
srcs = [
"//:bin/llvm-nm",
],
)
[
filegroup(
name = "every-file-" + cpu,
srcs = [
":compile-" + cpu,
":runtime-" + cpu,
":link-" + cpu,
":ar",
":nm",
":objcopy",
],
)
for cpu in TARGET_CPUS
]
[
filegroup(
name = "link-" + cpu,
srcs = [
":cc-linker-prebuilts",
":fuchsia-sysroot-libraries-" + cpu,
":libcxx-libraries-" + cpu,
":runtime-" + cpu,
],
)
for cpu in TARGET_CPUS
]
[
filegroup(
name = "runtime-" + cpu,
srcs = [
# TODO(https://fxbug.dev/42172715): Don't hard code this path.
"//:lib/clang/%{CLANG_VERSION}/lib/%s-unknown-fuchsia/libclang_rt.builtins.a" % cpu,
] + [
# TODO(b/325505298): Only add these when the Asan sanitizer is enabled.
#
# Right now, it is impossible to use a select({":asan_variant": [...], ...}) expression
# here because it creates a circular dependency, where Bazel complains with:
#
# ERROR: ..../output_base/external/fuchsia_clang/BUILD.bazel:226:17: in cc_toolchain rule @fuchsia_clang//:cc-compiler-x86_64: cycle in dependency graph:
# //fuchsia/cpp_variants:cc_20_all (a678e6e6bfc73a8f721fea3bfa0e9d627d5e47c4a8e47004ab6f334d7e0876ba)
# //fuchsia/cpp_variants:cc_20_all_variant_test (506c6d7aa0811ba7b20143e66fdb0c286ec4cf232a5d959198c85b75fa28174f)
# .-> @fuchsia_clang//:cc-compiler-x86_64 (506c6d7aa0811ba7b20143e66fdb0c286ec4cf232a5d959198c85b75fa28174f)
# | @fuchsia_clang//:runtime-x86_64 (506c6d7aa0811ba7b20143e66fdb0c286ec4cf232a5d959198c85b75fa28174f)
# | @fuchsia_clang//:asan_variant (506c6d7aa0811ba7b20143e66fdb0c286ec4cf232a5d959198c85b75fa28174f)
# | @fuchsia_clang//:asan_flag (506c6d7aa0811ba7b20143e66fdb0c286ec4cf232a5d959198c85b75fa28174f)
# `-- @fuchsia_clang//:cc-compiler-x86_64 (506c6d7aa0811ba7b20143e66fdb0c286ec4cf232a5d959198c85b75fa28174f)
#
# The root of the problem is that a feature_flag() cannot be select()-ed properly within the toolchain
# definition. An alternative would be to use a custom build_setting() target to set the sanitizer mode
# instead, and use transitions to change it whenever needed.
#
# asan runtime libraries
"//:lib/clang/%{CLANG_VERSION}/lib/%s-unknown-fuchsia/libclang_rt.asan.so" % cpu,
"//:lib/clang/%{CLANG_VERSION}/lib/%s-unknown-fuchsia/libclang_rt.asan_static.a" % cpu,
"//:lib/clang/%{CLANG_VERSION}/lib/%s-unknown-fuchsia/libclang_rt.asan-preinit.a" % cpu,
# hwasan runtime libraries
"//:lib/clang/%{CLANG_VERSION}/lib/%s-unknown-fuchsia/libclang_rt.hwasan.so" % cpu,
"//:lib/clang/%{CLANG_VERSION}/lib/%s-unknown-fuchsia/libclang_rt.hwasan-preinit.a" % cpu,
],
)
for cpu in TARGET_CPUS
]
[
cc_toolchain_config(
name = "crosstool-1.x.x-llvm-fuchsia-config-" + cpu,
cpu = cpu,
)
for cpu in TARGET_CPUS
]
[
cc_toolchain(
name = "cc-compiler-" + cpu,
all_files = ":every-file-" + cpu,
ar_files = ":ar",
compiler_files = ":compile-" + cpu,
dwp_files = ":empty",
dynamic_runtime_lib = ":runtime-" + cpu,
linker_files = ":link-" + cpu,
objcopy_files = ":objcopy",
static_runtime_lib = ":runtime-" + cpu,
strip_files = ":strip",
supports_param_files = 1,
toolchain_config = "crosstool-1.x.x-llvm-fuchsia-config-" + cpu,
toolchain_identifier = "crosstool-1.x.x-llvm-fuchsia-" + cpu,
)
for cpu in TARGET_CPUS
]
[
toolchain(
name = "cc-" + cpu,
target_compatible_with = [
"@platforms//cpu:" + cpu,
"@platforms//os:fuchsia",
],
toolchain = ":cc-compiler-" + cpu,
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
)
for cpu in TARGET_CPUS
]
cc_library(
name = "sources",
srcs = glob(["src/**"]),
visibility = ["//visibility:public"],
)
fuchsia_debug_symbols(
name = "debug_symbols",
build_dir = "//:BUILD.bazel",
build_id_dirs = ["//:lib/debug/.build-id"],
)
fuchsia_package_resource_group(
name = "dist",
srcs = fuchsia_cpu_select(
{
"arm64": {
":arm_novariant": [
"//:lib/aarch64-unknown-fuchsia/libc++.so.2",
"//:lib/aarch64-unknown-fuchsia/libc++abi.so.1",
"//:lib/aarch64-unknown-fuchsia/libunwind.so.1",
],
":arm_asan_variant": [
"//:lib/aarch64-unknown-fuchsia/asan/libc++.so.2",
"//:lib/aarch64-unknown-fuchsia/asan/libc++abi.so.1",
"//:lib/aarch64-unknown-fuchsia/asan/libunwind.so.1",
],
":arm_hwasan_variant": [
"//:lib/aarch64-unknown-fuchsia/hwasan/libc++.so.2",
"//:lib/aarch64-unknown-fuchsia/hwasan/libc++abi.so.1",
"//:lib/aarch64-unknown-fuchsia/hwasan/libunwind.so.1",
],
},
"x64": {
":x86_novariant": [
"//:lib/x86_64-unknown-fuchsia/libc++.so.2",
"//:lib/x86_64-unknown-fuchsia/libc++abi.so.1",
"//:lib/x86_64-unknown-fuchsia/libunwind.so.1",
],
":x86_asan_variant": [
"//:lib/x86_64-unknown-fuchsia/asan/libc++.so.2",
"//:lib/x86_64-unknown-fuchsia/asan/libc++abi.so.1",
"//:lib/x86_64-unknown-fuchsia/asan/libunwind.so.1",
],
":x86_hwasan_variant": [
"//:lib/x86_64-unknown-fuchsia/hwasan/libc++.so.2",
"//:lib/x86_64-unknown-fuchsia/hwasan/libc++abi.so.1",
"//:lib/x86_64-unknown-fuchsia/hwasan/libunwind.so.1",
],
},
"riscv64": {
":riscv64_novariant": [
"//:lib/riscv64-unknown-fuchsia/libc++.so.2",
"//:lib/riscv64-unknown-fuchsia/libc++abi.so.1",
"//:lib/riscv64-unknown-fuchsia/libunwind.so.1",
],
":riscv64_asan_variant": [
"//:lib/riscv64-unknown-fuchsia/asan/libc++.so.2",
"//:lib/riscv64-unknown-fuchsia/asan/libc++abi.so.1",
"//:lib/riscv64-unknown-fuchsia/asan/libunwind.so.1",
],
":riscv64_hwasan_variant": [
"//:lib/riscv64-unknown-fuchsia/hwasan/libc++.so.2",
"//:lib/riscv64-unknown-fuchsia/hwasan/libc++abi.so.1",
"//:lib/riscv64-unknown-fuchsia/hwasan/libunwind.so.1",
],
},
},
sdk_constants.target_cpus,
),
dest = "lib" + select({
":asan_variant": "/asan",
"//conditions:default": "",
}),
strip_prefix = fuchsia_cpu_select(
{
"arm64": {
":arm_novariant": "../fuchsia_clang/lib/aarch64-unknown-fuchsia",
":arm_asan_variant": "../fuchsia_clang/lib/aarch64-unknown-fuchsia/asan",
":arm_hwasan_variant": "../fuchsia_clang/lib/aarch64-unknown-fuchsia/hwasan",
},
"x64": {
":x86_novariant": "../fuchsia_clang/lib/x86_64-unknown-fuchsia",
":x86_asan_variant": "../fuchsia_clang/lib/x86_64-unknown-fuchsia/asan",
":x86_hwasan_variant": "../fuchsia_clang/lib/x86_64-unknown-fuchsia/hwasan",
},
"riscv64": {
":riscv64_novariant": "../fuchsia_clang/lib/riscv64-unknown-fuchsia",
":riscv64_asan_variant": "../fuchsia_clang/lib/riscv64-unknown-fuchsia/asan",
":riscv64_hwasan_variant": "../fuchsia_clang/lib/riscv64-unknown-fuchsia/hwasan",
},
},
sdk_constants.target_cpus,
),
visibility = ["//visibility:public"],
)
fuchsia_package_resource_group(
name = "runtime",
srcs = fuchsia_cpu_select(
{
"arm64": {
":arm_asan_variant": [
"//:lib/clang/%{CLANG_VERSION}/lib/aarch64-unknown-fuchsia/libclang_rt.asan.so",
],
":arm_hwasan_variant": [
"//:lib/clang/%{CLANG_VERSION}/lib/aarch64-unknown-fuchsia/libclang_rt.hwasan.so",
],
},
"x64": {
":x86_asan_variant": [
"//:lib/clang/%{CLANG_VERSION}/lib/x86_64-unknown-fuchsia/libclang_rt.asan.so",
],
":x86_hwasan_variant": [
"//:lib/clang/%{CLANG_VERSION}/lib/x86_64-unknown-fuchsia/libclang_rt.hwasan.so",
],
},
"riscv64": {
":riscv64_asan_variant": [
"//:lib/clang/%{CLANG_VERSION}/lib/riscv64-unknown-fuchsia/libclang_rt.asan.so",
],
":riscv64_hwasan_variant": [
"//:lib/clang/%{CLANG_VERSION}/lib/riscv64-unknown-fuchsia/libclang_rt.hwasan.so",
],
},
},
sdk_constants.target_cpus,
default = [],
),
dest = "lib" + select({
":asan_variant": "/asan",
":hwasan_variant": "/hwasan",
"//conditions:default": "",
}),
strip_prefix = fuchsia_cpu_select(
{
"arm64": {
":arm_build": "../fuchsia_clang/lib/clang/%{CLANG_VERSION}/lib/aarch64-unknown-fuchsia",
},
"x64": {
":x86_build": "../fuchsia_clang/lib/clang/%{CLANG_VERSION}/lib/x86_64-unknown-fuchsia",
},
"riscv64": {
":riscv64_build": "../fuchsia_clang/lib/clang/%{CLANG_VERSION}/lib/riscv64-unknown-fuchsia",
},
},
sdk_constants.target_cpus,
),
visibility = ["//visibility:public"],
)
config_setting(
name = "aarch64_cpu_build",
values = {"cpu": "aarch64"},
)
config_setting(
name = "armeabi-v7a_cpu_build",
values = {"cpu": "armeabi-v7a"},
)
selects.config_setting_group(
name = "arm_build",
match_any = [
"@platforms//cpu:arm64",
":aarch64_cpu_build",
":armeabi-v7a_cpu_build",
],
)
config_setting(
name = "x86_64_cpu_build",
values = {"cpu": "x86_64"},
)
config_setting(
name = "k8_cpu_build",
values = {"cpu": "k8"},
)
selects.config_setting_group(
name = "x86_build",
match_any = [
"@platforms//cpu:x86_64",
":x86_64_cpu_build",
":k8_cpu_build",
],
)
config_setting(
name = "riscv64_cpu_build",
values = {"cpu": "riscv64"},
)
selects.config_setting_group(
name = "riscv64_build",
match_any = [
"@platforms//cpu:riscv64",
":riscv64_cpu_build",
],
)
feature_flag(
name = "asan_flag",
feature_name = "asan",
visibility = ["//visibility:private"],
)
feature_flag(
name = "hwasan_flag",
feature_name = "hwasan",
visibility = ["//visibility:private"],
)
config_setting(
name = "novariant",
flag_values = {
":asan_flag": "False",
":hwasan_flag": "False",
},
visibility = ["//visibility:public"],
)
# IMPORTANT: The hwasan feature takes precedence over the asan one.
# Keep this in sync with the definition of sanitizer_features in
# @fuchsia_sdk_common/toolchains/clang/sanitizer.bzl
config_setting(
name = "asan_variant",
flag_values = {
":asan_flag": "True",
":hwasan_flag": "False",
},
visibility = ["//visibility:public"],
)
config_setting(
name = "hwasan_variant",
flag_values = {
":hwasan_flag": "True",
},
visibility = ["//visibility:public"],
)
selects.config_setting_group(
name = "arm_novariant",
match_all = [
":arm_build",
":novariant",
],
)
selects.config_setting_group(
name = "arm_asan_variant",
match_all = [
":arm_build",
":asan_variant",
],
)
selects.config_setting_group(
name = "arm_hwasan_variant",
match_all = [
":arm_build",
":hwasan_variant",
],
)
selects.config_setting_group(
name = "x86_novariant",
match_all = [
":x86_build",
":novariant",
],
)
selects.config_setting_group(
name = "x86_asan_variant",
match_all = [
":x86_build",
":asan_variant",
],
)
selects.config_setting_group(
name = "x86_hwasan_variant",
match_all = [
":x86_build",
":hwasan_variant",
],
)
selects.config_setting_group(
name = "riscv64_novariant",
match_all = [
":riscv64_build",
":novariant",
],
)
selects.config_setting_group(
name = "riscv64_asan_variant",
match_all = [
":riscv64_build",
":asan_variant",
],
)
selects.config_setting_group(
name = "riscv64_hwasan_variant",
match_all = [
":riscv64_build",
":hwasan_variant",
],
)