# Copyright 2024 The Bazel Authors. All rights reserved. # # 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 # # http://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. """Implementation of the cc_toolchain rule.""" load("//cc:defs.bzl", _cc_toolchain = "cc_toolchain") load( "//cc/toolchains/impl:toolchain_config.bzl", "cc_legacy_file_group", "cc_toolchain_config", ) visibility("public") # Taken from https://bazel.build/docs/cc-toolchain-config-reference#actions # TODO: This is best-effort. Update this with the correct file groups once we # work out what actions correspond to what file groups. _LEGACY_FILE_GROUPS = { "ar_files": [ "@rules_cc//cc/toolchains/actions:ar_actions", # copybara-use-repo-external-label ], "as_files": [ "@rules_cc//cc/toolchains/actions:assembly_actions", # copybara-use-repo-external-label ], "compiler_files": [ "@rules_cc//cc/toolchains/actions:cc_flags_make_variable", # copybara-use-repo-external-label "@rules_cc//cc/toolchains/actions:c_compile", # copybara-use-repo-external-label "@rules_cc//cc/toolchains/actions:cpp_compile", # copybara-use-repo-external-label "@rules_cc//cc/toolchains/actions:cpp_header_parsing", # copybara-use-repo-external-label ], # There are no actions listed for coverage, dwp, and objcopy in action_names.bzl. "coverage_files": [], "dwp_files": [], "linker_files": [ "@rules_cc//cc/toolchains/actions:cpp_link_dynamic_library", # copybara-use-repo-external-label "@rules_cc//cc/toolchains/actions:cpp_link_nodeps_dynamic_library", # copybara-use-repo-external-label "@rules_cc//cc/toolchains/actions:cpp_link_executable", # copybara-use-repo-external-label ], "objcopy_files": [], "strip_files": [ "@rules_cc//cc/toolchains/actions:strip", # copybara-use-repo-external-label ], } def cc_toolchain( name, dynamic_runtime_lib = None, libc_top = None, module_map = None, output_licenses = [], static_runtime_lib = None, supports_header_parsing = False, supports_param_files = True, target_compatible_with = None, exec_compatible_with = None, compatible_with = None, tags = [], visibility = None, **kwargs): """A macro that invokes native.cc_toolchain under the hood. Generated rules: {name}: A `cc_toolchain` for this toolchain. _{name}_config: A `cc_toolchain_config` for this toolchain. _{name}_*_files: Generated rules that group together files for "ar_files", "as_files", "compiler_files", "coverage_files", "dwp_files", "linker_files", "objcopy_files", and "strip_files" normally enumerated as part of the `cc_toolchain` rule. Args: name: str: The name of the label for the toolchain. dynamic_runtime_lib: See cc_toolchain.dynamic_runtime_lib libc_top: See cc_toolchain.libc_top module_map: See cc_toolchain.module_map output_licenses: See cc_toolchain.output_licenses static_runtime_lib: See cc_toolchain.static_runtime_lib supports_header_parsing: See cc_toolchain.supports_header_parsing supports_param_files: See cc_toolchain.supports_param_files target_compatible_with: target_compatible_with to apply to all generated rules exec_compatible_with: exec_compatible_with to apply to all generated rules compatible_with: compatible_with to apply to all generated rules tags: Tags to apply to all generated rules visibility: Visibility of toolchain rule **kwargs: Args to be passed through to cc_toolchain_config. """ all_kwargs = { "compatible_with": compatible_with, "exec_compatible_with": exec_compatible_with, "tags": tags, "target_compatible_with": target_compatible_with, } for group in _LEGACY_FILE_GROUPS: if group in kwargs: fail("Don't use legacy file groups such as %s. Instead, associate files with tools, actions, and args." % group) config_name = "_{}_config".format(name) cc_toolchain_config( name = config_name, visibility = ["//visibility:private"], **(all_kwargs | kwargs) ) # Provides ar_files, compiler_files, linker_files, ... legacy_file_groups = {} for group, actions in _LEGACY_FILE_GROUPS.items(): group_name = "_{}_{}".format(name, group) cc_legacy_file_group( name = group_name, config = config_name, actions = actions, visibility = ["//visibility:private"], **all_kwargs ) legacy_file_groups[group] = group_name if visibility != None: all_kwargs["visibility"] = visibility _cc_toolchain( name = name, toolchain_config = config_name, all_files = config_name, dynamic_runtime_lib = dynamic_runtime_lib, libc_top = libc_top, module_map = module_map, output_licenses = output_licenses, static_runtime_lib = static_runtime_lib, supports_header_parsing = supports_header_parsing, supports_param_files = supports_param_files, # This is required for Bazel versions <= 7.x.x. It is ignored in later versions. exec_transition_for_inputs = False, **(all_kwargs | legacy_file_groups) )