Replace the occurrences of Constants.PRODUCT_NAME for a call to
BlazeRuntime#getProductName() or a reference to TestConstants.PRODUCT_NAME for tests.

This CL prepares the codebase in order to delete the constant.

--
MOS_MIGRATED_REVID=122993568
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
index 6fa762d..374c9e6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
@@ -18,7 +18,6 @@
 import com.google.common.base.Strings;
 import com.google.common.hash.HashCode;
 import com.google.common.hash.Hashing;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.actions.Root;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.util.Preconditions;
@@ -50,11 +49,6 @@
 @Immutable
 public final class BlazeDirectories {
 
-  // Output directory name, relative to the execRoot.
-  // TODO(bazel-team): (2011) make this private?
-  public static final String RELATIVE_OUTPUT_PATH = StringCanonicalizer.intern(
-      Constants.PRODUCT_NAME + "-out");
-
   // Include directory name, relative to execRoot/blaze-out/configuration.
   public static final String RELATIVE_INCLUDE_DIR = StringCanonicalizer.intern("include");
   @VisibleForTesting
@@ -72,7 +66,7 @@
   private final Path localOutputPath;
 
   public BlazeDirectories(Path installBase, Path outputBase, Path workspace,
-      boolean deepExecRoot, @Nullable String installMD5) {
+      boolean deepExecRoot, @Nullable String installMD5, String productName) {
     this.installBase = installBase;
     this.workspace = workspace;
     this.outputBase = outputBase;
@@ -88,11 +82,13 @@
     } else {
       this.execRoot = execRootBase.getChild(workspace.getBaseName());
     }
-    this.outputPath = execRoot.getRelative(RELATIVE_OUTPUT_PATH);
+    String relativeOutputPath = getRelativeOutputPath(productName);
+    this.outputPath = execRoot.getRelative(relativeOutputPath);
     Preconditions.checkState(useDefaultExecRootName || outputPath.asFragment().equals(
-        outputPathFromOutputBase(outputBase.asFragment(), workspace.asFragment(), deepExecRoot)));
+        outputPathFromOutputBase(outputBase.asFragment(), workspace.asFragment(), deepExecRoot,
+            productName)));
 
-    this.localOutputPath = outputBase.getRelative(BlazeDirectories.RELATIVE_OUTPUT_PATH);
+    this.localOutputPath = outputBase.getRelative(relativeOutputPath);
   }
 
   private static HashCode checkMD5(HashCode hash) {
@@ -102,8 +98,8 @@
   }
 
   @VisibleForTesting
-  public BlazeDirectories(Path installBase, Path outputBase, Path workspace) {
-    this(installBase, outputBase, workspace, false, null);
+  public BlazeDirectories(Path installBase, Path outputBase, Path workspace, String productName) {
+    this(installBase, outputBase, workspace, false, null, productName);
   }
 
   /**
@@ -165,13 +161,13 @@
    * @return the outputPath as a path fragment, given the outputBase.
    */
   public static PathFragment outputPathFromOutputBase(
-      PathFragment outputBase, PathFragment workspace, boolean deepExecRoot) {
+      PathFragment outputBase, PathFragment workspace, boolean deepExecRoot, String productName) {
     PathFragment execRoot = deepExecRoot ? outputBase.getChild("execroot") : outputBase;
 
     if (workspace.equals(PathFragment.EMPTY_FRAGMENT)) {
       return execRoot;
     }
-    return execRoot.getRelative(workspace.getBaseName() + "/" + RELATIVE_OUTPUT_PATH);
+    return execRoot.getRelative(workspace.getBaseName() + "/" + getRelativeOutputPath(productName));
   }
 
   /**
@@ -213,4 +209,13 @@
   public HashCode getInstallMD5() {
     return installMD5;
   }
+
+  /**
+   * Returns the output directory name, relative to the execRoot.
+   * TODO(bazel-team): (2011) make this private?
+   */
+  public static String getRelativeOutputPath(String productName) {
+    return StringCanonicalizer.intern(productName + "-out");
+  }
+
 }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
index c0b5bfc..d9172ec 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
@@ -17,7 +17,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.pkgcache.PackageCacheOptions;
@@ -66,7 +65,7 @@
     if (options.getResidue().isEmpty()) {
       env.getReporter().handle(Event.error(String.format(
           "missing fetch expression. Type '%s help fetch' for syntax and help",
-          Constants.PRODUCT_NAME)));
+          env.getRuntime().getProductName())));
       return ExitCode.COMMAND_LINE_ERROR;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java
index 9effa36..f5f67c2 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java
@@ -20,7 +20,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.BuildView;
 import com.google.devtools.build.lib.analysis.OutputGroupProvider;
 import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
@@ -86,7 +85,7 @@
             defaultValue = "null",
             category = "verbosity",
             converter = OptionsUtils.PathFragmentConverter.class,
-            help = "Causes " + Constants.PRODUCT_NAME + " to explain each executed step of the "
+            help = "Causes the build system to explain each executed step of the "
             + "build. The explanation is written to the specified log file.")
     public PathFragment explanationPath;
 
@@ -249,7 +248,7 @@
             defaultValue = "false",
             category = "undocumented",
             help = "If set, tell the output service (if any) to track when files in the output "
-                + "tree have been modified externally (not by " + Constants.PRODUCT_NAME + "). "
+                + "tree have been modified externally (not by the build system). "
                 + "This should improve incremental build speed when an appropriate output service "
                 + "is enabled.")
     public boolean finalizeActions;
@@ -263,8 +262,8 @@
     )
     public List<String> aspects;
 
-    public String getSymlinkPrefix() {
-      return symlinkPrefix == null ? Constants.PRODUCT_NAME + "-" : symlinkPrefix;
+    public String getSymlinkPrefix(String productName) {
+      return symlinkPrefix == null ? productName + "-" : symlinkPrefix;
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java
index 00aba28..8ef4a38 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java
@@ -130,6 +130,7 @@
       // (ie, preprocessed and assembler files).
       OutputGroupProvider topLevelProvider =
           target.getProvider(OutputGroupProvider.class);
+      String productName = env.getRuntime().getProductName();
       if (topLevelProvider != null) {
         for (Artifact temp : topLevelProvider.getOutputGroup(OutputGroupProvider.TEMP_FILES)) {
           if (temp.getPath().exists()) {
@@ -137,7 +138,8 @@
                 + OutputDirectoryLinksUtils.getPrettyPath(temp.getPath(),
                     env.getWorkspaceName(),
                     env.getWorkspace(),
-                    request.getBuildOptions().getSymlinkPrefix()));
+                    request.getBuildOptions().getSymlinkPrefix(productName),
+                    productName));
           }
         }
       }
@@ -152,9 +154,10 @@
   }
 
   private String formatArtifactForShowResults(Artifact artifact, BuildRequest request) {
+    String productName = env.getRuntime().getProductName();
     return "  " + OutputDirectoryLinksUtils.getPrettyPath(artifact.getPath(),
         env.getWorkspaceName(), env.getWorkspace(),
-        request.getBuildOptions().getSymlinkPrefix());
+        request.getBuildOptions().getSymlinkPrefix(productName), productName);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index f741fe6..9724a35 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -25,7 +25,6 @@
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Ordering;
 import com.google.common.collect.Table;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.ActionCacheChecker;
 import com.google.devtools.build.lib.actions.ActionContextConsumer;
@@ -340,7 +339,7 @@
       ImmutableMap<PathFragment, Path> packageRoots)
       throws BuildFailedException, InterruptedException, TestExecException, AbruptExitException {
     Stopwatch timer = Stopwatch.createStarted();
-    prepare(packageRoots, configurations);
+    prepare(packageRoots);
 
     ActionGraph actionGraph = analysisResult.getActionGraph();
 
@@ -360,10 +359,11 @@
     BuildConfiguration targetConfiguration = targetConfigurations.size() == 1
         ? targetConfigurations.get(0) : null;
     if (targetConfigurations.size() == 1) {
+      String productName = runtime.getProductName();
       OutputDirectoryLinksUtils.createOutputDirectoryLinks(
           env.getWorkspaceName(), env.getWorkspace(), getExecRoot(),
           env.getOutputPath(), getReporter(), targetConfiguration,
-          request.getBuildOptions().getSymlinkPrefix());
+          request.getBuildOptions().getSymlinkPrefix(productName), productName);
     }
 
     ActionCache actionCache = getActionCache();
@@ -496,8 +496,8 @@
     }
   }
 
-  private void prepare(ImmutableMap<PathFragment, Path> packageRoots,
-      BuildConfigurationCollection configurations) throws ExecutorInitException {
+  private void prepare(ImmutableMap<PathFragment, Path> packageRoots)
+      throws ExecutorInitException {
     // Prepare for build.
     Profiler.instance().markPhase(ProfilePhase.PREPARE);
 
@@ -505,7 +505,7 @@
     createActionLogDirectory();
 
     // Plant the symlink forest.
-    plantSymlinkForest(packageRoots, configurations);
+    plantSymlinkForest(packageRoots);
   }
 
   private void createToolsSymlinks() throws ExecutorInitException {
@@ -516,12 +516,12 @@
     }
   }
 
-  private void plantSymlinkForest(ImmutableMap<PathFragment, Path> packageRoots,
-      BuildConfigurationCollection configurations) throws ExecutorInitException {
+  private void plantSymlinkForest(ImmutableMap<PathFragment, Path> packageRoots)
+      throws ExecutorInitException {
     try {
       FileSystemUtils.deleteTreesBelowNotPrefixed(getExecRoot(),
-          new String[] { ".", "_", Constants.PRODUCT_NAME + "-"});
-      FileSystemUtils.plantLinkForest(packageRoots, getExecRoot());
+          new String[] { ".", "_", runtime.getProductName() + "-"});
+      FileSystemUtils.plantLinkForest(packageRoots, getExecRoot(), runtime.getProductName());
     } catch (IOException e) {
       throw new ExecutorInitException("Source forest creation failed", e);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
index afa4356..2698861 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.buildtool;
 
 import com.google.common.base.Joiner;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
@@ -33,15 +32,17 @@
  * Static utilities for managing output directory symlinks.
  */
 public class OutputDirectoryLinksUtils {
-  public static final String OUTPUT_SYMLINK_NAME = Constants.PRODUCT_NAME + "-out";
-
   // Used in getPrettyPath() method below.
   private static final String[] LINKS = { "bin", "genfiles", "includes" };
 
   private static final String NO_CREATE_SYMLINKS_PREFIX = "/";
 
-  private static String execRootSymlink(String workspaceName) {
-    return Constants.PRODUCT_NAME + "-" + workspaceName;
+  public static final String getOutputSymlinkName(String productName) {
+    return productName + "-out";
+  }
+
+  private static String execRootSymlink(String productName, String workspaceName) {
+    return productName + "-" + workspaceName;
   }
   /**
    * Attempts to create convenience symlinks in the workspaceDirectory and in
@@ -51,7 +52,8 @@
    */
   public static void createOutputDirectoryLinks(String workspaceName,
       Path workspace, Path execRoot, Path outputPath,
-      EventHandler eventHandler, @Nullable BuildConfiguration targetConfig, String symlinkPrefix) {
+      EventHandler eventHandler, @Nullable BuildConfiguration targetConfig,
+      String symlinkPrefix, String productName) {
     if (NO_CREATE_SYMLINKS_PREFIX.equals(symlinkPrefix)) {
       return;
     }
@@ -60,10 +62,10 @@
     // Make the two non-specific links from the workspace to the output area,
     // and the configuration-specific links in both the workspace and the execution root dirs.
     // NB!  Keep in sync with removeOutputDirectoryLinks below.
-    createLink(workspace, OUTPUT_SYMLINK_NAME, outputPath, failures);
+    createLink(workspace, getOutputSymlinkName(productName), outputPath, failures);
 
     // Points to execroot
-    createLink(workspace, execRootSymlink(workspaceName), execRoot, failures);
+    createLink(workspace, execRootSymlink(productName, workspaceName), execRoot, failures);
 
     if (targetConfig != null) {
       createLink(workspace, symlinkPrefix + "bin",
@@ -90,7 +92,7 @@
    * before, the pretty path may be incorrect if the symlinks end up pointing somewhere new.
    */
   public static PathFragment getPrettyPath(Path file, String workspaceName,
-      Path workspaceDirectory, String symlinkPrefix) {
+      Path workspaceDirectory, String symlinkPrefix, String productName) {
     for (String link : LINKS) {
       PathFragment result = relativize(file, workspaceDirectory, symlinkPrefix + link);
       if (result != null) {
@@ -98,12 +100,13 @@
       }
     }
 
-    PathFragment result = relativize(file, workspaceDirectory, execRootSymlink(workspaceName));
+    PathFragment result = relativize(file, workspaceDirectory,
+        execRootSymlink(productName, workspaceName));
     if (result != null) {
       return result;
     }
 
-    result = relativize(file, workspaceDirectory, OUTPUT_SYMLINK_NAME);
+    result = relativize(file, workspaceDirectory, getOutputSymlinkName(productName));
     if (result != null) {
       return result;
     }
@@ -137,16 +140,17 @@
    * @param workspace the runtime's workspace
    * @param eventHandler the error eventHandler
    * @param symlinkPrefix the symlink prefix which should be removed
+   * @param productName the product name
    */
   public static void removeOutputDirectoryLinks(String workspaceName, Path workspace,
-      EventHandler eventHandler, String symlinkPrefix) {
+      EventHandler eventHandler, String symlinkPrefix, String productName) {
     if (NO_CREATE_SYMLINKS_PREFIX.equals(symlinkPrefix)) {
       return;
     }
     List<String> failures = new ArrayList<>();
 
-    removeLink(workspace, OUTPUT_SYMLINK_NAME, failures);
-    removeLink(workspace, execRootSymlink(workspaceName), failures);
+    removeLink(workspace, getOutputSymlinkName(productName), failures);
+    removeLink(workspace, execRootSymlink(productName, workspaceName), failures);
     removeLink(workspace, symlinkPrefix + "bin", failures);
     removeLink(workspace, symlinkPrefix + "testlogs", failures);
     removeLink(workspace, symlinkPrefix + "genfiles", failures);
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
index 93a8c8c..578a763 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
@@ -42,7 +42,8 @@
             buildRequest.getOptions(RemoteOptions.class),
             verboseFailures,
             actionCache,
-            workExecutor));
+            workExecutor,
+            env.getRuntime().getProductName()));
     this.strategies = strategiesBuilder.build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java
index 1b93d56..7184f79 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java
@@ -66,9 +66,10 @@
       RemoteOptions options,
       boolean verboseFailures,
       RemoteActionCache actionCache,
-      RemoteWorkExecutor workExecutor) {
+      RemoteWorkExecutor workExecutor,
+      String productName) {
     this.execRoot = execRoot;
-    this.standaloneStrategy = new StandaloneSpawnStrategy(execRoot, verboseFailures);
+    this.standaloneStrategy = new StandaloneSpawnStrategy(execRoot, verboseFailures, productName);
     this.remoteActionCache = actionCache;
     this.remoteWorkExecutor = workExecutor;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleHostInfo.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleHostInfo.java
index 0253fe3..dd0023a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleHostInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleHostInfo.java
@@ -50,15 +50,17 @@
    * @param developerDir the value of {@code DEVELOPER_DIR} for the target version of xcode
    * @param sdkVersion the sdk version, for example, "9.1"
    * @param appleSdkPlatform the sdk platform, for example, "iPhoneOS"
+   * @param productName the product name
    * @throws UserExecException if there is an issue with obtaining the root from the spawned
    *     process, either because the SDK platform/version pair doesn't exist, or there was an
    *     unexpected issue finding or running the tool
    */
   public static String getSdkRoot(Path execRoot, String developerDir,
-      String sdkVersion, String appleSdkPlatform) throws UserExecException {
+      String sdkVersion, String appleSdkPlatform, String productName) throws UserExecException {
     try {
       CacheManager cacheManager =
-          new CacheManager(execRoot.getRelative(BlazeDirectories.RELATIVE_OUTPUT_PATH),
+          new CacheManager(execRoot.getRelative(
+              BlazeDirectories.getRelativeOutputPath(productName)),
               XCRUN_CACHE_FILENAME);
 
       String sdkString = appleSdkPlatform.toLowerCase() + sdkVersion;
@@ -101,7 +103,7 @@
       throw new UserExecException(e);
     }
   }
-  
+
   /**
    * Returns the absolute root path of the xcode developer directory on the host system for
    * the given xcode version. This may spawn a process and use the {@code xcode-locator} binary.
@@ -110,15 +112,16 @@
    *
    * @param execRoot the execution root path, used to locate the cache file
    * @param version the xcode version number to look up
+   * @param productName the product name
    * @throws UserExecException if there is an issue with obtaining the path from the spawned
    *     process, either because there is no installed xcode with the given version, or
    *     there was an unexpected issue finding or running the tool
    */
-  public static String getDeveloperDir(Path execRoot, DottedVersion version)
+  public static String getDeveloperDir(Path execRoot, DottedVersion version, String productName)
       throws UserExecException {
     try {
       CacheManager cacheManager =
-          new CacheManager(execRoot.getRelative(BlazeDirectories.RELATIVE_OUTPUT_PATH),
+          new CacheManager(execRoot.getRelative(BlazeDirectories.getRelativeOutputPath(productName)),
               XCODE_LOCATOR_CACHE_FILENAME);
 
       String cacheResult = cacheManager.getValue(version.toString());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java
index 545619e..747ea82 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java
@@ -20,7 +20,6 @@
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.Root;
 import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
@@ -257,7 +256,8 @@
     Root fdoRoot =
         (fdoProfile == null)
             ? null
-            : Root.asDerivedRoot(execRoot, execRoot.getRelative(Constants.PRODUCT_NAME + "-fdo"));
+            : Root.asDerivedRoot(execRoot, execRoot.getRelative(
+                PrecomputedValue.PRODUCT_NAME.get(env) + "-fdo"));
 
     PathFragment fdoRootExecPath = fdoProfile == null
         ? null
@@ -282,7 +282,8 @@
     }
 
     FdoZipContents fdoZipContents = extractFdoZip(
-        fdoMode, lipoMode, execRoot, fdoProfile, fdoRootExecPath);
+        fdoMode, lipoMode, execRoot, fdoProfile, fdoRootExecPath,
+        PrecomputedValue.PRODUCT_NAME.get(env));
     return new FdoSupport(
         fdoMode, lipoMode, fdoRoot, fdoRootExecPath, fdoInstrument, fdoProfile, fdoZipContents);
   }
@@ -308,7 +309,7 @@
    * @throws FdoException if the FDO ZIP contains a file of unknown type
    */
   private static FdoZipContents extractFdoZip(FdoMode fdoMode, LipoMode lipoMode, Path execRoot,
-      Path fdoProfile, PathFragment fdoRootExecPath)
+      Path fdoProfile, PathFragment fdoRootExecPath, String productName)
       throws IOException, FdoException {
     // The execRoot != null case is only there for testing. We cannot provide a real ZIP file in
     // tests because ZipFileSystem does not work with a ZIP on an in-memory file system.
@@ -333,7 +334,7 @@
             execRoot.getRelative(getLLVMProfilePath(fdoProfile, fdoRootExecPath)), fdoProfile);
       } else {
         Path zipFilePath = new ZipFileSystem(fdoProfile).getRootDirectory();
-        String outputSymlinkName = Constants.PRODUCT_NAME + "-out";
+        String outputSymlinkName = productName + "-out";
         if (!zipFilePath.getRelative(outputSymlinkName).isDirectory()) {
           throw new ZipException(
               "FDO zip files must be zipped directly above '"
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
index 3e17b47..8094094 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
@@ -27,7 +27,6 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.ListMultimap;
 import com.google.common.io.Flushables;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Reporter;
@@ -198,7 +197,7 @@
     Path workspace = env.getWorkspace();
     // TODO(kchodorow): Remove this once spaces are supported.
     if (workspace.getPathString().contains(" ")) {
-      outErr.printErrLn(Constants.PRODUCT_NAME + " does not currently work properly from paths "
+      outErr.printErrLn(runtime.getProductName() + " does not currently work properly from paths "
           + "containing spaces (" + workspace + ").");
       return ExitCode.LOCAL_ENVIRONMENTAL_ERROR;
     }
@@ -286,7 +285,7 @@
     BlazeCommand command = runtime.getCommandMap().get(commandName);
     if (command == null) {
       outErr.printErrLn(String.format(
-          "Command '%s' not found. Try '%s help'.", commandName, Constants.PRODUCT_NAME));
+          "Command '%s' not found. Try '%s help'.", commandName, runtime.getProductName()));
       return ExitCode.COMMAND_LINE_ERROR.getNumericExitCode();
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandUtils.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandUtils.java
index 3ba6e22..f7bcd1d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandUtils.java
@@ -15,7 +15,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.util.ResourceFileLoader;
 import com.google.devtools.common.options.OptionsBase;
@@ -106,12 +105,14 @@
    *        descriptions, passed to {@link OptionsParser#describeOptions}.
    * @param helpVerbosity a tri-state verbosity option selecting between just
    *        names, names and syntax, and full description.
+   * @param productName the product name
    */
   public static final String expandHelpTopic(String topic, String help,
                                       Class<? extends BlazeCommand> commandClass,
                                       Collection<Class<? extends OptionsBase>> options,
                                       Map<String, String> categoryDescriptions,
-                                      OptionsParser.HelpVerbosity helpVerbosity) {
+                                      OptionsParser.HelpVerbosity helpVerbosity,
+                                      String productName) {
     OptionsParser parser = OptionsParser.newOptionsParser(options);
 
     String template;
@@ -134,9 +135,9 @@
     String optionStr =
         parser
             .describeOptions(categoryDescriptions, helpVerbosity)
-            .replace("%{product}", Constants.PRODUCT_NAME);
+            .replace("%{product}", productName);
     return template
-            .replace("%{product}", Constants.PRODUCT_NAME)
+            .replace("%{product}", productName)
             .replace("%{command}", topic)
             .replace("%{options}", optionStr)
             .trim()
@@ -159,7 +160,8 @@
       Map<String, String> categoryDescriptions,
       OptionsParser.HelpVerbosity verbosity,
       Iterable<BlazeModule> blazeModules,
-      ConfiguredRuleClassProvider ruleClassProvider) {
+      ConfiguredRuleClassProvider ruleClassProvider,
+      String productName) {
     Command commandAnnotation = commandClass.getAnnotation(Command.class);
     return BlazeCommandUtils.expandHelpTopic(
         commandAnnotation.name(),
@@ -167,6 +169,7 @@
         commandClass,
         BlazeCommandUtils.getOptions(commandClass, blazeModules, ruleClassProvider),
         categoryDescriptions,
-        verbosity);
+        verbosity,
+        productName);
   }
 }
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 c03192c..1b9d821 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
@@ -302,7 +302,8 @@
         preprocessorFactorySupplier,
         skyFunctions.build(),
         precomputedValues.build(),
-        customDirtinessCheckers.build());
+        customDirtinessCheckers.build(),
+        getProductName());
     this.workspace = new BlazeWorkspace(
         this, directories, skyframeExecutor, eventBusExceptionHandler, workspaceStatusActionFactory,
         binTools);
@@ -379,7 +380,7 @@
       }
       if (profiledTasks != ProfiledTaskKinds.NONE) {
         Profiler.instance().start(profiledTasks, out,
-            Constants.PRODUCT_NAME + " profile for " + env.getOutputBase() + " at " + new Date()
+            getProductName() + " profile for " + env.getOutputBase() + " at " + new Date()
             + ", build ID: " + buildID,
             recordFullProfilerData, clock, execStartTimeNanos);
         return true;
@@ -1006,7 +1007,7 @@
     }
 
     PathFragment outputPathFragment = BlazeDirectories.outputPathFromOutputBase(
-        outputBase, workspaceDirectory, startupOptions.deepExecRoot);
+        outputBase, workspaceDirectory, startupOptions.deepExecRoot, Constants.PRODUCT_NAME);
     FileSystem fs = null;
     for (BlazeModule module : blazeModules) {
       FileSystem moduleFs = module.getFileSystem(options, outputPathFragment);
@@ -1038,7 +1039,8 @@
 
     BlazeDirectories directories =
         new BlazeDirectories(installBasePath, outputBasePath, workspaceDirectoryPath,
-                             startupOptions.deepExecRoot, startupOptions.installMD5);
+                             startupOptions.deepExecRoot, startupOptions.installMD5,
+                             Constants.PRODUCT_NAME);
 
     Clock clock = BlazeClock.instance();
 
@@ -1152,6 +1154,10 @@
         new VersionCommand());
   }
 
+  public String getProductName() {
+    return Constants.PRODUCT_NAME;
+  }
+
   /**
    * A builder for {@link BlazeRuntime} objects. The only required fields are the {@link
    * BlazeDirectories}, and the {@link RuleClassProvider} (except for testing). All other fields
@@ -1298,8 +1304,8 @@
      * parameters.
      */
     public Builder setDirectories(Path installBase, Path outputBase,
-        Path workspace) {
-      this.directories = new BlazeDirectories(installBase, outputBase, workspace);
+        Path workspace, String productName) {
+      this.directories = new BlazeDirectories(installBase, outputBase, workspace, productName);
       return this;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BugReport.java b/src/main/java/com/google/devtools/build/lib/runtime/BugReport.java
index a5d3e10..d81a8b7 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BugReport.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BugReport.java
@@ -15,7 +15,6 @@
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
 import com.google.devtools.build.lib.util.ExitCode;
 import com.google.devtools.build.lib.util.LoggingUtil;
@@ -72,7 +71,7 @@
   private static void logCrash(Throwable throwable, String... args) {
     BugReport.sendBugReport(throwable, Arrays.asList(args));
     BugReport.printBug(OutErr.SYSTEM_OUT_ERR, throwable);
-    System.err.println(Constants.PRODUCT_NAME + " crash in async thread:");
+    System.err.println(runtime.getProductName() + " crash in async thread:");
     throwable.printStackTrace();
   }
 
@@ -106,9 +105,9 @@
     } catch (Throwable t) {
       System.err.println(
           "An crash occurred while "
-              + Constants.PRODUCT_NAME
+              + runtime.getProductName()
               + " was trying to handle a crash! Please file a bug against "
-              + Constants.PRODUCT_NAME
+              + runtime.getProductName()
               + " and include the information below.");
 
       System.err.println("Original uncaught exception:");
@@ -132,7 +131,7 @@
     PrintStream err = new PrintStream(outErr.getErrorStream());
     e.printStackTrace(err);
     err.flush();
-    LOG.log(Level.SEVERE, Constants.PRODUCT_NAME + " crashed", e);
+    LOG.log(Level.SEVERE, runtime.getProductName() + " crashed", e);
   }
 
   /**
@@ -144,7 +143,7 @@
   public static void printBug(OutErr outErr, Throwable e) {
     if (e instanceof OutOfMemoryError) {
       outErr.printErr(
-          e.getMessage() + "\n\n" + Constants.PRODUCT_NAME + " ran out of memory and crashed.\n");
+          e.getMessage() + "\n\n" + runtime.getProductName() + " ran out of memory and crashed.\n");
     } else {
       printThrowableTo(outErr, e);
     }
@@ -175,7 +174,7 @@
   private static void logException(Throwable exception, List<String> args, String... values) {
     // The preamble is used in the crash watcher, so don't change it
     // unless you know what you're doing.
-    String preamble = Constants.PRODUCT_NAME
+    String preamble = runtime.getProductName()
         + (exception instanceof OutOfMemoryError ? " OOMError: " : " crashed with args: ");
 
     LoggingUtil.logToRemote(Level.SEVERE, preamble + Joiner.on(' ').join(args), exception,
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
index 1080c45..923f894 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
@@ -105,8 +105,8 @@
 
     env.getReporter().handle(Event.info(null/*location*/, cleanBanner));
     try {
-      String symlinkPrefix =
-          options.getOptions(BuildRequest.BuildRequestOptions.class).getSymlinkPrefix();
+      String symlinkPrefix = options.getOptions(BuildRequest.BuildRequestOptions.class)
+          .getSymlinkPrefix(env.getRuntime().getProductName());
       actuallyClean(env, env.getOutputBase(), cleanOptions, symlinkPrefix);
       return ExitCode.SUCCESS;
     } catch (IOException e) {
@@ -174,7 +174,8 @@
     }
     // remove convenience links
     OutputDirectoryLinksUtils.removeOutputDirectoryLinks(
-        env.getWorkspaceName(), env.getWorkspace(), env.getReporter(), symlinkPrefix);
+        env.getWorkspaceName(), env.getWorkspace(), env.getReporter(), symlinkPrefix,
+        env.getRuntime().getProductName());
     // shutdown on expunge cleans
     if (cleanOptions.expunge || cleanOptions.expunge_async) {
       throw new ShutdownBlazeServerException(0, ShutdownMethod.EXPUNGE);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
index b18714e..03adf05 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
@@ -135,7 +135,8 @@
           getClass().getAnnotation(Command.class).name(),
           getClass().getAnnotation(Command.class).help(),
           getClass(),
-          optionList, categories, OptionsParser.HelpVerbosity.LONG));
+          optionList, categories, OptionsParser.HelpVerbosity.LONG,
+          runtime.getProductName()));
       return ExitCode.ANALYSIS_FAILURE;
     }
     PrintStream out = new PrintStream(env.getReporter().getOutErr().getOutputStream());
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java
index 08ef73e..8e11e08 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java
@@ -17,7 +17,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.docgen.BlazeRuleHelpPrinter;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.NoBuildEvent;
@@ -88,7 +87,7 @@
    */
   private ImmutableMap<String, String> getOptionCategories(BlazeRuntime runtime) {
     ImmutableMap.Builder<String, String> optionCategoriesBuilder = ImmutableMap.builder();
-    String name = Constants.PRODUCT_NAME;
+    String name = runtime.getProductName();
     optionCategoriesBuilder
         .put("checking", String.format(
              "Checking options, which control %s's error checking and/or warnings", name))
@@ -141,7 +140,7 @@
     OutErr outErr = env.getReporter().getOutErr();
     Options helpOptions = options.getOptions(Options.class);
     if (options.getResidue().isEmpty()) {
-      emitBlazeVersionInfo(outErr);
+      emitBlazeVersionInfo(outErr, runtime.getProductName());
       emitGenericHelp(runtime, outErr);
       return ExitCode.SUCCESS;
     }
@@ -151,12 +150,12 @@
     }
     String helpSubject = options.getResidue().get(0);
     if (helpSubject.equals("startup_options")) {
-      emitBlazeVersionInfo(outErr);
+      emitBlazeVersionInfo(outErr, runtime.getProductName());
       emitStartupOptions(outErr, helpOptions.helpVerbosity, runtime, getOptionCategories(runtime));
       return ExitCode.SUCCESS;
     } else if (helpSubject.equals("target-syntax")) {
-      emitBlazeVersionInfo(outErr);
-      emitTargetSyntaxHelp(outErr, getOptionCategories(runtime));
+      emitBlazeVersionInfo(outErr, runtime.getProductName());
+      emitTargetSyntaxHelp(outErr, getOptionCategories(runtime), runtime.getProductName());
       return ExitCode.SUCCESS;
     } else if (helpSubject.equals("info-keys")) {
       emitInfoKeysHelp(env, outErr);
@@ -180,19 +179,20 @@
         return ExitCode.COMMAND_LINE_ERROR;
       }
     }
-    emitBlazeVersionInfo(outErr);
+    emitBlazeVersionInfo(outErr, runtime.getProductName());
     outErr.printOut(BlazeCommandUtils.getUsage(
         command.getClass(),
         getOptionCategories(runtime),
         helpOptions.helpVerbosity,
         runtime.getBlazeModules(),
-        runtime.getRuleClassProvider()));
+        runtime.getRuleClassProvider(),
+        runtime.getProductName()));
     return ExitCode.SUCCESS;
   }
 
-  private void emitBlazeVersionInfo(OutErr outErr) {
+  private void emitBlazeVersionInfo(OutErr outErr, String productName) {
     String releaseInfo = BlazeVersionInfo.instance().getReleaseName();
-    String line = String.format("[%s %s]", Constants.PRODUCT_NAME, releaseInfo);
+    String line = String.format("[%s %s]", productName, releaseInfo);
     outErr.printOut(String.format("%80s\n", line));
   }
 
@@ -205,7 +205,8 @@
             getClass(),
             BlazeCommandUtils.getStartupOptions(runtime.getBlazeModules()),
             optionCategories,
-        helpVerbosity));
+            helpVerbosity,
+            runtime.getProductName()));
   }
 
   private void emitCompletionHelp(BlazeRuntime runtime, OutErr outErr) {
@@ -218,7 +219,7 @@
     outErr.printOutLn("BAZEL_COMMAND_LIST=\"" + SPACE_JOINER.join(commands) + "\"");
 
     outErr.printOutLn("BAZEL_INFO_KEYS=\"");
-    for (String name : InfoCommand.getHardwiredInfoItemNames(Constants.PRODUCT_NAME)) {
+    for (String name : InfoCommand.getHardwiredInfoItemNames(runtime.getProductName())) {
         outErr.printOutLn(name);
     }
     outErr.printOutLn("\"");
@@ -244,13 +245,15 @@
     }
   }
 
-  private void emitTargetSyntaxHelp(OutErr outErr, ImmutableMap<String, String> optionCategories) {
+  private void emitTargetSyntaxHelp(OutErr outErr, ImmutableMap<String, String> optionCategories,
+      String productName) {
     outErr.printOut(BlazeCommandUtils.expandHelpTopic("target-syntax",
                                     "resource:target-syntax.txt",
                                     getClass(),
                                     ImmutableList.<Class<? extends OptionsBase>>of(),
                                     optionCategories,
-                                    OptionsParser.HelpVerbosity.MEDIUM));
+                                    OptionsParser.HelpVerbosity.MEDIUM,
+                                    productName));
   }
 
   private void emitInfoKeysHelp(CommandEnvironment env, OutErr outErr) {
@@ -263,7 +266,7 @@
 
   private void emitGenericHelp(BlazeRuntime runtime, OutErr outErr) {
     outErr.printOut(String.format("Usage: %s <command> <options> ...\n\n",
-            Constants.PRODUCT_NAME));
+            runtime.getProductName()));
 
     outErr.printOut("Available commands:\n");
 
@@ -279,20 +282,20 @@
       }
 
       String shortDescription = annotation.shortDescription().
-          replace("%{product}", Constants.PRODUCT_NAME);
+          replace("%{product}", runtime.getProductName());
       outErr.printOut(String.format("  %-19s %s\n", name, shortDescription));
     }
 
     outErr.printOut("\n");
     outErr.printOut("Getting more help:\n");
-    outErr.printOut(String.format("  %s help <command>\n", Constants.PRODUCT_NAME));
+    outErr.printOut(String.format("  %s help <command>\n", runtime.getProductName()));
     outErr.printOut("                   Prints help and options for <command>.\n");
-    outErr.printOut(String.format("  %s help startup_options\n", Constants.PRODUCT_NAME));
+    outErr.printOut(String.format("  %s help startup_options\n", runtime.getProductName()));
     outErr.printOut(String.format("                   Options for the JVM hosting %s.\n",
-            Constants.PRODUCT_NAME));
-    outErr.printOut(String.format("  %s help target-syntax\n", Constants.PRODUCT_NAME));
+        runtime.getProductName()));
+    outErr.printOut(String.format("  %s help target-syntax\n", runtime.getProductName()));
     outErr.printOut("                   Explains the syntax for specifying targets.\n");
-    outErr.printOut(String.format("  %s help info-keys\n", Constants.PRODUCT_NAME));
+    outErr.printOut(String.format("  %s help info-keys\n", runtime.getProductName()));
     outErr.printOut("                   Displays a list of keys used by the info command.\n");
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
index a2badf3..7ba1e2d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
@@ -17,7 +17,6 @@
 import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.NoBuildEvent;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
@@ -198,7 +197,7 @@
     List<InfoItem> hardwiredInfoItems = ImmutableList.<InfoItem>of(
         new InfoItem.WorkspaceInfoItem(),
         new InfoItem.InstallBaseInfoItem(),
-        new InfoItem.OutputBaseInfoItem(),
+        new InfoItem.OutputBaseInfoItem(productName),
         new InfoItem.ExecutionRootInfoItem(),
         new InfoItem.OutputPathInfoItem(),
         new InfoItem.BlazeBinInfoItem(productName),
@@ -242,7 +241,7 @@
         result.put(item.getName(), item);
       }
     }
-    result.putAll(getHardwiredInfoItemMap(commandOptions, Constants.PRODUCT_NAME));
+    result.putAll(getHardwiredInfoItemMap(commandOptions, env.getRuntime().getProductName()));
     return result;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
index 923f29c..8237317 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
@@ -20,7 +20,6 @@
 import com.google.common.base.Predicates;
 import com.google.common.base.Supplier;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.packages.Attribute;
@@ -149,9 +148,9 @@
    * Info item for the output_base directory.
    */
   public static final class OutputBaseInfoItem extends InfoItem {
-    public OutputBaseInfoItem() {
+    public OutputBaseInfoItem(String productName) {
       super("output_base",
-          "A directory for shared " + Constants.PRODUCT_NAME
+          "A directory for shared " + productName
           + " state as well as tool and strategy specific subdirectories.",
           false);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
index cf857fd..9af780e 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
@@ -19,7 +19,6 @@
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.NoBuildEvent;
 import com.google.devtools.build.lib.collect.CompactHashSet;
 import com.google.devtools.build.lib.events.Event;
@@ -118,7 +117,7 @@
     } else {
       env.getReporter().handle(Event.error(String.format(
           "missing query expression. Type '%s help query' for syntax and help",
-          Constants.PRODUCT_NAME)));
+          runtime.getProductName())));
       return ExitCode.COMMAND_LINE_ERROR;
     }
 
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 be47fc1..729bace 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
@@ -233,6 +233,7 @@
       }
     }
 
+    String productName = env.getRuntime().getProductName();
     //
     // We now have a unique executable ready to be run.
     //
@@ -242,7 +243,8 @@
     PathFragment prettyExecutablePath =
         OutputDirectoryLinksUtils.getPrettyPath(executablePath,
             env.getWorkspaceName(), env.getWorkspace(),
-            options.getOptions(BuildRequestOptions.class).getSymlinkPrefix());
+            options.getOptions(BuildRequestOptions.class).getSymlinkPrefix(productName),
+            productName);
     List<String> cmdLine = new ArrayList<>();
     if (runOptions.scriptPath == null) {
       PathFragment processWrapperPath =
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java
index 385a14d..5c02510 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java
@@ -19,7 +19,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.io.Files;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.actions.ActionExecutionContext;
 import com.google.devtools.build.lib.actions.ActionInput;
 import com.google.devtools.build.lib.actions.ActionInputHelper;
@@ -81,6 +80,7 @@
   private final List<String> sandboxAddPath;
   private final UUID uuid = UUID.randomUUID();
   private final AtomicInteger execCounter = new AtomicInteger();
+  private final String productName;
 
   public LinuxSandboxedStrategy(
       Map<String, String> clientEnv,
@@ -89,7 +89,8 @@
       boolean verboseFailures,
       boolean sandboxDebug,
       List<String> sandboxAddPath,
-      boolean unblockNetwork) {
+      boolean unblockNetwork,
+      String productName) {
     this.clientEnv = ImmutableMap.copyOf(clientEnv);
     this.blazeDirs = blazeDirs;
     this.execRoot = blazeDirs.getExecRoot();
@@ -98,7 +99,9 @@
     this.sandboxDebug = sandboxDebug;
     this.sandboxAddPath = sandboxAddPath;
     this.unblockNetwork = unblockNetwork;
-    this.standaloneStrategy = new StandaloneSpawnStrategy(blazeDirs.getExecRoot(), verboseFailures);
+    this.standaloneStrategy = new StandaloneSpawnStrategy(
+        blazeDirs.getExecRoot(), verboseFailures, productName);
+    this.productName = productName;
   }
 
   /**
@@ -132,7 +135,7 @@
 
     // Each invocation of "exec" gets its own sandbox.
     Path sandboxPath =
-        execRoot.getRelative(Constants.PRODUCT_NAME + "-sandbox").getRelative(execId);
+        execRoot.getRelative(productName + "-sandbox").getRelative(execId);
 
     ImmutableMap<Path, Path> mounts;
     try {
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
index 2cfe3dd..a1f6134 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
@@ -55,7 +55,8 @@
               verboseFailures,
               sandboxDebug,
               sandboxAddPath,
-              unblockNetwork));
+              unblockNetwork,
+              env.getRuntime().getProductName()));
     }
 
     this.strategies = strategies.build();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
index a6a110c..0717561 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -20,7 +20,6 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.ActionCacheChecker.Token;
 import com.google.devtools.build.lib.actions.ActionExecutionContext;
@@ -425,9 +424,8 @@
         // and also report the issue.
         String errorMessage =
             action.prettyPrint()
-                + " discovered unexpected inputs. This indicates a mismatch between "
-                + Constants.PRODUCT_NAME
-                + " and the action's compiler. Please report this issue. The ";
+                + " discovered unexpected inputs. This indicates a mismatch between the build"
+                + " system and the action's compiler. Please report this issue. The ";
         if (metadataFoundDuringActionExecution.size() > 10) {
           errorMessage += "first ten ";
         }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
index 8d20b9e..3fe34d4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
@@ -101,6 +101,9 @@
   public static final Precomputed<BlazeDirectories> BLAZE_DIRECTORIES =
       new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "blaze_directories"));
 
+  public static final Precomputed<String> PRODUCT_NAME =
+      new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "product_name"));
+
   static final Precomputed<ImmutableMap<ActionAnalysisMetadata, ConflictException>> BAD_ACTIONS =
       new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "bad_actions"));
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index 6f6b48c..ace63f8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -113,7 +113,8 @@
       ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
       ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues,
       Iterable<SkyValueDirtinessChecker> customDirtinessCheckers,
-      PathFragment blacklistedPackagePrefixesFile) {
+      PathFragment blacklistedPackagePrefixesFile,
+      String productName) {
     super(
         evaluatorSupplier,
         pkgFactory,
@@ -126,7 +127,8 @@
         extraSkyFunctions,
         extraPrecomputedValues,
         false,
-        blacklistedPackagePrefixesFile);
+        blacklistedPackagePrefixesFile,
+        productName);
     this.diffAwarenessManager = new DiffAwarenessManager(diffAwarenessFactories);
     this.customDirtinessCheckers = customDirtinessCheckers;
   }
@@ -142,7 +144,8 @@
       Preprocessor.Factory.Supplier preprocessorFactorySupplier,
       ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
       ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues,
-      Iterable<SkyValueDirtinessChecker> customDirtinessCheckers) {
+      Iterable<SkyValueDirtinessChecker> customDirtinessCheckers,
+      String productName) {
     return create(
         pkgFactory,
         directories,
@@ -155,7 +158,8 @@
         extraSkyFunctions,
         extraPrecomputedValues,
         customDirtinessCheckers,
-        /*blacklistedPackagePrefixesFile=*/ PathFragment.EMPTY_FRAGMENT);
+        /*blacklistedPackagePrefixesFile=*/ PathFragment.EMPTY_FRAGMENT,
+        productName);
   }
 
   private static SequencedSkyframeExecutor create(
@@ -170,7 +174,8 @@
       ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
       ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues,
       Iterable<SkyValueDirtinessChecker> customDirtinessCheckers,
-      PathFragment blacklistedPackagePrefixesFile) {
+      PathFragment blacklistedPackagePrefixesFile,
+      String productName) {
     SequencedSkyframeExecutor skyframeExecutor =
         new SequencedSkyframeExecutor(
             InMemoryMemoizingEvaluator.SUPPLIER,
@@ -185,7 +190,8 @@
             extraSkyFunctions,
             extraPrecomputedValues,
             customDirtinessCheckers,
-            blacklistedPackagePrefixesFile);
+            blacklistedPackagePrefixesFile,
+            productName);
     skyframeExecutor.init();
     return skyframeExecutor;
   }
@@ -196,7 +202,8 @@
       WorkspaceStatusAction.Factory workspaceStatusActionFactory,
       ImmutableList<BuildInfoFactory> buildInfoFactories,
       Iterable<? extends DiffAwareness.Factory> diffAwarenessFactories,
-      PathFragment blacklistedPackagePrefixesFile) {
+      PathFragment blacklistedPackagePrefixesFile,
+      String productName) {
     return create(
         pkgFactory,
         directories,
@@ -209,7 +216,8 @@
         ImmutableMap.<SkyFunctionName, SkyFunction>of(),
         ImmutableList.<PrecomputedValue.Injected>of(),
         ImmutableList.<SkyValueDirtinessChecker>of(),
-        blacklistedPackagePrefixesFile);
+        blacklistedPackagePrefixesFile,
+        productName);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java
index 3dbeb2e..6ae70ff 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java
@@ -43,7 +43,8 @@
       Preprocessor.Factory.Supplier preprocessorFactorySupplier,
       ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
       ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues,
-      Iterable<SkyValueDirtinessChecker> customDirtinessCheckers) {
+      Iterable<SkyValueDirtinessChecker> customDirtinessCheckers,
+      String productName) {
     return SequencedSkyframeExecutor.create(
         pkgFactory,
         directories,
@@ -55,6 +56,7 @@
         preprocessorFactorySupplier,
         extraSkyFunctions,
         extraPrecomputedValues,
-        customDirtinessCheckers);
+        customDirtinessCheckers,
+        productName);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index d118eaf..c542e24 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -258,6 +258,8 @@
   private final ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions;
   private final ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues;
 
+  private final String productName;
+
   protected SkyframeIncrementalBuildMonitor incrementalBuildMonitor =
       new SkyframeIncrementalBuildMonitor();
 
@@ -281,7 +283,8 @@
       ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
       ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues,
       boolean errorOnExternalFiles,
-      PathFragment blacklistedPackagePrefixesFile) {
+      PathFragment blacklistedPackagePrefixesFile,
+      String productName) {
     // Strictly speaking, these arguments are not required for initialization, but all current
     // callsites have them at hand, so we might as well set them during construction.
     this.evaluatorSupplier = evaluatorSupplier;
@@ -312,6 +315,7 @@
     this.artifactFactory.set(skyframeBuildView.getArtifactFactory());
     this.externalFilesHelper = new ExternalFilesHelper(
         pkgLocator, this.errorOnExternalFiles, directories);
+    this.productName = productName;
   }
 
   private ImmutableMap<SkyFunctionName, SkyFunction> skyFunctions(
@@ -648,6 +652,7 @@
   protected void maybeInjectPrecomputedValuesForAnalysis() {
     if (needToInjectPrecomputedValuesForAnalysis) {
       PrecomputedValue.BLAZE_DIRECTORIES.set(injectable(), directories);
+      PrecomputedValue.PRODUCT_NAME.set(injectable(), productName);
       injectBuildInfoFactories();
       injectExtraPrecomputedValues();
       needToInjectPrecomputedValuesForAnalysis = false;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java
index 8e3cea4..9a92aea 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java
@@ -47,6 +47,7 @@
    * @param extraSkyFunctions
    * @param extraPrecomputedValues
    * @param customDirtinessCheckers
+   * @param productName
    * @return an instance of the SkyframeExecutor
    * @throws AbruptExitException if the executor cannot be created
    */
@@ -61,6 +62,7 @@
       Preprocessor.Factory.Supplier preprocessorFactorySupplier,
       ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
       ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues,
-      Iterable<SkyValueDirtinessChecker> customDirtinessCheckers)
+      Iterable<SkyValueDirtinessChecker> customDirtinessCheckers,
+      String productName)
       throws AbruptExitException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java
index 4982624..92690c2 100644
--- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java
@@ -81,7 +81,10 @@
     // could potentially be used and a spawnActionContext doesn't specify which one it wants, the
     // last one from strategies list will be used
     strategiesBuilder.add(
-        new StandaloneSpawnStrategy(env.getExecRoot(), verboseFailures),
+        new StandaloneSpawnStrategy(
+            env.getExecRoot(),
+            verboseFailures,
+            env.getRuntime().getProductName()),
         new DummyIncludeScanningContext(),
         new SpawnLinkStrategy(),
         new SpawnGccStrategy(),
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java
index 6f009af..fa04143 100644
--- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java
@@ -48,12 +48,14 @@
   private final boolean verboseFailures;
   private final Path processWrapper;
   private final Path execRoot;
+  private final String productName;
 
-  public StandaloneSpawnStrategy(Path execRoot, boolean verboseFailures) {
+  public StandaloneSpawnStrategy(Path execRoot, boolean verboseFailures, String productName) {
     this.verboseFailures = verboseFailures;
     this.execRoot = execRoot;
     this.processWrapper = execRoot.getRelative(
         "_bin/process-wrapper" + OsUtils.executableExtension());
+    this.productName = productName;
   }
 
   /**
@@ -144,14 +146,14 @@
   /**
    * Adds to the given environment all variables that are dependent on system state of the host
    * machine.
-   * 
+   *
    * <p> Admittedly, hermeticity is "best effort" in such cases; these environment values
    * should be as tied to configuration parameters as possible.
-   * 
+   *
    * <p>For example, underlying iOS toolchains require that SDKROOT resolve to an absolute
    * system path, but, when selecting which SDK to resolve, the version number comes from
    * build configuration.
-   * 
+   *
    * @return the new environment, comprised of the old environment plus any new variables
    * @throws UserExecException if any variables dependent on system state could not be
    *     resolved
@@ -186,7 +188,8 @@
       throw new UserExecException(
           "Cannot locate xcode developer directory on non-darwin operating system");
     }
-    return AppleHostInfo.getDeveloperDir(execRoot, DottedVersion.fromString(xcodeVersion));
+    return AppleHostInfo.getDeveloperDir(execRoot, DottedVersion.fromString(xcodeVersion),
+        productName);
   }
 
   private String getSdkRootEnv(String developerDir,
@@ -194,7 +197,8 @@
     if (OS.getCurrent() != OS.DARWIN) {
       throw new UserExecException("Cannot locate iOS SDK on non-darwin operating system");
     }
-    return AppleHostInfo.getSdkRoot(execRoot, developerDir, iosSdkVersion, appleSdkPlatform);
+    return AppleHostInfo.getSdkRoot(execRoot, developerDir, iosSdkVersion, appleSdkPlatform,
+        productName);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/util/IncludeScanningUtil.java b/src/main/java/com/google/devtools/build/lib/util/IncludeScanningUtil.java
index 37557ab..753e50f 100644
--- a/src/main/java/com/google/devtools/build/lib/util/IncludeScanningUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/util/IncludeScanningUtil.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.util;
 
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
 /**
@@ -25,16 +24,19 @@
   }
 
   private static final String INCLUDES_SUFFIX = ".includes";
-  public static final PathFragment GREPPED_INCLUDES =
-      new PathFragment(Constants.PRODUCT_NAME + "-out/_grepped_includes");
+
+  public static PathFragment getGreppedIncludes(String productName) {
+    return new PathFragment(productName + "-out/_grepped_includes");
+  }
 
   /**
    * Returns the exec-root relative output path for grepped includes.
    *
    * @param srcExecPath the exec-root relative path of the source file.
    */
-  public static PathFragment getExecRootRelativeOutputPath(PathFragment srcExecPath) {
-    return GREPPED_INCLUDES.getRelative(getRootRelativeOutputPath(srcExecPath));
+  public static PathFragment getExecRootRelativeOutputPath(PathFragment srcExecPath,
+      String productName) {
+    return getGreppedIncludes(productName).getRelative(getRootRelativeOutputPath(srcExecPath));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java b/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java
index 9ef3973..0facfef 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java
@@ -22,7 +22,6 @@
 import com.google.common.io.ByteSink;
 import com.google.common.io.ByteSource;
 import com.google.common.io.ByteStreams;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ConditionallyThreadSafe;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.util.Preconditions;
@@ -683,7 +682,8 @@
    * files. Symlink are made at the highest dir possible, linking files directly
    * only when needed with nested packages.
    */
-  public static void plantLinkForest(ImmutableMap<PathFragment, Path> packageRootMap, Path linkRoot)
+  public static void plantLinkForest(ImmutableMap<PathFragment, Path> packageRootMap,
+      Path linkRoot, String productName)
       throws IOException {
     Path emptyPackagePath = null;
 
@@ -782,7 +782,7 @@
       for (Path target : emptyPackagePath.getDirectoryEntries()) {
         String baseName = target.getBaseName();
         // Create any links that don't exist yet and don't start with bazel-.
-        if (!baseName.startsWith(Constants.PRODUCT_NAME + "-")
+        if (!baseName.startsWith(productName + "-")
             && !linkRoot.getRelative(baseName).exists()) {
           linkRoot.getRelative(baseName).createSymbolicLink(target);
         }
@@ -935,7 +935,7 @@
   public static Iterable<String> readLines(Path inputFile, Charset charset) throws IOException {
     return asByteSource(inputFile).asCharSource(charset).readLines();
   }
-  
+
   /**
    * Returns the entirety of the specified file and returns it as a byte array.
    *
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java
index 1340196..8daa197 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java
@@ -16,6 +16,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.Path;
 
@@ -35,16 +36,19 @@
     Path installBase = fs.getPath("/my/install");
     Path outputBase = fs.getPath("/my/output");
     Path workspace = fs.getPath("/my/ws");
-    BlazeDirectories directories = new BlazeDirectories(installBase, outputBase, workspace);
+    BlazeDirectories directories = new BlazeDirectories(installBase, outputBase, workspace,
+        TestConstants.PRODUCT_NAME);
     assertEquals(directories.getExecRoot(), outputBase.getChild("ws"));
 
     workspace = null;
-    directories = new BlazeDirectories(installBase, outputBase, workspace);
+    directories = new BlazeDirectories(installBase, outputBase, workspace,
+        TestConstants.PRODUCT_NAME);
     assertEquals(directories.getExecRoot(),
         outputBase.getChild(BlazeDirectories.DEFAULT_EXEC_ROOT));
 
     workspace = fs.getPath("/");
-    directories = new BlazeDirectories(installBase, outputBase, workspace);
+    directories = new BlazeDirectories(installBase, outputBase, workspace,
+        TestConstants.PRODUCT_NAME);
     assertEquals(directories.getExecRoot(),
         outputBase.getChild(BlazeDirectories.DEFAULT_EXEC_ROOT));
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java
index 62ef7f7..216a333 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java
@@ -32,6 +32,7 @@
 import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.exec.util.TestExecutorBuilder;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.io.FileOutErr;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
@@ -71,7 +72,8 @@
     directories = new BlazeDirectories(
         scratch.resolve("/install"),
         scratch.resolve("/base"),
-        scratch.resolve("/workspace"));
+        scratch.resolve("/workspace"),
+        TestConstants.PRODUCT_NAME);
     binTools = BinTools.empty(directories);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index f9050cb..d4a8791 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -138,7 +138,8 @@
   public final void createMocks() throws Exception {
     analysisMock = AnalysisMock.get();
     pkgLocator = new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory));
-    directories = new BlazeDirectories(outputBase, outputBase, rootDirectory);
+    directories = new BlazeDirectories(outputBase, outputBase, rootDirectory,
+        TestConstants.PRODUCT_NAME);
     workspaceStatusActionFactory =
         new AnalysisTestUtil.DummyWorkspaceStatusActionFactory(directories);
 
@@ -170,7 +171,8 @@
             Preprocessor.Factory.Supplier.NullSupplier.INSTANCE,
             analysisMock.getSkyFunctions(),
             getPrecomputedValues(),
-            ImmutableList.<SkyValueDirtinessChecker>of());
+            ImmutableList.<SkyValueDirtinessChecker>of(),
+            TestConstants.PRODUCT_NAME);
     skyframeExecutor.preparePackageLoading(
         pkgLocator,
         Options.getDefaults(PackageCacheOptions.class).defaultVisibility,
@@ -409,7 +411,7 @@
   }
 
   /**
-   * Makes {@code rules} available in tests, in addition to all the rules available to Blaze at 
+   * Makes {@code rules} available in tests, in addition to all the rules available to Blaze at
    * running time (e.g., java_library).
    */
   protected final void setRulesAvailableInTests(RuleDefinition... rules) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
index 310a6a8..5c4b3a1 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
@@ -47,6 +47,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -391,7 +392,7 @@
    * Matches the output path prefix contributed by a C++ configuration fragment.
    */
   public static final Pattern OUTPUT_PATH_CPP_PREFIX_PATTERN =
-      Pattern.compile("(?<=(blaze|bazel)-out/)gcc[^/]*-grte-\\w+-");
+      Pattern.compile("(?<=" + TestConstants.PRODUCT_NAME + "-out/)gcc[^/]*-grte-\\w+-");
 
   /**
    * Given a collection of Artifacts, returns a corresponding set of strings of
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 151a703..822774f 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -189,7 +189,8 @@
   @Before
   public final void initializeSkyframeExecutor() throws Exception {
     AnalysisMock mock = getAnalysisMock();
-    directories = new BlazeDirectories(outputBase, outputBase, rootDirectory);
+    directories = new BlazeDirectories(outputBase, outputBase, rootDirectory,
+        TestConstants.PRODUCT_NAME);
     binTools = BinTools.forUnitTesting(directories, TestConstants.EMBEDDED_TOOLS);
     mockToolsConfig = new MockToolsConfig(rootDirectory, false);
     mock.setupMockClient(mockToolsConfig);
@@ -215,7 +216,8 @@
             getPreprocessorFactorySupplier(),
             mock.getSkyFunctions(),
             getPrecomputedValues(),
-            ImmutableList.<SkyValueDirtinessChecker>of());
+            ImmutableList.<SkyValueDirtinessChecker>of(),
+            TestConstants.PRODUCT_NAME);
     skyframeExecutor.preparePackageLoading(
         new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)),
         ConstantRuleVisibility.PUBLIC, true, 7, "",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
index e485597..60cef90 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
@@ -91,7 +91,8 @@
     PathPackageLocator pkgLocator =
         new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory));
     final PackageFactory pkgFactory;
-    BlazeDirectories directories = new BlazeDirectories(outputBase, outputBase, rootDirectory);
+    BlazeDirectories directories = new BlazeDirectories(outputBase, outputBase, rootDirectory,
+        TestConstants.PRODUCT_NAME);
     pkgFactory = new PackageFactory(ruleClassProvider);
     AnalysisTestUtil.DummyWorkspaceStatusActionFactory workspaceStatusActionFactory =
         new AnalysisTestUtil.DummyWorkspaceStatusActionFactory(directories);
@@ -109,7 +110,8 @@
             Preprocessor.Factory.Supplier.NullSupplier.INSTANCE,
             analysisMock.getSkyFunctions(),
             ImmutableList.<PrecomputedValue.Injected>of(),
-            ImmutableList.<SkyValueDirtinessChecker>of());
+            ImmutableList.<SkyValueDirtinessChecker>of(),
+            TestConstants.PRODUCT_NAME);
 
     skyframeExecutor.preparePackageLoading(
         pkgLocator,
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
index 7af31ec..4cbff52 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
@@ -100,7 +100,7 @@
     SkyframeExecutor skyframeExecutor =
         SequencedSkyframeExecutor.create(
             new PackageFactory(ruleClassProvider, environmentExtensions),
-            new BlazeDirectories(outputBase, outputBase, rootDirectory),
+            new BlazeDirectories(outputBase, outputBase, rootDirectory, TestConstants.PRODUCT_NAME),
             null, /* BinTools */
             null, /* workspaceStatusActionFactory */
             ruleClassProvider.getBuildInfoFactories(),
@@ -109,7 +109,8 @@
             preprocessorFactorySupplier,
             ImmutableMap.<SkyFunctionName, SkyFunction>of(),
             ImmutableList.<PrecomputedValue.Injected>of(),
-            ImmutableList.<SkyValueDirtinessChecker>of());
+            ImmutableList.<SkyValueDirtinessChecker>of(),
+            TestConstants.PRODUCT_NAME);
     return skyframeExecutor;
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
index 053c5eb..32497bd 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
@@ -42,6 +42,7 @@
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.syntax.GlobList;
 import com.google.devtools.build.lib.testutil.ManualClock;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.util.BlazeClock;
 import com.google.devtools.build.lib.util.Preconditions;
@@ -468,7 +469,8 @@
       skyframeExecutor =
           SequencedSkyframeExecutor.create(
               new PackageFactory(TestRuleClassProvider.getRuleClassProvider()),
-              new BlazeDirectories(fs.getPath("/install"), fs.getPath("/output"), workspace),
+              new BlazeDirectories(fs.getPath("/install"), fs.getPath("/output"), workspace,
+                  TestConstants.PRODUCT_NAME),
               null, /* BinTools */
               null, /* workspaceStatusActionFactory */
               TestRuleClassProvider.getRuleClassProvider().getBuildInfoFactories(),
@@ -477,7 +479,8 @@
               supplier,
               ImmutableMap.<SkyFunctionName, SkyFunction>of(),
               ImmutableList.<PrecomputedValue.Injected>of(),
-              ImmutableList.<SkyValueDirtinessChecker>of());
+              ImmutableList.<SkyValueDirtinessChecker>of(),
+              TestConstants.PRODUCT_NAME);
       skyframeExecutor.preparePackageLoading(
           new PathPackageLocator(outputBase, ImmutableList.of(workspace)),
           ConstantRuleVisibility.PUBLIC, true, 7, "",
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
index 6cb511d..5c94f04 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
@@ -629,7 +629,8 @@
       PackageCacheOptions options = Options.getDefaults(PackageCacheOptions.class);
       storedErrors = new StoredEventHandler();
       BlazeDirectories directories =
-          new BlazeDirectories(fs.getPath("/install"), fs.getPath("/output"), workspace);
+          new BlazeDirectories(fs.getPath("/install"), fs.getPath("/output"), workspace,
+              TestConstants.PRODUCT_NAME);
       skyframeExecutor = SequencedSkyframeExecutor.create(pkgFactory,
           directories,
           null,  /* binTools -- not used */
@@ -640,7 +641,8 @@
           Preprocessor.Factory.Supplier.NullSupplier.INSTANCE,
           AnalysisMock.get().getSkyFunctions(),
           ImmutableList.<PrecomputedValue.Injected>of(),
-          ImmutableList.<SkyValueDirtinessChecker>of());
+          ImmutableList.<SkyValueDirtinessChecker>of(),
+          TestConstants.PRODUCT_NAME);
       PathPackageLocator pkgLocator = PathPackageLocator.create(
           null, options.packagePath, storedErrors, workspace, workspace);
       skyframeExecutor.preparePackageLoading(
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
index d3abf77..5873114 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
@@ -82,7 +82,8 @@
   @Before
   public final void initializeSkyframeExecutor() throws Exception {
     ruleClassProvider = TestRuleClassProvider.getRuleClassProvider();
-    BlazeDirectories directories = new BlazeDirectories(outputBase, outputBase, rootDirectory);
+    BlazeDirectories directories = new BlazeDirectories(outputBase, outputBase, rootDirectory,
+        TestConstants.PRODUCT_NAME);
     skyframeExecutor =
         SequencedSkyframeExecutor.create(
             new PackageFactory(ruleClassProvider),
@@ -95,7 +96,8 @@
             Preprocessor.Factory.Supplier.NullSupplier.INSTANCE,
             AnalysisMock.get().getSkyFunctions(),
             ImmutableList.<PrecomputedValue.Injected>of(),
-            ImmutableList.<SkyValueDirtinessChecker>of());
+            ImmutableList.<SkyValueDirtinessChecker>of(),
+            TestConstants.PRODUCT_NAME);
     setUpSkyframe(parsePackageCacheOptions());
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java
index 9104187..07fdb53 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java
@@ -17,11 +17,11 @@
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.FileProvider;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.testutil.TestConstants;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -69,9 +69,9 @@
         linkAction,
         "-shared",
         "-o",
-        Constants.PRODUCT_NAME + "-out/.+/genrule/thebinary.so",
+        TestConstants.PRODUCT_NAME + "-out/.+/genrule/thebinary.so",
         "-Wl,-whole-archive",
-        Constants.PRODUCT_NAME + "-out/.+/genrule/genlib.a",
+        TestConstants.PRODUCT_NAME + "-out/.+/genrule/genlib.a",
         "-Wl,-no-whole-archive");
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java
index 9398b14..459a9cc 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java
@@ -131,7 +131,8 @@
   public final void initializeRuntime() throws Exception {
     BlazeDirectories directories =
         new BlazeDirectories(
-            scratch.dir("install_base"), scratch.dir("output_base"), scratch.dir("pkg"));
+            scratch.dir("install_base"), scratch.dir("output_base"), scratch.dir("pkg"),
+            TestConstants.PRODUCT_NAME);
     this.runtime =
         new BlazeRuntime.Builder()
             .setDirectories(directories)
diff --git a/src/test/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategyTestCase.java b/src/test/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategyTestCase.java
index 77b3881..efafd3b 100644
--- a/src/test/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategyTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategyTestCase.java
@@ -28,6 +28,7 @@
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
 import com.google.devtools.build.lib.testutil.BlazeTestUtils;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestFileOutErr;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.BlazeClock;
@@ -78,7 +79,8 @@
     fakeSandboxDir = testRoot.getRelative("sandbox");
     fakeSandboxDir.createDirectory();
 
-    blazeDirs = new BlazeDirectories(outputBase, outputBase, workspaceDir);
+    blazeDirs = new BlazeDirectories(outputBase, outputBase, workspaceDir,
+        TestConstants.PRODUCT_NAME);
     BlazeTestUtils.getIntegrationBinTools(blazeDirs);
 
     OptionsParser optionsParser =
@@ -107,7 +109,8 @@
                     true,
                     false,
                     ImmutableList.<String>of(),
-                    false)),
+                    false,
+                    TestConstants.PRODUCT_NAME)),
             ImmutableList.<ActionContextProvider>of());
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
index ebc33fd..e466bd9 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
@@ -20,13 +20,13 @@
 import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
 import com.google.devtools.build.lib.syntax.SkylarkImport;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.FileStatus;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.Path;
@@ -56,7 +56,7 @@
       if (statThrowsIoException
           && path.asFragment()
               .getPathString()
-              .equals("/workspace/tools/build_rules/prelude_" + Constants.PRODUCT_NAME)) {
+              .equals("/workspace/tools/build_rules/prelude_" + TestConstants.PRODUCT_NAME)) {
         throw new IOException("bork");
       }
       return super.stat(path, followSymlinks);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
index db0744d..aa3fba5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.ActionLookupValue.ActionLookupKey;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -71,7 +72,8 @@
     setupRoot(new CustomInMemoryFs());
     AtomicReference<PathPackageLocator> pkgLocator = new AtomicReference<>(new PathPackageLocator(
         root.getFileSystem().getPath("/outputbase"), ImmutableList.of(root)));
-    BlazeDirectories directories = new BlazeDirectories(root, root, root);
+    BlazeDirectories directories = new BlazeDirectories(root, root, root,
+        TestConstants.PRODUCT_NAME);
     ExternalFilesHelper externalFilesHelper = new ExternalFilesHelper(
         pkgLocator, false, directories);
     differencer = new RecordingDifferencer();
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index 22a8dbe..b2fb2d8 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.events.NullEventHandler;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.InMemoryMemoizingEvaluator;
@@ -61,7 +62,8 @@
         new AtomicReference<>(new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)));
     deletedPackages = new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
     ExternalFilesHelper externalFilesHelper = new ExternalFilesHelper(
-        pkgLocator, false, new BlazeDirectories(rootDirectory, rootDirectory, rootDirectory));
+        pkgLocator, false, new BlazeDirectories(rootDirectory, rootDirectory, rootDirectory,
+            TestConstants.PRODUCT_NAME));
 
     Map<SkyFunctionName, SkyFunction> skyFunctions = new HashMap<>();
     skyFunctions.put(SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction(deletedPackages));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index b046950..fbfedc5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -42,6 +42,7 @@
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.testutil.ManualClock;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.Pair;
@@ -122,7 +123,8 @@
 
   private SequentialBuildDriver makeDriver(boolean errorOnExternalFiles) {
     AtomicReference<PathPackageLocator> pkgLocatorRef = new AtomicReference<>(pkgLocator);
-    BlazeDirectories directories = new BlazeDirectories(pkgRoot, outputBase, pkgRoot);
+    BlazeDirectories directories = new BlazeDirectories(pkgRoot, outputBase, pkgRoot,
+        TestConstants.PRODUCT_NAME);
     ExternalFilesHelper externalFilesHelper =
         new ExternalFilesHelper(pkgLocatorRef, errorOnExternalFiles, directories);
     differencer = new RecordingDifferencer();
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
index 0dcc58f..660773f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
@@ -37,6 +37,7 @@
 import com.google.devtools.build.lib.packages.FilesetEntry.SymlinkBehavior;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -84,7 +85,8 @@
     AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages =
         new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
     ExternalFilesHelper externalFilesHelper = new ExternalFilesHelper(
-        pkgLocator, false, new BlazeDirectories(outputBase, outputBase, rootDirectory));
+        pkgLocator, false, new BlazeDirectories(outputBase, outputBase, rootDirectory,
+            TestConstants.PRODUCT_NAME));
 
     Map<SkyFunctionName, SkyFunction> skyFunctions = new HashMap<>();
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index 75a9429..85e1780 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -39,6 +39,7 @@
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.DirtinessCheckerUtils.BasicFilesystemDirtinessChecker;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.BatchStat;
@@ -103,7 +104,8 @@
 
     AtomicReference<PathPackageLocator> pkgLocator = new AtomicReference<>(new PathPackageLocator(
         fs.getPath("/output_base"), ImmutableList.of(pkgRoot)));
-    BlazeDirectories directories = new BlazeDirectories(pkgRoot, pkgRoot, pkgRoot);
+    BlazeDirectories directories = new BlazeDirectories(pkgRoot, pkgRoot, pkgRoot,
+        TestConstants.PRODUCT_NAME);
     ExternalFilesHelper externalFilesHelper = new ExternalFilesHelper(
         pkgLocator, false, directories);
     skyFunctions.put(SkyFunctions.FILE_STATE, new FileStateFunction(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
index 850a510..dbef1f5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
@@ -32,6 +32,7 @@
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.GlobValue.InvalidGlobPatternException;
 import com.google.devtools.build.lib.testutil.ManualClock;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.Dirent;
 import com.google.devtools.build.lib.vfs.FileStatus;
@@ -124,7 +125,7 @@
     AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages =
         new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
     ExternalFilesHelper externalFilesHelper = new ExternalFilesHelper(
-        pkgLocator, false, new BlazeDirectories(root, root, root));
+        pkgLocator, false, new BlazeDirectories(root, root, root, TestConstants.PRODUCT_NAME));
 
     Map<SkyFunctionName, SkyFunction> skyFunctions = new HashMap<>();
     skyFunctions.put(SkyFunctions.GLOB, new GlobFunction(alwaysUseDirListing()));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index df83967..db6209e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue.ErrorReason;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.Path;
@@ -72,7 +73,8 @@
     AtomicReference<PathPackageLocator> pkgLocator = new AtomicReference<>(
         new PathPackageLocator(outputBase, ImmutableList.of(emptyPackagePath, rootDirectory)));
     deletedPackages = new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
-    BlazeDirectories directories = new BlazeDirectories(rootDirectory, outputBase, rootDirectory);
+    BlazeDirectories directories = new BlazeDirectories(rootDirectory, outputBase, rootDirectory,
+        TestConstants.PRODUCT_NAME);
     ExternalFilesHelper externalFilesHelper = new ExternalFilesHelper(
         pkgLocator, false, directories);
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
index b2a02fb..747bb56 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
@@ -37,6 +37,7 @@
 import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFile;
 import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.TraversalRequest;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -85,7 +86,8 @@
         new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)));
     AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages =
         new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
-    BlazeDirectories directories = new BlazeDirectories(rootDirectory, outputBase, rootDirectory);
+    BlazeDirectories directories = new BlazeDirectories(rootDirectory, outputBase, rootDirectory,
+        TestConstants.PRODUCT_NAME);
     ExternalFilesHelper externalFilesHelper = new ExternalFilesHelper(
         pkgLocator, false, directories);
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index e1d2b5e..9f6bf6c 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -46,6 +46,7 @@
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.AbruptExitException;
@@ -140,7 +141,8 @@
     AtomicReference<PathPackageLocator> pkgLocator =
         new AtomicReference<>(new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)));
     AtomicReference<TimestampGranularityMonitor> tsgmRef = new AtomicReference<>(tsgm);
-    BlazeDirectories directories = new BlazeDirectories(rootDirectory, outputBase, rootDirectory);
+    BlazeDirectories directories = new BlazeDirectories(rootDirectory, outputBase, rootDirectory,
+        TestConstants.PRODUCT_NAME);
     ExternalFilesHelper externalFilesHelper = new ExternalFilesHelper(
         pkgLocator, false, directories);
     differencer = new RecordingDifferencer();
diff --git a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
index 6e4bfd2..733c4ad 100644
--- a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
@@ -89,7 +89,8 @@
     Path outputBase = testRoot.getRelative("outputBase");
     outputBase.createDirectory();
 
-    BlazeDirectories directories = new BlazeDirectories(outputBase, outputBase, workspaceDir);
+    BlazeDirectories directories = new BlazeDirectories(outputBase, outputBase, workspaceDir,
+        TestConstants.PRODUCT_NAME);
     BlazeTestUtils.getIntegrationBinTools(directories);
     OptionsParser optionsParser = OptionsParser.newOptionsParser(ExecutionOptions.class);
     optionsParser.parse("--verbose_failures");
@@ -106,7 +107,8 @@
         /* showSubcommands */ false,
         ImmutableList.<ActionContext>of(),
         ImmutableMap.<String, SpawnActionContext>of("",
-            new StandaloneSpawnStrategy(directories.getExecRoot(), false)),
+            new StandaloneSpawnStrategy(directories.getExecRoot(), false,
+                TestConstants.PRODUCT_NAME)),
         ImmutableList.<ActionContextProvider>of());
 
     executor.getExecRoot().createDirectory();
@@ -199,7 +201,7 @@
     assertThat(out()).isEmpty();
   }
 
-  // Test an action with environment variables set indicating an action running on a darwin host 
+  // Test an action with environment variables set indicating an action running on a darwin host
   // system. Such actions should fail given the fact that these tests run on a non darwin
   // architecture.
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
index cab180b..5c11575 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
@@ -24,6 +24,8 @@
   private TestConstants() {
   }
 
+  public static final String PRODUCT_NAME = "bazel";
+
   /**
    * A list of all embedded binaries that go into the regular Bazel binary.
    */
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemUtilsTest.java b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemUtilsTest.java
index 637cd18..23e0510 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemUtilsTest.java
@@ -41,6 +41,7 @@
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.testutil.BlazeTestUtils;
 import com.google.devtools.build.lib.testutil.ManualClock;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
 
 import org.junit.Before;
@@ -756,7 +757,7 @@
 
     Path linkRoot = fileSystem.getPath("/linkRoot");
     createDirectoryAndParents(linkRoot);
-    plantLinkForest(packageRootMap, linkRoot);
+    plantLinkForest(packageRootMap, linkRoot, TestConstants.PRODUCT_NAME);
 
     //dumpTree(linkRoot, System.err);