|  | #!/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}/../.." | 
|  | readonly BazelFlags="${BAZEL_FLAGS:---announce_rc --macos_minimum_os=10.13}" | 
|  |  | 
|  | # Invoke with BAZEL=bazelisk to use that instead. | 
|  | readonly BazelBin="${BAZEL:-bazel}" | 
|  |  | 
|  | printUsage() { | 
|  | NAME=$(basename "${0}") | 
|  | cat << EOF | 
|  | usage: ${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. | 
|  | --full-build | 
|  | By default only protoc is built within protobuf, this option will | 
|  | enable a full build/test of the entire protobuf project. | 
|  | --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). | 
|  | --skip-xcpretty | 
|  | By default, if xcpretty is installed, it will be used, this option will | 
|  | skip it even it it is installed. | 
|  | --xcode-quiet | 
|  | Pass -quiet to xcodebuild. | 
|  |  | 
|  | EOF | 
|  | } | 
|  |  | 
|  | header() { | 
|  | echo "" | 
|  | echo "========================================================================" | 
|  | echo "    ${@}" | 
|  | echo "========================================================================" | 
|  | } | 
|  |  | 
|  | xcodebuild_xcpretty() { | 
|  | set -o pipefail && xcodebuild "${@}" | xcpretty | 
|  | } | 
|  |  | 
|  | if hash xcpretty >/dev/null 2>&1 ; then | 
|  | XCODEBUILD=xcodebuild_xcpretty | 
|  | else | 
|  | XCODEBUILD=xcodebuild | 
|  | fi | 
|  |  | 
|  | DO_CLEAN=no | 
|  | FULL_BUILD=no | 
|  | DO_XCODE_IOS_TESTS=yes | 
|  | DO_XCODE_OSX_TESTS=yes | 
|  | DO_XCODE_TVOS_TESTS=yes | 
|  | DO_XCODE_DEBUG=yes | 
|  | DO_XCODE_RELEASE=yes | 
|  | DO_OBJC_CONFORMANCE_TESTS=yes | 
|  | XCODE_QUIET=no | 
|  | while [[ $# != 0 ]]; do | 
|  | case "${1}" in | 
|  | -h | --help ) | 
|  | printUsage | 
|  | exit 0 | 
|  | ;; | 
|  | -c | --clean ) | 
|  | DO_CLEAN=yes | 
|  | ;; | 
|  | --full-build ) | 
|  | FULL_BUILD=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 | 
|  | ;; | 
|  | --skip-xcpretty ) | 
|  | XCODEBUILD=xcodebuild | 
|  | ;; | 
|  | --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 | 
|  | shift | 
|  | done | 
|  |  | 
|  | # Into the proto dir. | 
|  | cd "${ProtoRootDir}" | 
|  |  | 
|  | if [[ "${DO_CLEAN}" == "yes" ]] ; then | 
|  | header "Cleaning" | 
|  | ${BazelBin} 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 | 
|  | fi | 
|  | fi | 
|  |  | 
|  | if [[ "${FULL_BUILD}" == "yes" ]] ; then | 
|  | header "Build/Test: everything" | 
|  | ${BazelBin} test //:protoc //:protobuf //src/... $BazelFlags | 
|  | else | 
|  | header "Building: protoc" | 
|  | ${BazelBin} build //:protoc $BazelFlags | 
|  | fi | 
|  |  | 
|  | # Ensure the WKT sources checked in are current. | 
|  | objectivec/generate_well_known_types.sh --check-only | 
|  |  | 
|  | header "Checking on the ObjC Runtime pddm expansions" | 
|  | ${BazelBin} test //objectivec:sources_pddm_expansion_test $BazelFlags | 
|  |  | 
|  | readonly 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. | 
|  | # NOTE: Different Xcode have different simulated hardware/os support. | 
|  | case "${XCODE_VERSION}" in | 
|  | [6-9].* | 1[0-2].* ) | 
|  | echo "ERROR: Xcode 13.3.1 or higher is required." 1>&2 | 
|  | exit 11 | 
|  | ;; | 
|  | 13.* | 14.*) | 
|  | XCODEBUILD_TEST_BASE_IOS+=( | 
|  | -destination "platform=iOS Simulator,name=iPhone 13,OS=latest" | 
|  | ) | 
|  | ;; | 
|  | * ) | 
|  | 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 || true | 
|  | fi | 
|  | if [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then | 
|  | XCODEBUILD_TEST_BASE_OSX=( | 
|  | "${XCODEBUILD}" | 
|  | -project objectivec/ProtocolBuffers_OSX.xcodeproj | 
|  | -scheme ProtocolBuffers | 
|  | -destination "platform=macOS" | 
|  | ) | 
|  | if [[ "${XCODE_QUIET}" == "yes" ]] ; then | 
|  | XCODEBUILD_TEST_BASE_OSX+=( -quiet ) | 
|  | fi | 
|  | case "${XCODE_VERSION}" in | 
|  | [6-9].* | 1[0-2].* ) | 
|  | echo "ERROR: Xcode 13.3.1 or higher is required." 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 | 
|  | fi | 
|  | fi | 
|  | if [[ "${DO_XCODE_TVOS_TESTS}" == "yes" ]] ; then | 
|  | XCODEBUILD_TEST_BASE_TVOS=( | 
|  | "${XCODEBUILD}" | 
|  | -project objectivec/ProtocolBuffers_tvOS.xcodeproj | 
|  | -scheme ProtocolBuffers | 
|  | ) | 
|  | case "${XCODE_VERSION}" in | 
|  | [6-9].* | 1[0-2].* ) | 
|  | echo "ERROR: Xcode 13.3.1 or higher is required." 1>&2 | 
|  | exit 11 | 
|  | ;; | 
|  | 13.* | 14.*) | 
|  | XCODEBUILD_TEST_BASE_TVOS+=( | 
|  | -destination "platform=tvOS Simulator,name=Apple TV 4K (2nd generation),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 | 
|  | fi | 
|  | fi | 
|  |  | 
|  | if [[ "${DO_OBJC_CONFORMANCE_TESTS}" == "yes" ]] ; then | 
|  | header "Running ObjC Conformance Tests" | 
|  | ${BazelBin} test //objectivec:conformance_test $BazelFlags | 
|  | fi | 
|  |  | 
|  | echo "" | 
|  | echo "$(basename "${0}"): Success!" |