xref: /aosp_15_r20/external/protobuf/objectivec/DevTools/full_mac_build.sh (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker#!/bin/bash
2*1b3f573fSAndroid Build Coastguard Worker#
3*1b3f573fSAndroid Build Coastguard Worker# Helper to do build so you don't have to remember all the steps/args.
4*1b3f573fSAndroid Build Coastguard Worker
5*1b3f573fSAndroid Build Coastguard Worker
6*1b3f573fSAndroid Build Coastguard Workerset -eu
7*1b3f573fSAndroid Build Coastguard Worker
8*1b3f573fSAndroid Build Coastguard Worker# Some base locations.
9*1b3f573fSAndroid Build Coastguard Workerreadonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")")
10*1b3f573fSAndroid Build Coastguard Workerreadonly ProtoRootDir="${ScriptDir}/../.."
11*1b3f573fSAndroid Build Coastguard Worker
12*1b3f573fSAndroid Build Coastguard WorkerprintUsage() {
13*1b3f573fSAndroid Build Coastguard Worker  NAME=$(basename "${0}")
14*1b3f573fSAndroid Build Coastguard Worker  cat << EOF
15*1b3f573fSAndroid Build Coastguard Workerusage: ${NAME} [OPTIONS]
16*1b3f573fSAndroid Build Coastguard Worker
17*1b3f573fSAndroid Build Coastguard WorkerThis script does the common build steps needed.
18*1b3f573fSAndroid Build Coastguard Worker
19*1b3f573fSAndroid Build Coastguard WorkerOPTIONS:
20*1b3f573fSAndroid Build Coastguard Worker
21*1b3f573fSAndroid Build Coastguard Worker General:
22*1b3f573fSAndroid Build Coastguard Worker
23*1b3f573fSAndroid Build Coastguard Worker   -h, --help
24*1b3f573fSAndroid Build Coastguard Worker         Show this message
25*1b3f573fSAndroid Build Coastguard Worker   -c, --clean
26*1b3f573fSAndroid Build Coastguard Worker         Issue a clean before the normal build.
27*1b3f573fSAndroid Build Coastguard Worker   -a, --autogen
28*1b3f573fSAndroid Build Coastguard Worker         Start by rerunning autogen & configure.
29*1b3f573fSAndroid Build Coastguard Worker   -r, --regenerate-descriptors
30*1b3f573fSAndroid Build Coastguard Worker         Run generate_descriptor_proto.sh to regenerate all the checked in
31*1b3f573fSAndroid Build Coastguard Worker         proto sources.
32*1b3f573fSAndroid Build Coastguard Worker   -j #, --jobs #
33*1b3f573fSAndroid Build Coastguard Worker         Force the number of parallel jobs (useful for debugging build issues).
34*1b3f573fSAndroid Build Coastguard Worker   --core-only
35*1b3f573fSAndroid Build Coastguard Worker         Skip some of the core protobuf build/checks to shorten the build time.
36*1b3f573fSAndroid Build Coastguard Worker   --skip-xcode
37*1b3f573fSAndroid Build Coastguard Worker         Skip the invoke of Xcode to test the runtime on both iOS and OS X.
38*1b3f573fSAndroid Build Coastguard Worker   --skip-xcode-ios
39*1b3f573fSAndroid Build Coastguard Worker         Skip the invoke of Xcode to test the runtime on iOS.
40*1b3f573fSAndroid Build Coastguard Worker   --skip-xcode-debug
41*1b3f573fSAndroid Build Coastguard Worker         Skip the Xcode Debug configuration.
42*1b3f573fSAndroid Build Coastguard Worker   --skip-xcode-release
43*1b3f573fSAndroid Build Coastguard Worker         Skip the Xcode Release configuration.
44*1b3f573fSAndroid Build Coastguard Worker   --skip-xcode-osx | --skip-xcode-macos
45*1b3f573fSAndroid Build Coastguard Worker         Skip the invoke of Xcode to test the runtime on OS X.
46*1b3f573fSAndroid Build Coastguard Worker   --skip-xcode-tvos
47*1b3f573fSAndroid Build Coastguard Worker         Skip the invoke of Xcode to test the runtime on tvOS.
48*1b3f573fSAndroid Build Coastguard Worker   --skip-objc-conformance
49*1b3f573fSAndroid Build Coastguard Worker         Skip the Objective C conformance tests (run on OS X).
50*1b3f573fSAndroid Build Coastguard Worker   --xcode-quiet
51*1b3f573fSAndroid Build Coastguard Worker         Pass -quiet to xcodebuild.
52*1b3f573fSAndroid Build Coastguard Worker
53*1b3f573fSAndroid Build Coastguard WorkerEOF
54*1b3f573fSAndroid Build Coastguard Worker}
55*1b3f573fSAndroid Build Coastguard Worker
56*1b3f573fSAndroid Build Coastguard Workerheader() {
57*1b3f573fSAndroid Build Coastguard Worker  echo ""
58*1b3f573fSAndroid Build Coastguard Worker  echo "========================================================================"
59*1b3f573fSAndroid Build Coastguard Worker  echo "    ${@}"
60*1b3f573fSAndroid Build Coastguard Worker  echo "========================================================================"
61*1b3f573fSAndroid Build Coastguard Worker}
62*1b3f573fSAndroid Build Coastguard Worker
63*1b3f573fSAndroid Build Coastguard Worker# Thanks to libtool, builds can fail in odd ways and since it eats some output
64*1b3f573fSAndroid Build Coastguard Worker# it can be hard to spot, so force error output if make exits with a non zero.
65*1b3f573fSAndroid Build Coastguard Workerwrapped_make() {
66*1b3f573fSAndroid Build Coastguard Worker  set +e  # Don't stop if the command fails.
67*1b3f573fSAndroid Build Coastguard Worker  make $*
68*1b3f573fSAndroid Build Coastguard Worker  MAKE_EXIT_STATUS=$?
69*1b3f573fSAndroid Build Coastguard Worker  if [ ${MAKE_EXIT_STATUS} -ne 0 ]; then
70*1b3f573fSAndroid Build Coastguard Worker    echo "Error: 'make $*' exited with status ${MAKE_EXIT_STATUS}"
71*1b3f573fSAndroid Build Coastguard Worker    exit ${MAKE_EXIT_STATUS}
72*1b3f573fSAndroid Build Coastguard Worker  fi
73*1b3f573fSAndroid Build Coastguard Worker  set -e
74*1b3f573fSAndroid Build Coastguard Worker}
75*1b3f573fSAndroid Build Coastguard Worker
76*1b3f573fSAndroid Build Coastguard WorkerNUM_MAKE_JOBS=$(/usr/sbin/sysctl -n hw.ncpu)
77*1b3f573fSAndroid Build Coastguard Workerif [[ "${NUM_MAKE_JOBS}" -lt 2 ]] ; then
78*1b3f573fSAndroid Build Coastguard Worker  NUM_MAKE_JOBS=2
79*1b3f573fSAndroid Build Coastguard Workerfi
80*1b3f573fSAndroid Build Coastguard Worker
81*1b3f573fSAndroid Build Coastguard WorkerDO_AUTOGEN=no
82*1b3f573fSAndroid Build Coastguard WorkerDO_CLEAN=no
83*1b3f573fSAndroid Build Coastguard WorkerREGEN_DESCRIPTORS=no
84*1b3f573fSAndroid Build Coastguard WorkerCORE_ONLY=no
85*1b3f573fSAndroid Build Coastguard WorkerDO_XCODE_IOS_TESTS=yes
86*1b3f573fSAndroid Build Coastguard WorkerDO_XCODE_OSX_TESTS=yes
87*1b3f573fSAndroid Build Coastguard WorkerDO_XCODE_TVOS_TESTS=yes
88*1b3f573fSAndroid Build Coastguard WorkerDO_XCODE_DEBUG=yes
89*1b3f573fSAndroid Build Coastguard WorkerDO_XCODE_RELEASE=yes
90*1b3f573fSAndroid Build Coastguard WorkerDO_OBJC_CONFORMANCE_TESTS=yes
91*1b3f573fSAndroid Build Coastguard WorkerXCODE_QUIET=no
92*1b3f573fSAndroid Build Coastguard Workerwhile [[ $# != 0 ]]; do
93*1b3f573fSAndroid Build Coastguard Worker  case "${1}" in
94*1b3f573fSAndroid Build Coastguard Worker    -h | --help )
95*1b3f573fSAndroid Build Coastguard Worker      printUsage
96*1b3f573fSAndroid Build Coastguard Worker      exit 0
97*1b3f573fSAndroid Build Coastguard Worker      ;;
98*1b3f573fSAndroid Build Coastguard Worker    -c | --clean )
99*1b3f573fSAndroid Build Coastguard Worker      DO_CLEAN=yes
100*1b3f573fSAndroid Build Coastguard Worker      ;;
101*1b3f573fSAndroid Build Coastguard Worker    -a | --autogen )
102*1b3f573fSAndroid Build Coastguard Worker      DO_AUTOGEN=yes
103*1b3f573fSAndroid Build Coastguard Worker      ;;
104*1b3f573fSAndroid Build Coastguard Worker    -r | --regenerate-descriptors )
105*1b3f573fSAndroid Build Coastguard Worker      REGEN_DESCRIPTORS=yes
106*1b3f573fSAndroid Build Coastguard Worker      ;;
107*1b3f573fSAndroid Build Coastguard Worker    -j | --jobs )
108*1b3f573fSAndroid Build Coastguard Worker      shift
109*1b3f573fSAndroid Build Coastguard Worker      NUM_MAKE_JOBS="${1}"
110*1b3f573fSAndroid Build Coastguard Worker      ;;
111*1b3f573fSAndroid Build Coastguard Worker    --core-only )
112*1b3f573fSAndroid Build Coastguard Worker      CORE_ONLY=yes
113*1b3f573fSAndroid Build Coastguard Worker      ;;
114*1b3f573fSAndroid Build Coastguard Worker    --skip-xcode )
115*1b3f573fSAndroid Build Coastguard Worker      DO_XCODE_IOS_TESTS=no
116*1b3f573fSAndroid Build Coastguard Worker      DO_XCODE_OSX_TESTS=no
117*1b3f573fSAndroid Build Coastguard Worker      DO_XCODE_TVOS_TESTS=no
118*1b3f573fSAndroid Build Coastguard Worker      ;;
119*1b3f573fSAndroid Build Coastguard Worker    --skip-xcode-ios )
120*1b3f573fSAndroid Build Coastguard Worker      DO_XCODE_IOS_TESTS=no
121*1b3f573fSAndroid Build Coastguard Worker      ;;
122*1b3f573fSAndroid Build Coastguard Worker    --skip-xcode-osx | --skip-xcode-macos)
123*1b3f573fSAndroid Build Coastguard Worker      DO_XCODE_OSX_TESTS=no
124*1b3f573fSAndroid Build Coastguard Worker      ;;
125*1b3f573fSAndroid Build Coastguard Worker    --skip-xcode-tvos )
126*1b3f573fSAndroid Build Coastguard Worker      DO_XCODE_TVOS_TESTS=no
127*1b3f573fSAndroid Build Coastguard Worker      ;;
128*1b3f573fSAndroid Build Coastguard Worker    --skip-xcode-debug )
129*1b3f573fSAndroid Build Coastguard Worker      DO_XCODE_DEBUG=no
130*1b3f573fSAndroid Build Coastguard Worker      ;;
131*1b3f573fSAndroid Build Coastguard Worker    --skip-xcode-release )
132*1b3f573fSAndroid Build Coastguard Worker      DO_XCODE_RELEASE=no
133*1b3f573fSAndroid Build Coastguard Worker      ;;
134*1b3f573fSAndroid Build Coastguard Worker    --skip-objc-conformance )
135*1b3f573fSAndroid Build Coastguard Worker      DO_OBJC_CONFORMANCE_TESTS=no
136*1b3f573fSAndroid Build Coastguard Worker      ;;
137*1b3f573fSAndroid Build Coastguard Worker    --xcode-quiet )
138*1b3f573fSAndroid Build Coastguard Worker      XCODE_QUIET=yes
139*1b3f573fSAndroid Build Coastguard Worker      ;;
140*1b3f573fSAndroid Build Coastguard Worker    -*)
141*1b3f573fSAndroid Build Coastguard Worker      echo "ERROR: Unknown option: ${1}" 1>&2
142*1b3f573fSAndroid Build Coastguard Worker      printUsage
143*1b3f573fSAndroid Build Coastguard Worker      exit 1
144*1b3f573fSAndroid Build Coastguard Worker      ;;
145*1b3f573fSAndroid Build Coastguard Worker    *)
146*1b3f573fSAndroid Build Coastguard Worker      echo "ERROR: Unknown argument: ${1}" 1>&2
147*1b3f573fSAndroid Build Coastguard Worker      printUsage
148*1b3f573fSAndroid Build Coastguard Worker      exit 1
149*1b3f573fSAndroid Build Coastguard Worker      ;;
150*1b3f573fSAndroid Build Coastguard Worker  esac
151*1b3f573fSAndroid Build Coastguard Worker  shift
152*1b3f573fSAndroid Build Coastguard Workerdone
153*1b3f573fSAndroid Build Coastguard Worker
154*1b3f573fSAndroid Build Coastguard Worker# Into the proto dir.
155*1b3f573fSAndroid Build Coastguard Workercd "${ProtoRootDir}"
156*1b3f573fSAndroid Build Coastguard Worker
157*1b3f573fSAndroid Build Coastguard Worker# if no Makefile, force the autogen.
158*1b3f573fSAndroid Build Coastguard Workerif [[ ! -f Makefile ]] ; then
159*1b3f573fSAndroid Build Coastguard Worker  DO_AUTOGEN=yes
160*1b3f573fSAndroid Build Coastguard Workerfi
161*1b3f573fSAndroid Build Coastguard Worker
162*1b3f573fSAndroid Build Coastguard Workerif [[ "${DO_AUTOGEN}" == "yes" ]] ; then
163*1b3f573fSAndroid Build Coastguard Worker  header "Running autogen & configure"
164*1b3f573fSAndroid Build Coastguard Worker  ./autogen.sh
165*1b3f573fSAndroid Build Coastguard Worker  ./configure \
166*1b3f573fSAndroid Build Coastguard Worker    CPPFLAGS="-mmacosx-version-min=10.9 -Wunused-const-variable -Wunused-function"
167*1b3f573fSAndroid Build Coastguard Workerfi
168*1b3f573fSAndroid Build Coastguard Worker
169*1b3f573fSAndroid Build Coastguard Workerif [[ "${DO_CLEAN}" == "yes" ]] ; then
170*1b3f573fSAndroid Build Coastguard Worker  header "Cleaning"
171*1b3f573fSAndroid Build Coastguard Worker  wrapped_make clean
172*1b3f573fSAndroid Build Coastguard Worker  if [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then
173*1b3f573fSAndroid Build Coastguard Worker    XCODEBUILD_CLEAN_BASE_IOS=(
174*1b3f573fSAndroid Build Coastguard Worker      xcodebuild
175*1b3f573fSAndroid Build Coastguard Worker        -project objectivec/ProtocolBuffers_iOS.xcodeproj
176*1b3f573fSAndroid Build Coastguard Worker        -scheme ProtocolBuffers
177*1b3f573fSAndroid Build Coastguard Worker    )
178*1b3f573fSAndroid Build Coastguard Worker    if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
179*1b3f573fSAndroid Build Coastguard Worker      "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Debug clean
180*1b3f573fSAndroid Build Coastguard Worker    fi
181*1b3f573fSAndroid Build Coastguard Worker    if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
182*1b3f573fSAndroid Build Coastguard Worker      "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Release clean
183*1b3f573fSAndroid Build Coastguard Worker    fi
184*1b3f573fSAndroid Build Coastguard Worker  fi
185*1b3f573fSAndroid Build Coastguard Worker  if [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then
186*1b3f573fSAndroid Build Coastguard Worker    XCODEBUILD_CLEAN_BASE_OSX=(
187*1b3f573fSAndroid Build Coastguard Worker      xcodebuild
188*1b3f573fSAndroid Build Coastguard Worker        -project objectivec/ProtocolBuffers_OSX.xcodeproj
189*1b3f573fSAndroid Build Coastguard Worker        -scheme ProtocolBuffers
190*1b3f573fSAndroid Build Coastguard Worker    )
191*1b3f573fSAndroid Build Coastguard Worker    if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
192*1b3f573fSAndroid Build Coastguard Worker      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Debug clean
193*1b3f573fSAndroid Build Coastguard Worker    fi
194*1b3f573fSAndroid Build Coastguard Worker    if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
195*1b3f573fSAndroid Build Coastguard Worker      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Release clean
196*1b3f573fSAndroid Build Coastguard Worker    fi
197*1b3f573fSAndroid Build Coastguard Worker  fi
198*1b3f573fSAndroid Build Coastguard Worker  if [[ "${DO_XCODE_TVOS_TESTS}" == "yes" ]] ; then
199*1b3f573fSAndroid Build Coastguard Worker    XCODEBUILD_CLEAN_BASE_OSX=(
200*1b3f573fSAndroid Build Coastguard Worker      xcodebuild
201*1b3f573fSAndroid Build Coastguard Worker        -project objectivec/ProtocolBuffers_tvOS.xcodeproj
202*1b3f573fSAndroid Build Coastguard Worker        -scheme ProtocolBuffers
203*1b3f573fSAndroid Build Coastguard Worker    )
204*1b3f573fSAndroid Build Coastguard Worker    if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
205*1b3f573fSAndroid Build Coastguard Worker      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Debug clean
206*1b3f573fSAndroid Build Coastguard Worker    fi
207*1b3f573fSAndroid Build Coastguard Worker    if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
208*1b3f573fSAndroid Build Coastguard Worker      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Release clean
209*1b3f573fSAndroid Build Coastguard Worker    fi
210*1b3f573fSAndroid Build Coastguard Worker  fi
211*1b3f573fSAndroid Build Coastguard Workerfi
212*1b3f573fSAndroid Build Coastguard Worker
213*1b3f573fSAndroid Build Coastguard Workerif [[ "${REGEN_DESCRIPTORS}" == "yes" ]] ; then
214*1b3f573fSAndroid Build Coastguard Worker  header "Regenerating the descriptor sources."
215*1b3f573fSAndroid Build Coastguard Worker  ./generate_descriptor_proto.sh -j "${NUM_MAKE_JOBS}"
216*1b3f573fSAndroid Build Coastguard Workerfi
217*1b3f573fSAndroid Build Coastguard Worker
218*1b3f573fSAndroid Build Coastguard Workerif [[ "${CORE_ONLY}" == "yes" ]] ; then
219*1b3f573fSAndroid Build Coastguard Worker  header "Building core Only"
220*1b3f573fSAndroid Build Coastguard Worker  wrapped_make -j "${NUM_MAKE_JOBS}"
221*1b3f573fSAndroid Build Coastguard Workerelse
222*1b3f573fSAndroid Build Coastguard Worker  header "Building"
223*1b3f573fSAndroid Build Coastguard Worker  # Can't issue these together, when fully parallel, something sometimes chokes
224*1b3f573fSAndroid Build Coastguard Worker  # at random.
225*1b3f573fSAndroid Build Coastguard Worker  wrapped_make -j "${NUM_MAKE_JOBS}" all
226*1b3f573fSAndroid Build Coastguard Worker  wrapped_make -j "${NUM_MAKE_JOBS}" check
227*1b3f573fSAndroid Build Coastguard Worker  # Fire off the conformance tests also.
228*1b3f573fSAndroid Build Coastguard Worker  cd conformance
229*1b3f573fSAndroid Build Coastguard Worker  wrapped_make -j "${NUM_MAKE_JOBS}" test_cpp
230*1b3f573fSAndroid Build Coastguard Worker  cd ..
231*1b3f573fSAndroid Build Coastguard Workerfi
232*1b3f573fSAndroid Build Coastguard Worker
233*1b3f573fSAndroid Build Coastguard Worker# Ensure the WKT sources checked in are current.
234*1b3f573fSAndroid Build Coastguard Workerobjectivec/generate_well_known_types.sh --check-only -j "${NUM_MAKE_JOBS}"
235*1b3f573fSAndroid Build Coastguard Worker
236*1b3f573fSAndroid Build Coastguard Workerheader "Checking on the ObjC Runtime Code"
237*1b3f573fSAndroid Build Coastguard Worker# Some of the kokoro machines don't have python3 yet, so fall back to python if need be.
238*1b3f573fSAndroid Build Coastguard Workerif hash python3 >/dev/null 2>&1 ; then
239*1b3f573fSAndroid Build Coastguard Worker  LOCAL_PYTHON=python3
240*1b3f573fSAndroid Build Coastguard Workerelse
241*1b3f573fSAndroid Build Coastguard Worker  LOCAL_PYTHON=python
242*1b3f573fSAndroid Build Coastguard Workerfi
243*1b3f573fSAndroid Build Coastguard Worker"${LOCAL_PYTHON}" objectivec/DevTools/pddm_tests.py
244*1b3f573fSAndroid Build Coastguard Workerif ! "${LOCAL_PYTHON}" objectivec/DevTools/pddm.py --dry-run objectivec/*.[hm] objectivec/Tests/*.[hm] ; then
245*1b3f573fSAndroid Build Coastguard Worker  echo ""
246*1b3f573fSAndroid Build Coastguard Worker  echo "Update by running:"
247*1b3f573fSAndroid Build Coastguard Worker  echo "   objectivec/DevTools/pddm.py objectivec/*.[hm] objectivec/Tests/*.[hm]"
248*1b3f573fSAndroid Build Coastguard Worker  exit 1
249*1b3f573fSAndroid Build Coastguard Workerfi
250*1b3f573fSAndroid Build Coastguard Worker
251*1b3f573fSAndroid Build Coastguard Workerreadonly XCODE_VERSION_LINE="$(xcodebuild -version | grep Xcode\  )"
252*1b3f573fSAndroid Build Coastguard Workerreadonly XCODE_VERSION="${XCODE_VERSION_LINE/Xcode /}"  # drop the prefix.
253*1b3f573fSAndroid Build Coastguard Worker
254*1b3f573fSAndroid Build Coastguard Workerif [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then
255*1b3f573fSAndroid Build Coastguard Worker  XCODEBUILD_TEST_BASE_IOS=(
256*1b3f573fSAndroid Build Coastguard Worker    xcodebuild
257*1b3f573fSAndroid Build Coastguard Worker      -project objectivec/ProtocolBuffers_iOS.xcodeproj
258*1b3f573fSAndroid Build Coastguard Worker      -scheme ProtocolBuffers
259*1b3f573fSAndroid Build Coastguard Worker  )
260*1b3f573fSAndroid Build Coastguard Worker  if [[ "${XCODE_QUIET}" == "yes" ]] ; then
261*1b3f573fSAndroid Build Coastguard Worker    XCODEBUILD_TEST_BASE_IOS+=( -quiet )
262*1b3f573fSAndroid Build Coastguard Worker  fi
263*1b3f573fSAndroid Build Coastguard Worker  # Don't need to worry about form factors or retina/non retina;
264*1b3f573fSAndroid Build Coastguard Worker  # just pick a mix of OS Versions and 32/64 bit.
265*1b3f573fSAndroid Build Coastguard Worker  # NOTE: Different Xcode have different simulated hardware/os support.
266*1b3f573fSAndroid Build Coastguard Worker  case "${XCODE_VERSION}" in
267*1b3f573fSAndroid Build Coastguard Worker    [6-8].* )
268*1b3f573fSAndroid Build Coastguard Worker      echo "ERROR: The unittests include Swift code that is now Swift 4.0." 1>&2
269*1b3f573fSAndroid Build Coastguard Worker      echo "ERROR: Xcode 9.0 or higher is required to build the test suite, but the library works with Xcode 7.x." 1>&2
270*1b3f573fSAndroid Build Coastguard Worker      exit 11
271*1b3f573fSAndroid Build Coastguard Worker      ;;
272*1b3f573fSAndroid Build Coastguard Worker    9.[0-2]* )
273*1b3f573fSAndroid Build Coastguard Worker      XCODEBUILD_TEST_BASE_IOS+=(
274*1b3f573fSAndroid Build Coastguard Worker          -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
275*1b3f573fSAndroid Build Coastguard Worker          -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit
276*1b3f573fSAndroid Build Coastguard Worker          # 9.0-9.2 all seem to often fail running destinations in parallel
277*1b3f573fSAndroid Build Coastguard Worker          -disable-concurrent-testing
278*1b3f573fSAndroid Build Coastguard Worker      )
279*1b3f573fSAndroid Build Coastguard Worker      ;;
280*1b3f573fSAndroid Build Coastguard Worker    9.[3-4]* )
281*1b3f573fSAndroid Build Coastguard Worker      XCODEBUILD_TEST_BASE_IOS+=(
282*1b3f573fSAndroid Build Coastguard Worker          # Xcode 9.3 chokes targeting iOS 8.x - http://www.openradar.me/39335367
283*1b3f573fSAndroid Build Coastguard Worker          -destination "platform=iOS Simulator,name=iPhone 4s,OS=9.0" # 32bit
284*1b3f573fSAndroid Build Coastguard Worker          -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit
285*1b3f573fSAndroid Build Coastguard Worker          # 9.3 also seems to often fail running destinations in parallel
286*1b3f573fSAndroid Build Coastguard Worker          -disable-concurrent-testing
287*1b3f573fSAndroid Build Coastguard Worker      )
288*1b3f573fSAndroid Build Coastguard Worker      ;;
289*1b3f573fSAndroid Build Coastguard Worker    10.*)
290*1b3f573fSAndroid Build Coastguard Worker      XCODEBUILD_TEST_BASE_IOS+=(
291*1b3f573fSAndroid Build Coastguard Worker          -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
292*1b3f573fSAndroid Build Coastguard Worker          -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit
293*1b3f573fSAndroid Build Coastguard Worker          # 10.x also seems to often fail running destinations in parallel (with
294*1b3f573fSAndroid Build Coastguard Worker          # 32bit one include at least)
295*1b3f573fSAndroid Build Coastguard Worker          -disable-concurrent-destination-testing
296*1b3f573fSAndroid Build Coastguard Worker      )
297*1b3f573fSAndroid Build Coastguard Worker      ;;
298*1b3f573fSAndroid Build Coastguard Worker    11.* | 12.* | 13.* | 14.*)
299*1b3f573fSAndroid Build Coastguard Worker      # Dropped 32bit as Apple doesn't seem support the simulators either.
300*1b3f573fSAndroid Build Coastguard Worker      XCODEBUILD_TEST_BASE_IOS+=(
301*1b3f573fSAndroid Build Coastguard Worker          -destination "platform=iOS Simulator,name=iPhone 8,OS=latest" # 64bit
302*1b3f573fSAndroid Build Coastguard Worker      )
303*1b3f573fSAndroid Build Coastguard Worker      ;;
304*1b3f573fSAndroid Build Coastguard Worker    * )
305*1b3f573fSAndroid Build Coastguard Worker      echo ""
306*1b3f573fSAndroid Build Coastguard Worker      echo "ATTENTION: Time to update the simulator targets for Xcode ${XCODE_VERSION}"
307*1b3f573fSAndroid Build Coastguard Worker      echo ""
308*1b3f573fSAndroid Build Coastguard Worker      echo "ERROR: Build aborted!"
309*1b3f573fSAndroid Build Coastguard Worker      exit 2
310*1b3f573fSAndroid Build Coastguard Worker      ;;
311*1b3f573fSAndroid Build Coastguard Worker  esac
312*1b3f573fSAndroid Build Coastguard Worker  if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
313*1b3f573fSAndroid Build Coastguard Worker    header "Doing Xcode iOS build/tests - Debug"
314*1b3f573fSAndroid Build Coastguard Worker    "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Debug test
315*1b3f573fSAndroid Build Coastguard Worker  fi
316*1b3f573fSAndroid Build Coastguard Worker  if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
317*1b3f573fSAndroid Build Coastguard Worker    header "Doing Xcode iOS build/tests - Release"
318*1b3f573fSAndroid Build Coastguard Worker    "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Release test
319*1b3f573fSAndroid Build Coastguard Worker  fi
320*1b3f573fSAndroid Build Coastguard Worker  # Don't leave the simulator in the developer's face.
321*1b3f573fSAndroid Build Coastguard Worker  killall Simulator 2> /dev/null || true
322*1b3f573fSAndroid Build Coastguard Workerfi
323*1b3f573fSAndroid Build Coastguard Workerif [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then
324*1b3f573fSAndroid Build Coastguard Worker  XCODEBUILD_TEST_BASE_OSX=(
325*1b3f573fSAndroid Build Coastguard Worker    xcodebuild
326*1b3f573fSAndroid Build Coastguard Worker      -project objectivec/ProtocolBuffers_OSX.xcodeproj
327*1b3f573fSAndroid Build Coastguard Worker      -scheme ProtocolBuffers
328*1b3f573fSAndroid Build Coastguard Worker      # Since the ObjC 2.0 Runtime is required, 32bit OS X isn't supported.
329*1b3f573fSAndroid Build Coastguard Worker      -destination "platform=OS X,arch=x86_64" # 64bit
330*1b3f573fSAndroid Build Coastguard Worker  )
331*1b3f573fSAndroid Build Coastguard Worker  if [[ "${XCODE_QUIET}" == "yes" ]] ; then
332*1b3f573fSAndroid Build Coastguard Worker    XCODEBUILD_TEST_BASE_OSX+=( -quiet )
333*1b3f573fSAndroid Build Coastguard Worker  fi
334*1b3f573fSAndroid Build Coastguard Worker  case "${XCODE_VERSION}" in
335*1b3f573fSAndroid Build Coastguard Worker    [6-8].* )
336*1b3f573fSAndroid Build Coastguard Worker      echo "ERROR: The unittests include Swift code that is now Swift 4.0." 1>&2
337*1b3f573fSAndroid Build Coastguard Worker      echo "ERROR: Xcode 9.0 or higher is required to build the test suite, but the library works with Xcode 7.x." 1>&2
338*1b3f573fSAndroid Build Coastguard Worker      exit 11
339*1b3f573fSAndroid Build Coastguard Worker      ;;
340*1b3f573fSAndroid Build Coastguard Worker  esac
341*1b3f573fSAndroid Build Coastguard Worker  if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
342*1b3f573fSAndroid Build Coastguard Worker    header "Doing Xcode OS X build/tests - Debug"
343*1b3f573fSAndroid Build Coastguard Worker    "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Debug test
344*1b3f573fSAndroid Build Coastguard Worker  fi
345*1b3f573fSAndroid Build Coastguard Worker  if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
346*1b3f573fSAndroid Build Coastguard Worker    header "Doing Xcode OS X build/tests - Release"
347*1b3f573fSAndroid Build Coastguard Worker    "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Release test
348*1b3f573fSAndroid Build Coastguard Worker  fi
349*1b3f573fSAndroid Build Coastguard Workerfi
350*1b3f573fSAndroid Build Coastguard Workerif [[ "${DO_XCODE_TVOS_TESTS}" == "yes" ]] ; then
351*1b3f573fSAndroid Build Coastguard Worker  XCODEBUILD_TEST_BASE_TVOS=(
352*1b3f573fSAndroid Build Coastguard Worker    xcodebuild
353*1b3f573fSAndroid Build Coastguard Worker      -project objectivec/ProtocolBuffers_tvOS.xcodeproj
354*1b3f573fSAndroid Build Coastguard Worker      -scheme ProtocolBuffers
355*1b3f573fSAndroid Build Coastguard Worker  )
356*1b3f573fSAndroid Build Coastguard Worker  case "${XCODE_VERSION}" in
357*1b3f573fSAndroid Build Coastguard Worker    [6-9].* )
358*1b3f573fSAndroid Build Coastguard Worker      echo "ERROR: Xcode 10.0 or higher is required to build the test suite." 1>&2
359*1b3f573fSAndroid Build Coastguard Worker      exit 11
360*1b3f573fSAndroid Build Coastguard Worker      ;;
361*1b3f573fSAndroid Build Coastguard Worker    10.* | 11.* | 12.*)
362*1b3f573fSAndroid Build Coastguard Worker      XCODEBUILD_TEST_BASE_TVOS+=(
363*1b3f573fSAndroid Build Coastguard Worker        -destination "platform=tvOS Simulator,name=Apple TV 4K,OS=latest"
364*1b3f573fSAndroid Build Coastguard Worker      )
365*1b3f573fSAndroid Build Coastguard Worker      ;;
366*1b3f573fSAndroid Build Coastguard Worker    13.* | 14.*)
367*1b3f573fSAndroid Build Coastguard Worker      XCODEBUILD_TEST_BASE_TVOS+=(
368*1b3f573fSAndroid Build Coastguard Worker        -destination "platform=tvOS Simulator,name=Apple TV 4K (2nd generation),OS=latest"
369*1b3f573fSAndroid Build Coastguard Worker      )
370*1b3f573fSAndroid Build Coastguard Worker      ;;
371*1b3f573fSAndroid Build Coastguard Worker    * )
372*1b3f573fSAndroid Build Coastguard Worker      echo ""
373*1b3f573fSAndroid Build Coastguard Worker      echo "ATTENTION: Time to update the simulator targets for Xcode ${XCODE_VERSION}"
374*1b3f573fSAndroid Build Coastguard Worker      echo ""
375*1b3f573fSAndroid Build Coastguard Worker      echo "ERROR: Build aborted!"
376*1b3f573fSAndroid Build Coastguard Worker      exit 2
377*1b3f573fSAndroid Build Coastguard Worker      ;;
378*1b3f573fSAndroid Build Coastguard Worker  esac
379*1b3f573fSAndroid Build Coastguard Worker  if [[ "${XCODE_QUIET}" == "yes" ]] ; then
380*1b3f573fSAndroid Build Coastguard Worker    XCODEBUILD_TEST_BASE_TVOS+=( -quiet )
381*1b3f573fSAndroid Build Coastguard Worker  fi
382*1b3f573fSAndroid Build Coastguard Worker  if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
383*1b3f573fSAndroid Build Coastguard Worker    header "Doing Xcode tvOS build/tests - Debug"
384*1b3f573fSAndroid Build Coastguard Worker    "${XCODEBUILD_TEST_BASE_TVOS[@]}" -configuration Debug test
385*1b3f573fSAndroid Build Coastguard Worker  fi
386*1b3f573fSAndroid Build Coastguard Worker  if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
387*1b3f573fSAndroid Build Coastguard Worker    header "Doing Xcode tvOS build/tests - Release"
388*1b3f573fSAndroid Build Coastguard Worker    "${XCODEBUILD_TEST_BASE_TVOS[@]}" -configuration Release test
389*1b3f573fSAndroid Build Coastguard Worker  fi
390*1b3f573fSAndroid Build Coastguard Workerfi
391*1b3f573fSAndroid Build Coastguard Worker
392*1b3f573fSAndroid Build Coastguard Workerif [[ "${DO_OBJC_CONFORMANCE_TESTS}" == "yes" ]] ; then
393*1b3f573fSAndroid Build Coastguard Worker  header "Running ObjC Conformance Tests"
394*1b3f573fSAndroid Build Coastguard Worker  cd conformance
395*1b3f573fSAndroid Build Coastguard Worker  wrapped_make -j "${NUM_MAKE_JOBS}" test_objc
396*1b3f573fSAndroid Build Coastguard Worker  cd ..
397*1b3f573fSAndroid Build Coastguard Workerfi
398*1b3f573fSAndroid Build Coastguard Worker
399*1b3f573fSAndroid Build Coastguard Workerecho ""
400*1b3f573fSAndroid Build Coastguard Workerecho "$(basename "${0}"): Success!"
401