#!/bin/bash
# Copyright 2017 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.

#### CATEGORY=Build
### Run Ninja to build Fuchsia

## usage: fx build [--log FILENAME] [-SWITCH...] | TARGET ...]
##
## This runs Ninja after performing a few sanity checks for the Fuchsia build.
##
## optional arguments:
##   --log LOGFILE     Print debug information to LOGFILE. Please attach the
##                     resulting file when reporting bugs.
##
## Other arguments are passed through to Ninja.
## Run `fx build -h` to see Ninja argument details.

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
fx-config-read

function main {
  local switches=() fuchsia_targets=()
  local log_file is_logging
  is_logging=false
  while [[ $# -gt 0 ]]; do
    case "$1" in
      --log)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        log_file="$2"
        if [[ -f "${log_file}" ]]; then
          fx-error "File \"${log_file}\" exists."
          return 1
        fi
       # if ! touch "${log_file}"; then
       #   fx-error "Cannot create logfile \"${log_file}\""
       #   return 1
       # fi
        is_logging=true
        shift
        ;;
      --no-zircon)
        echo "WARNING: The --no-zircon argument is now obsolete and ignored!"
        ;;
      # These Ninja switches take an argument.
      -[Cfjkldtw])
        switches+=("$1" "$2")
        shift
        ;;
      -*)
        switches+=("$1")
        ;;
      *)
        fuchsia_targets+=("$1")
        ;;
    esac
    shift
  done

  if [[ "${is_logging}" = true ]]; then
    # log file header with relevant environment information
    {
      TIMESTAMP="$(date +%Y%m%d_%H%M%S)"
      echo "Build initiated at ${TIMESTAMP}"
      echo
      echo "------ GIT QUICK INFO ------"
      echo "$ git status"
      git --git-dir="${FUCHSIA_DIR}/.git" status
      echo
      echo "$ git rev-parse JIRI_HEAD"
      git --git-dir="${FUCHSIA_DIR}/.git" rev-parse JIRI_HEAD
      echo
      echo "------ CONTENTS OF args.gn ------"
      echo "$ cat ${FUCHSIA_BUILD_DIR}/args.gn"
      echo
      cat "${FUCHSIA_BUILD_DIR}/args.gn"
      echo
    } >> "${log_file}" 2>&1

    # tee stdout and stderr to log_file
    exec > >(tee -a "${log_file}") 2>&1
  fi

  # A change to any of these might mean things are now done differently enough
  # that ninja's automatic re-gen rule might not be triggered or might not work
  # properly if it is triggered.  So preemptively force a re-gen if that seems
  # like a plausible possibility.
  local -r landmines=("$PREBUILT_GN"
                      "$FUCHSIA_DIR/tools/devshell/build"
                      "$FUCHSIA_DIR/tools/devshell/lib/vars.sh"
                     )
  local mine
  for mine in "${landmines[@]}"; do
    if [[ "$mine" -nt "${FUCHSIA_BUILD_DIR}/build.ninja" ]]; then
      if [[ "${is_logging}" = true ]]; then
        echo -e "\\n------ RUNNING gn gen ------"
      fi
      echo >&2 "Re-running gn gen first ($mine changed)"
      fx-gen || return
      break
    fi
  done

  if [[ ! -d "$FUCHSIA_BUILD_DIR" ]]; then
    if [[ "${is_logging}" = true ]]; then
      echo -e "\\n------ RUNNING gn gen ------"
    fi
    echo >&2 "Re-running gn gen first (missing $FUCHSIA_BUILD_DIR)"
    fx-gen || return
  fi

  local status

  if [[ "${is_logging}" = true ]]; then
    echo -e "\\n------ RUNNING ninja ------"
  fi

  (fx-run-ninja "${is_logging}" "$PREBUILT_NINJA" -C "${FUCHSIA_BUILD_DIR}" \
    "${switches[@]}" "${fuchsia_targets[@]}")
  status=$?
  if [[ "${status}" -ne 0 ]]; then
    goma-check
  fi

  exit-with-message
}

function goma-check {
  if grep -q "^ *use_goma = true" "${FUCHSIA_BUILD_DIR}/args.gn"; then
    if ! fx-command-run goma_ctl status >/dev/null 2>&1; then
      fx-error "Goma is enabled but not started. Please run 'fx goma' first."
    fi
  fi
}

function exit-with-message {
  if [[ "${is_logging}" = true ]]; then
    fx-warn "Debug log saved to ${log_file}. Please attach this file when reporting a bug"
  elif [[ "${status}" -ne 0 ]]; then
    echo >&2 "Hint: run \`fx build\` with the option \`--log LOGFILE\` to generate a debug log if you are reporting a bug."
  fi
  exit "${status}"
}

main "$@"
