Split BlazeDirectories into two classes.

This is done in preparation for allowing multiple workspaces / commands in a
single server. That requires changes to the module API, which currently
hard-codes a 1:1 correspondence between workspaces and servers. Note how
BlazeDirectories exists even when it runs outside a workspace.

It's not ideal that the output base is in ServerDirectories, and the
BlazeRuntime creation also still requires a BlazeDirectories instance.

--
MOS_MIGRATED_REVID=129736613
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index f896545..bdc8652 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -28,6 +28,7 @@
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
+import com.google.devtools.build.lib.analysis.ServerDirectories;
 import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigurationFactory;
@@ -916,10 +917,11 @@
               Predicates.notNull()));
     }
 
+    ServerDirectories serverDirectories =
+        new ServerDirectories(installBasePath, outputBasePath, startupOptions.installMD5);
     BlazeDirectories directories =
-        new BlazeDirectories(installBasePath, outputBasePath, workspaceDirectoryPath,
-                             startupOptions.deepExecRoot, startupOptions.installMD5,
-                             productName);
+        new BlazeDirectories(
+            serverDirectories, workspaceDirectoryPath, startupOptions.deepExecRoot, productName);
 
     Clock clock = BlazeClock.instance();
 
@@ -934,6 +936,7 @@
 
     BlazeRuntime.Builder runtimeBuilder = new BlazeRuntime.Builder()
         .setProductName(productName)
+        .setServerDirectories(serverDirectories)
         .setDirectories(directories)
         .setStartupOptionsProvider(options)
         .setBinTools(binTools)
@@ -1027,6 +1030,7 @@
    * an exception. Please plan appropriately.
    */
   public static class Builder {
+    private ServerDirectories serverDirectories;
     private BlazeDirectories directories;
     private Clock clock;
     private OptionsProvider startupOptionsProvider;
@@ -1038,6 +1042,7 @@
 
     public BlazeRuntime build() throws AbruptExitException {
       Preconditions.checkNotNull(productName);
+      Preconditions.checkNotNull(serverDirectories);
       Preconditions.checkNotNull(directories);
       Preconditions.checkNotNull(startupOptionsProvider);
       Clock clock = (this.clock == null) ? BlazeClock.instance() : this.clock;
@@ -1047,7 +1052,7 @@
 
       for (BlazeModule module : blazeModules) {
         module.blazeStartup(startupOptionsProvider,
-            BlazeVersionInfo.instance(), instanceId, directories, clock);
+            BlazeVersionInfo.instance(), instanceId, serverDirectories, clock);
       }
       ServerBuilder serverBuilder = new ServerBuilder();
       for (BlazeModule module : blazeModules) {
@@ -1070,7 +1075,7 @@
       Package.Builder.Helper packageBuilderHelper = null;
       for (BlazeModule module : blazeModules) {
         Package.Builder.Helper candidateHelper =
-            module.getPackageBuilderHelper(ruleClassProvider, directories.getFileSystem());
+            module.getPackageBuilderHelper(ruleClassProvider, serverDirectories.getFileSystem());
         if (candidateHelper != null) {
           Preconditions.checkState(packageBuilderHelper == null,
               "more than one module defines a package builder helper");
@@ -1133,6 +1138,11 @@
       return this;
     }
 
+    public Builder setServerDirectories(ServerDirectories serverDirectories) {
+      this.serverDirectories = serverDirectories;
+      return this;
+    }
+
     public Builder setDirectories(BlazeDirectories directories) {
       this.directories = directories;
       return this;