Capture build-runfiles output.

As https://github.com/bazelbuild/bazel/issues/6176 shows, it's very hard to debug runfiles building failures when all output is eaten.

Closes #6305.

PiperOrigin-RevId: 216717016
diff --git a/src/main/java/com/google/devtools/build/lib/exec/SymlinkTreeHelper.java b/src/main/java/com/google/devtools/build/lib/exec/SymlinkTreeHelper.java
index 2dd9d3a..88a9452 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/SymlinkTreeHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/SymlinkTreeHelper.java
@@ -27,10 +27,12 @@
 import com.google.devtools.build.lib.actions.SimpleSpawn;
 import com.google.devtools.build.lib.actions.Spawn;
 import com.google.devtools.build.lib.actions.UserExecException;
+import com.google.devtools.build.lib.shell.Command;
 import com.google.devtools.build.lib.shell.CommandException;
 import com.google.devtools.build.lib.util.CommandBuilder;
 import com.google.devtools.build.lib.util.CommandUtils;
 import com.google.devtools.build.lib.util.OsUtils;
+import com.google.devtools.build.lib.util.io.OutErr;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -85,16 +87,20 @@
    * @throws CommandException
    */
   public void createSymlinksUsingCommand(
-      Path execRoot, BinTools binTools, ImmutableMap<String, String> shellEnvironment)
+      Path execRoot,
+      BinTools binTools,
+      ImmutableMap<String, String> shellEnvironment,
+      OutErr outErr)
       throws CommandException {
     List<String> argv = getSpawnArgumentList(execRoot, binTools.getExecPath(BUILD_RUNFILES));
     Preconditions.checkNotNull(shellEnvironment);
-    new CommandBuilder()
-        .addArgs(argv)
-        .setWorkingDir(execRoot)
-        .setEnv(shellEnvironment)
-        .build()
-        .execute();
+    Command command =
+        new CommandBuilder().addArgs(argv).setWorkingDir(execRoot).setEnv(shellEnvironment).build();
+    if (outErr != null) {
+      command.execute(outErr.getOutputStream(), outErr.getErrorStream());
+    } else {
+      command.execute();
+    }
   }
 
   /**
@@ -115,7 +121,10 @@
     if (enableRunfiles) {
       try {
         createSymlinksUsingCommand(
-            actionExecutionContext.getExecRoot(), binTools, shellEnvironment);
+            actionExecutionContext.getExecRoot(),
+            binTools,
+            shellEnvironment,
+            actionExecutionContext.getFileOutErr());
       } catch (CommandException e) {
         throw new UserExecException(CommandUtils.describeCommandFailure(true, e), e);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
index 22b38d9..c7dd465 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
@@ -511,7 +511,8 @@
         runfilesSupport.getRunfilesDirectory(),
         false);
     helper.createSymlinksUsingCommand(
-        env.getExecRoot(), env.getBlazeWorkspace().getBinTools(), ImmutableMap.of());
+        env.getExecRoot(), env.getBlazeWorkspace().getBinTools(),
+        /* shellEnvironment= */ ImmutableMap.of(), /* outErr= */ null);
     return workingDir;
   }