#!/usr/bin/env bash # Copyright 2018 Google # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # USAGE: build.sh product [platform] [method] # # Builds the given product for the given platform using the given build method function pod_gen() { # Call pod gen with a podspec and additional optional arguments. bundle exec pod gen --local-sources=./ --sources=https://github.com/firebase/SpecsStaging.git,https://cdn.cocoapods.org/ "$@" } set -euo pipefail if [[ $# -lt 1 ]]; then cat 1>&2 <&2 sleep 5 result=0 xcodebuild "$@" | tee xcodebuild.log | "${xcpretty_cmd[@]}" || result=$? fi if [[ $result != 0 ]]; then echo "xcodebuild exited with $result" 1>&2 ExportLogs "$@" return $result fi } # Exports any logs output captured in the xcresult function ExportLogs() { python "${scripts_dir}/xcresult_logs.py" "$@" } if [[ "$xcode_major" -lt 11 ]]; then ios_flags=( -sdk 'iphonesimulator' -destination 'platform=iOS Simulator,name=iPhone 7' ) else ios_flags=( -sdk 'iphonesimulator' -destination 'platform=iOS Simulator,name=iPhone 11' ) fi ipad_flags=( -sdk 'iphonesimulator' -destination 'platform=iOS Simulator,name=iPad Pro (9.7-inch)' ) macos_flags=( -sdk 'macosx' -destination 'platform=OS X,arch=x86_64' ) tvos_flags=( -sdk "appletvsimulator" -destination 'platform=tvOS Simulator,name=Apple TV' ) watchos_flags=( -destination 'platform=iOS Simulator,name=iPhone 11 Pro' ) # Compute standard flags for all platforms case "$platform" in iOS) xcb_flags=("${ios_flags[@]}") gen_platform=ios ;; iPad) xcb_flags=("${ipad_flags[@]}") ;; macOS) xcb_flags=("${macos_flags[@]}") gen_platform=macos ;; tvOS) xcb_flags=("${tvos_flags[@]}") gen_platform=tvos ;; watchOS) xcb_flags=("${watchos_flags[@]}") ;; all) xcb_flags=() ;; Linux) xcb_flags=() ;; *) echo "Unknown platform '$platform'" 1>&2 exit 1 ;; esac xcb_flags+=( ONLY_ACTIVE_ARCH=YES CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=YES COMPILER_INDEX_STORE_ENABLE=NO ) # TODO(varconst): Add --warn-unused-vars and --warn-uninitialized. # Right now, it makes the log overflow on Travis because many of our # dependencies don't build cleanly this way. cmake_options=( -Wdeprecated -DCMAKE_BUILD_TYPE=Debug ) if [[ -n "${SANITIZERS:-}" ]]; then for sanitizer in $SANITIZERS; do case "$sanitizer" in asan) xcb_flags+=( -enableAddressSanitizer YES ) cmake_options+=( -DWITH_ASAN=ON ) ;; tsan) xcb_flags+=( -enableThreadSanitizer YES ) cmake_options+=( -DWITH_TSAN=ON ) ;; ubsan) xcb_flags+=( -enableUndefinedBehaviorSanitizer YES ) cmake_options+=( -DWITH_UBSAN=ON ) ;; *) echo "Unknown sanitizer '$sanitizer'" 1>&2 exit 1 ;; esac done fi case "$product-$platform-$method" in FirebasePod-iOS-*) RunXcodebuild \ -workspace 'CoreOnly/Tests/FirebasePodTest/FirebasePodTest.xcworkspace' \ -scheme "FirebasePodTest" \ "${xcb_flags[@]}" \ build ;; Auth-*-xcodebuild) if check_secrets; then RunXcodebuild \ -workspace 'FirebaseAuth/Tests/Sample/AuthSample.xcworkspace' \ -scheme "Auth_ApiTests" \ "${xcb_flags[@]}" \ build \ test RunXcodebuild \ -workspace 'FirebaseAuth/Tests/Sample/AuthSample.xcworkspace' \ -scheme "SwiftApiTests" \ "${xcb_flags[@]}" \ build \ test fi ;; InAppMessaging-*-xcodebuild) RunXcodebuild \ -workspace 'FirebaseInAppMessaging/Tests/Integration/DefaultUITestApp/InAppMessagingDisplay-Sample.xcworkspace' \ -scheme 'FiamDisplaySwiftExample' \ "${xcb_flags[@]}" \ build \ test ;; Firestore-*-xcodebuild) "${firestore_emulator}" start trap '"${firestore_emulator}" stop' ERR EXIT RunXcodebuild \ -workspace 'Firestore/Example/Firestore.xcworkspace' \ -scheme "Firestore_IntegrationTests_$platform" \ "${xcb_flags[@]}" \ build \ test ;; Firestore-macOS-cmake | Firestore-Linux-cmake) "${firestore_emulator}" start trap '"${firestore_emulator}" stop' ERR EXIT ( test -d build || mkdir build cd build echo "Preparing cmake build ..." cmake -G Ninja "${cmake_options[@]}" .. echo "Building cmake build ..." ninja -k 10 all ctest --output-on-failure ) ;; SymbolCollision-*-*) RunXcodebuild \ -workspace 'SymbolCollisionTest/SymbolCollisionTest.xcworkspace' \ -scheme "SymbolCollisionTest" \ "${xcb_flags[@]}" \ build ;; Messaging-*-xcodebuild) pod_gen FirebaseMessaging.podspec --platforms=ios RunXcodebuild \ -workspace 'gen/FirebaseMessaging/FirebaseMessaging.xcworkspace' \ -scheme "FirebaseMessaging-Unit-unit" \ "${ios_flags[@]}" \ "${xcb_flags[@]}" \ build \ test if check_secrets; then # Integration tests are only run on iOS to minimize flake failures. RunXcodebuild \ -workspace 'gen/FirebaseMessaging/FirebaseMessaging.xcworkspace' \ -scheme "FirebaseMessaging-Unit-integration" \ "${ios_flags[@]}" \ "${xcb_flags[@]}" \ build \ test fi pod_gen FirebaseMessaging.podspec --platforms=macos --clean RunXcodebuild \ -workspace 'gen/FirebaseMessaging/FirebaseMessaging.xcworkspace' \ -scheme "FirebaseMessaging-Unit-unit" \ "${macos_flags[@]}" \ "${xcb_flags[@]}" \ build \ test pod_gen FirebaseMessaging.podspec --platforms=tvos --clean RunXcodebuild \ -workspace 'gen/FirebaseMessaging/FirebaseMessaging.xcworkspace' \ -scheme "FirebaseMessaging-Unit-unit" \ "${tvos_flags[@]}" \ "${xcb_flags[@]}" \ build \ test ;; MessagingSample-*-*) if check_secrets; then RunXcodebuild \ -workspace 'FirebaseMessaging/Apps/Sample/Sample.xcworkspace' \ -scheme "Sample" \ "${xcb_flags[@]}" \ build fi ;; Database-*-unit) pod_gen FirebaseDatabase.podspec --platforms="${gen_platform}" RunXcodebuild \ -workspace 'gen/FirebaseDatabase/FirebaseDatabase.xcworkspace' \ -scheme "FirebaseDatabase-Unit-unit" \ "${xcb_flags[@]}" \ build \ test ;; Database-*-integration) "${database_emulator}" start trap '"${database_emulator}" stop' ERR EXIT pod_gen FirebaseDatabase.podspec --platforms="${gen_platform}" RunXcodebuild \ -workspace 'gen/FirebaseDatabase/FirebaseDatabase.xcworkspace' \ -scheme "FirebaseDatabase-Unit-integration" \ "${xcb_flags[@]}" \ build \ test ;; RemoteConfig-*-unit) pod_gen FirebaseRemoteConfig.podspec --platforms="${gen_platform}" RunXcodebuild \ -workspace 'gen/FirebaseRemoteConfig/FirebaseRemoteConfig.xcworkspace' \ -scheme "FirebaseRemoteConfig-Unit-unit" \ "${xcb_flags[@]}" \ build \ test ;; RemoteConfig-*-fakeconsole) pod_gen FirebaseRemoteConfig.podspec --platforms="${gen_platform}" RunXcodebuild \ -workspace 'gen/FirebaseRemoteConfig/FirebaseRemoteConfig.xcworkspace' \ -scheme "FirebaseRemoteConfig-Unit-fake-console-tests" \ "${xcb_flags[@]}" \ build \ test ;; RemoteConfig-*-integration) pod_gen FirebaseRemoteConfig.podspec --platforms="${gen_platform}" RunXcodebuild \ -workspace 'gen/FirebaseRemoteConfig/FirebaseRemoteConfig.xcworkspace' \ -scheme "FirebaseRemoteConfig-Unit-swift-api-tests" \ "${xcb_flags[@]}" \ build \ test ;; Storage-*-xcodebuild) pod_gen FirebaseStorage.podspec --platforms=ios RunXcodebuild \ -workspace 'gen/FirebaseStorage/FirebaseStorage.xcworkspace' \ -scheme "FirebaseStorage-Unit-unit" \ "${ios_flags[@]}" \ "${xcb_flags[@]}" \ build \ test if check_secrets; then # Integration tests are only run on iOS to minimize flake failures. RunXcodebuild \ -workspace 'gen/FirebaseStorage/FirebaseStorage.xcworkspace' \ -scheme "FirebaseStorage-Unit-integration" \ "${ios_flags[@]}" \ "${xcb_flags[@]}" \ build \ test RunXcodebuild \ -workspace 'gen/FirebaseStorage/FirebaseStorage.xcworkspace' \ -scheme "FirebaseStorage-Unit-swift-integration" \ "${ios_flags[@]}" \ "${xcb_flags[@]}" \ build \ test fi pod_gen FirebaseStorage.podspec --platforms=macos --clean RunXcodebuild \ -workspace 'gen/FirebaseStorage/FirebaseStorage.xcworkspace' \ -scheme "FirebaseStorage-Unit-unit" \ "${macos_flags[@]}" \ "${xcb_flags[@]}" \ build \ test pod_gen FirebaseStorage.podspec --platforms=tvos --clean RunXcodebuild \ -workspace 'gen/FirebaseStorage/FirebaseStorage.xcworkspace' \ -scheme "FirebaseStorage-Unit-unit" \ "${tvos_flags[@]}" \ "${xcb_flags[@]}" \ build \ test ;; StorageSwift-*-xcodebuild) pod_gen FirebaseStorageSwift.podspec --platforms=ios if check_secrets; then # Integration tests are only run on iOS to minimize flake failures. RunXcodebuild \ -workspace 'gen/FirebaseStorageSwift/FirebaseStorageSwift.xcworkspace' \ -scheme "FirebaseStorageSwift-Unit-integration" \ "${ios_flags[@]}" \ "${xcb_flags[@]}" \ build \ test fi ;; GoogleDataTransport-watchOS-xcodebuild) RunXcodebuild \ -workspace 'GoogleDataTransport/GDTWatchOSTestApp/GDTWatchOSTestApp.xcworkspace' \ -scheme "GDTWatchOSTestAppWatchKitApp" \ "${xcb_flags[@]}" \ build ;; GoogleDataTransportCCTSupport-watchOS-xcodebuild) RunXcodebuild \ -workspace 'GoogleDataTransportCCTSupport/GDTCCTWatchOSTestApp/GDTCCTWatchOSTestApp.xcworkspace' \ -scheme "GDTCCTWatchOSIndependentTestAppWatchKitApp" \ "${xcb_flags[@]}" \ build RunXcodebuild \ -workspace 'GoogleDataTransportCCTSupport/GDTCCTWatchOSTestApp/GDTCCTWatchOSTestApp.xcworkspace' \ -scheme "GDTCCTWatchOSCompanionTestApp" \ "${xcb_flags[@]}" \ build ;; *) echo "Don't know how to build this product-platform-method combination" 1>&2 echo " product=$product" 1>&2 echo " platform=$platform" 1>&2 echo " method=$method" 1>&2 exit 1 ;; esac