From fd0aec8adae7785ca5aecd21886dacd5d9e5091e Mon Sep 17 00:00:00 2001 From: asteinb Date: Tue, 22 May 2018 09:42:36 -0700 Subject: 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 --- .../bazel/rules/android/BazelAndroidSemantics.java | 3 +- .../build/lib/rules/android/AndroidBinary.java | 15 +++--- .../build/lib/rules/android/AndroidSemantics.java | 3 +- .../lib/rules/android/BusyBoxActionBuilder.java | 22 ++++---- .../build/lib/rules/android/DataBinding.java | 11 ++-- .../lib/rules/android/MergedAndroidAssets.java | 3 +- .../lib/rules/android/MergedAndroidResources.java | 3 +- .../lib/rules/android/ProcessedAndroidData.java | 11 ++-- .../build/lib/rules/java/ProguardHelper.java | 60 +++++++++++++++++----- 9 files changed, 84 insertions(+), 47 deletions(-) (limited to 'src/main/java/com') 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 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 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.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 getProguardSpecsForManifest(RuleContext ruleContext, Artifact manifest); + ImmutableList 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 inputs = NestedSetBuilder.naiveLinkOrder(); private final ImmutableList.Builder 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 collectTransitiveProguardSpecs( - RuleContext ruleContext, + RuleContext context, Iterable specsToInclude, ImmutableList localProguardSpecs, Iterable 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. + * + *

Unlike {@link #collectTransitiveProguardSpecs(RuleContext, Iterable)}, this method requires + * values to be passed in explicitly, and does not extract them from rule attributes. + * + *

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 collectTransitiveProguardSpecs( + Label label, + ActionConstructionContext context, + Iterable specsToInclude, + ImmutableList localProguardSpecs, + Iterable 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(); -- cgit v1.2.3