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