Add a flag to remove Java Make variables from Jvm.

These depend on package loading and thus must be gone.

RELNOTES: None.
PiperOrigin-RevId: 171132297
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
index a6662b2a..dfc01bd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
@@ -527,6 +527,18 @@
   )
   public boolean disableAbsoluteJavabase;
 
+  @Option(
+      name = "experimental_enable_jvm_configuration_make_variables",
+      defaultValue = "true",
+      documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+      effectTags = {OptionEffectTag.UNKNOWN},
+      metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE},
+      help = "If enabled, the Java configuration fragment supplies the JAVA and JAVABASE "
+          + "Make variables. This option is used in the migration to remove them in favor of "
+          + "requiring an explicit dependency on the Java runtime for rules that use them."
+  )
+  public boolean enableMakeVariables;
+
   // Plugins are built using the host config. To avoid cycles we just don't propagate
   // this option to the host config. If one day we decide to use plugins when building
   // host tools, we can improve this by (for example) creating a compiler configuration that is
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/Jvm.java b/src/main/java/com/google/devtools/build/lib/rules/java/Jvm.java
index 1b7e4ac..b582e9d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/Jvm.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/Jvm.java
@@ -41,6 +41,7 @@
   private final PathFragment javaHome;
   private final Label jvmLabel;
   private final PathFragment java;
+  private final boolean enableMakeVariables;
 
   public static final String BIN_JAVA = "bin/java" + OsUtils.executableExtension();
 
@@ -49,11 +50,12 @@
    * and/or the {@code jvmLabel} parameter must be non-null. Only the
    * {@code jvmLabel} is optional.
    */
-  public Jvm(PathFragment javaHome, Label jvmLabel) {
+  public Jvm(PathFragment javaHome, Label jvmLabel, boolean enableMakeVariables) {
     Preconditions.checkArgument(javaHome.isAbsolute() || jvmLabel != null);
     this.javaHome = javaHome;
     this.jvmLabel = jvmLabel;
     this.java = javaHome.getRelative(BIN_JAVA);
+    this.enableMakeVariables = enableMakeVariables;
   }
 
   /**
@@ -86,7 +88,9 @@
 
   @Override
   public void addGlobalMakeVariables(Builder<String, String> globalMakeEnvBuilder) {
-    globalMakeEnvBuilder.put("JAVABASE", javaHome.getPathString());
-    globalMakeEnvBuilder.put("JAVA", java.getPathString());
+    if (enableMakeVariables) {
+      globalMakeEnvBuilder.put("JAVABASE", javaHome.getPathString());
+      globalMakeEnvBuilder.put("JAVA", java.getPathString());
+    }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
index cfe8791..a43088c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
@@ -61,7 +61,7 @@
     String cpu = buildOptions.get(BuildConfiguration.Options.class).cpu;
 
     try {
-      return createFromJavaRuntimeSuite(env, javaHome, cpu);
+      return createFromJavaRuntimeSuite(env, javaHome, cpu, javaOptions.enableMakeVariables);
     } catch (LabelSyntaxException e) {
       // Try again with legacy
     }
@@ -70,7 +70,7 @@
       throw new InvalidConfigurationException("Absolute --javabase is disabled");
     }
 
-    return createFromAbsoluteJavabase(javaHome);
+    return createFromAbsoluteJavabase(javaHome, javaOptions.enableMakeVariables);
   }
 
   @Override
@@ -85,7 +85,7 @@
 
   @Nullable
   private static Jvm createFromJavaRuntimeSuite(
-      ConfigurationEnvironment lookup, String javaHome, String cpu)
+      ConfigurationEnvironment lookup, String javaHome, String cpu, boolean enableMakeVariables)
       throws InvalidConfigurationException, LabelSyntaxException, InterruptedException {
     try {
       Label label = Label.parseAbsolute(javaHome);
@@ -101,7 +101,7 @@
                   + ((Rule) javaHomeTarget).getRuleClass()
                   + "'. Expected java_runtime_suite");
         }
-        return createFromRuntimeSuite(lookup, (Rule) javaHomeTarget, cpu);
+        return createFromRuntimeSuite(lookup, (Rule) javaHomeTarget, cpu, enableMakeVariables);
       }
       throw new InvalidConfigurationException(
           "No JVM target found under " + javaHome + " that would work for " + cpu);
@@ -113,8 +113,8 @@
 
   // TODO(b/34175492): eventually the Jvm fragement will containg only the label of a java_runtime
   // rule, and all of the configuration will be accessed using JavaRuntimeInfo.
-  private static Jvm createFromRuntimeSuite(
-      ConfigurationEnvironment lookup, Rule javaRuntimeSuite, String cpu)
+  private static Jvm createFromRuntimeSuite(ConfigurationEnvironment lookup, Rule javaRuntimeSuite,
+      String cpu, boolean enableMakeVariables)
       throws InvalidConfigurationException, InterruptedException, NoSuchTargetException,
           NoSuchPackageException {
     Label javaRuntimeLabel = selectRuntime(javaRuntimeSuite, cpu);
@@ -144,7 +144,7 @@
                 javaHomePath, srcs.toString()));
       }
     }
-    return new Jvm(javaHomePath, javaRuntimeSuite.getLabel());
+    return new Jvm(javaHomePath, javaRuntimeSuite.getLabel(), enableMakeVariables);
   }
 
   private static Label selectRuntime(Rule javaRuntimeSuite, String cpu)
@@ -161,13 +161,13 @@
         "No JVM target found under " + javaRuntimeSuite + " that would work for " + cpu);
   }
 
-  private static Jvm createFromAbsoluteJavabase(String javaHome)
+  private static Jvm createFromAbsoluteJavabase(String javaHome, boolean enableMakeVariables)
       throws InvalidConfigurationException {
     PathFragment javaHomePathFrag = PathFragment.create(javaHome);
     if (!javaHomePathFrag.isAbsolute()) {
       throw new InvalidConfigurationException(
           "Illegal javabase value '" + javaHome + "', javabase must be an absolute path or label");
     }
-    return new Jvm(javaHomePathFrag, null);
+    return new Jvm(javaHomePathFrag, null, enableMakeVariables);
   }
 }