12553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#!/bin/bash
22553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#
32553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Copyright (C) 2017 The Android Open Source Project
42553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#
52553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Licensed under the Apache License, Version 2.0 (the "License");
62553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# you may not use this file except in compliance with the License.
72553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# You may obtain a copy of the License at
82553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#
92553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#      http://www.apache.org/licenses/LICENSE-2.0
102553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#
112553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Unless required by applicable law or agreed to in writing, software
122553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# distributed under the License is distributed on an "AS IS" BASIS,
132553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# See the License for the specific language governing permissions and
152553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# limitations under the License.
162553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
172553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinif [[ ! -d art ]]; then
182553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  echo "Script needs to be run at the root of the android tree"
192553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  exit 1
202553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinfi
212553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
222553887b8dd264497a8589ddddad9d5f8260b0a2Igor MurashkinALL_CONFIGS=(linux-ia32 linux-x64 linux-armv8 linux-armv7 android-armv8 android-armv7)
232553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
242553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinusage() {
252553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local config
262553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local golem_target
272553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
282553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  (cat << EOF
292553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  Usage: $(basename "${BASH_SOURCE[0]}") [--golem=<target>] --machine-type=MACHINE_TYPE
302553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin                 [--tarball[=<target>.tar.gz]]
312553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
322553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  Build minimal art binaries required to run golem benchmarks either
332553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  locally or on the golem servers.
342553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
352553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  Creates the \$MACHINE_TYPE binaries in your \$OUT_DIR, and if --tarball was specified,
362553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  it also tars the results of the build together into your <target.tar.gz> file.
372553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  --------------------------------------------------------
382553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  Required Flags:
392553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --machine-type=MT   Specify the machine type that will be built.
402553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
412553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  Optional Flags":
422553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --golem=<target>    Builds with identical commands that Golem servers use.
432553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --tarball[=o.tgz]   Tar/gz the results. File name defaults to <machine_type>.tar.gz
442553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    -j<num>             Specify how many jobs to use for parallelism.
452553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --help              Print this help listing.
462553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --showcommands      Show commands as they are being executed.
472553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --simulate          Print commands only, don't execute commands.
482553887b8dd264497a8589ddddad9d5f8260b0a2Igor MurashkinEOF
492553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  ) | sed -e 's/^[[:space:]][[:space:]]//g' >&2 # Strip leading whitespace from heredoc.
502553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
512553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  echo >&2 "Available machine types:"
522553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  for config in "${ALL_CONFIGS[@]}"; do
532553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    echo >&2 "  $config"
542553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  done
552553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
562553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  echo >&2
572553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  echo >&2 "Available Golem targets:"
582553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  while IFS='' read -r golem_target; do
592553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    echo >&2 "  $golem_target"
602553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  done < <("$(thisdir)/env" --list-targets)
612553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
622553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
632553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Check if $1 element is in array $2
642553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkincontains_element() {
652553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local e
662553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
672553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  return 1
682553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
692553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
702553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Display a command, but don't execute it, if --showcommands was set.
712553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinshow_command() {
722553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  if [[ $showcommands == "showcommands" ]]; then
732553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    echo "$@"
742553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  fi
752553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
762553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
772553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Execute a command, displaying it if --showcommands was set.
782553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# If --simulate is used, command is not executed.
792553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinexecute() {
802553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  show_command "$@"
812553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  execute_noshow "$@"
822553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
832553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
842553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Execute a command unless --simulate was used.
852553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinexecute_noshow() {
862553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  if [[ $simulate == "simulate" ]]; then
872553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    return 0
882553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  fi
892553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
902553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local prog="$1"
912553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  shift
922553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  "$prog" "$@"
932553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
942553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
952553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Export environment variable, echoing it to screen.
962553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinsetenv() {
972553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local name="$1"
982553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local value="$2"
992553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1002553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  export $name="$value"
1012553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  echo export $name="$value"
1022553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
1032553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1042553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Export environment variable, echoing $3 to screen ($3 is meant to be unevaluated).
1052553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinsetenv_escape() {
1062553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local name="$1"
1072553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local value="$2"
1082553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local escaped_value="$3"
1092553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1102553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  export $name="$value"
1112553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  echo export $name="$escaped_value"
1122553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
1132553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1142553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinlog_usage_error() {
1152553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  echo >&2 "ERROR: " "$@"
1162553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  echo >&2 "       See --help for the correct usage information."
1172553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  exit 1
1182553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
1192553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1202553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinlog_fatal() {
1212553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  echo >&2 "FATAL: " "$@"
1222553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  exit 2
1232553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
1242553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1252553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Get the directory of this script.
1262553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinthisdir() {
1272553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  (\cd "$(dirname "${BASH_SOURCE[0]}")" && pwd )
1282553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
1292553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1302553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Get the path to the top of the Android source tree.
1312553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkingettop() {
1322553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  if [[ "x$ANDROID_BUILD_TOP" != "x" ]]; then
1332553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    echo "$ANDROID_BUILD_TOP";
1342553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  else
1352553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    echo "$(thisdir)/../../.."
1362553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  fi
1372553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
1382553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1392553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Get a build variable from the Android build system.
1402553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinget_build_var() {
1412553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local varname="$1"
1422553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1432553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # include the desired target product/build-variant
1442553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # which won't be set in our env if neither we nor the user first executed
1452553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # source build/envsetup.sh (e.g. if simulating from a fresh shell).
1462553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  local extras
1472553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  [[ -n $target_product ]] && extras+=" TARGET_PRODUCT=$target_product"
1482553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  [[ -n $target_build_variant ]] && extras+=" TARGET_BUILD_VARIANT=$target_build_variant"
1492553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1507b44ac0dc47a67f646c0683ca5f16d98265df855Dan Willemsen  # call dumpvar from the build system.
1517b44ac0dc47a67f646c0683ca5f16d98265df855Dan Willemsen  (\cd "$(gettop)"; env $extras build/soong/soong_ui.bash --dumpvar-mode $varname)
1522553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin}
1532553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1542553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Defaults from command-line.
1552553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1562553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinmode=""  # blank or 'golem' if --golem was specified.
1572553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkingolem_target="" # --golem=$golem_target
1582553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinconfig="" # --machine-type=$config
1597b44ac0dc47a67f646c0683ca5f16d98265df855Dan Willemsenj_arg=""
1602553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinshowcommands=""
1612553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinsimulate=""
1622553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinmake_tarball=""
1632553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkintarball=""
1642553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1652553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Parse command line arguments
1662553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1672553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinwhile [[ "$1" != "" ]]; do
1682553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  case "$1" in
1692553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --help)
1702553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      usage
1712553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      exit 1
1722553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
1732553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --golem=*)
1742553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      mode="golem"
1752553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      golem_target="${1##--golem=}"
1762553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1772553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      if [[ "x$golem_target" == x ]]; then
1782553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin        log_usage_error "Missing --golem target type."
1792553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      fi
1802553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
1812553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      shift
1822553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
1832553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --machine-type=*)
1842553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      config="${1##--machine-type=}"
1852553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      if ! contains_element "$config" "${ALL_CONFIGS[@]}"; then
1862553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin        log_usage_error "Invalid --machine-type value '$config'"
1872553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      fi
1882553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      shift
1892553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
1902553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --tarball)
1912553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      tarball="" # reuse the machine type name.
1922553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      make_tarball="make_tarball"
1932553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      shift
1942553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
1952553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --tarball=*)
1962553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      tarball="${1##--tarball=}"
1972553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      make_tarball="make_tarball"
1982553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      shift
1992553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
2002553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    -j*)
2012553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      j_arg="$1"
2022553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      shift
2032553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
2042553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --showcommands)
2052553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      showcommands="showcommands"
2062553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      shift
2072553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
2082553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    --simulate)
2092553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      simulate="simulate"
2102553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      shift
2112553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
2122553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    *)
2132553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      log_usage_error "Unknown options $1"
2142553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
2152553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  esac
2162553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkindone
2172553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2182553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin###################################
2192553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin###################################
2202553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin###################################
2212553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2222553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinif [[ -z $config ]]; then
2232553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  log_usage_error "--machine-type option is required."
2242553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinfi
2252553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2262553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# --tarball defaults to the --machine-type value with .tar.gz.
2272553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkintarball="${tarball:-$config.tar.gz}"
2282553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2292553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkintarget_product="$TARGET_PRODUCT"
2302553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkintarget_build_variant="$TARGET_BUILD_VARIANT"
2312553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2322553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# If not using --golem, use whatever the user had lunch'd prior to this script.
2332553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinif [[ $mode == "golem" ]]; then
2342553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # This section is intended solely to be executed by a golem build server.
2352553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2362553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  target_build_variant=eng
2372553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  case "$config" in
2382553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    *-armv7)
2392553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      target_product="arm_krait"
2402553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
2412553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    *-armv8)
2422553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      target_product="armv8"
2432553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
2442553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    *)
2452553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      target_product="sdk"
2462553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      ;;
2472553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  esac
2482553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2492553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  if [[ $target_product = arm* ]]; then
2502553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    # If using the regular manifest, e.g. 'master'
2512553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    # The lunch command for arm will assuredly fail because we don't have device/generic/art.
2522553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    #
2532553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    # Print a human-readable error message instead of trying to lunch and failing there.
2542553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    if ! [[ -d "$(gettop)/device/generic/art" ]]; then
2552553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      log_fatal "Missing device/generic/art directory. Perhaps try master-art repo manifest?\n" \
2562553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin                "       Cannot build ARM targets (arm_krait, armv8) for Golem." >&2
2572553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    fi
2582553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    # We could try to keep on simulating but it seems brittle because we won't have the proper
2592553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    # build variables to output the right strings.
2602553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  fi
2612553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2622553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # Get this particular target's environment variables (e.g. ART read barrier on/off).
2632553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  source "$(thisdir)"/env "$golem_target" || exit 1
2642553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2652553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  lunch_target="$target_product-$target_build_variant"
2662553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2672553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  execute 'source' build/envsetup.sh
2682553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # Build generic targets (as opposed to something specific like aosp_angler-eng).
2692553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  execute lunch "$lunch_target"
2702553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  setenv JACK_SERVER false
2712553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  setenv_escape JACK_REPOSITORY "$PWD/prebuilts/sdk/tools/jacks" '$PWD/prebuilts/sdk/tools/jacks'
2722553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # Golem uses master-art repository which is missing a lot of other libraries.
2732553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  setenv SOONG_ALLOW_MISSING_DEPENDENCIES true
2742553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # Golem may be missing tools such as javac from its path.
2752553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  setenv_escape PATH "/usr/lib/jvm/java-8-openjdk-amd64/bin/:$PATH" '/usr/lib/jvm/java-8-openjdk-amd64/bin/:$PATH'
2762553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinelse
2772553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # Look up the default variables from the build system if they weren't set already.
2782553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  [[ -z $target_product ]] && target_product="$(get_build_var TARGET_PRODUCT)"
2792553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  [[ -z $target_build_variant ]] && target_build_variant="$(get_build_var TARGET_BUILD_VARIANT)"
2802553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinfi
2812553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2822553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Defaults for all machine types.
2832553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinmake_target="build-art-target-golem"
2842553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinout_dir="out/x86_64"
2852553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinroot_dir_var="PRODUCT_OUT"
2862553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinstrip_symbols=false
2872553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinbit64_suffix=""
2882553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkintar_directories=(system data/art-test)
2892553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2902553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Per-machine type overrides
2912553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinif [[ $config == linux-arm* ]]; then
2922553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    setenv ART_TARGET_LINUX true
2932553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinfi
2942553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
2952553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkincase "$config" in
2962553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  linux-ia32|linux-x64)
2972553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    root_dir_var="HOST_OUT"
2982553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    # Android strips target builds automatically, but not host builds.
2992553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    strip_symbols=true
3002553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    make_target="build-art-host-golem"
3012553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3022553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    if [[ $config == linux-ia32 ]]; then
3032553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      out_dir="out/x86"
3042553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      setenv HOST_PREFER_32_BIT true
3052553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    else
3062553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin      bit64_suffix="64"
3072553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    fi
3082553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3092553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    tar_directories=(bin framework usr lib${bit64_suffix})
3102553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    ;;
3112553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  *-armv8)
3122553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    bit64_suffix="64"
3132553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    ;;
3142553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  *-armv7)
3152553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    ;;
3162553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  *)
3172553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    log_fatal "Unsupported machine-type '$config'"
3182553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinesac
3192553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3202553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Golem benchmark run commands expect a certain $OUT_DIR to be set,
3212553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# so specify it here.
3222553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#
3232553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Note: It is questionable if we want to customize this since users
3242553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# could alternatively probably use their own build directly (and forgo this script).
3252553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinsetenv OUT_DIR "$out_dir"
3262553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinroot_dir="$(get_build_var "$root_dir_var")"
3272553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3282553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinif [[ $mode == "golem" ]]; then
3292553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # For golem-style running only.
3302553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # Sets the DT_INTERP to this path in every .so we can run the
3312553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # non-system version of dalvikvm with our own copies of the dependencies (e.g. our own libc++).
3322553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  if [[ $config == android-* ]]; then
3332553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    # TODO: the linker can be relative to the binaries
3342553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    # (which is what we do for linux-armv8 and linux-armv7)
3352553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    golem_run_path="/data/local/tmp/runner/"
3362553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  else
3372553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    golem_run_path=""
3382553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  fi
3392553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3402553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # Only do this for target builds. Host doesn't need this.
3412553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  if [[ $config == *-arm* ]]; then
3422553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    setenv CUSTOM_TARGET_LINKER "${golem_run_path}${root_dir}/system/bin/linker${bit64_suffix}"
3432553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  fi
3442553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinfi
3452553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3462553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#
3472553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# Main command execution below here.
3482553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin# (everything prior to this just sets up environment variables,
3492553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#  and maybe calls lunch).
3502553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin#
3512553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3527b44ac0dc47a67f646c0683ca5f16d98265df855Dan Willemsenexecute build/soong/soong_ui.bash --make-mode "${j_arg}" "${make_target}"
3532553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3542553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinif $strip_symbols; then
3552553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # Further reduce size by stripping symbols.
3562553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  execute_noshow strip $root_dir/bin/* || true
3572553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  show_command strip $root_dir/bin/'*'  '|| true'
3582553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  execute_noshow strip $root_dir/lib${bit64_suffix}/'*'
3592553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  show_command strip $root_dir/lib${bit64_suffix}/'*'
3602553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinfi
3612553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3622553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinif [[ "$make_tarball" == "make_tarball" ]]; then
3632553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # Create a tarball which is required for the golem build resource.
3642553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  # (In particular, each golem benchmark's run commands depend on a list of resource files
3652553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  #  in order to have all the files it needs to actually execute,
3662553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  #  and this tarball would satisfy that particular target+machine-type's requirements).
3672553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  dirs_rooted=()
3682553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  for tar_dir in "${tar_directories[@]}"; do
3692553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    dirs_rooted+=("$root_dir/$tar_dir")
3702553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  done
3712553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3722553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  execute tar -czf "${tarball}" "${dirs_rooted[@]}" --exclude .git --exclude .gitignore
3732553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  tar_result=$?
3742553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  if [[ $tar_result -ne 0 ]]; then
3752553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin    [[ -f $tarball ]] && rm $tarball
3762553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  fi
3772553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
3782553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin  show_command '[[ $? -ne 0 ]] && rm' "$tarball"
3792553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkinfi
3802553887b8dd264497a8589ddddad9d5f8260b0a2Igor Murashkin
381