#!/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="--announce_rc --macos_minimum_os=10.9 \ $(${ScriptDir}/../../kokoro/common/bazel_flags.sh)" # 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. -r, --regenerate-descriptors Run generate_descriptor_proto.sh to regenerate all the checked in proto sources. --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 "========================================================================" } BAZEL=bazel DO_CLEAN=no REGEN_DESCRIPTORS=no CORE_ONLY=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 ;; -r | --regenerate-descriptors ) REGEN_DESCRIPTORS=yes ;; --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 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 [[ "${REGEN_DESCRIPTORS}" == "yes" ]] ; then header "Regenerating the descriptor sources." ./generate_descriptor_proto.sh fi if [[ "${CORE_ONLY}" == "yes" ]] ; then header "Building core Only" "${BazelBin}" build //:protoc //:protobuf //:protobuf_lite $BazelFlags else header "Building" # Can't issue these together, when fully parallel, something sometimes chokes # at random. "${BazelBin}" test //src/... $BazelFlags fi # Ensure the WKT sources checked in are current. BAZEL="${BazelBin}" objectivec/generate_well_known_types.sh --check-only $BazelFlags header "Checking on the ObjC Runtime Code" # Some of the kokoro machines don't have python3 yet, so fall back to python if need be. if hash python3 >/dev/null 2>&1 ; then LOCAL_PYTHON=python3 else LOCAL_PYTHON=python fi "${LOCAL_PYTHON}" objectivec/DevTools/pddm_tests.py if ! "${LOCAL_PYTHON}" 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 1 fi 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; # 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-9].* | 1[0-2].* ) echo "ERROR: Xcode 13.3.1 or higher is required." 1>&2 exit 11 ;; 13.* | 14.*) # 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 || true fi if [[ "${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-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!"