OSDN Git Service

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