diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
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(); |