mirror of https://github.com/grpc/grpc-web.git
				
				
				
			[bazel] Introduce grpc_web_toolchain
This change adds a new rule `grpc_web_toolchain` which we will use to provide the generator/runtime to `closure_grpc_web_library`. Updates #507 RELNOTES: [bazel] `closure_grpc_web_library` now uses toolchains to resolve the generator and runtime. To migrate, add the following snipped to your `WORKSPACE`: ```starlark load("@com_github_grpc_grpc_web//bazel:repositories.bzl", "grpc_web_toolchains") grpc_web_toolchains() ```
This commit is contained in:
		
							parent
							
								
									9d90faacca
								
							
						
					
					
						commit
						e994bb108b
					
				| 
						 | 
				
			
			@ -34,3 +34,7 @@ load("@io_bazel_rules_closure//closure:repositories.bzl", "rules_closure_depende
 | 
			
		|||
rules_closure_dependencies()
 | 
			
		||||
 | 
			
		||||
rules_closure_toolchains()
 | 
			
		||||
 | 
			
		||||
load("//bazel:repositories.bzl", "grpc_web_toolchains")
 | 
			
		||||
 | 
			
		||||
grpc_web_toolchains()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
## Copyright 2020 Google LLC
 | 
			
		||||
##
 | 
			
		||||
## 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
 | 
			
		||||
##
 | 
			
		||||
##     https://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.
 | 
			
		||||
 | 
			
		||||
load("//bazel:defs.bzl", "grpc_web_toolchain")
 | 
			
		||||
 | 
			
		||||
# The toolchain type used to distinguish proto toolchains.
 | 
			
		||||
toolchain_type(
 | 
			
		||||
    name = "toolchain_type",
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
grpc_web_toolchain(
 | 
			
		||||
    name = "closure_toolchain_impl",
 | 
			
		||||
    generator = "//javascript/net/grpc/web:protoc-gen-grpc-web",
 | 
			
		||||
    runtime_library = "//javascript/net/grpc/web:closure_grpcweb_runtime",
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
toolchain(
 | 
			
		||||
    name = "closure_toolchain",
 | 
			
		||||
    toolchain = ":closure_toolchain_impl",
 | 
			
		||||
    toolchain_type = ":toolchain_type",
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,199 +1,20 @@
 | 
			
		|||
# This rule was inspired by rules_closure`s implementation of
 | 
			
		||||
# |closure_proto_library|, licensed under Apache 2.
 | 
			
		||||
# https://github.com/bazelbuild/rules_closure/blob/3555e5ba61fdcc17157dd833eaf7d19b313b1bca/closure/protobuf/closure_proto_library.bzl
 | 
			
		||||
## Copyright 2020 Google LLC
 | 
			
		||||
##
 | 
			
		||||
## 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
 | 
			
		||||
##
 | 
			
		||||
##     https://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.
 | 
			
		||||
 | 
			
		||||
"""Starlark rules for using gRPC-Web with Bazel and `rules_closure`."""
 | 
			
		||||
"""Compatibility-export for `closure_grpc_web_library`."""
 | 
			
		||||
 | 
			
		||||
load("@io_bazel_rules_closure//closure/compiler:closure_js_library.bzl", "create_closure_js_library")
 | 
			
		||||
load("@io_bazel_rules_closure//closure/private:defs.bzl", "CLOSURE_JS_TOOLCHAIN_ATTRS", "unfurl")  # buildifier: disable=bzl-visibility
 | 
			
		||||
load("@io_bazel_rules_closure//closure/protobuf:closure_proto_library.bzl", "closure_proto_aspect")
 | 
			
		||||
load("@rules_proto//proto:defs.bzl", "ProtoInfo")
 | 
			
		||||
load("//bazel/private/rules:closure_grpc_web_library.bzl", _closure_grpc_web_library = "closure_grpc_web_library")
 | 
			
		||||
 | 
			
		||||
# This was borrowed from Rules Go, licensed under Apache 2.
 | 
			
		||||
# https://github.com/bazelbuild/rules_go/blob/67f44035d84a352cffb9465159e199066ecb814c/proto/compiler.bzl#L72
 | 
			
		||||
def _proto_path(proto):
 | 
			
		||||
    path = proto.path
 | 
			
		||||
    root = proto.root.path
 | 
			
		||||
    ws = proto.owner.workspace_root
 | 
			
		||||
    if path.startswith(root):
 | 
			
		||||
        path = path[len(root):]
 | 
			
		||||
    if path.startswith("/"):
 | 
			
		||||
        path = path[1:]
 | 
			
		||||
    if path.startswith(ws):
 | 
			
		||||
        path = path[len(ws):]
 | 
			
		||||
    if path.startswith("/"):
 | 
			
		||||
        path = path[1:]
 | 
			
		||||
    return path
 | 
			
		||||
 | 
			
		||||
def _proto_include_path(proto):
 | 
			
		||||
    path = proto.path[:-len(_proto_path(proto))]
 | 
			
		||||
    if not path:
 | 
			
		||||
        return "."
 | 
			
		||||
    if path.endswith("/"):
 | 
			
		||||
        path = path[:-1]
 | 
			
		||||
    return path
 | 
			
		||||
 | 
			
		||||
def _proto_include_paths(protos):
 | 
			
		||||
    return [_proto_include_path(proto) for proto in protos]
 | 
			
		||||
 | 
			
		||||
def _generate_closure_grpc_web_src_progress_message(proto):
 | 
			
		||||
    # TODO(yannic): Add a better message?
 | 
			
		||||
    return "Generating GRPC Web for %s" % proto
 | 
			
		||||
 | 
			
		||||
def _assert(condition, message):
 | 
			
		||||
    if not condition:
 | 
			
		||||
        fail(message)
 | 
			
		||||
 | 
			
		||||
def _generate_closure_grpc_web_srcs(
 | 
			
		||||
        label,
 | 
			
		||||
        actions,
 | 
			
		||||
        protoc,
 | 
			
		||||
        protoc_gen_grpc_web,
 | 
			
		||||
        import_style,
 | 
			
		||||
        mode,
 | 
			
		||||
        sources,
 | 
			
		||||
        transitive_sources):
 | 
			
		||||
    args = actions.args()
 | 
			
		||||
 | 
			
		||||
    args.add("--plugin", "protoc-gen-grpc-web=" + protoc_gen_grpc_web.path)
 | 
			
		||||
 | 
			
		||||
    args.add_all(_proto_include_paths(transitive_sources.to_list()), format_each = "-I%s")
 | 
			
		||||
 | 
			
		||||
    args.add("--grpc-web_opt", "mode=" + mode)
 | 
			
		||||
    if "es6" == import_style:
 | 
			
		||||
        args.add("--grpc-web_opt", "import_style=experimental_closure_es6")
 | 
			
		||||
    else:
 | 
			
		||||
        args.add("--grpc-web_opt", "import_style=" + import_style)
 | 
			
		||||
 | 
			
		||||
    root = None
 | 
			
		||||
 | 
			
		||||
    files = []
 | 
			
		||||
    es6_files = []
 | 
			
		||||
    for src in sources:
 | 
			
		||||
        basename = src.basename[:-(len(src.extension) + 1)]
 | 
			
		||||
 | 
			
		||||
        js = actions.declare_file(basename + "_grpc_web_pb.js", sibling = src)
 | 
			
		||||
        files.append(js)
 | 
			
		||||
 | 
			
		||||
        _assert(
 | 
			
		||||
            ((root == None) or (root == js.root.path)),
 | 
			
		||||
            "proto sources do not have the same root: '{}' != '{}'".format(root, js.root.path),
 | 
			
		||||
        )
 | 
			
		||||
        root = js.root.path
 | 
			
		||||
 | 
			
		||||
        if "es6" == import_style:
 | 
			
		||||
            es6 = actions.declare_file(basename + ".pb.grpc-web.js", sibling = src)
 | 
			
		||||
            es6_files.append(es6)
 | 
			
		||||
 | 
			
		||||
            _assert(root == es6.root.path, "ES6 file should have same root: '{}' != '{}'".format(root, es6.root.path))
 | 
			
		||||
 | 
			
		||||
    _assert(root, "At least one source file is required")
 | 
			
		||||
 | 
			
		||||
    args.add("--grpc-web_out", root)
 | 
			
		||||
    args.add_all(sources)
 | 
			
		||||
 | 
			
		||||
    actions.run(
 | 
			
		||||
        tools = [protoc_gen_grpc_web],
 | 
			
		||||
        inputs = transitive_sources,
 | 
			
		||||
        outputs = files + es6_files,
 | 
			
		||||
        executable = protoc,
 | 
			
		||||
        arguments = [args],
 | 
			
		||||
        progress_message =
 | 
			
		||||
            _generate_closure_grpc_web_src_progress_message(str(label)),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    return files, es6_files
 | 
			
		||||
 | 
			
		||||
_error_multiple_deps = "".join([
 | 
			
		||||
    "'deps' attribute must contain exactly one label ",
 | 
			
		||||
    "(we didn't name it 'dep' for consistency). ",
 | 
			
		||||
    "We may revisit this restriction later.",
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
def _closure_grpc_web_library_impl(ctx):
 | 
			
		||||
    if len(ctx.attr.deps) > 1:
 | 
			
		||||
        # TODO(yannic): Revisit this restriction.
 | 
			
		||||
        fail(_error_multiple_deps, "deps")
 | 
			
		||||
 | 
			
		||||
    proto_info = ctx.attr.deps[0][ProtoInfo]
 | 
			
		||||
    srcs, es6_srcs = _generate_closure_grpc_web_srcs(
 | 
			
		||||
        label = ctx.label,
 | 
			
		||||
        actions = ctx.actions,
 | 
			
		||||
        protoc = ctx.executable._protoc,
 | 
			
		||||
        protoc_gen_grpc_web = ctx.executable._protoc_gen_grpc_web,
 | 
			
		||||
        import_style = ctx.attr.import_style,
 | 
			
		||||
        mode = ctx.attr.mode,
 | 
			
		||||
        sources = proto_info.direct_sources,
 | 
			
		||||
        transitive_sources = proto_info.transitive_imports,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    deps = unfurl(ctx.attr.deps, provider = "closure_js_library")
 | 
			
		||||
    deps.append(ctx.attr._runtime)
 | 
			
		||||
    library = create_closure_js_library(
 | 
			
		||||
        ctx = ctx,
 | 
			
		||||
        srcs = srcs + es6_srcs,
 | 
			
		||||
        deps = deps,
 | 
			
		||||
        suppress = [
 | 
			
		||||
            "misplacedTypeAnnotation",
 | 
			
		||||
            "unusedPrivateMembers",
 | 
			
		||||
            "reportUnknownTypes",
 | 
			
		||||
            "strictDependencies",
 | 
			
		||||
            "extraRequire",
 | 
			
		||||
        ],
 | 
			
		||||
        lenient = False,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    # `rules_closure` still uses the legacy provider syntax.
 | 
			
		||||
    # buildifier: disable=rule-impl-return
 | 
			
		||||
    return struct(
 | 
			
		||||
        exports = library.exports,
 | 
			
		||||
        closure_js_library = library.closure_js_library,
 | 
			
		||||
        # The usual suspects are exported as runfiles, in addition to raw source.
 | 
			
		||||
        runfiles = ctx.runfiles(files = srcs),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
closure_grpc_web_library = rule(
 | 
			
		||||
    implementation = _closure_grpc_web_library_impl,
 | 
			
		||||
    attrs = dict({
 | 
			
		||||
        "deps": attr.label_list(
 | 
			
		||||
            mandatory = True,
 | 
			
		||||
            providers = [ProtoInfo, "closure_js_library"],
 | 
			
		||||
            # The files generated by this aspect are required dependencies.
 | 
			
		||||
            aspects = [closure_proto_aspect],
 | 
			
		||||
        ),
 | 
			
		||||
        "import_style": attr.string(
 | 
			
		||||
            default = "closure",
 | 
			
		||||
            values = [
 | 
			
		||||
                "closure",
 | 
			
		||||
 | 
			
		||||
                # This is experimental and requires closure-js.
 | 
			
		||||
                # We reserve the right to do breaking changes at any time.
 | 
			
		||||
                "es6",
 | 
			
		||||
            ],
 | 
			
		||||
        ),
 | 
			
		||||
        "mode": attr.string(
 | 
			
		||||
            default = "grpcwebtext",
 | 
			
		||||
            values = ["grpcwebtext", "grpcweb"],
 | 
			
		||||
        ),
 | 
			
		||||
 | 
			
		||||
        # Internal only.
 | 
			
		||||
 | 
			
		||||
        # TODO(yannic): Switch to using `proto_toolchain` after
 | 
			
		||||
        # https://github.com/bazelbuild/rules_proto/pull/25 lands.
 | 
			
		||||
        "_protoc": attr.label(
 | 
			
		||||
            default = Label("@com_google_protobuf//:protoc"),
 | 
			
		||||
            executable = True,
 | 
			
		||||
            cfg = "host",
 | 
			
		||||
        ),
 | 
			
		||||
 | 
			
		||||
        # TODO(yannic): Create `grpc_web_toolchain`.
 | 
			
		||||
        "_protoc_gen_grpc_web": attr.label(
 | 
			
		||||
            default = Label("//javascript/net/grpc/web:protoc-gen-grpc-web"),
 | 
			
		||||
            executable = True,
 | 
			
		||||
            cfg = "host",
 | 
			
		||||
        ),
 | 
			
		||||
        "_runtime": attr.label(
 | 
			
		||||
            default = Label("//javascript/net/grpc/web:closure_grpcweb_runtime"),
 | 
			
		||||
        ),
 | 
			
		||||
    }, **CLOSURE_JS_TOOLCHAIN_ATTRS),
 | 
			
		||||
)
 | 
			
		||||
# TODO(yannic): Deprecate and remove.
 | 
			
		||||
closure_grpc_web_library = _closure_grpc_web_library
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
## Copyright 2020 Google LLC
 | 
			
		||||
##
 | 
			
		||||
## 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
 | 
			
		||||
##
 | 
			
		||||
##     https://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.
 | 
			
		||||
 | 
			
		||||
"""Starlark rules for using gRPC-Web."""
 | 
			
		||||
 | 
			
		||||
load("//bazel/private/rules:closure_grpc_web_library.bzl", _closure_grpc_web_library = "closure_grpc_web_library")
 | 
			
		||||
load("//bazel/private/rules:grpc_web_toolchain.bzl", _grpc_web_toolchain = "grpc_web_toolchain")
 | 
			
		||||
 | 
			
		||||
closure_grpc_web_library = _closure_grpc_web_library
 | 
			
		||||
grpc_web_toolchain = _grpc_web_toolchain
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
# Intentionally left empty (for now).
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,197 @@
 | 
			
		|||
# This rule was inspired by rules_closure`s implementation of
 | 
			
		||||
# |closure_proto_library|, licensed under Apache 2.
 | 
			
		||||
# https://github.com/bazelbuild/rules_closure/blob/3555e5ba61fdcc17157dd833eaf7d19b313b1bca/closure/protobuf/closure_proto_library.bzl
 | 
			
		||||
 | 
			
		||||
"""Starlark rules for using gRPC-Web with Bazel and `rules_closure`."""
 | 
			
		||||
 | 
			
		||||
load("@io_bazel_rules_closure//closure/compiler:closure_js_library.bzl", "create_closure_js_library")
 | 
			
		||||
load("@io_bazel_rules_closure//closure/private:defs.bzl", "CLOSURE_JS_TOOLCHAIN_ATTRS", "unfurl")  # buildifier: disable=bzl-visibility
 | 
			
		||||
load("@io_bazel_rules_closure//closure/protobuf:closure_proto_library.bzl", "closure_proto_aspect")
 | 
			
		||||
load("@rules_proto//proto:defs.bzl", "ProtoInfo")
 | 
			
		||||
 | 
			
		||||
# This was borrowed from Rules Go, licensed under Apache 2.
 | 
			
		||||
# https://github.com/bazelbuild/rules_go/blob/67f44035d84a352cffb9465159e199066ecb814c/proto/compiler.bzl#L72
 | 
			
		||||
def _proto_path(proto):
 | 
			
		||||
    path = proto.path
 | 
			
		||||
    root = proto.root.path
 | 
			
		||||
    ws = proto.owner.workspace_root
 | 
			
		||||
    if path.startswith(root):
 | 
			
		||||
        path = path[len(root):]
 | 
			
		||||
    if path.startswith("/"):
 | 
			
		||||
        path = path[1:]
 | 
			
		||||
    if path.startswith(ws):
 | 
			
		||||
        path = path[len(ws):]
 | 
			
		||||
    if path.startswith("/"):
 | 
			
		||||
        path = path[1:]
 | 
			
		||||
    return path
 | 
			
		||||
 | 
			
		||||
def _proto_include_path(proto):
 | 
			
		||||
    path = proto.path[:-len(_proto_path(proto))]
 | 
			
		||||
    if not path:
 | 
			
		||||
        return "."
 | 
			
		||||
    if path.endswith("/"):
 | 
			
		||||
        path = path[:-1]
 | 
			
		||||
    return path
 | 
			
		||||
 | 
			
		||||
def _proto_include_paths(protos):
 | 
			
		||||
    return [_proto_include_path(proto) for proto in protos]
 | 
			
		||||
 | 
			
		||||
def _generate_closure_grpc_web_src_progress_message(proto):
 | 
			
		||||
    # TODO(yannic): Add a better message?
 | 
			
		||||
    return "Generating GRPC Web for %s" % proto
 | 
			
		||||
 | 
			
		||||
def _assert(condition, message):
 | 
			
		||||
    if not condition:
 | 
			
		||||
        fail(message)
 | 
			
		||||
 | 
			
		||||
def _generate_closure_grpc_web_srcs(
 | 
			
		||||
        label,
 | 
			
		||||
        actions,
 | 
			
		||||
        protoc,
 | 
			
		||||
        protoc_gen_grpc_web,
 | 
			
		||||
        import_style,
 | 
			
		||||
        mode,
 | 
			
		||||
        sources,
 | 
			
		||||
        transitive_sources):
 | 
			
		||||
    args = actions.args()
 | 
			
		||||
 | 
			
		||||
    args.add("--plugin", "protoc-gen-grpc-web=" + protoc_gen_grpc_web.executable.path)
 | 
			
		||||
 | 
			
		||||
    args.add_all(_proto_include_paths(transitive_sources.to_list()), format_each = "-I%s")
 | 
			
		||||
 | 
			
		||||
    args.add("--grpc-web_opt", "mode=" + mode)
 | 
			
		||||
    if "es6" == import_style:
 | 
			
		||||
        args.add("--grpc-web_opt", "import_style=experimental_closure_es6")
 | 
			
		||||
    else:
 | 
			
		||||
        args.add("--grpc-web_opt", "import_style=" + import_style)
 | 
			
		||||
 | 
			
		||||
    root = None
 | 
			
		||||
 | 
			
		||||
    files = []
 | 
			
		||||
    es6_files = []
 | 
			
		||||
    for src in sources:
 | 
			
		||||
        basename = src.basename[:-(len(src.extension) + 1)]
 | 
			
		||||
 | 
			
		||||
        js = actions.declare_file(basename + "_grpc_web_pb.js", sibling = src)
 | 
			
		||||
        files.append(js)
 | 
			
		||||
 | 
			
		||||
        _assert(
 | 
			
		||||
            ((root == None) or (root == js.root.path)),
 | 
			
		||||
            "proto sources do not have the same root: '{}' != '{}'".format(root, js.root.path),
 | 
			
		||||
        )
 | 
			
		||||
        root = js.root.path
 | 
			
		||||
 | 
			
		||||
        if "es6" == import_style:
 | 
			
		||||
            es6 = actions.declare_file(basename + ".pb.grpc-web.js", sibling = src)
 | 
			
		||||
            es6_files.append(es6)
 | 
			
		||||
 | 
			
		||||
            _assert(root == es6.root.path, "ES6 file should have same root: '{}' != '{}'".format(root, es6.root.path))
 | 
			
		||||
 | 
			
		||||
    _assert(root, "At least one source file is required")
 | 
			
		||||
 | 
			
		||||
    args.add("--grpc-web_out", root)
 | 
			
		||||
    args.add_all(sources)
 | 
			
		||||
 | 
			
		||||
    actions.run(
 | 
			
		||||
        tools = [protoc_gen_grpc_web],
 | 
			
		||||
        inputs = transitive_sources,
 | 
			
		||||
        outputs = files + es6_files,
 | 
			
		||||
        executable = protoc,
 | 
			
		||||
        arguments = [args],
 | 
			
		||||
        progress_message =
 | 
			
		||||
            _generate_closure_grpc_web_src_progress_message(str(label)),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    return files, es6_files
 | 
			
		||||
 | 
			
		||||
_error_multiple_deps = "".join([
 | 
			
		||||
    "'deps' attribute must contain exactly one label ",
 | 
			
		||||
    "(we didn't name it 'dep' for consistency). ",
 | 
			
		||||
    "We may revisit this restriction later.",
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
def _closure_grpc_web_library_impl(ctx):
 | 
			
		||||
    if len(ctx.attr.deps) > 1:
 | 
			
		||||
        # TODO(yannic): Revisit this restriction.
 | 
			
		||||
        fail(_error_multiple_deps, "deps")
 | 
			
		||||
 | 
			
		||||
    grpc_web_toolchain = ctx.toolchains["@com_github_grpc_grpc_web//bazel:toolchain_type"]
 | 
			
		||||
 | 
			
		||||
    proto_info = ctx.attr.deps[0][ProtoInfo]
 | 
			
		||||
    srcs, es6_srcs = _generate_closure_grpc_web_srcs(
 | 
			
		||||
        label = ctx.label,
 | 
			
		||||
        actions = ctx.actions,
 | 
			
		||||
        protoc = ctx.executable._protoc,
 | 
			
		||||
        protoc_gen_grpc_web = grpc_web_toolchain.generator,
 | 
			
		||||
        import_style = ctx.attr.import_style,
 | 
			
		||||
        mode = ctx.attr.mode,
 | 
			
		||||
        sources = proto_info.direct_sources,
 | 
			
		||||
        transitive_sources = proto_info.transitive_imports,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    deps = unfurl(ctx.attr.deps, provider = "closure_js_library")
 | 
			
		||||
    deps.append(grpc_web_toolchain.runtime_library)
 | 
			
		||||
    library = create_closure_js_library(
 | 
			
		||||
        ctx = ctx,
 | 
			
		||||
        srcs = srcs + es6_srcs,
 | 
			
		||||
        deps = deps,
 | 
			
		||||
        suppress = [
 | 
			
		||||
            "misplacedTypeAnnotation",
 | 
			
		||||
            "unusedPrivateMembers",
 | 
			
		||||
            "reportUnknownTypes",
 | 
			
		||||
            "strictDependencies",
 | 
			
		||||
            "extraRequire",
 | 
			
		||||
        ],
 | 
			
		||||
        lenient = False,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    # `rules_closure` still uses the legacy provider syntax.
 | 
			
		||||
    # buildifier: disable=rule-impl-return
 | 
			
		||||
    return struct(
 | 
			
		||||
        exports = library.exports,
 | 
			
		||||
        closure_js_library = library.closure_js_library,
 | 
			
		||||
        # The usual suspects are exported as runfiles, in addition to raw source.
 | 
			
		||||
        runfiles = ctx.runfiles(files = srcs),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
closure_grpc_web_library = rule(
 | 
			
		||||
    implementation = _closure_grpc_web_library_impl,
 | 
			
		||||
    attrs = dict({
 | 
			
		||||
        "deps": attr.label_list(
 | 
			
		||||
            mandatory = True,
 | 
			
		||||
            providers = [ProtoInfo, "closure_js_library"],
 | 
			
		||||
            # The files generated by this aspect are required dependencies.
 | 
			
		||||
            aspects = [closure_proto_aspect],
 | 
			
		||||
        ),
 | 
			
		||||
        "import_style": attr.string(
 | 
			
		||||
            default = "closure",
 | 
			
		||||
            values = [
 | 
			
		||||
                "closure",
 | 
			
		||||
 | 
			
		||||
                # This is experimental and requires closure-js.
 | 
			
		||||
                # We reserve the right to do breaking changes at any time.
 | 
			
		||||
                "es6",
 | 
			
		||||
            ],
 | 
			
		||||
        ),
 | 
			
		||||
        "mode": attr.string(
 | 
			
		||||
            default = "grpcwebtext",
 | 
			
		||||
            values = ["grpcwebtext", "grpcweb"],
 | 
			
		||||
        ),
 | 
			
		||||
 | 
			
		||||
        # Internal only.
 | 
			
		||||
 | 
			
		||||
        # TODO(yannic): Switch to using `proto_toolchain` after
 | 
			
		||||
        # https://github.com/bazelbuild/rules_proto/pull/25 lands.
 | 
			
		||||
        "_protoc": attr.label(
 | 
			
		||||
            default = Label("@com_google_protobuf//:protoc"),
 | 
			
		||||
            executable = True,
 | 
			
		||||
            cfg = "host",
 | 
			
		||||
        ),
 | 
			
		||||
    }, **CLOSURE_JS_TOOLCHAIN_ATTRS),
 | 
			
		||||
    toolchains = [
 | 
			
		||||
        "@com_github_grpc_grpc_web//bazel:toolchain_type",
 | 
			
		||||
    ],
 | 
			
		||||
    # TODO(yannic): Remove after `--incompatible_override_toolchain_transition` is flipped.
 | 
			
		||||
    # https://github.com/bazelbuild/bazel/issues/11584
 | 
			
		||||
    incompatible_use_toolchain_transition = True,
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
## Copyright 2020 Google LLC
 | 
			
		||||
##
 | 
			
		||||
## 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
 | 
			
		||||
##
 | 
			
		||||
##     https://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.
 | 
			
		||||
 | 
			
		||||
"""Contains the definition of `grpc_web_toolchain`."""
 | 
			
		||||
 | 
			
		||||
def _grpc_web_toolchain_impl(ctx):
 | 
			
		||||
    return [
 | 
			
		||||
        platform_common.ToolchainInfo(
 | 
			
		||||
            generator = ctx.attr.generator.files_to_run,
 | 
			
		||||
            runtime_library = ctx.attr.runtime_library,
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
grpc_web_toolchain = rule(
 | 
			
		||||
    implementation = _grpc_web_toolchain_impl,
 | 
			
		||||
    attrs = {
 | 
			
		||||
        "generator": attr.label(
 | 
			
		||||
            mandatory = True,
 | 
			
		||||
            executable = True,
 | 
			
		||||
            cfg = "exec",
 | 
			
		||||
        ),
 | 
			
		||||
        "runtime_library": attr.label(
 | 
			
		||||
            mandatory = False,
 | 
			
		||||
            cfg = "target",
 | 
			
		||||
            providers = ["closure_js_library"],
 | 
			
		||||
        ),
 | 
			
		||||
    },
 | 
			
		||||
    provides = [
 | 
			
		||||
        platform_common.ToolchainInfo,
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
## Copyright 2020 Google LLC
 | 
			
		||||
##
 | 
			
		||||
## 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
 | 
			
		||||
##
 | 
			
		||||
##     https://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.
 | 
			
		||||
 | 
			
		||||
"""To be documented."""
 | 
			
		||||
 | 
			
		||||
def grpc_web_dependencies():
 | 
			
		||||
    """An utility method to load all dependencies of `gRPC-Web`."""
 | 
			
		||||
 | 
			
		||||
    fail("Loading dependencies through grpc_web_dependencies() is not supported yet.")
 | 
			
		||||
 | 
			
		||||
def grpc_web_toolchains():
 | 
			
		||||
    """An utility method to load all gRPC-Web toolchains."""
 | 
			
		||||
 | 
			
		||||
    native.register_toolchains(
 | 
			
		||||
        "//bazel:closure_toolchain",
 | 
			
		||||
    )
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_binary")
 | 
			
		||||
load("@rules_proto//proto:defs.bzl", "proto_library")
 | 
			
		||||
load("//bazel:closure_grpc_web_library.bzl", "closure_grpc_web_library")
 | 
			
		||||
load("//bazel:defs.bzl", "closure_grpc_web_library")
 | 
			
		||||
 | 
			
		||||
proto_library(
 | 
			
		||||
    name = "echo_proto",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue