OSDN Git Service

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