Home | History | Annotate | Download | only in build
      1 function hmm() {
      2 cat <<EOF
      3 Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
      4 - lunch:   lunch <product_name>-<build_variant>
      5 - tapas:   tapas [<App1> <App2> ...] [arm|x86|mips|armv5] [eng|userdebug|user]
      6 - croot:   Changes directory to the top of the tree.
      7 - m:       Makes from the top of the tree.
      8 - mm:      Builds all of the modules in the current directory, but not their dependencies.
      9 - mmm:     Builds all of the modules in the supplied directories, but not their dependencies.
     10 - mma:     Builds all of the modules in the current directory, and their dependencies.
     11 - mmma:    Builds all of the modules in the supplied directories, and their dependencies.
     12 - cgrep:   Greps on all local C/C++ files.
     13 - jgrep:   Greps on all local Java files.
     14 - resgrep: Greps on all local res/*.xml files.
     15 - godir:   Go to the directory containing a file.
     16 
     17 Look at the source to view more functions. The complete list is:
     18 EOF
     19     T=$(gettop)
     20     local A
     21     A=""
     22     for i in `cat $T/build/envsetup.sh | sed -n "/^function /s/function \([a-z_]*\).*/\1/p" | sort`; do
     23       A="$A $i"
     24     done
     25     echo $A
     26 }
     27 
     28 # Get the value of a build variable as an absolute path.
     29 function get_abs_build_var()
     30 {
     31     T=$(gettop)
     32     if [ ! "$T" ]; then
     33         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
     34         return
     35     fi
     36     (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
     37       make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-abs-$1)
     38 }
     39 
     40 # Get the exact value of a build variable.
     41 function get_build_var()
     42 {
     43     T=$(gettop)
     44     if [ ! "$T" ]; then
     45         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
     46         return
     47     fi
     48     CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
     49       make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1
     50 }
     51 
     52 # check to see if the supplied product is one we can build
     53 function check_product()
     54 {
     55     T=$(gettop)
     56     if [ ! "$T" ]; then
     57         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
     58         return
     59     fi
     60     CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
     61         TARGET_PRODUCT=$1 \
     62         TARGET_BUILD_VARIANT= \
     63         TARGET_BUILD_TYPE= \
     64         TARGET_BUILD_APPS= \
     65         get_build_var TARGET_DEVICE > /dev/null
     66     # hide successful answers, but allow the errors to show
     67 }
     68 
     69 VARIANT_CHOICES=(user userdebug eng)
     70 
     71 # check to see if the supplied variant is valid
     72 function check_variant()
     73 {
     74     for v in ${VARIANT_CHOICES[@]}
     75     do
     76         if [ "$v" = "$1" ]
     77         then
     78             return 0
     79         fi
     80     done
     81     return 1
     82 }
     83 
     84 function setpaths()
     85 {
     86     T=$(gettop)
     87     if [ ! "$T" ]; then
     88         echo "Couldn't locate the top of the tree.  Try setting TOP."
     89         return
     90     fi
     91 
     92     ##################################################################
     93     #                                                                #
     94     #              Read me before you modify this code               #
     95     #                                                                #
     96     #   This function sets ANDROID_BUILD_PATHS to what it is adding  #
     97     #   to PATH, and the next time it is run, it removes that from   #
     98     #   PATH.  This is required so lunch can be run more than once   #
     99     #   and still have working paths.                                #
    100     #                                                                #
    101     ##################################################################
    102 
    103     # Note: on windows/cygwin, ANDROID_BUILD_PATHS will contain spaces
    104     # due to "C:\Program Files" being in the path.
    105 
    106     # out with the old
    107     if [ -n "$ANDROID_BUILD_PATHS" ] ; then
    108         export PATH=${PATH/$ANDROID_BUILD_PATHS/}
    109     fi
    110     if [ -n "$ANDROID_PRE_BUILD_PATHS" ] ; then
    111         export PATH=${PATH/$ANDROID_PRE_BUILD_PATHS/}
    112         # strip leading ':', if any
    113         export PATH=${PATH/:%/}
    114     fi
    115 
    116     # and in with the new
    117     CODE_REVIEWS=
    118     prebuiltdir=$(getprebuilt)
    119     gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS)
    120 
    121     # defined in core/config.mk
    122     targetgccversion=$(get_build_var TARGET_GCC_VERSION)
    123     export TARGET_GCC_VERSION=$targetgccversion
    124 
    125     # The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it.
    126     export ANDROID_EABI_TOOLCHAIN=
    127     local ARCH=$(get_build_var TARGET_ARCH)
    128     case $ARCH in
    129         x86) toolchaindir=x86/i686-linux-android-$targetgccversion/bin
    130             ;;
    131         arm) toolchaindir=arm/arm-linux-androideabi-$targetgccversion/bin
    132             ;;
    133         mips) toolchaindir=mips/mipsel-linux-android-$targetgccversion/bin
    134             ;;
    135         *)
    136             echo "Can't find toolchain for unknown architecture: $ARCH"
    137             toolchaindir=xxxxxxxxx
    138             ;;
    139     esac
    140     if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
    141         export ANDROID_EABI_TOOLCHAIN=$gccprebuiltdir/$toolchaindir
    142     fi
    143 
    144     unset ARM_EABI_TOOLCHAIN ARM_EABI_TOOLCHAIN_PATH
    145     case $ARCH in
    146         arm)
    147             toolchaindir=arm/arm-eabi-$targetgccversion/bin
    148             if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
    149                  export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir"
    150                  ARM_EABI_TOOLCHAIN_PATH=":$gccprebuiltdir/$toolchaindir"
    151             fi
    152             ;;
    153         mips) toolchaindir=mips/mips-eabi-4.4.3/bin
    154             ;;
    155         *)
    156             # No need to set ARM_EABI_TOOLCHAIN for other ARCHs
    157             ;;
    158     esac
    159 
    160     export ANDROID_TOOLCHAIN=$ANDROID_EABI_TOOLCHAIN
    161     export ANDROID_QTOOLS=$T/development/emulator/qtools
    162     export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools
    163     export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_QTOOLS:$ANDROID_TOOLCHAIN$ARM_EABI_TOOLCHAIN_PATH$CODE_REVIEWS:$ANDROID_DEV_SCRIPTS:
    164     export PATH=$ANDROID_BUILD_PATHS$PATH
    165 
    166     unset ANDROID_JAVA_TOOLCHAIN
    167     unset ANDROID_PRE_BUILD_PATHS
    168     if [ -n "$JAVA_HOME" ]; then
    169         export ANDROID_JAVA_TOOLCHAIN=$JAVA_HOME/bin
    170         export ANDROID_PRE_BUILD_PATHS=$ANDROID_JAVA_TOOLCHAIN:
    171         export PATH=$ANDROID_PRE_BUILD_PATHS$PATH
    172     fi
    173 
    174     unset ANDROID_PRODUCT_OUT
    175     export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT)
    176     export OUT=$ANDROID_PRODUCT_OUT
    177 
    178     unset ANDROID_HOST_OUT
    179     export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT)
    180 
    181     # needed for processing samples collected by perf counters
    182     unset OPROFILE_EVENTS_DIR
    183     export OPROFILE_EVENTS_DIR=$T/external/oprofile/events
    184 
    185     # needed for building linux on MacOS
    186     # TODO: fix the path
    187     #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include
    188 }
    189 
    190 function printconfig()
    191 {
    192     T=$(gettop)
    193     if [ ! "$T" ]; then
    194         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
    195         return
    196     fi
    197     get_build_var report_config
    198 }
    199 
    200 function set_stuff_for_environment()
    201 {
    202     settitle
    203     set_java_home
    204     setpaths
    205     set_sequence_number
    206 
    207     export ANDROID_BUILD_TOP=$(gettop)
    208 }
    209 
    210 function set_sequence_number()
    211 {
    212     export BUILD_ENV_SEQUENCE_NUMBER=10
    213 }
    214 
    215 function settitle()
    216 {
    217     if [ "$STAY_OFF_MY_LAWN" = "" ]; then
    218         local arch=$(gettargetarch)
    219         local product=$TARGET_PRODUCT
    220         local variant=$TARGET_BUILD_VARIANT
    221         local apps=$TARGET_BUILD_APPS
    222         if [ -z "$apps" ]; then
    223             export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""
    224         else
    225             export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\""
    226         fi
    227     fi
    228 }
    229 
    230 function addcompletions()
    231 {
    232     local T dir f
    233 
    234     # Keep us from trying to run in something that isn't bash.
    235     if [ -z "${BASH_VERSION}" ]; then
    236         return
    237     fi
    238 
    239     # Keep us from trying to run in bash that's too old.
    240     if [ ${BASH_VERSINFO[0]} -lt 3 ]; then
    241         return
    242     fi
    243 
    244     dir="sdk/bash_completion"
    245     if [ -d ${dir} ]; then
    246         for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do
    247             echo "including $f"
    248             . $f
    249         done
    250     fi
    251 }
    252 
    253 function choosetype()
    254 {
    255     echo "Build type choices are:"
    256     echo "     1. release"
    257     echo "     2. debug"
    258     echo
    259 
    260     local DEFAULT_NUM DEFAULT_VALUE
    261     DEFAULT_NUM=1
    262     DEFAULT_VALUE=release
    263 
    264     export TARGET_BUILD_TYPE=
    265     local ANSWER
    266     while [ -z $TARGET_BUILD_TYPE ]
    267     do
    268         echo -n "Which would you like? ["$DEFAULT_NUM"] "
    269         if [ -z "$1" ] ; then
    270             read ANSWER
    271         else
    272             echo $1
    273             ANSWER=$1
    274         fi
    275         case $ANSWER in
    276         "")
    277             export TARGET_BUILD_TYPE=$DEFAULT_VALUE
    278             ;;
    279         1)
    280             export TARGET_BUILD_TYPE=release
    281             ;;
    282         release)
    283             export TARGET_BUILD_TYPE=release
    284             ;;
    285         2)
    286             export TARGET_BUILD_TYPE=debug
    287             ;;
    288         debug)
    289             export TARGET_BUILD_TYPE=debug
    290             ;;
    291         *)
    292             echo
    293             echo "I didn't understand your response.  Please try again."
    294             echo
    295             ;;
    296         esac
    297         if [ -n "$1" ] ; then
    298             break
    299         fi
    300     done
    301 
    302     set_stuff_for_environment
    303 }
    304 
    305 #
    306 # This function isn't really right:  It chooses a TARGET_PRODUCT
    307 # based on the list of boards.  Usually, that gets you something
    308 # that kinda works with a generic product, but really, you should
    309 # pick a product by name.
    310 #
    311 function chooseproduct()
    312 {
    313     if [ "x$TARGET_PRODUCT" != x ] ; then
    314         default_value=$TARGET_PRODUCT
    315     else
    316         default_value=full
    317     fi
    318 
    319     export TARGET_PRODUCT=
    320     local ANSWER
    321     while [ -z "$TARGET_PRODUCT" ]
    322     do
    323         echo -n "Which product would you like? [$default_value] "
    324         if [ -z "$1" ] ; then
    325             read ANSWER
    326         else
    327             echo $1
    328             ANSWER=$1
    329         fi
    330 
    331         if [ -z "$ANSWER" ] ; then
    332             export TARGET_PRODUCT=$default_value
    333         else
    334             if check_product $ANSWER
    335             then
    336                 export TARGET_PRODUCT=$ANSWER
    337             else
    338                 echo "** Not a valid product: $ANSWER"
    339             fi
    340         fi
    341         if [ -n "$1" ] ; then
    342             break
    343         fi
    344     done
    345 
    346     set_stuff_for_environment
    347 }
    348 
    349 function choosevariant()
    350 {
    351     echo "Variant choices are:"
    352     local index=1
    353     local v
    354     for v in ${VARIANT_CHOICES[@]}
    355     do
    356         # The product name is the name of the directory containing
    357         # the makefile we found, above.
    358         echo "     $index. $v"
    359         index=$(($index+1))
    360     done
    361 
    362     local default_value=eng
    363     local ANSWER
    364 
    365     export TARGET_BUILD_VARIANT=
    366     while [ -z "$TARGET_BUILD_VARIANT" ]
    367     do
    368         echo -n "Which would you like? [$default_value] "
    369         if [ -z "$1" ] ; then
    370             read ANSWER
    371         else
    372             echo $1
    373             ANSWER=$1
    374         fi
    375 
    376         if [ -z "$ANSWER" ] ; then
    377             export TARGET_BUILD_VARIANT=$default_value
    378         elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then
    379             if [ "$ANSWER" -le "${#VARIANT_CHOICES[@]}" ] ; then
    380                 export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-1))]}
    381             fi
    382         else
    383             if check_variant $ANSWER
    384             then
    385                 export TARGET_BUILD_VARIANT=$ANSWER
    386             else
    387                 echo "** Not a valid variant: $ANSWER"
    388             fi
    389         fi
    390         if [ -n "$1" ] ; then
    391             break
    392         fi
    393     done
    394 }
    395 
    396 function choosecombo()
    397 {
    398     choosetype $1
    399 
    400     echo
    401     echo
    402     chooseproduct $2
    403 
    404     echo
    405     echo
    406     choosevariant $3
    407 
    408     echo
    409     set_stuff_for_environment
    410     printconfig
    411 }
    412 
    413 # Clear this variable.  It will be built up again when the vendorsetup.sh
    414 # files are included at the end of this file.
    415 unset LUNCH_MENU_CHOICES
    416 function add_lunch_combo()
    417 {
    418     local new_combo=$1
    419     local c
    420     for c in ${LUNCH_MENU_CHOICES[@]} ; do
    421         if [ "$new_combo" = "$c" ] ; then
    422             return
    423         fi
    424     done
    425     LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
    426 }
    427 
    428 # add the default one here
    429 add_lunch_combo aosp_arm-eng
    430 add_lunch_combo aosp_x86-eng
    431 add_lunch_combo aosp_mips-eng
    432 add_lunch_combo vbox_x86-eng
    433 
    434 function print_lunch_menu()
    435 {
    436     local uname=$(uname)
    437     echo
    438     echo "You're building on" $uname
    439     echo
    440     echo "Lunch menu... pick a combo:"
    441 
    442     local i=1
    443     local choice
    444     for choice in ${LUNCH_MENU_CHOICES[@]}
    445     do
    446         echo "     $i. $choice"
    447         i=$(($i+1))
    448     done
    449 
    450     echo
    451 }
    452 
    453 function lunch()
    454 {
    455     local answer
    456 
    457     if [ "$1" ] ; then
    458         answer=$1
    459     else
    460         print_lunch_menu
    461         echo -n "Which would you like? [aosp_arm-eng] "
    462         read answer
    463     fi
    464 
    465     local selection=
    466 
    467     if [ -z "$answer" ]
    468     then
    469         selection=aosp_arm-eng
    470     elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
    471     then
    472         if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
    473         then
    474             selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
    475         fi
    476     elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
    477     then
    478         selection=$answer
    479     fi
    480 
    481     if [ -z "$selection" ]
    482     then
    483         echo
    484         echo "Invalid lunch combo: $answer"
    485         return 1
    486     fi
    487 
    488     export TARGET_BUILD_APPS=
    489 
    490     local product=$(echo -n $selection | sed -e "s/-.*$//")
    491     check_product $product
    492     if [ $? -ne 0 ]
    493     then
    494         echo
    495         echo "** Don't have a product spec for: '$product'"
    496         echo "** Do you have the right repo manifest?"
    497         product=
    498     fi
    499 
    500     local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
    501     check_variant $variant
    502     if [ $? -ne 0 ]
    503     then
    504         echo
    505         echo "** Invalid variant: '$variant'"
    506         echo "** Must be one of ${VARIANT_CHOICES[@]}"
    507         variant=
    508     fi
    509 
    510     if [ -z "$product" -o -z "$variant" ]
    511     then
    512         echo
    513         return 1
    514     fi
    515 
    516     export TARGET_PRODUCT=$product
    517     export TARGET_BUILD_VARIANT=$variant
    518     export TARGET_BUILD_TYPE=release
    519 
    520     echo
    521 
    522     set_stuff_for_environment
    523     printconfig
    524 }
    525 
    526 # Tab completion for lunch.
    527 function _lunch()
    528 {
    529     local cur prev opts
    530     COMPREPLY=()
    531     cur="${COMP_WORDS[COMP_CWORD]}"
    532     prev="${COMP_WORDS[COMP_CWORD-1]}"
    533 
    534     COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) )
    535     return 0
    536 }
    537 complete -F _lunch lunch
    538 
    539 # Configures the build to build unbundled apps.
    540 # Run tapas with one ore more app names (from LOCAL_PACKAGE_NAME)
    541 function tapas()
    542 {
    543     local arch=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips|armv5)$'))
    544     local variant=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$'))
    545     local apps=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng|arm|x86|mips|armv5)$'))
    546 
    547     if [ $(echo $arch | wc -w) -gt 1 ]; then
    548         echo "tapas: Error: Multiple build archs supplied: $arch"
    549         return
    550     fi
    551     if [ $(echo $variant | wc -w) -gt 1 ]; then
    552         echo "tapas: Error: Multiple build variants supplied: $variant"
    553         return
    554     fi
    555 
    556     local product=full
    557     case $arch in
    558       x86)   product=full_x86;;
    559       mips)  product=full_mips;;
    560       armv5) product=generic_armv5;;
    561     esac
    562     if [ -z "$variant" ]; then
    563         variant=eng
    564     fi
    565     if [ -z "$apps" ]; then
    566         apps=all
    567     fi
    568 
    569     export TARGET_PRODUCT=$product
    570     export TARGET_BUILD_VARIANT=$variant
    571     export TARGET_BUILD_TYPE=release
    572     export TARGET_BUILD_APPS=$apps
    573 
    574     set_stuff_for_environment
    575     printconfig
    576 }
    577 
    578 function gettop
    579 {
    580     local TOPFILE=build/core/envsetup.mk
    581     if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
    582         echo $TOP
    583     else
    584         if [ -f $TOPFILE ] ; then
    585             # The following circumlocution (repeated below as well) ensures
    586             # that we record the true directory name and not one that is
    587             # faked up with symlink names.
    588             PWD= /bin/pwd
    589         else
    590             local HERE=$PWD
    591             T=
    592             while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
    593                 \cd ..
    594                 T=`PWD= /bin/pwd`
    595             done
    596             \cd $HERE
    597             if [ -f "$T/$TOPFILE" ]; then
    598                 echo $T
    599             fi
    600         fi
    601     fi
    602 }
    603 
    604 function m()
    605 {
    606     T=$(gettop)
    607     if [ "$T" ]; then
    608         make -C $T -f build/core/main.mk $@
    609     else
    610         echo "Couldn't locate the top of the tree.  Try setting TOP."
    611     fi
    612 }
    613 
    614 function findmakefile()
    615 {
    616     TOPFILE=build/core/envsetup.mk
    617     local HERE=$PWD
    618     T=
    619     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
    620         T=`PWD= /bin/pwd`
    621         if [ -f "$T/Android.mk" ]; then
    622             echo $T/Android.mk
    623             \cd $HERE
    624             return
    625         fi
    626         \cd ..
    627     done
    628     \cd $HERE
    629 }
    630 
    631 function mm()
    632 {
    633     # If we're sitting in the root of the build tree, just do a
    634     # normal make.
    635     if [ -f build/core/envsetup.mk -a -f Makefile ]; then
    636         make $@
    637     else
    638         # Find the closest Android.mk file.
    639         T=$(gettop)
    640         local M=$(findmakefile)
    641         local MODULES=
    642         local GET_INSTALL_PATH=
    643         local ARGS=
    644         # Remove the path to top as the makefilepath needs to be relative
    645         local M=`echo $M|sed 's:'$T'/::'`
    646         if [ ! "$T" ]; then
    647             echo "Couldn't locate the top of the tree.  Try setting TOP."
    648         elif [ ! "$M" ]; then
    649             echo "Couldn't locate a makefile from the current directory."
    650         else
    651             for ARG in $@; do
    652                 case $ARG in
    653                   GET-INSTALL-PATH) GET_INSTALL_PATH=$ARG;;
    654                 esac
    655             done
    656             if [ -n "$GET_INSTALL_PATH" ]; then
    657               MODULES=
    658               ARGS=GET-INSTALL-PATH
    659             else
    660               MODULES=all_modules
    661               ARGS=$@
    662             fi
    663             ONE_SHOT_MAKEFILE=$M make -C $T -f build/core/main.mk $MODULES $ARGS
    664         fi
    665     fi
    666 }
    667 
    668 function mmm()
    669 {
    670     T=$(gettop)
    671     if [ "$T" ]; then
    672         local MAKEFILE=
    673         local MODULES=
    674         local ARGS=
    675         local DIR TO_CHOP
    676         local GET_INSTALL_PATH=
    677         local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
    678         local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
    679         for DIR in $DIRS ; do
    680             MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'`
    681             if [ "$MODULES" = "" ]; then
    682                 MODULES=all_modules
    683             fi
    684             DIR=`echo $DIR | sed -e 's/:.*//' -e 's:/$::'`
    685             if [ -f $DIR/Android.mk ]; then
    686                 local TO_CHOP=`(\cd -P -- $T && pwd -P) | wc -c | tr -d ' '`
    687                 local TO_CHOP=`expr $TO_CHOP + 1`
    688                 local START=`PWD= /bin/pwd`
    689                 local MFILE=`echo $START | cut -c${TO_CHOP}-`
    690                 if [ "$MFILE" = "" ] ; then
    691                     MFILE=$DIR/Android.mk
    692                 else
    693                     MFILE=$MFILE/$DIR/Android.mk
    694                 fi
    695                 MAKEFILE="$MAKEFILE $MFILE"
    696             else
    697                 case $DIR in
    698                   showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";;
    699                   GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;;
    700                   *) echo "No Android.mk in $DIR."; return 1;;
    701                 esac
    702             fi
    703         done
    704         if [ -n "$GET_INSTALL_PATH" ]; then
    705           ARGS=$GET_INSTALL_PATH
    706           MODULES=
    707         fi
    708         ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $ARGS
    709     else
    710         echo "Couldn't locate the top of the tree.  Try setting TOP."
    711     fi
    712 }
    713 
    714 function mma()
    715 {
    716   if [ -f build/core/envsetup.mk -a -f Makefile ]; then
    717     make $@
    718   else
    719     T=$(gettop)
    720     if [ ! "$T" ]; then
    721       echo "Couldn't locate the top of the tree.  Try setting TOP."
    722     fi
    723     local MY_PWD=`PWD= /bin/pwd|sed 's:'$T'/::'`
    724     make -C $T -f build/core/main.mk $@ all_modules BUILD_MODULES_IN_PATHS="$MY_PWD"
    725   fi
    726 }
    727 
    728 function mmma()
    729 {
    730   T=$(gettop)
    731   if [ "$T" ]; then
    732     local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
    733     local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
    734     local MY_PWD=`PWD= /bin/pwd`
    735     if [ "$MY_PWD" = "$T" ]; then
    736       MY_PWD=
    737     else
    738       MY_PWD=`echo $MY_PWD|sed 's:'$T'/::'`
    739     fi
    740     local DIR=
    741     local MODULE_PATHS=
    742     local ARGS=
    743     for DIR in $DIRS ; do
    744       if [ -d $DIR ]; then
    745         if [ "$MY_PWD" = "" ]; then
    746           MODULE_PATHS="$MODULE_PATHS $DIR"
    747         else
    748           MODULE_PATHS="$MODULE_PATHS $MY_PWD/$DIR"
    749         fi
    750       else
    751         case $DIR in
    752           showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";;
    753           *) echo "Couldn't find directory $DIR"; return 1;;
    754         esac
    755       fi
    756     done
    757     make -C $T -f build/core/main.mk $DASH_ARGS $ARGS all_modules BUILD_MODULES_IN_PATHS="$MODULE_PATHS"
    758   else
    759     echo "Couldn't locate the top of the tree.  Try setting TOP."
    760   fi
    761 }
    762 
    763 function croot()
    764 {
    765     T=$(gettop)
    766     if [ "$T" ]; then
    767         \cd $(gettop)
    768     else
    769         echo "Couldn't locate the top of the tree.  Try setting TOP."
    770     fi
    771 }
    772 
    773 function cproj()
    774 {
    775     TOPFILE=build/core/envsetup.mk
    776     local HERE=$PWD
    777     T=
    778     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
    779         T=$PWD
    780         if [ -f "$T/Android.mk" ]; then
    781             \cd $T
    782             return
    783         fi
    784         \cd ..
    785     done
    786     \cd $HERE
    787     echo "can't find Android.mk"
    788 }
    789 
    790 # simplified version of ps; output in the form
    791 # <pid> <procname>
    792 function qpid() {
    793     local prepend=''
    794     local append=''
    795     if [ "$1" = "--exact" ]; then
    796         prepend=' '
    797         append='$'
    798         shift
    799     elif [ "$1" = "--help" -o "$1" = "-h" ]; then
    800 		echo "usage: qpid [[--exact] <process name|pid>"
    801 		return 255
    802 	fi
    803 
    804     local EXE="$1"
    805     if [ "$EXE" ] ; then
    806 		qpid | \grep "$prepend$EXE$append"
    807 	else
    808 		adb shell ps \
    809 			| tr -d '\r' \
    810 			| sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/'
    811 	fi
    812 }
    813 
    814 function pid()
    815 {
    816     local prepend=''
    817     local append=''
    818     if [ "$1" = "--exact" ]; then
    819         prepend=' '
    820         append='$'
    821         shift
    822     fi
    823     local EXE="$1"
    824     if [ "$EXE" ] ; then
    825         local PID=`adb shell ps \
    826             | tr -d '\r' \
    827             | \grep "$prepend$EXE$append" \
    828             | sed -e 's/^[^ ]* *\([0-9]*\).*$/\1/'`
    829         echo "$PID"
    830     else
    831         echo "usage: pid [--exact] <process name>"
    832 		return 255
    833     fi
    834 }
    835 
    836 # systemstack - dump the current stack trace of all threads in the system process
    837 # to the usual ANR traces file
    838 function systemstack()
    839 {
    840     stacks system_server
    841 }
    842 
    843 function stacks()
    844 {
    845     if [[ $1 =~ ^[0-9]+$ ]] ; then
    846         local PID="$1"
    847     elif [ "$1" ] ; then
    848         local PIDLIST="$(pid $1)"
    849         if [[ $PIDLIST =~ ^[0-9]+$ ]] ; then
    850             local PID="$PIDLIST"
    851         elif [ "$PIDLIST" ] ; then
    852             echo "more than one process: $1"
    853         else
    854             echo "no such process: $1"
    855         fi
    856     else
    857         echo "usage: stacks [pid|process name]"
    858     fi
    859 
    860     if [ "$PID" ] ; then
    861         # Determine whether the process is native
    862         if adb shell ls -l /proc/$PID/exe | grep -q /system/bin/app_process ; then
    863             # Dump stacks of Dalvik process
    864             local TRACES=/data/anr/traces.txt
    865             local ORIG=/data/anr/traces.orig
    866             local TMP=/data/anr/traces.tmp
    867 
    868             # Keep original traces to avoid clobbering
    869             adb shell mv $TRACES $ORIG
    870 
    871             # Make sure we have a usable file
    872             adb shell touch $TRACES
    873             adb shell chmod 666 $TRACES
    874 
    875             # Dump stacks and wait for dump to finish
    876             adb shell kill -3 $PID
    877             adb shell notify $TRACES >/dev/null
    878 
    879             # Restore original stacks, and show current output
    880             adb shell mv $TRACES $TMP
    881             adb shell mv $ORIG $TRACES
    882             adb shell cat $TMP
    883         else
    884             # Dump stacks of native process
    885             adb shell debuggerd -b $PID
    886         fi
    887     fi
    888 }
    889 
    890 function gdbwrapper()
    891 {
    892     $ANDROID_TOOLCHAIN/$GDB -x "$@"
    893 }
    894 
    895 function gdbclient()
    896 {
    897    local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT)
    898    local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED)
    899    local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED)
    900    local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED)
    901    local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS)
    902    local ARCH=$(get_build_var TARGET_ARCH)
    903    local GDB
    904    case "$ARCH" in
    905        x86) GDB=i686-linux-android-gdb;;
    906        arm) GDB=arm-linux-androideabi-gdb;;
    907        mips) GDB=mipsel-linux-android-gdb;;
    908        *) echo "Unknown arch $ARCH"; return 1;;
    909    esac
    910 
    911    if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then
    912        local EXE="$1"
    913        if [ "$EXE" ] ; then
    914            EXE=$1
    915        else
    916            EXE="app_process"
    917        fi
    918 
    919        local PORT="$2"
    920        if [ "$PORT" ] ; then
    921            PORT=$2
    922        else
    923            PORT=":5039"
    924        fi
    925 
    926        local PID="$3"
    927        if [ "$PID" ] ; then
    928            if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
    929                PID=`pid $3`
    930                if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
    931                    # that likely didn't work because of returning multiple processes
    932                    # try again, filtering by root processes (don't contain colon)
    933                    PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'`
    934                    if [[ ! "$PID" =~ ^[0-9]+$ ]]
    935                    then
    936                        echo "Couldn't resolve '$3' to single PID"
    937                        return 1
    938                    else
    939                        echo ""
    940                        echo "WARNING: multiple processes matching '$3' observed, using root process"
    941                        echo ""
    942                    fi
    943                fi
    944            fi
    945            adb forward "tcp$PORT" "tcp$PORT"
    946            adb shell gdbserver $PORT --attach $PID &
    947            sleep 2
    948        else
    949                echo ""
    950                echo "If you haven't done so already, do this first on the device:"
    951                echo "    gdbserver $PORT /system/bin/$EXE"
    952                    echo " or"
    953                echo "    gdbserver $PORT --attach <PID>"
    954                echo ""
    955        fi
    956 
    957        echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS"
    958        echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx"
    959        echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb"
    960        echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT"
    961        echo >>"$OUT_ROOT/gdbclient.cmds" ""
    962 
    963        gdbwrapper "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE"
    964   else
    965        echo "Unable to determine build system output dir."
    966    fi
    967 
    968 }
    969 
    970 case `uname -s` in
    971     Darwin)
    972         function sgrep()
    973         {
    974             find -E . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.(c|h|cpp|S|java|xml|sh|mk)' -print0 | xargs -0 grep --color -n "$@"
    975         }
    976 
    977         ;;
    978     *)
    979         function sgrep()
    980         {
    981             find . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.\(c\|h\|cpp\|S\|java\|xml\|sh\|mk\)' -print0 | xargs -0 grep --color -n "$@"
    982         }
    983         ;;
    984 esac
    985 
    986 function gettargetarch
    987 {
    988     get_build_var TARGET_ARCH
    989 }
    990 
    991 function jgrep()
    992 {
    993     find . -name .repo -prune -o -name .git -prune -o  -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@"
    994 }
    995 
    996 function cgrep()
    997 {
    998     find . -name .repo -prune -o -name .git -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@"
    999 }
   1000 
   1001 function resgrep()
   1002 {
   1003     for dir in `find . -name .repo -prune -o -name .git -prune -o -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done;
   1004 }
   1005 
   1006 function mangrep()
   1007 {
   1008     find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' -print0 | xargs -0 grep --color -n "$@"
   1009 }
   1010 
   1011 function sepgrep()
   1012 {
   1013     find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -name sepolicy -type d -print0 | xargs -0 grep --color -n -r --exclude-dir=\.git "$@"
   1014 }
   1015 
   1016 case `uname -s` in
   1017     Darwin)
   1018         function mgrep()
   1019         {
   1020             find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@"
   1021         }
   1022 
   1023         function treegrep()
   1024         {
   1025             find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n -i "$@"
   1026         }
   1027 
   1028         ;;
   1029     *)
   1030         function mgrep()
   1031         {
   1032             find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@"
   1033         }
   1034 
   1035         function treegrep()
   1036         {
   1037             find . -name .repo -prune -o -name .git -prune -o -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f -print0 | xargs -0 grep --color -n -i "$@"
   1038         }
   1039 
   1040         ;;
   1041 esac
   1042 
   1043 function getprebuilt
   1044 {
   1045     get_abs_build_var ANDROID_PREBUILTS
   1046 }
   1047 
   1048 function tracedmdump()
   1049 {
   1050     T=$(gettop)
   1051     if [ ! "$T" ]; then
   1052         echo "Couldn't locate the top of the tree.  Try setting TOP."
   1053         return
   1054     fi
   1055     local prebuiltdir=$(getprebuilt)
   1056     local arch=$(gettargetarch)
   1057     local KERNEL=$T/prebuilts/qemu-kernel/$arch/vmlinux-qemu
   1058 
   1059     local TRACE=$1
   1060     if [ ! "$TRACE" ] ; then
   1061         echo "usage:  tracedmdump  tracename"
   1062         return
   1063     fi
   1064 
   1065     if [ ! -r "$KERNEL" ] ; then
   1066         echo "Error: cannot find kernel: '$KERNEL'"
   1067         return
   1068     fi
   1069 
   1070     local BASETRACE=$(basename $TRACE)
   1071     if [ "$BASETRACE" = "$TRACE" ] ; then
   1072         TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE
   1073     fi
   1074 
   1075     echo "post-processing traces..."
   1076     rm -f $TRACE/qtrace.dexlist
   1077     post_trace $TRACE
   1078     if [ $? -ne 0 ]; then
   1079         echo "***"
   1080         echo "*** Error: malformed trace.  Did you remember to exit the emulator?"
   1081         echo "***"
   1082         return
   1083     fi
   1084     echo "generating dexlist output..."
   1085     /bin/ls $ANDROID_PRODUCT_OUT/system/framework/*.jar $ANDROID_PRODUCT_OUT/system/app/*.apk $ANDROID_PRODUCT_OUT/data/app/*.apk 2>/dev/null | xargs dexlist > $TRACE/qtrace.dexlist
   1086     echo "generating dmtrace data..."
   1087     q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return
   1088     echo "generating html file..."
   1089     dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return
   1090     echo "done, see $TRACE/dmtrace.html for details"
   1091     echo "or run:"
   1092     echo "    traceview $TRACE/dmtrace"
   1093 }
   1094 
   1095 # communicate with a running device or emulator, set up necessary state,
   1096 # and run the hat command.
   1097 function runhat()
   1098 {
   1099     # process standard adb options
   1100     local adbTarget=""
   1101     if [ "$1" = "-d" -o "$1" = "-e" ]; then
   1102         adbTarget=$1
   1103         shift 1
   1104     elif [ "$1" = "-s" ]; then
   1105         adbTarget="$1 $2"
   1106         shift 2
   1107     fi
   1108     local adbOptions=${adbTarget}
   1109     #echo adbOptions = ${adbOptions}
   1110 
   1111     # runhat options
   1112     local targetPid=$1
   1113 
   1114     if [ "$targetPid" = "" ]; then
   1115         echo "Usage: runhat [ -d | -e | -s serial ] target-pid"
   1116         return
   1117     fi
   1118 
   1119     # confirm hat is available
   1120     if [ -z $(which hat) ]; then
   1121         echo "hat is not available in this configuration."
   1122         return
   1123     fi
   1124 
   1125     # issue "am" command to cause the hprof dump
   1126     local sdcard=$(adb ${adbOptions} shell echo -n '$EXTERNAL_STORAGE')
   1127     local devFile=$sdcard/hprof-$targetPid
   1128     #local devFile=/data/local/hprof-$targetPid
   1129     echo "Poking $targetPid and waiting for data..."
   1130     echo "Storing data at $devFile"
   1131     adb ${adbOptions} shell am dumpheap $targetPid $devFile
   1132     echo "Press enter when logcat shows \"hprof: heap dump completed\""
   1133     echo -n "> "
   1134     read
   1135 
   1136     local localFile=/tmp/$$-hprof
   1137 
   1138     echo "Retrieving file $devFile..."
   1139     adb ${adbOptions} pull $devFile $localFile
   1140 
   1141     adb ${adbOptions} shell rm $devFile
   1142 
   1143     echo "Running hat on $localFile"
   1144     echo "View the output by pointing your browser at http://localhost:7000/"
   1145     echo ""
   1146     hat -JXmx512m $localFile
   1147 }
   1148 
   1149 function getbugreports()
   1150 {
   1151     local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`)
   1152 
   1153     if [ ! "$reports" ]; then
   1154         echo "Could not locate any bugreports."
   1155         return
   1156     fi
   1157 
   1158     local report
   1159     for report in ${reports[@]}
   1160     do
   1161         echo "/sdcard/bugreports/${report}"
   1162         adb pull /sdcard/bugreports/${report} ${report}
   1163         gunzip ${report}
   1164     done
   1165 }
   1166 
   1167 function getsdcardpath()
   1168 {
   1169     adb ${adbOptions} shell echo -n \$\{EXTERNAL_STORAGE\}
   1170 }
   1171 
   1172 function getscreenshotpath()
   1173 {
   1174     echo "$(getsdcardpath)/Pictures/Screenshots"
   1175 }
   1176 
   1177 function getlastscreenshot()
   1178 {
   1179     local screenshot_path=$(getscreenshotpath)
   1180     local screenshot=`adb ${adbOptions} ls ${screenshot_path} | grep Screenshot_[0-9-]*.*\.png | sort -rk 3 | cut -d " " -f 4 | head -n 1`
   1181     if [ "$screenshot" = "" ]; then
   1182         echo "No screenshots found."
   1183         return
   1184     fi
   1185     echo "${screenshot}"
   1186     adb ${adbOptions} pull ${screenshot_path}/${screenshot}
   1187 }
   1188 
   1189 function startviewserver()
   1190 {
   1191     local port=4939
   1192     if [ $# -gt 0 ]; then
   1193             port=$1
   1194     fi
   1195     adb shell service call window 1 i32 $port
   1196 }
   1197 
   1198 function stopviewserver()
   1199 {
   1200     adb shell service call window 2
   1201 }
   1202 
   1203 function isviewserverstarted()
   1204 {
   1205     adb shell service call window 3
   1206 }
   1207 
   1208 function key_home()
   1209 {
   1210     adb shell input keyevent 3
   1211 }
   1212 
   1213 function key_back()
   1214 {
   1215     adb shell input keyevent 4
   1216 }
   1217 
   1218 function key_menu()
   1219 {
   1220     adb shell input keyevent 82
   1221 }
   1222 
   1223 function smoketest()
   1224 {
   1225     if [ ! "$ANDROID_PRODUCT_OUT" ]; then
   1226         echo "Couldn't locate output files.  Try running 'lunch' first." >&2
   1227         return
   1228     fi
   1229     T=$(gettop)
   1230     if [ ! "$T" ]; then
   1231         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
   1232         return
   1233     fi
   1234 
   1235     (\cd "$T" && mmm tests/SmokeTest) &&
   1236       adb uninstall com.android.smoketest > /dev/null &&
   1237       adb uninstall com.android.smoketest.tests > /dev/null &&
   1238       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk &&
   1239       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk &&
   1240       adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner
   1241 }
   1242 
   1243 # simple shortcut to the runtest command
   1244 function runtest()
   1245 {
   1246     T=$(gettop)
   1247     if [ ! "$T" ]; then
   1248         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
   1249         return
   1250     fi
   1251     ("$T"/development/testrunner/runtest.py $@)
   1252 }
   1253 
   1254 function godir () {
   1255     if [[ -z "$1" ]]; then
   1256         echo "Usage: godir <regex>"
   1257         return
   1258     fi
   1259     T=$(gettop)
   1260     if [[ ! -f $T/filelist ]]; then
   1261         echo -n "Creating index..."
   1262         (\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist)
   1263         echo " Done"
   1264         echo ""
   1265     fi
   1266     local lines
   1267     lines=($(\grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq))
   1268     if [[ ${#lines[@]} = 0 ]]; then
   1269         echo "Not found"
   1270         return
   1271     fi
   1272     local pathname
   1273     local choice
   1274     if [[ ${#lines[@]} > 1 ]]; then
   1275         while [[ -z "$pathname" ]]; do
   1276             local index=1
   1277             local line
   1278             for line in ${lines[@]}; do
   1279                 printf "%6s %s\n" "[$index]" $line
   1280                 index=$(($index + 1))
   1281             done
   1282             echo
   1283             echo -n "Select one: "
   1284             unset choice
   1285             read choice
   1286             if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then
   1287                 echo "Invalid choice"
   1288                 continue
   1289             fi
   1290             pathname=${lines[$(($choice-1))]}
   1291         done
   1292     else
   1293         pathname=${lines[0]}
   1294     fi
   1295     \cd $T/$pathname
   1296 }
   1297 
   1298 # Force JAVA_HOME to point to java 1.6 if it isn't already set
   1299 function set_java_home() {
   1300     if [ ! "$JAVA_HOME" ]; then
   1301         case `uname -s` in
   1302             Darwin)
   1303                 export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
   1304                 ;;
   1305             *)
   1306                 export JAVA_HOME=/usr/lib/jvm/java-6-sun
   1307                 ;;
   1308         esac
   1309     fi
   1310 }
   1311 
   1312 # Print colored exit condition
   1313 function pez {
   1314     "$@"
   1315     local retval=$?
   1316     if [ $retval -ne 0 ]
   1317     then
   1318         echo -e "\e[0;31mFAILURE\e[00m"
   1319     else
   1320         echo -e "\e[0;32mSUCCESS\e[00m"
   1321     fi
   1322     return $retval
   1323 }
   1324 
   1325 if [ "x$SHELL" != "x/bin/bash" ]; then
   1326     case `ps -o command -p $$` in
   1327         *bash*)
   1328             ;;
   1329         *)
   1330             echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results"
   1331             ;;
   1332     esac
   1333 fi
   1334 
   1335 # Execute the contents of any vendorsetup.sh files we can find.
   1336 for f in `test -d device && find device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` \
   1337          `test -d vendor && find vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null`
   1338 do
   1339     echo "including $f"
   1340     . $f
   1341 done
   1342 unset f
   1343 
   1344 addcompletions
   1345