| // Copyright 2015 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. |
| package com.google.devtools.build.lib.rules.android; |
| |
| import com.google.common.base.Preconditions; |
| import com.google.devtools.build.lib.actions.Artifact; |
| import com.google.devtools.build.lib.cmdline.Label; |
| import com.google.devtools.build.lib.collect.nestedset.NestedSet; |
| import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; |
| import com.google.devtools.build.lib.collect.nestedset.Order; |
| import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; |
| import com.google.devtools.build.lib.packages.BuiltinProvider; |
| import com.google.devtools.build.lib.packages.NativeInfo; |
| import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidResourcesInfoApi; |
| import com.google.devtools.build.lib.syntax.Depset; |
| import com.google.devtools.build.lib.syntax.EvalException; |
| |
| /** A provider that supplies ResourceContainers from its transitive closure. */ |
| @Immutable |
| public class AndroidResourcesInfo extends NativeInfo |
| implements AndroidResourcesInfoApi<Artifact, ValidatedAndroidResources, AndroidManifestInfo> { |
| |
| public static final String PROVIDER_NAME = "AndroidResourcesInfo"; |
| public static final Provider PROVIDER = new Provider(); |
| |
| /* |
| * Local information about the target that produced this provider, for tooling. These values will |
| * be made available even if they should not be inherited (for example, if this target has |
| * "neverlink" set) - do not inherit them directly. |
| */ |
| |
| // Lets us know where the provider came from |
| private final Label label; |
| |
| // An updated manifest - resource processing sometimes does additional manifest processing |
| // TODO(b/30817309): Remove this once resource processing no longer does manifest processing |
| private final AndroidManifestInfo manifest; |
| |
| // An R.txt file containing a list of all transitive resources this target expected |
| private final Artifact rTxt; |
| |
| /* |
| * Transitive information used for resource processing |
| */ |
| |
| private final NestedSet<ValidatedAndroidResources> transitiveAndroidResources; |
| private final NestedSet<ValidatedAndroidResources> directAndroidResources; |
| private final NestedSet<Artifact> transitiveResources; |
| private final NestedSet<Artifact> transitiveManifests; |
| private final NestedSet<Artifact> transitiveAapt2RTxt; |
| private final NestedSet<Artifact> transitiveAapt2ValidationArtifacts; |
| private final NestedSet<Artifact> transitiveSymbolsBin; |
| private final NestedSet<Artifact> transitiveCompiledSymbols; |
| private final NestedSet<Artifact> transitiveStaticLib; |
| private final NestedSet<Artifact> transitiveRTxt; |
| |
| AndroidResourcesInfo( |
| Label label, |
| AndroidManifestInfo manifest, |
| Artifact rTxt, |
| NestedSet<ValidatedAndroidResources> transitiveAndroidResources, |
| NestedSet<ValidatedAndroidResources> directAndroidResources, |
| NestedSet<Artifact> transitiveResources, |
| NestedSet<Artifact> transitiveManifests, |
| NestedSet<Artifact> transitiveAapt2RTxt, |
| NestedSet<Artifact> transitiveAapt2ValidationArtifacts, |
| NestedSet<Artifact> transitiveSymbolsBin, |
| NestedSet<Artifact> transitiveCompiledSymbols, |
| NestedSet<Artifact> transitiveStaticLib, |
| NestedSet<Artifact> transitiveRTxt) { |
| super(PROVIDER); |
| this.label = label; |
| this.manifest = manifest; |
| this.rTxt = rTxt; |
| this.transitiveAndroidResources = transitiveAndroidResources; |
| this.directAndroidResources = directAndroidResources; |
| this.transitiveResources = transitiveResources; |
| this.transitiveManifests = transitiveManifests; |
| this.transitiveAapt2RTxt = transitiveAapt2RTxt; |
| this.transitiveAapt2ValidationArtifacts = transitiveAapt2ValidationArtifacts; |
| this.transitiveSymbolsBin = transitiveSymbolsBin; |
| this.transitiveCompiledSymbols = transitiveCompiledSymbols; |
| this.transitiveStaticLib = transitiveStaticLib; |
| this.transitiveRTxt = transitiveRTxt; |
| } |
| |
| @Override |
| public Label getLabel() { |
| return label; |
| } |
| |
| @Override |
| public AndroidManifestInfo getManifest() { |
| return manifest; |
| } |
| |
| @Override |
| public Artifact getRTxt() { |
| return rTxt; |
| } |
| |
| @Override |
| public Depset /*<ValidatedAndroidResources>*/ getTransitiveAndroidResourcesForStarlark() { |
| return Depset.of(ValidatedAndroidResources.TYPE, transitiveAndroidResources); |
| } |
| |
| public NestedSet<ValidatedAndroidResources> getTransitiveAndroidResources() { |
| return transitiveAndroidResources; |
| } |
| |
| @Override |
| public Depset /*<ValidatedAndroidResources>*/ getDirectAndroidResourcesForStarlark() { |
| return Depset.of(ValidatedAndroidResources.TYPE, directAndroidResources); |
| } |
| |
| public NestedSet<ValidatedAndroidResources> getDirectAndroidResources() { |
| return directAndroidResources; |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveResourcesForStarlark() { |
| return Depset.of(Artifact.TYPE, transitiveResources); |
| } |
| |
| public NestedSet<Artifact> getTransitiveResources() { |
| return transitiveResources; |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveManifestsForStarlark() { |
| return Depset.of(Artifact.TYPE, transitiveManifests); |
| } |
| |
| public NestedSet<Artifact> getTransitiveManifests() { |
| return transitiveManifests; |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveAapt2RTxtForStarlark() { |
| return Depset.of(Artifact.TYPE, transitiveAapt2RTxt); |
| } |
| |
| public NestedSet<Artifact> getTransitiveAapt2RTxt() { |
| return transitiveAapt2RTxt; |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveAapt2ValidationArtifactsForStarlark() { |
| return Depset.of(Artifact.TYPE, transitiveAapt2ValidationArtifacts); |
| } |
| |
| NestedSet<Artifact> getTransitiveAapt2ValidationArtifacts() { |
| return transitiveAapt2ValidationArtifacts; |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveSymbolsBinForStarlark() { |
| return Depset.of(Artifact.TYPE, transitiveSymbolsBin); |
| } |
| |
| public NestedSet<Artifact> getTransitiveSymbolsBin() { |
| return transitiveSymbolsBin; |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveCompiledSymbolsForStarlark() { |
| return Depset.of(Artifact.TYPE, transitiveCompiledSymbols); |
| } |
| |
| NestedSet<Artifact> getTransitiveCompiledSymbols() { |
| return transitiveCompiledSymbols; |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveStaticLibForStarlark() { |
| return Depset.of(Artifact.TYPE, transitiveStaticLib); |
| } |
| |
| NestedSet<Artifact> getTransitiveStaticLib() { |
| return transitiveStaticLib; |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveRTxtForStarlark() { |
| return Depset.of(Artifact.TYPE, transitiveRTxt); |
| } |
| |
| NestedSet<Artifact> getTransitiveRTxt() { |
| return transitiveRTxt; |
| } |
| |
| /** Provider for {@link AndroidResourcesInfo}. */ |
| public static class Provider extends BuiltinProvider<AndroidResourcesInfo> |
| implements AndroidResourcesInfoApi.AndroidResourcesInfoApiProvider< |
| Artifact, ValidatedAndroidResources, AndroidManifestInfo> { |
| |
| private Provider() { |
| super(PROVIDER_NAME, AndroidResourcesInfo.class); |
| } |
| |
| @Override |
| public AndroidResourcesInfo createInfo( |
| Label label, |
| AndroidManifestInfo manifest, |
| Artifact rTxt, |
| Depset transitiveAndroidResources, |
| Depset directAndroidResources, |
| Depset transitiveResources, |
| Depset transitiveManifests, |
| Depset transitiveAapt2RTxt, |
| Depset transitiveSymbolsBin, |
| Depset transitiveCompiledSymbols, |
| Depset transitiveStaticLib, |
| Depset transitiveRTxt, |
| Object transitiveAapt2ValidationArtifacts) |
| throws EvalException { |
| return new AndroidResourcesInfo( |
| label, |
| manifest, |
| rTxt, |
| nestedSet( |
| transitiveAndroidResources, |
| ValidatedAndroidResources.class, |
| "transitive_android_resources"), |
| nestedSet( |
| directAndroidResources, ValidatedAndroidResources.class, "direct_android_resources"), |
| nestedSet(transitiveResources, Artifact.class, "transitive_resources"), |
| nestedSet(transitiveManifests, Artifact.class, "transitive_manifests"), |
| nestedSet(transitiveAapt2RTxt, Artifact.class, "transitive_aapt2_r_txt"), |
| nestedSet(transitiveAapt2ValidationArtifacts, Artifact.class, "validation_artifacts"), |
| nestedSet(transitiveSymbolsBin, Artifact.class, "transitive_symbols_bin"), |
| nestedSet(transitiveCompiledSymbols, Artifact.class, "transitive_compiled_symbols"), |
| nestedSet(transitiveStaticLib, Artifact.class, "transitive_static_lib"), |
| nestedSet(transitiveRTxt, Artifact.class, "transitive_r_txt")); |
| } |
| |
| private static <T> NestedSet<T> nestedSet(Depset from, Class<T> with, String fieldName) |
| throws EvalException { |
| return NestedSetBuilder.<T>stableOrder() |
| .addTransitive(from.getSetFromParam(with, fieldName)) |
| .build(); |
| } |
| |
| private static <T> NestedSet<T> nestedSet(Object from, Class<T> with, String fieldName) |
| throws EvalException { |
| Preconditions.checkArgument( |
| from instanceof Depset || from == com.google.devtools.build.lib.syntax.Starlark.UNBOUND); |
| |
| if (from instanceof Depset) { |
| return nestedSet((Depset) from, with, fieldName); |
| } |
| return NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); |
| } |
| } |
| } |