74bf45f379
The example utilizes native bazel rules (proto_library, cc_proto_library, java_proto_library, java_lite_proto_library) to show how easy it is to build protobuf with bazel's native support. It also makes use of well known types which was not possible until the latest bazel 0.5.4 release and https://github.com/google/protobuf/pull/3594 .
102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
# This BUILD file shows how to use protobuf with bazel. Before you can use
|
|
# proto_library/<lang>_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.
|
|
|
|
# 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 "com_google_protobuf" must be defined to use this rule.
|
|
proto_library(
|
|
name = "addressbook_proto",
|
|
srcs = ["addressbook.proto"],
|
|
deps = ["@com_google_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"],
|
|
)
|
|
|
|
cc_binary(
|
|
name = "list_people_cpp",
|
|
srcs = ["list_people.cc"],
|
|
deps = [":addressbook_cc_proto"],
|
|
)
|
|
|
|
# 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"],
|
|
)
|