1#!/bin/sh 2 3# Run this script to regenerate descriptor.pb.{h,cc} after the protocol 4# compiler changes. Since these files are compiled into the protocol compiler 5# itself, they cannot be generated automatically by a make rule. "make check" 6# will fail if these files do not match what the protocol compiler would 7# generate. 8# 9# HINT: Flags passed to generate_descriptor_proto.sh will be passed directly 10# to make when building protoc. This is particularly useful for passing 11# -j4 to run 4 jobs simultaneously. 12 13if test ! -e src/google/protobuf/stubs/common.h; then 14 cat >&2 << __EOF__ 15Could not find source code. Make sure you are running this script from the 16root of the distribution tree. 17__EOF__ 18 exit 1 19fi 20 21if test ! -e src/Makefile; then 22 cat >&2 << __EOF__ 23Could not find src/Makefile. You must run ./configure (and perhaps 24./autogen.sh) first. 25__EOF__ 26 exit 1 27fi 28 29cd src 30 31declare -a RUNTIME_PROTO_FILES=(\ 32 google/protobuf/any.proto \ 33 google/protobuf/api.proto \ 34 google/protobuf/descriptor.proto \ 35 google/protobuf/duration.proto \ 36 google/protobuf/empty.proto \ 37 google/protobuf/field_mask.proto \ 38 google/protobuf/source_context.proto \ 39 google/protobuf/struct.proto \ 40 google/protobuf/timestamp.proto \ 41 google/protobuf/type.proto \ 42 google/protobuf/wrappers.proto) 43 44CORE_PROTO_IS_CORRECT=0 45PROCESS_ROUND=1 46TMP=$(mktemp -d) 47echo "Updating descriptor protos..." 48while [ $CORE_PROTO_IS_CORRECT -ne 1 ] 49do 50 echo "Round $PROCESS_ROUND" 51 CORE_PROTO_IS_CORRECT=1 52 53 make $@ protoc 54 if test $? -ne 0; then 55 echo "Failed to build protoc." 56 exit 1 57 fi 58 59 ./protoc --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:$TMP ${RUNTIME_PROTO_FILES[@]} && \ 60 ./protoc --cpp_out=dllexport_decl=LIBPROTOC_EXPORT:$TMP google/protobuf/compiler/plugin.proto 61 62 for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]}; do 63 BASE_NAME=${PROTO_FILE%.*} 64 diff ${BASE_NAME}.pb.h $TMP/${BASE_NAME}.pb.h > /dev/null 65 if test $? -ne 0; then 66 CORE_PROTO_IS_CORRECT=0 67 fi 68 diff ${BASE_NAME}.pb.cc $TMP/${BASE_NAME}.pb.cc > /dev/null 69 if test $? -ne 0; then 70 CORE_PROTO_IS_CORRECT=0 71 fi 72 done 73 74 diff google/protobuf/compiler/plugin.pb.h $TMP/google/protobuf/compiler/plugin.pb.h > /dev/null 75 if test $? -ne 0; then 76 CORE_PROTO_IS_CORRECT=0 77 fi 78 diff google/protobuf/compiler/plugin.pb.cc $TMP/google/protobuf/compiler/plugin.pb.cc > /dev/null 79 if test $? -ne 0; then 80 CORE_PROTO_IS_CORRECT=0 81 fi 82 83 # Only override the output if the files are different to avoid re-compilation 84 # of the protoc. 85 if [ $CORE_PROTO_IS_CORRECT -ne 1 ]; then 86 for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]}; do 87 BASE_NAME=${PROTO_FILE%.*} 88 mv $TMP/${BASE_NAME}.pb.h ${BASE_NAME}.pb.h 89 mv $TMP/${BASE_NAME}.pb.cc ${BASE_NAME}.pb.cc 90 done 91 mv $TMP/google/protobuf/compiler/plugin.pb.* google/protobuf/compiler/ 92 fi 93 94 PROCESS_ROUND=$((PROCESS_ROUND + 1)) 95done 96cd .. 97 98if test -x objectivec/generate_well_known_types.sh; then 99 echo "Generating messages for objc." 100 objectivec/generate_well_known_types.sh $@ 101fi 102 103if test -x csharp/generate_protos.sh; then 104 echo "Generating messages for C#." 105 csharp/generate_protos.sh $@ 106fi 107