diff options
author | 2017-09-14 23:24:06 +0200 | |
---|---|---|
committer | 2017-09-15 11:29:04 +0200 | |
commit | 7df9198a771ef2eabef396dcb7a21e6cbb3cabb0 (patch) | |
tree | e8929823a7012639db9a560589b89beacecdb757 /src/main/java/com/google/devtools/build/lib/rules/android | |
parent | 2e7b804d29f3c1fa979d8a226d62d970dada64e2 (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')
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()) |