1*1b3f573fSAndroid Build Coastguard Worker#!/bin/bash -eu 2*1b3f573fSAndroid Build Coastguard Worker# Invoked by the Xcode projects to build the protos needed for the unittests. 3*1b3f573fSAndroid Build Coastguard Worker 4*1b3f573fSAndroid Build Coastguard Workerreadonly OUTPUT_DIR="${PROJECT_DERIVED_FILE_DIR}/protos" 5*1b3f573fSAndroid Build Coastguard Worker 6*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 7*1b3f573fSAndroid Build Coastguard Worker# Helper for bailing. 8*1b3f573fSAndroid Build Coastguard Workerdie() { 9*1b3f573fSAndroid Build Coastguard Worker echo "Error: $1" 10*1b3f573fSAndroid Build Coastguard Worker exit 2 11*1b3f573fSAndroid Build Coastguard Worker} 12*1b3f573fSAndroid Build Coastguard Worker 13*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 14*1b3f573fSAndroid Build Coastguard Worker# What to do. 15*1b3f573fSAndroid Build Coastguard Workercase "${ACTION}" in 16*1b3f573fSAndroid Build Coastguard Worker "") 17*1b3f573fSAndroid Build Coastguard Worker # Build, fall thru 18*1b3f573fSAndroid Build Coastguard Worker ;; 19*1b3f573fSAndroid Build Coastguard Worker "clean") 20*1b3f573fSAndroid Build Coastguard Worker rm -rf "${OUTPUT_DIR}" 21*1b3f573fSAndroid Build Coastguard Worker exit 0 22*1b3f573fSAndroid Build Coastguard Worker ;; 23*1b3f573fSAndroid Build Coastguard Worker *) 24*1b3f573fSAndroid Build Coastguard Worker die "Unknown action requested: ${ACTION}" 25*1b3f573fSAndroid Build Coastguard Worker ;; 26*1b3f573fSAndroid Build Coastguard Workeresac 27*1b3f573fSAndroid Build Coastguard Worker 28*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 29*1b3f573fSAndroid Build Coastguard Worker# Reusing a bunch of the protos from the protocolbuffers/protobuf tree, this 30*1b3f573fSAndroid Build Coastguard Worker# can include some extras as there is no harm in ensuring work for C++ 31*1b3f573fSAndroid Build Coastguard Worker# generation. 32*1b3f573fSAndroid Build Coastguard Worker 33*1b3f573fSAndroid Build Coastguard WorkerCORE_PROTO_FILES=( 34*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/any_test.proto 35*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_arena.proto 36*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_custom_options.proto 37*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_enormous_descriptor.proto 38*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_embed_optimize_for.proto 39*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_empty.proto 40*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_import.proto 41*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_import_lite.proto 42*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_lite.proto 43*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_mset.proto 44*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_mset_wire_format.proto 45*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_no_generic_services.proto 46*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_optimize_for.proto 47*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest.proto 48*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_import_public.proto 49*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_import_public_lite.proto 50*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_drop_unknown_fields.proto 51*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/unittest_preserve_unknown_enum.proto 52*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/map_lite_unittest.proto 53*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/map_proto2_unittest.proto 54*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/map_unittest.proto 55*1b3f573fSAndroid Build Coastguard Worker # The unittest_custom_options.proto extends the messages in descriptor.proto 56*1b3f573fSAndroid Build Coastguard Worker # so we build it in to test extending in general. The library doesn't provide 57*1b3f573fSAndroid Build Coastguard Worker # a descriptor as it doesn't use the classes/enums. 58*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/descriptor.proto 59*1b3f573fSAndroid Build Coastguard Worker) 60*1b3f573fSAndroid Build Coastguard Worker 61*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 62*1b3f573fSAndroid Build Coastguard Worker# The objc unittest specific proto files. 63*1b3f573fSAndroid Build Coastguard Worker 64*1b3f573fSAndroid Build Coastguard WorkerOBJC_TEST_PROTO_FILES=( 65*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_cycle.proto 66*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_deprecated.proto 67*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_deprecated_file.proto 68*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_extension_chain_a.proto 69*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_extension_chain_b.proto 70*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_extension_chain_c.proto 71*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_extension_chain_d.proto 72*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_extension_chain_e.proto 73*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_extension_chain_f.proto 74*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_extension_chain_g.proto 75*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_objc.proto 76*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_objc_startup.proto 77*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_objc_options.proto 78*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_runtime_proto2.proto 79*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/unittest_runtime_proto3.proto 80*1b3f573fSAndroid Build Coastguard Worker) 81*1b3f573fSAndroid Build Coastguard Worker 82*1b3f573fSAndroid Build Coastguard WorkerOBJC_EXTENSIONS=( .pbobjc.h .pbobjc.m ) 83*1b3f573fSAndroid Build Coastguard Worker 84*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 85*1b3f573fSAndroid Build Coastguard Worker# Ensure the output dir exists 86*1b3f573fSAndroid Build Coastguard Workermkdir -p "${OUTPUT_DIR}/google/protobuf" 87*1b3f573fSAndroid Build Coastguard Worker 88*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 89*1b3f573fSAndroid Build Coastguard Worker# Move to the top of the protobuf directories and ensure there is a protoc 90*1b3f573fSAndroid Build Coastguard Worker# binary to use. 91*1b3f573fSAndroid Build Coastguard Workercd "${SRCROOT}/.." 92*1b3f573fSAndroid Build Coastguard Worker[[ -x src/protoc ]] || \ 93*1b3f573fSAndroid Build Coastguard Worker die "Could not find the protoc binary; make sure you have built it (objectivec/DevTools/full_mac_build.sh -h)." 94*1b3f573fSAndroid Build Coastguard Worker 95*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 96*1b3f573fSAndroid Build Coastguard WorkerRUN_PROTOC=no 97*1b3f573fSAndroid Build Coastguard Worker 98*1b3f573fSAndroid Build Coastguard Worker# Check to if all the output files exist (in case a new one got added). 99*1b3f573fSAndroid Build Coastguard Worker 100*1b3f573fSAndroid Build Coastguard Workerfor PROTO_FILE in "${CORE_PROTO_FILES[@]}" "${OBJC_TEST_PROTO_FILES[@]}"; do 101*1b3f573fSAndroid Build Coastguard Worker DIR=${PROTO_FILE%/*} 102*1b3f573fSAndroid Build Coastguard Worker BASE_NAME=${PROTO_FILE##*/} 103*1b3f573fSAndroid Build Coastguard Worker # Drop the extension 104*1b3f573fSAndroid Build Coastguard Worker BASE_NAME=${BASE_NAME%.*} 105*1b3f573fSAndroid Build Coastguard Worker OBJC_NAME=$(echo "${BASE_NAME}" | awk -F _ '{for(i=1; i<=NF; i++) printf "%s", toupper(substr($i,1,1)) substr($i,2);}') 106*1b3f573fSAndroid Build Coastguard Worker 107*1b3f573fSAndroid Build Coastguard Worker for EXT in "${OBJC_EXTENSIONS[@]}"; do 108*1b3f573fSAndroid Build Coastguard Worker if [[ ! -f "${OUTPUT_DIR}/google/protobuf/${OBJC_NAME}${EXT}" ]]; then 109*1b3f573fSAndroid Build Coastguard Worker RUN_PROTOC=yes 110*1b3f573fSAndroid Build Coastguard Worker fi 111*1b3f573fSAndroid Build Coastguard Worker done 112*1b3f573fSAndroid Build Coastguard Workerdone 113*1b3f573fSAndroid Build Coastguard Worker 114*1b3f573fSAndroid Build Coastguard Worker# If we haven't decided to run protoc because of a missing file, check to see if 115*1b3f573fSAndroid Build Coastguard Worker# an input has changed. 116*1b3f573fSAndroid Build Coastguard Workerif [[ "${RUN_PROTOC}" != "yes" ]] ; then 117*1b3f573fSAndroid Build Coastguard Worker # Find the newest input file (protos, compiler, and this script). 118*1b3f573fSAndroid Build Coastguard Worker # (these patterns catch some extra stuff, but better to over sample than 119*1b3f573fSAndroid Build Coastguard Worker # under) 120*1b3f573fSAndroid Build Coastguard Worker readonly NewestInput=$(find \ 121*1b3f573fSAndroid Build Coastguard Worker src/google/protobuf/*.proto \ 122*1b3f573fSAndroid Build Coastguard Worker objectivec/Tests/*.proto \ 123*1b3f573fSAndroid Build Coastguard Worker src/.libs src/*.la src/protoc \ 124*1b3f573fSAndroid Build Coastguard Worker objectivec/DevTools/compile_testing_protos.sh \ 125*1b3f573fSAndroid Build Coastguard Worker -type f -print0 \ 126*1b3f573fSAndroid Build Coastguard Worker | xargs -0 stat -f "%m %N" \ 127*1b3f573fSAndroid Build Coastguard Worker | sort -n | tail -n1 | cut -f2- -d" ") 128*1b3f573fSAndroid Build Coastguard Worker # Find the oldest output file. 129*1b3f573fSAndroid Build Coastguard Worker readonly OldestOutput=$(find \ 130*1b3f573fSAndroid Build Coastguard Worker "${OUTPUT_DIR}" \ 131*1b3f573fSAndroid Build Coastguard Worker -type f -name "*.pbobjc.[hm]" -print0 \ 132*1b3f573fSAndroid Build Coastguard Worker | xargs -0 stat -f "%m %N" \ 133*1b3f573fSAndroid Build Coastguard Worker | sort -n -r | tail -n1 | cut -f2- -d" ") 134*1b3f573fSAndroid Build Coastguard Worker # If the newest input is newer than the oldest output, regenerate. 135*1b3f573fSAndroid Build Coastguard Worker if [[ "${NewestInput}" -nt "${OldestOutput}" ]] ; then 136*1b3f573fSAndroid Build Coastguard Worker RUN_PROTOC=yes 137*1b3f573fSAndroid Build Coastguard Worker fi 138*1b3f573fSAndroid Build Coastguard Workerfi 139*1b3f573fSAndroid Build Coastguard Worker 140*1b3f573fSAndroid Build Coastguard Workerif [[ "${RUN_PROTOC}" != "yes" ]] ; then 141*1b3f573fSAndroid Build Coastguard Worker # Up to date. 142*1b3f573fSAndroid Build Coastguard Worker exit 0 143*1b3f573fSAndroid Build Coastguard Workerfi 144*1b3f573fSAndroid Build Coastguard Worker 145*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 146*1b3f573fSAndroid Build Coastguard Worker# Prune out all the files from previous generations to ensure we only have 147*1b3f573fSAndroid Build Coastguard Worker# current ones. 148*1b3f573fSAndroid Build Coastguard Workerfind "${OUTPUT_DIR}" \ 149*1b3f573fSAndroid Build Coastguard Worker -type f -name "*.pbobjc.[hm]" -print0 \ 150*1b3f573fSAndroid Build Coastguard Worker | xargs -0 rm -rf 151*1b3f573fSAndroid Build Coastguard Worker 152*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 153*1b3f573fSAndroid Build Coastguard Worker# Helper to invoke protoc 154*1b3f573fSAndroid Build Coastguard Workercompile_protos() { 155*1b3f573fSAndroid Build Coastguard Worker src/protoc \ 156*1b3f573fSAndroid Build Coastguard Worker --objc_out="${OUTPUT_DIR}/google/protobuf" \ 157*1b3f573fSAndroid Build Coastguard Worker --proto_path=src/google/protobuf/ \ 158*1b3f573fSAndroid Build Coastguard Worker --proto_path=src \ 159*1b3f573fSAndroid Build Coastguard Worker --experimental_allow_proto3_optional \ 160*1b3f573fSAndroid Build Coastguard Worker "$@" 161*1b3f573fSAndroid Build Coastguard Worker} 162*1b3f573fSAndroid Build Coastguard Worker 163*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 164*1b3f573fSAndroid Build Coastguard Worker# Generate most of the proto files that exist in the C++ src tree. 165*1b3f573fSAndroid Build Coastguard Worker 166*1b3f573fSAndroid Build Coastguard Worker# Note: there is overlap in package.Message names between some of the test 167*1b3f573fSAndroid Build Coastguard Worker# files, so they can't be generated all at once. This works because the overlap 168*1b3f573fSAndroid Build Coastguard Worker# isn't linked into a single binary. 169*1b3f573fSAndroid Build Coastguard Workerfor a_proto in "${CORE_PROTO_FILES[@]}" ; do 170*1b3f573fSAndroid Build Coastguard Worker compile_protos "${a_proto}" 171*1b3f573fSAndroid Build Coastguard Workerdone 172*1b3f573fSAndroid Build Coastguard Worker 173*1b3f573fSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------- 174*1b3f573fSAndroid Build Coastguard Worker# Generate the Objective C specific testing protos. 175*1b3f573fSAndroid Build Coastguard Workercompile_protos \ 176*1b3f573fSAndroid Build Coastguard Worker --proto_path="objectivec/Tests" \ 177*1b3f573fSAndroid Build Coastguard Worker "${OBJC_TEST_PROTO_FILES[@]}" 178