From 40ea964ca987667485b69011d414dad302025c60 Mon Sep 17 00:00:00 2001 From: Brian Silverman Date: Tue, 13 Oct 2015 12:02:55 +0000 Subject: Make the sandbox handle an arbitrary number of arguments I was hitting argument length restrictions when trying to run rules which take 2 GCC installs and a Clang install as inputs. -- Change-Id: Iee27bb6fb50fe94bff4b2500bbcfa9381b05d63d Reviewed-on: https://bazel-review.googlesource.com/#/c/2090 MOS_MIGRATED_REVID=105300670 --- .../build/lib/sandbox/NamespaceSandboxRunner.java | 43 +++++++++++++--------- 1 file changed, 25 insertions(+), 18 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib') diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/NamespaceSandboxRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/NamespaceSandboxRunner.java index 88c49d6e38..3caf26ac79 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/NamespaceSandboxRunner.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/NamespaceSandboxRunner.java @@ -36,6 +36,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -116,50 +117,56 @@ public class NamespaceSandboxRunner { throws IOException, UserExecException { createFileSystem(outputs); - List args = new ArrayList<>(); + List fileArgs = new ArrayList<>(); + List commandLineArgs = new ArrayList<>(); - args.add(execRoot.getRelative("_bin/namespace-sandbox").getPathString()); + commandLineArgs.add(execRoot.getRelative("_bin/namespace-sandbox").getPathString()); if (sandboxDebug) { - args.add("-D"); + fileArgs.add("-D"); } // Sandbox directory. - args.add("-S"); - args.add(sandboxPath.getPathString()); + fileArgs.add("-S"); + fileArgs.add(sandboxPath.getPathString()); // Working directory of the spawn. - args.add("-W"); - args.add(cwd.toString()); + fileArgs.add("-W"); + fileArgs.add(cwd.toString()); // Kill the process after a timeout. if (timeout != -1) { - args.add("-T"); - args.add(Integer.toString(timeout)); + fileArgs.add("-T"); + fileArgs.add(Integer.toString(timeout)); } // Create all needed directories. for (Path createDir : createDirs) { - args.add("-d"); - args.add(createDir.getPathString()); + fileArgs.add("-d"); + fileArgs.add(createDir.getPathString()); } // Mount all the inputs. for (ImmutableMap.Entry mount : mounts.entrySet()) { - args.add("-M"); - args.add(mount.getValue().getPathString()); + fileArgs.add("-M"); + fileArgs.add(mount.getValue().getPathString()); // The file is mounted in a custom location inside the sandbox. if (!mount.getValue().equals(mount.getKey())) { - args.add("-m"); - args.add(mount.getKey().getPathString()); + fileArgs.add("-m"); + fileArgs.add(mount.getKey().getPathString()); } } - args.add("--"); - args.addAll(spawnArguments); + Path argumentsFilePath = + sandboxPath.getParentDirectory().getRelative(sandboxPath.getBaseName() + ".params"); + FileSystemUtils.writeLinesAs(argumentsFilePath, StandardCharsets.ISO_8859_1, fileArgs); + commandLineArgs.add("@" + argumentsFilePath.getPathString()); - Command cmd = new Command(args.toArray(new String[0]), env, cwd); + commandLineArgs.add("--"); + commandLineArgs.addAll(spawnArguments); + + Command cmd = new Command(commandLineArgs.toArray(new String[0]), env, cwd); try { cmd.execute( -- cgit v1.2.3