diff options
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"); + } + } } |