# This BUILD file shows how to use protobuf with bazel. Before you can use # proto_library/_proto_library rules in a BUILD file, you need to # include protobuf repo as remote repositories in your WORKSPACE file. See # the WORKSPACE file in the same directory with this BUILD file for an # example. load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@protobuf//bazel:java_lite_proto_library.bzl", "java_lite_proto_library") load("@protobuf//bazel:java_proto_library.bzl", "java_proto_library") load("@protobuf//bazel:proto_library.bzl", "proto_library") load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") load("@rules_cc//cc:defs.bzl", "cc_binary") load("@rules_pkg//pkg:mappings.bzl", "pkg_files", "strip_prefix") load("@rules_python//python:py_binary.bzl", "py_binary") # cc_proto_library is intentionally not loaded, to test Bazel's built-in implementation # against Protobuf's implementation (already used building protoc) # For each .proto file, a proto_library target should be defined. This target # is not bound to any particular language. Instead, it defines the dependency # graph of the .proto files (i.e., proto imports) and serves as the provider # of .proto source files to the protocol compiler. # # Remote repository "protobuf" must be defined to use this rule. proto_library( name = "addressbook_proto", srcs = ["addressbook.proto"], deps = ["@protobuf//:timestamp_proto"], ) # The cc_proto_library rule generates C++ code for a proto_library rule. It # must have exactly one proto_library dependency. If you want to use multiple # proto_library targets, create a separate cc_proto_library target for each # of them. # # Remote repository "com_google_protobuf_cc" must be defined to use this rule. cc_proto_library( name = "addressbook_cc_proto", deps = [":addressbook_proto"], ) # cc_library/cc_binary targets can depend on cc_proto_library targets. cc_binary( name = "add_person_cpp", srcs = ["add_person.cc"], deps = [ ":addressbook_cc_proto", "@protobuf", "@protobuf//src/google/protobuf/util:time_util", ], ) cc_binary( name = "list_people_cpp", srcs = ["list_people.cc"], deps = [ ":addressbook_cc_proto", "@protobuf", "@protobuf//src/google/protobuf/util:time_util", ], ) # Similar to cc_proto_library but for Java. # # Remote repository "com_google_protobuf_java" must be defined to use this rule. java_proto_library( name = "addressbook_java_proto", deps = [":addressbook_proto"], ) java_binary( name = "add_person_java", srcs = ["AddPerson.java"], main_class = "AddPerson", deps = [":addressbook_java_proto"], ) java_binary( name = "list_people_java", srcs = ["ListPeople.java"], main_class = "ListPeople", deps = [":addressbook_java_proto"], ) # Java lite. # # Remote repository "com_google_protobuf_javalite" must be defined to use this # rule. java_lite_proto_library( name = "addressbook_java_lite_proto", deps = [":addressbook_proto"], ) # Java lite API is a subset of the regular Java API so if you only uses this # subset in your code, you can actually compile your code against both (i.e., # share code between server build and Android build). # # The lite version has a smaller code size, and you can see that by comparing # the resulted .jar file: # # $ bazel build :add_person_java_deploy.jar :add_person_java_lite_deploy.jar # $ ls -l bazel-bin/*_deploy.jar # -r-xr-xr-x 1 xiaofeng eng 1230797 Sep 8 12:24 bazel-bin/add_person_java_deploy.jar # -r-xr-xr-x 1 xiaofeng eng 236166 Sep 8 12:24 bazel-bin/add_person_java_lite_deploy.jar # # In the above example, the lite .jar file is 6 times smaller. With proper # proguard inlining/stripping, the difference can be much more larger than # that. java_binary( name = "add_person_java_lite", srcs = ["AddPerson.java"], main_class = "AddPerson", deps = [":addressbook_java_lite_proto"], ) java_binary( name = "list_people_java_lite", srcs = ["ListPeople.java"], main_class = "ListPeople", deps = [":addressbook_java_lite_proto"], ) # Python py_proto_library( name = "addressbook_py_pb2", visibility = ["//visibility:public"], deps = [":addressbook_proto"], ) py_binary( name = "add_person", srcs = ["add_person.py"], python_version = "PY3", deps = [ ":addressbook_py_pb2", ], ) py_binary( name = "list_people", srcs = ["list_people.py"], python_version = "PY3", deps = [ ":addressbook_py_pb2", ], ) build_test( name = "test", targets = [ ":add_person_cpp", ":add_person_java", ":add_person", # Python ], ) # Files included in all source distributions pkg_files( name = "dist_files", srcs = [ "AddPerson.java", "BUILD.bazel", "CMakeLists.txt", "ListPeople.java", "Makefile", "README.md", "WORKSPACE", "add_person.cc", "add_person.dart", "add_person.py", "addressbook.proto", "go/cmd/add_person/add_person.go", "go/cmd/add_person/add_person_test.go", "go/cmd/list_people/list_people.go", "go/cmd/list_people/list_people_test.go", "go/go.mod", "go/go.sum", "list_people.cc", "list_people.dart", "list_people.py", "pubspec.yaml", ], prefix = "examples/", strip_prefix = strip_prefix.from_root(""), visibility = ["//visibility:public"], )