Add --incompatible_dont_enable_host_nonhost_crosstool_features

https://github.com/bazelbuild/bazel/issues/7407

RELNOTES: None.
PiperOrigin-RevId: 233732318
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index eeb2bfa..e2446cd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -872,10 +872,12 @@
             .addAll(requestedFeatures)
             .addAll(toolchain.getFeatures().getDefaultFeaturesAndActionConfigs());
 
-    if (toolchain.isHostConfiguration()) {
-      allFeatures.add("host");
-    } else {
-      allFeatures.add("nonhost");
+    if (!cppConfiguration.dontEnableHostNonhost()) {
+      if (toolchain.isHostConfiguration()) {
+        allFeatures.add("host");
+      } else {
+        allFeatures.add("nonhost");
+      }
     }
 
     if (toolchain.useFission() && !cppConfiguration.disableLegacyCrosstoolFields()) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index 2797940..5a614b4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -597,4 +597,8 @@
   public boolean disableCrosstool() {
     return cppOptions.disableCrosstool;
   }
+
+  public boolean dontEnableHostNonhost() {
+    return cppOptions.dontEnableHostNonhost;
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
index 314919b..6e6415c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
@@ -686,6 +686,20 @@
   public boolean useLLVMCoverageMapFormat;
 
   @Option(
+      name = "incompatible_dont_enable_host_nonhost_crosstool_features",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.TOOLCHAIN,
+      effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
+      metadataTags = {
+        OptionMetadataTag.INCOMPATIBLE_CHANGE,
+        OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+      },
+      help =
+          "If true, Bazel will not enable 'host' and 'nonhost' features in the c++ toolchain "
+              + "(see https://github.com/bazelbuild/bazel/issues/7407 for more information).")
+  public boolean dontEnableHostNonhost;
+
+  @Option(
       name = "incompatible_disable_legacy_crosstool_fields",
       oldName = "experimental_disable_legacy_crosstool_fields",
       defaultValue = "false",
@@ -886,6 +900,7 @@
     host.disableCrosstool = disableCrosstool;
     host.enableCcToolchainResolution = enableCcToolchainResolution;
     host.removeLegacyWholeArchive = removeLegacyWholeArchive;
+    host.dontEnableHostNonhost = dontEnableHostNonhost;
     return host;
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
index ebf1bf5..b219d81 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
@@ -1230,12 +1230,17 @@
     assertThat(flags).containsNoneOf("-fastbuild", "-opt");
   }
 
-  private List<String> getHostAndTargetFlags(boolean useHost) throws Exception {
+  private List<String> getHostAndTargetFlags(boolean useHost, boolean isDisabledByFlag)
+      throws Exception {
     AnalysisMock.get()
         .ccSupport()
         .setupCrosstool(mockToolsConfig, MockCcSupport.HOST_AND_NONHOST_CONFIGURATION);
     scratch.overwriteFile("mode/BUILD", "cc_library(name = 'a', srcs = ['a.cc'])");
-    useConfiguration("--cpu=k8");
+    useConfiguration(
+        "--cpu=k8",
+        isDisabledByFlag
+            ? "--incompatible_dont_enable_host_nonhost_crosstool_features"
+            : "--noincompatible_dont_enable_host_nonhost_crosstool_features");
     ConfiguredTarget target;
     String objectPath;
     if (useHost) {
@@ -1255,16 +1260,29 @@
   public void testHostAndNonHostFeatures() throws Exception {
     List<String> flags;
 
-    flags = getHostAndTargetFlags(true);
+    flags = getHostAndTargetFlags(/* useHost= */ true, /* isDisabledByFlag= */ false);
     assertThat(flags).contains("-host");
     assertThat(flags).doesNotContain("-nonhost");
 
-    flags = getHostAndTargetFlags(false);
+    flags = getHostAndTargetFlags(/* useHost= */ false, /* isDisabledByFlag= */ false);
     assertThat(flags).contains("-nonhost");
     assertThat(flags).doesNotContain("-host");
   }
 
   @Test
+  public void testHostAndNonHostFeaturesDisabledByTheFlag() throws Exception {
+    List<String> flags;
+
+    flags = getHostAndTargetFlags(/* useHost= */ true, /* isDisabledByFlag= */ true);
+    assertThat(flags).doesNotContain("-host");
+    assertThat(flags).doesNotContain("-nonhost");
+
+    flags = getHostAndTargetFlags(/* useHost= */ false, /* isDisabledByFlag= */ true);
+    assertThat(flags).doesNotContain("-nonhost");
+    assertThat(flags).doesNotContain("-host");
+  }
+
+  @Test
   public void testIncludePathsOutsideExecutionRoot() throws Exception {
     scratchRule(
         "root",