#!/usr/bin/env bash
# Copyright 2016 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
readonly ROOT_DIR="$(dirname "${SCRIPT_DIR}")"

JOBS=`getconf _NPROCESSORS_ONLN` || {
  Cannot get number of processors
  exit 1
}

set -eo pipefail; [[ "${TRACE}" ]] && set -x

usage() {
  echo "$0 <options> <extra-make-arguments>"
  echo ""
  echo "Options:"
  echo "  -c: Clean before building"
  echo "  -v: Level 1 verbosity"
  echo "  -V: Level 2 verbosity"
  echo "  -A: Build with ASan"
  echo "  -H: Build host tools with ASan"
  echo "  -n: Just print make recipes to STDOUT."
  echo "  -l: Only build tools; do not build zircon."
  echo "  -j N: Passed along to make (number of parallel jobs)"
  echo "  -t <target>: Architecture (GN style) to build, instead of all"
  echo "  -o <outdir>: Directory in which to put the build-zircon directory."
  echo ""
  echo "Additional arguments may be passed to make using standard FOO=bar syntax."
  echo "E.g., build-zircon.sh USE_CLANG=true"
}

declare ASAN="false"
declare CLEAN="false"
declare DRY_RUN="false"
declare HOST_ASAN="false"
declare TOOLS_ONLY="false"
declare OUTDIR="${ROOT_DIR}/out"
declare VERBOSE="0"
declare -a ARCHLIST=(arm64 x64)

while getopts "AcHhlnj:t:p:o:vV" opt; do
  case "${opt}" in
    A) ASAN="true" ;;
    c) CLEAN="true" ;;
    H) HOST_ASAN="true" ;;
    h) usage ; exit 0 ;;
    n) DRY_RUN="true" ;;
    j) JOBS="${OPTARG}" ;;
    l) TOOLS_ONLY="true" ;;
    o) OUTDIR="${OPTARG}" ;;
    t) ARCHLIST=("${OPTARG}") ;;
    v) VERBOSE="1" ;;
    V) VERBOSE="2" ;;
    *) usage 1>&2 ; exit 1 ;;
  esac
done
shift $(($OPTIND - 1))

readonly ASAN CLEAN DRY_RUN HOST_ASAN PROJECTS OUTDIR VERBOSE
readonly ZIRCON_BUILDROOT="${OUTDIR}/build-zircon"
readonly -a ARCHLIST

if [[ "${CLEAN}" = "true" ]]; then
  rm -rf -- "${ZIRCON_BUILDROOT}"
fi

# These variables are picked up by make from the environment.
case "${VERBOSE}" in
  1) QUIET=0 ; V=0 ;;
  2) QUIET=0 ; V=1 ;;
  *) QUIET=1 ; V=0 ;;
esac
export QUIET V

if [[ "${ASAN}" = "true" ]]; then
  readonly NOT_ASAN=false
else
  readonly NOT_ASAN=true
fi

if [[ "${DRY_RUN}" = "true" ]]; then
  readonly DRY_RUN_ARGS="-Bnwk"
fi

make_zircon_common() {
  (test $QUIET -ne 0 || set -x
   exec make ${DRY_RUN_ARGS} --no-print-directory -C "${ROOT_DIR}/zircon" \
             -j ${JOBS} DEBUG_BUILDROOT=../../zircon "$@")
}

# Build host tools.
make_zircon_common \
  BUILDDIR=${OUTDIR}/build-zircon HOST_USE_ASAN="${HOST_ASAN}" tools "$@"

if [[ "${TOOLS_ONLY}" = "true" ]]; then
  exit 0
fi

make_zircon_target() {
  make_zircon_common \
    BUILDROOT=${ZIRCON_BUILDROOT} TOOLS=${OUTDIR}/build-zircon/tools "$@"
}

for ARCH in "${ARCHLIST[@]}"; do
    # Build without ASan for sysroot.  If all of userland will be ASan,
    # then this build is only user libraries.
    make_zircon_target PROJECT="${ARCH}" \
        BUILDDIR_SUFFIX= ENABLE_ULIB_ONLY="${ASAN}" "$@"

    # Always build at least the libraries with ASan, but never the sysroot.
    make_zircon_target PROJECT="${ARCH}" \
        BUILDDIR_SUFFIX=-asan USE_ASAN=true ENABLE_BUILD_SYSROOT=false \
        ENABLE_ULIB_ONLY="${NOT_ASAN}"
done
