diff options
author | asteinb <asteinb@google.com> | 2018-05-22 09:42:36 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-05-22 09:44:00 -0700 |
commit | fd0aec8adae7785ca5aecd21886dacd5d9e5091e (patch) | |
tree | 0aea9a2c18ab05739a68b6a2b86d0d839d34a172 /src/main/java/com/google/devtools/build/lib | |
parent | a51b436f4290a79f77157b9e1f2f2e7b26283a5c (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/google/devtools/build/lib')
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(); |