| #!/usr/bin/env bash | |
| # Run this script to regenerate descriptor.pb.{h,cc} after the protocol | |
| # compiler changes. Since these files are compiled into the protocol compiler | |
| # itself, they cannot be generated automatically by a make rule. "make check" | |
| # will fail if these files do not match what the protocol compiler would | |
| # generate. | |
| # | |
| # HINT: Flags passed to generate_descriptor_proto.sh will be passed directly | |
| # to bazel when building protoc. This is particularly useful for passing | |
| # -j4 to run 4 jobs simultaneously. | |
| if test ! -e src/google/protobuf/stubs/common.h; then | |
| cat >&2 << __EOF__ | |
| Could not find source code. Make sure you are running this script from the | |
| root of the distribution tree. | |
| __EOF__ | |
| exit 1 | |
| fi | |
| cd src | |
| declare -a RUNTIME_PROTO_FILES=(\ | |
| google/protobuf/any.proto \ | |
| google/protobuf/api.proto \ | |
| google/protobuf/cpp_features.proto \ | |
| google/protobuf/descriptor.proto \ | |
| google/protobuf/duration.proto \ | |
| google/protobuf/empty.proto \ | |
| google/protobuf/field_mask.proto \ | |
| google/protobuf/source_context.proto \ | |
| google/protobuf/struct.proto \ | |
| google/protobuf/timestamp.proto \ | |
| google/protobuf/type.proto \ | |
| google/protobuf/wrappers.proto) | |
| declare -a COMPILER_PROTO_FILES=(\ | |
| google/protobuf/compiler/plugin.proto) | |
| CORE_PROTO_IS_CORRECT=0 | |
| PROCESS_ROUND=1 | |
| BOOTSTRAP_PROTOC="" | |
| while [ $# -gt 0 ]; do | |
| case $1 in | |
| --bootstrap_protoc) | |
| BOOTSTRAP_PROTOC=$2 | |
| shift 2 | |
| ;; | |
| *) | |
| break | |
| ;; | |
| esac | |
| shift | |
| done | |
| TMP=$(mktemp -d) | |
| echo "Updating descriptor protos..." | |
| while [ $CORE_PROTO_IS_CORRECT -ne 1 ] | |
| do | |
| echo "Round $PROCESS_ROUND" | |
| CORE_PROTO_IS_CORRECT=1 | |
| if [ "$BOOTSTRAP_PROTOC" != "" ]; then | |
| PROTOC=$BOOTSTRAP_PROTOC | |
| BOOTSTRAP_PROTOC="" | |
| else | |
| ${BAZEL:-bazel} ${BAZEL_STARTUP_FLAGS:-} build $@ //:protoc ${BAZEL_FLAGS:-} | |
| if test $? -ne 0; then | |
| echo "Failed to build protoc." | |
| exit 1 | |
| fi | |
| PROTOC="../bazel-bin/protoc" | |
| fi | |
| $PROTOC --cpp_out=dllexport_decl=PROTOBUF_EXPORT:$TMP ${RUNTIME_PROTO_FILES[@]} && \ | |
| $PROTOC --cpp_out=dllexport_decl=PROTOC_EXPORT:$TMP ${COMPILER_PROTO_FILES[@]} | |
| for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]} ${COMPILER_PROTO_FILES[@]}; do | |
| BASE_NAME=${PROTO_FILE%.*} | |
| diff ${BASE_NAME}.pb.h $TMP/${BASE_NAME}.pb.h > /dev/null | |
| if test $? -ne 0; then | |
| CORE_PROTO_IS_CORRECT=0 | |
| fi | |
| diff ${BASE_NAME}.pb.cc $TMP/${BASE_NAME}.pb.cc > /dev/null | |
| if test $? -ne 0; then | |
| CORE_PROTO_IS_CORRECT=0 | |
| fi | |
| done | |
| # Only override the output if the files are different to avoid re-compilation | |
| # of the protoc. | |
| if [ $CORE_PROTO_IS_CORRECT -ne 1 ]; then | |
| for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]} ${COMPILER_PROTO_FILES[@]}; do | |
| BASE_NAME=${PROTO_FILE%.*} | |
| mv $TMP/${BASE_NAME}.pb.h ${BASE_NAME}.pb.h | |
| mv $TMP/${BASE_NAME}.pb.cc ${BASE_NAME}.pb.cc | |
| done | |
| fi | |
| PROCESS_ROUND=$((PROCESS_ROUND + 1)) | |
| done | |
| cd .. | |
| if test -x objectivec/generate_well_known_types.sh; then | |
| echo "Generating messages for objc." | |
| objectivec/generate_well_known_types.sh $@ | |
| fi | |
| if test -x csharp/generate_protos.sh; then | |
| echo "Generating messages for C#." | |
| csharp/generate_protos.sh $@ | |
| fi | |
| if test -x php/generate_descriptor_protos.sh; then | |
| echo "Generating messages for PHP." | |
| php/generate_descriptor_protos.sh $@ | |
| fi |