Add a use_cc_toolchain helper to rules_cc. Part of github.com/bazelbuild/bazel/issues/14727. PiperOrigin-RevId: 449499388 Change-Id: I9fb5fecd1059b0d48a26e89d1c25d54fd2348b55
diff --git a/cc/find_cc_toolchain.bzl b/cc/find_cc_toolchain.bzl index 463e79a..05a6952 100644 --- a/cc/find_cc_toolchain.bzl +++ b/cc/find_cc_toolchain.bzl
@@ -14,7 +14,10 @@ # limitations under the License. """ -Returns the current `CcToolchainInfo`. +Helpers for CC Toolchains. + +Rules that require a CC toolchain should call `use_cc_toolchain` and `find_cc_toolchain` +to depend on and find a cc toolchain. * When https://github.com/bazelbuild/bazel/issues/7260 is **not** flipped, current C++ toolchain is selected using the legacy mechanism (`--crosstool_top`, @@ -37,11 +40,11 @@ (`--platforms`). For that to work the rule needs to declare a dependency on C++ toolchain type: + load(":find_cc_toolchain/bzl", "use_cc_toolchain") + foo = rule( implementation = _foo_impl, - toolchains = [ - "@bazel_tools//tools/cpp:toolchain_type", # copybara-use-repo-external-label - ], + toolchains = use_cc_toolchain(), ) We advise to depend on both `_cc_toolchain` attr and on the toolchain type for @@ -50,6 +53,8 @@ Bazel version is not needed), it's enough to only keep the toolchain type. """ +CC_TOOLCHAIN_TYPE = "@bazel_tools//tools/cpp:toolchain_type" # copybara-use-repo-external-label + def find_cc_toolchain(ctx): """ Returns the current `CcToolchainInfo`. @@ -63,9 +68,9 @@ # Check the incompatible flag for toolchain resolution. if hasattr(cc_common, "is_cc_toolchain_resolution_enabled_do_not_use") and cc_common.is_cc_toolchain_resolution_enabled_do_not_use(ctx = ctx): - if not "@bazel_tools//tools/cpp:toolchain_type" in ctx.toolchains: # copybara-use-repo-external-label + if not CC_TOOLCHAIN_TYPE in ctx.toolchains: fail("In order to use find_cc_toolchain, your rule has to depend on C++ toolchain. See find_cc_toolchain.bzl docs for details.") - toolchain_info = ctx.toolchains["@bazel_tools//tools/cpp:toolchain_type"] # copybara-use-repo-external-label + toolchain_info = ctx.toolchains[CC_TOOLCHAIN_TYPE] if hasattr(toolchain_info, "cc_provider_in_toolchain") and hasattr(toolchain_info, "cc"): return toolchain_info.cc return toolchain_info @@ -87,3 +92,24 @@ A CcToolchainInfo. """ return find_cc_toolchain(ctx) + +# buildifier: disable=unused-variable +def use_cc_toolchain(mandatory = True): + """ + Helper to depend on the cc toolchain. + + Usage: + ``` + my_rule = rule( + toolchains = [other toolchain types] + use_cc_toolchain(), + ) + ``` + + Args: + mandatory: Whether or not it should be an error if the toolchain cannot be resolved. + Currently ignored, this will be enabled when optional toolchain types are added. + + Returns: + A list that can be used as the value for `rule.toolchains`. + """ + return [CC_TOOLCHAIN_TYPE]