Inject the prelude path through the rule class provider.

--
MOS_MIGRATED_REVID=102020499
diff --git a/src/main/java/com/google/devtools/build/lib/Constants.java b/src/main/java/com/google/devtools/build/lib/Constants.java
index 9c0bce6..1925876 100644
--- a/src/main/java/com/google/devtools/build/lib/Constants.java
+++ b/src/main/java/com/google/devtools/build/lib/Constants.java
@@ -35,8 +35,6 @@
 
   public static final String NATIVE_DEPS_LIB_SUFFIX = "_nativedeps";
 
-  public static final String PRELUDE_FILE_DEPOT_RELATIVE_PATH = "tools/build_rules/prelude_bazel";
-
   public static final String ANDROID_DEFAULT_SDK = "//external:android/sdk".toString();
   public static final String ANDROID_DEFAULT_CROSSTOOL = "//external:android/crosstool".toString();
   public static final ImmutableList<String> ANDROID_DEFAULT_FAT_APK_CPUS =
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 3bea243..8f048f7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -18,6 +18,7 @@
 import static com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType.ABSTRACT;
 import static com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType.TEST;
 
+import com.google.common.base.Preconditions;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
@@ -41,6 +42,7 @@
 import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
 import com.google.devtools.build.lib.syntax.SkylarkType;
 import com.google.devtools.build.lib.syntax.ValidationEnvironment;
+import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.common.options.OptionsClassProvider;
 
 import java.lang.reflect.Constructor;
@@ -77,6 +79,7 @@
    */
   public static class Builder implements RuleDefinitionEnvironment {
     private final StringBuilder defaultWorkspaceFile = new StringBuilder();
+    private PathFragment preludePath;
     private final List<ConfigurationFragmentFactory> configurationFragments = new ArrayList<>();
     private final List<BuildInfoFactory> buildInfoFactories = new ArrayList<>();
     private final List<Class<? extends FragmentOptions>> configurationOptions = new ArrayList<>();
@@ -99,6 +102,14 @@
       defaultWorkspaceFile.append(contents);
     }
 
+    public Builder setPrelude(String workspaceRelativePath) {
+      PathFragment preludePathFragment = new PathFragment(workspaceRelativePath);
+      Preconditions.checkArgument(!preludePathFragment.isAbsolute());
+      Preconditions.checkArgument(preludePathFragment.isNormalized());
+      this.preludePath = preludePathFragment;
+      return this;
+    }
+
     public Builder setPrerequisiteValidator(PrerequisiteValidator prerequisiteValidator) {
       this.prerequisiteValidator = prerequisiteValidator;
       return this;
@@ -207,6 +218,7 @@
       }
 
       return new ConfiguredRuleClassProvider(
+          preludePath,
           ImmutableMap.copyOf(ruleClassMap),
           ImmutableMap.copyOf(ruleDefinitionMap),
           ImmutableMap.copyOf(aspectFactoryMap),
@@ -248,6 +260,11 @@
   String defaultWorkspaceFile;
 
   /**
+   * Workspace-relative path to the prelude.
+   */
+  private final PathFragment preludePath;
+
+  /**
    * Maps rule class name to the metaclass instance for that rule.
    */
   private final ImmutableMap<String, RuleClass> ruleClassMap;
@@ -286,6 +303,7 @@
   private final ValidationEnvironment skylarkValidationEnvironment;
 
   public ConfiguredRuleClassProvider(
+      PathFragment preludePath,
       ImmutableMap<String, RuleClass> ruleClassMap,
       ImmutableMap<String, Class<? extends RuleDefinition>> ruleDefinitionMap,
       ImmutableMap<String, Class<? extends AspectFactory<?, ?, ?>>> aspectFactoryMap,
@@ -296,7 +314,7 @@
       ConfigurationCollectionFactory configurationCollectionFactory,
       PrerequisiteValidator prerequisiteValidator,
       ImmutableMap<String, SkylarkType> skylarkAccessibleJavaClasses) {
-
+    this.preludePath = preludePath;
     this.ruleClassMap = ruleClassMap;
     this.ruleDefinitionMap = ruleDefinitionMap;
     this.aspectFactoryMap = aspectFactoryMap;
@@ -317,6 +335,11 @@
   }
 
   @Override
+  public PathFragment getPreludePath() {
+    return preludePath;
+  }
+
+  @Override
   public Map<String, RuleClass> getRuleClassMap() {
     return ruleClassMap;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 7cb8012..f337c25 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -219,6 +219,7 @@
         .addBuildInfoFactory(new CppBuildInfo())
         .addBuildInfoFactory(new ObjcBuildInfoFactory())
         .setConfigurationCollectionFactory(new BazelConfigurationCollection())
+        .setPrelude("tools/build_rules/prelude_bazel")
         .setPrerequisiteValidator(new BazelPrerequisiteValidator());
 
     for (Class<? extends FragmentOptions> fragmentOptions : BUILD_OPTIONS) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
index 3f24efb..d153fa1 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
 import com.google.devtools.build.lib.syntax.ValidationEnvironment;
+import com.google.devtools.build.lib.vfs.PathFragment;
 
 import java.util.Map;
 
@@ -24,6 +25,12 @@
  * The collection of the supported build rules. Provides an Environment for Skylark rule creation.
  */
 public interface RuleClassProvider {
+
+  /**
+   * Workspace relative path to the prelude file.
+   */
+  PathFragment getPreludePath();
+
   /**
    * Returns a map from rule names to rule class objects.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 38b4ac4..c8fad50 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -21,7 +21,6 @@
 import com.google.common.collect.Iterables;
 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.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
 import com.google.devtools.build.lib.events.Event;
@@ -89,22 +88,21 @@
   private final AtomicInteger numPackagesLoaded;
   private final Profiler profiler = Profiler.instance();
 
-  static final PathFragment PRELUDE_FILE_FRAGMENT =
-      new PathFragment(Constants.PRELUDE_FILE_DEPOT_RELATIVE_PATH);
+  private final PathFragment preludePath;
 
   static final String DEFAULTS_PACKAGE_NAME = "tools/defaults";
   public static final String EXTERNAL_PACKAGE_NAME = "external";
 
-  static {
-    Preconditions.checkArgument(!PRELUDE_FILE_FRAGMENT.isAbsolute());
-  }
-
   public PackageFunction(Reporter reporter, PackageFactory packageFactory,
       CachingPackageLocator pkgLocator, AtomicBoolean showLoadingProgress,
       Cache<PackageIdentifier, Package.LegacyBuilder> packageFunctionCache,
       AtomicInteger numPackagesLoaded) {
     this.reporter = reporter;
 
+    // Can be null in tests.
+    this.preludePath = packageFactory == null
+        ? null
+        : packageFactory.getRuleClassProvider().getPreludePath();
     this.packageFactory = packageFactory;
     this.packageLocator = pkgLocator;
     this.showLoadingProgress = showLoadingProgress;
@@ -423,7 +421,7 @@
     SkyKey astLookupKey = null;
     try {
       astLookupKey = ASTFileLookupValue.key(
-          PackageIdentifier.createInDefaultRepo(PRELUDE_FILE_FRAGMENT));
+          PackageIdentifier.createInDefaultRepo(preludePath));
     } catch (ASTLookupInputException e) {
       // There's a static check ensuring that PRELUDE_FILE_FRAGMENT is relative.
       throw new IllegalStateException(e);
@@ -597,7 +595,7 @@
         // a load() statement comes from the prelude, since we just prepend those statements before
         // the actual BUILD file. So we use this evil .endsWith() statement to figure it out.
         RepositoryName repository =
-            entry.getKey().getPath().endsWith(PRELUDE_FILE_FRAGMENT)
+            entry.getKey().getPath().endsWith(preludePath)
                 ? PackageIdentifier.DEFAULT_REPOSITORY_NAME : packageId.getRepository();
         SkyKey importsLookupKey = SkylarkImportLookupValue.key(
             repository, buildFileFragment, importFile);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
index 1eb86cd..5096ba8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
@@ -91,7 +91,7 @@
         // a load() statement comes from the prelude, since we just prepend those statements before
         // the actual BUILD file. So we use this evil .endsWith() statement to figure it out.
         RepositoryName repository =
-            entry.getKey().getPath().endsWith(PackageFunction.PRELUDE_FILE_FRAGMENT)
+            entry.getKey().getPath().endsWith(ruleClassProvider.getPreludePath())
                 ? PackageIdentifier.DEFAULT_REPOSITORY_NAME : arg.getRepository();
         SkyKey importsLookupKey = SkylarkImportLookupValue.key(repository, file, importFile);
         SkylarkImportLookupValue importsLookupValue;