| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 | #!/bin/bash## Helper to do build so you don't have to remember all the steps/args.set -eu# Some base locations.readonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")")readonly ProtoRootDir="${ScriptDir}/../.."printUsage() {  NAME=$(basename "${0}")  cat << EOFusage: ${NAME} [OPTIONS]This script does the common build steps needed.OPTIONS: General:   -h, --help         Show this message   -c, --clean         Issue a clean before the normal build.   -a, --autogen         Start by rerunning autogen & configure.   -r, --regenerate-descriptors         The descriptor.proto is checked in generated, cause it to regenerate.   -j #, --jobs #         Force the number of parallel jobs (useful for debugging build issues).   --skip-xcode         Skip the invoke of Xcode to test the runtime on both iOS and OS X.   --skip-xcode-ios         Skip the invoke of Xcode to test the runtime on iOS.   --skip-xcode-osx         Skip the invoke of Xcode to test the runtime on OS X.EOF}header() {  echo ""  echo "========================================================================"  echo "    ${@}"  echo "========================================================================"}# Thanks to libtool, builds can fail in odd ways and since it eats some output# it can be hard to spot, so force error output if make exits with a non zero.wrapped_make() {  set +e  # Don't stop if the command fails.  make $*  MAKE_EXIT_STATUS=$?  if [ ${MAKE_EXIT_STATUS} -ne 0 ]; then    echo "Error: 'make $*' exited with status ${MAKE_EXIT_STATUS}"    exit ${MAKE_EXIT_STATUS}  fi  set -e}NUM_MAKE_JOBS=$(/usr/sbin/sysctl -n hw.ncpu)if [[ "${NUM_MAKE_JOBS}" -lt 4 ]] ; then  NUM_MAKE_JOBS=4fiDO_AUTOGEN=noDO_CLEAN=noREGEN_CPP_DESCRIPTORS=noDO_XCODE_IOS_TESTS=yesDO_XCODE_OSX_TESTS=yeswhile [[ $# != 0 ]]; do  case "${1}" in    -h | --help )      printUsage      exit 0      ;;    -c | --clean )      DO_CLEAN=yes      ;;    -a | --autogen )      DO_AUTOGEN=yes      ;;    -r | --regenerate-cpp-descriptors )      REGEN_CPP_DESCRIPTORS=yes      ;;    -j | --jobs )      shift      NUM_MAKE_JOBS="${1}"      ;;    --skip-xcode )      DO_XCODE_IOS_TESTS=no      DO_XCODE_OSX_TESTS=no      ;;    --skip-xcode-ios )      DO_XCODE_IOS_TESTS=no      ;;    --skip-xcode-osx )      DO_XCODE_OSX_TESTS=no      ;;    -*)      echo "ERROR: Unknown option: ${1}" 1>&2      printUsage      exit 1      ;;    *)      echo "ERROR: Unknown argument: ${1}" 1>&2      printUsage      exit 1      ;;  esac  shiftdone# Into the proto dir.pushd "${ProtoRootDir}"# if no Makefile, force the autogen.if [[ ! -f Makefile ]] ; then  DO_AUTOGEN=yesfiif [[ "${DO_AUTOGEN}" == "yes" ]] ; then  header "Running autogen & configure"  ./autogen.sh  ./configure CXXFLAGS="-mmacosx-version-min=10.9 -Wnon-virtual-dtor -Woverloaded-virtual -Wunused-const-variable -Wunused-function"fiif [[ "${DO_CLEAN}" == "yes" ]] ; then  header "Cleaning"  wrapped_make clean  if [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then    XCODEBUILD_CLEAN_BASE_IOS=(      xcodebuild        -project objectivec/ProtocolBuffers_iOS.xcodeproj        -scheme ProtocolBuffers    )  "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Debug clean  "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Release clean  fi  if [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then    XCODEBUILD_CLEAN_BASE_OSX=(      xcodebuild        -project objectivec/ProtocolBuffers_OSX.xcodeproj        -scheme ProtocolBuffers    )  "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Debug clean  "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Release clean  fifiif [[ "${REGEN_CPP_DESCRIPTORS}" == "yes" ]] ; then  header "Regenerating the C++ descriptor sources."  ./generate_descriptor_proto.sh -j "${NUM_MAKE_JOBS}"fiheader "Building"# Can't issue these together, when fully parallel, something sometimes chokes# at random.wrapped_make -j "${NUM_MAKE_JOBS}" allwrapped_make -j "${NUM_MAKE_JOBS}" checkheader "Ensuring the ObjC descriptors are current."# Find the newest input file (protos, compiler, and the generator script).# (these patterns catch some extra stuff, but better to over sample than under)readonly NewestInput=$(find \   src/google/protobuf/*.proto \   src/.libs src/*.la src/protoc \   objectivec/generate_descriptors_proto.sh \      -type f -print0 \      | xargs -0 stat -f "%m %N" \      | sort -n | tail -n1 | cut -f2- -d" ")# Find the oldest output file.readonly OldestOutput=$(find \      "${ProtoRootDir}/objectivec/google" \      -type f -print0 \      | xargs -0 stat -f "%m %N" \      | sort -n -r | tail -n1 | cut -f2- -d" ")# If the newest input is newer than the oldest output, regenerate.if [[ "${NewestInput}" -nt "${OldestOutput}" ]] ; then  echo ">> Newest input is newer than oldest output, regenerating."  objectivec/generate_descriptors_proto.sh -j "${NUM_MAKE_JOBS}"else  echo ">> Newest input is older than oldest output, no need to regenerating."fiheader "Checking on the ObjC Runtime Code"objectivec/DevTools/pddm_tests.pyif ! objectivec/DevTools/pddm.py --dry-run objectivec/*.[hm] objectivec/Tests/*.[hm] ; then  echo ""  echo "Update by running:"  echo "   objectivec/DevTools/pddm.py objectivec/*.[hm] objectivec/Tests/*.[hm]"  exit 1fiif [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then  XCODEBUILD_TEST_BASE_IOS=(    xcodebuild      -project objectivec/ProtocolBuffers_iOS.xcodeproj      -scheme ProtocolBuffers      # Don't need to worry about form factors or retina/non retina;      # just pick a mix of OS Versions and 32/64 bit.      -destination "platform=iOS Simulator,name=iPhone 4s,OS=7.1" # 32bit      -destination "platform=iOS Simulator,name=iPhone 6,OS=8.3" # 64bit      -destination "platform=iOS Simulator,name=iPad 2,OS=7.1" # 32bit      -destination "platform=iOS Simulator,name=iPad Air,OS=8.3" # 64bit  )  header "Doing Xcode iOS build/tests - Debug"  "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Debug test  header "Doing Xcode iOS build/tests - Release"  "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Release test  # Don't leave the simulator in the developer's face.  killall "iOS Simulator"fiif [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then  XCODEBUILD_TEST_BASE_OSX=(    xcodebuild      -project objectivec/ProtocolBuffers_OSX.xcodeproj      -scheme ProtocolBuffers      # Since the ObjC 2.0 Runtime is required, 32bit OS X isn't supported.      -destination "platform=OS X,arch=x86_64" # 64bit  )  header "Doing Xcode OS X build/tests - Debug"  "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Debug test  header "Doing Xcode OS X build/tests - Release"  "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Release testfi
 |