| # 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:nested_args.bzl", | |
| "NESTED_ARGS_ATTRS", | |
| "nested_args_provider_from_ctx", | |
| ) | |
| load( | |
| ":cc_toolchain_info.bzl", | |
| "NestedArgsInfo", | |
| ) | |
| visibility("public") | |
| _cc_nested_args = rule( | |
| implementation = lambda ctx: [nested_args_provider_from_ctx(ctx)], | |
| attrs = NESTED_ARGS_ATTRS, | |
| provides = [NestedArgsInfo], | |
| doc = """Declares a list of arguments bound to a set of actions. | |
| Roughly equivalent to ctx.actions.args() | |
| Examples: | |
| cc_nested_args( | |
| name = "warnings_as_errors", | |
| args = ["-Werror"], | |
| ) | |
| """, | |
| ) | |
| def cc_nested_args( | |
| *, | |
| name, | |
| args = None, | |
| data = None, | |
| format = {}, | |
| iterate_over = None, | |
| nested = None, | |
| requires_not_none = None, | |
| requires_none = None, | |
| requires_true = None, | |
| requires_false = None, | |
| requires_equal = None, | |
| requires_equal_value = None, | |
| **kwargs): | |
| """Nested arguments for use in more complex `cc_args` expansions. | |
| While this rule is very similar in shape to `cc_args`, it is intended to be used as a | |
| dependency of `cc_args` to provide additional arguments that should be applied to the | |
| same actions as defined by the parent `cc_args` rule. The key motivation for this rule | |
| is to allow for more complex variable-based argument expensions. | |
| Prefer expressing collections of arguments as `cc_args` and | |
| `cc_args_list` rules when possible. | |
| For living examples of how this rule is used, see the usages here: | |
| https://github.com/bazelbuild/rules_cc/tree/main/cc/toolchains/args/runtime_library_search_directories/BUILD | |
| https://github.com/bazelbuild/rules_cc/tree/main/cc/toolchains/args/libraries_to_link/BUILD | |
| Note: These examples are non-trivial, but they illustrate when it is absolutely necessary to | |
| use this rule. | |
| Args: | |
| name: (str) The name of the target. | |
| args: (List[str]) The command-line arguments that are applied by using this rule. This is | |
| mutually exclusive with [nested](#cc_nested_args-nested). | |
| data: (List[Label]) A list of runtime data dependencies that are required for these | |
| arguments to work as intended. | |
| format: (Dict[str, Label]) A mapping of format strings to the label of the corresponding | |
| `cc_variable` that the value should be pulled from. All instances of | |
| `{variable_name}` will be replaced with the expanded value of `variable_name` in this | |
| dictionary. The complete list of possible variables can be found in | |
| https://github.com/bazelbuild/rules_cc/tree/main/cc/toolchains/variables/BUILD. | |
| It is not possible to declare custom variables--these are inherent to Bazel itself. | |
| iterate_over: (Label) The label of a `cc_variable` that should be iterated | |
| over. This is intended for use with built-in variables that are lists. | |
| nested: (List[Label]) A list of `cc_nested_args` rules that should be | |
| expanded to command-line arguments when this rule is used. This is mutually exclusive | |
| with [args](#cc_nested_args-args). | |
| requires_not_none: (Label) The label of a `cc_variable` that should be checked | |
| for existence before expanding this rule. If the variable is None, this rule will be | |
| ignored. | |
| requires_none: (Label) The label of a `cc_variable` that should be checked for | |
| non-existence before expanding this rule. If the variable is not None, this rule will be | |
| ignored. | |
| requires_true: (Label) The label of a `cc_variable` that should be checked for | |
| truthiness before expanding this rule. If the variable is false, this rule will be | |
| ignored. | |
| requires_false: (Label) The label of a `cc_variable` that should be checked | |
| for falsiness before expanding this rule. If the variable is true, this rule will be | |
| ignored. | |
| requires_equal: (Label) The label of a `cc_variable` that should be checked | |
| for equality before expanding this rule. If the variable is not equal to | |
| (requires_equal_value)[#cc_nested_args-requires_equal_value], this rule will be ignored. | |
| requires_equal_value: (str) The value to compare | |
| (requires_equal)[#cc_nested_args-requires_equal] against. | |
| **kwargs: [common attributes](https://bazel.build/reference/be/common-definitions#common-attributes) that should be applied to this rule. | |
| """ | |
| return _cc_nested_args( | |
| name = name, | |
| args = args, | |
| data = data, | |
| # We flip the key/value pairs in the dictionary here because Bazel doesn't have a | |
| # string-keyed label dict attribute type. | |
| format = {k: v for v, k in format.items()}, | |
| iterate_over = iterate_over, | |
| nested = nested, | |
| requires_not_none = requires_not_none, | |
| requires_none = requires_none, | |
| requires_true = requires_true, | |
| requires_false = requires_false, | |
| requires_equal = requires_equal, | |
| requires_equal_value = requires_equal_value, | |
| **kwargs | |
| ) |