aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
diff options
context:
space:
mode:
authorGravatar Michael Staib <mstaib@google.com>2015-10-05 15:58:23 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2015-10-06 07:03:20 +0000
commit6817a6fcdd4275f9d3d4c3b9451a6c4144adcee1 (patch)
tree83a0a735ac0c48f777ed4a8ac06881262e2a2e50 /src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
parent1c0543c626bf29eda95348c5c97391bc5d372fa3 (diff)
Allow Java libraries to export and propagate proguard_specs.
It may be the case that a library used by Java clients is also used by Android clients, but when used for the latter, it requires a particular Proguard configuration. This change modifies Java library rules to accept Proguard specs and pass them up to Android rules. Note that this does not cause Proguard to be used on normal Java binaries. RELNOTES[NEW]: java_library now supports the proguard_specs attribute for passing Proguard configuration up to Android (not Java) binaries. -- MOS_MIGRATED_REVID=104661799
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java48
1 files changed, 3 insertions, 45 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
index 67156b0ba8..bb90189242 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
@@ -17,13 +17,11 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.config.CompilationMode;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -39,10 +37,11 @@ import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
+import com.google.devtools.build.lib.rules.java.ProguardLibrary;
+import com.google.devtools.build.lib.rules.java.ProguardSpecProvider;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.vfs.PathFragment;
-import java.util.Collection;
import java.util.List;
/**
@@ -69,7 +68,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
NestedSet<LinkerInput> transitiveNativeLibraries =
AndroidCommon.collectTransitiveNativeLibraries(deps);
NestedSet<Artifact> transitiveProguardConfigs =
- collectTransitiveProguardConfigs(ruleContext);
+ new ProguardLibrary(ruleContext).collectProguardSpecs();
JavaCommon javaCommon = new JavaCommon(ruleContext, javaSemantics);
AndroidCommon androidCommon = new AndroidCommon(ruleContext, javaCommon);
@@ -238,46 +237,5 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
}
return builder;
}
-
- private NestedSet<Artifact> collectTransitiveProguardConfigs(RuleContext ruleContext) {
- NestedSetBuilder<Artifact> specsBuilder = NestedSetBuilder.naiveLinkOrder();
-
- for (ProguardSpecProvider dep : ruleContext.getPrerequisites(
- "deps", Mode.TARGET, ProguardSpecProvider.class)) {
- specsBuilder.addTransitive(dep.getTransitiveProguardSpecs());
- }
-
- // Pass our local proguard configs through the validator, which checks a whitelist.
- if (!getProguardConfigs(ruleContext).isEmpty()) {
- FilesToRunProvider proguardWhitelister = ruleContext
- .getExecutablePrerequisite("$proguard_whitelister", Mode.HOST);
- for (Artifact specToValidate : getProguardConfigs(ruleContext)) {
- //If we're validating j/a/b/testapp/proguard.cfg, the output will be:
- //j/a/b/testapp/proguard.cfg_valid
- Artifact output = ruleContext.getUniqueDirectoryArtifact(
- "validated_proguard",
- specToValidate.getRootRelativePath().replaceName(
- specToValidate.getFilename() + "_valid"),
- ruleContext.getBinOrGenfilesDirectory());
- ruleContext.registerAction(new SpawnAction.Builder()
- .addInput(specToValidate)
- .setExecutable(proguardWhitelister)
- .setProgressMessage("Validating proguard configuration")
- .setMnemonic("ValidateProguard")
- .addArgument("--path")
- .addArgument(specToValidate.getExecPathString())
- .addArgument("--output")
- .addArgument(output.getExecPathString())
- .addOutput(output)
- .build(ruleContext));
- specsBuilder.add(output);
- }
- }
- return specsBuilder.build();
- }
-
- private Collection<Artifact> getProguardConfigs(RuleContext ruleContext) {
- return ruleContext.getPrerequisiteArtifacts("proguard_specs", Mode.TARGET).list();
- }
}