diff options
Diffstat (limited to 'cc/toolchains/args.bzl')
-rw-r--r-- | cc/toolchains/args.bzl | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/cc/toolchains/args.bzl b/cc/toolchains/args.bzl new file mode 100644 index 0000000..1df3333 --- /dev/null +++ b/cc/toolchains/args.bzl @@ -0,0 +1,120 @@ +# 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. +"""All providers for rule-based bazel toolchain config.""" + +load("//cc/toolchains/impl:args_utils.bzl", "validate_nested_args") +load( + "//cc/toolchains/impl:collect.bzl", + "collect_action_types", + "collect_files", + "collect_provider", +) +load( + "//cc/toolchains/impl:nested_args.bzl", + "NESTED_ARGS_ATTRS", + "args_wrapper_macro", + "nested_args_provider_from_ctx", +) +load( + ":cc_toolchain_info.bzl", + "ActionTypeSetInfo", + "ArgsInfo", + "ArgsListInfo", + "BuiltinVariablesInfo", + "FeatureConstraintInfo", +) + +visibility("public") + +def _cc_args_impl(ctx): + actions = collect_action_types(ctx.attr.actions) + + if not ctx.attr.args and not ctx.attr.nested and not ctx.attr.env: + fail("cc_args requires at least one of args, nested, and env") + + nested = None + if ctx.attr.args or ctx.attr.nested: + nested = nested_args_provider_from_ctx(ctx) + validate_nested_args( + variables = ctx.attr._variables[BuiltinVariablesInfo].variables, + nested_args = nested, + actions = actions.to_list(), + label = ctx.label, + ) + files = nested.files + else: + files = collect_files(ctx.attr.data) + + requires = collect_provider(ctx.attr.requires_any_of, FeatureConstraintInfo) + + args = ArgsInfo( + label = ctx.label, + actions = actions, + requires_any_of = tuple(requires), + nested = nested, + env = ctx.attr.env, + files = files, + ) + return [ + args, + ArgsListInfo( + label = ctx.label, + args = tuple([args]), + files = files, + by_action = tuple([ + struct(action = action, args = tuple([args]), files = files) + for action in actions.to_list() + ]), + ), + ] + +_cc_args = rule( + implementation = _cc_args_impl, + attrs = { + "actions": attr.label_list( + providers = [ActionTypeSetInfo], + mandatory = True, + doc = """A list of action types that this flag set applies to. + +See @rules_cc//cc/toolchains/actions:all for valid options. +""", + ), + "env": attr.string_dict( + doc = "Environment variables to be added to the command-line.", + ), + "requires_any_of": attr.label_list( + providers = [FeatureConstraintInfo], + doc = """This will be enabled when any of the constraints are met. + +If omitted, this flag set will be enabled unconditionally. +""", + ), + "_variables": attr.label( + default = "//cc/toolchains/variables:variables", + ), + } | NESTED_ARGS_ATTRS, + provides = [ArgsInfo], + doc = """Declares a list of arguments bound to a set of actions. + +Roughly equivalent to ctx.actions.args() + +Examples: + cc_args( + name = "warnings_as_errors", + args = ["-Werror"], + ) +""", +) + +cc_args = lambda **kwargs: args_wrapper_macro(rule = _cc_args, **kwargs) |