# 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("@bazel_skylib//rules:common_settings.bzl", "bool_flag") load( "@pw_toolchain//cc_toolchain:defs.bzl", "pw_cc_action_files", "pw_cc_feature", "pw_cc_feature_set", "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", ], ) bool_flag( name = "asan", build_setting_default = False, ) config_setting( name = "asan_enabled", flag_values = { ":asan": "true", }, ) pw_cc_feature( name = "asan_feature", enabled = select({ ":asan_enabled": True, "//conditions:default": False, }), feature_name = "asan", flag_sets = ["@pw_toolchain//flag_sets:asan"], requires_any_of = [":asan_constraint"], ) pw_cc_feature_set( name = "asan_constraint", # Rust uses the C++ linker, but not the C++ compiler, so we need to ensure # -fsanitize=address is not be specified during Rust linking. all_of = [":rules_rust_unsupported_feature"], ) # This is a sentinel feature defined by rules_rust. It is by definition # unsupported: rules_rust will disable this feature when linking Rust code. pw_cc_feature( name = "rules_rust_unsupported_feature", enabled = True, feature_name = "rules_rust_unsupported_feature", ) 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, "//conditions:default": "", }), compiler = "clang", 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", "%sysroot%/System/Library/Frameworks/IOKit.framework/Headers", "%sysroot%/System/Library/Frameworks/Security.framework/Headers", "%package(@llvm_toolchain//)%/include/c++/v1", "%package(@llvm_toolchain//)%/lib/clang/18/include", ], "//conditions:default": [], }), extra_action_files = [":sysroot_files"], flag_sets = select({ "@platforms//os:linux": [ ":linux_link_libs", ], "@platforms//os:macos": [ ":macos_link_libs", ":libtool_darwin_flags", ], "//conditions:default": [], }) + [ ":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 = [ ":asan_feature", ":verbose_compiler_output", ":rules_rust_unsupported_feature", ], 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", )