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

#
# Export some environment variables used by ART's Android.mk/Android.bp
# build systems to configure ART [to use a different implementation].
#
# Currently only varies on ART_USE_READ_BARRIER for a concurrent/non-concurrent
# flavor of the ART garbage collector.
#
# Only meant for golem use since when building ART directly, one can/should set
# these environment flags themselves.
#
# These environment flags are not really meant here to be for "correctness",
# but rather telling the ART C++ to use alternative algorithms.
# In other words, the same exact binary build with a different "target"
# should run in the same context (e.g. it does not change arch or the OS it's built for).
#

setenv() {
  local name="$1"
  local value="$2"

  export $name="$value"
  echo export $name="$value"
}

# Enforce specified target-name is one of these.
# Perhaps we should be less strict?
ALL_TARGETS=(art-interpreter art-opt art-jit art-jit-cc art-opt-cc art-opt-debuggable art-vdex)

usage() {
  echo >&2 "Usage: $(basename $0) (--list-targets | <target-name>)"
  echo >&2
  echo >&2 "Exports the necessary ART environment variables"
  echo >&2 "to pass to the Golem build to correctly configure ART."
  echo >&2 "--------------------------------------------------------"
  echo >&2 "Required Arguments:"
  echo >&2 "  <target-name>       Specify the golem target to get environment variables for."
  echo >&2
  echo >&2 "Optional Flags":
  echo >&2 "  --list-targets      Display all the targets. Do not require the main target-name."
  echo >&2 "  --help              Print this help listing."
  echo >&2
  echo >&2 "Available Targets:"

  list_targets 2 "  "
}

list_targets() {
  local out_fd="${1:-1}" # defaults to 1 if no param was set
  local prefix="$2"

  for target in "${ALL_TARGETS[@]}"; do
    echo >&$out_fd "${prefix}${target}"
  done
}


# Check if $1 element is in array $2
contains_element() {
  local e
  for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
  return 1
}

main() {
  if [[ $# -lt 1 ]]; then
    usage
    exit 1
  fi

  if [[ "$1" == "--help" ]]; then
    usage
    exit 1
  fi

  if [[ "$1" == "--list-targets" ]]; then
    list_targets
    exit 0
  fi

  local selected_target="$1"
  if ! contains_element "$selected_target" "${ALL_TARGETS[@]}"; then
    echo "ERROR: Invalid target value '$selected_target'" >&2
    exit 1
  fi

  case "$selected_target" in
    *-cc)
      setenv ART_USE_READ_BARRIER true
      ;;
    *)
      setenv ART_USE_READ_BARRIER false
      ;;
  esac

  # Make smaller .tar.gz files by excluding debug targets.
  setenv ART_BUILD_TARGET_DEBUG false
  setenv ART_BUILD_HOST_DEBUG false
  setenv USE_DEX2OAT_DEBUG false
}

main "$@"
