OSDN Git Service

De-dupe PRODUCT_COPY_FILES
[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             # The following circumlocution (repeated below as well) ensures
541             # that we record the true directory name and not one that is
542             # faked up with symlink names.
543             PWD= /bin/pwd
544         else
545             # We redirect cd to /dev/null in case it's aliased to
546             # a command that prints something as a side-effect
547             # (like pushd)
548             local HERE=$PWD
549             T=
550             while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
551                 cd .. > /dev/null
552                 T=`PWD= /bin/pwd`
553             done
554             cd $HERE > /dev/null
555             if [ -f "$T/$TOPFILE" ]; then
556                 echo $T
557             fi
558         fi
559     fi
560 }
561
562 function m()
563 {
564     T=$(gettop)
565     if [ "$T" ]; then
566         make -C $T $@
567     else
568         echo "Couldn't locate the top of the tree.  Try setting TOP."
569     fi
570 }
571
572 function findmakefile()
573 {
574     TOPFILE=build/core/envsetup.mk
575     # We redirect cd to /dev/null in case it's aliased to
576     # a command that prints something as a side-effect
577     # (like pushd)
578     local HERE=$PWD
579     T=
580     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
581         T=$PWD
582         if [ -f "$T/Android.mk" ]; then
583             echo $T/Android.mk
584             cd $HERE > /dev/null
585             return
586         fi
587         cd .. > /dev/null
588     done
589     cd $HERE > /dev/null
590 }
591
592 function mm()
593 {
594     # If we're sitting in the root of the build tree, just do a
595     # normal make.
596     if [ -f build/core/envsetup.mk -a -f Makefile ]; then
597         make $@
598     else
599         # Find the closest Android.mk file.
600         T=$(gettop)
601         local M=$(findmakefile)
602         # Remove the path to top as the makefilepath needs to be relative
603         local M=`echo $M|sed 's:'$T'/::'`
604         if [ ! "$T" ]; then
605             echo "Couldn't locate the top of the tree.  Try setting TOP."
606         elif [ ! "$M" ]; then
607             echo "Couldn't locate a makefile from the current directory."
608         else
609             ONE_SHOT_MAKEFILE=$M make -C $T files $@
610         fi
611     fi
612 }
613
614 function mmm()
615 {
616     T=$(gettop)
617     if [ "$T" ]; then
618         local MAKEFILE=
619         local ARGS=
620         local DIR TO_CHOP
621         local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
622         local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
623         for DIR in $DIRS ; do
624             DIR=`echo $DIR | sed -e 's:/$::'`
625             if [ -f $DIR/Android.mk ]; then
626                 TO_CHOP=`echo $T | wc -c | tr -d ' '`
627                 TO_CHOP=`expr $TO_CHOP + 1`
628                 START=`PWD= /bin/pwd`
629                 MFILE=`echo $START | cut -c${TO_CHOP}-`
630                 if [ "$MFILE" = "" ] ; then
631                     MFILE=$DIR/Android.mk
632                 else
633                     MFILE=$MFILE/$DIR/Android.mk
634                 fi
635                 MAKEFILE="$MAKEFILE $MFILE"
636             else
637                 if [ "$DIR" = snod ]; then
638                     ARGS="$ARGS snod"
639                 elif [ "$DIR" = showcommands ]; then
640                     ARGS="$ARGS showcommands"
641                 else
642                     echo "No Android.mk in $DIR."
643                     return 1
644                 fi
645             fi
646         done
647         ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS files $ARGS
648     else
649         echo "Couldn't locate the top of the tree.  Try setting TOP."
650     fi
651 }
652
653 function croot()
654 {
655     T=$(gettop)
656     if [ "$T" ]; then
657         cd $(gettop)
658     else
659         echo "Couldn't locate the top of the tree.  Try setting TOP."
660     fi
661 }
662
663 function cproj()
664 {
665     TOPFILE=build/core/envsetup.mk
666     # We redirect cd to /dev/null in case it's aliased to
667     # a command that prints something as a side-effect
668     # (like pushd)
669     local HERE=$PWD
670     T=
671     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
672         T=$PWD
673         if [ -f "$T/Android.mk" ]; then
674             cd $T
675             return
676         fi
677         cd .. > /dev/null
678     done
679     cd $HERE > /dev/null
680     echo "can't find Android.mk"
681 }
682
683 function pid()
684 {
685    local EXE="$1"
686    if [ "$EXE" ] ; then
687        local PID=`adb shell ps | fgrep $1 | sed -e 's/[^ ]* *\([0-9]*\).*/\1/'`
688        echo "$PID"
689    else
690        echo "usage: pid name"
691    fi
692 }
693
694 # systemstack - dump the current stack trace of all threads in the system process
695 # to the usual ANR traces file
696 function systemstack()
697 {
698     adb shell echo '""' '>>' /data/anr/traces.txt && adb shell chmod 776 /data/anr/traces.txt && adb shell kill -3 $(pid system_server)
699 }
700
701 function gdbclient()
702 {
703    local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT)
704    local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED)
705    local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED)
706    local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED)
707    local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS)
708    if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then
709        local EXE="$1"
710        if [ "$EXE" ] ; then
711            EXE=$1
712        else
713            EXE="app_process"
714        fi
715
716        local PORT="$2"
717        if [ "$PORT" ] ; then
718            PORT=$2
719        else
720            PORT=":5039"
721        fi
722
723        local PID
724        local PROG="$3"
725        if [ "$PROG" ] ; then
726            PID=`pid $3`
727            adb forward "tcp$PORT" "tcp$PORT"
728            adb shell gdbserver $PORT --attach $PID &
729            sleep 2
730        else
731                echo ""
732                echo "If you haven't done so already, do this first on the device:"
733                echo "    gdbserver $PORT /system/bin/$EXE"
734                    echo " or"
735                echo "    gdbserver $PORT --attach $PID"
736                echo ""
737        fi
738
739        echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS"
740        echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS"
741        echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT"
742        echo >>"$OUT_ROOT/gdbclient.cmds" ""
743
744        arm-eabi-gdb -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE"
745   else
746        echo "Unable to determine build system output dir."
747    fi
748
749 }
750
751 case `uname -s` in
752     Darwin)
753         function sgrep()
754         {
755             find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml|sh|mk)' -print0 | xargs -0 grep --color -n "$@"
756         }
757
758         ;;
759     *)
760         function sgrep()
761         {
762             find . -type f -iregex '.*\.\(c\|h\|cpp\|S\|java\|xml\|sh\|mk\)' -print0 | xargs -0 grep --color -n "$@"
763         }
764         ;;
765 esac
766
767 function jgrep()
768 {
769     find . -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@"
770 }
771
772 function cgrep()
773 {
774     find . -type f -name "*\.c*" -print0 | xargs -0 grep --color -n "$@"
775 }
776
777 function resgrep()
778 {
779     for dir in `find . -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done;
780 }
781
782 case `uname -s` in
783     Darwin)
784         function mgrep()
785         {
786             find -E . -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@"
787         }
788
789         function treegrep()
790         {
791             find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n -i "$@"
792         }
793
794         ;;
795     *)
796         function mgrep()
797         {
798             find . -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@"
799         }
800
801         function treegrep()
802         {
803             find . -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f -print0 | xargs -0 grep --color -n -i "$@"
804         }
805
806         ;;
807 esac
808
809 function getprebuilt
810 {
811     get_abs_build_var ANDROID_PREBUILTS
812 }
813
814 function tracedmdump()
815 {
816     T=$(gettop)
817     if [ ! "$T" ]; then
818         echo "Couldn't locate the top of the tree.  Try setting TOP."
819         return
820     fi
821     local prebuiltdir=$(getprebuilt)
822     local KERNEL=$T/prebuilt/android-arm/kernel/vmlinux-qemu
823
824     local TRACE=$1
825     if [ ! "$TRACE" ] ; then
826         echo "usage:  tracedmdump  tracename"
827         return
828     fi
829
830     if [ ! -r "$KERNEL" ] ; then
831         echo "Error: cannot find kernel: '$KERNEL'"
832         return
833     fi
834
835     local BASETRACE=$(basename $TRACE)
836     if [ "$BASETRACE" = "$TRACE" ] ; then
837         TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE
838     fi
839
840     echo "post-processing traces..."
841     rm -f $TRACE/qtrace.dexlist
842     post_trace $TRACE
843     if [ $? -ne 0 ]; then
844         echo "***"
845         echo "*** Error: malformed trace.  Did you remember to exit the emulator?"
846         echo "***"
847         return
848     fi
849     echo "generating dexlist output..."
850     /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
851     echo "generating dmtrace data..."
852     q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return
853     echo "generating html file..."
854     dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return
855     echo "done, see $TRACE/dmtrace.html for details"
856     echo "or run:"
857     echo "    traceview $TRACE/dmtrace"
858 }
859
860 # communicate with a running device or emulator, set up necessary state,
861 # and run the hat command.
862 function runhat()
863 {
864     # process standard adb options
865     local adbTarget=""
866     if [ $1 = "-d" -o $1 = "-e" ]; then
867         adbTarget=$1
868         shift 1
869     elif [ $1 = "-s" ]; then
870         adbTarget="$1 $2"
871         shift 2
872     fi
873     local adbOptions=${adbTarget}
874     echo adbOptions = ${adbOptions}
875
876     # runhat options
877     local targetPid=$1
878     local outputFile=$2
879
880     if [ "$targetPid" = "" ]; then
881         echo "Usage: runhat [ -d | -e | -s serial ] target-pid [output-file]"
882         return
883     fi
884
885     # confirm hat is available
886     if [ -z $(which hat) ]; then
887         echo "hat is not available in this configuration."
888         return
889     fi
890
891     adb ${adbOptions} shell >/dev/null mkdir /data/misc
892     adb ${adbOptions} shell chmod 777 /data/misc
893
894     # send a SIGUSR1 to cause the hprof dump
895     echo "Poking $targetPid and waiting for data..."
896     adb ${adbOptions} shell kill -10 $targetPid
897     echo "Press enter when logcat shows \"hprof: heap dump completed\""
898     echo -n "> "
899     read
900
901     local availFiles=( $(adb ${adbOptions} shell ls /data/misc | grep '^heap-dump' | sed -e 's/.*heap-dump-/heap-dump-/' | sort -r | tr '[:space:][:cntrl:]' ' ') )
902     local devFile=/data/misc/${availFiles[0]}
903     local localFile=/tmp/$$-hprof
904
905     echo "Retrieving file $devFile..."
906     adb ${adbOptions} pull $devFile $localFile
907
908     adb ${adbOptions} shell rm $devFile
909
910     echo "Running hat on $localFile"
911     echo "View the output by pointing your browser at http://localhost:7000/"
912     echo ""
913     hat $localFile
914 }
915
916 function getbugreports()
917 {
918     local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`)
919
920     if [ ! "$reports" ]; then
921         echo "Could not locate any bugreports."
922         return
923     fi
924
925     local report
926     for report in ${reports[@]}
927     do
928         echo "/sdcard/bugreports/${report}"
929         adb pull /sdcard/bugreports/${report} ${report}
930         gunzip ${report}
931     done
932 }
933
934 function startviewserver()
935 {
936     local port=4939
937     if [ $# -gt 0 ]; then
938             port=$1
939     fi
940     adb shell service call window 1 i32 $port
941 }
942
943 function stopviewserver()
944 {
945     adb shell service call window 2
946 }
947
948 function isviewserverstarted()
949 {
950     adb shell service call window 3
951 }
952
953 function smoketest()
954 {
955     if [ ! "$ANDROID_PRODUCT_OUT" ]; then
956         echo "Couldn't locate output files.  Try running 'lunch' first." >&2
957         return
958     fi
959     T=$(gettop)
960     if [ ! "$T" ]; then
961         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
962         return
963     fi
964
965     (cd "$T" && mmm tests/SmokeTest) &&
966       adb uninstall com.android.smoketest > /dev/null &&
967       adb uninstall com.android.smoketest.tests > /dev/null &&
968       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk &&
969       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk &&
970       adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner
971 }
972
973 # simple shortcut to the runtest command
974 function runtest()
975 {
976     T=$(gettop)
977     if [ ! "$T" ]; then
978         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
979         return
980     fi
981     ("$T"/development/testrunner/runtest.py $@)
982 }
983
984 function godir () {
985     if [[ -z "$1" ]]; then
986         echo "Usage: godir <regex>"
987         return
988     fi
989     T=$(gettop)
990     if [[ ! -f $T/filelist ]]; then
991         echo -n "Creating index..."
992         (cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist)
993         echo " Done"
994         echo ""
995     fi
996     local lines
997     lines=($(grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq)) 
998     if [[ ${#lines[@]} = 0 ]]; then
999         echo "Not found"
1000         return
1001     fi
1002     local pathname
1003     local choice
1004     if [[ ${#lines[@]} > 1 ]]; then
1005         while [[ -z "$pathname" ]]; do
1006             local index=1
1007             local line
1008             for line in ${lines[@]}; do
1009                 printf "%6s %s\n" "[$index]" $line
1010                 index=$(($index + 1)) 
1011             done
1012             echo
1013             echo -n "Select one: "
1014             unset choice
1015             read choice
1016             if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then
1017                 echo "Invalid choice"
1018                 continue
1019             fi
1020             pathname=${lines[$(($choice-$_arrayoffset))]}
1021         done
1022     else
1023         # even though zsh arrays are 1-based, $foo[0] is an alias for $foo[1]
1024         pathname=${lines[0]}
1025     fi
1026     cd $T/$pathname
1027 }
1028
1029 # determine whether arrays are zero-based (bash) or one-based (zsh)
1030 _xarray=(a b c)
1031 if [ -z "${_xarray[${#_xarray[@]}]}" ]
1032 then
1033     _arrayoffset=1
1034 else
1035     _arrayoffset=0
1036 fi
1037 unset _xarray
1038
1039 # Execute the contents of any vendorsetup.sh files we can find.
1040 for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2> /dev/null`
1041 do
1042     echo "including $f"
1043     . $f
1044 done
1045 unset f