diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java | 136 |
1 files changed, 44 insertions, 92 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java index 6617ddc57b..1fd1d2059a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java @@ -13,21 +13,13 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; -import com.google.common.collect.Iterables; 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.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.NestedSet; 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.ResourceContainerConverter.ToArg; -import com.google.devtools.build.lib.rules.android.ResourceContainerConverter.ToArg.Includes; -import com.google.devtools.build.lib.util.OS; +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; /** * Builder for generating R classes for robolectric action. @@ -37,27 +29,28 @@ import com.google.devtools.build.lib.util.OS; */ public class RobolectricResourceSymbolsActionBuilder { - private static final ResourceContainerConverter.ToArg RESOURCE_CONTAINER_TO_ARG = - ResourceContainerConverter.builder() - .include(Includes.ResourceRoots) - .include(Includes.Manifest) - .include(Includes.RTxt) - .include(Includes.SymbolsBin) - .withSeparator(ToArg.SeparatorType.COLON_COMMA) - .toArgConverter(); - - private static final ResourceContainerConverter.ToArg RESOURCE_CONTAINER_TO_AAPT2_ARG = - ResourceContainerConverter.builder() - .include(Includes.ResourceRoots) - .include(Includes.Manifest) - .include(Includes.Aapt2RTxt) - .include(Includes.SymbolsBin) - .withSeparator(ToArg.SeparatorType.COLON_COMMA) - .toArgConverter(); + @AutoCodec @VisibleForSerialization + static final AndroidDataConverter<ValidatedAndroidData> TO_ARG = + AndroidDataConverter.<ValidatedAndroidData>builder(JoinerType.COLON_COMMA) + .withRoots(ValidatedAndroidData::getResourceRoots) + .withRoots(ValidatedAndroidData::getAssetRoots) + .withArtifact(ValidatedAndroidData::getManifest) + .maybeWithArtifact(ValidatedAndroidData::getRTxt) + .maybeWithArtifact(ValidatedAndroidData::getSymbols) + .build(); + + @AutoCodec @VisibleForSerialization + static final AndroidDataConverter<ValidatedAndroidData> TO_ARG_AAPT2 = + AndroidDataConverter.<ValidatedAndroidData>builder(JoinerType.COLON_COMMA) + .withRoots(ValidatedAndroidData::getResourceRoots) + .withRoots(ValidatedAndroidData::getAssetRoots) + .withArtifact(ValidatedAndroidData::getManifest) + .maybeWithArtifact(ValidatedAndroidData::getAapt2RTxt) + .maybeWithArtifact(ValidatedAndroidData::getSymbols) + .build(); private Artifact classJarOut; private final ResourceDependencies dependencies; - private AndroidSdkProvider sdk; private AndroidAaptVersion androidAaptVersion; private RobolectricResourceSymbolsActionBuilder(ResourceDependencies dependencies) { @@ -73,77 +66,36 @@ public class RobolectricResourceSymbolsActionBuilder { return this; } - public RobolectricResourceSymbolsActionBuilder setSdk(AndroidSdkProvider sdk) { - this.sdk = sdk; - return this; - } - public RobolectricResourceSymbolsActionBuilder targetAaptVersion( AndroidAaptVersion androidAaptVersion) { this.androidAaptVersion = androidAaptVersion; return this; } - public NestedSet<Artifact> buildAsClassPathEntry(RuleContext ruleContext) { - CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); - // Set the busybox tool. - builder.add("--tool").add("GENERATE_ROBOLECTRIC_R").add("--"); - - NestedSetBuilder<Artifact> inputs = NestedSetBuilder.stableOrder(); - - builder.addExecPath("--androidJar", sdk.getAndroidJar()); - inputs.add(sdk.getAndroidJar()); - - ToArg resourceContainerToArg; - - if (androidAaptVersion == AndroidAaptVersion.AAPT2) { - inputs.addTransitive(dependencies.getTransitiveAapt2RTxt()); - resourceContainerToArg = RESOURCE_CONTAINER_TO_AAPT2_ARG; - } else { - inputs.addTransitive(dependencies.getTransitiveRTxt()); - resourceContainerToArg = RESOURCE_CONTAINER_TO_ARG; - } - if (!Iterables.isEmpty(dependencies.getResourceContainers())) { - builder.addAll( - "--data", - VectorArg.join(resourceContainerToArg.listSeparator()) - .each(dependencies.getResourceContainers()) - .mapped(resourceContainerToArg)); + public NestedSet<Artifact> buildAsClassPathEntry(AndroidDataContext dataContext) { + BusyBoxActionBuilder builder = + BusyBoxActionBuilder.create(dataContext, "GENERATE_ROBOLECTRIC_R").addAndroidJar(); + + if (!dependencies.getResourceContainers().isEmpty()) { + builder + .addTransitiveFlag( + "--data", + dependencies.getResourceContainers(), + androidAaptVersion == AndroidAaptVersion.AAPT2 ? TO_ARG_AAPT2 : TO_ARG) + .addTransitiveInputValues( + androidAaptVersion == AndroidAaptVersion.AAPT2 + ? dependencies.getTransitiveAapt2RTxt() + : dependencies.getTransitiveRTxt()) + .addTransitiveInputValues(dependencies.getTransitiveResources()) + .addTransitiveInputValues(dependencies.getTransitiveAssets()) + .addTransitiveInputValues(dependencies.getTransitiveManifests()) + .addTransitiveInputValues(dependencies.getTransitiveSymbolsBin()); } - inputs - .addTransitive(dependencies.getTransitiveResources()) - .addTransitive(dependencies.getTransitiveAssets()) - .addTransitive(dependencies.getTransitiveManifests()) - .addTransitive(dependencies.getTransitiveSymbolsBin()); - - builder.addExecPath("--classJarOutput", classJarOut); - builder.addLabel("--targetLabel", ruleContext.getLabel()); - - SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder(); - - ParamFileInfo.Builder paramFile = ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED); - // Some flags (e.g. --mainData) may specify lists (or lists of lists) separated by special - // characters (colon, semicolon, hashmark, ampersand) that don't work on Windows, and quoting - // semantics are very complicated (more so than in Bash), so let's just always use a parameter - // file. - // TODO(laszlocsomor), TODO(corysmith): restructure the Android BusyBux's flags by deprecating - // list-type and list-of-list-type flags that use such problematic separators in favor of - // multi-value flags (to remove one level of listing) and by changing all list separators to a - // platform-safe character (= comma). - paramFile.setUseAlways(OS.getCurrent() == OS.WINDOWS); - - ruleContext.registerAction( - spawnActionBuilder - .useDefaultShellEnvironment() - .addTransitiveInputs(inputs.build()) - .addOutput(classJarOut) - .addCommandLine(builder.build(), paramFile.build()) - .setExecutable( - ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) - .setProgressMessage("Generating R classes for %s", ruleContext.getLabel()) - .setMnemonic("GenerateRobolectricRClasses") - .build(ruleContext)); + builder + .addOutput("--classJarOutput", classJarOut) + .addLabelFlag("--targetLabel") + .buildAndRegister("Generating R classes", "GenerateRobolectricRClasses"); return NestedSetBuilder.<Artifact>naiveLinkOrder().add(classJarOut).build(); } |