#!/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://cdn.cocoapods.org/ "$@" } set -euo pipefail if [[ $# -lt 1 ]]; then cat 1>&2 <&2 sleep 5 xcodebuild "$@" | xcpretty; result=$? fi if [[ $result != 0 ]]; then exit $result fi } 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' ) # Compute standard flags for all platforms case "$platform" in iOS) xcb_flags=("${ios_flags[@]}") ;; iPad) xcb_flags=("${ipad_flags[@]}") ;; macOS) xcb_flags=("${macos_flags[@]}") ;; tvOS) xcb_flags=("${tvos_flags[@]}") ;; all) 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 ) 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-$method-$platform" in Firebase-xcodebuild-*) # Coverage collection often cause retries to fail because of partial # pre-existing data. # TODO(paulb777): Find a less blunt solution to this. rm -rf ~/Library/Developer/Xcode/DerivedData RunXcodebuild \ -workspace 'Example/Firebase.xcworkspace' \ -scheme "AllUnitTests_$platform" \ "${xcb_flags[@]}" \ build \ test if [[ $platform == 'iOS' ]]; then # Code Coverage collection is only working on iOS currently. ./scripts/collect_metrics.sh 'Example/Firebase.xcworkspace' "AllUnitTests_$platform" fi ;; FirebasePod-xcodebuild-*) RunXcodebuild \ -workspace 'CoreOnly/Tests/FirebasePodTest/FirebasePodTest.xcworkspace' \ -scheme "FirebasePodTest" \ "${xcb_flags[@]}" \ build ;; Auth-xcodebuild-*) if [[ "$TRAVIS_PULL_REQUEST" == "false" || "$TRAVIS_PULL_REQUEST_SLUG" == "$TRAVIS_REPO_SLUG" ]]; then RunXcodebuild \ -workspace 'Example/Auth/AuthSample/AuthSample.xcworkspace' \ -scheme "Auth_ApiTests" \ "${xcb_flags[@]}" \ build \ test fi ;; InAppMessaging-xcodebuild-*) RunXcodebuild \ -workspace 'InAppMessaging/Example/InAppMessaging-Example-iOS.xcworkspace' \ -scheme 'InAppMessaging_Example_iOS' \ "${xcb_flags[@]}" \ build \ test RunXcodebuild \ -workspace 'InAppMessagingDisplay/Example/InAppMessagingDisplay-Sample.xcworkspace' \ -scheme 'FiamDisplaySwiftExample' \ "${xcb_flags[@]}" \ build \ test ;; Firestore-xcodebuild-*) "${firestore_emulator}" start trap '"${firestore_emulator}" stop' ERR EXIT if [[ "$xcode_major" -lt 9 ]]; then # When building and testing for Xcode 8, only test unit tests. RunXcodebuild \ -workspace 'Firestore/Example/Firestore.xcworkspace' \ -scheme "Firestore_Tests_$platform" \ "${xcb_flags[@]}" \ build \ test else # IntegrationTests run all the tests, including Swift tests, which # require Swift 4.0 and Xcode 9+. RunXcodebuild \ -workspace 'Firestore/Example/Firestore.xcworkspace' \ -scheme "Firestore_IntegrationTests_$platform" \ "${xcb_flags[@]}" \ build \ test fi ;; Firestore-cmake-macOS) "${firestore_emulator}" start trap '"${firestore_emulator}" stop' ERR EXIT test -d build || mkdir build echo "Preparing cmake build ..." (cd build; cmake "${cmake_options[@]}" ..) echo "Building cmake build ..." cpus=$(sysctl -n hw.ncpu) (cd build; env make -j $cpus all generate_protos) (cd build; env CTEST_OUTPUT_ON_FAILURE=1 make -j $cpus test) ;; SymbolCollision-xcodebuild-*) RunXcodebuild \ -workspace 'SymbolCollisionTest/SymbolCollisionTest.xcworkspace' \ -scheme "SymbolCollisionTest" \ "${xcb_flags[@]}" \ build ;; Database-xcodebuild-*) pod_gen FirebaseDatabase.podspec --platforms=ios RunXcodebuild \ -workspace 'gen/FirebaseDatabase/FirebaseDatabase.xcworkspace' \ -scheme "FirebaseDatabase-Unit-unit" \ "${ios_flags[@]}" \ "${xcb_flags[@]}" \ build \ test if [[ "$TRAVIS_PULL_REQUEST" == "false" || "$TRAVIS_PULL_REQUEST_SLUG" == "$TRAVIS_REPO_SLUG" ]]; then # Integration tests are only run on iOS to minimize flake failures. RunXcodebuild \ -workspace 'gen/FirebaseDatabase/FirebaseDatabase.xcworkspace' \ -scheme "FirebaseDatabase-Unit-integration" \ "${ios_flags[@]}" \ "${xcb_flags[@]}" \ build \ test fi pod_gen FirebaseDatabase.podspec --platforms=macos --clean RunXcodebuild \ -workspace 'gen/FirebaseDatabase/FirebaseDatabase.xcworkspace' \ -scheme "FirebaseDatabase-Unit-unit" \ "${macos_flags[@]}" \ "${xcb_flags[@]}" \ build \ test pod_gen FirebaseDatabase.podspec --platforms=tvos --clean RunXcodebuild \ -workspace 'gen/FirebaseDatabase/FirebaseDatabase.xcworkspace' \ -scheme "FirebaseDatabase-Unit-unit" \ "${tvos_flags[@]}" \ "${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 [[ "$TRAVIS_PULL_REQUEST" == "false" || "$TRAVIS_PULL_REQUEST_SLUG" == "$TRAVIS_REPO_SLUG" ]]; 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 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 ;; *) 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