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",