diff --git a/.gitignore b/.gitignore index b544e8461b152c..b7f03248143f61 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ .bazelversion # User-specific .bazelrc user.bazelrc - +# Intellij +.aswb 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 555464a945f8aa..4bf547d774493d 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 @@ -60,11 +60,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.packages.BuildType; -import com.google.devtools.build.lib.packages.RuleClass; -import com.google.devtools.build.lib.packages.RuleErrorConsumer; -import com.google.devtools.build.lib.packages.TriState; -import com.google.devtools.build.lib.packages.Type; +import com.google.devtools.build.lib.packages.*; import com.google.devtools.build.lib.rules.android.AndroidBinaryMobileInstall.MobileInstallResourceApks; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.MultidexMode; import com.google.devtools.build.lib.rules.android.ProguardHelper.ProguardOutput; @@ -262,7 +258,9 @@ private static RuleConfiguredTargetBuilder init( ResourceFilterFactory.fromRuleContextAndAttrs(ruleContext), ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"), ruleContext.attributes().get("crunch_png", Type.BOOLEAN), - DataBinding.contextFrom(ruleContext, dataContext.getAndroidConfig())); + DataBinding.contextFrom(ruleContext, dataContext.getAndroidConfig()), + TargetUtils.getExecutionInfo( + ruleContext.getRule(), ruleContext.isAllowTagsPropagation())); AndroidApplicationResourceInfo androidApplicationResourceInfo = ruleContext.getPrerequisite( @@ -276,6 +274,8 @@ private static RuleConfiguredTargetBuilder init( new RClassGeneratorActionBuilder() .withDependencies(resourceDeps) .finalFields(!shrinkResourceCycles) + .setExecutionInfo(TargetUtils.getExecutionInfo( + ruleContext.getRule(), ruleContext.isAllowTagsPropagation())) .setClassJarOut( dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_CLASS_JAR)) .build(dataContext, processedAndroidData); @@ -525,7 +525,7 @@ public static RuleConfiguredTargetBuilder createAndroidBinary( java8LegacyDex = getDxArtifact(ruleContext, "_java8_legacy.dex.zip"); Artifact androidJar = AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar(); ruleContext.registerAction( - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setExecutable( ruleContext.getExecutablePrerequisite( "$build_java8_legacy_dex", TransitionMode.HOST)) @@ -546,7 +546,7 @@ public static RuleConfiguredTargetBuilder createAndroidBinary( // Append legacy .dex library to app's .dex files finalClassesDex = getDxArtifact(ruleContext, "_final_classes.dex.zip"); ruleContext.registerAction( - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .useDefaultShellEnvironment() .setMnemonic("AppendJava8LegacyDex") .setProgressMessage("Adding Java 8 legacy library for %s", ruleContext.getLabel()) @@ -616,7 +616,7 @@ public static RuleConfiguredTargetBuilder createAndroidBinary( AndroidRuleClasses.INSTRUMENTATION_TEST_CHECK_RESULTS); SpawnAction.Builder checkAction = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setExecutable(checker) .addInput(targetManifest) .addInput(instrumentationManifest) @@ -1157,7 +1157,7 @@ private static DexingOutput dex( .addExecPath("--output_zip", classesDex) .build(); ruleContext.registerAction( - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .useDefaultShellEnvironment() .setMnemonic("MergeDexZips") .setProgressMessage("Merging dex shards for %s", ruleContext.getLabel()) @@ -1367,20 +1367,20 @@ private static SpecialArtifact createSharderAction( ImmutableList dexArchives, @Nullable Artifact mainDexList, Collection dexopts, - @Nullable Artifact inclusionFilterJar) { + @Nullable Artifact inclusionFilterJar) throws InterruptedException { SpecialArtifact outputTree = ruleContext.getTreeArtifact( ruleContext.getUniqueDirectory("dexsplits"), ruleContext.getBinOrGenfilesDirectory()); SpawnAction.Builder shardAction = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .useDefaultShellEnvironment() .setMnemonic("ShardForMultidex") .setProgressMessage( "Assembling dex files for %s", ruleContext.getLabel().getCanonicalForm()) .setExecutable( ruleContext.getExecutablePrerequisite("$dexsharder", TransitionMode.HOST)) - .addInputs(dexArchives) + .addInputs(dexArchives) .addOutput(outputTree); CustomCommandLine.Builder shardCommandLine = @@ -1442,7 +1442,7 @@ private static Artifact createTemplatedMergerActions( } private static void createZipMergeAction( - RuleContext ruleContext, Artifact inputTree, Artifact outputZip) { + RuleContext ruleContext, Artifact inputTree, Artifact outputZip) throws InterruptedException { CustomCommandLine args = CustomCommandLine.builder() .add("--normalize") @@ -1481,9 +1481,9 @@ private static void createDexMergerAction( ImmutableList dexArchives, Artifact classesDex, @Nullable Artifact mainDexList, - Collection dexopts) { + Collection dexopts) throws InterruptedException { SpawnAction.Builder dexmerger = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .useDefaultShellEnvironment() .setExecutable(ruleContext.getExecutablePrerequisite("$dexmerger", TransitionMode.HOST)) .setMnemonic("DexMerger") @@ -1563,7 +1563,7 @@ private static Map collectDexArchives( AndroidCommon common, List dexopts, AndroidSemantics semantics, - Function derivedJarFunction) { + Function derivedJarFunction) throws InterruptedException { DexArchiveProvider.Builder result = new DexArchiveProvider.Builder(); for (String attr : semantics.getAttributesWithJavaRuntimeDeps(ruleContext)) { // Use all available DexArchiveProviders from attributes that carry runtime dependencies @@ -1621,7 +1621,7 @@ private static Artifact createShuffleJarActions( } SpawnAction.Builder shardAction = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .useDefaultShellEnvironment() .setMnemonic("ShardClassesToDex") .setProgressMessage("Sharding classes for dexing for %s", ruleContext.getLabel()) @@ -1724,10 +1724,17 @@ private static ImmutableList toDexedClasspath( return dexedClasspath.build(); } + // Adds execution info by propagating tags from the target + private static SpawnAction.Builder createSpawnActionBuilder(RuleContext ruleContext) throws InterruptedException { + return new SpawnAction.Builder() + .setExecutionInfo(TargetUtils.getExecutionInfo( + ruleContext.getRule(), ruleContext.isAllowTagsPropagation())); + } + // Adds the appropriate SpawnAction options depending on if SingleJar is a jar or not. - private static SpawnAction.Builder singleJarSpawnActionBuilder(RuleContext ruleContext) { + private static SpawnAction.Builder singleJarSpawnActionBuilder(RuleContext ruleContext) throws InterruptedException { Artifact singleJar = JavaToolchainProvider.from(ruleContext).getSingleJar(); - SpawnAction.Builder builder = new SpawnAction.Builder().useDefaultShellEnvironment(); + SpawnAction.Builder builder = createSpawnActionBuilder(ruleContext).useDefaultShellEnvironment(); if (singleJar.getFilename().endsWith(".jar")) { builder .setJarExecutable( @@ -1746,7 +1753,7 @@ private static SpawnAction.Builder singleJarSpawnActionBuilder(RuleContext ruleC * of the output. */ static void createCleanDexZipAction( - RuleContext ruleContext, Artifact inputZip, Artifact outputZip) { + RuleContext ruleContext, Artifact inputZip, Artifact outputZip) throws InterruptedException { ruleContext.registerAction( singleJarSpawnActionBuilder(ruleContext) .setProgressMessage("Trimming %s", inputZip.getExecPath().getBaseName()) @@ -1802,7 +1809,7 @@ static Artifact createMainDexListAction( // Process the input jar through Proguard into an intermediate, streamlined jar. Artifact strippedJar = AndroidBinary.getDxArtifact(ruleContext, "main_dex_intermediate.jar"); SpawnAction.Builder streamlinedBuilder = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .useDefaultShellEnvironment() .addOutput(strippedJar) .setExecutable(sdk.getProguard()) @@ -1833,7 +1840,7 @@ static Artifact createMainDexListAction( ruleContext.registerAction(streamlinedBuilder.build(ruleContext)); SpawnAction.Builder builder = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setMnemonic("MainDexClasses") .setProgressMessage("Generating main dex classes list"); @@ -1861,7 +1868,7 @@ static Artifact createMainDexListAction( ":legacy_main_dex_list_generator", TransitionMode.HOST); // Use the newer legacy multidex main-dex list generation. SpawnAction.Builder actionBuilder = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setMnemonic("MainDexClasses") .setProgressMessage("Generating main dex classes list"); @@ -1910,7 +1917,7 @@ static Artifact transformDexListThroughProguardMapAction( Artifact obfuscatedMainDexList = AndroidBinary.getDxArtifact(ruleContext, "main_dex_list_obfuscated.txt"); SpawnAction.Builder actionBuilder = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setMnemonic("MainDexProguardClasses") .setProgressMessage("Obfuscating main dex classes list") .setExecutable( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java index 981de479f7f42e..9bc91814eed292 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.rules.android.AndroidDataConverter.JoinerType; @@ -63,6 +64,8 @@ public class AndroidResourcesProcessorBuilder { private String packageUnderTest; private boolean isTestWithResources = false; + private ImmutableMap executionInfo; + /** * The output zip for resource-processed data binding expressions (i.e. a zip of .xml files). * @@ -163,6 +166,14 @@ public AndroidResourcesProcessorBuilder setThrowOnResourceConflict( return this; } + /** + * Sets the map of execution info. + */ + public AndroidResourcesProcessorBuilder setExecutionInfo(ImmutableMap info) { + this.executionInfo = info; + return this; + } + /** * Creates and registers an action that processes only transitive data. * @@ -278,6 +289,10 @@ private void createAapt2ApkAction( BusyBoxActionBuilder builder = BusyBoxActionBuilder.create(dataContext, "AAPT2_PACKAGE").addAapt(); + if (executionInfo != null && !executionInfo.isEmpty()) { + builder.addExecutionInfo(executionInfo); + } + if (resourceDependencies != null) { builder .addTransitiveFlag( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java index 78836395fb658a..0b39159d38bedc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java @@ -495,7 +495,8 @@ public AndroidBinaryDataInfo processBinaryData( DataBinding.contextFrom( dataBindingEnabled, ctx.getActionConstructionContext(), - ctx.getAndroidConfig())) + ctx.getAndroidConfig()), + ImmutableMap.of()) .generateRClass(ctx); return AndroidBinaryDataInfo.of( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java index 28adf51374a7d1..b3b46feda98c83 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java @@ -21,12 +21,15 @@ import com.google.devtools.build.lib.analysis.RunfilesSupplierImpl; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; +import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.ApkSigningMethod; import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaRuntimeInfo; import com.google.devtools.build.lib.rules.java.JavaToolchainProvider; import com.google.devtools.build.lib.vfs.PathFragment; + +import java.beans.IntrospectionException; import java.util.List; /** @@ -142,7 +145,7 @@ public ApkActionsBuilder setArtifactLocationDirectory(String artifactLocation) { } /** Registers the actions needed to build the requested APKs in the rule context. */ - public void registerActions(RuleContext ruleContext) { + public void registerActions(RuleContext ruleContext) throws InterruptedException { boolean useSingleJarApkBuilder = ruleContext.getFragment(AndroidConfiguration.class).useSingleJarApkBuilder(); @@ -176,9 +179,9 @@ public void registerActions(RuleContext ruleContext) { *

If {@code signingKey} is not null, the apk will be signed with it using the V1 signature * scheme. */ - private void legacyBuildApk(RuleContext ruleContext, Artifact outApk) { + private void legacyBuildApk(RuleContext ruleContext, Artifact outApk) throws InterruptedException { SpawnAction.Builder actionBuilder = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getApkBuilder()) .setProgressMessage("Generating unsigned %s", apkName) .setMnemonic("AndroidApkBuilder") @@ -253,11 +256,11 @@ private void legacyBuildApk(RuleContext ruleContext, Artifact outApk) { } /** Registers generating actions for {@code outApk} that build an unsigned APK using SingleJar. */ - private void buildApk(RuleContext ruleContext, Artifact outApk) { + private void buildApk(RuleContext ruleContext, Artifact outApk) throws InterruptedException { Artifact compressedApk = getApkArtifact(ruleContext, "compressed_" + outApk.getFilename()); SpawnAction.Builder compressedApkActionBuilder = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setMnemonic("ApkBuilder") .setProgressMessage("Generating unsigned %s", apkName) .addOutput(compressedApk); @@ -297,7 +300,7 @@ private void buildApk(RuleContext ruleContext, Artifact outApk) { } SpawnAction.Builder singleJarActionBuilder = - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setMnemonic("ApkBuilder") .setProgressMessage("Generating unsigned %s", apkName) .addInput(compressedApk) @@ -316,7 +319,7 @@ private void buildApk(RuleContext ruleContext, Artifact outApk) { Artifact extractedJavaResourceZip = getApkArtifact(ruleContext, "extracted_" + javaResourceZip.getFilename()); ruleContext.registerAction( - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setExecutable(resourceExtractor) .setMnemonic("ResourceExtractor") .setProgressMessage("Extracting Java resources from deploy jar for %s", apkName) @@ -376,9 +379,10 @@ private void buildApk(RuleContext ruleContext, Artifact outApk) { } /** Uses the zipalign tool to align the zip boundaries for uncompressed resources by 4 bytes. */ - private void zipalignApk(RuleContext ruleContext, Artifact inputApk, Artifact zipAlignedApk) { + private void zipalignApk(RuleContext ruleContext, Artifact inputApk, Artifact zipAlignedApk) + throws InterruptedException { ruleContext.registerAction( - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .addInput(inputApk) .addOutput(zipAlignedApk) .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getZipalign()) @@ -402,11 +406,11 @@ private void zipalignApk(RuleContext ruleContext, Artifact inputApk, Artifact zi * alignment cannot be performed after v2 signing without invalidating the signature. */ private void signApk( - RuleContext ruleContext, Artifact unsignedApk, Artifact signedAndZipalignedApk) { + RuleContext ruleContext, Artifact unsignedApk, Artifact signedAndZipalignedApk) throws InterruptedException { ApkSigningMethod signingMethod = ruleContext.getFragment(AndroidConfiguration.class).getApkSigningMethod(); ruleContext.registerAction( - new SpawnAction.Builder() + createSpawnActionBuilder(ruleContext) .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getApkSigner()) .setProgressMessage("Signing %s", apkName) .setMnemonic("ApkSignerTool") @@ -453,4 +457,12 @@ private Artifact getApkArtifact(RuleContext ruleContext, String baseName) { return AndroidBinary.getDxArtifact(ruleContext, baseName); } } + + // Adds execution info by propagating tags from the target + private static SpawnAction.Builder createSpawnActionBuilder(RuleContext ruleContext) throws InterruptedException { + return new SpawnAction.Builder() + .setExecutionInfo(TargetUtils.getExecutionInfo( + ruleContext.getRule(), ruleContext.isAllowTagsPropagation())); + } + } 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 47a8b7ceba0b21..afa8f482170544 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 @@ -15,6 +15,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ExecutionRequirements; import com.google.devtools.build.lib.actions.ParamFileInfo; @@ -29,6 +30,7 @@ import com.google.errorprone.annotations.CompileTimeConstant; import java.util.Collection; import java.util.List; +import java.util.Map; import javax.annotation.Nullable; /** Builder for actions that invoke the Android BusyBox. */ @@ -57,6 +59,7 @@ public final class BusyBoxActionBuilder { private final ImmutableList.Builder outputs = ImmutableList.builder(); private final SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder(); private final CustomCommandLine.Builder commandLine = CustomCommandLine.builder(); + private final ImmutableMap.Builder executionInfo = ImmutableMap.builder(); public static BusyBoxActionBuilder create( AndroidDataContext dataContext, @CompileTimeConstant String toolName) { @@ -322,6 +325,14 @@ public BusyBoxActionBuilder addAndroidJar() { return addInput("--androidJar", dataContext.getSdk().getAndroidJar()); } + /** + * Sets the map of execution info. + */ + public BusyBoxActionBuilder addExecutionInfo(Map info) { + executionInfo.putAll(info); + return this; + } + /** * Builds and registers this action. * @@ -341,12 +352,15 @@ public void buildAndRegister(String message, String mnemonic) { if (dataContext.isPersistentBusyboxToolsEnabled()) { commandLine.add("--logWarnings=false"); spawnActionBuilder - .setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED) .addCommandLine(commandLine.build(), WORKERS_FORCED_PARAM_FILE_INFO); + + executionInfo.putAll(ExecutionRequirements.WORKER_MODE_ENABLED); } else { spawnActionBuilder.addCommandLine(commandLine.build(), FORCED_PARAM_FILE_INFO); } + spawnActionBuilder.setExecutionInfo(executionInfo.build()); + dataContext.registerAction(spawnActionBuilder); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java index d033447642915a..70dee050787f20 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java @@ -50,13 +50,7 @@ import com.google.devtools.build.lib.collect.IterablesChain; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; -import com.google.devtools.build.lib.packages.AspectDefinition; -import com.google.devtools.build.lib.packages.AspectParameters; -import com.google.devtools.build.lib.packages.AttributeMap; -import com.google.devtools.build.lib.packages.NativeAspectClass; -import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; -import com.google.devtools.build.lib.packages.Rule; -import com.google.devtools.build.lib.packages.TriState; +import com.google.devtools.build.lib.packages.*; import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; import com.google.devtools.build.lib.rules.java.JavaCompilationInfoProvider; @@ -489,7 +483,7 @@ static Artifact createDexArchiveAction( String dexbuilderPrereq, Artifact jar, Set incrementalDexopts, - Artifact dexArchive) { + Artifact dexArchive) throws InterruptedException { CustomCommandLine args = new CustomCommandLine.Builder() .addExecPath("--input_jar", jar) @@ -501,6 +495,8 @@ static Artifact createDexArchiveAction( .useDefaultShellEnvironment() .setExecutable( ruleContext.getExecutablePrerequisite(dexbuilderPrereq, TransitionMode.HOST)) + .setExecutionInfo(TargetUtils.getExecutionInfo( + ruleContext.getRule(), ruleContext.isAllowTagsPropagation())) // WorkerSpawnStrategy expects the last argument to be @paramfile .addInput(jar) .addOutput(dexArchive) 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 a1164c7f944e18..6bed4e3ccdfe8e 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 @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.RuleErrorConsumer; +import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.rules.android.databinding.DataBinding; import com.google.devtools.build.lib.rules.android.databinding.DataBindingContext; @@ -65,7 +66,8 @@ public static ProcessedAndroidData processBinaryDataFrom( ResourceFilterFactory resourceFilterFactory, List noCompressExtensions, boolean crunchPng, - DataBindingContext dataBindingContext) + DataBindingContext dataBindingContext, + Map executionInfo) throws RuleErrorException, InterruptedException { AndroidResourcesProcessorBuilder builder = builderForNonIncrementalTopLevelTarget(dataContext, manifest, manifestValues) @@ -76,7 +78,8 @@ public static ProcessedAndroidData processBinaryDataFrom( .setMainDexProguardOut( AndroidBinary.createMainDexProguardSpec( dataContext.getLabel(), dataContext.getActionConstructionContext())) - .conditionalKeepRules(conditionalKeepRules); + .conditionalKeepRules(conditionalKeepRules) + .setExecutionInfo(ImmutableMap.copyOf(executionInfo)); dataBindingContext.supplyLayoutInfo(builder::setDataBindingInfoZip); return buildActionForBinary( dataContext, diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java index d06883f0e5266e..fc12b9524a67af 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java @@ -13,7 +13,9 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.rules.android.AndroidDataConverter.JoinerType; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; @@ -31,6 +33,8 @@ public class RClassGeneratorActionBuilder { private Artifact classJarOut; + private ImmutableMap executionInfo; + private boolean finalFields = true; public RClassGeneratorActionBuilder withDependencies(ResourceDependencies resourceDeps) { @@ -48,6 +52,14 @@ public RClassGeneratorActionBuilder setClassJarOut(Artifact classJarOut) { return this; } + /** + * Sets the map of execution info. + */ + public RClassGeneratorActionBuilder setExecutionInfo(ImmutableMap info) { + this.executionInfo = info; + return this; + } + public ResourceApk build(AndroidDataContext dataContext, ProcessedAndroidData data) { build(dataContext, data.getRTxt(), data.getManifest()); @@ -63,6 +75,10 @@ private void build( .maybeAddFlag("--packageForR", manifest.getPackage()) .addFlag(finalFields ? "--finalFields" : "--nofinalFields"); + if (executionInfo != null && !executionInfo.isEmpty()) { + builder.addExecutionInfo(executionInfo); + } + if (dependencies != null && !dependencies.getResourceContainers().isEmpty()) { builder .addTransitiveFlagForEach( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java index 22771a93df4fcb..af498fb93591ab 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java @@ -18,6 +18,7 @@ import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.CommandLine; @@ -30,6 +31,7 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.rules.cpp.CppHelper; import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel; import java.util.HashSet; @@ -372,7 +374,12 @@ public void build() throws InterruptedException { List jvmArgs = ImmutableList.of(SINGLEJAR_MAX_MEMORY); + ImmutableMap.Builder executionInfo = ImmutableMap.builder(); + executionInfo.putAll(TargetUtils.getExecutionInfo( + ruleContext.getRule(), ruleContext.isAllowTagsPropagation())); + if (!usingNativeSinglejar) { + executionInfo.putAll(ExecutionRequirements.WORKER_MODE_ENABLED); ruleContext.registerAction( new SpawnAction.Builder() .addTransitiveInputs(inputs.build()) @@ -385,7 +392,7 @@ public void build() throws InterruptedException { ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).setUseAlways(true).build()) .setProgressMessage("Building deploy jar %s", outputJar.prettyPrint()) .setMnemonic("JavaDeployJar") - .setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED) + .setExecutionInfo(executionInfo.build()) .build(ruleContext)); } else { ruleContext.registerAction( @@ -399,6 +406,7 @@ public void build() throws InterruptedException { ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).setUseAlways(true).build()) .setProgressMessage("Building deploy jar %s", outputJar.prettyPrint()) .setMnemonic("JavaDeployJar") + .setExecutionInfo(executionInfo.build()) .build(ruleContext)); } } diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java index a8ca9516b3aa4b..b4d6097382f0ba 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java @@ -392,7 +392,8 @@ public void testProcessBinaryDataGeneratesProguardOutput() throws Exception { ResourceFilterFactory.empty(), ImmutableList.of(), false, - DataBinding.contextFrom(ruleContext, dataContext.getAndroidConfig())) + DataBinding.contextFrom(ruleContext, dataContext.getAndroidConfig()), + ImmutableMap.of()) .generateRClass(dataContext); assertThat(resourceApk.getResourceProguardConfig()).isNotNull();