| # Copyright 2020 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. |
| |
| """Bazel Android Proguard library for the Android rules.""" |
| |
| _ProguardContextInfo = provider( |
| doc = "Contains data from processing Proguard specs.", |
| fields = dict( |
| proguard_configs = "The direct proguard configs", |
| transitive_proguard_configs = |
| "The proguard configs within the transitive closure of the target", |
| providers = "The list of all providers to propagate.", |
| ), |
| ) |
| |
| def _validate_proguard_spec( |
| ctx, |
| out_validated_proguard_spec, |
| proguard_spec, |
| proguard_allowlister): |
| args = ctx.actions.args() |
| args.add("--path", proguard_spec) |
| args.add("--output", out_validated_proguard_spec) |
| |
| ctx.actions.run( |
| executable = proguard_allowlister, |
| arguments = [args], |
| inputs = [proguard_spec], |
| outputs = [out_validated_proguard_spec], |
| mnemonic = "ValidateProguard", |
| progress_message = ( |
| "Validating proguard configuration %s" % proguard_spec.short_path |
| ), |
| ) |
| |
| def _process( |
| ctx, |
| proguard_configs = [], |
| proguard_spec_providers = [], |
| proguard_allowlister = None): |
| """Processes Proguard Specs |
| |
| Args: |
| ctx: The context. |
| proguard_configs: sequence of Files. A list of proguard config files to be |
| processed. Optional. |
| proguard_spec_providers: sequence of ProguardSpecProvider providers. A |
| list of providers from the dependencies, exports, plugins, |
| exported_plugins, etc. Optional. |
| proguard_allowlister: The proguard_allowlister exeutable provider. |
| |
| Returns: |
| A _ProguardContextInfo provider. |
| """ |
| |
| # TODO(djwhang): Look to see if this can be just a validation action and the |
| # proguard_spec provided by the rule can be propagated. |
| validated_proguard_configs = [] |
| for proguard_spec in proguard_configs: |
| validated_proguard_spec = ctx.actions.declare_file( |
| "validated_proguard/%s/%s_valid" % |
| (ctx.label.name, proguard_spec.path), |
| ) |
| _validate_proguard_spec( |
| ctx, |
| validated_proguard_spec, |
| proguard_spec, |
| proguard_allowlister, |
| ) |
| validated_proguard_configs.append(validated_proguard_spec) |
| |
| transitive_validated_proguard_configs = [] |
| for info in proguard_spec_providers: |
| transitive_validated_proguard_configs.append(info.specs) |
| |
| transitive_proguard_configs = depset( |
| validated_proguard_configs, |
| transitive = transitive_validated_proguard_configs, |
| order = "preorder", |
| ) |
| return _ProguardContextInfo( |
| proguard_configs = proguard_configs, |
| transitive_proguard_configs = transitive_proguard_configs, |
| providers = [ |
| ProguardSpecProvider(transitive_proguard_configs), |
| # TODO(b/152659272): Remove this once the android_archive rule is |
| # able to process a transitive closure of deps to produce an aar. |
| AndroidProguardInfo(proguard_configs), |
| ], |
| ) |
| |
| proguard = struct( |
| process = _process, |
| ) |
| |
| testing = struct( |
| validate_proguard_spec = _validate_proguard_spec, |
| ProguardContextInfo = _ProguardContextInfo, |
| ) |