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

### run the go tool in fuchsia target configuration
## Usage:
##  fx go <go tool args>
##  fx go --package=packagename <go tool args>

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/vars.sh
fx-config-read

function usage {
  fx-command-help
  exit 1
}

case "${FUCHSIA_ARCH}" in
  arm64)
    GOARCH=arm64
    ;;
  x64)
    GOARCH=amd64
    ;;
esac
GOROOT="${FUCHSIA_BUILD_DIR}/goroot"

if [[ ! -d "${GOROOT}" ]]; then
  echo >&2 "ERROR: You must build the goroot before running this command"
  exit 1
fi

while getopts ":-:" opt; do
  case $opt in
    \?)
      echo >&2 "ERROR: Unrecognized short option: -$OPTARG"
      usage
      ;;
    -)
        case $OPTARG in
        package=*) PACKAGE=${OPTARG#*=};;
        *)
            echo >&2 "ERROR: Unrecognized long option: $OPTARG"
            usage
            ;;
        esac
      ;;
  esac
done
shift $((OPTIND-1))

## If --package is provided and has a gopath in $FUCHSIA_BUILD_DIR/gen/gopaths,
## prepend the given gopath to $GOPATH before invoking $GOROOT/bin/go.
function package_gopath {
  local package="$1"
  if [[ -z "$package" ]]; then
    return 1
  fi

  gopathdir="$FUCHSIA_BUILD_DIR/gen/gopaths"
  d="$gopathdir/$package"
  if [[ ! -d "$d" ]]; then
    echo >&2 "ERROR: Package not found in $gopathdir: $package"
    return 1
  fi

  echo $d
}

if [[ -n $PACKAGE ]]; then
  maybe_gopath="$(package_gopath $PACKAGE)"
  GOPATH="${maybe_gopath}:${GOPATH}"
fi

ZIRCON="${FUCHSIA_DIR}/zircon" CC="${GOROOT}/misc/fuchsia/gccwrap.sh" ZIRCON_SYSROOT="${FUCHSIA_BUILD_DIR}/sdks/zircon_sysroot/arch/${FUCHSIA_ARCH}/sysroot" FUCHSIA_ROOT_OUT_DIR="${FUCHSIA_BUILD_DIR}" GOOS=fuchsia GOARCH=${GOARCH} CGO_ENABLED=1 GOPATH="${GOPATH}" GOROOT="${GOROOT}" "${GOROOT}/bin/go" "$@"
