#!/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 "$@"