From c2cf1132a75d03cc37888fe8c2b9583c7ce198c5 Mon Sep 17 00:00:00 2001 From: asteinb Date: Fri, 25 May 2018 11:16:34 -0700 Subject: Automated rollback of commit 372fbc2f016157b0331f83a20edad10d4b4cf9f7. *** Reason for rollback *** Roll forward with fix: I was assuming that R.txt and symbols files are always set, but they can be null in some cases (especially in the old data processing pipeline). Properly handle them here. RELNOTES: none PiperOrigin-RevId: 198075743 --- .../android/RClassGeneratorActionBuilder.java | 103 ++++++--------------- 1 file changed, 28 insertions(+), 75 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java') 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 849881297c..c4e33f1eee 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,21 +13,9 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; -import com.google.common.base.Strings; -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.Builder; -import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg; -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.NestedSetBuilder; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; import com.google.devtools.build.lib.rules.android.AndroidDataConverter.JoinerType; -import java.util.ArrayList; -import java.util.List; import java.util.function.Function; /** Builds up the spawn action for $android_rclass_generator. */ @@ -42,18 +30,12 @@ public class RClassGeneratorActionBuilder { .with(chooseDepsToArg(AndroidAaptVersion.AAPT2)) .build(); - private final RuleContext ruleContext; private ResourceDependencies dependencies; private Artifact classJarOut; private AndroidAaptVersion version; - /** @param ruleContext The RuleContext that is used to create a SpawnAction.Builder. */ - public RClassGeneratorActionBuilder(RuleContext ruleContext) { - this.ruleContext = ruleContext; - } - public RClassGeneratorActionBuilder withDependencies(ResourceDependencies resourceDeps) { this.dependencies = resourceDeps; return this; @@ -69,72 +51,43 @@ public class RClassGeneratorActionBuilder { return this; } - public ResourceContainer build(ResourceContainer primary) { - build(primary.getRTxt(), ProcessedAndroidManifest.from(primary)); + public ResourceContainer build(AndroidDataContext dataContext, ResourceContainer primary) { + build(dataContext, primary.getRTxt(), ProcessedAndroidManifest.from(primary)); return primary.toBuilder().setJavaClassJar(classJarOut).build(); } - public ResourceApk build(ProcessedAndroidData data) { - build(data.getRTxt(), data.getManifest()); + public ResourceApk build(AndroidDataContext dataContext, ProcessedAndroidData data) { + build(dataContext, data.getRTxt(), data.getManifest()); return data.withValidatedResources(classJarOut); } - private void build(Artifact rTxt, ProcessedAndroidManifest manifest) { - Builder builder = new Builder(); - - // Set the busybox tool. - builder.add("--tool").add("GENERATE_BINARY_R").add("--"); - - NestedSetBuilder inputs = NestedSetBuilder.naiveLinkOrder(); - inputs.addAll( - ruleContext - .getExecutablePrerequisite("$android_resources_busybox", Mode.HOST) - .getRunfilesSupport() - .getRunfilesArtifacts()); - - List outs = new ArrayList<>(); - builder.addExecPath("--primaryRTxt", rTxt); - inputs.add(rTxt); - builder.addExecPath("--primaryManifest", manifest.getManifest()); - inputs.add(manifest.getManifest()); - if (!Strings.isNullOrEmpty(manifest.getPackage())) { - builder.add("--packageForR", manifest.getPackage()); + private void build( + AndroidDataContext dataContext, Artifact rTxt, ProcessedAndroidManifest manifest) { + BusyBoxActionBuilder builder = + BusyBoxActionBuilder.create(dataContext, "GENERATE_BINARY_R") + .addInput("--primaryRTxt", rTxt) + .addInput("--primaryManifest", manifest.getManifest()) + .maybeAddFlag("--packageForR", manifest.getPackage()); + + if (dependencies != null && !dependencies.getResourceContainers().isEmpty()) { + builder + .addTransitiveFlagForEach( + "--library", + dependencies.getResourceContainers(), + version == AndroidAaptVersion.AAPT2 ? AAPT2_CONVERTER : AAPT_CONVERTER) + .addTransitiveInputValues( + version == AndroidAaptVersion.AAPT2 + ? dependencies.getTransitiveAapt2RTxt() + : dependencies.getTransitiveRTxt()) + .addTransitiveInputValues(dependencies.getTransitiveManifests()); } - if (dependencies != null) { - if (!dependencies.getResourceContainers().isEmpty()) { - builder.addAll( - VectorArg.addBefore("--library") - .each(dependencies.getResourceContainers()) - .mapped(version == AndroidAaptVersion.AAPT2 ? AAPT2_CONVERTER : AAPT_CONVERTER)); - if (version == AndroidAaptVersion.AAPT2) { - inputs.addTransitive(dependencies.getTransitiveAapt2RTxt()); - } else { - inputs.addTransitive(dependencies.getTransitiveRTxt()); - } - inputs.addTransitive(dependencies.getTransitiveManifests()); - } - } - builder.addExecPath("--classJarOutput", classJarOut); - outs.add(classJarOut); - builder.addLabel("--targetLabel", ruleContext.getLabel()); - - // Create the spawn action. - SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder(); - - ruleContext.registerAction( - spawnActionBuilder - .useDefaultShellEnvironment() - .addTransitiveInputs(inputs.build()) - .addOutputs(ImmutableList.copyOf(outs)) - .addCommandLine( - builder.build(), ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).build()) - .setExecutable( - ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) - .setProgressMessage("Generating R Classes: %s", ruleContext.getLabel()) - .setMnemonic("RClassGenerator") - .build(ruleContext)); + + builder + .addOutput("--classJarOutput", classJarOut) + .addLabelFlag("--targetLabel") + .buildAndRegister("Generating R Classes", "RClassGenerator"); } private static Function chooseDepsToArg( -- cgit v1.2.3