skip to Main Content

I’m trying to build a hello_world cc_grpc_library using bazel 6.0.0 on Ubuntu 22.04, but I’m unable to do so.

Source tree:

WORKSPACE
MODULE.bazel
BUILD
helloworld.proto
.bazelrc
.bazelversion

My WORKSPACE file is empty. WORKSPACE.bzlmod does not exist.

MODULE.bazel contains:

module(name = "helloworld", version = "1.0")
bazel_dep(name = "grpc", version = "1.47.0", repo_name = "com_github_grpc_grpc")

BUILD contains:

load("@rules_proto//proto:defs.bzl", "proto_library")
load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps")
load("@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", "cc_grpc_library")

grpc_deps()

grpc_extra_deps()

proto_library(
    name = "helloworld_proto",
    srcs = ["helloworld.proto"],
)

cc_proto_library(
    name = "helloworld_cc_proto",
    deps = [":helloworld_proto"],
)

cc_grpc_library(
    name = "helloworld_cc_grpc",
    srcs = [":helloworld_proto"],
    grpc_only = True,
    deps = [":helloworld_cc_proto"],
)

helloworld.proto is a copy of gRPC’s helloworld.proto

When I type bazel build :helloworld_cc_grpc I get the following error and don’t know how to solve it:

...external/grpc~1.47.0/bazel/grpc_deps.bzl", line 23, column 11, in grpc_bind_deps
                native.bind(
Error: no native function or rule 'bind'
Available attributes: aar_import, action_listener, alias, android_binary, android_device, android_device_script_fixture, android_host_service_fixture, android_instrumentation_test, android_library, android_local_test, android_sdk, android_tools_defaults_jar, apple_cc_toolchain, available_xcodes, cc_binary, cc_host_toolchain_alias, cc_import, cc_libc_top_alias, cc_library, cc_proto_library, cc_shared_library, cc_shared_library_permissions, cc_test, cc_toolchain, cc_toolchain_alias, cc_toolchain_suite, config_feature_flag, config_setting, constraint_setting, constraint_value, environment, existing_rule, existing_rules, exports_files, extra_action, fdo_prefetch_hints, fdo_profile, filegroup, genquery, genrule, glob, j2objc_library, java_binary, java_import, java_library, java_lite_proto_library, java_package_configuration, java_plugin, java_plugins_flag_alias, java_proto_library, java_runtime, java_test, java_toolchain, label_flag, label_setting, objc_import, objc_library, package, package_group, package_name, platform, propeller_optimize, proto_lang_toolchain, proto_library, py_binary, py_library, py_runtime, py_test, repository_name, sh_binary, sh_library, sh_test, subpackages, test_suite, toolchain, toolchain_type, xcode_config, xcode_config_alias, xcode_version

bazel version output:

Bazelisk version: v1.15.0
Build label: 6.0.0
Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Mon Dec 19 15:52:35 2022 (1671465155)
Build timestamp: 1671465155
Build timestamp as int: 1671465155

I’ve also found this gRPC github issue but I’m not sure what to do with it.

How to build gRPC’s hello world example using bzlmod to manage external dependencies?

I’ve tried building it with bazel’s cc_grpc_library but that wraps actual dependency (gRPC) into yet another layer as it is visible from the comment on the provided link. Either way it wasn’t building but I don’t recall actual error.

2

Answers


  1. gRPC doesn’t yet support Bazel module so it can break but in your case, it looks weird to call grpc_deps() and grpc_extra_deps() functions in BUILD file because those are expected to be called in WORKSPACE file. If it turns out that module doesn’t work yet, you may want to use it without module. Please take a look at this example.

    Login or Signup to reply.
  2. This isn’t a great solution, but you can get it working with Bazel 5 (e.g., 5.4.0) and gRPC 1.41.0. It’s quite the version balancing act, because newer versions of either one will cause different errors. Here’s what what MODULE.bazel and WORKSPACE.bazel should look like:

    # MODULE.bazel
    module(name = "helloworld", version = "1.0")
    bazel_dep(name = "rules_proto", version = "4.0.0")
    bazel_dep(
        name = "grpc",
        version = "1.41.0",
        repo_name = "com_github_grpc_grpc")
    
    # WORKSPACE.bazel
    bind(
        name = "protocol_compiler",
        actual = "@com_google_protobuf//:protoc",
    )
    

    The WORKSPACE.bazel part shouldn’t exist in a bzlmod world, so this is definitely a hack that just works.

    Aside from that, your library rules look right. Not sure what grpc_deps() and grpc_extra_deps() are for; they may not be necessary.

    That should be everything. If it still doesn’t work, you could try building my working code and see if the proto build targets and gRPC client & server C++ build targets are different from yours in some subtle way.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search