blob: ec464094ae73160fd4b708520f025167d3fd8d51 [file] [log] [blame]
# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
load(
"@pw_toolchain//cc_toolchain:defs.bzl",
"pw_cc_action_files",
"pw_cc_feature",
"pw_cc_flag_set",
"pw_cc_toolchain",
)
load("@pw_xcode_command_line_tools//:defs.bzl", "XCODE_SDK_PATH")
package(default_visibility = ["//visibility:public"])
licenses(["notice"])
filegroup(name = "empty")
pw_cc_flag_set(
name = "macos_link_libs",
actions = ["@pw_toolchain//actions:all_link_actions"],
flags = [
# Force dropping the system libc++.
"-nostdlib++",
# Use libc++ provided by the toolchain.
"external/llvm_toolchain/lib/libc++.a",
],
target_compatible_with = ["@platforms//os:macos"],
)
pw_cc_flag_set(
name = "linux_link_libs",
actions = ["@pw_toolchain//actions:all_link_actions"],
flags = [
"-pthread",
"-stdlib=libc++",
"--rtlib=compiler-rt",
"--unwindlib=libunwind",
],
target_compatible_with = ["@platforms//os:linux"],
)
pw_cc_flag_set(
name = "libtool_darwin_flags",
actions = ["@pw_toolchain//actions:cpp_link_static_library"],
flags = ["-no_warning_for_no_symbols"],
)
# Although we use similar warnings for clang and arm_gcc, we don't have one
# centralized list, since we might want to use different warnings based on the
# compiler in the future.
pw_cc_flag_set(
name = "warnings",
actions = [
"@pw_toolchain//actions:all_c_compiler_actions",
"@pw_toolchain//actions:all_cpp_compiler_actions",
],
flags = [
"-Wall",
"-Wextra",
# Make all warnings errors, except for the exemptions below.
"-Werror",
"-Wno-error=cpp", # preprocessor #warning statement
"-Wno-error=deprecated-declarations", # [[deprecated]] attribute
],
)
# Thread safety warnings are only supported by Clang.
pw_cc_flag_set(
name = "thread_safety_warnings",
actions = [
"@pw_toolchain//actions:all_c_compiler_actions",
"@pw_toolchain//actions:all_cpp_compiler_actions",
],
flags = [
"-Wthread-safety",
"-D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1",
],
)
pw_cc_flag_set(
name = "verbose_compiler_flags",
actions = [
"@pw_toolchain//actions:all_asm_actions",
"@pw_toolchain//actions:all_c_compiler_actions",
"@pw_toolchain//actions:all_cpp_compiler_actions",
"@pw_toolchain//actions:all_link_actions",
],
flags = ["-v"],
)
# A feature that can be easily toggled to include extra compiler output to help
# debug things like include search path ordering and showing all the flags
# passed to the compiler.
#
# Add `--features=verbose_compiler_output` to your Bazel invocation to enable.
pw_cc_feature(
name = "verbose_compiler_output",
enabled = False,
feature_name = "verbose_compiler_output",
flag_sets = [":verbose_compiler_flags"],
)
pw_cc_flag_set(
name = "no_unknown_warning_option",
actions = [
"@pw_toolchain//actions:all_c_compiler_actions",
"@pw_toolchain//actions:all_cpp_compiler_actions",
],
flags = [
"-Wno-unknown-warning-option",
],
)
pw_cc_action_files(
name = "sysroot_files",
srcs = select({
"@platforms//os:linux": [
"@linux_sysroot//:all",
],
"//conditions:default": [],
}),
actions = [
"@pw_toolchain//actions:all_compiler_actions",
"@pw_toolchain//actions:all_link_actions",
],
)
pw_cc_toolchain(
name = "host_toolchain",
action_configs = [
"@llvm_toolchain//:ar",
"@llvm_toolchain//:clang",
"@llvm_toolchain//:clang++",
"@llvm_toolchain//:lld",
"@llvm_toolchain//:llvm-cov",
"@llvm_toolchain//:llvm-objcopy",
"@llvm_toolchain//:llvm-objdump",
"@llvm_toolchain//:llvm-strip",
],
builtin_sysroot = select({
"@platforms//os:linux": "external/linux_sysroot",
"@platforms//os:macos": XCODE_SDK_PATH,
}),
cxx_builtin_include_directories = select({
"@platforms//os:linux": [
"%package(@llvm_toolchain//)%/include/x86_64-unknown-linux-gnu/c++/v1",
"%package(@llvm_toolchain//)%/include/c++/v1",
"%package(@llvm_toolchain//)%/lib/clang/18/include",
"%sysroot%/usr/local/include",
"%sysroot%/usr/include/x86_64-linux-gnu",
"%sysroot%/usr/include",
],
"@platforms//os:macos": [
"%sysroot%/usr/include",
"%sysroot%/System/Library/Frameworks/CoreFoundation.framework/Headers",
"%package(@llvm_toolchain//)%/include/c++/v1",
"%package(@llvm_toolchain//)%/lib/clang/18/include",
],
}),
extra_action_files = [":sysroot_files"],
flag_sets = select({
"@platforms//os:linux": [
":linux_link_libs",
],
"@platforms//os:macos": [
":macos_link_libs",
":libtool_darwin_flags",
],
}) + [
":warnings",
":thread_safety_warnings",
"@pw_toolchain//flag_sets:c++17",
"@pw_toolchain//flag_sets:debugging",
"@pw_toolchain//flag_sets:reduced_size",
"@pw_toolchain//flag_sets:no_canonical_prefixes",
"@pw_toolchain//flag_sets:no_rtti",
"@pw_toolchain//flag_sets:wno_register",
"@pw_toolchain//flag_sets:wnon_virtual_dtor",
] + select({
"//pw_build:kythe": [":no_unknown_warning_option"],
"//conditions:default": [],
}),
# The implementations of some "legacy features" built into Bazel use
# `target_libc` to determine if a toolchain targets MacOS,
# https://github.com/bazelbuild/bazel/blob/release-7.0.0-pre.20230816.3rc1/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java#L1301-L1304
#
# `target_cpu` appears to only potentially do magic things for the Android
# NDK, so it's omitted here.
target_libc = select({
"@platforms//os:macos": "macosx",
"//conditions:default": None,
}),
toolchain_features = [
":verbose_compiler_output",
],
toolchain_identifier = "host-toolchain",
)
toolchain(
name = "host_cc_toolchain_linux",
exec_compatible_with = [
"@platforms//os:linux",
],
target_compatible_with = [
"@platforms//os:linux",
],
toolchain = ":host_toolchain",
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
)
toolchain(
name = "host_cc_toolchain_macos",
exec_compatible_with = [
"@platforms//os:macos",
],
target_compatible_with = [
"@platforms//os:macos",
],
toolchain = ":host_toolchain",
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
)