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