Add support for the `mandatory` param to `find_cc_toolchain` in `@rules_cc`
PiperOrigin-RevId: 671758214
Change-Id: I37d0ca1f9b083513cb5933984153e1ba608313ca
diff --git a/cc/find_cc_toolchain.bzl b/cc/find_cc_toolchain.bzl
index d2f2d9f..4129680 100644
--- a/cc/find_cc_toolchain.bzl
+++ b/cc/find_cc_toolchain.bzl
@@ -55,15 +55,18 @@
CC_TOOLCHAIN_TYPE = "@bazel_tools//tools/cpp:toolchain_type" # copybara-use-repo-external-label
-def find_cc_toolchain(ctx):
+def find_cc_toolchain(ctx, *, mandatory = True):
"""
Returns the current `CcToolchainInfo`.
Args:
ctx: The rule context for which to find a toolchain.
+ mandatory: (bool) If this is set to False, this function will return None
+ rather than fail if no toolchain is found.
Returns:
- A CcToolchainInfo.
+ A CcToolchainInfo or None if the c++ toolchain is declared as
+ optional, mandatory is False and no toolchain has been found.
"""
# Check the incompatible flag for toolchain resolution.
@@ -72,6 +75,9 @@
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[CC_TOOLCHAIN_TYPE]
if toolchain_info == None:
+ if not mandatory:
+ return None
+
# No cpp toolchain was found, so report an error.
fail("Unable to find a CC toolchain using toolchain resolution. Target: %s, Platform: %s, Exec platform: %s" %
(ctx.label, ctx.fragments.platform.platform, ctx.fragments.platform.host_platform))
@@ -84,6 +90,8 @@
return ctx.attr._cc_toolchain[cc_common.CcToolchainInfo]
# We didn't find anything.
+ if not mandatory:
+ return None
fail("In order to use find_cc_toolchain, your rule has to depend on C++ toolchain. See find_cc_toolchain.bzl docs for details.")
def find_cpp_toolchain(ctx):