From 2574ba4f4612fa263c3553cdb3525ddbc66e0a9b Mon Sep 17 00:00:00 2001
From: David Zbarsky
cc_toolchain_config_info.""",
@@ -340,5 +379,16 @@ The label of the rule providing cc_toolchain_config_info.""",
default = semantics.BUILD_INFO_TRANLATOR_LABEL,
providers = [OutputGroupInfo],
),
+ "_legacy_action_sets": attr.label_list(
+ default = LEGACY_ACTION_SET_DEPS,
+ providers = [ActionTypeSetInfo],
+ ),
+ } | CC_TOOLCHAIN_CONFIG_PUBLIC_ATTRS | {
+ # Override tool_map to make it optional.
+ "tool_map": attr.label(
+ cfg = "exec",
+ providers = [ToolConfigInfo],
+ ),
+ "_builtin_features": attr.label(default = "//cc/toolchains/features:all_builtin_features"),
} | semantics.cpp_modules_tools(), # buildifier: disable=unsorted-dict-items
)
diff --git a/cc/toolchains/BUILD b/cc/toolchains/BUILD
index 5ebf9c8f3..5393bd148 100644
--- a/cc/toolchains/BUILD
+++ b/cc/toolchains/BUILD
@@ -28,6 +28,7 @@ bzl_library(
"//cc/private/rules_impl:toolchain_rules",
"//cc/private/rules_impl/fdo:fdo_rules",
"//cc/toolchains/impl:toolchain_impl_rules",
+ "@bazel_features//:features",
"@bazel_skylib//rules/directory:glob",
"@cc_compatibility_proxy//:proxy_bzl",
],
diff --git a/cc/toolchains/cc_toolchain_info.bzl b/cc/toolchains/cc_toolchain_info.bzl
index 38148b463..3f2ae55b4 100644
--- a/cc/toolchains/cc_toolchain_info.bzl
+++ b/cc/toolchains/cc_toolchain_info.bzl
@@ -18,6 +18,7 @@
# Once it's stabilized, we *may* consider opening up parts of the API, or we may
# decide to just require users to use the public user-facing rules.
visibility([
+ "//cc/private/rules_impl/...",
"//cc/toolchains/...",
"//tests/rule_based_toolchain/...",
])
diff --git a/cc/toolchains/impl/collect.bzl b/cc/toolchains/impl/collect.bzl
index 671bb65b4..de06c8791 100644
--- a/cc/toolchains/impl/collect.bzl
+++ b/cc/toolchains/impl/collect.bzl
@@ -22,6 +22,7 @@ load(
)
visibility([
+ "//cc/private/rules_impl/...",
"//cc/toolchains/...",
"//tests/rule_based_toolchain/...",
])
diff --git a/cc/toolchains/impl/toolchain_config.bzl b/cc/toolchains/impl/toolchain_config.bzl
index 1f6efefe5..0057c0f1f 100644
--- a/cc/toolchains/impl/toolchain_config.bzl
+++ b/cc/toolchains/impl/toolchain_config.bzl
@@ -29,6 +29,7 @@ load(":legacy_converter.bzl", "convert_toolchain")
load(":toolchain_config_info.bzl", "toolchain_config_info")
visibility([
+ "//cc/private/rules_impl/...",
"//cc/toolchains/...",
"//tests/rule_based_toolchain/...",
])
@@ -50,7 +51,14 @@ cc_legacy_file_group = rule(
},
)
-def _cc_toolchain_config_impl(ctx):
+def cc_toolchain_config_impl_helper(ctx):
+ """Main implementation for _cc_toolchain_config_impl, reused for rules-based toolchains
+
+ Args:
+ ctx: Rule context
+ Returns:
+ toolchain_config_info and cc_toolchain_config_info providers"""
+
if ctx.attr.features:
fail("Features is a reserved attribute in bazel. Did you mean 'known_features' or 'enabled_features'?")
@@ -66,7 +74,7 @@ def _cc_toolchain_config_impl(ctx):
legacy = convert_toolchain(toolchain_config)
- return [
+ return (
toolchain_config,
cc_common.create_cc_toolchain_config_info(
ctx = ctx,
@@ -90,6 +98,13 @@ def _cc_toolchain_config_impl(ctx):
abi_version = "",
abi_libc_version = "",
),
+ )
+
+def _cc_toolchain_config_impl(ctx):
+ toolchain_config, cc_toolchain_config_info = cc_toolchain_config_impl_helper(ctx)
+ return [
+ toolchain_config,
+ cc_toolchain_config_info,
# This allows us to support all_files.
# If all_files was simply an alias to
# //cc/toolchains/actions:all_actions,
@@ -98,19 +113,21 @@ def _cc_toolchain_config_impl(ctx):
DefaultInfo(files = depset(transitive = toolchain_config.files.values())),
]
+CC_TOOLCHAIN_CONFIG_PUBLIC_ATTRS = {
+ # Attributes new to this rule.
+ "compiler": attr.string(default = ""),
+ "cpu": attr.string(default = ""),
+ "tool_map": attr.label(providers = [ToolConfigInfo], mandatory = True),
+ "args": attr.label_list(providers = [ArgsListInfo]),
+ "known_features": attr.label_list(providers = [FeatureSetInfo]),
+ "enabled_features": attr.label_list(providers = [FeatureSetInfo]),
+ "artifact_name_patterns": attr.label_list(providers = [ArtifactNamePatternInfo]),
+ "make_variables": attr.label_list(providers = [MakeVariableInfo]),
+}
+
cc_toolchain_config = rule(
implementation = _cc_toolchain_config_impl,
- # @unsorted-dict-items
- attrs = {
- # Attributes new to this rule.
- "compiler": attr.string(default = ""),
- "cpu": attr.string(default = ""),
- "tool_map": attr.label(providers = [ToolConfigInfo], mandatory = True),
- "args": attr.label_list(providers = [ArgsListInfo]),
- "known_features": attr.label_list(providers = [FeatureSetInfo]),
- "enabled_features": attr.label_list(providers = [FeatureSetInfo]),
- "artifact_name_patterns": attr.label_list(providers = [ArtifactNamePatternInfo]),
- "make_variables": attr.label_list(providers = [MakeVariableInfo]),
+ attrs = CC_TOOLCHAIN_CONFIG_PUBLIC_ATTRS | {
"_builtin_features": attr.label(default = "//cc/toolchains/features:all_builtin_features"),
},
provides = [ToolchainConfigInfo],
diff --git a/cc/toolchains/legacy_file_group.bzl b/cc/toolchains/legacy_file_group.bzl
new file mode 100644
index 000000000..a170a194c
--- /dev/null
+++ b/cc/toolchains/legacy_file_group.bzl
@@ -0,0 +1,46 @@
+# Copyright 2018 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.
+""""Mapping of legacy file groups"""
+
+# 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": [
+ Label("//cc/toolchains/actions:ar_actions"),
+ ],
+ "as_files": [
+ Label("//cc/toolchains/actions:assembly_actions"),
+ ],
+ "compiler_files": [
+ Label("//cc/toolchains/actions:cc_flags_make_variable"),
+ Label("//cc/toolchains/actions:c_compile"),
+ Label("//cc/toolchains/actions:cpp_compile"),
+ Label("//cc/toolchains/actions:cpp_header_parsing"),
+ ],
+ # There are no actions listed for coverage and objcopy in action_names.bzl.
+ "coverage_files": [],
+ "dwp_files": [
+ Label("//cc/toolchains/actions:dwp"),
+ ],
+ "linker_files": [
+ Label("//cc/toolchains/actions:cpp_link_dynamic_library"),
+ Label("//cc/toolchains/actions:cpp_link_nodeps_dynamic_library"),
+ Label("//cc/toolchains/actions:cpp_link_executable"),
+ ],
+ "objcopy_files": [],
+ "strip_files": [
+ Label("//cc/toolchains/actions:strip"),
+ ],
+}
diff --git a/cc/toolchains/toolchain.bzl b/cc/toolchains/toolchain.bzl
index fa41163ab..a97f37b6b 100644
--- a/cc/toolchains/toolchain.bzl
+++ b/cc/toolchains/toolchain.bzl
@@ -13,7 +13,9 @@
# limitations under the License.
"""Implementation of the cc_toolchain rule."""
+load("@bazel_features//private:util.bzl", _bazel_version_ge = "ge")
load("//cc/toolchains:cc_toolchain.bzl", _cc_toolchain = "cc_toolchain")
+load("//cc/toolchains:legacy_file_group.bzl", "LEGACY_FILE_GROUPS")
load(
"//cc/toolchains/impl:toolchain_config.bzl",
"cc_legacy_file_group",
@@ -22,38 +24,6 @@ load(
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": [
- Label("//cc/toolchains/actions:ar_actions"),
- ],
- "as_files": [
- Label("//cc/toolchains/actions:assembly_actions"),
- ],
- "compiler_files": [
- Label("//cc/toolchains/actions:cc_flags_make_variable"),
- Label("//cc/toolchains/actions:c_compile"),
- Label("//cc/toolchains/actions:cpp_compile"),
- Label("//cc/toolchains/actions:cpp_header_parsing"),
- ],
- # There are no actions listed for coverage and objcopy in action_names.bzl.
- "coverage_files": [],
- "dwp_files": [
- Label("//cc/toolchains/actions:dwp"),
- ],
- "linker_files": [
- Label("//cc/toolchains/actions:cpp_link_dynamic_library"),
- Label("//cc/toolchains/actions:cpp_link_nodeps_dynamic_library"),
- Label("//cc/toolchains/actions:cpp_link_executable"),
- ],
- "objcopy_files": [],
- "strip_files": [
- Label("//cc/toolchains/actions:strip"),
- ],
-}
-
def cc_toolchain(
*,
name,
@@ -161,9 +131,40 @@ def cc_toolchain(
**kwargs: [common attributes](https://bazel.build/reference/be/common-definitions#common-attributes)
that should be applied to all rules created by this macro.
"""
+
cc_toolchain_visibility = kwargs.pop("visibility", default = None)
- for group in _LEGACY_FILE_GROUPS:
+ if _bazel_version_ge("9.0.0-pre.20250911"):
+ _cc_toolchain(
+ name = name,
+ tool_map = tool_map,
+ args = args,
+ artifact_name_patterns = artifact_name_patterns,
+ make_variables = make_variables,
+ known_features = known_features,
+ enabled_features = enabled_features,
+ compiler = compiler,
+ cpu = select({
+ Label("//cc/toolchains/impl:darwin_aarch64"): "darwin_arm64",
+ Label("//cc/toolchains/impl:darwin_x86_64"): "darwin_x86_64",
+ Label("//cc/toolchains/impl:linux_aarch64"): "aarch64",
+ Label("//cc/toolchains/impl:linux_x86_64"): "k8",
+ Label("//cc/toolchains/impl:windows_x86_32"): "win32",
+ Label("//cc/toolchains/impl:windows_x86_64"): "win64",
+ "//conditions:default": "",
+ }),
+ dynamic_runtime_lib = dynamic_runtime_lib,
+ libc_top = libc_top,
+ module_map = module_map,
+ static_runtime_lib = static_runtime_lib,
+ supports_header_parsing = supports_header_parsing,
+ supports_param_files = supports_param_files,
+ visibility = cc_toolchain_visibility,
+ **kwargs
+ )
+ return
+
+ for group in LEGACY_FILE_GROUPS:
if group in kwargs:
fail("Don't use legacy file groups such as %s. Instead, associate files with `cc_tool` or `cc_args` rules." % group)
@@ -192,7 +193,7 @@ def cc_toolchain(
# Provides ar_files, compiler_files, linker_files, ...
legacy_file_groups = {}
- for group, actions in _LEGACY_FILE_GROUPS.items():
+ for group, actions in LEGACY_FILE_GROUPS.items():
group_name = "_{}_{}".format(name, group)
cc_legacy_file_group(
name = group_name,
diff --git a/examples/rule_based_toolchain/MODULE.bazel b/examples/rule_based_toolchain/MODULE.bazel
index cdd551733..340b03b03 100644
--- a/examples/rule_based_toolchain/MODULE.bazel
+++ b/examples/rule_based_toolchain/MODULE.bazel
@@ -4,7 +4,7 @@ module(
)
bazel_dep(name = "platforms", version = "0.0.10")
-bazel_dep(name = "googletest", version = "1.15.2")
+bazel_dep(name = "googletest", version = "1.17.0.bcr.2")
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "rules_cc")
local_path_override(
diff --git a/examples/rule_based_toolchain/quick_test.cc b/examples/rule_based_toolchain/quick_test.cc
index a50fded7f..047a7fa29 100644
--- a/examples/rule_based_toolchain/quick_test.cc
+++ b/examples/rule_based_toolchain/quick_test.cc
@@ -27,5 +27,6 @@ TEST(Dynamic, ProperlyLinked) {
}
TEST(Asm, ProperlyLinked) {
- EXPECT_EQ(asm_answer, 0xFE4B67C4);
+ constexpr int kExpectedAsmAnswer = static_cast