| # 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 |
| ) |