#!/bin/bash
#
# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#
# Calls javac with the -bootclasspath values passed in automatically.
# (This avoids having to manually set a boot class path).
# If $JAVAC is set, it will call that instead of 'javac'.
#
#
# Script-specific args:
#   --mode=[host|target|jvm]:
#                         Select between host,target,jvm bootclasspath (default target).
#   --core-only:          Use only "core" bootclasspath (e.g. do not include framework).
#                         Ignored with --mode=jvm.
#   --show-commands:      Print the javac command being executed.
#   --help:               Print above list of args.
#
# All other args are forwarded to javac
#

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
TOP=$DIR/../..

if [[ -z $JAVAC ]]; then
  JAVAC=javac
fi

bootjars_args=
mode=target
showcommands=n
while true; do
  case $1 in
    --help)
      echo "Usage: $0 [--mode=host|target|jvm] [--core-only] [--show-commands] <javac args>"
      exit 0
      ;;
    --mode=host)
      bootjars_args="$bootjars_args --host"
      mode=host
      ;;
    --mode=target)
      bootjars_args="$bootjars_args --target"
      mode=target
      ;;
    --mode=jvm)
      mode=jvm
      ;;
    --mode=*)
      echo "Unsupported $0 usage with --mode=$1" >&2
      exit 1
      ;;
    --core-only)
      bootjars_args="$bootjars_args --core"
      ;;
    --show-commands)
      showcommands=y
      ;;
    *)
      break
      ;;
  esac
  shift
done

if [[ $mode == jvm ]]; then
  # For --mode=jvm:
  # Do not prepend a -bootclasspath, which will use the default bootclasspath instead.
  javac_args=()
elif [[ ! -z ${ART_TEST_RUN_TEST_BOOTCLASSPATH} ]]; then
  javac_args=(-bootclasspath "${ART_TEST_RUN_TEST_BOOTCLASSPATH}")
else
  # For --mode=host or --mode=target, look up the correct -bootclasspath for libcore.
  javac_bootclasspath=()
  boot_class_path_list=$($TOP/art/tools/bootjars.sh $bootjars_args --path)

  for path in $boot_class_path_list; do
    javac_bootclasspath+=("$path")
  done

  if [[ ${#javac_bootclasspath[@]} -eq 0 ]]; then
    echo "FATAL: Missing bootjars.sh file path list" >&2
    exit 1
  fi

  function join_by { local IFS="$1"; shift; echo "$*"; }
  bcp_arg="$(join_by ":" "${javac_bootclasspath[@]}")"
  javac_args=(-bootclasspath "$bcp_arg")
fi
javac_args+=(-encoding utf8)

if [[ $showcommands == y ]]; then
  echo ${JAVAC} "${javac_args[@]}" "$@"
fi

${JAVAC} "${javac_args[@]}" "$@"
