#!/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 make when building protoc. This is particularly useful for passing # -j4 to run 4 jobs simultaneously. if test ! -e src/google/protobuf/stubs/common.h { 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 } if test ! -e src/Makefile { cat >&2 << __EOF__ Could not find src/Makefile. You must run ./configure (and perhaps ./autogen.sh) first. __EOF__ exit 1 } cd src declare -a RUNTIME_PROTO_FILES=(\ google/protobuf/any.proto \ google/protobuf/api.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) setglobal CORE_PROTO_IS_CORRECT = '0' setglobal PROCESS_ROUND = '1' setglobal TMP = $[mktemp -d] echo "Updating descriptor protos..." while [ $CORE_PROTO_IS_CORRECT -ne 1 ] { echo "Round $PROCESS_ROUND" setglobal CORE_PROTO_IS_CORRECT = '1' make $ifsjoin(ARGV) protoc if test $Status -ne 0 { echo "Failed to build protoc." exit 1 } ./protoc --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:$TMP $(RUNTIME_PROTO_FILES[@]) && \ ./protoc --cpp_out=dllexport_decl=LIBPROTOC_EXPORT:$TMP google/protobuf/compiler/plugin.proto for PROTO_FILE in [$(RUNTIME_PROTO_FILES[@])] { setglobal BASE_NAME = $(PROTO_FILE%.*) diff $(BASE_NAME).pb.h $TMP/$(BASE_NAME).pb.h > /dev/null if test $Status -ne 0 { setglobal CORE_PROTO_IS_CORRECT = '0' } diff $(BASE_NAME).pb.cc $TMP/$(BASE_NAME).pb.cc > /dev/null if test $Status -ne 0 { setglobal CORE_PROTO_IS_CORRECT = '0' } } diff google/protobuf/compiler/plugin.pb.h $TMP/google/protobuf/compiler/plugin.pb.h > /dev/null if test $Status -ne 0 { setglobal CORE_PROTO_IS_CORRECT = '0' } diff google/protobuf/compiler/plugin.pb.cc $TMP/google/protobuf/compiler/plugin.pb.cc > /dev/null if test $Status -ne 0 { setglobal CORE_PROTO_IS_CORRECT = '0' } # Only override the output if the files are different to avoid re-compilation # of the protoc. if test $CORE_PROTO_IS_CORRECT -ne 1 { for PROTO_FILE in [$(RUNTIME_PROTO_FILES[@])] { setglobal BASE_NAME = $(PROTO_FILE%.*) mv $TMP/$(BASE_NAME).pb.h $(BASE_NAME).pb.h mv $TMP/$(BASE_NAME).pb.cc $(BASE_NAME).pb.cc } mv $TMP/google/protobuf/compiler/plugin.pb.* google/protobuf/compiler/ } setglobal PROCESS_ROUND = $shExpr('PROCESS_ROUND + 1') } cd .. if test -x objectivec/generate_well_known_types.sh { echo "Generating messages for objc." objectivec/generate_well_known_types.sh $ifsjoin(ARGV) } if test -x csharp/generate_protos.sh { echo "Generating messages for C#." csharp/generate_protos.sh $ifsjoin(ARGV) }