aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Alex Humesky <ahumesky@google.com>2015-05-29 21:44:28 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2015-06-01 15:49:22 +0000
commit0833ac6f2ed098ccbe25e986f10437d8e6ddfad6 (patch)
treec7bd93c42b87070dcfc34017d3543018f60f0dc6 /src/main/java/com
parent55b142f2d16b606c170899bf470504efaada840b (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.java72
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java6
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();
}