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

### set up a build directory

## usage: fx set TARGET [[--build-dir] OUTDIR]
##               [--boards B1,B2,...]
##               [--products P1,P2,...]
##               [--packages P1,P2,...]
##               [--netboot]
##               [--args ARG] [--help-args [ARG]] [--variant VARIANT]
##               [--goma|--no-goma] [--no-ensure-goma]
##               [--goma-dir DIR]
##               [--ccache|--no-ccache]
##               [--release]
##               [--zircon-arg ARG]
##
## where TARGET is x64 or arm64
##
## OUTDIR is the directory where the build output goes.
## If it begins with `//` or `out/` then it's taken as relative to FUCHSIA_DIR.
## Otherwise it should be an absolute path or a path relative to the current
## working directory that winds up in `FUCHSIA_DIR/out`.
## It defaults to `out/TARGET`.
##
## This is a wrapper around running `gn gen --check OUTDIR --args ...`.
## If GN fails with an error, `fx set` does not change anything.
## If GN succeeds, this also points subsequent `fx` commands at OUTDIR,
## just as `fx use` does and ensures Goma is ready (if enabled).
##
## optional arguments:
##   --build-dir OUTDIR    Using this option is deprecated.  It's the same
##                         as just giving OUTDIR as a non-option argument.
##   --board               Use the listed board target definition.
##   --product             Include the listed product in the build. Defaults to
##                         the default product for the current layer (e.g.,
##                         "garnet/products/default.gni" for the Garnet layer).
##   --available           Additional packages to be built and included in the
##                         set of packages available for pushing dynamically.
##                         If the --available argument is given multiple times,
##                         all the specified available are included in this set.
##                         These packages are added to the available set defined
##                         by the board and product specifications.
##   --preinstall          Additional packages to be built and included in the
##                         system image alongside the monolithic system image.
##                         If the --preinstall argument is given multiple times,
##                         all the specified packages are included in this set.
##                         These packages are added to the available set defined
##                         by the board and product specifications.
##   --monolith            Additional packages to be built and included in the
##                         monolithic system image.
##                         If the --monolith argument is given multiple times,
##                         all the specified packages are included in this set.
##                         These packages are added to the available set defined
##                         by the board and product specifications.
##   --variant             Pass a `select_variant=[VARIANT*,...]` GN build argument
##                         collecting all the --variant arguments in order.
##   --fuzz-with           Pass a sanitizer name, e.g. "--fuzz-with asan" to
##                         enable ALL supporting fuzzers.  Use --variant for
##                         individual fuzzers, e.g. "--variant asan-fuzzer/foo".
##   --args                Additional argument to pass to gn. If the --args
##                         argument is given multiple times, all the specified
##                         arguments are passed to gn.
##                         N.B. Arguments must be expressed using GN's syntax.
##                         In particular this means that for strings they must
##                         be quoted with double-quotes, and the quoting must
##                         survive, for example, the shell. Thus when passing
##                         an argument that takes a string, pass it with
##                         something like --args=foo='"bar"'. E.g.,
##                         bash$ fx set x64 --args=foo='"bar"'
##                         More complicated arguments, e.g., lists, require
##                         their own special syntax. See GN documentation
##                         for the syntax of each kind of argument.
##   --help-args           Display GN arguments documentation.  If --help-args
##                         is followed by a GN build argument identifier, just
##                         that argument's documentation is displayed.
##                         If --help-args is used alone, all GN build arguments
##                         are displayed (lots of output).
##                         This option requires an existing build directory.
##   --goma|--no-goma      Whether to use the goma service during the build. Goma
##                         attempts to make builds faster using remote build
##                         servers. Defaults to detecting whether goma is installed
##                         on your machine.
##   --no-ensure-goma      Skip ensuring that goma is started when using goma.
##   --goma-dir            The directory where goma is installed. Defaults to
##                         ~/goma.
##   --ccache|--no-ccache  Whether to use ccache during the build. Ccache attempts
##                         to make builds faster by caching build artifacts.
##                         Defaults to detecting whether the CCACHE_DIR environment
##                         variable is set to a directory.
##   --ide                 Pass --ide=VALUE to gn when generating to create project
##                         files usable with that IDE. Useful values include "vs"
##                         for Visual Studio or "xcode" for Xcode.
##   --release             an alias for "--args=is_debug=false"
##   --zircon-arg ARG      Additional arguments to pass to Zircon make. Can be given
##                         multiple times.
##
##  Deprecated flags:
##
##   --boards              Use the listed board target definition (seperated by
##                         comas) in the build, each board results in an import
##                         statement and MUST define the `fuchsia_packages`
##                         variable as well as deal with variable re-definition.
##                         This flag is deprecated, please use --board instead.
##   --products            Include the listed products (separated by commas) in
##                         the build. Defaults to the default product for the
##                         current layer (e.g., "garnet/packages/default.gni" for
##                         the Garnet layer). If the --products argument is
##                         given multiple times, the products configurations
##                         are merged.
##                         This flag is deprecated, please use exactly one
##                         --product and specify packages to add in addition to
##                         the product with --packages.
##   --packages            Additional packages to be built and made available.
##                         If the --packages argument is given multiple times,
##                         all the specified packages are included in the
##                         build.
##                         This flag is deprecated, please use one of
##                         --available, --preinstall, or --monolith.

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

function guess_config_within_layer {
  local config_type="$1"
  local config_name="$2"
  local __resultvar="$3"

  # Guess the petal we're using. We'll search at this petal and below for
  # config matching the type and short name
  local current_petal
  current_petal="$(${FUCHSIA_DIR}/build/gn/guess_layer.py)" || return 1
  readonly current_petal

  # Compute a lookup order starting at the current petal going down.
  local petal_order="${current_petal}"
  case $current_petal in
    vendor/*)
      petal_order="${petal_order},topaz,peridot,garnet"
      ;;
    "topaz")
      petal_order="${petal_order},peridot,garnet"
      ;;
    "peridot")
      petal_order="${petal_order},garnet"
      ;;
  esac
  readonly petal_order

  # Look through petals in this order to find configs with matching names.
  IFS=,
  local petal
  for petal in $petal_order; do
    guessed_config="${petal}/${config_type}/${config_name}.gni"
    if [[ -a "${FUCHSIA_DIR}/${guessed_config}" ]]; then
      echo "Guessing ${config_type} config ${guessed_config}"
      eval "${__resultvar}"="${guessed_config}"
      return
    fi
  done

  echo "Could not guess a ${config_type} configuration matching \"${config_name}\""
  echo "Please specify the full path from the root of the checkout such as"
  echo "garnet/${config_type}/base.gni"
  exit 1
}


function main {
  fx-standard-switches "$@"
  set -- "${FX_ARGV[@]}"

  if [[ $# -lt 1 ]]; then
    fx-command-help
    return 1
  fi

  local arch=
  case $1 in
    x64 | x86 | x64-64)
      arch=x64
      ;;
    arm64 | aarch64)
      arch=arm64
      ;;
    *)
      # TODO(alainv): Add support for extracting arch from board configs.
      echo Unknown target \"$1\"
      fx-command-help
      return 1
      ;;
  esac
  shift

  local gn_cmd='gen'
  local -a gn_switches=(--check)
  local gn_args="target_cpu=\"${arch}\""
  local boards=()
  local products=()
  local available=()
  local preinstall=()
  local monolith=()
  local packages=()
  local zircon_args=()
  local extra_packages=()
  local build_dir=
  local variant=
  local use_goma
  local goma_dir
  local ensure_goma=1
  local ccache
  while [[ $# -ne 0 ]]; do
    case "$1" in
      --board)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        boards+=("$2")
        shift
        ;;
      --product)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        products+=("$2")
        shift
        ;;
      --available)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        IFS=, available+=("$2")
        shift
        ;;
      --preinstall)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        IFS=, preinstall+=("$2")
        shift
        ;;
      --monolith)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        IFS=, monolith+=("$2")
        shift
        ;;
      --boards)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        # Multiple boards may be comma separated
        IFS=, boards+=("$2")
        shift
        ;;
      --products)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        # Multiple products may be comma separated
        IFS=, products+=("$2")
        shift
        ;;
      --packages)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        # Multiple packages may be comma separated
        IFS=, packages+=("$2")
        shift
        ;;
      --zircon-arg)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        zircon_args+=("$2")
        shift
        ;;
      --netboot)
        extra_packages+=('build/packages/netboot')
        ;;
      # TODO(mcgrathr): Remove this after a deprecation period.
      --build-dir)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        echo >&2 "NOTE: The --build-dir switch is deprecated; give $2 alone."
        build_dir="$2"
        shift
        ;;
      --goma)
        use_goma=1
        ;;
      --no-goma)
        use_goma=0
        ;;
      --no-ensure-goma)
        ensure_goma=0
        ;;
      --goma-dir)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        goma_dir=$2
        if [[ ! -d "${goma_dir}" ]]; then
          echo -e "error: GOMA directory does not exist: "${goma_dir}""
          return 1
        fi
        shift
        ;;
      --release)
        gn_args+=" is_debug=false"
        ;;
      --variant)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        variant+="\"$2\","
        shift
        ;;
      --fuzz-with)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        variant+="{variant=\"$2-fuzzer\" target_type=[\"fuzzed_executable\"]},"
        shift
        ;;
      --args)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        gn_args+=" $2"
        shift
        ;;
      --help-args)
        gn_cmd=args
        if [[ $# -ge 2 ]] && [[ "$2" != '--*' ]]; then
          gn_switches+=("--list=$2")
          shift
        else
          gn_switches+=(--list)
        fi
        ;;
      --ccache)
        ccache=1
        ;;
      --no-ccache)
        ccache=0
        ;;
      --ide)
        if [[ $# -lt 2 ]]; then
          fx-command-help
          return 1
        fi
        gn_switches+=("--ide=$2")
        shift
        ;;
      --*)
        fx-command-help
        return 1
        ;;
      *)
        # A non-option argument is the build_dir, but there can be only one.
        if [[ -n "$build_dir" ]]; then
          fx-command-help
          return 1
        fi
        build_dir="$1"
        ;;
    esac
    shift
  done

  if [[ -z "${products}${packages}" ]]; then
    # This is the default logic GN would use, but if a user specified --netboot
    # we would short-circuit the logic, so repeat it here.
    local layers
    layers="$(${FUCHSIA_DIR}/build/gn/guess_layer.py)" || return 1
    readonly layers
    local layer
    for layer in $layers; do
      products+="${products:+,}$layer/products/default.gni"
    done
  fi

  if [[ -z "${boards}" ]]; then
    # Import the board target definition from the current layer if it exists.
    local layers
    if [[ -z "${layers}" ]]; then
      layers="$(${FUCHSIA_DIR}/build/gn/guess_layer.py)" || return 1
    fi
    readonly layers
    local layer
    for layer in $layers; do
      if [[ -e "$layer/boards/$arch.gni" ]]; then
        boards+="${boards:+,}$layer/boards/$arch.gni"
      fi
    done
  fi

  # Remove any trailing slash from build directory name.
  build_dir="${build_dir%/}"

  local config_build_dir
  case "$build_dir" in
    '')
      # Default is "//out/$target_cpu".  Store it as relative.
      config_build_dir="out/${arch}"
      build_dir="${FUCHSIA_DIR}/${config_build_dir}"
      ;;
    //*|out/*)
      # GN-style "source-relative" path or relative out/something.
      config_build_dir="${build_dir#//}"
      build_dir="${FUCHSIA_DIR}/${config_build_dir}"
      ;;
    *)
      # Absolute or relative path.  Canonicalize it to source-relative.
      local abs_build_dir
      abs_build_dir="$(cd "${build_dir%/*}" >/dev/null 2>&1; pwd)/${build_dir##*/}" || {
        echo >&2 "ERROR: Missing parent directories for ${build_dir}"
        return 1
      }
      if [[ "$abs_build_dir" == "${FUCHSIA_DIR}"/out/* ]]; then
        config_build_dir="${abs_build_dir#${FUCHSIA_DIR}/}"
      else
        echo >&2 "WARNING: ${abs_build_dir} is not a subdirectory of ${FUCHSIA_DIR}/out"
        config_build_dir="$abs_build_dir"
      fi
      ;;
  esac

  # If a goma directory wasn't specified explicitly then default to "~/goma".
  if [[ -z "${goma_dir}" ]]; then
    goma_dir="$HOME/goma"
  fi

  # Automatically detect goma and ccache if not specified explicitly.
  if [[ -z "${use_goma}" ]] && [[ -z "${ccache}" ]]; then
    if [[ -d "${goma_dir}" ]]; then
      use_goma=1
    elif [[ -n "${CCACHE_DIR}" ]] && [[ -d "${CCACHE_DIR}" ]]; then
      ccache=1
    fi
  fi

  for board in ${boards[@]}; do
    if [[ ! -a "${FUCHSIA_DIR}/${board}" ]]; then
      local guessed_board=""
      guess_config_within_layer "boards" "${board}" guessed_board
      board="${guessed_board}"
    fi
    gn_args+=" import(\"//${board}\")"
  done

  # Add goma or ccache settings as appropriate.
  if [[ "${use_goma}" -eq 1 ]]; then
    gn_args+=" use_goma=true goma_dir=\"${goma_dir}\""
  elif [[ "${ccache}" -eq 1 ]]; then
    gn_args+=" use_ccache=true"
  fi

  for product in ${products[@]}; do
    if [[ ! -a "${FUCHSIA_DIR}/${product}" ]]; then
      local guessed_product=""
      guess_config_within_layer "products" "${product}" guessed_product
      product="${guessed_product}"
    fi
    gn_args+=" import(\"//${product}\")"
  done

  if [[ -z "${boards}" ]]; then
    gn_args+=" fuchsia_packages=["
  else
    # Board configs MUST declare fuchsia_packages.
    gn_args+=" fuchsia_packages+=["
  fi
  for package in ${packages[@]} ${extra_packages[@]}; do
    gn_args+="\"${package}\","
  done
  gn_args+="]"

  gn_args+=" if (!defined(available)) { available = [] }"
  gn_args+=" available+=["
  for package in ${available[@]}; do
    gn_args+="\"${package}\","
  done
  gn_args+="]"

  gn_args+=" if (!defined(preinstall)) { preinstall = [] }"
  gn_args+=" preinstall+=["
  for package in ${preinstall[@]}; do
    gn_args+="\"${package}\","
  done
  gn_args+="]"
  gn_args+=" if (!defined(monolith)) { monolith = [] }"
  gn_args+=" monolith+=["
  for package in ${monolith[@]}; do
    gn_args+="\"${package}\","
  done
  gn_args+="]"

  if [[ -n "${variant}" ]]; then
    gn_args+=" select_variant=[${variant}]"
  fi

  mkdir -p "${build_dir}"
  echo "${zircon_args[@]}" > "${build_dir}.zircon-args"

  # Using a subshell with -x prints out the gn command precisely with shell
  # quoting so a cut&paste to the command line works.  Always show the real
  # meaning of what this script does so everyone learns how GN works.
  (
    set -x
    "${FUCHSIA_DIR}/buildtools/gn" ${gn_cmd} "${build_dir}" \
                                   "${gn_switches[@]}" --args="${gn_args}" "$@"
  # If GN failed, don't update .config.
  ) || return

  fx-config-write "${config_build_dir}"

  if [[ "${use_goma}" -eq 1 ]] && [[ "${ensure_goma}" -eq 1 ]]; then
    if ! [[ $("${goma_dir}/gomacc" port) =~ ^[0-9]+$ ]]; then
      "${goma_dir}/goma_ctl.py" ensure_start || return $?
    fi
  fi
}

main "$@"
