diff options
author | 2015-10-05 15:58:23 +0000 | |
---|---|---|
committer | 2015-10-06 07:03:20 +0000 | |
commit | 6817a6fcdd4275f9d3d4c3b9451a6c4144adcee1 (patch) | |
tree | 83a0a735ac0c48f777ed4a8ac06881262e2a2e50 /src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java | |
parent | 1c0543c626bf29eda95348c5c97391bc5d372fa3 (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.java | 48 |
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(); - } } |