xref: /aosp_15_r20/external/toolchain-utils/binary_search_tool/android/setup.sh (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li#!/bin/bash -u
2*760c253cSXin Li#
3*760c253cSXin Li# Copyright 2016 Google LLC
4*760c253cSXin Li#
5*760c253cSXin Li# This script is part of the Android binary search triage process.
6*760c253cSXin Li# It should be the first script called by the user, after the user has set up
7*760c253cSXin Li# the two necessary build tree directories (see the prerequisites section of
8*760c253cSXin Li# README.android).
9*760c253cSXin Li#
10*760c253cSXin Li# WARNING:
11*760c253cSXin Li#   Before running this script make sure you have setup the Android build
12*760c253cSXin Li#   environment in this shell (i.e. successfully run 'lunch').
13*760c253cSXin Li#
14*760c253cSXin Li# This script takes three arguments.  The first argument must be the path of
15*760c253cSXin Li# the android source tree being tested. The second (optional) argument is the
16*760c253cSXin Li# device ID for fastboot/adb so the test device can be uniquely indentified in
17*760c253cSXin Li# case multiple phones are plugged in. The final (optional) argument is the
18*760c253cSXin Li# number of jobs that various programs can use for parallelism
19*760c253cSXin Li# (make, xargs, etc.). There is also the argument for bisection directory, but
20*760c253cSXin Li# this is not strictly an argument for just this script (as it should be set
21*760c253cSXin Li# during the POPULATE_GOOD and POPULATE_BAD steps, see README.android for
22*760c253cSXin Li# details).
23*760c253cSXin Li#
24*760c253cSXin Li# Example call:
25*760c253cSXin Li#   ANDROID_SERIAL=002ee16b1558a3d3 NUM_JOBS=10 android/setup.sh ~/android
26*760c253cSXin Li#
27*760c253cSXin Li#   This will setup the bisector for Nexus5X, using 10 jobs, where the android
28*760c253cSXin Li#   source lives at ~/android.
29*760c253cSXin Li#
30*760c253cSXin Li# NOTE: ANDROID_SERIAL is actually an option used by ADB. You can also simply
31*760c253cSXin Li# do 'export ANDROID_SERIAL=<device_id>' and the bisector will still work.
32*760c253cSXin Li# Furthermore, if your device is the only Android device plugged in you can
33*760c253cSXin Li# ignore ANDROID_SERIAL.
34*760c253cSXin Li#
35*760c253cSXin Li# This script sets all necessary environment variables, and ensures the
36*760c253cSXin Li# environment for the binary search triage process is setup properly. In
37*760c253cSXin Li# addition, this script generates common.sh, which generates enviroment
38*760c253cSXin Li# variables used by the other scripts in the package binary search triage process.
39*760c253cSXin Li#
40*760c253cSXin Li
41*760c253cSXin Li#
42*760c253cSXin Li# Positional arguments
43*760c253cSXin Li#
44*760c253cSXin Li
45*760c253cSXin LiANDROID_SRC=$1
46*760c253cSXin Li
47*760c253cSXin Li#
48*760c253cSXin Li# Optional arguments
49*760c253cSXin Li#
50*760c253cSXin Li
51*760c253cSXin Li# If DEVICE_ID is not null export this as ANDROID_SERIAL for use by adb
52*760c253cSXin Li# If DEVICE_ID is null then leave null
53*760c253cSXin LiDEVICE_ID=${ANDROID_SERIAL:+"export ANDROID_SERIAL=${ANDROID_SERIAL} "}
54*760c253cSXin Li
55*760c253cSXin LiNUM_JOBS=${NUM_JOBS:-"1"}
56*760c253cSXin LiBISECT_ANDROID_DIR=${BISECT_DIR:-~/ANDROID_BISECT}
57*760c253cSXin Li
58*760c253cSXin Li#
59*760c253cSXin Li# Set up basic variables.
60*760c253cSXin Li#
61*760c253cSXin Li
62*760c253cSXin LiGOOD_BUILD=${BISECT_ANDROID_DIR}/good
63*760c253cSXin LiBAD_BUILD=${BISECT_ANDROID_DIR}/bad
64*760c253cSXin LiWORK_BUILD=${ANDROID_SRC}
65*760c253cSXin Li
66*760c253cSXin Li#
67*760c253cSXin Li# Verify that the necessary directories exist.
68*760c253cSXin Li#
69*760c253cSXin Li
70*760c253cSXin Liif [[ ! -d ${GOOD_BUILD} ]] ; then
71*760c253cSXin Li  echo "Error:  ${GOOD_BUILD} does not exist."
72*760c253cSXin Li  exit 1
73*760c253cSXin Lifi
74*760c253cSXin Li
75*760c253cSXin Liif [[ ! -d ${BAD_BUILD} ]] ; then
76*760c253cSXin Li  echo "Error:  ${BAD_BUILD} does not exist."
77*760c253cSXin Li  exit 1
78*760c253cSXin Lifi
79*760c253cSXin Li
80*760c253cSXin Liif [[ ! -d ${WORK_BUILD} ]] ; then
81*760c253cSXin Li  echo "Error:  ${WORK_BUILD} does not exist."
82*760c253cSXin Li  exit 1
83*760c253cSXin Lifi
84*760c253cSXin Li
85*760c253cSXin Li#
86*760c253cSXin Li# Verify that good/bad object lists are the same
87*760c253cSXin Li#
88*760c253cSXin Li
89*760c253cSXin Ligood_list=`mktemp`
90*760c253cSXin Libad_list=`mktemp`
91*760c253cSXin Lisort ${GOOD_BUILD}/_LIST > good_list
92*760c253cSXin Lisort ${BAD_BUILD}/_LIST > bad_list
93*760c253cSXin Li
94*760c253cSXin Lidiff good_list bad_list
95*760c253cSXin Lidiff_result=$?
96*760c253cSXin Lirm good_list bad_list
97*760c253cSXin Li
98*760c253cSXin Liif [ ${diff_result} -ne 0 ]; then
99*760c253cSXin Li  echo "Error: good and bad object lists differ."
100*760c253cSXin Li  echo "diff exited with non-zero status: ${diff_result}"
101*760c253cSXin Li  exit 1
102*760c253cSXin Lifi
103*760c253cSXin Li
104*760c253cSXin Li#
105*760c253cSXin Li# Ensure android build environment is setup
106*760c253cSXin Li#
107*760c253cSXin Li# ANDROID_PRODUCT_OUT is only set once lunch is successfully executed. Fail if
108*760c253cSXin Li# ANDROID_PRODUCT_OUT is unset.
109*760c253cSXin Li#
110*760c253cSXin Li
111*760c253cSXin Liif [ -z ${ANDROID_PRODUCT_OUT+0} ]; then
112*760c253cSXin Li  echo "Error: Android build environment is not setup."
113*760c253cSXin Li  echo "cd to ${ANDROID_SRC} and do the following:"
114*760c253cSXin Li  echo "  source build/envsetup.sh"
115*760c253cSXin Li  echo "  lunch <device_lunch_combo>"
116*760c253cSXin Li  exit 1
117*760c253cSXin Lifi
118*760c253cSXin Li
119*760c253cSXin Li#
120*760c253cSXin Li# Create common.sh file, containing appropriate environment variables.
121*760c253cSXin Li#
122*760c253cSXin Li
123*760c253cSXin LiCOMMON_FILE="android/common.sh"
124*760c253cSXin Li
125*760c253cSXin Licat <<-EOF > ${COMMON_FILE}
126*760c253cSXin Li
127*760c253cSXin LiBISECT_ANDROID_DIR=${BISECT_ANDROID_DIR}
128*760c253cSXin Li
129*760c253cSXin LiBISECT_ANDROID_SRC=${ANDROID_SRC}
130*760c253cSXin LiBISECT_NUM_JOBS=${NUM_JOBS}
131*760c253cSXin Li
132*760c253cSXin LiBISECT_GOOD_BUILD=${GOOD_BUILD}
133*760c253cSXin LiBISECT_BAD_BUILD=${BAD_BUILD}
134*760c253cSXin LiBISECT_WORK_BUILD=${WORK_BUILD}
135*760c253cSXin Li
136*760c253cSXin LiBISECT_GOOD_SET=${GOOD_BUILD}/_LIST
137*760c253cSXin LiBISECT_BAD_SET=${BAD_BUILD}/_LIST
138*760c253cSXin Li
139*760c253cSXin Li${DEVICE_ID}
140*760c253cSXin Li
141*760c253cSXin Liexport BISECT_STAGE="TRIAGE"
142*760c253cSXin Li
143*760c253cSXin LiEOF
144*760c253cSXin Li
145*760c253cSXin Lichmod 755 ${COMMON_FILE}
146*760c253cSXin Li
147*760c253cSXin Liexit 0
148