| # Copyright 2021 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. | |
| """ | |
| Proguard | |
| """ | |
| load("//java/common:java_semantics.bzl", "semantics") | |
| load("//java/common:proguard_spec_info.bzl", "ProguardSpecInfo") | |
| visibility("private") | |
| def _filter_provider(provider, *attrs): | |
| return [dep[provider] for attr in attrs for dep in attr if provider in dep] | |
| def _validate_spec(ctx, spec_file): | |
| validated_proguard_spec = ctx.actions.declare_file( | |
| "validated_proguard/%s/%s_valid" % (ctx.label.name, spec_file.path), | |
| ) | |
| toolchain = semantics.find_java_toolchain(ctx) | |
| args = ctx.actions.args() | |
| args.add("--path", spec_file) | |
| args.add("--output", validated_proguard_spec) | |
| ctx.actions.run( | |
| mnemonic = "ValidateProguard", | |
| progress_message = "Validating proguard configuration %{input}", | |
| executable = toolchain.proguard_allowlister, | |
| arguments = [args], | |
| inputs = [spec_file], | |
| outputs = [validated_proguard_spec], | |
| toolchain = Label(semantics.JAVA_TOOLCHAIN_TYPE), | |
| ) | |
| return validated_proguard_spec | |
| def validate_proguard_specs(ctx, proguard_specs = [], transitive_attrs = []): | |
| """ | |
| Creates actions that validate Proguard specification and returns ProguardSpecProvider. | |
| Use transtive_attrs parameter to collect Proguard validations from `deps`, | |
| `runtime_deps`, `exports`, `plugins`, and `exported_plugins` attributes. | |
| Args: | |
| ctx: (RuleContext) Used to register the actions. | |
| proguard_specs: (list[File]) List of Proguard specs files. | |
| transitive_attrs: (list[list[Target]]) Attributes to collect transitive | |
| proguard validations from. | |
| Returns: | |
| (ProguardSpecProvider) A ProguardSpecProvider. | |
| """ | |
| proguard_validations = _filter_provider(ProguardSpecInfo, *transitive_attrs) | |
| return ProguardSpecInfo( | |
| depset( | |
| [_validate_spec(ctx, spec_file) for spec_file in proguard_specs], | |
| transitive = [validation.specs for validation in proguard_validations], | |
| ), | |
| ) |