diff options
Diffstat (limited to 'src/main/java')
7 files changed, 126 insertions, 8 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 7733909840..ee098453e6 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 @@ -20,12 +20,14 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.Artifact; +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.ActionConstructionContext; import com.google.devtools.build.lib.analysis.actions.CommandLine; 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; import java.util.ArrayList; import java.util.List; @@ -89,7 +91,7 @@ public class AarGeneratorBuilder { List<Artifact> outs = new ArrayList<>(); List<Artifact> ins = new ArrayList<>(); List<String> args = new ArrayList<>(); - + // Set the busybox tool args.add("--tool"); args.add("GENERATE_AAR"); @@ -125,6 +127,18 @@ public class AarGeneratorBuilder { args.add("--throwOnResourceConflict"); } + 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). + builder.alwaysUseParameterFile(ParameterFileType.UNQUOTED); + } + ruleContext.registerAction( this.builder .addInputs(ImmutableList.<Artifact>copyOf(ins)) 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 d5ba575068..abb7735e7c 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 @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; 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; +import com.google.devtools.build.lib.util.OS; import java.util.ArrayList; import java.util.List; @@ -182,10 +183,24 @@ 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); + } + // Create the spawn action. ruleContext.registerAction( spawnActionBuilder - .useParameterFile(ParameterFileType.UNQUOTED) .addTransitiveInputs(inputs.build()) .addOutputs(ImmutableList.copyOf(outs)) .setCommandLine(builder.build()) 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 2ff46cd9d7..62ea11d86e 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 @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; 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.util.OS; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; import java.util.List; @@ -141,10 +142,24 @@ public class AndroidResourceParsingActionBuilder { Preconditions.checkNotNull(output); 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); + } + // Create the spawn action. ruleContext.registerAction( - new SpawnAction.Builder() - .useParameterFile(ParameterFileType.UNQUOTED) + spawnActionBuilder .addTransitiveInputs(inputs.build()) .addOutputs(ImmutableList.of(output)) .setCommandLine(builder.build()) 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 fa12915c6a..563570c384 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 @@ -26,6 +26,7 @@ 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; import com.google.devtools.build.lib.rules.android.ResourceContainerConverter.Builder.SeparatorType; +import com.google.devtools.build.lib.util.OS; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -286,10 +287,24 @@ 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); + } + // Create the spawn action. ruleContext.registerAction( this.spawnActionBuilder - .useParameterFile(ParameterFileType.UNQUOTED) + .useDefaultShellEnvironment() .addTool(sdk.getAapt2()) .addTransitiveInputs(inputs.build()) .addOutputs(ImmutableList.<Artifact>copyOf(outs)) @@ -331,10 +346,24 @@ 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); + } + // Create the spawn action. ruleContext.registerAction( this.spawnActionBuilder - .useParameterFile(ParameterFileType.UNQUOTED) + .useDefaultShellEnvironment() .addTool(sdk.getAapt()) .addTransitiveInputs(inputs.build()) .addOutputs(ImmutableList.copyOf(outs)) 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 d9846b3c53..7e6aaad3e7 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 @@ -18,6 +18,7 @@ import com.google.common.base.Functions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; +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.ActionConstructionContext; @@ -25,6 +26,7 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; 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; +import com.google.devtools.build.lib.util.OS; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; @@ -88,7 +90,7 @@ public class ManifestMergerActionBuilder { NestedSetBuilder<Artifact> inputs = NestedSetBuilder.naiveLinkOrder(); ImmutableList.Builder<Artifact> outputs = ImmutableList.builder(); CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); - + // Set the busybox tool. builder.add("--tool").add("MERGE_MANIFEST").add("--"); @@ -130,6 +132,18 @@ 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). + this.spawnActionBuilder.alwaysUseParameterFile(ParameterFileType.UNQUOTED); + } + ruleContext.registerAction( this.spawnActionBuilder .addTransitiveInputs(inputs.build()) 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 0c40818e16..8bc64cbf01 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 @@ -28,6 +28,7 @@ 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; @@ -115,6 +116,21 @@ 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.UNQUOTED) 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 203d61e000..354b3c710e 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 @@ -24,6 +24,7 @@ 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.rules.android.ResourceContainerConverter.Builder.SeparatorType; +import com.google.devtools.build.lib.util.OS; import java.util.ArrayList; import java.util.List; @@ -97,9 +98,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); + } + ruleContext.registerAction( spawnActionBuilder - .useParameterFile(ParameterFileType.UNQUOTED) .addInputs(inputs) .addOutput(classJarOut) .setCommandLine(builder.build()) |