diff options
author | 2015-05-29 21:44:28 +0000 | |
---|---|---|
committer | 2015-06-01 15:49:22 +0000 | |
commit | 0833ac6f2ed098ccbe25e986f10437d8e6ddfad6 (patch) | |
tree | c7bd93c42b87070dcfc34017d3543018f60f0dc6 /src/main/java/com | |
parent | 55b142f2d16b606c170899bf470504efaada840b (diff) |
Changes the android rules to invoke jarjar directly instead of through a script.
--
MOS_MIGRATED_REVID=94791363
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java | 72 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java | 6 |
2 files changed, 44 insertions, 34 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index 093a7fe9f3..dd4e791e2a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; +import com.google.devtools.build.lib.analysis.actions.FileWriteAction; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode; import com.google.devtools.build.lib.collect.nestedset.NestedSet; @@ -212,7 +213,7 @@ public class AndroidCommon { // Repackages the R.java for each dependency package and places the resultant jars // before the dependency libraries to ensure that the generated resource ids are // correct. - createRepackerActions(attributes, resourceContainers, + createJarJarActions(attributes, resourceContainers, updatedResources.getJavaPackage(), binaryResourcesJar); } @@ -233,7 +234,7 @@ public class AndroidCommon { outputDepsProto, javaArtifactsBuilder); } - private void createRepackerActions( + private void createJarJarActions( JavaTargetAttributes.Builder attributes, Iterable<ResourceContainer> resourceContainers, String originalPackage, @@ -246,42 +247,49 @@ public class AndroidCommon { continue; } - // Since the Java sources are generated by combining all resources with the - // ones included in the binary, the path of the artifact has to be unique - // per binary and per library (not only per library). - String jarName = otherContainer.getLabel().getName() + ".jar"; - PathFragment jarRelativePath = - otherContainer.getLabel().getPackageFragment().getRelative(jarName); - Artifact resourcesJar = ruleContext.getAnalysisEnvironment() - .getDerivedArtifact(ruleContext.getUniqueDirectory( - "resource_jars").getRelative(jarRelativePath), ruleContext.getBinOrGenfilesDirectory()); + Artifact resourcesJar = createResourceJarArtifact(ruleContext, otherContainer, ".jar"); // combined resource constants copy needs to come before library classes that may contain // their local resource constants attributes.addRuntimeClassPathEntry(resourcesJar); - FilesToRunProvider repackager = - ruleContext.getExecutablePrerequisite("$android_jar_repackager", Mode.HOST); - createRepackagerAction(ruleContext, binaryResourcesJar, resourcesJar, originalPackage, - otherContainer.getJavaPackage(), repackager); + + Artifact jarJarRuleFile = createResourceJarArtifact( + ruleContext, otherContainer, ".jar_jarjar_rules.txt"); + + String jarJarRule = String.format("rule %s.* %s.@1", + originalPackage, otherContainer.getJavaPackage()); + ruleContext.registerAction(new FileWriteAction( + ruleContext.getActionOwner(), jarJarRuleFile, jarJarRule, false)); + + FilesToRunProvider jarjar = + ruleContext.getExecutablePrerequisite("$jarjar_bin", Mode.HOST); + + ruleContext.registerAction(new SpawnAction.Builder() + .setExecutable(jarjar) + .addArgument("process") + .addInputArgument(jarJarRuleFile) + .addInputArgument(binaryResourcesJar) + .addOutputArgument(resourcesJar) + .setProgressMessage("Repackaging jar") + .setMnemonic("AndroidRepackageJar") + .build(ruleContext)); } } - private static Artifact createRepackagerAction( - RuleContext ruleContext, - Artifact inputJar, - Artifact outputJar, - String originalPackage, - String finalPackage, - FilesToRunProvider repackager) { - ruleContext.registerAction(new SpawnAction.Builder() - .setExecutable(repackager) - .addInputArgument(inputJar) - .addOutputArgument(outputJar) - .addArgument(originalPackage) - .addArgument(finalPackage) - .setProgressMessage("Repackaging jar") - .setMnemonic("JarRepackager") - .build(ruleContext)); - return outputJar; + private static Artifact createResourceJarArtifact(RuleContext ruleContext, + ResourceContainer container, String fileNameSuffix) { + + String artifactName = container.getLabel().getName() + fileNameSuffix; + + // Since the Java sources are generated by combining all resources with the + // ones included in the binary, the path of the artifact has to be unique + // per binary and per library (not only per library). + PathFragment resourceJarsPathFragment = ruleContext.getUniqueDirectory("resource_jars"); + PathFragment artifactPathFragment = resourceJarsPathFragment.getRelative( + container.getLabel().getPackageFragment().getRelative(artifactName)); + + Artifact artifact = ruleContext.getAnalysisEnvironment() + .getDerivedArtifact(artifactPathFragment, ruleContext.getBinOrGenfilesDirectory()); + return artifact; } public JavaTargetAttributes init( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java index f859fc47e7..4513454242 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java @@ -498,8 +498,10 @@ public final class AndroidRuleClasses { .value(env.getLabel("//tools/defaults:android_jar"))) .add(attr("$android_dx_jar", LABEL).cfg(HOST) .value(env.getLabel("//tools/defaults:android_dx_jar"))) - .add(attr("$android_jar_repackager", LABEL).cfg(HOST).exec() - .value(env.getLabel("//tools/android:repackage_jar"))) + // TODO(ahumesky): It would be better to put this dependency in //tools/android somehow + // like all the rest of android tools. + .add(attr("$jarjar_bin", LABEL).cfg(HOST).exec() + .value(env.getLabel("//third_party/java/jarjar:jarjar_bin"))) .build(); } |