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