| #!/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 |