OSDN Git Service

reconcile korg/master into goog/master
[android-x86/build.git] / envsetup.sh
1 function help() {
2 cat <<EOF
3 Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
4 - croot:   Changes directory to the top of the tree.
5 - m:       Makes from the top of the tree.
6 - mm:      Builds all of the modules in the current directory.
7 - mmm:     Builds all of the modules in the supplied directories.
8 - cgrep:   Greps on all local C/C++ files.
9 - jgrep:   Greps on all local Java files.
10 - resgrep: Greps on all local res/*.xml files.
11 - godir:   Go to the directory containing a file.
12
13 Look at the source to view more functions. The complete list is:
14 EOF
15     T=$(gettop)
16     local A
17     A=""
18     for i in `cat $T/build/envsetup.sh | sed -n "/^function /s/function \([a-z_]*\).*/\1/p" | sort`; do
19       A="$A $i"
20     done
21     echo $A
22 }
23
24 # Get the value of a build variable as an absolute path.
25 function get_abs_build_var()
26 {
27     T=$(gettop)
28     if [ ! "$T" ]; then
29         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
30         return
31     fi
32     CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
33       make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-abs-$1
34 }
35
36 # Get the exact value of a build variable.
37 function get_build_var()
38 {
39     T=$(gettop)
40     if [ ! "$T" ]; then
41         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
42         return
43     fi
44     CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
45       make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1
46 }
47
48 # check to see if the supplied product is one we can build
49 function check_product()
50 {
51     T=$(gettop)
52     if [ ! "$T" ]; then
53         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
54         return
55     fi
56     CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
57         TARGET_PRODUCT=$1 TARGET_BUILD_VARIANT= \
58         TARGET_SIMULATOR= TARGET_BUILD_TYPE= \
59         get_build_var TARGET_DEVICE > /dev/null
60     # hide successful answers, but allow the errors to show
61 }
62
63 VARIANT_CHOICES=(user userdebug eng)
64
65 # check to see if the supplied variant is valid
66 function check_variant()
67 {
68     for v in ${VARIANT_CHOICES[@]}
69     do
70         if [ "$v" = "$1" ]
71         then
72             return 0
73         fi
74     done
75     return 1
76 }
77
78 function setpaths()
79 {
80     T=$(gettop)
81     if [ ! "$T" ]; then
82         echo "Couldn't locate the top of the tree.  Try setting TOP."
83         return
84     fi
85
86     ##################################################################
87     #                                                                #
88     #              Read me before you modify this code               #
89     #                                                                #
90     #   This function sets ANDROID_BUILD_PATHS to what it is adding  #
91     #   to PATH, and the next time it is run, it removes that from   #
92     #   PATH.  This is required so lunch can be run more than once   #
93     #   and still have working paths.                                #
94     #                                                                #
95     ##################################################################
96
97     # out with the old
98     if [ -n $ANDROID_BUILD_PATHS ] ; then
99         export PATH=${PATH/$ANDROID_BUILD_PATHS/}
100     fi
101
102     # and in with the new
103     CODE_REVIEWS=
104     prebuiltdir=$(getprebuilt)
105     export ANDROID_EABI_TOOLCHAIN=$prebuiltdir/toolchain/arm-eabi-4.4.0/bin
106     export ANDROID_TOOLCHAIN=$ANDROID_EABI_TOOLCHAIN
107     export ANDROID_QTOOLS=$T/development/emulator/qtools
108     export ANDROID_BUILD_PATHS=:$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_QTOOLS:$ANDROID_TOOLCHAIN:$ANDROID_EABI_TOOLCHAIN$CODE_REVIEWS
109     export PATH=$PATH$ANDROID_BUILD_PATHS
110
111     unset ANDROID_PRODUCT_OUT
112     export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT)
113     export OUT=$ANDROID_PRODUCT_OUT
114
115     # needed for building linux on MacOS
116     # TODO: fix the path
117     #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include
118
119     # needed for OProfile to post-process collected samples
120     export OPROFILE_EVENTS_DIR=$prebuiltdir/oprofile
121 }
122
123 function printconfig()
124 {
125     T=$(gettop)
126     if [ ! "$T" ]; then
127         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
128         return
129     fi
130     get_build_var report_config
131 }
132
133 function set_stuff_for_environment()
134 {
135     settitle
136     setpaths
137     set_sequence_number
138
139     # Don't try to do preoptimization until it works better on OSX.
140     export DISABLE_DEXPREOPT=true
141
142     export ANDROID_BUILD_TOP=$(gettop)
143 }
144
145 function set_sequence_number()
146 {
147     export BUILD_ENV_SEQUENCE_NUMBER=9
148 }
149
150 function settitle()
151 {
152     if [ "$STAY_OFF_MY_LAWN" = "" ]; then
153         local product=$(get_build_var TARGET_PRODUCT)
154         local variant=$(get_build_var TARGET_BUILD_VARIANT)
155         export PROMPT_COMMAND="echo -ne \"\033]0;[${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""
156     fi
157 }
158
159 case `uname -s` in
160     Linux)
161         function choosesim()
162         {
163             echo "Build for the simulator or the device?"
164             echo "     1. Device"
165             echo "     2. Simulator"
166             echo
167
168             export TARGET_SIMULATOR=
169             local ANSWER
170             while [ -z $TARGET_SIMULATOR ]
171             do
172                 echo -n "Which would you like? [1] "
173                 if [ -z "$1" ] ; then
174                     read ANSWER
175                 else
176                     echo $1
177                     ANSWER=$1
178                 fi
179                 case $ANSWER in
180                 "")
181                     export TARGET_SIMULATOR=false
182                     ;;
183                 1)
184                     export TARGET_SIMULATOR=false
185                     ;;
186                 Device)
187                     export TARGET_SIMULATOR=false
188                     ;;
189                 2)
190                     export TARGET_SIMULATOR=true
191                     ;;
192                 Simulator)
193                     export TARGET_SIMULATOR=true
194                     ;;
195                 *)
196                     echo
197                     echo "I didn't understand your response.  Please try again."
198                     echo
199                     ;;
200                 esac
201                 if [ -n "$1" ] ; then
202                     break
203                 fi
204             done
205
206             set_stuff_for_environment
207         }
208         ;;
209     *)
210         function choosesim()
211         {
212             echo "Only device builds are supported for" `uname -s`
213             echo "     Forcing TARGET_SIMULATOR=false"
214             echo
215             if [ -z "$1" ]
216             then
217                 echo -n "Press enter: "
218                 read
219             fi
220
221             export TARGET_SIMULATOR=false
222             set_stuff_for_environment
223         }
224         ;;
225 esac
226
227 function choosetype()
228 {
229     echo "Build type choices are:"
230     echo "     1. release"
231     echo "     2. debug"
232     echo
233
234     local DEFAULT_NUM DEFAULT_VALUE
235     if [ $TARGET_SIMULATOR = "false" ] ; then
236         DEFAULT_NUM=1
237         DEFAULT_VALUE=release
238     else
239         DEFAULT_NUM=2
240         DEFAULT_VALUE=debug
241     fi
242
243     export TARGET_BUILD_TYPE=
244     local ANSWER
245     while [ -z $TARGET_BUILD_TYPE ]
246     do
247         echo -n "Which would you like? ["$DEFAULT_NUM"] "
248         if [ -z "$1" ] ; then
249             read ANSWER
250         else
251             echo $1
252             ANSWER=$1
253         fi
254         case $ANSWER in
255         "")
256             export TARGET_BUILD_TYPE=$DEFAULT_VALUE
257             ;;
258         1)
259             export TARGET_BUILD_TYPE=release
260             ;;
261         release)
262             export TARGET_BUILD_TYPE=release
263             ;;
264         2)
265             export TARGET_BUILD_TYPE=debug
266             ;;
267         debug)
268             export TARGET_BUILD_TYPE=debug
269             ;;
270         *)
271             echo
272             echo "I didn't understand your response.  Please try again."
273             echo
274             ;;
275         esac
276         if [ -n "$1" ] ; then
277             break
278         fi
279     done
280
281     set_stuff_for_environment
282 }
283
284 #
285 # This function isn't really right:  It chooses a TARGET_PRODUCT
286 # based on the list of boards.  Usually, that gets you something
287 # that kinda works with a generic product, but really, you should
288 # pick a product by name.
289 #
290 function chooseproduct()
291 {
292     if [ "x$TARGET_PRODUCT" != x ] ; then
293         default_value=$TARGET_PRODUCT
294     else
295         if [ "$TARGET_SIMULATOR" = true ] ; then
296             default_value=sim
297         else
298             default_value=generic
299         fi
300     fi
301
302     export TARGET_PRODUCT=
303     local ANSWER
304     while [ -z "$TARGET_PRODUCT" ]
305     do
306         echo -n "Which product would you like? [$default_value] "
307         if [ -z "$1" ] ; then
308             read ANSWER
309         else
310             echo $1
311             ANSWER=$1
312         fi
313
314         if [ -z "$ANSWER" ] ; then
315             export TARGET_PRODUCT=$default_value
316         else
317             if check_product $ANSWER
318             then
319                 export TARGET_PRODUCT=$ANSWER
320             else
321                 echo "** Not a valid product: $ANSWER"
322             fi
323         fi
324         if [ -n "$1" ] ; then
325             break
326         fi
327     done
328
329     set_stuff_for_environment
330 }
331
332 function choosevariant()
333 {
334     echo "Variant choices are:"
335     local index=1
336     local v
337     for v in ${VARIANT_CHOICES[@]}
338     do
339         # The product name is the name of the directory containing
340         # the makefile we found, above.
341         echo "     $index. $v"
342         index=$(($index+1))
343     done
344
345     local default_value=eng
346     local ANSWER
347
348     export TARGET_BUILD_VARIANT=
349     while [ -z "$TARGET_BUILD_VARIANT" ]
350     do
351         echo -n "Which would you like? [$default_value] "
352         if [ -z "$1" ] ; then
353             read ANSWER
354         else
355             echo $1
356             ANSWER=$1
357         fi
358
359         if [ -z "$ANSWER" ] ; then
360             export TARGET_BUILD_VARIANT=$default_value
361         elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then
362             if [ "$ANSWER" -le "${#VARIANT_CHOICES[@]}" ] ; then
363                 export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-$_arrayoffset))]}
364             fi
365         else
366             if check_variant $ANSWER
367             then
368                 export TARGET_BUILD_VARIANT=$ANSWER
369             else
370                 echo "** Not a valid variant: $ANSWER"
371             fi
372         fi
373         if [ -n "$1" ] ; then
374             break
375         fi
376     done
377 }
378
379 function tapas()
380 {
381     choosecombo
382 }
383
384 function choosecombo()
385 {
386     choosesim $1
387
388     echo
389     echo
390     choosetype $2
391
392     echo
393     echo
394     chooseproduct $3
395
396     echo
397     echo
398     choosevariant $4
399
400     echo
401     set_stuff_for_environment
402     printconfig
403 }
404
405 # Clear this variable.  It will be built up again when the vendorsetup.sh
406 # files are included at the end of this file.
407 unset LUNCH_MENU_CHOICES
408 function add_lunch_combo()
409 {
410     local new_combo=$1
411     local c
412     for c in ${LUNCH_MENU_CHOICES[@]} ; do
413         if [ "$new_combo" = "$c" ] ; then
414             return
415         fi
416     done
417     LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
418 }
419
420 # add the default one here
421 add_lunch_combo generic-eng
422
423 # if we're on linux, add the simulator.  There is a special case
424 # in lunch to deal with the simulator
425 if [ "$(uname)" = "Linux" ] ; then
426     add_lunch_combo simulator
427 fi
428
429 function print_lunch_menu()
430 {
431     local uname=$(uname)
432     echo
433     echo "You're building on" $uname
434     echo
435     echo ${LUNCH_MENU_CHOICES[@]}
436     echo "Lunch menu... pick a combo:"
437
438     local i=1
439     local choice
440     for choice in ${LUNCH_MENU_CHOICES[@]}
441     do
442         echo "     $i. $choice"
443         i=$(($i+1))
444     done
445
446     echo
447 }
448
449 function lunch()
450 {
451     local answer
452
453     if [ "$1" ] ; then
454         answer=$1
455     else
456         print_lunch_menu
457         echo -n "Which would you like? [generic-eng] "
458         read answer
459     fi
460
461     local selection=
462
463     if [ -z "$answer" ]
464     then
465         selection=generic-eng
466     elif [ "$answer" = "simulator" ]
467     then
468         selection=simulator
469     elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
470     then
471         if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
472         then
473             selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}
474         fi
475     elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
476     then
477         selection=$answer
478     fi
479
480     if [ -z "$selection" ]
481     then
482         echo
483         echo "Invalid lunch combo: $answer"
484         return 1
485     fi
486
487     # special case the simulator
488     if [ "$selection" = "simulator" ]
489     then
490         export TARGET_PRODUCT=sim
491         export TARGET_BUILD_VARIANT=eng
492         export TARGET_SIMULATOR=true
493         export TARGET_BUILD_TYPE=debug
494     else
495         local product=$(echo -n $selection | sed -e "s/-.*$//")
496         check_product $product
497         if [ $? -ne 0 ]
498         then
499             echo
500             echo "** Don't have a product spec for: '$product'"
501             echo "** Do you have the right repo manifest?"
502             product=
503         fi
504
505         local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
506         check_variant $variant
507         if [ $? -ne 0 ]
508         then
509             echo
510             echo "** Invalid variant: '$variant'"
511             echo "** Must be one of ${VARIANT_CHOICES[@]}"
512             variant=
513         fi
514
515         if [ -z "$product" -o -z "$variant" ]
516         then
517             echo
518             return 1
519         fi
520
521         export TARGET_PRODUCT=$product
522         export TARGET_BUILD_VARIANT=$variant
523         export TARGET_SIMULATOR=false
524         export TARGET_BUILD_TYPE=release
525     fi # !simulator
526
527     echo
528
529     set_stuff_for_environment
530     printconfig
531 }
532
533 function gettop
534 {
535     local TOPFILE=build/core/envsetup.mk
536     if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
537         echo $TOP
538     else
539         if [ -f $TOPFILE ] ; then
540             echo $PWD
541         else
542             # We redirect cd to /dev/null in case it's aliased to
543             # a command that prints something as a side-effect
544             # (like pushd)
545             local HERE=$PWD
546             T=
547             while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
548                 cd .. > /dev/null
549                 T=$PWD
550             done
551             cd $HERE > /dev/null
552             if [ -f "$T/$TOPFILE" ]; then
553                 echo $T
554             fi
555         fi
556     fi
557 }
558
559 function m()
560 {
561     T=$(gettop)
562     if [ "$T" ]; then
563         make -C $T $@
564     else
565         echo "Couldn't locate the top of the tree.  Try setting TOP."
566     fi
567 }
568
569 function findmakefile()
570 {
571     TOPFILE=build/core/envsetup.mk
572     # We redirect cd to /dev/null in case it's aliased to
573     # a command that prints something as a side-effect
574     # (like pushd)
575     local HERE=$PWD
576     T=
577     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
578         T=$PWD
579         if [ -f "$T/Android.mk" ]; then
580             echo $T/Android.mk
581             cd $HERE > /dev/null
582             return
583         fi
584         cd .. > /dev/null
585     done
586     cd $HERE > /dev/null
587 }
588
589 function mm()
590 {
591     # If we're sitting in the root of the build tree, just do a
592     # normal make.
593     if [ -f build/core/envsetup.mk -a -f Makefile ]; then
594         make $@
595     else
596         # Find the closest Android.mk file.
597         T=$(gettop)
598         local M=$(findmakefile)
599         # Remove the path to top as the makefilepath needs to be relative
600         local M=`echo $M|sed 's:'$T'/::'`
601         if [ ! "$T" ]; then
602             echo "Couldn't locate the top of the tree.  Try setting TOP."
603         elif [ ! "$M" ]; then
604             echo "Couldn't locate a makefile from the current directory."
605         else
606             ONE_SHOT_MAKEFILE=$M make -C $T files $@
607         fi
608     fi
609 }
610
611 function mmm()
612 {
613     T=$(gettop)
614     if [ "$T" ]; then
615         local MAKEFILE=
616         local ARGS=
617         local DIR TO_CHOP
618         local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
619         local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
620         for DIR in $DIRS ; do
621             DIR=`echo $DIR | sed -e 's:/$::'`
622             if [ -f $DIR/Android.mk ]; then
623                 TO_CHOP=`echo $T | wc -c | tr -d ' '`
624                 TO_CHOP=`expr $TO_CHOP + 1`
625                 MFILE=`echo $PWD | cut -c${TO_CHOP}-`
626                 if [ "$MFILE" = "" ] ; then
627                     MFILE=$DIR/Android.mk
628                 else
629                     MFILE=$MFILE/$DIR/Android.mk
630                 fi
631                 MAKEFILE="$MAKEFILE $MFILE"
632             else
633                 if [ "$DIR" = snod ]; then
634                     ARGS="$ARGS snod"
635                 elif [ "$DIR" = showcommands ]; then
636                     ARGS="$ARGS showcommands"
637                 else
638                     echo "No Android.mk in $DIR."
639                     return 1
640                 fi
641             fi
642         done
643         ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS files $ARGS
644     else
645         echo "Couldn't locate the top of the tree.  Try setting TOP."
646     fi
647 }
648
649 function croot()
650 {
651     T=$(gettop)
652     if [ "$T" ]; then
653         cd $(gettop)
654     else
655         echo "Couldn't locate the top of the tree.  Try setting TOP."
656     fi
657 }
658
659 function pid()
660 {
661    local EXE="$1"
662    if [ "$EXE" ] ; then
663        local PID=`adb shell ps | fgrep $1 | sed -e 's/[^ ]* *\([0-9]*\).*/\1/'`
664        echo "$PID"
665    else
666        echo "usage: pid name"
667    fi
668 }
669
670 function gdbclient()
671 {
672    local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT)
673    local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED)
674    local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED)
675    local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED)
676    local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS)
677    if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then
678        local EXE="$1"
679        if [ "$EXE" ] ; then
680            EXE=$1
681        else
682            EXE="app_process"
683        fi
684
685        local PORT="$2"
686        if [ "$PORT" ] ; then
687            PORT=$2
688        else
689            PORT=":5039"
690        fi
691
692        local PID
693        local PROG="$3"
694        if [ "$PROG" ] ; then
695            PID=`pid $3`
696            adb forward "tcp$PORT" "tcp$PORT"
697            adb shell gdbserver $PORT --attach $PID &
698            sleep 2
699        else
700                echo ""
701                echo "If you haven't done so already, do this first on the device:"
702                echo "    gdbserver $PORT /system/bin/$EXE"
703                    echo " or"
704                echo "    gdbserver $PORT --attach $PID"
705                echo ""
706        fi
707
708        echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS"
709        echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS"
710        echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT"
711        echo >>"$OUT_ROOT/gdbclient.cmds" ""
712
713        arm-eabi-gdb -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE"
714   else
715        echo "Unable to determine build system output dir."
716    fi
717
718 }
719
720 case `uname -s` in
721     Darwin)
722         function sgrep()
723         {
724             find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml|sh|mk)' -print0 | xargs -0 grep --color -n "$@"
725         }
726
727         ;;
728     *)
729         function sgrep()
730         {
731             find . -type f -iregex '.*\.\(c\|h\|cpp\|S\|java\|xml\|sh\|mk\)' -print0 | xargs -0 grep --color -n "$@"
732         }
733         ;;
734 esac
735
736 function jgrep()
737 {
738     find . -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@"
739 }
740
741 function cgrep()
742 {
743     find . -type f -name "*\.c*" -print0 | xargs -0 grep --color -n "$@"
744 }
745
746 function resgrep()
747 {
748     for dir in `find . -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done;
749 }
750
751 case `uname -s` in
752     Darwin)
753         function mgrep()
754         {
755             find -E . -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@"
756         }
757
758         function treegrep()
759         {
760             find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n -i "$@"
761         }
762
763         ;;
764     *)
765         function mgrep()
766         {
767             find . -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@"
768         }
769
770         function treegrep()
771         {
772             find . -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f -print0 | xargs -0 grep --color -n -i "$@"
773         }
774
775         ;;
776 esac
777
778 function getprebuilt
779 {
780     get_abs_build_var ANDROID_PREBUILTS
781 }
782
783 function tracedmdump()
784 {
785     T=$(gettop)
786     if [ ! "$T" ]; then
787         echo "Couldn't locate the top of the tree.  Try setting TOP."
788         return
789     fi
790     local prebuiltdir=$(getprebuilt)
791     local KERNEL=$T/prebuilt/android-arm/kernel/vmlinux-qemu
792
793     local TRACE=$1
794     if [ ! "$TRACE" ] ; then
795         echo "usage:  tracedmdump  tracename"
796         return
797     fi
798
799     if [ ! -r "$KERNEL" ] ; then
800         echo "Error: cannot find kernel: '$KERNEL'"
801         return
802     fi
803
804     local BASETRACE=$(basename $TRACE)
805     if [ "$BASETRACE" = "$TRACE" ] ; then
806         TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE
807     fi
808
809     echo "post-processing traces..."
810     rm -f $TRACE/qtrace.dexlist
811     post_trace $TRACE
812     if [ $? -ne 0 ]; then
813         echo "***"
814         echo "*** Error: malformed trace.  Did you remember to exit the emulator?"
815         echo "***"
816         return
817     fi
818     echo "generating dexlist output..."
819     /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
820     echo "generating dmtrace data..."
821     q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return
822     echo "generating html file..."
823     dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return
824     echo "done, see $TRACE/dmtrace.html for details"
825     echo "or run:"
826     echo "    traceview $TRACE/dmtrace"
827 }
828
829 # communicate with a running device or emulator, set up necessary state,
830 # and run the hat command.
831 function runhat()
832 {
833     # process standard adb options
834     local adbTarget=""
835     if [ $1 = "-d" -o $1 = "-e" ]; then
836         adbTarget=$1
837         shift 1
838     elif [ $1 = "-s" ]; then
839         adbTarget="$1 $2"
840         shift 2
841     fi
842     local adbOptions=${adbTarget}
843     echo adbOptions = ${adbOptions}
844
845     # runhat options
846     local targetPid=$1
847     local outputFile=$2
848
849     if [ "$targetPid" = "" ]; then
850         echo "Usage: runhat [ -d | -e | -s serial ] target-pid [output-file]"
851         return
852     fi
853
854     # confirm hat is available
855     if [ -z $(which hat) ]; then
856         echo "hat is not available in this configuration."
857         return
858     fi
859
860     adb ${adbOptions} shell >/dev/null mkdir /data/misc
861     adb ${adbOptions} shell chmod 777 /data/misc
862
863     # send a SIGUSR1 to cause the hprof dump
864     echo "Poking $targetPid and waiting for data..."
865     adb ${adbOptions} shell kill -10 $targetPid
866     echo "Press enter when logcat shows \"hprof: heap dump completed\""
867     echo -n "> "
868     read
869
870     local availFiles=( $(adb ${adbOptions} shell ls /data/misc | grep '^heap-dump' | sed -e 's/.*heap-dump-/heap-dump-/' | sort -r | tr '[:space:][:cntrl:]' ' ') )
871     local devFile=/data/misc/${availFiles[0]}
872     local localFile=/tmp/$$-hprof
873
874     echo "Retrieving file $devFile..."
875     adb ${adbOptions} pull $devFile $localFile
876
877     adb ${adbOptions} shell rm $devFile
878
879     echo "Running hat on $localFile"
880     echo "View the output by pointing your browser at http://localhost:7000/"
881     echo ""
882     hat $localFile
883 }
884
885 function getbugreports()
886 {
887     local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`)
888
889     if [ ! "$reports" ]; then
890         echo "Could not locate any bugreports."
891         return
892     fi
893
894     local report
895     for report in ${reports[@]}
896     do
897         echo "/sdcard/bugreports/${report}"
898         adb pull /sdcard/bugreports/${report} ${report}
899         gunzip ${report}
900     done
901 }
902
903 function startviewserver()
904 {
905     local port=4939
906     if [ $# -gt 0 ]; then
907             port=$1
908     fi
909     adb shell service call window 1 i32 $port
910 }
911
912 function stopviewserver()
913 {
914     adb shell service call window 2
915 }
916
917 function isviewserverstarted()
918 {
919     adb shell service call window 3
920 }
921
922 function smoketest()
923 {
924     if [ ! "$ANDROID_PRODUCT_OUT" ]; then
925         echo "Couldn't locate output files.  Try running 'lunch' first." >&2
926         return
927     fi
928     T=$(gettop)
929     if [ ! "$T" ]; then
930         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
931         return
932     fi
933
934     (cd "$T" && mmm tests/SmokeTest) &&
935       adb uninstall com.android.smoketest > /dev/null &&
936       adb uninstall com.android.smoketest.tests > /dev/null &&
937       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk &&
938       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk &&
939       adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner
940 }
941
942 # simple shortcut to the runtest command
943 function runtest()
944 {
945     T=$(gettop)
946     if [ ! "$T" ]; then
947         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
948         return
949     fi
950     (cd "$T" && development/testrunner/runtest.py $@)
951 }
952
953 # TODO: Remove this some time after 1 June 2009
954 function runtest_py()
955 {
956     echo "runtest_py is obsolete; use runtest instead" >&2
957     return 1
958 }
959
960 function godir () {
961     if [[ -z "$1" ]]; then
962         echo "Usage: godir <regex>"
963         return
964     fi
965     if [[ ! -f $T/filelist ]]; then
966         echo -n "Creating index..."
967         (cd $T; find . -wholename ./out -prune -o -type f > filelist)
968         echo " Done"
969         echo ""
970     fi
971     local lines
972     lines=($(grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq)) 
973     if [[ ${#lines[@]} = 0 ]]; then
974         echo "Not found"
975         return
976     fi
977     local pathname
978     local choice
979     if [[ ${#lines[@]} > 1 ]]; then
980         while [[ -z "$pathname" ]]; do
981             local index=1
982             local line
983             for line in ${lines[@]}; do
984                 printf "%6s %s\n" "[$index]" $line
985                 index=$(($index + 1)) 
986             done
987             echo
988             echo -n "Select one: "
989             unset choice
990             read choice
991             if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then
992                 echo "Invalid choice"
993                 continue
994             fi
995             pathname=${lines[$(($choice-$_arrayoffset))]}
996         done
997     else
998         # even though zsh arrays are 1-based, $foo[0] is an alias for $foo[1]
999         pathname=${lines[0]}
1000     fi
1001     cd $T/$pathname
1002 }
1003
1004 # determine whether arrays are zero-based (bash) or one-based (zsh)
1005 _xarray=(a b c)
1006 if [ -z "${_xarray[${#_xarray[@]}]}" ]
1007 then
1008     _arrayoffset=1
1009 else
1010     _arrayoffset=0
1011 fi
1012 unset _xarray
1013
1014 # Execute the contents of any vendorsetup.sh files we can find.
1015 for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2> /dev/null`
1016 do
1017     echo "including $f"
1018     . $f
1019 done
1020 unset f