aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java9
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuiteTest.java128
3 files changed, 154 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java
index a427752411..37d033794e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java
@@ -183,6 +183,13 @@ public class CppConfigurationLoader implements ConfigurationFragmentFactory {
NonconfigurableAttributeMapper.of(ccToolchainSuite)
.get("toolchains", BuildType.LABEL_DICT_UNARY);
ccToolchainLabel = toolchains.get(key);
+ String errorMessage =
+ String.format(
+ "cc_toolchain_suite '%s' does not contain a toolchain for CPU '%s'",
+ crosstoolTopLabel, desiredCpu);
+ if (cppOptions.cppCompiler != null) {
+ errorMessage = errorMessage + " and compiler " + cppOptions.cppCompiler;
+ }
if (ccToolchainLabel == null) {
// If the cc_toolchain_suite does not contain entry for --cpu|--compiler (or only --cpu if
// --compiler is not present) we select the toolchain by looping through all the toolchains
@@ -193,15 +200,18 @@ public class CppConfigurationLoader implements ConfigurationFragmentFactory {
CrosstoolConfigurationLoader.selectToolchain(
file.getProto(), options, cpuTransformer.getTransformer());
ccToolchainLabel = toolchains.get(toolchain.getTargetCpu() + "|" + toolchain.getCompiler());
+ if (!cppOptions.enableCcToolchainFromCrosstool) {
+ throw new InvalidConfigurationException(
+ errorMessage
+ + String.format(
+ ", you may want to add an entry for '%s|%s' into toolchains and "
+ + "toolchain_identifier '%s' into the corresponding cc_toolchain rule.",
+ toolchain.getTargetCpu(),
+ toolchain.getCompiler(),
+ toolchain.getToolchainIdentifier()));
+ }
}
if (ccToolchainLabel == null) {
- String errorMessage =
- String.format(
- "cc_toolchain_suite '%s' does not contain a toolchain for CPU '%s'",
- crosstoolTopLabel, desiredCpu);
- if (cppOptions.cppCompiler != null) {
- errorMessage = errorMessage + " and compiler " + cppOptions.cppCompiler;
- }
throw new InvalidConfigurationException(errorMessage);
}
} else {
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 49a11a16f4..4e4e863b29 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
@@ -862,6 +862,15 @@ public class CppOptions extends FragmentOptions {
+ "crosstool variable.")
public boolean enableLinkoptsInUserLinkFlags;
+ @Option(
+ name = "experimental_enable_cc_toolchain_label_from_crosstool_proto",
+ defaultValue = "true",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS, OptionEffectTag.EAGERNESS_TO_EXIT},
+ metadataTags = {OptionMetadataTag.EXPERIMENTAL},
+ help = "If false, Bazel will not use the CROSSTOOL file to select the cc_toolchain label.")
+ public boolean enableCcToolchainFromCrosstool;
+
@Override
public FragmentOptions getHost() {
CppOptions host = (CppOptions) getDefault();
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuiteTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuiteTest.java
index 869601122d..95bfdc7ead 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuiteTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuiteTest.java
@@ -692,4 +692,132 @@ public class CcToolchainSuiteTest extends BuildViewTestCase {
+ " --compiler: right-compiler, toolchain.compiler: wrong-compiler");
}
}
+
+ @Test
+ public void testDisableCcToolchainLabelFromCrosstoolFile() throws Exception {
+ scratch.file(
+ "cc/BUILD",
+ "filegroup(name='empty')",
+ "filegroup(name='everything')",
+ "TOOLCHAIN_NAMES = [",
+ " 'darwin',",
+ " 'windows',",
+ " 'k8',",
+ " 'ppc-compiler',",
+ " 'ppc']",
+ "[cc_toolchain(",
+ " name = NAME,",
+ " cpu = 'banana',",
+ " all_files = ':empty',",
+ " ar_files = ':empty',",
+ " as_files = ':empty',",
+ " compiler_files = ':empty',",
+ " dwp_files = ':empty',",
+ " linker_files = ':empty',",
+ " strip_files = ':empty',",
+ " objcopy_files = ':empty',",
+ " dynamic_runtime_libs = [':empty'],",
+ " static_runtime_libs = [':empty'],",
+ ") for NAME in TOOLCHAIN_NAMES]",
+ "cc_toolchain_suite(",
+ " name = 'suite',",
+ " toolchains = {",
+ " 'ppc': ':ppc',",
+ " 'ppc|compiler': ':ppc-compiler',",
+ " 'k8': ':k8',",
+ " 'x64_windows' : ':windows',",
+ " 'darwin' : ':darwin',",
+ " 'x64_windows|compiler' : ':windows',",
+ " 'darwin|compiler' : ':darwin',",
+ " },",
+ " proto = \"\"\"",
+ "major_version: 'v1'",
+ "minor_version: '0'",
+ "default_target_cpu: 'k8'",
+ "default_toolchain {",
+ " cpu: 'k8'",
+ " toolchain_identifier: 'k8-from-crosstool'",
+ "}",
+ "default_toolchain {",
+ " cpu: 'ppc'",
+ " toolchain_identifier: 'ppc-from-crosstool'",
+ "}",
+ "default_toolchain {",
+ " cpu: 'darwin'",
+ " toolchain_identifier: 'darwin-from-crosstool'",
+ "}",
+ "default_toolchain {",
+ " cpu: 'x64_windows'",
+ " toolchain_identifier: 'windows-from-crosstool'",
+ "}",
+ "toolchain {",
+ " compiler: 'compiler'",
+ " target_cpu: 'k8'",
+ " toolchain_identifier: 'k8-from-crosstool'",
+ " host_system_name: 'linux'",
+ " target_system_name: 'linux'",
+ " abi_version: 'cpu-abi'",
+ " abi_libc_version: ''",
+ " target_libc: 'local'",
+ " builtin_sysroot: 'sysroot'",
+ " default_grte_top: '//cc:grtetop'",
+ "}",
+ "toolchain {",
+ " compiler: 'compiler'",
+ " target_cpu: 'ppc'",
+ " toolchain_identifier: 'ppc-from-crosstool'",
+ " host_system_name: 'linux'",
+ " target_system_name: 'linux'",
+ " abi_version: 'cpu-abi'",
+ " abi_libc_version: ''",
+ " target_libc: 'local'",
+ " builtin_sysroot: 'sysroot'",
+ " default_grte_top: '//cc:grtetop'",
+ "}",
+ "toolchain {",
+ " compiler: 'compiler'",
+ " target_cpu: 'darwin'",
+ " toolchain_identifier: 'darwin-from-crosstool'",
+ " host_system_name: 'linux'",
+ " target_system_name: 'linux'",
+ " abi_version: ''",
+ " abi_libc_version: ''",
+ " target_libc: ''",
+ " builtin_sysroot: 'sysroot'",
+ " default_grte_top: '//cc:grtetop'",
+ "}",
+ "toolchain {",
+ " compiler: 'compiler'",
+ " target_cpu: 'x64_windows'",
+ " toolchain_identifier: 'windows-from-crosstool'",
+ " host_system_name: 'windows'",
+ " target_system_name: 'windows'",
+ " abi_version: ''",
+ " abi_libc_version: ''",
+ " target_libc: ''",
+ " builtin_sysroot: 'sysroot'",
+ " default_grte_top: '//cc:grtetop'",
+ "}",
+ "\"\"\"",
+ ")");
+
+ scratch.file("a/BUILD", "cc_binary(name='b', srcs=['b.cc'])");
+
+ try {
+ useConfiguration(
+ "--crosstool_top=//cc:suite",
+ "--cpu=k8",
+ "--compiler=compiler",
+ "--experimental_enable_cc_toolchain_label_from_crosstool_proto=false");
+ getConfiguredTarget("//a:b");
+ fail("Expected failure because selecting cc_toolchain label from CROSSTOOL is disabled");
+ } catch (InvalidConfigurationException e) {
+ assertThat(e)
+ .hasMessageThat()
+ .contains(
+ "you may want to add an entry for 'k8|compiler' into toolchains and "
+ + "toolchain_identifier 'k8-from-crosstool' into the corresponding "
+ + "cc_toolchain rule");
+ }
+ }
}