#!/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=' 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 " 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