aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java59
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java4
6 files changed, 46 insertions, 78 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
index e7c2fa501a..87d2253a14 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
@@ -56,7 +56,6 @@ import com.google.devtools.build.lib.rules.java.JavaCommon;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
-import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.ArrayList;
import java.util.LinkedHashMap;
@@ -791,8 +790,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
static DexingOutput dex(RuleContext ruleContext, MultidexMode multidexMode, List<String> dexopts,
Artifact deployJar, Artifact proguardedJar, AndroidCommon common,
JavaTargetAttributes attributes) {
- Artifact classesDex = AndroidBinary.getDxArtifact(ruleContext,
- getMultidexMode(ruleContext).getOutputDexFilename());
+ String classesDexFileName = getMultidexMode(ruleContext).getOutputDexFilename();
+ Artifact classesDex = AndroidBinary.getDxArtifact(ruleContext, classesDexFileName);
if (!AndroidBinary.supportsMultidexMode(ruleContext, multidexMode)) {
ruleContext.ruleError("Multidex mode \"" + multidexMode.getAttributeValue()
+ "\" not supported by this version of the Android SDK");
@@ -904,10 +903,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
return new DexingOutput(classesDex, javaResourceJar, shardDexes);
} else {
// Create an artifact for the intermediate zip output that includes non-.dex files.
- PathFragment dexPath = classesDex.getRootRelativePath();
- Artifact classesDexIntermediate = ruleContext.getAnalysisEnvironment().getDerivedArtifact(
- dexPath.getParentDirectory().getRelative("intermediate_" + dexPath.getBaseName()),
- ruleContext.getBinOrGenfilesDirectory());
+ Artifact classesDexIntermediate = AndroidBinary.getDxArtifact(
+ ruleContext,
+ "intermediate_" + classesDexFileName);
// Have the dexer generate the intermediate file and the "cleaner" action consume this to
// generate the final archive with only .dex files.
@@ -1255,8 +1253,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
* Returns an intermediate artifact used to support dex generation.
*/
public static Artifact getDxArtifact(RuleContext ruleContext, String baseName) {
- return ruleContext.getAnalysisEnvironment().getDerivedArtifact(
- ruleContext.getUniqueDirectory("_dx").getRelative(baseName),
+ return ruleContext.getUniqueDirectoryArtifact("_dx", baseName,
ruleContext.getBinOrGenfilesDirectory());
}
@@ -1266,11 +1263,10 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
public static Artifact getProguardConfigArtifact(RuleContext ruleContext, String prefix) {
// TODO(bazel-team): Remove the redundant inclusion of the rule name, as getUniqueDirectory
// includes the rulename as well.
- return Preconditions.checkNotNull(
- ruleContext.getAnalysisEnvironment().getDerivedArtifact(
- ruleContext.getUniqueDirectory("proguard").getRelative(
- Joiner.on("_").join(prefix, ruleContext.getLabel().getName(), "proguard.cfg")),
- ruleContext.getBinOrGenfilesDirectory()));
+ return Preconditions.checkNotNull(ruleContext.getUniqueDirectoryArtifact(
+ "proguard",
+ Joiner.on("_").join(prefix, ruleContext.getLabel().getName(), "proguard.cfg"),
+ ruleContext.getBinOrGenfilesDirectory()));
}
/**
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 a34cb55824..e5bc26c15f 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
@@ -300,12 +300,9 @@ public class AndroidCommon {
// 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());
+ Artifact artifact = ruleContext.getUniqueDirectoryArtifact("resource_jars",
+ container.getLabel().getPackageIdentifier().getPathFragment().getRelative(artifactName),
+ ruleContext.getBinOrGenfilesDirectory());
return artifact;
}
@@ -647,16 +644,15 @@ public class AndroidCommon {
private ImmutableMap<Artifact, Artifact> generateTranslatedIdlArtifacts(
RuleContext ruleContext, Collection<Artifact> idls) {
ImmutableMap.Builder<Artifact, Artifact> outputJavaSources = ImmutableMap.builder();
- PathFragment rulePackage = ruleContext.getRule().getLabel().getPackageFragment();
String ruleName = ruleContext.getRule().getName();
// for each aidl file use aggregated preprocessed files to generate Java code
for (Artifact idl : idls) {
// Reconstruct the package tree under <rule>_aidl to avoid a name conflict
// if the same AIDL files are used in multiple targets.
PathFragment javaOutputPath = FileSystemUtils.replaceExtension(
- rulePackage.getRelative(ruleName + "_aidl").getRelative(idl.getRootRelativePath()),
+ new PathFragment(ruleName + "_aidl").getRelative(idl.getRootRelativePath()),
".java");
- Artifact output = ruleContext.getAnalysisEnvironment().getDerivedArtifact(
+ Artifact output = ruleContext.getPackageRelativeArtifact(
javaOutputPath, ruleContext.getConfiguration().getGenfilesDirectory());
outputJavaSources.put(idl, output);
}
@@ -688,14 +684,13 @@ public class AndroidCommon {
// preprocess each aidl file
preprocessedArgs.add("-p" + sdk.getFrameworkAidl().getExecPathString());
- PathFragment rulePackage = ruleContext.getRule().getLabel().getPackageFragment();
String ruleName = ruleContext.getRule().getName();
for (Artifact idl : idls) {
// Reconstruct the package tree under <rule>_aidl to avoid a name conflict
// if the source AIDL files are also generated.
- PathFragment preprocessedPath = rulePackage.getRelative(ruleName + "_aidl")
+ PathFragment preprocessedPath = new PathFragment(ruleName + "_aidl")
.getRelative(idl.getRootRelativePath());
- Artifact preprocessed = ruleContext.getAnalysisEnvironment().getDerivedArtifact(
+ Artifact preprocessed = ruleContext.getPackageRelativeArtifact(
preprocessedPath, ruleContext.getConfiguration().getGenfilesDirectory());
preprocessedIdls.add(preprocessed);
preprocessedArgs.add("-p" + preprocessed.getExecPathString());
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 fa40809201..010fa4830d 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
@@ -378,9 +378,10 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
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.getAnalysisEnvironment().getDerivedArtifact(
- specToValidate.getRootRelativePath()
- .replaceName(specToValidate.getFilename() + "_valid"),
+ Artifact output = ruleContext.getUniqueDirectoryArtifact(
+ "validated_proguard",
+ specToValidate.getRootRelativePath().replaceName(
+ specToValidate.getFilename() + "_valid"),
ruleContext.getBinOrGenfilesDirectory());
ruleContext.registerAction(new SpawnAction.Builder()
.addInput(specToValidate)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
index a379cc0227..e1f84e7feb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
@@ -35,6 +35,7 @@ import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.Reso
import com.google.devtools.build.lib.rules.android.LocalResourceContainer.Builder.InvalidAssetPath;
import com.google.devtools.build.lib.rules.android.LocalResourceContainer.Builder.InvalidResourcePath;
import com.google.devtools.build.lib.rules.java.JavaUtil;
+import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.List;
@@ -145,9 +146,8 @@ public final class ApplicationManifest {
* @return the generated ApplicationManifest
*/
public static ApplicationManifest generatedManifest(RuleContext ruleContext) {
- Artifact generatedManifest = ruleContext.getAnalysisEnvironment().getDerivedArtifact(
- ruleContext.getUniqueDirectory(ruleContext.getRule().getName() + "_generated")
- .getChild("AndroidManifest.xml"),
+ Artifact generatedManifest = ruleContext.getUniqueDirectoryArtifact(
+ ruleContext.getRule().getName() + "_generated", new PathFragment("AndroidManifest.xml"),
ruleContext.getBinOrGenfilesDirectory());
String manifestPackage;
@@ -179,9 +179,8 @@ public final class ApplicationManifest {
Iterable<ResourceContainer> resourceContainers) {
if (!Iterables.isEmpty(getMergeeManifests(resourceContainers))) {
Iterable<Artifact> exportedManifests = getMergeeManifests(resourceContainers);
- Artifact outputManifest = ruleContext.getAnalysisEnvironment().getDerivedArtifact(
- ruleContext.getUniqueDirectory(
- ruleContext.getRule().getName() + "_merged").getChild("AndroidManifest.xml"),
+ Artifact outputManifest = ruleContext.getUniqueDirectoryArtifact(
+ ruleContext.getRule().getName() + "_merged", "AndroidManifest.xml",
ruleContext.getBinOrGenfilesDirectory());
AndroidManifestMergeHelper.createMergeManifestAction(ruleContext, getManifest(),
exportedManifests, ImmutableList.of("all"), outputManifest);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java
index d8377d218e..de9c089be4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java
@@ -57,6 +57,10 @@ import javax.annotation.Nullable;
*/
public final class JackCompilationHelper {
+ private static final String PARTIAL_JACK_DIRECTORY = "_jill";
+
+ private static final String JACK_DIRECTORY = "_jack";
+
/** Filetype for the intermediate library created by Jack. */
public static final FileType JACK_LIBRARY_TYPE = FileType.of(".jack");
@@ -366,13 +370,10 @@ public final class JackCompilationHelper {
* @see #postprocessPartialJackAndAddResources(Artifact,Artifact)
*/
private Artifact convertJarToPartialJack(Artifact jar) {
- PathFragment outputPath =
- FileSystemUtils.replaceExtension(
- getPartialJackRoot().getRelative(jar.getRootRelativePath()), ".jack");
- Artifact result =
- ruleContext
- .getAnalysisEnvironment()
- .getDerivedArtifact(outputPath, ruleContext.getBinOrGenfilesDirectory());
+ Artifact result = ruleContext.getUniqueDirectoryArtifact(
+ PARTIAL_JACK_DIRECTORY,
+ FileSystemUtils.replaceExtension(jar.getRootRelativePath(), ".jack"),
+ ruleContext.getBinOrGenfilesDirectory());
ruleContext.registerAction(
new SpawnAction.Builder()
.setExecutable(jillBinary)
@@ -391,13 +392,11 @@ public final class JackCompilationHelper {
* non-resource files and returning a zip file containing only resources.
*/
private Artifact extractResourcesFromJar(Artifact jar) {
- PathFragment outputPath =
- FileSystemUtils.replaceExtension(
- getPartialJackRoot().getRelative(jar.getRootRelativePath()), "-resources.zip");
- Artifact result =
- ruleContext
- .getAnalysisEnvironment()
- .getDerivedArtifact(outputPath, ruleContext.getBinOrGenfilesDirectory());
+ Artifact result = ruleContext.getUniqueDirectoryArtifact(
+ PARTIAL_JACK_DIRECTORY,
+ FileSystemUtils.replaceExtension(jar.getRootRelativePath(), "-resources.zip"),
+ ruleContext.getBinOrGenfilesDirectory());
+
ruleContext.registerAction(
new SpawnAction.Builder()
.setExecutable(resourceExtractorBinary)
@@ -416,13 +415,11 @@ public final class JackCompilationHelper {
*/
private Artifact postprocessPartialJackAndAddResources(
Artifact partialJackLibrary, Artifact resources) {
- PathFragment outputPath =
- getFinalizedJackRoot()
- .getRelative(partialJackLibrary.getRootRelativePath().relativeTo(getPartialJackRoot()));
- Artifact result =
- ruleContext
- .getAnalysisEnvironment()
- .getDerivedArtifact(outputPath, ruleContext.getBinOrGenfilesDirectory());
+ Artifact result = ruleContext.getUniqueDirectoryArtifact(
+ JACK_DIRECTORY,
+ partialJackLibrary.getRootRelativePath().relativeTo(
+ ruleContext.getUniqueDirectory(PARTIAL_JACK_DIRECTORY)),
+ ruleContext.getBinOrGenfilesDirectory());
CustomCommandLine.Builder builder =
CustomCommandLine.builder()
// Have jack double-check its behavior and crash rather than producing invalid output
@@ -446,26 +443,6 @@ public final class JackCompilationHelper {
}
/**
- * Creates an intermediate directory to store partially-converted Jack libraries.
- *
- * @see #convertJarToPartialJack(Artifact)
- */
- private PathFragment getPartialJackRoot() {
- PathFragment rulePath = ruleContext.getLabel().toPathFragment();
- return rulePath.replaceName(rulePath.getBaseName() + "_jill");
- }
-
- /**
- * Creates an intermediate directory to store fully-converted Jack libraries.
- *
- * @see #postprocessPartialJackAndAddResources(Artifact,Artifact)
- */
- private PathFragment getFinalizedJackRoot() {
- PathFragment rulePath = ruleContext.getLabel().toPathFragment();
- return rulePath.replaceName(rulePath.getBaseName() + "_jack");
- }
-
- /**
* Creates an action to build an empty jack library given by outputArtifact.
*/
private void buildEmptyJackAction() {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
index 965106e7aa..7c48f1bdc8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
@@ -80,8 +80,8 @@ public final class NativeLibs {
// The native deps name file must be the only file in its directory because ApkBuilder does
// not have an option to add a particular file to the .apk, only one to add every file in a
// particular directory.
- Artifact nativeDepsName = ruleContext.getAnalysisEnvironment().getDerivedArtifact(
- ruleContext.getUniqueDirectory("nativedeps_filename").getRelative(nativeDepsFileName),
+ Artifact nativeDepsName = ruleContext.getUniqueDirectoryArtifact(
+ "nativedeps_filename", nativeDepsFileName,
ruleContext.getBinOrGenfilesDirectory());
ruleContext.registerAction(new FileWriteAction(ruleContext.getActionOwner(), nativeDepsName,
anyNativeLibrary.getExecPath().getBaseName(), false));