# 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_tool_capability rule.""" load( ":cc_toolchain_info.bzl", "ArgsListInfo", "FeatureConstraintInfo", "FeatureInfo", "ToolCapabilityInfo", ) def _cc_tool_capability_impl(ctx): ft = FeatureInfo( name = ctx.attr.feature_name or ctx.label.name, label = ctx.label, enabled = False, args = ArgsListInfo( label = ctx.label, args = (), files = depset(), by_action = (), allowlist_include_directories = depset(), ), implies = depset(), requires_any_of = (), mutually_exclusive = (), # Mark it as external so that it doesn't complain if we say # "requires" on a constraint that was never referenced elsewhere # in the toolchain. external = True, overridable = True, overrides = None, allowlist_include_directories = depset(), ) return [ ToolCapabilityInfo(label = ctx.label, feature = ft), # Only give it a feature constraint info and not a feature info. # This way you can't imply it - you can only require it. FeatureConstraintInfo(label = ctx.label, all_of = depset([ft])), ] cc_tool_capability = rule( implementation = _cc_tool_capability_impl, provides = [ToolCapabilityInfo, FeatureConstraintInfo], doc = """A capability is an optional feature that a tool supports. For example, not all compilers support PIC, so to handle this, we write: ``` cc_tool( name = "clang", src = "@host_tools/bin/clang", capabilities = [ "//cc/toolchains/capabilities:supports_pic", ], ) cc_args( name = "pic", requires = [ "//cc/toolchains/capabilities:supports_pic" ], args = ["-fPIC"], ) ``` This ensures that `-fPIC` is added to the command-line only when we are using a tool that supports PIC. """, attrs = { "feature_name": attr.string(doc = "The name of the feature to generate for this capability"), }, )