Introduce empty "toolchain_category" rule for labels that will be used as
categories of toolchains for the purpose of toolchain selection.

Up to now, we've used the native toolchain_type rule for this purpose.  That rule depends on a number of configuration fragments that supply build variables - we don't want toolchains to need to depend on those fragments as well.  E.g. toolchain_type depends on JvmConfiguration, but we would like toolchains to work with --experimental_disable_jvm.

PiperOrigin-RevId: 168577759
diff --git a/src/create_embedded_tools.py b/src/create_embedded_tools.py
index 699edd0..8b013ce 100644
--- a/src/create_embedded_tools.py
+++ b/src/create_embedded_tools.py
@@ -31,6 +31,8 @@
     ('*tools/jdk/BUILD*', lambda x: 'tools/jdk/BUILD'),
     ('*tools/platforms/platforms.BUILD', lambda x: 'platforms/BUILD'),
     ('*tools/platforms/*', lambda x: 'platforms/' + os.path.basename(x)),
+    ('*tools/build_defs/toolchains/*',
+     lambda x: 'tools/build_defs/toolchains/' + os.path.basename(x)),
     ('*JavaBuilder*_deploy.jar', lambda x: 'tools/jdk/' + os.path.basename(x)),
     ('*JacocoCoverage*_deploy.jar',
      lambda x: 'tools/jdk/JacocoCoverage_deploy.jar'),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index 87f43cc..5273d32 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -89,7 +89,7 @@
 
   /** Returns label used to select resolved cc_toolchain instances based on platform. */
   public static Label getCcToolchainType(String toolsRepository) {
-    return Label.parseAbsoluteUnchecked(toolsRepository + "//tools/cpp:toolchain_type");
+    return Label.parseAbsoluteUnchecked(toolsRepository + "//tools/cpp:toolchain_category");
   }
 
   private CppHelper() {
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 b938e5f..2cf84b6 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
@@ -78,6 +78,7 @@
         "/bazel_tools_workspace/tools/cpp/BUILD",
         "package(default_visibility=['//visibility:public'])",
         "cc_library(name = 'stl')",
+        "toolchain_type(name = 'toolchain_type')",
         "cc_library(name = 'malloc')",
         "cc_toolchain_suite(",
         "    name = 'toolchain',",
@@ -145,16 +146,17 @@
         "    name = 'link_dynamic_library',",
         "    srcs = ['link_dynamic_library.sh'],",
         ")",
-        "toolchain_type(name = 'toolchain_type')",
+        "load('//tools/build_defs/toolchains:toolchain_category.bzl', 'toolchain_category')",
+        "toolchain_category(name = 'toolchain_category')",
         "toolchain(",
         "   name = 'toolchain_cc-compiler-piii',",
-        "   toolchain_type = ':toolchain_type',",
+        "   toolchain_type = ':toolchain_category',",
         "   toolchain = '//third_party/crosstool/mock:cc-compiler-piii',",
         "   target_compatible_with = [':mock_value'],",
         ")",
         "toolchain(",
         "   name = 'dummy_cc_toolchain',",
-        "   toolchain_type = ':toolchain_type',",
+        "   toolchain_type = ':toolchain_category',",
         "   toolchain = ':dummy_cc_toolchain_impl',",
         ")",
         "load(':dummy_toolchain.bzl', 'dummy_toolchain')",
@@ -165,6 +167,12 @@
         "   toolchain = platform_common.ToolchainInfo()",
         "   return [toolchain]",
         "dummy_toolchain = rule(_dummy_toolchain_impl, attrs = {})");
+    config.create("/bazel_tools_workspace/tools/build_defs/toolchains/BUILD");
+    config.create(
+        "/bazel_tools_workspace/tools/build_defs/toolchains/toolchain_category.bzl",
+        "def _toolchain_category_impl(ctx):",
+        "   ctx = ctx",
+        "toolchain_category = rule(_toolchain_category_impl, attrs = {})");
     config.create(
         "/bazel_tools_workspace/tools/cpp/CROSSTOOL",
         readCrosstoolFile());
diff --git a/tools/BUILD b/tools/BUILD
index 0432b12..bbf75a3 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -15,6 +15,7 @@
         "//tools/build_defs/hash:srcs",
         "//tools/build_defs/pkg:srcs",
         "//tools/build_defs/repo:srcs",
+        "//tools/build_defs/toolchains:srcs",
         "//tools/build_rules:srcs",
         "//tools/coverage:srcs",
         "//tools/jdk:srcs",
@@ -42,6 +43,7 @@
         "//tools/build_defs/hash:srcs",
         "//tools/build_defs/pkg:srcs",
         "//tools/build_defs/repo:srcs",
+        "//tools/build_defs/toolchains:srcs",
         "//tools/build_rules:embedded_tools_srcs",
         "//tools/buildstamp:srcs",
         "//tools/coverage:srcs",
diff --git a/tools/build_defs/toolchains/BUILD b/tools/build_defs/toolchains/BUILD
new file mode 100644
index 0000000..92d6ec8
--- /dev/null
+++ b/tools/build_defs/toolchains/BUILD
@@ -0,0 +1,14 @@
+# Rules for defining toolchains.
+
+licenses(["notice"])  # Apache 2.0
+
+package(default_visibility = ["//visibility:public"])
+
+exports_files(
+    glob(["**"]),
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["**"]),
+)
diff --git a/tools/build_defs/toolchains/toolchain_category.bzl b/tools/build_defs/toolchains/toolchain_category.bzl
new file mode 100644
index 0000000..4520128
--- /dev/null
+++ b/tools/build_defs/toolchains/toolchain_category.bzl
@@ -0,0 +1,25 @@
+# pylint: disable=g-bad-file-header
+# Copyright 2017 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Skylark rule to be used for toolchain "types".
+
+Blaze will allow a toolchain category to be any label, but we use an
+empty rule in particular in order to add behavior if the need arises.
+"""
+def _toolchain_category_impl(ctx):
+  ctx = ctx  # unused argument
+
+toolchain_category = rule(_toolchain_category_impl, attrs = {})
+
+
diff --git a/tools/cpp/BUILD b/tools/cpp/BUILD
index eb75333..d8ed66b 100644
--- a/tools/cpp/BUILD
+++ b/tools/cpp/BUILD
@@ -205,7 +205,10 @@
     srcs = ["link_dynamic_library.sh"],
 )
 
-toolchain_type(name = "toolchain_type")
+# The c++ toolchain type
+load("//tools/build_defs/toolchains:toolchain_category.bzl", "toolchain_category")
+
+toolchain_category(name = "toolchain_category")
 
 # A dummy toolchain is necessary to satisfy toolchain resolution until platforms
 # are used in c++ by default.
@@ -213,7 +216,7 @@
 toolchain(
     name = "dummy_cc_toolchain",
     toolchain = "dummy_cc_toolchain_impl",
-    toolchain_type = ":toolchain_type",
+    toolchain_type = ":toolchain_category",
 )
 
 load(":dummy_toolchain.bzl", "dummy_toolchain")
diff --git a/tools/cpp/BUILD.static b/tools/cpp/BUILD.static
index aaadc5b..d948039 100644
--- a/tools/cpp/BUILD.static
+++ b/tools/cpp/BUILD.static
@@ -116,7 +116,9 @@
     srcs = ["link_dynamic_library.sh"],
 )
 
-toolchain_type(name = "toolchain_type")
+# The c++ toolchain type
+load("//tools/build_defs/toolchains:toolchain_category.bzl", "toolchain_category")
+toolchain_category(name = "toolchain_category")
 
 # A dummy toolchain is necessary to satisfy toolchain resolution until platforms
 # are used in c++ by default.
@@ -124,7 +126,7 @@
 toolchain(
     name = "dummy_cc_toolchain",
     toolchain = "dummy_cc_toolchain_impl",
-    toolchain_type = ":toolchain_type",
+    toolchain_type = ":toolchain_category",
 )
 
 load(":dummy_toolchain.bzl", "dummy_toolchain")
diff --git a/tools/cpp/BUILD.tpl b/tools/cpp/BUILD.tpl
index 170fe3f..d1e81b2 100644
--- a/tools/cpp/BUILD.tpl
+++ b/tools/cpp/BUILD.tpl
@@ -76,7 +76,9 @@
     supports_param_files = 1,
 )
 
-toolchain_type(name = "toolchain_type")
+# The c++ toolchain type
+load("//tools/build_rules:toolchain_category.bzl", "toolchain_category")
+toolchain_category(name = "toolchain_category")
 
 # A dummy toolchain is necessary to satisfy toolchain resolution until platforms
 # are used in c++ by default.
@@ -84,7 +86,7 @@
 toolchain(
     name = "dummy_cc_toolchain",
     toolchain = "dummy_cc_toolchain_impl",
-    toolchain_type = ":toolchain_type",
+    toolchain_type = ":toolchain_category",
 )
 
 load(":dummy_toolchain.bzl", "dummy_toolchain")