| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- #!/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 -project "$XCODEPROJ" 2>/dev/null | awk -f "$SCRIPT_DIR/schemes.awk")}
- # A whitespace-separated list of executables that must be present and locatable.
- : ${REQUIRED_TOOLS="xctool"}
- export XCWORKSPACE
- export XCODEPROJ
- export BOOTSTRAP
- export XCTOOL_OPTIONS
- export SCHEMES
- export REQUIRED_TOOLS
- }
- ##
- ## Build Process
- ##
- main ()
- {
- config
- if [ -n "$REQUIRED_TOOLS" ]
- then
- echo "*** Checking dependencies..."
- check_deps
- fi
- 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
- )
- }
- check_deps ()
- {
- for tool in $REQUIRED_TOOLS
- do
- which -s "$tool"
- if [ "$?" -ne "0" ]
- then
- echo "*** Error: $tool not found. Please install it and cibuild again."
- exit 1
- fi
- done
- }
- 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 "*** 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" -eq "1" ]
- then
- # SDK not found, try for iphonesimulator.
- sdkflag="-sdk iphonesimulator"
- # Determine whether the unit tests will run with iphonesimulator
- run_xctool $sdkflag -scheme "$scheme" run-tests | parse_build
- awkstatus=$?
- if [ "$awkstatus" -ne "0" ]
- then
- # Unit tests will not run on iphonesimulator.
- sdkflag=""
- fi
- fi
- if [ "$awkstatus" -ne "0" ]
- then
- # Unit tests aren't supported.
- action=build
- fi
- run_xctool $sdkflag -scheme "$scheme" $action
- }
- export -f build_scheme
- export -f run_xctool
- export -f parse_build
- main
|