| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 | #!/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         Run generate_descriptor_proto.sh to regenerate all the checked in         proto sources.   -j #, --jobs #         Force the number of parallel jobs (useful for debugging build issues).   --core-only         Skip some of the core protobuf build/checks to shorten the build time.   --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-debug         Skip the Xcode Debug configuration.   --skip-xcode-release         Skip the Xcode Release configuration.   --skip-xcode-osx | --skip-xcode-macos         Skip the invoke of Xcode to test the runtime on OS X.   --skip-xcode-tvos         Skip the invoke of Xcode to test the runtime on tvOS.   --skip-objc-conformance         Skip the Objective C conformance tests (run on OS X).   --xcode-quiet         Pass -quiet to xcodebuild.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 2 ]] ; then  NUM_MAKE_JOBS=2fiDO_AUTOGEN=noDO_CLEAN=noREGEN_DESCRIPTORS=noCORE_ONLY=noDO_XCODE_IOS_TESTS=yesDO_XCODE_OSX_TESTS=yesDO_XCODE_TVOS_TESTS=yesDO_XCODE_DEBUG=yesDO_XCODE_RELEASE=yesDO_OBJC_CONFORMANCE_TESTS=yesXCODE_QUIET=nowhile [[ $# != 0 ]]; do  case "${1}" in    -h | --help )      printUsage      exit 0      ;;    -c | --clean )      DO_CLEAN=yes      ;;    -a | --autogen )      DO_AUTOGEN=yes      ;;    -r | --regenerate-descriptors )      REGEN_DESCRIPTORS=yes      ;;    -j | --jobs )      shift      NUM_MAKE_JOBS="${1}"      ;;    --core-only )      CORE_ONLY=yes      ;;    --skip-xcode )      DO_XCODE_IOS_TESTS=no      DO_XCODE_OSX_TESTS=no      DO_XCODE_TVOS_TESTS=no      ;;    --skip-xcode-ios )      DO_XCODE_IOS_TESTS=no      ;;    --skip-xcode-osx | --skip-xcode-macos)      DO_XCODE_OSX_TESTS=no      ;;    --skip-xcode-tvos )      DO_XCODE_TVOS_TESTS=no      ;;    --skip-xcode-debug )      DO_XCODE_DEBUG=no      ;;    --skip-xcode-release )      DO_XCODE_RELEASE=no      ;;    --skip-objc-conformance )      DO_OBJC_CONFORMANCE_TESTS=no      ;;    --xcode-quiet )      XCODE_QUIET=yes      ;;    -*)      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.cd "${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 \    CPPFLAGS="-mmacosx-version-min=10.9 -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    )    if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then      "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Debug clean    fi    if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then      "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Release clean    fi  fi  if [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then    XCODEBUILD_CLEAN_BASE_OSX=(      xcodebuild        -project objectivec/ProtocolBuffers_OSX.xcodeproj        -scheme ProtocolBuffers    )    if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Debug clean    fi    if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Release clean    fi  fi  if [[ "${DO_XCODE_TVOS_TESTS}" == "yes" ]] ; then    XCODEBUILD_CLEAN_BASE_OSX=(      xcodebuild        -project objectivec/ProtocolBuffers_tvOS.xcodeproj        -scheme ProtocolBuffers    )    if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Debug clean    fi    if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Release clean    fi  fifiif [[ "${REGEN_DESCRIPTORS}" == "yes" ]] ; then  header "Regenerating the descriptor sources."  ./generate_descriptor_proto.sh -j "${NUM_MAKE_JOBS}"fiif [[ "${CORE_ONLY}" == "yes" ]] ; then  header "Building core Only"  wrapped_make -j "${NUM_MAKE_JOBS}"else  header "Building"  # Can't issue these together, when fully parallel, something sometimes chokes  # at random.  wrapped_make -j "${NUM_MAKE_JOBS}" all  wrapped_make -j "${NUM_MAKE_JOBS}" check  # Fire off the conformance tests also.  cd conformance  wrapped_make -j "${NUM_MAKE_JOBS}" test_cpp  cd ..fi# Ensure the WKT sources checked in are current.objectivec/generate_well_known_types.sh --check-only -j "${NUM_MAKE_JOBS}"header "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 1fireadonly XCODE_VERSION_LINE="$(xcodebuild -version | grep Xcode\  )"readonly XCODE_VERSION="${XCODE_VERSION_LINE/Xcode /}"  # drop the prefix.if [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then  XCODEBUILD_TEST_BASE_IOS=(    xcodebuild      -project objectivec/ProtocolBuffers_iOS.xcodeproj      -scheme ProtocolBuffers  )  if [[ "${XCODE_QUIET}" == "yes" ]] ; then    XCODEBUILD_TEST_BASE_IOS+=( -quiet )  fi  # Don't need to worry about form factors or retina/non retina;  # just pick a mix of OS Versions and 32/64 bit.  # NOTE: Different Xcode have different simulated hardware/os support.  case "${XCODE_VERSION}" in    [6-8].* )      echo "ERROR: The unittests include Swift code that is now Swift 4.0." 1>&2      echo "ERROR: Xcode 9.0 or higher is required to build the test suite, but the library works with Xcode 7.x." 1>&2      exit 11      ;;    9.[0-2]* )      XCODEBUILD_TEST_BASE_IOS+=(          -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit          -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit          # 9.0-9.2 all seem to often fail running destinations in parallel          -disable-concurrent-testing      )      ;;    9.[3-4]* )      XCODEBUILD_TEST_BASE_IOS+=(          # Xcode 9.3 chokes targeting iOS 8.x - http://www.openradar.me/39335367          -destination "platform=iOS Simulator,name=iPhone 4s,OS=9.0" # 32bit          -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit          # 9.3 also seems to often fail running destinations in parallel          -disable-concurrent-testing      )      ;;    10.*)      XCODEBUILD_TEST_BASE_IOS+=(          -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit          -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit          # 10.x also seems to often fail running destinations in parallel (with          # 32bit one include atleast)          -disable-concurrent-destination-testing      )      ;;    11.*)      # Dropped 32bit as Apple doesn't seem support the simulators either.      XCODEBUILD_TEST_BASE_IOS+=(          -destination "platform=iOS Simulator,name=iPhone 8,OS=latest" # 64bit      )      ;;    * )      echo ""      echo "ATTENTION: Time to update the simulator targets for Xcode ${XCODE_VERSION}"      echo ""      echo "ERROR: Build aborted!"      exit 2      ;;  esac  if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then    header "Doing Xcode iOS build/tests - Debug"    "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Debug test  fi  if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then    header "Doing Xcode iOS build/tests - Release"    "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Release test  fi  # Don't leave the simulator in the developer's face.  killall Simulator 2> /dev/null || truefiif [[ "${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  )  if [[ "${XCODE_QUIET}" == "yes" ]] ; then    XCODEBUILD_TEST_BASE_OSX+=( -quiet )  fi  case "${XCODE_VERSION}" in    [6-8].* )      echo "ERROR: The unittests include Swift code that is now Swift 4.0." 1>&2      echo "ERROR: Xcode 9.0 or higher is required to build the test suite, but the library works with Xcode 7.x." 1>&2      exit 11      ;;  esac  if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then    header "Doing Xcode OS X build/tests - Debug"    "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Debug test  fi  if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then    header "Doing Xcode OS X build/tests - Release"    "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Release test  fifiif [[ "${DO_XCODE_TVOS_TESTS}" == "yes" ]] ; then  XCODEBUILD_TEST_BASE_TVOS=(    xcodebuild      -project objectivec/ProtocolBuffers_tvOS.xcodeproj      -scheme ProtocolBuffers  )  case "${XCODE_VERSION}" in    [6-9].* )      echo "ERROR: Xcode 10.0 or higher is required to build the test suite." 1>&2      exit 11      ;;    10.* | 11.* )      XCODEBUILD_TEST_BASE_TVOS+=(        # Test on the oldest and current.        -destination "platform=tvOS Simulator,name=Apple TV,OS=11.0"        -destination "platform=tvOS Simulator,name=Apple TV 4K,OS=latest"      )      ;;    * )      echo ""      echo "ATTENTION: Time to update the simulator targets for Xcode ${XCODE_VERSION}"      echo ""      echo "ERROR: Build aborted!"      exit 2      ;;  esac  if [[ "${XCODE_QUIET}" == "yes" ]] ; then    XCODEBUILD_TEST_BASE_TVOS+=( -quiet )  fi  if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then    header "Doing Xcode tvOS build/tests - Debug"    "${XCODEBUILD_TEST_BASE_TVOS[@]}" -configuration Debug test  fi  if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then    header "Doing Xcode tvOS build/tests - Release"    "${XCODEBUILD_TEST_BASE_TVOS[@]}" -configuration Release test  fifiif [[ "${DO_OBJC_CONFORMANCE_TESTS}" == "yes" ]] ; then  header "Running ObjC Conformance Tests"  cd conformance  wrapped_make -j "${NUM_MAKE_JOBS}" test_objc  cd ..fiecho ""echo "$(basename "${0}"): Success!"
 |