aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java
diff options
context:
space:
mode:
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.java136
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();
}