commit
b1befb08c0
14 changed files with 352 additions and 89 deletions
@ -0,0 +1,101 @@ |
||||
# 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"], |
||||
) |
@ -0,0 +1,124 @@ |
||||
# Protocol Buffers - Code Example |
||||
|
||||
This directory contains example code that uses Protocol Buffers to manage an |
||||
address book. Two programs are provided for each supported language. The |
||||
add_person example adds a new person to an address book, prompting the user to |
||||
input the person's information. The list_people example lists people already in |
||||
the address book. The examples use the exact same format in all three languages, |
||||
so you can, for example, use add_person_java to create an address book and then |
||||
use list_people_python to read it. |
||||
|
||||
These examples are part of the Protocol Buffers tutorial, located at: |
||||
https://developers.google.com/protocol-buffers/docs/tutorials |
||||
|
||||
## Build the example using bazel |
||||
|
||||
The example requires bazel 0.5.4 or newer to build. You can download/install |
||||
the latest version of bazel from bazel's release page: |
||||
|
||||
https://github.com/bazelbuild/bazel/releases |
||||
|
||||
Once you have bazel installed, simply run the following command in this examples |
||||
directory to build the code: |
||||
|
||||
$ bazel build :all |
||||
|
||||
Then you can run the built binary: |
||||
|
||||
$ bazel-bin/add_person_cpp addressbook.data |
||||
|
||||
To use protobuf in your own bazel project, please follow instructions in the |
||||
[BUILD](BUILD) file and [WORKSPACE](WORKSPACE) file. |
||||
|
||||
## Build the example using make |
||||
|
||||
You must install the protobuf package before you can build it using make. The |
||||
minimum requirement is to install protocol compiler (i.e., the protoc binary) |
||||
and the protobuf runtime for the language you want to build. |
||||
|
||||
You can simply run "make" to build the example for all languages (except for |
||||
Go). However, since different language has different installation requirement, |
||||
it will likely fail. It's better to follow individual instrutions below to |
||||
build only the language you are interested in. |
||||
|
||||
### C++ |
||||
|
||||
You can follow instructions in [../src/README.md](../src/README.md) to install |
||||
protoc and protobuf C++ runtime from source. |
||||
|
||||
Then run "make cpp" in this examples directory to build the C++ example. It |
||||
will create two executables: add_person_cpp and list_people_cpp. These programs |
||||
simply take an address book file as their parameter. The add_person_cpp |
||||
programs will create the file if it doesn't already exist. |
||||
|
||||
To run the examples: |
||||
|
||||
$ ./add_person_cpp addressbook.data |
||||
$ ./list_people_cpp addressbook.data |
||||
|
||||
Note that on some platforms you may have to edit the Makefile and remove |
||||
"-lpthread" from the linker commands (perhaps replacing it with something else). |
||||
We didn't do this automatically because we wanted to keep the example simple. |
||||
|
||||
### Python |
||||
|
||||
Follow instructions in [../README.md](../README.md) to install protoc and then |
||||
follow [../python/README.md](../python/README.md) to install protobuf python |
||||
runtime from source. You can also install python runtime using pip: |
||||
|
||||
$ pip install protobuf |
||||
|
||||
Make sure the runtime version is the same as protoc binary, or it may not work. |
||||
|
||||
After you have install both protoc and python runtime, run "make python" to |
||||
build two executables (shell scripts actually): add_person_python and |
||||
list_people_python. They work the same way as the C++ executables. |
||||
|
||||
### Java |
||||
|
||||
Follow instructions in [../README.md](../README.md) to install protoc and then |
||||
download protobuf Java runtime .jar file from maven: |
||||
|
||||
https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java |
||||
|
||||
Then run the following: |
||||
|
||||
$ export CLASSPATH=/path/to/protobuf-java-[version].jar |
||||
$ make java |
||||
|
||||
This will create the add_person_java/list_people_java executables (shell |
||||
scripts) and can be used to create/display an address book data file. |
||||
|
||||
### Go |
||||
|
||||
The Go example requires a plugin to the protocol buffer compiler, so it is not |
||||
build with all the other examples. See: |
||||
|
||||
https://github.com/golang/protobuf |
||||
|
||||
for more information about Go protocol buffer support. |
||||
|
||||
First, install the Protocol Buffers compiler (protoc). |
||||
|
||||
Then, install the Go Protocol Buffers plugin ($GOPATH/bin must be in your $PATH |
||||
for protoc to find it): |
||||
|
||||
go get github.com/golang/protobuf/protoc-gen-go |
||||
|
||||
Build the Go samples in this directory with "make go". This creates the |
||||
following executable files in the current directory: |
||||
|
||||
add_person_go list_people_go |
||||
|
||||
To run the example: |
||||
|
||||
./add_person_go addressbook.data |
||||
|
||||
to add a person to the protocol buffer encoded file addressbook.data. The file |
||||
is created if it does not exist. To view the data, run: |
||||
|
||||
./list_people_go addressbook.data |
||||
|
||||
Observe that the C++, Python, and Java examples in this directory run in a |
||||
similar way and can view/modify files created by the Go example and vice |
||||
versa. |
@ -1,61 +0,0 @@ |
||||
This directory contains example code that uses Protocol Buffers to manage an |
||||
address book. Two programs are provided, each with three different |
||||
implementations, one written in each of C++, Java, and Python. The add_person |
||||
example adds a new person to an address book, prompting the user to input |
||||
the person's information. The list_people example lists people already in the |
||||
address book. The examples use the exact same format in all three languages, |
||||
so you can, for example, use add_person_java to create an address book and then |
||||
use list_people_python to read it. |
||||
|
||||
You must install the protobuf package before you can build these. |
||||
|
||||
To build all the examples (on a unix-like system), simply run "make". This |
||||
creates the following executable files in the current directory: |
||||
add_person_cpp list_people_cpp |
||||
add_person_java list_people_java |
||||
add_person_python list_people_python |
||||
|
||||
If you only want to compile examples in one language, use "make cpp"*, |
||||
"make java", or "make python". |
||||
|
||||
All of these programs simply take an address book file as their parameter. |
||||
The add_person programs will create the file if it doesn't already exist. |
||||
|
||||
These examples are part of the Protocol Buffers tutorial, located at: |
||||
https://developers.google.com/protocol-buffers/docs/tutorials |
||||
|
||||
* Note that on some platforms you may have to edit the Makefile and remove |
||||
"-lpthread" from the linker commands (perhaps replacing it with something else). |
||||
We didn't do this automatically because we wanted to keep the example simple. |
||||
|
||||
## Java ## |
||||
|
||||
protobuf-java-*.jar can be generated by: |
||||
cd ../java |
||||
mvn package |
||||
and will be used by "make java" |
||||
|
||||
## Go ## |
||||
|
||||
The Go example requires a plugin to the protocol buffer compiler, so it is not |
||||
build with all the other examples. See: |
||||
https://github.com/golang/protobuf |
||||
for more information about Go protocol buffer support. |
||||
|
||||
First, install the Protocol Buffers compiler (protoc). |
||||
Then, install the Go Protocol Buffers plugin |
||||
($GOPATH/bin must be in your $PATH for protoc to find it): |
||||
go get github.com/golang/protobuf/protoc-gen-go |
||||
|
||||
Build the Go samples in this directory with "make go". This creates the |
||||
following executable files in the current directory: |
||||
add_person_go list_people_go |
||||
To run the example: |
||||
./add_person_go addressbook.data |
||||
to add a person to the protocol buffer encoded file addressbook.data. The file |
||||
is created if it does not exist. To view the data, run: |
||||
./list_people_go addressbook.data |
||||
|
||||
Observe that the C++, Python, and Java examples in this directory run in a |
||||
similar way and can view/modify files created by the Go example and vice |
||||
versa. |
@ -0,0 +1,33 @@ |
||||
# This com_google_protobuf repository is required for proto_library rule. |
||||
# It provides the protocol compiler binary (i.e., protoc). |
||||
http_archive( |
||||
name = "com_google_protobuf", |
||||
strip_prefix = "protobuf-master", |
||||
urls = ["https://github.com/google/protobuf/archive/master.zip"], |
||||
) |
||||
|
||||
# This com_google_protobuf_cc repository is required for cc_proto_library |
||||
# rule. It provides protobuf C++ runtime. Note that it actually is the same |
||||
# repo as com_google_protobuf but has to be given a different name as |
||||
# required by bazel. |
||||
http_archive( |
||||
name = "com_google_protobuf_cc", |
||||
strip_prefix = "protobuf-master", |
||||
urls = ["https://github.com/google/protobuf/archive/master.zip"], |
||||
) |
||||
|
||||
# Similar to com_google_protobuf_cc but for Java (i.e., java_proto_library). |
||||
http_archive( |
||||
name = "com_google_protobuf_java", |
||||
strip_prefix = "protobuf-master", |
||||
urls = ["https://github.com/google/protobuf/archive/master.zip"], |
||||
) |
||||
|
||||
# Similar to com_google_protobuf_cc but for Java lite. If you are building |
||||
# for Android, the lite version should be prefered because it has a much |
||||
# smaller code size. |
||||
http_archive( |
||||
name = "com_google_protobuf_javalite", |
||||
strip_prefix = "protobuf-javalite", |
||||
urls = ["https://github.com/google/protobuf/archive/javalite.zip"], |
||||
) |
Loading…
Reference in new issue