xref: /aosp_15_r20/art/tools/golem/build-target.sh (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker#!/bin/bash
2*795d594fSAndroid Build Coastguard Worker#
3*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project
4*795d594fSAndroid Build Coastguard Worker#
5*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*795d594fSAndroid Build Coastguard Worker#
9*795d594fSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*795d594fSAndroid Build Coastguard Worker#
11*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*795d594fSAndroid Build Coastguard Worker# limitations under the License.
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Workerif [[ ! -d art ]]; then
18*795d594fSAndroid Build Coastguard Worker  echo "Script needs to be run at the root of the android tree"
19*795d594fSAndroid Build Coastguard Worker  exit 1
20*795d594fSAndroid Build Coastguard Workerfi
21*795d594fSAndroid Build Coastguard Worker
22*795d594fSAndroid Build Coastguard WorkerALL_CONFIGS=(linux-ia32 linux-x64 linux-armv8 linux-armv7 android-armv8 android-armv7)
23*795d594fSAndroid Build Coastguard Worker
24*795d594fSAndroid Build Coastguard Workerusage() {
25*795d594fSAndroid Build Coastguard Worker  local config
26*795d594fSAndroid Build Coastguard Worker  local golem_target
27*795d594fSAndroid Build Coastguard Worker
28*795d594fSAndroid Build Coastguard Worker  (cat << EOF
29*795d594fSAndroid Build Coastguard Worker  Usage: $(basename "${BASH_SOURCE[0]}") [--golem=<target>] --machine-type=MACHINE_TYPE
30*795d594fSAndroid Build Coastguard Worker                 [--tarball[=<target>.tar.gz]]
31*795d594fSAndroid Build Coastguard Worker
32*795d594fSAndroid Build Coastguard Worker  Build minimal art binaries required to run golem benchmarks either
33*795d594fSAndroid Build Coastguard Worker  locally or on the golem servers.
34*795d594fSAndroid Build Coastguard Worker
35*795d594fSAndroid Build Coastguard Worker  Creates the \$MACHINE_TYPE binaries in your \$OUT_DIR, and if --tarball was specified,
36*795d594fSAndroid Build Coastguard Worker  it also tars the results of the build together into your <target.tar.gz> file.
37*795d594fSAndroid Build Coastguard Worker  --------------------------------------------------------
38*795d594fSAndroid Build Coastguard Worker  Required Flags:
39*795d594fSAndroid Build Coastguard Worker    --machine-type=MT   Specify the machine type that will be built.
40*795d594fSAndroid Build Coastguard Worker
41*795d594fSAndroid Build Coastguard Worker  Optional Flags":
42*795d594fSAndroid Build Coastguard Worker    --golem=<target>    Builds with identical commands that Golem servers use.
43*795d594fSAndroid Build Coastguard Worker    --tarball[=o.tgz]   Tar/gz the results. File name defaults to <machine_type>.tar.gz
44*795d594fSAndroid Build Coastguard Worker    -j<num>             Specify how many jobs to use for parallelism.
45*795d594fSAndroid Build Coastguard Worker    --help              Print this help listing.
46*795d594fSAndroid Build Coastguard Worker    --showcommands      Show commands as they are being executed.
47*795d594fSAndroid Build Coastguard Worker    --simulate          Print commands only, don't execute commands.
48*795d594fSAndroid Build Coastguard WorkerEOF
49*795d594fSAndroid Build Coastguard Worker  ) | sed -e 's/^[[:space:]][[:space:]]//g' >&2 # Strip leading whitespace from heredoc.
50*795d594fSAndroid Build Coastguard Worker
51*795d594fSAndroid Build Coastguard Worker  echo >&2 "Available machine types:"
52*795d594fSAndroid Build Coastguard Worker  for config in "${ALL_CONFIGS[@]}"; do
53*795d594fSAndroid Build Coastguard Worker    echo >&2 "  $config"
54*795d594fSAndroid Build Coastguard Worker  done
55*795d594fSAndroid Build Coastguard Worker
56*795d594fSAndroid Build Coastguard Worker  echo >&2
57*795d594fSAndroid Build Coastguard Worker  echo >&2 "Available Golem targets:"
58*795d594fSAndroid Build Coastguard Worker  while IFS='' read -r golem_target; do
59*795d594fSAndroid Build Coastguard Worker    echo >&2 "  $golem_target"
60*795d594fSAndroid Build Coastguard Worker  done < <("$(thisdir)/env" --list-targets)
61*795d594fSAndroid Build Coastguard Worker}
62*795d594fSAndroid Build Coastguard Worker
63*795d594fSAndroid Build Coastguard Worker# Check if $1 element is in array $2
64*795d594fSAndroid Build Coastguard Workercontains_element() {
65*795d594fSAndroid Build Coastguard Worker  local e
66*795d594fSAndroid Build Coastguard Worker  for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
67*795d594fSAndroid Build Coastguard Worker  return 1
68*795d594fSAndroid Build Coastguard Worker}
69*795d594fSAndroid Build Coastguard Worker
70*795d594fSAndroid Build Coastguard Worker# Display a command, but don't execute it, if --showcommands was set.
71*795d594fSAndroid Build Coastguard Workershow_command() {
72*795d594fSAndroid Build Coastguard Worker  if [[ $showcommands == "showcommands" ]]; then
73*795d594fSAndroid Build Coastguard Worker    echo "$@"
74*795d594fSAndroid Build Coastguard Worker  fi
75*795d594fSAndroid Build Coastguard Worker}
76*795d594fSAndroid Build Coastguard Worker
77*795d594fSAndroid Build Coastguard Worker# Execute a command, displaying it if --showcommands was set.
78*795d594fSAndroid Build Coastguard Worker# If --simulate is used, command is not executed.
79*795d594fSAndroid Build Coastguard Workerexecute() {
80*795d594fSAndroid Build Coastguard Worker  show_command "$@"
81*795d594fSAndroid Build Coastguard Worker  execute_noshow "$@"
82*795d594fSAndroid Build Coastguard Worker}
83*795d594fSAndroid Build Coastguard Worker
84*795d594fSAndroid Build Coastguard Worker# Execute a command unless --simulate was used.
85*795d594fSAndroid Build Coastguard Workerexecute_noshow() {
86*795d594fSAndroid Build Coastguard Worker  if [[ $simulate == "simulate" ]]; then
87*795d594fSAndroid Build Coastguard Worker    return 0
88*795d594fSAndroid Build Coastguard Worker  fi
89*795d594fSAndroid Build Coastguard Worker
90*795d594fSAndroid Build Coastguard Worker  local prog="$1"
91*795d594fSAndroid Build Coastguard Worker  shift
92*795d594fSAndroid Build Coastguard Worker  "$prog" "$@"
93*795d594fSAndroid Build Coastguard Worker}
94*795d594fSAndroid Build Coastguard Worker
95*795d594fSAndroid Build Coastguard Worker# Export environment variable, echoing it to screen.
96*795d594fSAndroid Build Coastguard Workersetenv() {
97*795d594fSAndroid Build Coastguard Worker  local name="$1"
98*795d594fSAndroid Build Coastguard Worker  local value="$2"
99*795d594fSAndroid Build Coastguard Worker
100*795d594fSAndroid Build Coastguard Worker  export $name="$value"
101*795d594fSAndroid Build Coastguard Worker  echo export $name="$value"
102*795d594fSAndroid Build Coastguard Worker}
103*795d594fSAndroid Build Coastguard Worker
104*795d594fSAndroid Build Coastguard Worker# Export environment variable, echoing $3 to screen ($3 is meant to be unevaluated).
105*795d594fSAndroid Build Coastguard Workersetenv_escape() {
106*795d594fSAndroid Build Coastguard Worker  local name="$1"
107*795d594fSAndroid Build Coastguard Worker  local value="$2"
108*795d594fSAndroid Build Coastguard Worker  local escaped_value="$3"
109*795d594fSAndroid Build Coastguard Worker
110*795d594fSAndroid Build Coastguard Worker  export $name="$value"
111*795d594fSAndroid Build Coastguard Worker  echo export $name="$escaped_value"
112*795d594fSAndroid Build Coastguard Worker}
113*795d594fSAndroid Build Coastguard Worker
114*795d594fSAndroid Build Coastguard Workerlog_usage_error() {
115*795d594fSAndroid Build Coastguard Worker  echo >&2 "ERROR: " "$@"
116*795d594fSAndroid Build Coastguard Worker  echo >&2 "       See --help for the correct usage information."
117*795d594fSAndroid Build Coastguard Worker  exit 1
118*795d594fSAndroid Build Coastguard Worker}
119*795d594fSAndroid Build Coastguard Worker
120*795d594fSAndroid Build Coastguard Workerlog_fatal() {
121*795d594fSAndroid Build Coastguard Worker  echo >&2 "FATAL: " "$@"
122*795d594fSAndroid Build Coastguard Worker  exit 2
123*795d594fSAndroid Build Coastguard Worker}
124*795d594fSAndroid Build Coastguard Worker
125*795d594fSAndroid Build Coastguard Worker# Get the directory of this script.
126*795d594fSAndroid Build Coastguard Workerthisdir() {
127*795d594fSAndroid Build Coastguard Worker  (\cd "$(dirname "${BASH_SOURCE[0]}")" && pwd )
128*795d594fSAndroid Build Coastguard Worker}
129*795d594fSAndroid Build Coastguard Worker
130*795d594fSAndroid Build Coastguard Worker# Get the path to the top of the Android source tree.
131*795d594fSAndroid Build Coastguard Workergettop() {
132*795d594fSAndroid Build Coastguard Worker  if [[ "x$ANDROID_BUILD_TOP" != "x" ]]; then
133*795d594fSAndroid Build Coastguard Worker    echo "$ANDROID_BUILD_TOP";
134*795d594fSAndroid Build Coastguard Worker  else
135*795d594fSAndroid Build Coastguard Worker    echo "$(thisdir)/../../.."
136*795d594fSAndroid Build Coastguard Worker  fi
137*795d594fSAndroid Build Coastguard Worker}
138*795d594fSAndroid Build Coastguard Worker
139*795d594fSAndroid Build Coastguard Worker# Get a build variable from the Android build system.
140*795d594fSAndroid Build Coastguard Workerget_build_var() {
141*795d594fSAndroid Build Coastguard Worker  local varname="$1"
142*795d594fSAndroid Build Coastguard Worker
143*795d594fSAndroid Build Coastguard Worker  # include the desired target product/build-variant
144*795d594fSAndroid Build Coastguard Worker  # which won't be set in our env if neither we nor the user first executed
145*795d594fSAndroid Build Coastguard Worker  # source build/envsetup.sh (e.g. if simulating from a fresh shell).
146*795d594fSAndroid Build Coastguard Worker  local extras
147*795d594fSAndroid Build Coastguard Worker  [[ -n $target_product ]] && extras+=" TARGET_PRODUCT=$target_product"
148*795d594fSAndroid Build Coastguard Worker  [[ -n $target_build_variant ]] && extras+=" TARGET_BUILD_VARIANT=$target_build_variant"
149*795d594fSAndroid Build Coastguard Worker
150*795d594fSAndroid Build Coastguard Worker  # call dumpvar from the build system.
151*795d594fSAndroid Build Coastguard Worker  (\cd "$(gettop)"; env $extras build/soong/soong_ui.bash --dumpvar-mode $varname)
152*795d594fSAndroid Build Coastguard Worker}
153*795d594fSAndroid Build Coastguard Worker
154*795d594fSAndroid Build Coastguard Worker# Defaults from command-line.
155*795d594fSAndroid Build Coastguard Worker
156*795d594fSAndroid Build Coastguard Workermode=""  # blank or 'golem' if --golem was specified.
157*795d594fSAndroid Build Coastguard Workergolem_target="" # --golem=$golem_target
158*795d594fSAndroid Build Coastguard Workerconfig="" # --machine-type=$config
159*795d594fSAndroid Build Coastguard Workerj_arg=""
160*795d594fSAndroid Build Coastguard Workershowcommands=""
161*795d594fSAndroid Build Coastguard Workersimulate=""
162*795d594fSAndroid Build Coastguard Workermake_tarball=""
163*795d594fSAndroid Build Coastguard Workertarball=""
164*795d594fSAndroid Build Coastguard Worker
165*795d594fSAndroid Build Coastguard Worker# Parse command line arguments
166*795d594fSAndroid Build Coastguard Worker
167*795d594fSAndroid Build Coastguard Workerwhile [[ "$1" != "" ]]; do
168*795d594fSAndroid Build Coastguard Worker  case "$1" in
169*795d594fSAndroid Build Coastguard Worker    --help)
170*795d594fSAndroid Build Coastguard Worker      usage
171*795d594fSAndroid Build Coastguard Worker      exit 1
172*795d594fSAndroid Build Coastguard Worker      ;;
173*795d594fSAndroid Build Coastguard Worker    --golem=*)
174*795d594fSAndroid Build Coastguard Worker      mode="golem"
175*795d594fSAndroid Build Coastguard Worker      golem_target="${1##--golem=}"
176*795d594fSAndroid Build Coastguard Worker
177*795d594fSAndroid Build Coastguard Worker      if [[ "x$golem_target" == x ]]; then
178*795d594fSAndroid Build Coastguard Worker        log_usage_error "Missing --golem target type."
179*795d594fSAndroid Build Coastguard Worker      fi
180*795d594fSAndroid Build Coastguard Worker
181*795d594fSAndroid Build Coastguard Worker      shift
182*795d594fSAndroid Build Coastguard Worker      ;;
183*795d594fSAndroid Build Coastguard Worker    --machine-type=*)
184*795d594fSAndroid Build Coastguard Worker      config="${1##--machine-type=}"
185*795d594fSAndroid Build Coastguard Worker      if ! contains_element "$config" "${ALL_CONFIGS[@]}"; then
186*795d594fSAndroid Build Coastguard Worker        log_usage_error "Invalid --machine-type value '$config'"
187*795d594fSAndroid Build Coastguard Worker      fi
188*795d594fSAndroid Build Coastguard Worker      shift
189*795d594fSAndroid Build Coastguard Worker      ;;
190*795d594fSAndroid Build Coastguard Worker    --tarball)
191*795d594fSAndroid Build Coastguard Worker      tarball="" # reuse the machine type name.
192*795d594fSAndroid Build Coastguard Worker      make_tarball="make_tarball"
193*795d594fSAndroid Build Coastguard Worker      shift
194*795d594fSAndroid Build Coastguard Worker      ;;
195*795d594fSAndroid Build Coastguard Worker    --tarball=*)
196*795d594fSAndroid Build Coastguard Worker      tarball="${1##--tarball=}"
197*795d594fSAndroid Build Coastguard Worker      make_tarball="make_tarball"
198*795d594fSAndroid Build Coastguard Worker      shift
199*795d594fSAndroid Build Coastguard Worker      ;;
200*795d594fSAndroid Build Coastguard Worker    -j*)
201*795d594fSAndroid Build Coastguard Worker      j_arg="$1"
202*795d594fSAndroid Build Coastguard Worker      shift
203*795d594fSAndroid Build Coastguard Worker      ;;
204*795d594fSAndroid Build Coastguard Worker    --showcommands)
205*795d594fSAndroid Build Coastguard Worker      showcommands="showcommands"
206*795d594fSAndroid Build Coastguard Worker      shift
207*795d594fSAndroid Build Coastguard Worker      ;;
208*795d594fSAndroid Build Coastguard Worker    --simulate)
209*795d594fSAndroid Build Coastguard Worker      simulate="simulate"
210*795d594fSAndroid Build Coastguard Worker      shift
211*795d594fSAndroid Build Coastguard Worker      ;;
212*795d594fSAndroid Build Coastguard Worker    *)
213*795d594fSAndroid Build Coastguard Worker      log_usage_error "Unknown options $1"
214*795d594fSAndroid Build Coastguard Worker      ;;
215*795d594fSAndroid Build Coastguard Worker  esac
216*795d594fSAndroid Build Coastguard Workerdone
217*795d594fSAndroid Build Coastguard Worker
218*795d594fSAndroid Build Coastguard Worker###################################
219*795d594fSAndroid Build Coastguard Worker###################################
220*795d594fSAndroid Build Coastguard Worker###################################
221*795d594fSAndroid Build Coastguard Worker
222*795d594fSAndroid Build Coastguard Workerif [[ -z $config ]]; then
223*795d594fSAndroid Build Coastguard Worker  log_usage_error "--machine-type option is required."
224*795d594fSAndroid Build Coastguard Workerfi
225*795d594fSAndroid Build Coastguard Worker
226*795d594fSAndroid Build Coastguard Worker# --tarball defaults to the --machine-type value with .tar.gz.
227*795d594fSAndroid Build Coastguard Workertarball="${tarball:-$config.tar.gz}"
228*795d594fSAndroid Build Coastguard Worker
229*795d594fSAndroid Build Coastguard Workertarget_product="$TARGET_PRODUCT"
230*795d594fSAndroid Build Coastguard Workertarget_build_variant="$TARGET_BUILD_VARIANT"
231*795d594fSAndroid Build Coastguard Worker
232*795d594fSAndroid Build Coastguard Worker# If not using --golem, use whatever the user had lunch'd prior to this script.
233*795d594fSAndroid Build Coastguard Workerif [[ $mode == "golem" ]]; then
234*795d594fSAndroid Build Coastguard Worker  # This section is intended solely to be executed by a golem build server.
235*795d594fSAndroid Build Coastguard Worker
236*795d594fSAndroid Build Coastguard Worker  target_build_variant=eng
237*795d594fSAndroid Build Coastguard Worker  case "$config" in
238*795d594fSAndroid Build Coastguard Worker    *-armv7)
239*795d594fSAndroid Build Coastguard Worker      target_product="arm_krait"
240*795d594fSAndroid Build Coastguard Worker      ;;
241*795d594fSAndroid Build Coastguard Worker    *-armv8)
242*795d594fSAndroid Build Coastguard Worker      target_product="armv8"
243*795d594fSAndroid Build Coastguard Worker      ;;
244*795d594fSAndroid Build Coastguard Worker    *)
245*795d594fSAndroid Build Coastguard Worker      target_product="sdk"
246*795d594fSAndroid Build Coastguard Worker      ;;
247*795d594fSAndroid Build Coastguard Worker  esac
248*795d594fSAndroid Build Coastguard Worker
249*795d594fSAndroid Build Coastguard Worker  if [[ $target_product = arm* ]]; then
250*795d594fSAndroid Build Coastguard Worker    # If using the regular manifest, e.g. 'master'
251*795d594fSAndroid Build Coastguard Worker    # The lunch command for arm will assuredly fail because we don't have device/generic/art.
252*795d594fSAndroid Build Coastguard Worker    #
253*795d594fSAndroid Build Coastguard Worker    # Print a human-readable error message instead of trying to lunch and failing there.
254*795d594fSAndroid Build Coastguard Worker    if ! [[ -d "$(gettop)/device/generic/art" ]]; then
255*795d594fSAndroid Build Coastguard Worker      log_fatal "Missing device/generic/art directory. Perhaps try master-art repo manifest?\n" \
256*795d594fSAndroid Build Coastguard Worker                "       Cannot build ARM targets (arm_krait, armv8) for Golem." >&2
257*795d594fSAndroid Build Coastguard Worker    fi
258*795d594fSAndroid Build Coastguard Worker    # We could try to keep on simulating but it seems brittle because we won't have the proper
259*795d594fSAndroid Build Coastguard Worker    # build variables to output the right strings.
260*795d594fSAndroid Build Coastguard Worker  fi
261*795d594fSAndroid Build Coastguard Worker
262*795d594fSAndroid Build Coastguard Worker  # Get this particular target's environment variables (e.g. ART read barrier on/off).
263*795d594fSAndroid Build Coastguard Worker  source "$(thisdir)"/env "$golem_target" || exit 1
264*795d594fSAndroid Build Coastguard Worker
265*795d594fSAndroid Build Coastguard Worker  lunch_target="$target_product-$target_build_variant"
266*795d594fSAndroid Build Coastguard Worker
267*795d594fSAndroid Build Coastguard Worker  execute 'source' build/envsetup.sh
268*795d594fSAndroid Build Coastguard Worker  # Build generic targets (as opposed to something specific like aosp_angler-eng).
269*795d594fSAndroid Build Coastguard Worker  execute lunch "$lunch_target"
270*795d594fSAndroid Build Coastguard Worker  # Golem uses master-art repository which is missing a lot of other libraries.
271*795d594fSAndroid Build Coastguard Worker  setenv SOONG_ALLOW_MISSING_DEPENDENCIES true
272*795d594fSAndroid Build Coastguard Worker  # Let the build system know we're not aiming to do a full platform build.
273*795d594fSAndroid Build Coastguard Worker  if [ ! -d frameworks/base ]; then
274*795d594fSAndroid Build Coastguard Worker    setenv TARGET_BUILD_UNBUNDLED true
275*795d594fSAndroid Build Coastguard Worker  fi
276*795d594fSAndroid Build Coastguard Worker  # Skip the boot image profile, to make the compiled boot image more consistent.
277*795d594fSAndroid Build Coastguard Worker  setenv WITH_DEX_PREOPT_GENERATE_PROFILE false
278*795d594fSAndroid Build Coastguard Worker  # Golem may be missing tools such as javac from its path.
279*795d594fSAndroid Build Coastguard Worker  setenv_escape PATH "/usr/lib/jvm/java-8-openjdk-amd64/bin/:$PATH" '/usr/lib/jvm/java-8-openjdk-amd64/bin/:$PATH'
280*795d594fSAndroid Build Coastguard Workerelse
281*795d594fSAndroid Build Coastguard Worker  # Look up the default variables from the build system if they weren't set already.
282*795d594fSAndroid Build Coastguard Worker  [[ -z $target_product ]] && target_product="$(get_build_var TARGET_PRODUCT)"
283*795d594fSAndroid Build Coastguard Worker  [[ -z $target_build_variant ]] && target_build_variant="$(get_build_var TARGET_BUILD_VARIANT)"
284*795d594fSAndroid Build Coastguard Workerfi
285*795d594fSAndroid Build Coastguard Worker
286*795d594fSAndroid Build Coastguard Worker# Defaults for all machine types.
287*795d594fSAndroid Build Coastguard Workermake_target="build-art-target-golem"
288*795d594fSAndroid Build Coastguard Workerout_dir="out/x86_64"
289*795d594fSAndroid Build Coastguard Workerroot_dir_var="PRODUCT_OUT"
290*795d594fSAndroid Build Coastguard Workerstrip_symbols=false
291*795d594fSAndroid Build Coastguard Workerbit64_suffix=""
292*795d594fSAndroid Build Coastguard Workertar_directories=(system data/art-test)
293*795d594fSAndroid Build Coastguard Worker
294*795d594fSAndroid Build Coastguard Worker# Per-machine type overrides
295*795d594fSAndroid Build Coastguard Workerif [[ $config == linux-arm* ]]; then
296*795d594fSAndroid Build Coastguard Worker    setenv ART_TARGET_LINUX true
297*795d594fSAndroid Build Coastguard Workerfi
298*795d594fSAndroid Build Coastguard Worker
299*795d594fSAndroid Build Coastguard Workercase "$config" in
300*795d594fSAndroid Build Coastguard Worker  linux-ia32|linux-x64)
301*795d594fSAndroid Build Coastguard Worker    root_dir_var="HOST_OUT"
302*795d594fSAndroid Build Coastguard Worker    # Android strips target builds automatically, but not host builds.
303*795d594fSAndroid Build Coastguard Worker    strip_symbols=true
304*795d594fSAndroid Build Coastguard Worker    make_target="build-art-host-golem"
305*795d594fSAndroid Build Coastguard Worker
306*795d594fSAndroid Build Coastguard Worker    if [[ $config == linux-ia32 ]]; then
307*795d594fSAndroid Build Coastguard Worker      out_dir="out/x86"
308*795d594fSAndroid Build Coastguard Worker      setenv HOST_PREFER_32_BIT true
309*795d594fSAndroid Build Coastguard Worker    else
310*795d594fSAndroid Build Coastguard Worker      bit64_suffix="64"
311*795d594fSAndroid Build Coastguard Worker    fi
312*795d594fSAndroid Build Coastguard Worker
313*795d594fSAndroid Build Coastguard Worker    tar_directories=(bin framework usr lib${bit64_suffix})
314*795d594fSAndroid Build Coastguard Worker    ;;
315*795d594fSAndroid Build Coastguard Worker  *-armv8)
316*795d594fSAndroid Build Coastguard Worker    bit64_suffix="64"
317*795d594fSAndroid Build Coastguard Worker    ;;
318*795d594fSAndroid Build Coastguard Worker  *-armv7)
319*795d594fSAndroid Build Coastguard Worker    ;;
320*795d594fSAndroid Build Coastguard Worker  *)
321*795d594fSAndroid Build Coastguard Worker    log_fatal "Unsupported machine-type '$config'"
322*795d594fSAndroid Build Coastguard Workeresac
323*795d594fSAndroid Build Coastguard Worker
324*795d594fSAndroid Build Coastguard Worker# Golem benchmark run commands expect a certain $OUT_DIR to be set,
325*795d594fSAndroid Build Coastguard Worker# so specify it here.
326*795d594fSAndroid Build Coastguard Worker#
327*795d594fSAndroid Build Coastguard Worker# Note: It is questionable if we want to customize this since users
328*795d594fSAndroid Build Coastguard Worker# could alternatively probably use their own build directly (and forgo this script).
329*795d594fSAndroid Build Coastguard Workersetenv OUT_DIR "$out_dir"
330*795d594fSAndroid Build Coastguard Workerroot_dir="$(get_build_var "$root_dir_var")"
331*795d594fSAndroid Build Coastguard Worker
332*795d594fSAndroid Build Coastguard Workerif [[ $mode == "golem" ]]; then
333*795d594fSAndroid Build Coastguard Worker  # For golem-style running only.
334*795d594fSAndroid Build Coastguard Worker  # Sets the DT_INTERP to this path in every .so we can run the
335*795d594fSAndroid Build Coastguard Worker  # non-system version of dalvikvm with our own copies of the dependencies (e.g. our own libc++).
336*795d594fSAndroid Build Coastguard Worker  if [[ $config == android-* ]]; then
337*795d594fSAndroid Build Coastguard Worker    # TODO: the linker can be relative to the binaries
338*795d594fSAndroid Build Coastguard Worker    # (which is what we do for linux-armv8 and linux-armv7)
339*795d594fSAndroid Build Coastguard Worker    golem_run_path="/data/local/tmp/runner/"
340*795d594fSAndroid Build Coastguard Worker  else
341*795d594fSAndroid Build Coastguard Worker    golem_run_path=""
342*795d594fSAndroid Build Coastguard Worker  fi
343*795d594fSAndroid Build Coastguard Worker
344*795d594fSAndroid Build Coastguard Worker  # Only do this for target builds. Host doesn't need this.
345*795d594fSAndroid Build Coastguard Worker  if [[ $config == *-arm* ]]; then
346*795d594fSAndroid Build Coastguard Worker    setenv CUSTOM_TARGET_LINKER "${golem_run_path}${root_dir}/system/bin/linker${bit64_suffix}"
347*795d594fSAndroid Build Coastguard Worker  fi
348*795d594fSAndroid Build Coastguard Workerfi
349*795d594fSAndroid Build Coastguard Worker
350*795d594fSAndroid Build Coastguard Worker#
351*795d594fSAndroid Build Coastguard Worker# Main command execution below here.
352*795d594fSAndroid Build Coastguard Worker# (everything prior to this just sets up environment variables,
353*795d594fSAndroid Build Coastguard Worker#  and maybe calls lunch).
354*795d594fSAndroid Build Coastguard Worker#
355*795d594fSAndroid Build Coastguard Worker
356*795d594fSAndroid Build Coastguard Workerexecute build/soong/soong_ui.bash --make-mode "${j_arg}" "${make_target}"
357*795d594fSAndroid Build Coastguard Worker
358*795d594fSAndroid Build Coastguard Workerif $strip_symbols; then
359*795d594fSAndroid Build Coastguard Worker  # Further reduce size by stripping symbols.
360*795d594fSAndroid Build Coastguard Worker  execute_noshow strip $root_dir/bin/* || true
361*795d594fSAndroid Build Coastguard Worker  show_command strip $root_dir/bin/'*'  '|| true'
362*795d594fSAndroid Build Coastguard Worker  execute_noshow strip $root_dir/lib${bit64_suffix}/'*'
363*795d594fSAndroid Build Coastguard Worker  show_command strip $root_dir/lib${bit64_suffix}/'*'
364*795d594fSAndroid Build Coastguard Workerfi
365*795d594fSAndroid Build Coastguard Worker
366*795d594fSAndroid Build Coastguard Workerif [[ "$make_tarball" == "make_tarball" ]]; then
367*795d594fSAndroid Build Coastguard Worker  # Create a tarball which is required for the golem build resource.
368*795d594fSAndroid Build Coastguard Worker  # (In particular, each golem benchmark's run commands depend on a list of resource files
369*795d594fSAndroid Build Coastguard Worker  #  in order to have all the files it needs to actually execute,
370*795d594fSAndroid Build Coastguard Worker  #  and this tarball would satisfy that particular target+machine-type's requirements).
371*795d594fSAndroid Build Coastguard Worker  dirs_rooted=()
372*795d594fSAndroid Build Coastguard Worker  for tar_dir in "${tar_directories[@]}"; do
373*795d594fSAndroid Build Coastguard Worker    dirs_rooted+=("$root_dir/$tar_dir")
374*795d594fSAndroid Build Coastguard Worker  done
375*795d594fSAndroid Build Coastguard Worker
376*795d594fSAndroid Build Coastguard Worker  execute tar -czf "${tarball}" --exclude ".git" --exclude ".gitignore" "${dirs_rooted[@]}"
377*795d594fSAndroid Build Coastguard Worker  tar_result=$?
378*795d594fSAndroid Build Coastguard Worker  if [[ $tar_result -ne 0 ]]; then
379*795d594fSAndroid Build Coastguard Worker    [[ -f $tarball ]] && rm $tarball
380*795d594fSAndroid Build Coastguard Worker  fi
381*795d594fSAndroid Build Coastguard Worker
382*795d594fSAndroid Build Coastguard Worker  show_command '[[ $? -ne 0 ]] && rm' "$tarball"
383*795d594fSAndroid Build Coastguard Workerfi
384*795d594fSAndroid Build Coastguard Worker
385