aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android
diff options
context:
space:
mode:
authorGravatar tomlu <tomlu@google.com>2017-09-14 23:24:06 +0200
committerGravatar Philipp Wollermann <philwo@google.com>2017-09-15 11:29:04 +0200
commit7df9198a771ef2eabef396dcb7a21e6cbb3cabb0 (patch)
treee8929823a7012639db9a560589b89beacecdb757 /src/main/java/com/google/devtools/build/lib/rules/android
parent2e7b804d29f3c1fa979d8a226d62d970dada64e2 (diff)
Support multiple command lines / params files in SpawnAction.
This is necessary for the upcoming Skylark implementation of param files. PiperOrigin-RevId: 168744486
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifestMergeHelper.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java31
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java26
21 files changed, 138 insertions, 157 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java
index c4c194bcb7..c3c6365152 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java
@@ -25,6 +25,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
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.CommandLine;
+import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType;
import com.google.devtools.build.lib.util.OS;
@@ -127,6 +128,7 @@ public class AarGeneratorBuilder {
args.add("--throwOnResourceConflict");
}
+ ParamFileInfo paramFileInfo = null;
if (OS.getCurrent() == OS.WINDOWS) {
// 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
@@ -136,7 +138,7 @@ public class AarGeneratorBuilder {
// 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).
- builder.alwaysUseParameterFile(ParameterFileType.UNQUOTED);
+ paramFileInfo = ParamFileInfo.builder(ParameterFileType.UNQUOTED).setUseAlways(true).build();
}
ruleContext.registerAction(
@@ -144,7 +146,7 @@ public class AarGeneratorBuilder {
.useDefaultShellEnvironment()
.addInputs(ImmutableList.<Artifact>copyOf(ins))
.addOutputs(ImmutableList.<Artifact>copyOf(outs))
- .setCommandLine(CommandLine.of(args))
+ .addCommandLine(CommandLine.of(args), paramFileInfo)
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Building AAR package for %s", ruleContext.getLabel())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
index e3d5a12733..389abc0e91 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
@@ -182,7 +182,7 @@ public class AarImport implements RuleConfiguredTargetFactory {
.setProgressMessage("Extracting %s from %s", filename, aar.getFilename())
.addInput(aar)
.addOutput(outputArtifact)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath("x", aar)
.addPath("-d", outputArtifact.getExecPath().getParentDirectory())
@@ -201,7 +201,7 @@ public class AarImport implements RuleConfiguredTargetFactory {
.setMnemonic("AarResourcesExtractor")
.addInput(aar)
.addOutput(outputTree)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath("--input_aar", aar)
.addExecPath("--output_res_dir", outputTree)
@@ -221,7 +221,7 @@ public class AarImport implements RuleConfiguredTargetFactory {
.addInput(aar)
.addOutput(jarsTreeArtifact)
.addOutput(singleJarParamFile)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath("--input_aar", aar)
.addExecPath("--output_dir", jarsTreeArtifact)
@@ -238,7 +238,7 @@ public class AarImport implements RuleConfiguredTargetFactory {
.addInput(jarsTreeArtifact)
.addOutput(mergedJar)
.addInput(paramFile)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath("--output", mergedJar)
.add("--dont_change_compression")
@@ -259,7 +259,7 @@ public class AarImport implements RuleConfiguredTargetFactory {
.setProgressMessage("Filtering AAR native libs by architecture")
.addInput(aar)
.addOutput(outputZip)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath("--input_aar", aar)
.add("--cpu", ruleContext.getConfiguration().getCpu())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java
index 3a5d8d35ce..310c7f655b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java
@@ -21,6 +21,7 @@ import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.CommandLine;
+import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder;
import com.google.devtools.build.lib.analysis.config.CompilationMode;
@@ -108,8 +109,8 @@ public final class AndroidAaptActionHelper {
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_aapt_java_generator", Mode.HOST))
.addOutput(javaSourcesJar)
- .setCommandLine(CommandLine.of(args))
- .useParameterFile(ParameterFileType.UNQUOTED)
+ .addCommandLine(
+ CommandLine.of(args), ParamFileInfo.builder(ParameterFileType.UNQUOTED).build())
.setProgressMessage("Generating Java resources")
.setMnemonic("AaptJavaGenerator");
if (rTxt != null) {
@@ -149,8 +150,8 @@ public final class AndroidAaptActionHelper {
.addOutput(apk)
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_aapt_apk_generator", Mode.HOST))
- .setCommandLine(CommandLine.of(args))
- .useParameterFile(ParameterFileType.UNQUOTED)
+ .addCommandLine(
+ CommandLine.of(args), ParamFileInfo.builder(ParameterFileType.UNQUOTED).build())
.setProgressMessage("Generating apk resources")
.setMnemonic("AaptResourceApk")
.build(ruleContext));
@@ -277,8 +278,9 @@ public final class AndroidAaptActionHelper {
.addOutputs(outputs.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_aapt_apk_generator", Mode.HOST))
- .setCommandLine(CommandLine.of(aaptCommand))
- .useParameterFile(ParameterFileType.UNQUOTED)
+ .addCommandLine(
+ CommandLine.of(aaptCommand),
+ ParamFileInfo.builder(ParameterFileType.UNQUOTED).build())
.setProgressMessage("Generating Proguard configuration for resources")
.setMnemonic("AaptProguardConfiguration")
.build(ruleContext));
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 c45aeecc7e..067a45a1dd 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
@@ -529,7 +529,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
|| getMultidexMode(ruleContext) == MultidexMode.LEGACY) {
commandLine.add("--keep-main-dex");
}
- rexActionBuilder.setCommandLine(commandLine.build());
+ rexActionBuilder.addCommandLine(commandLine.build());
ruleContext.registerAction(rexActionBuilder.build(ruleContext));
} else {
finalDexes = dexingOutput.classesDexZip;
@@ -1036,7 +1036,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.setExecutable(ruleContext.getExecutablePrerequisite("$merge_dexzips", Mode.HOST))
.addInputs(shardDexes)
.addOutput(classesDex)
- .setCommandLine(mergeCommandLine)
+ .addCommandLine(mergeCommandLine)
.build(ruleContext));
if (incrementalDexing.contains(AndroidBinaryType.MULTIDEX_SHARDED)) {
// Using the deploy jar for java resources gives better "bazel mobile-install" performance
@@ -1140,7 +1140,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
dexmerger.addInput(mainDexList);
commandLine.addExecPath("--main-dex-list", mainDexList);
}
- dexmerger.setCommandLine(commandLine.build());
+ dexmerger.addCommandLine(commandLine.build());
ruleContext.registerAction(dexmerger.build(ruleContext));
}
@@ -1320,7 +1320,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
}
}
- shardAction.setCommandLine(shardCommandLine.build());
+ shardAction.addCommandLine(shardCommandLine.build());
ruleContext.registerAction(shardAction.build(ruleContext));
return javaResourceJar;
}
@@ -1354,7 +1354,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.setMnemonic("TrimDexZip")
.addInput(inputZip)
.addOutput(outputZip)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.add("--exclude_build_data")
.add("--dont_change_compression")
@@ -1420,7 +1420,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
androidSemantics.addMainDexListActionArguments(
ruleContext, streamlinedBuilder, streamlinedCommandLine, proguardOutputMap);
- streamlinedBuilder.setCommandLine(streamlinedCommandLine.build());
+ streamlinedBuilder.addCommandLine(streamlinedCommandLine.build());
ruleContext.registerAction(streamlinedBuilder.build(ruleContext));
// Create the main dex classes list.
@@ -1435,7 +1435,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.addOutput(mainDexList)
.addInput(strippedJar)
.addInput(jar)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath(mainDexList)
.addExecPath(strippedJar)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java
index b99940c493..7d3f5001d2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java
@@ -28,6 +28,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
+import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
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;
@@ -160,12 +161,12 @@ public final class AndroidBinaryMobileInstall {
ruleContext.getExecutablePrerequisite("$build_incremental_dexmanifest", Mode.HOST))
.addOutput(incrementalDexManifest)
.addInputs(dexingOutput.shardDexZips)
- .useParameterFile(ParameterFileType.UNQUOTED)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath(incrementalDexManifest)
.addExecPaths(dexingOutput.shardDexZips)
- .build())
+ .build(),
+ ParamFileInfo.builder(ParameterFileType.UNQUOTED).build())
.build(ruleContext));
Artifact stubData = ruleContext.getImplicitOutputArtifact(
@@ -277,7 +278,7 @@ public final class AndroidBinaryMobileInstall {
.setExecutable(ruleContext.getExecutablePrerequisite("$strip_resources", Mode.HOST))
.addInput(resourceApk.getArtifact())
.addOutput(splitMainApkResources)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath("--input_resource_apk", resourceApk.getArtifact())
.addExecPath("--output_resource_apk", splitMainApkResources)
@@ -450,7 +451,7 @@ public final class AndroidBinaryMobileInstall {
}
}
- builder.setCommandLine(commandLine.build());
+ builder.addCommandLine(commandLine.build());
ruleContext.registerAction(builder.build(ruleContext));
}
@@ -485,7 +486,7 @@ public final class AndroidBinaryMobileInstall {
commandLine.addExecPath("--split_apk", splitApk);
}
- builder.setCommandLine(commandLine.build());
+ builder.addCommandLine(commandLine.build());
ruleContext.registerAction(builder.build(ruleContext));
}
@@ -504,7 +505,7 @@ public final class AndroidBinaryMobileInstall {
.addOutput(splitResources)
.addInput(splitManifest)
.addInput(sdk.getAndroidJar())
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.add("package")
.addExecPath("-F", splitResources)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index d590dd635c..7a116e0815 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -230,7 +230,7 @@ public class AndroidCommon {
.addOutput(classesDex)
.setProgressMessage("Converting %s to dex format", jarToDex.getExecPathString())
.setMnemonic("AndroidDexer")
- .setCommandLine(commandLine.build())
+ .addCommandLine(commandLine.build())
.setResources(ResourceSet.createWithRamCpuIo(4096.0, 5.0, 0.0));
if (mainDexList != null) {
builder.addInput(mainDexList);
@@ -508,7 +508,7 @@ public class AndroidCommon {
.addInput(jarJarRuleFile)
.addInput(binaryResourcesJar)
.addOutput(resourcesJar)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.add("process")
.addExecPath(jarJarRuleFile)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java
index 22952e03b6..7eec313f4a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java
@@ -337,7 +337,7 @@ public class AndroidDevice implements RuleConfiguredTargetFactory {
spawnBuilder.addInput(defaultProperties.get());
commandLine.addPrefixedExecPath("--default_properties_file=", defaultProperties.get());
}
- spawnBuilder.setCommandLine(commandLine.build());
+ spawnBuilder.addCommandLine(commandLine.build());
ruleContext.registerAction(spawnBuilder.build(ruleContext));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
index 2524c03f59..4d556025d6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
+import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -333,7 +334,7 @@ public class AndroidIdlHelper {
.addOutput(idlClassJar)
.addOutput(idlSourceJar)
.setExecutable(ruleContext.getExecutablePrerequisite("$idlclass", Mode.HOST))
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath("--manifest_proto", manifestProtoOutput)
.addExecPath("--class_jar", classJar)
@@ -342,8 +343,8 @@ public class AndroidIdlHelper {
.add("--temp_dir")
.addPath(idlTempDir)
.addExecPaths(ImmutableList.copyOf(generatedIdlJavaFiles))
- .build())
- .useParameterFile(ParameterFileType.SHELL_QUOTED)
+ .build(),
+ ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).build())
.setProgressMessage("Building idl jars %s", idlClassJar.prettyPrint())
.setMnemonic("AndroidIdlJars")
.build(ruleContext));
@@ -372,7 +373,7 @@ public class AndroidIdlHelper {
.addOutput(output)
.setProgressMessage("Android IDL generation")
.setMnemonic("AndroidIDLGenerate")
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.add("-b") // Fail if trying to compile a parcelable.
.addAll(importArgs)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifestMergeHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifestMergeHelper.java
index 29b96b66c4..039b91a88a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifestMergeHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifestMergeHelper.java
@@ -47,7 +47,7 @@ public final class AndroidManifestMergeHelper {
.setExecutable(ruleContext.getPrerequisite("$android_manifest_merge_tool", Mode.HOST))
.setProgressMessage("Merging Android Manifests")
.setMnemonic("AndroidManifestMerger")
- .setCommandLine(commandLine.build())
+ .addCommandLine(commandLine.build())
.build(ruleContext));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
index 0d39a8696d..fe0b68f22e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
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.CustomCommandLine;
+import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.android.ResourceContainerConverter.Builder.SeparatorType;
@@ -182,20 +183,16 @@ public class AndroidResourceMergingActionBuilder {
}
SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder();
-
- if (OS.getCurrent() == OS.WINDOWS) {
- // 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).
- spawnActionBuilder.alwaysUseParameterFile(ParameterFileType.UNQUOTED);
- } else {
- spawnActionBuilder.useParameterFile(ParameterFileType.UNQUOTED);
- }
+ ParamFileInfo.Builder paramFileInfo = ParamFileInfo.builder(ParameterFileType.UNQUOTED);
+ // 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).
+ paramFileInfo.setUseAlways(OS.getCurrent() == OS.WINDOWS);
// Create the spawn action.
ruleContext.registerAction(
@@ -203,7 +200,7 @@ public class AndroidResourceMergingActionBuilder {
.useDefaultShellEnvironment()
.addTransitiveInputs(inputs.build())
.addOutputs(ImmutableList.copyOf(outs))
- .setCommandLine(builder.build())
+ .addCommandLine(builder.build(), paramFileInfo.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Merging Android resources for %s", ruleContext.getLabel())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
index 6a0f7a6061..bd10d0b449 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
@@ -26,6 +26,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
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.CustomCommandLine;
+import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
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;
@@ -145,19 +146,16 @@ public class AndroidResourceParsingActionBuilder {
builder.addExecPath("--output", output);
SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder();
- if (OS.getCurrent() == OS.WINDOWS) {
- // 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).
- spawnActionBuilder.alwaysUseParameterFile(ParameterFileType.UNQUOTED);
- } else {
- spawnActionBuilder.useParameterFile(ParameterFileType.UNQUOTED);
- }
+ ParamFileInfo.Builder paramFileInfo = ParamFileInfo.builder(ParameterFileType.UNQUOTED);
+ // 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).
+ paramFileInfo.setUseAlways(OS.getCurrent() == OS.WINDOWS);
// Create the spawn action.
ruleContext.registerAction(
@@ -165,7 +163,7 @@ public class AndroidResourceParsingActionBuilder {
.useDefaultShellEnvironment()
.addTransitiveInputs(inputs.build())
.addOutputs(ImmutableList.of(output))
- .setCommandLine(builder.build())
+ .addCommandLine(builder.build(), paramFileInfo.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Parsing Android resources for %s", ruleContext.getLabel())
@@ -198,11 +196,12 @@ public class AndroidResourceParsingActionBuilder {
// Create the spawn action.
ruleContext.registerAction(
new SpawnAction.Builder()
- .useParameterFile(ParameterFileType.UNQUOTED)
.useDefaultShellEnvironment()
.addTransitiveInputs(inputs.build())
.addOutputs(ImmutableList.copyOf(outs))
- .setCommandLine(flatFileBuilder.build())
+ .addCommandLine(
+ flatFileBuilder.build(),
+ ParamFileInfo.builder(ParameterFileType.UNQUOTED).build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Compiling Android resources for %s", ruleContext.getLabel())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java
index 50cfa8acb3..ac051ea20c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java
@@ -24,6 +24,7 @@ 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.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
+import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import java.util.ArrayList;
import java.util.List;
@@ -193,12 +194,12 @@ public class AndroidResourceValidatorActionBuilder {
ruleContext.registerAction(
new SpawnAction.Builder()
- .useParameterFile(ParameterFileType.UNQUOTED)
.useDefaultShellEnvironment()
.addTool(sdk.getAapt2())
.addInputs(inputs.build())
.addOutputs(outs.build())
- .setCommandLine(builder.build())
+ .addCommandLine(
+ builder.build(), ParamFileInfo.builder(ParameterFileType.UNQUOTED).build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage(
@@ -269,12 +270,12 @@ public class AndroidResourceValidatorActionBuilder {
// Create the spawn action.
ruleContext.registerAction(
spawnActionBuilder
- .useParameterFile(ParameterFileType.UNQUOTED)
.useDefaultShellEnvironment()
.addTool(sdk.getAapt())
.addInputs(inputs.build())
.addOutputs(ImmutableList.copyOf(outs))
- .setCommandLine(builder.build())
+ .addCommandLine(
+ builder.build(), ParamFileInfo.builder(ParameterFileType.UNQUOTED).build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Validating Android resources for %s", ruleContext.getLabel())
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 6fd04a2088..57f9a4ff57 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
@@ -23,6 +23,7 @@ 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.Builder;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
+import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
@@ -278,19 +279,16 @@ public class AndroidResourcesProcessorBuilder {
configureCommonFlags(outs, inputs, builder);
- if (OS.getCurrent() == OS.WINDOWS) {
- // 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).
- this.spawnActionBuilder.alwaysUseParameterFile(ParameterFileType.UNQUOTED);
- } else {
- this.spawnActionBuilder.useParameterFile(ParameterFileType.UNQUOTED);
- }
+ ParamFileInfo.Builder paramFileInfo = ParamFileInfo.builder(ParameterFileType.UNQUOTED);
+ // 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).
+ paramFileInfo.setUseAlways(OS.getCurrent() == OS.WINDOWS);
// Create the spawn action.
ruleContext.registerAction(
@@ -300,7 +298,7 @@ public class AndroidResourcesProcessorBuilder {
.addTool(sdk.getAapt2())
.addTransitiveInputs(inputs.build())
.addOutputs(ImmutableList.<Artifact>copyOf(outs))
- .setCommandLine(builder.build())
+ .addCommandLine(builder.build(), paramFileInfo.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Processing Android resources for %s", ruleContext.getLabel())
@@ -344,19 +342,16 @@ public class AndroidResourcesProcessorBuilder {
builder.addExecPath("--aapt", sdk.getAapt().getExecutable());
configureCommonFlags(outs, inputs, builder);
- if (OS.getCurrent() == OS.WINDOWS) {
- // 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).
- this.spawnActionBuilder.alwaysUseParameterFile(ParameterFileType.UNQUOTED);
- } else {
- this.spawnActionBuilder.useParameterFile(ParameterFileType.UNQUOTED);
- }
+ ParamFileInfo.Builder paramFileInfo = ParamFileInfo.builder(ParameterFileType.UNQUOTED);
+ // 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).
+ paramFileInfo.setUseAlways(OS.getCurrent() == OS.WINDOWS);
// Create the spawn action.
ruleContext.registerAction(
@@ -366,7 +361,7 @@ public class AndroidResourcesProcessorBuilder {
.addTool(sdk.getAapt())
.addTransitiveInputs(inputs.build())
.addOutputs(ImmutableList.copyOf(outs))
- .setCommandLine(builder.build())
+ .addCommandLine(builder.build(), paramFileInfo.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Processing Android resources for %s", ruleContext.getLabel())
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 bd1f60e25a..c7abbb81f6 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
@@ -229,7 +229,7 @@ public class ApkActionsBuilder {
commandLine.addExecPath(classesDex);
}
- actionBuilder.setCommandLine(commandLine.build());
+ actionBuilder.addCommandLine(commandLine.build());
ruleContext.registerAction(actionBuilder.build(ruleContext));
}
@@ -303,7 +303,7 @@ public class ApkActionsBuilder {
.setProgressMessage("Extracting Java resources from deploy jar for %s", apkName)
.addInput(javaResourceZip)
.addOutput(extractedJavaResourceZip)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.addExecPath(javaResourceZip)
.addExecPath(extractedJavaResourceZip)
@@ -338,9 +338,9 @@ public class ApkActionsBuilder {
singleJarCommandLine.addAll("--nocompress_suffixes", noCompressExtensions);
}
- compressedApkActionBuilder.setCommandLine(compressedApkCommandLine.build());
+ compressedApkActionBuilder.addCommandLine(compressedApkCommandLine.build());
ruleContext.registerAction(compressedApkActionBuilder.build(ruleContext));
- singleJarActionBuilder.setCommandLine(singleJarCommandLine.build());
+ singleJarActionBuilder.addCommandLine(singleJarCommandLine.build());
ruleContext.registerAction(singleJarActionBuilder.build(ruleContext));
}
@@ -355,7 +355,7 @@ public class ApkActionsBuilder {
.setMnemonic("AndroidZipAlign")
.addInput(inputApk)
.addOutput(zipAlignedApk)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.add("-p") // memory page aligment for stored shared object files
.add("4")
@@ -382,7 +382,7 @@ public class ApkActionsBuilder {
.addInput(signingKey)
.addOutput(signedAndZipalignedApk)
.addInput(unsignedApk)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.add("sign")
.add("--ks")
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
index 91579b6f0e..97028a01d4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
@@ -89,7 +89,7 @@ public final class ApplicationManifest {
commandLine.add("--override_package", overridePackage);
}
- builder.setCommandLine(commandLine.build());
+ builder.addCommandLine(commandLine.build());
ruleContext.registerAction(builder.build(ruleContext));
return new ApplicationManifest(ruleContext, result, targetAaptVersion);
}
@@ -123,7 +123,7 @@ public final class ApplicationManifest {
commandLine.add("--override_package", overridePackage);
}
- builder.setCommandLine(commandLine.build());
+ builder.addCommandLine(commandLine.build());
ruleContext.registerAction(builder.build(ruleContext));
return new ApplicationManifest(ruleContext, stubManifest, targetAaptVersion);
@@ -142,7 +142,7 @@ public final class ApplicationManifest {
.setMnemonic("InjectInstantRunStubApplication")
.addInput(manifest)
.addOutput(stubManifest)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder()
.add("--mode=instant_run")
.addExecPath("--input_manifest", manifest)
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 bf5491f132..b3db32e1ac 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
@@ -401,7 +401,7 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
.addOutput(result)
.setMnemonic("Desugar")
.setProgressMessage("Desugaring %s for Android", jar.prettyPrint())
- .setCommandLine(CustomCommandLine.builder().addPrefixedExecPath("@", paramFile).build())
+ .addCommandLine(CustomCommandLine.builder().addPrefixedExecPath("@", paramFile).build())
.build(ruleContext));
return result;
}
@@ -453,7 +453,7 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
.setMnemonic("DexBuilder")
.setProgressMessage(
"Dexing %s with applicable dexopts %s", jar.prettyPrint(), incrementalDexopts)
- .setCommandLine(
+ .addCommandLine(
CustomCommandLine.builder().addPrefixedExecPath("@", paramFile).build());
if (getAndroidConfig(ruleContext).useWorkersWithDexbuilder()) {
dexbuilder.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java
index 185953c5c1..b0e9e66bee 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java
@@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
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.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -89,11 +90,11 @@ public class LibraryRGeneratorActionBuilder {
SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder();
ruleContext.registerAction(
spawnActionBuilder
- .useParameterFile(ParameterFileType.UNQUOTED)
.useDefaultShellEnvironment()
.addTransitiveInputs(inputs.build())
.addOutputs(ImmutableList.<Artifact>of(rJavaClassJar))
- .setCommandLine(builder.build())
+ .addCommandLine(
+ builder.build(), ParamFileInfo.builder(ParameterFileType.UNQUOTED).build())
.setExecutable(executable)
.setProgressMessage("Generating Library R Classes: %s", ruleContext.getLabel())
.setMnemonic("LibraryRClassGenerator")
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java
index 1203a2faab..91ee23e75b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
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.CustomCommandLine;
+import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -131,26 +132,23 @@ public class ManifestMergerActionBuilder {
outputs.add(logOut);
}
- if (OS.getCurrent() == OS.WINDOWS) {
- // 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).
- spawnActionBuilder.alwaysUseParameterFile(ParameterFileType.SHELL_QUOTED);
- } else {
- spawnActionBuilder.useParameterFile(ParameterFileType.SHELL_QUOTED);
- }
+ ParamFileInfo.Builder paramFileInfo = 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).
+ paramFileInfo.setUseAlways(OS.getCurrent() == OS.WINDOWS);
ruleContext.registerAction(
this.spawnActionBuilder
.useDefaultShellEnvironment()
.addTransitiveInputs(inputs.build())
.addOutputs(outputs.build())
- .setCommandLine(builder.build())
+ .addCommandLine(builder.build(), paramFileInfo.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Merging manifest for %s", ruleContext.getLabel())
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 137bd653cb..dd79c8fbb7 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
@@ -24,12 +24,12 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
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.ParamFileInfo;
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.collect.nestedset.Order;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
-import com.google.devtools.build.lib.util.OS;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
@@ -121,27 +121,13 @@ public class RClassGeneratorActionBuilder {
// Create the spawn action.
SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder();
- if (OS.getCurrent() == OS.WINDOWS) {
- // 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).
- spawnActionBuilder.alwaysUseParameterFile(ParameterFileType.UNQUOTED);
- } else {
- spawnActionBuilder.useParameterFile(ParameterFileType.SHELL_QUOTED);
- }
-
ruleContext.registerAction(
spawnActionBuilder
- .useParameterFile(ParameterFileType.SHELL_QUOTED)
.useDefaultShellEnvironment()
.addTransitiveInputs(inputs.build())
.addOutputs(ImmutableList.<Artifact>copyOf(outs))
- .setCommandLine(builder.build())
+ .addCommandLine(
+ builder.build(), ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Generating R Classes: %s", ruleContext.getLabel())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
index 4bae0bc02c..7434e3429a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
@@ -239,7 +239,7 @@ public class ResourceShrinkerActionBuilder {
.addTool(aapt)
.addInputs(inputs.build())
.addOutputs(outputs.build())
- .setCommandLine(commandLine.build())
+ .addCommandLine(commandLine.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Shrinking resources for %s", ruleContext.getLabel())
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 e752d82108..1eaa346cf3 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
@@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
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.ParamFileInfo;
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;
@@ -92,26 +93,23 @@ public class RobolectricResourceSymbolsActionBuilder {
builder.addExecPath("--classJarOutput", classJarOut);
SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder();
- if (OS.getCurrent() == OS.WINDOWS) {
- // 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).
- spawnActionBuilder.alwaysUseParameterFile(ParameterFileType.UNQUOTED);
- } else {
- spawnActionBuilder.useParameterFile(ParameterFileType.UNQUOTED);
- }
+ ParamFileInfo.Builder paramFile = ParamFileInfo.builder(ParameterFileType.UNQUOTED);
+ // 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)
- .setCommandLine(builder.build())
+ .addCommandLine(builder.build(), paramFile.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage("Generating R classes for %s", ruleContext.getLabel())