aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-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();