#!/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 "-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:fhj:rcq FLAG; do
    case $FLAG in
        a) BUILD_ARGS+=("$OPTARG") ;;
        A) EXTRA_BUILDS+=(-A) ;;
        c) EXTRA_BUILDS+=(-C) ;;
        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
