Remove --glibc option

Crosstool selection will be based solely on --cpu and --compiler options.

RELNOTES: Option --glibc is removed, toolchain selection relies solely on --cpu and --compiler options.
PiperOrigin-RevId: 199156131
diff --git a/site/docs/user-manual.html b/site/docs/user-manual.html
index 6d93e7d..9a681dc 100644
--- a/site/docs/user-manual.html
+++ b/site/docs/user-manual.html
@@ -1581,8 +1581,8 @@
 <h3 id='strategy-options'>Build strategy options</h3>
 <p>
   Note that a particular combination of crosstool version, compiler version,
-  libc version, and target CPU is allowed only if it has been specified
-  in the currently used CROSSTOOL file.
+  and target CPU is allowed only if it has been specified in the currently
+  used CROSSTOOL file.
 </p>
 
 <h4 id='flag--host_cpu'><code class='flag'>--host_cpu <var>cpu</var></code></h4>
@@ -1790,23 +1790,7 @@
 </p>
 <p>
   Note that only certain combinations of crosstool version, compiler version,
-  libc version, and target CPU are allowed.
-</p>
-
-<h4 id='flag--glibc'><code class='flag'>--glibc <var>version</var></code></h4>
-<p>
-  This option specifies the version of glibc that the target should be linked
-  against. If you want to build with a custom crosstool, you should use a
-  CROSSTOOL file instead of specifying this flag. In that case, Bazel will use
-  the CROSSTOOL file and the following options where appropriate:
-  <ul>
-    <li><a href="#flag--cpu"><code class='flag'>--cpu</code></a></li>
-
-  </ul>
-</p>
-<p>
-  Note that only certain combinations of crosstool version, compiler version,
-  glibc version, and target CPU are allowed.
+  and target CPU are allowed.
 </p>
 
 <h4 id='flag--android_sdk'><code class='flag'>--android_sdk <var>label</var></code></h4>
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
index 0f333e9..435b55f 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
@@ -49,6 +49,16 @@
         metadataTags = {OptionMetadataTag.DEPRECATED},
         help = "Deprecated no-op.")
     public boolean directRun;
+
+    @Deprecated
+    @Option(
+        name = "glibc",
+        defaultValue = "null",
+        documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+        effectTags = {OptionEffectTag.UNKNOWN},
+        metadataTags = {OptionMetadataTag.DEPRECATED},
+        help = "Deprecated no-op.")
+    public String glibc;
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index cd39c8b..1c5d0116 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -252,7 +252,6 @@
           splitOptions.get(CppOptions.class).libcTopLabel = androidOptions.androidLibcTopLabel;
           splitOptions.get(BuildConfiguration.Options.class).cpu = androidOptions.cpu;
           splitOptions.get(CppOptions.class).dynamicMode = androidOptions.dynamicMode;
-          splitOptions.get(CppOptions.class).glibc = null;
           setCrosstoolToAndroid(splitOptions, buildOptions);
           return ImmutableList.of(splitOptions);
         }
@@ -272,7 +271,6 @@
           splitOptions.get(CppOptions.class).cppCompiler = androidOptions.cppCompiler;
           splitOptions.get(CppOptions.class).libcTopLabel = androidOptions.androidLibcTopLabel;
           splitOptions.get(CppOptions.class).dynamicMode = androidOptions.dynamicMode;
-          splitOptions.get(CppOptions.class).glibc = null;
           setCrosstoolToAndroid(splitOptions, buildOptions);
           result.add(splitOptions);
         }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index 5dc9e75..624c847 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -753,12 +753,7 @@
     if (compiler.isEmpty()) {
       compiler = null;
     }
-    String libc = ruleContext.attributes().get("libc", Type.STRING);
-    if (libc.isEmpty()) {
-      libc = null;
-    }
-    CrosstoolConfigurationIdentifier config =
-        new CrosstoolConfigurationIdentifier(cpu, compiler, libc);
+    CrosstoolConfigurationIdentifier config = new CrosstoolConfigurationIdentifier(cpu, compiler);
 
     try {
       return CrosstoolConfigurationLoader.selectToolchain(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
index bdba988..a22c7a3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
@@ -111,7 +111,6 @@
         .add(attr("output_licenses", LICENSE))
         .add(attr("cpu", STRING).mandatory())
         .add(attr("compiler", STRING))
-        .add(attr("libc", STRING))
         .add(
             attr("all_files", LABEL)
                 .legacyAllowAnyFileType()
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 cc8fd2f..68009b8b 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
@@ -170,17 +170,6 @@
   )
   public String outputDirectoryTag;
 
-  @Option(
-    name = "glibc",
-    defaultValue = "null",
-    documentationCategory = OptionDocumentationCategory.TOOLCHAIN,
-    effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS, OptionEffectTag.AFFECTS_OUTPUTS},
-    help =
-        "The version of glibc the target should be linked against. "
-            + "By default, a suitable version is chosen based on --cpu."
-  )
-  public String glibc;
-
   // O intrepid reaper of unused options: Be warned that the [no]start_end_lib
   // option, however tempting to remove, has a use case. Look in our telemetry data.
   @Option(
@@ -954,7 +943,6 @@
     if (hostCrosstoolTop == null) {
       host.cppCompiler = cppCompiler;
       host.crosstoolTop = crosstoolTop;
-      host.glibc = glibc;
     } else {
       host.crosstoolTop = hostCrosstoolTop;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationIdentifier.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationIdentifier.java
index accd29c..63ef402 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationIdentifier.java
@@ -35,14 +35,10 @@
   /** The compiler (e.g. gcc) associated with this crosstool configuration. */
   private final String compiler;
 
-  /** The version of libc (e.g. glibc-2.11) associated with this crosstool configuration. */
-  private final String libc;
-
   /** Creates a new {@link CrosstoolConfigurationIdentifier} with the given parameters. */
-  CrosstoolConfigurationIdentifier(String cpu, String compiler, String libc) {
+  CrosstoolConfigurationIdentifier(String cpu, String compiler) {
     this.cpu = Preconditions.checkNotNull(cpu);
     this.compiler = compiler;
-    this.libc = libc;
   }
 
   /**
@@ -52,13 +48,11 @@
   public static CrosstoolConfigurationIdentifier fromOptions(BuildOptions buildOptions) {
     Options options = buildOptions.get(BuildConfiguration.Options.class);
     CppOptions cppOptions = buildOptions.get(CppOptions.class);
-    return new CrosstoolConfigurationIdentifier(
-        options.cpu, cppOptions.cppCompiler, cppOptions.glibc);
+    return new CrosstoolConfigurationIdentifier(options.cpu, cppOptions.cppCompiler);
   }
 
   public static CrosstoolConfigurationIdentifier fromToolchain(CToolchain toolchain) {
-    return new CrosstoolConfigurationIdentifier(
-        toolchain.getTargetCpu(), toolchain.getCompiler(), toolchain.getTargetLibc());
+    return new CrosstoolConfigurationIdentifier(toolchain.getTargetCpu(), toolchain.getCompiler());
   }
 
   @Override
@@ -68,22 +62,19 @@
     }
     CrosstoolConfigurationIdentifier otherCrosstool = (CrosstoolConfigurationIdentifier) other;
     return Objects.equals(cpu, otherCrosstool.cpu)
-        && Objects.equals(compiler, otherCrosstool.compiler)
-        && Objects.equals(libc, otherCrosstool.libc);
+        && Objects.equals(compiler, otherCrosstool.compiler);
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(cpu, compiler, libc);
+    return Objects.hash(cpu, compiler);
   }
 
-
   /**
-   * Returns a series of command line flags which specify the configuration options.
-   * Any of these options may be null, in which case its flag is omitted.
+   * Returns a series of command line flags which specify the configuration options. Any of these
+   * options may be null, in which case its flag is omitted.
    *
-   * <p>The appended string will be along the lines of
-   * " --cpu='cpu' --compiler='compiler' --glibc='libc'".
+   * <p>The appended string will be along the lines of " --cpu='cpu' --compiler='compiler'".
    */
   public String describeFlags() {
     StringBuilder message = new StringBuilder();
@@ -93,16 +84,12 @@
     if (getCompiler() != null) {
       message.append(" --compiler='").append(getCompiler()).append("'");
     }
-    if (getLibc() != null) {
-      message.append(" --glibc='").append(getLibc()).append("'");
-    }
     return message.toString();
   }
 
   /** Returns true if the specified toolchain is a candidate for use with this crosstool. */
   public boolean isCandidateToolchain(CToolchain toolchain) {
     return (toolchain.getTargetCpu().equals(getCpu())
-        && (getLibc() == null || toolchain.getTargetLibc().equals(getLibc()))
         && (getCompiler() == null || toolchain.getCompiler().equals(
             getCompiler())));
   }
@@ -121,9 +108,4 @@
   public String getCompiler() {
     return compiler;
   }
-
-  @Override
-  public String getLibc() {
-    return libc;
-  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoader.java
index c1429e1..caed2d3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoader.java
@@ -317,7 +317,7 @@
       boolean convertLipoToThinLto,
       Function<String, String> cpuTransformer)
       throws InvalidConfigurationException {
-    if ((config.getCompiler() != null) || (config.getLibc() != null)) {
+    if (config.getCompiler() != null) {
       ArrayList<CrosstoolConfig.CToolchain> candidateToolchains = new ArrayList<>();
       for (CrosstoolConfig.CToolchain toolchain : release.getToolchainList()) {
         if (config.isCandidateToolchain(toolchain)) {
@@ -396,6 +396,8 @@
     message.append("[\n");
     for (CrosstoolConfig.CToolchain toolchain : toolchains) {
       message.append("  ");
+      message.append(toolchain.getToolchainIdentifier());
+      message.append(": ");
       message.append(
           CrosstoolConfigurationIdentifier.fromToolchain(toolchain).describeFlags().trim());
       message.append(",\n");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationOptions.java
index 46af308..f406d44 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationOptions.java
@@ -26,8 +26,4 @@
   /** Returns the compiler associated with this crosstool configuration. */
   @Nullable
   String getCompiler();
-
-  /** Returns the libc version associated with this crosstool configuration. */
-  @Nullable
-  String getLibc();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java
index 2481612..3a2e636 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java
@@ -77,7 +77,6 @@
     // OSX toolchains always use the runtime of the platform they are targeting (i.e. we do not
     // support custom production environments).
     to.get(CppOptions.class).libcTopLabel = null;
-    to.get(CppOptions.class).glibc = null;
 
     // OSX toolchains do not support fission.
     to.get(CppOptions.class).fissionModes = ImmutableList.of();
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
index 7ba9f8a..9948882 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
@@ -96,7 +96,7 @@
         "      'ppc|compiler': ':cc-compiler-ppc',",
         "    })",
         "cc_toolchain(name = 'cc-compiler-k8', all_files = ':empty', compiler_files = ':empty',",
-        "    cpu = 'k8', compiler = 'compiler', libc = 'local', dwp_files = ':empty',",
+        "    cpu = 'k8', compiler = 'compiler', dwp_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
         "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
@@ -114,7 +114,7 @@
         ")",
         "cc_toolchain(name = 'cc-no-dyn-linker-k8', all_files = ':empty', ",
         "    compiler_files = ':empty', cpu = 'k8', compiler = 'compiler_no_dyn_linker', ",
-        "    libc = 'local', dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
+        "    dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
         "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
         "    objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
@@ -130,7 +130,7 @@
         "    toolchain_type = ':toolchain_type',",
         ")",
         "cc_toolchain(name = 'cc-compiler-ppc', all_files = ':empty', compiler_files = ':empty',",
-        "    cpu = 'ppc', compiler = 'compiler', libc = 'local', dwp_files = ':empty',",
+        "    cpu = 'ppc', compiler = 'compiler', dwp_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
         "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
@@ -148,7 +148,7 @@
         ")",
         "cc_toolchain(name = 'cc-compiler-piii', all_files = ':all-files-piii',",
         "    compiler_files = ':compiler-files-piii',",
-        "    cpu = 'piii', compiler = 'compiler', libc = 'local', dwp_files = ':empty',",
+        "    cpu = 'piii', compiler = 'compiler', dwp_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
         "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
@@ -166,7 +166,7 @@
         ")",
         "cc_toolchain(name = 'cc-compiler-darwin', all_files = ':empty', ",
         "    compiler_files = ':empty',",
-        "    cpu = 'darwin', compiler = 'compiler', libc = 'macosx', dwp_files = ':empty',",
+        "    cpu = 'darwin', compiler = 'compiler', dwp_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
         "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
@@ -184,7 +184,7 @@
         ")",
         "cc_toolchain(name = 'cc-no-dyn-linker-darwin', all_files = ':empty', ",
         "    compiler_files = ':empty',",
-        "    cpu = 'darwin', compiler = 'compiler_no_dyn_linker', libc = 'macosx', " ,
+        "    cpu = 'darwin', compiler = 'compiler_no_dyn_linker', ",
         "    dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
         "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
@@ -202,7 +202,7 @@
         ")",
         "cc_toolchain(name = 'cc-compiler-ios_x86_64', all_files = ':empty', ",
         "    compiler_files = ':empty',",
-        "    cpu = 'ios_x86_64', compiler = 'compiler', libc = 'local', dwp_files = ':empty',",
+        "    cpu = 'ios_x86_64', compiler = 'compiler', dwp_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
         "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
@@ -220,7 +220,7 @@
         ")",
         "cc_toolchain(name = 'cc-compiler-armeabi-v7a', all_files = ':empty', ",
         "    compiler_files = ':empty',",
-        "    cpu = 'armeabi-v7a', compiler = 'compiler', libc = 'armeabi-v7a', ",
+        "    cpu = 'armeabi-v7a', compiler = 'compiler',",
         "    dwp_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
@@ -239,7 +239,7 @@
         ")",
         "cc_toolchain(name = 'cc-compiler-x64_windows', all_files = ':empty', ",
         "    compiler_files = ':empty',",
-        "    cpu = 'x64_windows', compiler = 'windows_msys64', libc = 'local', ",
+        "    cpu = 'x64_windows', compiler = 'windows_msys64',",
         "    dwp_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
@@ -258,7 +258,7 @@
         ")",
         "cc_toolchain(name = 'cc-no-dyn-linker-x64_windows', all_files = ':empty', ",
         "    compiler_files = ':empty',",
-        "    cpu = 'x64_windows', compiler = 'compiler_no_dyn_linker', libc = 'local', ",
+        "    cpu = 'x64_windows', compiler = 'compiler_no_dyn_linker',",
         "    dwp_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'], ",
         "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java b/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java
index 09e8663..ad799b9 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java
@@ -140,7 +140,6 @@
                   addModuleMap ? "    module_map = 'crosstool.cppmap'," : "",
                   "    cpu = '" + arch + "',",
                   "    compiler = 'gcc-4.4.0',",
-                  "    libc = 'glibc-2.3.6-grte',",
                   "    ar_files = 'ar-" + arch + "',",
                   "    as_files = 'as-" + arch + "',",
                   "    compiler_files = 'compile-" + arch + "',",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
index 39a6404..7ea71a4 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
@@ -597,7 +597,6 @@
         create(
             loader,
             "--compiler=compiler-C",
-            "--glibc=target-libc-C",
             "--cpu=piii",
             "--host_cpu=piii",
             "--android_cpu=",
@@ -676,12 +675,11 @@
   }
 
   /**
-   * Tests that we can select a toolchain using a subset of the --compiler and
-   * --glibc flags, as long as they select a unique result. Also tests the error
-   * messages we get when they don't.
+   * Tests that we can select a toolchain using the --compiler flag, as long as it selects a unique
+   * result. Also tests the error messages we get when it doesn't.
    */
   @Test
-  public void testCompilerLibcSearch() throws Exception {
+  public void testToolchainSelection() throws Exception {
     CppConfigurationLoader loader =
         loader(
             // Needs to include \n's; as a single line it hits a parser limitation.
@@ -690,27 +688,46 @@
                 + "default_target_cpu: \"k8\"\n"
                 + "default_toolchain {\n"
                 + "  cpu: \"piii\"\n"
-                + "  toolchain_identifier: \"toolchain-identifier-AA-piii\"\n"
+                + "  toolchain_identifier: \"toolchain-identifier-A-piii\"\n"
                 + "}\n"
                 + "default_toolchain {\n"
                 + "  cpu: \"k8\"\n"
-                + "  toolchain_identifier: \"toolchain-identifier-BB\"\n"
+                + "  toolchain_identifier: \"toolchain-identifier-B\"\n"
                 + "}\n"
                 + "toolchain {\n"
-                + "  toolchain_identifier: \"toolchain-identifier-AA\"\n"
-                + "  host_system_name: \"host-system-name-AA\"\n"
-                + "  target_system_name: \"target-system-name-AA\"\n"
+                + "  toolchain_identifier: \"toolchain-identifier-A\"\n"
+                + "  host_system_name: \"host-system-name-A\"\n"
+                + "  target_system_name: \"target-system-name-A\"\n"
                 + "  target_cpu: \"k8\"\n"
                 + "  target_libc: \"target-libc-A\"\n"
                 + "  compiler: \"compiler-A\"\n"
                 + "  abi_version: \"abi-version-A\"\n"
                 + "  abi_libc_version: \"abi-libc-version-A\"\n"
                 + "}\n"
-                // AA-piii is uniquely determined by libc and compiler.
                 + "toolchain {\n"
-                + "  toolchain_identifier: \"toolchain-identifier-AA-piii\"\n"
-                + "  host_system_name: \"host-system-name-AA\"\n"
-                + "  target_system_name: \"target-system-name-AA\"\n"
+                + "  toolchain_identifier: \"toolchain-identifier-A-duplicate\"\n"
+                + "  host_system_name: \"host-system-name-A\"\n"
+                + "  target_system_name: \"target-system-name-A\"\n"
+                + "  target_cpu: \"k8\"\n"
+                + "  target_libc: \"target-libc-A\"\n"
+                + "  compiler: \"compiler-A\"\n"
+                + "  abi_version: \"abi-version-A\"\n"
+                + "  abi_libc_version: \"abi-libc-version-A\"\n"
+                + "}\n"
+                + "toolchain {\n"
+                + "  toolchain_identifier: \"toolchain-identifier-C\"\n"
+                + "  host_system_name: \"host-system-name-C\"\n"
+                + "  target_system_name: \"target-system-name-C\"\n"
+                + "  target_cpu: \"k8\"\n"
+                + "  target_libc: \"target-libc-C\"\n"
+                + "  compiler: \"compiler-C\"\n"
+                + "  abi_version: \"abi-version-C\"\n"
+                + "  abi_libc_version: \"abi-libc-version-C\"\n"
+                + "}\n"
+                + "toolchain {\n"
+                + "  toolchain_identifier: \"toolchain-identifier-A-piii\"\n"
+                + "  host_system_name: \"host-system-name-A\"\n"
+                + "  target_system_name: \"target-system-name-A\"\n"
                 + "  target_cpu: \"piii\"\n"
                 + "  target_libc: \"target-libc-A\"\n"
                 + "  compiler: \"compiler-A\"\n"
@@ -718,67 +735,39 @@
                 + "  abi_libc_version: \"abi-libc-version-A\"\n"
                 + "}\n"
                 + "toolchain {\n"
-                + "  toolchain_identifier: \"toolchain-identifier-AB\"\n"
-                + "  host_system_name: \"host-system-name-AB\"\n"
-                + "  target_system_name: \"target-system-name-AB\"\n"
+                + "  toolchain_identifier: \"toolchain-identifier-B-piii\"\n"
+                + "  host_system_name: \"host-system-name-A\"\n"
+                + "  target_system_name: \"target-system-name-A\"\n"
+                + "  target_cpu: \"piii\"\n"
+                + "  target_libc: \"target-libc-A\"\n"
+                + "  compiler: \"compiler-B\"\n"
+                + "  abi_version: \"abi-version-A\"\n"
+                + "  abi_libc_version: \"abi-libc-version-A\"\n"
+                + "}\n"
+                + "toolchain {\n"
+                + "  toolchain_identifier: \"toolchain-identifier-B\"\n"
+                + "  host_system_name: \"host-system-name-B\"\n"
+                + "  target_system_name: \"target-system-name-B\"\n"
                 + "  target_cpu: \"k8\"\n"
                 + "  target_libc: \"target-libc-A\"\n"
                 + "  compiler: \"compiler-B\"\n"
                 + "  abi_version: \"abi-version-B\"\n"
                 + "  abi_libc_version: \"abi-libc-version-A\"\n"
-                + "}\n"
-                + "toolchain {\n"
-                + "  toolchain_identifier: \"toolchain-identifier-BA\"\n"
-                + "  host_system_name: \"host-system-name-BA\"\n"
-                + "  target_system_name: \"target-system-name-BA\"\n"
-                + "  target_cpu: \"k8\"\n"
-                + "  target_libc: \"target-libc-B\"\n"
-                + "  compiler: \"compiler-A\"\n"
-                + "  abi_version: \"abi-version-A\"\n"
-                + "  abi_libc_version: \"abi-libc-version-B\"\n"
-                + "}\n"
-                + "toolchain {\n"
-                + "  toolchain_identifier: \"toolchain-identifier-BB\"\n"
-                + "  host_system_name: \"host-system-name-BB\"\n"
-                + "  target_system_name: \"target-system-name-BB\"\n"
-                + "  target_cpu: \"k8\"\n"
-                + "  target_libc: \"target-libc-B\"\n"
-                + "  compiler: \"compiler-B\"\n"
-                + "  abi_version: \"abi-version-B\"\n"
-                + "  abi_libc_version: \"abi-libc-version-B\"\n"
-                + "}\n"
-                + "toolchain {\n"
-                + "  toolchain_identifier: \"toolchain-identifier-BC\"\n"
-                + "  host_system_name: \"host-system-name-BC\"\n"
-                + "  target_system_name: \"target-system-name-BC\"\n"
-                + "  target_cpu: \"k8\"\n"
-                + "  target_libc: \"target-libc-B\"\n"
-                + "  compiler: \"compiler-C\"\n"
-                + "  abi_version: \"abi-version-C\"\n"
-                + "  abi_libc_version: \"abi-libc-version-B\"\n"
                 + "}");
 
     // Uses the default toolchain for k8.
     assertThat(create(loader, "--cpu=k8").getToolchainIdentifier())
-        .isEqualTo("toolchain-identifier-BB");
+        .isEqualTo("toolchain-identifier-B");
     // Does not default to --cpu=k8; if no --cpu flag is present, Bazel defaults to the host cpu!
-    assertThat(
-            create(loader, "--cpu=k8", "--compiler=compiler-A", "--glibc=target-libc-B")
-                .getToolchainIdentifier())
-        .isEqualTo("toolchain-identifier-BA");
+    assertThat(create(loader, "--cpu=k8", "--compiler=compiler-C").getToolchainIdentifier())
+        .isEqualTo("toolchain-identifier-C");
     // Uses the default toolchain for piii.
     assertThat(create(loader, "--cpu=piii").getToolchainIdentifier())
-        .isEqualTo("toolchain-identifier-AA-piii");
+        .isEqualTo("toolchain-identifier-A-piii");
 
-    // We can select the unique piii toolchain with either its compiler or glibc.
-    assertThat(create(loader, "--cpu=piii", "--compiler=compiler-A").getToolchainIdentifier())
-        .isEqualTo("toolchain-identifier-AA-piii");
-    assertThat(create(loader, "--cpu=piii", "--glibc=target-libc-A").getToolchainIdentifier())
-        .isEqualTo("toolchain-identifier-AA-piii");
-
-    // compiler-C uniquely identifies a toolchain, so we can use it.
-    assertThat(create(loader, "--cpu=k8", "--compiler=compiler-C").getToolchainIdentifier())
-        .isEqualTo("toolchain-identifier-BC");
+    // We can select the unique piii toolchain with its compiler.
+    assertThat(create(loader, "--cpu=piii", "--compiler=compiler-B").getToolchainIdentifier())
+        .isEqualTo("toolchain-identifier-B-piii");
 
     try {
       create(loader, "--cpu=k8", "--compiler=nonexistent-compiler");
@@ -788,24 +777,24 @@
           .hasMessage(
               "No toolchain found for --cpu='k8' --compiler='nonexistent-compiler'. "
                   + "Valid toolchains are: [\n"
-                  + "  --cpu='k8' --compiler='compiler-A' --glibc='target-libc-A',\n"
-                  + "  --cpu='piii' --compiler='compiler-A' --glibc='target-libc-A',\n"
-                  + "  --cpu='k8' --compiler='compiler-B' --glibc='target-libc-A',\n"
-                  + "  --cpu='k8' --compiler='compiler-A' --glibc='target-libc-B',\n"
-                  + "  --cpu='k8' --compiler='compiler-B' --glibc='target-libc-B',\n"
-                  + "  --cpu='k8' --compiler='compiler-C' --glibc='target-libc-B',\n"
+                  + "  toolchain-identifier-A: --cpu='k8' --compiler='compiler-A',\n"
+                  + "  toolchain-identifier-A-duplicate: --cpu='k8' --compiler='compiler-A',\n"
+                  + "  toolchain-identifier-C: --cpu='k8' --compiler='compiler-C',\n"
+                  + "  toolchain-identifier-A-piii: --cpu='piii' --compiler='compiler-A',\n"
+                  + "  toolchain-identifier-B-piii: --cpu='piii' --compiler='compiler-B',\n"
+                  + "  toolchain-identifier-B: --cpu='k8' --compiler='compiler-B',\n"
                   + "]");
     }
 
     try {
-      create(loader, "--cpu=k8", "--glibc=target-libc-A");
+      create(loader, "--cpu=k8", "--compiler=compiler-A");
       fail("Expected an error that multiple toolchains matched.");
     } catch (InvalidConfigurationException e) {
       assertThat(e)
           .hasMessage(
-              "Multiple toolchains found for --cpu='k8' --glibc='target-libc-A': [\n"
-                  + "  --cpu='k8' --compiler='compiler-A' --glibc='target-libc-A',\n"
-                  + "  --cpu='k8' --compiler='compiler-B' --glibc='target-libc-A',\n"
+              "Multiple toolchains found for --cpu='k8' --compiler='compiler-A': [\n"
+                  + "  toolchain-identifier-A: --cpu='k8' --compiler='compiler-A',\n"
+                  + "  toolchain-identifier-A-duplicate: --cpu='k8' --compiler='compiler-A',\n"
                   + "]");
     }
   }