#!/usr/bin/env bash

# Copyright 2016 The Fuchsia Authors
# Copyright (c) 2008 Travis Geiselbrecht
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT

function HELP {
    echo "help:"
    echo "-a arg=value        : Extra GN build argument"
    echo "-f                  : Exit on first failure"
    echo "-r                  : Also build release mode builds"
    echo "-C                  : Also build with Clang"
    echo "-U                  : Also build with GCC"
    echo "-A                  : Also build with ASan"
    echo "-q                  : Build quietly"
    echo "-j N                : Passed through to Ninja"
    echo "-h for help"
    exit 1
}

BUILD_ARGS=()
BUILD_SWITCHES=()
EXTRA_BUILDS=()
FAIL_FAST=0
DO_RELEASE=0
QUIET=0

while getopts Aa:CGfhj:rq FLAG; do
    case $FLAG in
        a) BUILD_ARGS+=("$OPTARG") ;;
        A) EXTRA_BUILDS+=(-A) ;;
        C) EXTRA_BUILDS+=(-C) ;;
        G) EXTRA_BUILDS+=(-G) ;;
        f) FAIL_FAST=1;;
        h) HELP;;
        r) DO_RELEASE=1;;
        q) BUILD_SWITCHES+=(-q) ;;
        j) BUILD_SWITCHES+=(-j "$OPTARG") ;;
        \?)
            echo unrecognized option
            HELP
    esac
done
shift $((OPTIND-1))

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

FAILED=()
STATUS=0

build_one() {
  "$DIR/build-zircon" "${BUILD_SWITCHES[@]}" "$@" -- "${BUILD_ARGS[@]}" || {
    STATUS=$?
    FAILED+=("build-zircon $*")
  }
}

build_all() {
  build_one "$@"
  for extra in "${EXTRA_BUILDS[@]}"; do
    ((FAIL_FAST == 0 || STATUS == 0)) || break
    build_one "$@" "$extra"
  done
}

build_all
if ((DO_RELEASE)); then
  build_all -r
fi

if [ ${#FAILED[@]} -ne 0 ]; then
  echo
  echo some projects have failed to build:
  for failed in "${FAILED[@]}"; do
    echo "$failed"
  done
fi

exit $STATUS
