| #!/bin/bash | |
| export SCRIPT_DIR=$(dirname "$0") | |
| ## | |
| ## Configuration Variables | |
| ## | |
| SCHEMES="$@" | |
| config () | |
| { | |
| # The workspace to build. | |
| # | |
| # If not set and no workspace is found, the -workspace flag will not be passed | |
| # to `xctool`. | |
| # | |
| # Only one of `XCWORKSPACE` and `XCODEPROJ` needs to be set. The former will | |
| # take precedence. | |
| : ${XCWORKSPACE=$(find_pattern "*.xcworkspace")} | |
| # The project to build. | |
| # | |
| # If not set and no project is found, the -project flag will not be passed | |
| # to `xctool`. | |
| # | |
| # Only one of `XCWORKSPACE` and `XCODEPROJ` needs to be set. The former will | |
| # take precedence. | |
| : ${XCODEPROJ=$(find_pattern "*.xcodeproj")} | |
| # A bootstrap script to run before building. | |
| # | |
| # If this file does not exist, it is not considered an error. | |
| : ${BOOTSTRAP="$SCRIPT_DIR/bootstrap"} | |
| # Extra options to pass to xctool. | |
| : ${XCTOOL_OPTIONS="RUN_CLANG_STATIC_ANALYZER=NO"} | |
| # A whitespace-separated list of default schemes to build. | |
| # | |
| # Individual names can be quoted to avoid word splitting. | |
| : ${SCHEMES:=$(xcodebuild -list 2>/dev/null | awk -f "$SCRIPT_DIR/schemes.awk")} | |
| export XCWORKSPACE | |
| export XCODEPROJ | |
| export BOOTSTRAP | |
| export XCTOOL_OPTIONS | |
| export SCHEMES | |
| } | |
| ## | |
| ## Build Process | |
| ## | |
| main () | |
| { | |
| config | |
| if [ -f "$BOOTSTRAP" ] | |
| then | |
| echo "*** Bootstrapping..." | |
| "$BOOTSTRAP" || exit $? | |
| fi | |
| echo "*** The following schemes will be built:" | |
| echo "$SCHEMES" | xargs -n 1 echo " " | |
| echo | |
| echo "$SCHEMES" | xargs -n 1 | ( | |
| local status=0 | |
| while read scheme | |
| do | |
| build_scheme "$scheme" || status=1 | |
| done | |
| exit $status | |
| ) | |
| } | |
| find_pattern () | |
| { | |
| ls -d $1 2>/dev/null | head -n 1 | |
| } | |
| run_xctool () | |
| { | |
| if [ -n "$XCWORKSPACE" ] | |
| then | |
| xctool -workspace "$XCWORKSPACE" $XCTOOL_OPTIONS "$@" 2>&1 | |
| elif [ -n "$XCODEPROJ" ] | |
| then | |
| xctool -project "$XCODEPROJ" $XCTOOL_OPTIONS "$@" 2>&1 | |
| else | |
| echo "*** No workspace or project file found." | |
| exit 1 | |
| fi | |
| } | |
| parse_build () | |
| { | |
| awk -f "$SCRIPT_DIR/xctool.awk" 2>&1 >/dev/null | |
| } | |
| build_scheme () | |
| { | |
| local scheme=$1 | |
| echo "*** Cleaning $scheme..." | |
| run_xctool -scheme "$scheme" clean >/dev/null || exit $? | |
| echo "*** Building and testing $scheme..." | |
| echo | |
| local sdkflag= | |
| local action=test | |
| # Determine whether we can run unit tests for this target. | |
| run_xctool -scheme "$scheme" run-tests | parse_build | |
| local awkstatus=$? | |
| if [ "$awkstatus" -ne "0" ] | |
| then | |
| # Unit tests aren't supported. | |
| action=build | |
| fi | |
| if [ "$awkstatus" -eq "1" ] | |
| then | |
| # Build for iOS. | |
| sdkflag="-sdk iphonesimulator" | |
| fi | |
| run_xctool $sdkflag -scheme "$scheme" $action | |
| } | |
| export -f build_scheme | |
| export -f run_xctool | |
| export -f parse_build | |
| main |