aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar asteinb <asteinb@google.com>2018-05-22 09:42:36 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-22 09:44:00 -0700
commitfd0aec8adae7785ca5aecd21886dacd5d9e5091e (patch)
tree0aea9a2c18ab05739a68b6a2b86d0d839d34a172 /src/main/java/com
parenta51b436f4290a79f77157b9e1f2f2e7b26283a5c (diff)
Pass AndroidDataContext to remaining non-ActionBuilder code
Now that the AndroidDataContext is passed everywhere, we can begin modifying action builders. This includes removing Label information from Proguard artifact paths. getUniqueDirectoryArtifact() already included label earlier in the path, so this information was redundant anyway. RELNOTES: none PiperOrigin-RevId: 197576210
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/BusyBoxActionBuilder.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java60
9 files changed, 84 insertions, 47 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java
index e98d28808d..b9d7597021 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.android.AndroidBinary;
import com.google.devtools.build.lib.rules.android.AndroidCommon;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration;
+import com.google.devtools.build.lib.rules.android.AndroidDataContext;
import com.google.devtools.build.lib.rules.android.AndroidSemantics;
import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
@@ -60,7 +61,7 @@ public class BazelAndroidSemantics implements AndroidSemantics {
@Override
public ImmutableList<Artifact> getProguardSpecsForManifest(
- RuleContext ruleContext, Artifact manifest) {
+ AndroidDataContext context, Artifact manifest) {
return ImmutableList.of();
}
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 b023c46031..ffaeb6fc58 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
@@ -44,6 +44,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
@@ -51,6 +52,7 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.SpawnActionTemplate;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.whitelisting.Whitelist;
+import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -265,7 +267,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"),
ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
ProguardHelper.getProguardConfigArtifact(ruleContext, ""),
- createMainDexProguardSpec(ruleContext),
+ createMainDexProguardSpec(ruleContext.getLabel(), ruleContext),
shouldShrinkResourceCycles(
dataContext.getAndroidConfig(), ruleContext, shrinkResources),
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST),
@@ -809,7 +811,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ImmutableList<Artifact> proguardSpecs =
ProguardHelper.collectTransitiveProguardSpecs(
- dataContext.getRuleContext(),
+ dataContext.getLabel(),
+ dataContext.getActionConstructionContext(),
Iterables.concat(ImmutableList.of(resourceProguardConfig), extraProguardSpecs),
localProguardSpecs,
proguardDeps);
@@ -820,9 +823,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
// specs so that they can override values.
proguardSpecs =
ImmutableList.<Artifact>builder()
- .addAll(
- androidSemantics.getProguardSpecsForManifest(
- dataContext.getRuleContext(), mergedManifest))
+ .addAll(androidSemantics.getProguardSpecsForManifest(dataContext, mergedManifest))
.addAll(proguardSpecs)
.build();
}
@@ -1788,8 +1789,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
return mainDexList;
}
- public static Artifact createMainDexProguardSpec(RuleContext ruleContext) {
- return ProguardHelper.getProguardConfigArtifact(ruleContext, "main_dex");
+ public static Artifact createMainDexProguardSpec(Label label, ActionConstructionContext context) {
+ return ProguardHelper.getProguardConfigArtifact(label, context, "main_dex");
}
/** Returns the multidex mode to apply to this target. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java
index ae8fa2fe65..a1b33d6601 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java
@@ -74,7 +74,8 @@ public interface AndroidSemantics {
throws InterruptedException;
/** Given an Android {@code manifest}, returns a list of relevant Proguard specs. */
- ImmutableList<Artifact> getProguardSpecsForManifest(RuleContext ruleContext, Artifact manifest);
+ ImmutableList<Artifact> getProguardSpecsForManifest(
+ AndroidDataContext dataContext, Artifact manifest);
/**
* Add coverage instrumentation to the Java compilation of an Android binary.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/BusyBoxActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/BusyBoxActionBuilder.java
index 463022c295..b459f07df6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/BusyBoxActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/BusyBoxActionBuilder.java
@@ -17,10 +17,8 @@ import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ParamFileInfo;
import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType;
-import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.util.OS;
@@ -42,20 +40,20 @@ public final class BusyBoxActionBuilder {
.setUseAlways(OS.getCurrent() == OS.WINDOWS)
.build();
- private final RuleContext ruleContext;
+ private final AndroidDataContext dataContext;
private final NestedSetBuilder<Artifact> inputs = NestedSetBuilder.naiveLinkOrder();
private final ImmutableList.Builder<Artifact> outputs = ImmutableList.builder();
private final CustomCommandLine.Builder commandLine = CustomCommandLine.builder();
public static BusyBoxActionBuilder create(
- RuleContext ruleContext, @CompileTimeConstant String toolName) {
- BusyBoxActionBuilder builder = new BusyBoxActionBuilder(ruleContext);
+ AndroidDataContext dataContext, @CompileTimeConstant String toolName) {
+ BusyBoxActionBuilder builder = new BusyBoxActionBuilder(dataContext);
builder.commandLine.add("--tool").add(toolName).add("--");
return builder;
}
- private BusyBoxActionBuilder(RuleContext ruleContext) {
- this.ruleContext = ruleContext;
+ private BusyBoxActionBuilder(AndroidDataContext dataContext) {
+ this.dataContext = dataContext;
}
public BusyBoxActionBuilder addInput(@CompileTimeConstant String arg, Artifact value) {
@@ -122,16 +120,14 @@ public final class BusyBoxActionBuilder {
* @param mnemonic a mnemonic used to indicate the tool being run, for example, "BusyBoxTool".
*/
public void buildAndRegister(String message, String mnemonic) {
- ruleContext.registerAction(
+ dataContext.registerAction(
new SpawnAction.Builder()
.useDefaultShellEnvironment()
.addTransitiveInputs(inputs.build())
.addOutputs(outputs.build())
.addCommandLine(commandLine.build(), FORCED_PARAM_FILE_INFO)
- .setExecutable(
- ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("%s for %s", message, ruleContext.getLabel())
- .setMnemonic(mnemonic)
- .build(ruleContext));
+ .setExecutable(dataContext.getBusybox())
+ .setProgressMessage("%s for %s", message, dataContext.getLabel())
+ .setMnemonic(mnemonic));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java b/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java
index 9f6ac28ea6..c589342614 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java
@@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
@@ -131,14 +132,14 @@ public final class DataBinding {
* for each layout file with data binding expressions. Since this may produce multiple files,
* outputs are zipped up into a single container.
*/
- static Artifact getLayoutInfoFile(RuleContext ruleContext) {
- return getSuffixedInfoFile(ruleContext, "");
+ static Artifact getLayoutInfoFile(ActionConstructionContext context) {
+ return getSuffixedInfoFile(context, "");
}
/** Gets a layout info file with the specified suffix (for use in having different outputs) */
- static Artifact getSuffixedInfoFile(RuleContext ruleContext, String suffix) {
- return ruleContext.getUniqueDirectoryArtifact(
- "databinding", "layout-info" + suffix + ".zip", ruleContext.getBinOrGenfilesDirectory());
+ static Artifact getSuffixedInfoFile(ActionConstructionContext context, String suffix) {
+ return context.getUniqueDirectoryArtifact(
+ "databinding", "layout-info" + suffix + ".zip");
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java
index 7aa6196427..ea6411b355 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java
@@ -30,8 +30,7 @@ public class MergedAndroidAssets extends ParsedAndroidAssets {
Artifact mergedAssets =
dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_ASSETS_ZIP);
- BusyBoxActionBuilder builder =
- BusyBoxActionBuilder.create(dataContext.getRuleContext(), "MERGE_ASSETS");
+ BusyBoxActionBuilder builder = BusyBoxActionBuilder.create(dataContext, "MERGE_ASSETS");
if (dataContext.getAndroidConfig().throwOnResourceConflict()) {
builder.addFlag("--throwOnAssetConflict");
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java
index cbe830244f..da7ceda7b4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java
@@ -61,7 +61,8 @@ public class MergedAndroidResources extends ParsedAndroidResources {
.setUseCompiledMerge(useCompiledMerge);
if (enableDataBinding) {
- builder.setDataBindingInfoZip(DataBinding.getLayoutInfoFile(dataContext.getRuleContext()));
+ builder.setDataBindingInfoZip(
+ DataBinding.getLayoutInfoFile(dataContext.getActionConstructionContext()));
}
return builder
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
index 7e468823eb..cbb1034924 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
@@ -85,7 +85,8 @@ public class ProcessedAndroidData {
.setMergedResourcesOut(
dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP))
.setMainDexProguardOut(
- AndroidBinary.createMainDexProguardSpec(dataContext.getRuleContext()))
+ AndroidBinary.createMainDexProguardSpec(
+ dataContext.getLabel(), dataContext.getActionConstructionContext()))
.conditionalKeepRules(conditionalKeepRules)
.setDataBindingInfoZip(
dataBindingEnabled
@@ -205,7 +206,8 @@ public class ProcessedAndroidData {
builderForNonIncrementalTopLevelTarget(
dataContext, manifest, ImmutableMap.of(), aaptVersion)
.setMainDexProguardOut(
- AndroidBinary.createMainDexProguardSpec(dataContext.getRuleContext()))
+ AndroidBinary.createMainDexProguardSpec(
+ dataContext.getLabel(), dataContext.getActionConstructionContext()))
.setPackageUnderTest(packageUnderTest)
.setIsTestWithResources(hasLocalResourceFiles)
.withResourceDependencies(resourceDeps)
@@ -258,7 +260,10 @@ public class ProcessedAndroidData {
// Output
.setProguardOut(
- ProguardHelper.getProguardConfigArtifact(dataContext.getRuleContext(), proguardPrefix));
+ ProguardHelper.getProguardConfigArtifact(
+ dataContext.getLabel(),
+ dataContext.getActionConstructionContext(),
+ proguardPrefix));
}
static ProcessedAndroidData of(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java
index 398041d7a5..7328701eb7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java
@@ -26,6 +26,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
@@ -269,11 +270,33 @@ public abstract class ProguardHelper {
* behavior.
*/
public static ImmutableList<Artifact> collectTransitiveProguardSpecs(
- RuleContext ruleContext,
+ RuleContext context,
Iterable<Artifact> specsToInclude,
ImmutableList<Artifact> localProguardSpecs,
Iterable<ProguardSpecProvider> proguardDeps) {
- JavaOptimizationMode optMode = getJavaOptimizationMode(ruleContext);
+ return collectTransitiveProguardSpecs(
+ context.getLabel(), context, specsToInclude, localProguardSpecs, proguardDeps);
+ }
+ /**
+ * Retrieves the full set of proguard specs that should be applied to this binary, including the
+ * specs passed in, if Proguard should run on the given rule.
+ *
+ * <p>Unlike {@link #collectTransitiveProguardSpecs(RuleContext, Iterable)}, this method requires
+ * values to be passed in explicitly, and does not extract them from rule attributes.
+ *
+ * <p>If Proguard shouldn't be applied, or the legacy link mode is used and there are no
+ * proguard_specs on this rule, an empty list will be returned, regardless of any given specs or
+ * specs from dependencies. {@link
+ * com.google.devtools.build.lib.rules.android.AndroidBinary#createAndroidBinary} relies on that
+ * behavior.
+ */
+ public static ImmutableList<Artifact> collectTransitiveProguardSpecs(
+ Label label,
+ ActionConstructionContext context,
+ Iterable<Artifact> specsToInclude,
+ ImmutableList<Artifact> localProguardSpecs,
+ Iterable<ProguardSpecProvider> proguardDeps) {
+ JavaOptimizationMode optMode = getJavaOptimizationMode(context);
if (optMode == JavaOptimizationMode.NOOP) {
return ImmutableList.of();
}
@@ -295,10 +318,10 @@ public abstract class ProguardHelper {
// Generate and include implicit Proguard spec for requested mode.
if (!optMode.getImplicitProguardDirectives().isEmpty()) {
Artifact implicitDirectives =
- getProguardConfigArtifact(ruleContext, optMode.name().toLowerCase());
- ruleContext.registerAction(
+ getProguardConfigArtifact(label, context, optMode.name().toLowerCase());
+ context.registerAction(
FileWriteAction.create(
- ruleContext,
+ context,
implicitDirectives,
optMode.getImplicitProguardDirectives(),
/*makeExecutable=*/ false));
@@ -621,7 +644,8 @@ public abstract class ProguardHelper {
if (proguardDictionary != null) {
builder.addInput(proguardDictionary);
- commandLine.addExecPath("-obfuscationdictionary", proguardDictionary)
+ commandLine
+ .addExecPath("-obfuscationdictionary", proguardDictionary)
.addExecPath("-classobfuscationdictionary", proguardDictionary)
.addExecPath("-packageobfuscationdictionary", proguardDictionary);
}
@@ -665,22 +689,30 @@ public abstract class ProguardHelper {
/** Returns an intermediate artifact used to run Proguard. */
public static Artifact getProguardTempArtifact(
RuleContext ruleContext, String prefix, String name) {
+ return getProguardTempArtifact(ruleContext.getLabel(), ruleContext, prefix, name);
+ }
+
+ /** Returns an intermediate artifact used to run Proguard. */
+ public static Artifact getProguardTempArtifact(
+ Label label, ActionConstructionContext context, String prefix, String name) {
// TODO(bazel-team): Remove the redundant inclusion of the rule name, as getUniqueDirectory
// includes the rulename as well.
- return Preconditions.checkNotNull(
- ruleContext.getUniqueDirectoryArtifact(
- "proguard",
- Joiner.on("_").join(prefix, ruleContext.getLabel().getName(), name),
- ruleContext.getBinOrGenfilesDirectory()));
+ return context.getUniqueDirectoryArtifact(
+ "proguard", Joiner.on("_").join(prefix, label.getName(), name));
}
public static Artifact getProguardConfigArtifact(RuleContext ruleContext, String prefix) {
- return getProguardTempArtifact(ruleContext, prefix, "proguard.cfg");
+ return getProguardConfigArtifact(ruleContext.getLabel(), ruleContext, prefix);
+ }
+
+ public static Artifact getProguardConfigArtifact(
+ Label label, ActionConstructionContext context, String prefix) {
+ return getProguardTempArtifact(label, context, prefix, "proguard.cfg");
}
/** Returns {@link JavaConfiguration#getJavaOptimizationMode()}. */
- public static JavaOptimizationMode getJavaOptimizationMode(RuleContext ruleContext) {
- return ruleContext
+ public static JavaOptimizationMode getJavaOptimizationMode(ActionConstructionContext context) {
+ return context
.getConfiguration()
.getFragment(JavaConfiguration.class)
.getJavaOptimizationMode();