| #!/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=} |
| |
| # 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="ReactiveCocoaFramework/ReactiveCocoa.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 -project "$XCODEPROJ" 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 | awk '{ print; } /Failed to query the list of test cases in the test bundle/ { exit 1; }' |
| |
| local awkstatus=$? |
| local result=${PIPESTATUS[0]} |
| |
| if [ "$awkstatus" -eq "1" ] |
| then |
| echo |
| echo "*** Mac application tests are currently buggy, so they have been skipped." |
| echo "*** See https://github.com/facebook/xctool/issues/243 for more information." |
| echo |
| return 0 |
| fi |
| |
| return $result |
| } |
| |
| export -f build_scheme |
| export -f run_xctool |
| export -f parse_build |
| |
| main |