Wrap proto_lang_toolchain into a macro creating a toolchain

Issue: https://github.com/bazelbuild/rules_proto/issues/179
PiperOrigin-RevId: 566975629
diff --git a/proto/defs.bzl b/proto/defs.bzl
index 3fb566f..80af9f8 100644
--- a/proto/defs.bzl
+++ b/proto/defs.bzl
@@ -14,6 +14,7 @@
 
 """Starlark rules for building protocol buffers."""
 
+load("//proto:proto_lang_toolchain.bzl", _proto_lang_toolchain = "proto_lang_toolchain")
 load("//proto/private:native.bzl", "NativeProtoInfo", "native_proto_common")
 load("//proto/private/rules:proto_descriptor_set.bzl", _proto_descriptor_set = "proto_descriptor_set")
 
@@ -26,18 +27,6 @@
         attrs["tags"] = [_MIGRATION_TAG]
     return attrs
 
-def proto_lang_toolchain(**attrs):
-    """Bazel proto_lang_toolchain rule.
-
-    https://docs.bazel.build/versions/master/be/protocol-buffer.html#proto_lang_toolchain
-
-    Args:
-      **attrs: Rule attributes
-    """
-
-    # buildifier: disable=native-proto
-    native.proto_lang_toolchain(**_add_migration_tag(attrs))
-
 def proto_library(**attrs):
     """Bazel proto_library rule.
 
@@ -52,6 +41,8 @@
 
 proto_descriptor_set = _proto_descriptor_set
 
+proto_lang_toolchain = _proto_lang_toolchain
+
 # Encapsulates information provided by `proto_library`.
 #
 # https://docs.bazel.build/versions/master/skylark/lib/ProtoInfo.html
diff --git a/proto/proto_lang_toolchain.bzl b/proto/proto_lang_toolchain.bzl
new file mode 100644
index 0000000..3ab721a
--- /dev/null
+++ b/proto/proto_lang_toolchain.bzl
@@ -0,0 +1,42 @@
+# Copyright 2019 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.
+"""proto_lang_toolchain rule"""
+
+def proto_lang_toolchain(*, name, toolchain_type = None, exec_compatible_with = [], target_compatible_with = [], **attrs):
+    """Creates a proto_lang_toolchain and corresponding toolchain target.
+
+    Toolchain target is only created when toolchain_type is set.
+
+    https://docs.bazel.build/versions/master/be/protocol-buffer.html#proto_lang_toolchain
+
+    Args:
+
+      name: name of the toolchain
+      toolchain_type: The toolchain type
+      exec_compatible_with: ([constraints]) List of constraints the prebuild binaries is compatible with.
+      target_compatible_with: ([constraints]) List of constraints the target libraries are compatible with.
+      **attrs: Rule attributes
+    """
+
+    # buildifier: disable=native-proto
+    native.proto_lang_toolchain(name = name, **attrs)
+
+    if toolchain_type:
+        native.toolchain(
+            name = name + "_toolchain",
+            toolchain_type = toolchain_type,
+            exec_compatible_with = exec_compatible_with,
+            target_compatible_with = target_compatible_with,
+            toolchain = name,
+        )