blob: 7f8ba0e99a7434d312ab4eb9bb74194740992d78 [file] [log] [blame]
#!/bin/bash -u
#
# Copyright 2016 Google Inc. All Rights Reserved.
#
# This script is part of the Android binary search triage process.
# It should be the first script called by the user, after the user has set up
# the two necessary build tree directories (see the prerequisites section of
# README.android).
#
# WARNING:
# Before running this script make sure you have setup the Android build
# environment in this shell (i.e. successfully run 'lunch').
#
# This script takes three arguments. The first argument must be the path of
# the android source tree being tested. The second (optional) argument is the
# device ID for fastboot/adb so the test device can be uniquely indentified in
# case multiple phones are plugged in. The final (optional) argument is the
# number of jobs that various programs can use for parallelism
# (make, xargs, etc.). There is also the argument for bisection directory, but
# this is not strictly an argument for just this script (as it should be set
# during the POPULATE_GOOD and POPULATE_BAD steps, see README.android for
# details).
#
# Example call:
# ANDROID_SERIAL=002ee16b1558a3d3 NUM_JOBS=10 android/setup.sh ~/android
#
# This will setup the bisector for Nexus5X, using 10 jobs, where the android
# source lives at ~/android.
#
# NOTE: ANDROID_SERIAL is actually an option used by ADB. You can also simply
# do 'export ANDROID_SERIAL=<device_id>' and the bisector will still work.
# Furthermore, if your device is the only Android device plugged in you can
# ignore ANDROID_SERIAL.
#
# This script sets all necessary environment variables, and ensures the
# environment for the binary search triage process is setup properly. In
# addition, this script generates common.sh, which generates enviroment
# variables used by the other scripts in the package binary search triage process.
#
#
# Positional arguments
#
ANDROID_SRC=$1
#
# Optional arguments
#
# If DEVICE_ID is not null export this as ANDROID_SERIAL for use by adb
# If DEVICE_ID is null then leave null
DEVICE_ID=${ANDROID_SERIAL:+"export ANDROID_SERIAL=${ANDROID_SERIAL} "}
NUM_JOBS=${NUM_JOBS:-"1"}
BISECT_ANDROID_DIR=${BISECT_DIR:-~/ANDROID_BISECT}
#
# Set up basic variables.
#
GOOD_BUILD=${BISECT_ANDROID_DIR}/good
BAD_BUILD=${BISECT_ANDROID_DIR}/bad
WORK_BUILD=${ANDROID_SRC}
#
# Verify that the necessary directories exist.
#
if [[ ! -d ${GOOD_BUILD} ]] ; then
echo "Error: ${GOOD_BUILD} does not exist."
exit 1
fi
if [[ ! -d ${BAD_BUILD} ]] ; then
echo "Error: ${BAD_BUILD} does not exist."
exit 1
fi
if [[ ! -d ${WORK_BUILD} ]] ; then
echo "Error: ${WORK_BUILD} does not exist."
exit 1
fi
#
# Verify that good/bad object lists are the same
#
good_list=`mktemp`
bad_list=`mktemp`
sort ${GOOD_BUILD}/_LIST > good_list
sort ${BAD_BUILD}/_LIST > bad_list
diff good_list bad_list
diff_result=$?
rm good_list bad_list
if [ ${diff_result} -ne 0 ]; then
echo "Error: good and bad object lists differ."
echo "diff exited with non-zero status: ${diff_result}"
exit 1
fi
#
# Ensure android build environment is setup
#
# ANDROID_PRODUCT_OUT is only set once lunch is successfully executed. Fail if
# ANDROID_PRODUCT_OUT is unset.
#
if [ -z ${ANDROID_PRODUCT_OUT+0} ]; then
echo "Error: Android build environment is not setup."
echo "cd to ${ANDROID_SRC} and do the following:"
echo " source build/envsetup.sh"
echo " lunch <device_lunch_combo>"
exit 1
fi
#
# Create common.sh file, containing appropriate environment variables.
#
COMMON_FILE="android/common.sh"
cat <<-EOF > ${COMMON_FILE}
BISECT_ANDROID_DIR=${BISECT_ANDROID_DIR}
BISECT_ANDROID_SRC=${ANDROID_SRC}
BISECT_NUM_JOBS=${NUM_JOBS}
BISECT_GOOD_BUILD=${GOOD_BUILD}
BISECT_BAD_BUILD=${BAD_BUILD}
BISECT_WORK_BUILD=${WORK_BUILD}
BISECT_GOOD_SET=${GOOD_BUILD}/_LIST
BISECT_BAD_SET=${BAD_BUILD}/_LIST
${DEVICE_ID}
export BISECT_STAGE="TRIAGE"
EOF
chmod 755 ${COMMON_FILE}
exit 0