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