OSDN Git Service

Merge "Add libion to the generic sytem image for camera"
[android-x86/build.git] / envsetup.sh
1 function hmm() {
2 cat <<EOF
3 Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
4 - lunch:     lunch <product_name>-<build_variant>
5 - tapas:     tapas [<App1> <App2> ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user]
6 - croot:     Changes directory to the top of the tree.
7 - m:         Makes from the top of the tree.
8 - mm:        Builds all of the modules in the current directory, but not their dependencies.
9 - mmm:       Builds all of the modules in the supplied directories, but not their dependencies.
10              To limit the modules being built use the syntax: mmm dir/:target1,target2.
11 - mma:       Builds all of the modules in the current directory, and their dependencies.
12 - mmma:      Builds all of the modules in the supplied directories, and their dependencies.
13 - provision: Flash device with all required partitions. Options will be passed on to fastboot.
14 - cgrep:     Greps on all local C/C++ files.
15 - ggrep:     Greps on all local Gradle files.
16 - jgrep:     Greps on all local Java files.
17 - resgrep:   Greps on all local res/*.xml files.
18 - mangrep:   Greps on all local AndroidManifest.xml files.
19 - mgrep:     Greps on all local Makefiles files.
20 - sepgrep:   Greps on all local sepolicy files.
21 - sgrep:     Greps on all local source files.
22 - godir:     Go to the directory containing a file.
23
24 Environment options:
25 - SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that
26                  ASAN_OPTIONS=detect_leaks=0 will be set by default until the
27                  build is leak-check clean.
28
29 Look at the source to view more functions. The complete list is:
30 EOF
31     T=$(gettop)
32     local A
33     A=""
34     for i in `cat $T/build/envsetup.sh | sed -n "/^[[:blank:]]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do
35       A="$A $i"
36     done
37     echo $A
38 }
39
40 # Get all the build variables needed by this script in a single call to the build system.
41 function build_build_var_cache()
42 {
43     T=$(gettop)
44     # Grep out the variable names from the script.
45     cached_vars=`cat $T/build/envsetup.sh | tr '()' '  ' | awk '{for(i=1;i<=NF;i++) if($i~/get_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`
46     cached_abs_vars=`cat $T/build/envsetup.sh | tr '()' '  ' | awk '{for(i=1;i<=NF;i++) if($i~/get_abs_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`
47     # Call the build system to dump the "<val>=<value>" pairs as a shell script.
48     build_dicts_script=`\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
49                         command make --no-print-directory -f build/core/config.mk \
50                         dump-many-vars \
51                         DUMP_MANY_VARS="$cached_vars" \
52                         DUMP_MANY_ABS_VARS="$cached_abs_vars" \
53                         DUMP_VAR_PREFIX="var_cache_" \
54                         DUMP_ABS_VAR_PREFIX="abs_var_cache_"`
55     local ret=$?
56     if [ $ret -ne 0 ]
57     then
58         unset build_dicts_script
59         return $ret
60     fi
61     # Excute the script to store the "<val>=<value>" pairs as shell variables.
62     eval "$build_dicts_script"
63     ret=$?
64     unset build_dicts_script
65     if [ $ret -ne 0 ]
66     then
67         return $ret
68     fi
69     BUILD_VAR_CACHE_READY="true"
70 }
71
72 # Delete the build var cache, so that we can still call into the build system
73 # to get build variables not listed in this script.
74 function destroy_build_var_cache()
75 {
76     unset BUILD_VAR_CACHE_READY
77     for v in $cached_vars; do
78       unset var_cache_$v
79     done
80     unset cached_vars
81     for v in $cached_abs_vars; do
82       unset abs_var_cache_$v
83     done
84     unset cached_abs_vars
85 }
86
87 # Get the value of a build variable as an absolute path.
88 function get_abs_build_var()
89 {
90     if [ "$BUILD_VAR_CACHE_READY" = "true" ]
91     then
92         eval "echo \"\${abs_var_cache_$1}\""
93     return
94     fi
95
96     T=$(gettop)
97     if [ ! "$T" ]; then
98         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
99         return
100     fi
101     (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
102       command make --no-print-directory -f build/core/config.mk dumpvar-abs-$1)
103 }
104
105 # Get the exact value of a build variable.
106 function get_build_var()
107 {
108     if [ "$BUILD_VAR_CACHE_READY" = "true" ]
109     then
110         eval "echo \"\${var_cache_$1}\""
111     return
112     fi
113
114     T=$(gettop)
115     if [ ! "$T" ]; then
116         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
117         return
118     fi
119     (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
120       command make --no-print-directory -f build/core/config.mk dumpvar-$1)
121 }
122
123 # check to see if the supplied product is one we can build
124 function check_product()
125 {
126     T=$(gettop)
127     if [ ! "$T" ]; then
128         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
129         return
130     fi
131         TARGET_PRODUCT=$1 \
132         TARGET_BUILD_VARIANT= \
133         TARGET_BUILD_TYPE= \
134         TARGET_BUILD_APPS= \
135         get_build_var TARGET_DEVICE > /dev/null
136     # hide successful answers, but allow the errors to show
137 }
138
139 VARIANT_CHOICES=(user userdebug eng)
140
141 # check to see if the supplied variant is valid
142 function check_variant()
143 {
144     for v in ${VARIANT_CHOICES[@]}
145     do
146         if [ "$v" = "$1" ]
147         then
148             return 0
149         fi
150     done
151     return 1
152 }
153
154 function setpaths()
155 {
156     T=$(gettop)
157     if [ ! "$T" ]; then
158         echo "Couldn't locate the top of the tree.  Try setting TOP."
159         return
160     fi
161
162     ##################################################################
163     #                                                                #
164     #              Read me before you modify this code               #
165     #                                                                #
166     #   This function sets ANDROID_BUILD_PATHS to what it is adding  #
167     #   to PATH, and the next time it is run, it removes that from   #
168     #   PATH.  This is required so lunch can be run more than once   #
169     #   and still have working paths.                                #
170     #                                                                #
171     ##################################################################
172
173     # Note: on windows/cygwin, ANDROID_BUILD_PATHS will contain spaces
174     # due to "C:\Program Files" being in the path.
175
176     # out with the old
177     if [ -n "$ANDROID_BUILD_PATHS" ] ; then
178         export PATH=${PATH/$ANDROID_BUILD_PATHS/}
179     fi
180     if [ -n "$ANDROID_PRE_BUILD_PATHS" ] ; then
181         export PATH=${PATH/$ANDROID_PRE_BUILD_PATHS/}
182         # strip leading ':', if any
183         export PATH=${PATH/:%/}
184     fi
185
186     # and in with the new
187     prebuiltdir=$(getprebuilt)
188     gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS)
189
190     # defined in core/config.mk
191     targetgccversion=$(get_build_var TARGET_GCC_VERSION)
192     targetgccversion2=$(get_build_var 2ND_TARGET_GCC_VERSION)
193     export TARGET_GCC_VERSION=$targetgccversion
194
195     # The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it.
196     export ANDROID_TOOLCHAIN=
197     export ANDROID_TOOLCHAIN_2ND_ARCH=
198     local ARCH=$(get_build_var TARGET_ARCH)
199     case $ARCH in
200         x86) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin
201             ;;
202         x86_64) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin
203             ;;
204         arm) toolchaindir=arm/arm-linux-androideabi-$targetgccversion/bin
205             ;;
206         arm64) toolchaindir=aarch64/aarch64-linux-android-$targetgccversion/bin;
207                toolchaindir2=arm/arm-linux-androideabi-$targetgccversion2/bin
208             ;;
209         mips|mips64) toolchaindir=mips/mips64el-linux-android-$targetgccversion/bin
210             ;;
211         *)
212             echo "Can't find toolchain for unknown architecture: $ARCH"
213             toolchaindir=xxxxxxxxx
214             ;;
215     esac
216     if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
217         export ANDROID_TOOLCHAIN=$gccprebuiltdir/$toolchaindir
218     fi
219
220     if [ -d "$gccprebuiltdir/$toolchaindir2" ]; then
221         export ANDROID_TOOLCHAIN_2ND_ARCH=$gccprebuiltdir/$toolchaindir2
222     fi
223
224     export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools:$T/external/selinux/prebuilts/bin
225     export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_TOOLCHAIN:$ANDROID_TOOLCHAIN_2ND_ARCH:$ANDROID_DEV_SCRIPTS:
226
227     # If prebuilts/android-emulator/<system>/ exists, prepend it to our PATH
228     # to ensure that the corresponding 'emulator' binaries are used.
229     case $(uname -s) in
230         Darwin)
231             ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/darwin-x86_64
232             ;;
233         Linux)
234             ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/linux-x86_64
235             ;;
236         *)
237             ANDROID_EMULATOR_PREBUILTS=
238             ;;
239     esac
240     if [ -n "$ANDROID_EMULATOR_PREBUILTS" -a -d "$ANDROID_EMULATOR_PREBUILTS" ]; then
241         ANDROID_BUILD_PATHS=$ANDROID_BUILD_PATHS$ANDROID_EMULATOR_PREBUILTS:
242         export ANDROID_EMULATOR_PREBUILTS
243     fi
244
245     export PATH=$ANDROID_BUILD_PATHS$PATH
246     export PYTHONPATH=$T/development/python-packages:$PYTHONPATH
247
248     unset ANDROID_JAVA_TOOLCHAIN
249     unset ANDROID_PRE_BUILD_PATHS
250     if [ -n "$JAVA_HOME" ]; then
251         export ANDROID_JAVA_TOOLCHAIN=$JAVA_HOME/bin
252         export ANDROID_PRE_BUILD_PATHS=$ANDROID_JAVA_TOOLCHAIN:
253         export PATH=$ANDROID_PRE_BUILD_PATHS$PATH
254     fi
255
256     unset ANDROID_PRODUCT_OUT
257     export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT)
258     export OUT=$ANDROID_PRODUCT_OUT
259
260     unset ANDROID_HOST_OUT
261     export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT)
262
263     unset ANDROID_HOST_OUT_TESTCASES
264     export ANDROID_HOST_OUT_TESTCASES=$(get_abs_build_var HOST_OUT_TESTCASES)
265
266     unset ANDROID_TARGET_OUT_TESTCASES
267     export ANDROID_TARGET_OUT_TESTCASES=$(get_abs_build_var TARGET_OUT_TESTCASES)
268
269     # needed for building linux on MacOS
270     # TODO: fix the path
271     #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include
272 }
273
274 function printconfig()
275 {
276     T=$(gettop)
277     if [ ! "$T" ]; then
278         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
279         return
280     fi
281     get_build_var report_config
282 }
283
284 function set_stuff_for_environment()
285 {
286     settitle
287     set_java_home
288     setpaths
289     set_sequence_number
290
291     export ANDROID_BUILD_TOP=$(gettop)
292     # With this environment variable new GCC can apply colors to warnings/errors
293     export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
294     export ASAN_OPTIONS=detect_leaks=0
295 }
296
297 function set_sequence_number()
298 {
299     export BUILD_ENV_SEQUENCE_NUMBER=13
300 }
301
302 function settitle()
303 {
304     if [ "$STAY_OFF_MY_LAWN" = "" ]; then
305         local arch=$(gettargetarch)
306         local product=$TARGET_PRODUCT
307         local variant=$TARGET_BUILD_VARIANT
308         local apps=$TARGET_BUILD_APPS
309         if [ -z "$apps" ]; then
310             export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""
311         else
312             export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\""
313         fi
314     fi
315 }
316
317 function addcompletions()
318 {
319     local T dir f
320
321     # Keep us from trying to run in something that isn't bash.
322     if [ -z "${BASH_VERSION}" ]; then
323         return
324     fi
325
326     # Keep us from trying to run in bash that's too old.
327     if [ ${BASH_VERSINFO[0]} -lt 3 ]; then
328         return
329     fi
330
331     dir="sdk/bash_completion"
332     if [ -d ${dir} ]; then
333         for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do
334             echo "including $f"
335             . $f
336         done
337     fi
338
339     complete -C "bit --tab" bit
340 }
341
342 function choosetype()
343 {
344     echo "Build type choices are:"
345     echo "     1. release"
346     echo "     2. debug"
347     echo
348
349     local DEFAULT_NUM DEFAULT_VALUE
350     DEFAULT_NUM=1
351     DEFAULT_VALUE=release
352
353     export TARGET_BUILD_TYPE=
354     local ANSWER
355     while [ -z $TARGET_BUILD_TYPE ]
356     do
357         echo -n "Which would you like? ["$DEFAULT_NUM"] "
358         if [ -z "$1" ] ; then
359             read ANSWER
360         else
361             echo $1
362             ANSWER=$1
363         fi
364         case $ANSWER in
365         "")
366             export TARGET_BUILD_TYPE=$DEFAULT_VALUE
367             ;;
368         1)
369             export TARGET_BUILD_TYPE=release
370             ;;
371         release)
372             export TARGET_BUILD_TYPE=release
373             ;;
374         2)
375             export TARGET_BUILD_TYPE=debug
376             ;;
377         debug)
378             export TARGET_BUILD_TYPE=debug
379             ;;
380         *)
381             echo
382             echo "I didn't understand your response.  Please try again."
383             echo
384             ;;
385         esac
386         if [ -n "$1" ] ; then
387             break
388         fi
389     done
390
391     build_build_var_cache
392     set_stuff_for_environment
393     destroy_build_var_cache
394 }
395
396 #
397 # This function isn't really right:  It chooses a TARGET_PRODUCT
398 # based on the list of boards.  Usually, that gets you something
399 # that kinda works with a generic product, but really, you should
400 # pick a product by name.
401 #
402 function chooseproduct()
403 {
404     if [ "x$TARGET_PRODUCT" != x ] ; then
405         default_value=$TARGET_PRODUCT
406     else
407         default_value=aosp_arm
408     fi
409
410     export TARGET_BUILD_APPS=
411     export TARGET_PRODUCT=
412     local ANSWER
413     while [ -z "$TARGET_PRODUCT" ]
414     do
415         echo -n "Which product would you like? [$default_value] "
416         if [ -z "$1" ] ; then
417             read ANSWER
418         else
419             echo $1
420             ANSWER=$1
421         fi
422
423         if [ -z "$ANSWER" ] ; then
424             export TARGET_PRODUCT=$default_value
425         else
426             if check_product $ANSWER
427             then
428                 export TARGET_PRODUCT=$ANSWER
429             else
430                 echo "** Not a valid product: $ANSWER"
431             fi
432         fi
433         if [ -n "$1" ] ; then
434             break
435         fi
436     done
437
438     build_build_var_cache
439     set_stuff_for_environment
440     destroy_build_var_cache
441 }
442
443 function choosevariant()
444 {
445     echo "Variant choices are:"
446     local index=1
447     local v
448     for v in ${VARIANT_CHOICES[@]}
449     do
450         # The product name is the name of the directory containing
451         # the makefile we found, above.
452         echo "     $index. $v"
453         index=$(($index+1))
454     done
455
456     local default_value=eng
457     local ANSWER
458
459     export TARGET_BUILD_VARIANT=
460     while [ -z "$TARGET_BUILD_VARIANT" ]
461     do
462         echo -n "Which would you like? [$default_value] "
463         if [ -z "$1" ] ; then
464             read ANSWER
465         else
466             echo $1
467             ANSWER=$1
468         fi
469
470         if [ -z "$ANSWER" ] ; then
471             export TARGET_BUILD_VARIANT=$default_value
472         elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then
473             if [ "$ANSWER" -le "${#VARIANT_CHOICES[@]}" ] ; then
474                 export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-1))]}
475             fi
476         else
477             if check_variant $ANSWER
478             then
479                 export TARGET_BUILD_VARIANT=$ANSWER
480             else
481                 echo "** Not a valid variant: $ANSWER"
482             fi
483         fi
484         if [ -n "$1" ] ; then
485             break
486         fi
487     done
488 }
489
490 function choosecombo()
491 {
492     choosetype $1
493
494     echo
495     echo
496     chooseproduct $2
497
498     echo
499     echo
500     choosevariant $3
501
502     echo
503     build_build_var_cache
504     set_stuff_for_environment
505     printconfig
506     destroy_build_var_cache
507 }
508
509 # Clear this variable.  It will be built up again when the vendorsetup.sh
510 # files are included at the end of this file.
511 unset LUNCH_MENU_CHOICES
512 function add_lunch_combo()
513 {
514     local new_combo=$1
515     local c
516     for c in ${LUNCH_MENU_CHOICES[@]} ; do
517         if [ "$new_combo" = "$c" ] ; then
518             return
519         fi
520     done
521     LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
522 }
523
524 # add the default one here
525 add_lunch_combo aosp_arm-eng
526 add_lunch_combo aosp_arm64-eng
527 add_lunch_combo aosp_mips-eng
528 add_lunch_combo aosp_mips64-eng
529 add_lunch_combo aosp_x86-eng
530 add_lunch_combo aosp_x86_64-eng
531
532 function print_lunch_menu()
533 {
534     local uname=$(uname)
535     echo
536     echo "You're building on" $uname
537     echo
538     echo "Lunch menu... pick a combo:"
539
540     local i=1
541     local choice
542     for choice in ${LUNCH_MENU_CHOICES[@]}
543     do
544         echo "     $i. $choice"
545         i=$(($i+1))
546     done
547
548     echo
549 }
550
551 function lunch()
552 {
553     local answer
554
555     if [ "$1" ] ; then
556         answer=$1
557     else
558         print_lunch_menu
559         echo -n "Which would you like? [aosp_arm-eng] "
560         read answer
561     fi
562
563     local selection=
564
565     if [ -z "$answer" ]
566     then
567         selection=aosp_arm-eng
568     elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
569     then
570         if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
571         then
572             selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
573         fi
574     else
575         selection=$answer
576     fi
577
578     export TARGET_BUILD_APPS=
579
580     local product variant_and_version variant version
581
582     product=${selection%%-*} # Trim everything after first dash
583     variant_and_version=${selection#*-} # Trim everything up to first dash
584     if [ "$variant_and_version" != "$selection" ]; then
585         variant=${variant_and_version%%-*}
586         if [ "$variant" != "$variant_and_version" ]; then
587             version=${variant_and_version#*-}
588         fi
589     fi
590
591     if [ -z "$product" ]
592     then
593         echo
594         echo "Invalid lunch combo: $selection"
595         return 1
596     fi
597
598     TARGET_PRODUCT=$product \
599     TARGET_BUILD_VARIANT=$variant \
600     TARGET_PLATFORM_VERSION=$version \
601     build_build_var_cache
602     if [ $? -ne 0 ]
603     then
604         return 1
605     fi
606
607     export TARGET_PRODUCT=$(get_build_var TARGET_PRODUCT)
608     export TARGET_BUILD_VARIANT=$(get_build_var TARGET_BUILD_VARIANT)
609     export TARGET_PLATFORM_VERSION=$(get_build_var TARGET_PLATFORM_VERSION)
610     export TARGET_BUILD_TYPE=release
611
612     echo
613
614     set_stuff_for_environment
615     printconfig
616     destroy_build_var_cache
617 }
618
619 # Tab completion for lunch.
620 function _lunch()
621 {
622     local cur prev opts
623     COMPREPLY=()
624     cur="${COMP_WORDS[COMP_CWORD]}"
625     prev="${COMP_WORDS[COMP_CWORD-1]}"
626
627     COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) )
628     return 0
629 }
630 complete -F _lunch lunch
631
632 # Configures the build to build unbundled apps.
633 # Run tapas with one or more app names (from LOCAL_PACKAGE_NAME)
634 function tapas()
635 {
636     local arch="$(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips|armv5|arm64|x86_64|mips64)$' | xargs)"
637     local variant="$(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$' | xargs)"
638     local density="$(echo $* | xargs -n 1 echo | \grep -E '^(ldpi|mdpi|tvdpi|hdpi|xhdpi|xxhdpi|xxxhdpi|alldpi)$' | xargs)"
639     local apps="$(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng|arm|x86|mips|armv5|arm64|x86_64|mips64|ldpi|mdpi|tvdpi|hdpi|xhdpi|xxhdpi|xxxhdpi|alldpi)$' | xargs)"
640
641     if [ $(echo $arch | wc -w) -gt 1 ]; then
642         echo "tapas: Error: Multiple build archs supplied: $arch"
643         return
644     fi
645     if [ $(echo $variant | wc -w) -gt 1 ]; then
646         echo "tapas: Error: Multiple build variants supplied: $variant"
647         return
648     fi
649     if [ $(echo $density | wc -w) -gt 1 ]; then
650         echo "tapas: Error: Multiple densities supplied: $density"
651         return
652     fi
653
654     local product=aosp_arm
655     case $arch in
656       x86)    product=aosp_x86;;
657       mips)   product=aosp_mips;;
658       armv5)  product=generic_armv5;;
659       arm64)  product=aosp_arm64;;
660       x86_64) product=aosp_x86_64;;
661       mips64)  product=aosp_mips64;;
662     esac
663     if [ -z "$variant" ]; then
664         variant=eng
665     fi
666     if [ -z "$apps" ]; then
667         apps=all
668     fi
669     if [ -z "$density" ]; then
670         density=alldpi
671     fi
672
673     export TARGET_PRODUCT=$product
674     export TARGET_BUILD_VARIANT=$variant
675     export TARGET_BUILD_DENSITY=$density
676     export TARGET_BUILD_TYPE=release
677     export TARGET_BUILD_APPS=$apps
678
679     build_build_var_cache
680     set_stuff_for_environment
681     printconfig
682     destroy_build_var_cache
683 }
684
685 function gettop
686 {
687     local TOPFILE=build/core/envsetup.mk
688     if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
689         # The following circumlocution ensures we remove symlinks from TOP.
690         (cd $TOP; PWD= /bin/pwd)
691     else
692         if [ -f $TOPFILE ] ; then
693             # The following circumlocution (repeated below as well) ensures
694             # that we record the true directory name and not one that is
695             # faked up with symlink names.
696             PWD= /bin/pwd
697         else
698             local HERE=$PWD
699             T=
700             while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
701                 \cd ..
702                 T=`PWD= /bin/pwd -P`
703             done
704             \cd $HERE
705             if [ -f "$T/$TOPFILE" ]; then
706                 echo $T
707             fi
708         fi
709     fi
710 }
711
712 # Return driver for "make", if any (eg. static analyzer)
713 function getdriver()
714 {
715     local T="$1"
716     test "$WITH_STATIC_ANALYZER" = "0" && unset WITH_STATIC_ANALYZER
717     if [ -n "$WITH_STATIC_ANALYZER" ]; then
718         # Use scan-build to collect all static analyzer reports into directory
719         # /tmp/scan-build-yyyy-mm-dd-hhmmss-*
720         # The clang compiler passed by --use-analyzer here is not important.
721         # build/core/binary.mk will set CLANG_CXX and CLANG before calling
722         # c++-analyzer and ccc-analyzer.
723         local CLANG_VERSION=$(get_build_var LLVM_PREBUILTS_VERSION)
724         local BUILD_OS=$(get_build_var BUILD_OS)
725         local CLANG_DIR="$T/prebuilts/clang/host/${BUILD_OS}-x86/${CLANG_VERSION}"
726         echo "\
727 ${CLANG_DIR}/tools/scan-build/bin/scan-build \
728 --use-analyzer ${CLANG_DIR}/bin/clang \
729 --status-bugs"
730     fi
731 }
732
733 function m()
734 {
735     local T=$(gettop)
736     local DRV=$(getdriver $T)
737     if [ "$T" ]; then
738         $DRV make -C $T -f build/core/main.mk $@
739     else
740         echo "Couldn't locate the top of the tree.  Try setting TOP."
741         return 1
742     fi
743 }
744
745 function findmakefile()
746 {
747     TOPFILE=build/core/envsetup.mk
748     local HERE=$PWD
749     T=
750     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
751         T=`PWD= /bin/pwd`
752         if [ -f "$T/Android.mk" -o -f "$T/Android.bp" ]; then
753             echo $T/Android.mk
754             \cd $HERE
755             return
756         fi
757         \cd ..
758     done
759     \cd $HERE
760 }
761
762 function mm()
763 {
764     local T=$(gettop)
765     local DRV=$(getdriver $T)
766     # If we're sitting in the root of the build tree, just do a
767     # normal make.
768     if [ -f build/core/envsetup.mk -a -f Makefile ]; then
769         $DRV make $@
770     else
771         # Find the closest Android.mk file.
772         local M=$(findmakefile)
773         local MODULES=
774         local GET_INSTALL_PATH=
775         local ARGS=
776         # Remove the path to top as the makefilepath needs to be relative
777         local M=`echo $M|sed 's:'$T'/::'`
778         if [ ! "$T" ]; then
779             echo "Couldn't locate the top of the tree.  Try setting TOP."
780             return 1
781         elif [ ! "$M" ]; then
782             echo "Couldn't locate a makefile from the current directory."
783             return 1
784         else
785             for ARG in $@; do
786                 case $ARG in
787                   GET-INSTALL-PATH) GET_INSTALL_PATH=$ARG;;
788                 esac
789             done
790             if [ -n "$GET_INSTALL_PATH" ]; then
791               MODULES=
792               ARGS=GET-INSTALL-PATH-IN-$(dirname ${M})
793               ARGS=${ARGS//\//-}
794             else
795               MODULES=MODULES-IN-$(dirname ${M})
796               # Convert "/" to "-".
797               MODULES=${MODULES//\//-}
798               ARGS=$@
799             fi
800             if [ "1" = "${WITH_TIDY_ONLY}" -o "true" = "${WITH_TIDY_ONLY}" ]; then
801               MODULES=tidy_only
802             fi
803             ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES $ARGS
804         fi
805     fi
806 }
807
808 function mmm()
809 {
810     local T=$(gettop)
811     local DRV=$(getdriver $T)
812     if [ "$T" ]; then
813         local MAKEFILE=
814         local MODULES=
815         local MODULES_IN_PATHS=
816         local ARGS=
817         local DIR TO_CHOP
818         local DIR_MODULES
819         local GET_INSTALL_PATH=
820         local GET_INSTALL_PATHS=
821         local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
822         local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
823         for DIR in $DIRS ; do
824             DIR_MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'`
825             DIR=`echo $DIR | sed -e 's/:.*//' -e 's:/$::'`
826             # Remove the leading ./ and trailing / if any exists.
827             DIR=${DIR#./}
828             DIR=${DIR%/}
829             if [ -f $DIR/Android.mk -o -f $DIR/Android.bp ]; then
830                 local TO_CHOP=`(\cd -P -- $T && pwd -P) | wc -c | tr -d ' '`
831                 local TO_CHOP=`expr $TO_CHOP + 1`
832                 local START=`PWD= /bin/pwd`
833                 local MDIR=`echo $START | cut -c${TO_CHOP}-`
834                 if [ "$MDIR" = "" ] ; then
835                     MDIR=$DIR
836                 else
837                     MDIR=$MDIR/$DIR
838                 fi
839                 MDIR=${MDIR%/.}
840                 if [ "$DIR_MODULES" = "" ]; then
841                     MODULES_IN_PATHS="$MODULES_IN_PATHS MODULES-IN-$MDIR"
842                     GET_INSTALL_PATHS="$GET_INSTALL_PATHS GET-INSTALL-PATH-IN-$MDIR"
843                 else
844                     MODULES="$MODULES $DIR_MODULES"
845                 fi
846                 MAKEFILE="$MAKEFILE $MDIR/Android.mk"
847             else
848                 case $DIR in
849                   showcommands | snod | dist | *=*) ARGS="$ARGS $DIR";;
850                   GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;;
851                   *) if [ -d $DIR ]; then
852                          echo "No Android.mk in $DIR.";
853                      else
854                          echo "Couldn't locate the directory $DIR";
855                      fi
856                      return 1;;
857                 esac
858             fi
859         done
860         if [ -n "$GET_INSTALL_PATH" ]; then
861           ARGS=${GET_INSTALL_PATHS//\//-}
862           MODULES=
863           MODULES_IN_PATHS=
864         fi
865         if [ "1" = "${WITH_TIDY_ONLY}" -o "true" = "${WITH_TIDY_ONLY}" ]; then
866           MODULES=tidy_only
867           MODULES_IN_PATHS=
868         fi
869         # Convert "/" to "-".
870         MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
871         ONE_SHOT_MAKEFILE="$MAKEFILE" $DRV make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $MODULES_IN_PATHS $ARGS
872     else
873         echo "Couldn't locate the top of the tree.  Try setting TOP."
874         return 1
875     fi
876 }
877
878 function mma()
879 {
880   local T=$(gettop)
881   local DRV=$(getdriver $T)
882   if [ -f build/core/envsetup.mk -a -f Makefile ]; then
883     $DRV make $@
884   else
885     if [ ! "$T" ]; then
886       echo "Couldn't locate the top of the tree.  Try setting TOP."
887       return 1
888     fi
889     local M=$(findmakefile)
890     # Remove the path to top as the makefilepath needs to be relative
891     local M=`echo $M|sed 's:'$T'/::'`
892     local MODULES_IN_PATHS=MODULES-IN-$(dirname ${M})
893     # Convert "/" to "-".
894     MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
895     $DRV make -C $T -f build/core/main.mk $@ $MODULES_IN_PATHS
896   fi
897 }
898
899 function mmma()
900 {
901   local T=$(gettop)
902   local DRV=$(getdriver $T)
903   if [ "$T" ]; then
904     local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
905     local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
906     local MY_PWD=`PWD= /bin/pwd`
907     if [ "$MY_PWD" = "$T" ]; then
908       MY_PWD=
909     else
910       MY_PWD=`echo $MY_PWD|sed 's:'$T'/::'`
911     fi
912     local DIR=
913     local MODULES_IN_PATHS=
914     local ARGS=
915     for DIR in $DIRS ; do
916       if [ -d $DIR ]; then
917         # Remove the leading ./ and trailing / if any exists.
918         DIR=${DIR#./}
919         DIR=${DIR%/}
920         if [ "$MY_PWD" != "" ]; then
921           DIR=$MY_PWD/$DIR
922         fi
923         MODULES_IN_PATHS="$MODULES_IN_PATHS MODULES-IN-$DIR"
924       else
925         case $DIR in
926           showcommands | snod | dist | *=*) ARGS="$ARGS $DIR";;
927           *) echo "Couldn't find directory $DIR"; return 1;;
928         esac
929       fi
930     done
931     # Convert "/" to "-".
932     MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
933     $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS $MODULES_IN_PATHS
934   else
935     echo "Couldn't locate the top of the tree.  Try setting TOP."
936     return 1
937   fi
938 }
939
940 function croot()
941 {
942     T=$(gettop)
943     if [ "$T" ]; then
944         if [ "$1" ]; then
945             \cd $(gettop)/$1
946         else
947             \cd $(gettop)
948         fi
949     else
950         echo "Couldn't locate the top of the tree.  Try setting TOP."
951     fi
952 }
953
954 function cproj()
955 {
956     TOPFILE=build/core/envsetup.mk
957     local HERE=$PWD
958     T=
959     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
960         T=$PWD
961         if [ -f "$T/Android.mk" ]; then
962             \cd $T
963             return
964         fi
965         \cd ..
966     done
967     \cd $HERE
968     echo "can't find Android.mk"
969 }
970
971 # simplified version of ps; output in the form
972 # <pid> <procname>
973 function qpid() {
974     local prepend=''
975     local append=''
976     if [ "$1" = "--exact" ]; then
977         prepend=' '
978         append='$'
979         shift
980     elif [ "$1" = "--help" -o "$1" = "-h" ]; then
981         echo "usage: qpid [[--exact] <process name|pid>"
982         return 255
983     fi
984
985     local EXE="$1"
986     if [ "$EXE" ] ; then
987         qpid | \grep "$prepend$EXE$append"
988     else
989         adb shell ps \
990             | tr -d '\r' \
991             | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/'
992     fi
993 }
994
995 function pid()
996 {
997     local prepend=''
998     local append=''
999     if [ "$1" = "--exact" ]; then
1000         prepend=' '
1001         append='$'
1002         shift
1003     fi
1004     local EXE="$1"
1005     if [ "$EXE" ] ; then
1006         local PID=`adb shell ps \
1007             | tr -d '\r' \
1008             | \grep "$prepend$EXE$append" \
1009             | sed -e 's/^[^ ]* *\([0-9]*\).*$/\1/'`
1010         echo "$PID"
1011     else
1012         echo "usage: pid [--exact] <process name>"
1013         return 255
1014     fi
1015 }
1016
1017 # coredump_setup - enable core dumps globally for any process
1018 #                  that has the core-file-size limit set correctly
1019 #
1020 # NOTE: You must call also coredump_enable for a specific process
1021 #       if its core-file-size limit is not set already.
1022 # NOTE: Core dumps are written to ramdisk; they will not survive a reboot!
1023
1024 function coredump_setup()
1025 {
1026     echo "Getting root...";
1027     adb root;
1028     adb wait-for-device;
1029
1030     echo "Remounting root partition read-write...";
1031     adb shell mount -w -o remount -t rootfs rootfs;
1032     sleep 1;
1033     adb wait-for-device;
1034     adb shell mkdir -p /cores;
1035     adb shell mount -t tmpfs tmpfs /cores;
1036     adb shell chmod 0777 /cores;
1037
1038     echo "Granting SELinux permission to dump in /cores...";
1039     adb shell restorecon -R /cores;
1040
1041     echo "Set core pattern.";
1042     adb shell 'echo /cores/core.%p > /proc/sys/kernel/core_pattern';
1043
1044     echo "Done."
1045 }
1046
1047 # coredump_enable - enable core dumps for the specified process
1048 # $1 = PID of process (e.g., $(pid mediaserver))
1049 #
1050 # NOTE: coredump_setup must have been called as well for a core
1051 #       dump to actually be generated.
1052
1053 function coredump_enable()
1054 {
1055     local PID=$1;
1056     if [ -z "$PID" ]; then
1057         printf "Expecting a PID!\n";
1058         return;
1059     fi;
1060     echo "Setting core limit for $PID to infinite...";
1061     adb shell /system/bin/ulimit -p $PID -c unlimited
1062 }
1063
1064 # core - send SIGV and pull the core for process
1065 # $1 = PID of process (e.g., $(pid mediaserver))
1066 #
1067 # NOTE: coredump_setup must be called once per boot for core dumps to be
1068 #       enabled globally.
1069
1070 function core()
1071 {
1072     local PID=$1;
1073
1074     if [ -z "$PID" ]; then
1075         printf "Expecting a PID!\n";
1076         return;
1077     fi;
1078
1079     local CORENAME=core.$PID;
1080     local COREPATH=/cores/$CORENAME;
1081     local SIG=SEGV;
1082
1083     coredump_enable $1;
1084
1085     local done=0;
1086     while [ $(adb shell "[ -d /proc/$PID ] && echo -n yes") ]; do
1087         printf "\tSending SIG%s to %d...\n" $SIG $PID;
1088         adb shell kill -$SIG $PID;
1089         sleep 1;
1090     done;
1091
1092     adb shell "while [ ! -f $COREPATH ] ; do echo waiting for $COREPATH to be generated; sleep 1; done"
1093     echo "Done: core is under $COREPATH on device.";
1094 }
1095
1096 # systemstack - dump the current stack trace of all threads in the system process
1097 # to the usual ANR traces file
1098 function systemstack()
1099 {
1100     stacks system_server
1101 }
1102
1103 function stacks()
1104 {
1105     if [[ $1 =~ ^[0-9]+$ ]] ; then
1106         local PID="$1"
1107     elif [ "$1" ] ; then
1108         local PIDLIST="$(pid $1)"
1109         if [[ $PIDLIST =~ ^[0-9]+$ ]] ; then
1110             local PID="$PIDLIST"
1111         elif [ "$PIDLIST" ] ; then
1112             echo "more than one process: $1"
1113         else
1114             echo "no such process: $1"
1115         fi
1116     else
1117         echo "usage: stacks [pid|process name]"
1118     fi
1119
1120     if [ "$PID" ] ; then
1121         # Determine whether the process is native
1122         if adb shell ls -l /proc/$PID/exe | grep -q /system/bin/app_process ; then
1123             # Dump stacks of Dalvik process
1124             local TRACES=/data/anr/traces.txt
1125             local ORIG=/data/anr/traces.orig
1126             local TMP=/data/anr/traces.tmp
1127
1128             # Keep original traces to avoid clobbering
1129             adb shell mv $TRACES $ORIG
1130
1131             # Make sure we have a usable file
1132             adb shell touch $TRACES
1133             adb shell chmod 666 $TRACES
1134
1135             # Dump stacks and wait for dump to finish
1136             adb shell kill -3 $PID
1137             adb shell notify $TRACES >/dev/null
1138
1139             # Restore original stacks, and show current output
1140             adb shell mv $TRACES $TMP
1141             adb shell mv $ORIG $TRACES
1142             adb shell cat $TMP
1143         else
1144             # Dump stacks of native process
1145             adb shell debuggerd -b $PID
1146         fi
1147     fi
1148 }
1149
1150 # Read the ELF header from /proc/$PID/exe to determine if the process is
1151 # 64-bit.
1152 function is64bit()
1153 {
1154     local PID="$1"
1155     if [ "$PID" ] ; then
1156         if [[ "$(adb shell cat /proc/$PID/exe | xxd -l 1 -s 4 -ps)" -eq "02" ]] ; then
1157             echo "64"
1158         else
1159             echo ""
1160         fi
1161     else
1162         echo ""
1163     fi
1164 }
1165
1166 case `uname -s` in
1167     Darwin)
1168         function sgrep()
1169         {
1170             find -E . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl|vts)' \
1171                 -exec grep --color -n "$@" {} +
1172         }
1173
1174         ;;
1175     *)
1176         function sgrep()
1177         {
1178             find . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\|vts\)' \
1179                 -exec grep --color -n "$@" {} +
1180         }
1181         ;;
1182 esac
1183
1184 function gettargetarch
1185 {
1186     get_build_var TARGET_ARCH
1187 }
1188
1189 function ggrep()
1190 {
1191     find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.gradle" \
1192         -exec grep --color -n "$@" {} +
1193 }
1194
1195 function jgrep()
1196 {
1197     find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" \
1198         -exec grep --color -n "$@" {} +
1199 }
1200
1201 function cgrep()
1202 {
1203     find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \) \
1204         -exec grep --color -n "$@" {} +
1205 }
1206
1207 function resgrep()
1208 {
1209     for dir in `find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -name res -type d`; do
1210         find $dir -type f -name '*\.xml' -exec grep --color -n "$@" {} +
1211     done
1212 }
1213
1214 function mangrep()
1215 {
1216     find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' \
1217         -exec grep --color -n "$@" {} +
1218 }
1219
1220 function sepgrep()
1221 {
1222     find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -name sepolicy -type d \
1223         -exec grep --color -n -r --exclude-dir=\.git "$@" {} +
1224 }
1225
1226 function rcgrep()
1227 {
1228     find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.rc*" \
1229         -exec grep --color -n "$@" {} +
1230 }
1231
1232 case `uname -s` in
1233     Darwin)
1234         function mgrep()
1235         {
1236             find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk|.*\.bp)' \
1237                 -exec grep --color -n "$@" {} +
1238         }
1239
1240         function treegrep()
1241         {
1242             find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cpp|S|java|xml)' \
1243                 -exec grep --color -n -i "$@" {} +
1244         }
1245
1246         ;;
1247     *)
1248         function mgrep()
1249         {
1250             find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk|.*\.bp)' -type f \
1251                 -exec grep --color -n "$@" {} +
1252         }
1253
1254         function treegrep()
1255         {
1256             find . -name .repo -prune -o -name .git -prune -o -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f \
1257                 -exec grep --color -n -i "$@" {} +
1258         }
1259
1260         ;;
1261 esac
1262
1263 function getprebuilt
1264 {
1265     get_abs_build_var ANDROID_PREBUILTS
1266 }
1267
1268 function tracedmdump()
1269 {
1270     T=$(gettop)
1271     if [ ! "$T" ]; then
1272         echo "Couldn't locate the top of the tree.  Try setting TOP."
1273         return
1274     fi
1275     local prebuiltdir=$(getprebuilt)
1276     local arch=$(gettargetarch)
1277     local KERNEL=$T/prebuilts/qemu-kernel/$arch/vmlinux-qemu
1278
1279     local TRACE=$1
1280     if [ ! "$TRACE" ] ; then
1281         echo "usage:  tracedmdump  tracename"
1282         return
1283     fi
1284
1285     if [ ! -r "$KERNEL" ] ; then
1286         echo "Error: cannot find kernel: '$KERNEL'"
1287         return
1288     fi
1289
1290     local BASETRACE=$(basename $TRACE)
1291     if [ "$BASETRACE" = "$TRACE" ] ; then
1292         TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE
1293     fi
1294
1295     echo "post-processing traces..."
1296     rm -f $TRACE/qtrace.dexlist
1297     post_trace $TRACE
1298     if [ $? -ne 0 ]; then
1299         echo "***"
1300         echo "*** Error: malformed trace.  Did you remember to exit the emulator?"
1301         echo "***"
1302         return
1303     fi
1304     echo "generating dexlist output..."
1305     /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
1306     echo "generating dmtrace data..."
1307     q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return
1308     echo "generating html file..."
1309     dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return
1310     echo "done, see $TRACE/dmtrace.html for details"
1311     echo "or run:"
1312     echo "    traceview $TRACE/dmtrace"
1313 }
1314
1315 # communicate with a running device or emulator, set up necessary state,
1316 # and run the hat command.
1317 function runhat()
1318 {
1319     # process standard adb options
1320     local adbTarget=""
1321     if [ "$1" = "-d" -o "$1" = "-e" ]; then
1322         adbTarget=$1
1323         shift 1
1324     elif [ "$1" = "-s" ]; then
1325         adbTarget="$1 $2"
1326         shift 2
1327     fi
1328     local adbOptions=${adbTarget}
1329     #echo adbOptions = ${adbOptions}
1330
1331     # runhat options
1332     local targetPid=$1
1333
1334     if [ "$targetPid" = "" ]; then
1335         echo "Usage: runhat [ -d | -e | -s serial ] target-pid"
1336         return
1337     fi
1338
1339     # confirm hat is available
1340     if [ -z $(which hat) ]; then
1341         echo "hat is not available in this configuration."
1342         return
1343     fi
1344
1345     # issue "am" command to cause the hprof dump
1346     local devFile=/data/local/tmp/hprof-$targetPid
1347     echo "Poking $targetPid and waiting for data..."
1348     echo "Storing data at $devFile"
1349     adb ${adbOptions} shell am dumpheap $targetPid $devFile
1350     echo "Press enter when logcat shows \"hprof: heap dump completed\""
1351     echo -n "> "
1352     read
1353
1354     local localFile=/tmp/$$-hprof
1355
1356     echo "Retrieving file $devFile..."
1357     adb ${adbOptions} pull $devFile $localFile
1358
1359     adb ${adbOptions} shell rm $devFile
1360
1361     echo "Running hat on $localFile"
1362     echo "View the output by pointing your browser at http://localhost:7000/"
1363     echo ""
1364     hat -JXmx512m $localFile
1365 }
1366
1367 function getbugreports()
1368 {
1369     local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`)
1370
1371     if [ ! "$reports" ]; then
1372         echo "Could not locate any bugreports."
1373         return
1374     fi
1375
1376     local report
1377     for report in ${reports[@]}
1378     do
1379         echo "/sdcard/bugreports/${report}"
1380         adb pull /sdcard/bugreports/${report} ${report}
1381         gunzip ${report}
1382     done
1383 }
1384
1385 function getsdcardpath()
1386 {
1387     adb ${adbOptions} shell echo -n \$\{EXTERNAL_STORAGE\}
1388 }
1389
1390 function getscreenshotpath()
1391 {
1392     echo "$(getsdcardpath)/Pictures/Screenshots"
1393 }
1394
1395 function getlastscreenshot()
1396 {
1397     local screenshot_path=$(getscreenshotpath)
1398     local screenshot=`adb ${adbOptions} ls ${screenshot_path} | grep Screenshot_[0-9-]*.*\.png | sort -rk 3 | cut -d " " -f 4 | head -n 1`
1399     if [ "$screenshot" = "" ]; then
1400         echo "No screenshots found."
1401         return
1402     fi
1403     echo "${screenshot}"
1404     adb ${adbOptions} pull ${screenshot_path}/${screenshot}
1405 }
1406
1407 function startviewserver()
1408 {
1409     local port=4939
1410     if [ $# -gt 0 ]; then
1411             port=$1
1412     fi
1413     adb shell service call window 1 i32 $port
1414 }
1415
1416 function stopviewserver()
1417 {
1418     adb shell service call window 2
1419 }
1420
1421 function isviewserverstarted()
1422 {
1423     adb shell service call window 3
1424 }
1425
1426 function key_home()
1427 {
1428     adb shell input keyevent 3
1429 }
1430
1431 function key_back()
1432 {
1433     adb shell input keyevent 4
1434 }
1435
1436 function key_menu()
1437 {
1438     adb shell input keyevent 82
1439 }
1440
1441 function smoketest()
1442 {
1443     if [ ! "$ANDROID_PRODUCT_OUT" ]; then
1444         echo "Couldn't locate output files.  Try running 'lunch' first." >&2
1445         return
1446     fi
1447     T=$(gettop)
1448     if [ ! "$T" ]; then
1449         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
1450         return
1451     fi
1452
1453     (\cd "$T" && mmm tests/SmokeTest) &&
1454       adb uninstall com.android.smoketest > /dev/null &&
1455       adb uninstall com.android.smoketest.tests > /dev/null &&
1456       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk &&
1457       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk &&
1458       adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner
1459 }
1460
1461 # simple shortcut to the runtest command
1462 function runtest()
1463 {
1464     T=$(gettop)
1465     if [ ! "$T" ]; then
1466         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
1467         return
1468     fi
1469     ("$T"/development/testrunner/runtest.py $@)
1470 }
1471
1472 function godir () {
1473     if [[ -z "$1" ]]; then
1474         echo "Usage: godir <regex>"
1475         return
1476     fi
1477     T=$(gettop)
1478     if [ ! "$OUT_DIR" = "" ]; then
1479         mkdir -p $OUT_DIR
1480         FILELIST=$OUT_DIR/filelist
1481     else
1482         FILELIST=$T/filelist
1483     fi
1484     if [[ ! -f $FILELIST ]]; then
1485         echo -n "Creating index..."
1486         (\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > $FILELIST)
1487         echo " Done"
1488         echo ""
1489     fi
1490     local lines
1491     lines=($(\grep "$1" $FILELIST | sed -e 's/\/[^/]*$//' | sort | uniq))
1492     if [[ ${#lines[@]} = 0 ]]; then
1493         echo "Not found"
1494         return
1495     fi
1496     local pathname
1497     local choice
1498     if [[ ${#lines[@]} > 1 ]]; then
1499         while [[ -z "$pathname" ]]; do
1500             local index=1
1501             local line
1502             for line in ${lines[@]}; do
1503                 printf "%6s %s\n" "[$index]" $line
1504                 index=$(($index + 1))
1505             done
1506             echo
1507             echo -n "Select one: "
1508             unset choice
1509             read choice
1510             if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then
1511                 echo "Invalid choice"
1512                 continue
1513             fi
1514             pathname=${lines[$(($choice-1))]}
1515         done
1516     else
1517         pathname=${lines[0]}
1518     fi
1519     \cd $T/$pathname
1520 }
1521
1522 # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set.
1523 function set_java_home() {
1524     # Clear the existing JAVA_HOME value if we set it ourselves, so that
1525     # we can reset it later, depending on the version of java the build
1526     # system needs.
1527     #
1528     # If we don't do this, the JAVA_HOME value set by the first call to
1529     # build/envsetup.sh will persist forever.
1530     if [ -n "$ANDROID_SET_JAVA_HOME" ]; then
1531       export JAVA_HOME=""
1532     fi
1533
1534     if [ ! "$JAVA_HOME" ]; then
1535       if [ -n "$LEGACY_USE_JAVA7" ]; then
1536         echo Warning: Support for JDK 7 will be dropped. Switch to JDK 8.
1537         case `uname -s` in
1538             Darwin)
1539                 export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
1540                 ;;
1541             *)
1542                 export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
1543                 ;;
1544         esac
1545       else
1546         case `uname -s` in
1547             Darwin)
1548                 export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
1549                 ;;
1550             *)
1551                 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
1552                 ;;
1553         esac
1554       fi
1555
1556       # Keep track of the fact that we set JAVA_HOME ourselves, so that
1557       # we can change it on the next envsetup.sh, if required.
1558       export ANDROID_SET_JAVA_HOME=true
1559     fi
1560 }
1561
1562 # Print colored exit condition
1563 function pez {
1564     "$@"
1565     local retval=$?
1566     if [ $retval -ne 0 ]
1567     then
1568         echo $'\E'"[0;31mFAILURE\e[00m"
1569     else
1570         echo $'\E'"[0;32mSUCCESS\e[00m"
1571     fi
1572     return $retval
1573 }
1574
1575 function get_make_command()
1576 {
1577   echo command make
1578 }
1579
1580 function make()
1581 {
1582     local start_time=$(date +"%s")
1583     $(get_make_command) "$@"
1584     local ret=$?
1585     local end_time=$(date +"%s")
1586     local tdiff=$(($end_time-$start_time))
1587     local hours=$(($tdiff / 3600 ))
1588     local mins=$((($tdiff % 3600) / 60))
1589     local secs=$(($tdiff % 60))
1590     local ncolors=$(tput colors 2>/dev/null)
1591     if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then
1592         color_failed=$'\E'"[0;31m"
1593         color_success=$'\E'"[0;32m"
1594         color_reset=$'\E'"[00m"
1595     else
1596         color_failed=""
1597         color_success=""
1598         color_reset=""
1599     fi
1600     echo
1601     if [ $ret -eq 0 ] ; then
1602         echo -n "${color_success}#### make completed successfully "
1603     else
1604         echo -n "${color_failed}#### make failed to build some targets "
1605     fi
1606     if [ $hours -gt 0 ] ; then
1607         printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs
1608     elif [ $mins -gt 0 ] ; then
1609         printf "(%02g:%02g (mm:ss))" $mins $secs
1610     elif [ $secs -gt 0 ] ; then
1611         printf "(%s seconds)" $secs
1612     fi
1613     echo " ####${color_reset}"
1614     echo
1615     return $ret
1616 }
1617
1618 function provision()
1619 {
1620     if [ ! "$ANDROID_PRODUCT_OUT" ]; then
1621         echo "Couldn't locate output files.  Try running 'lunch' first." >&2
1622         return 1
1623     fi
1624     if [ ! -e "$ANDROID_PRODUCT_OUT/provision-device" ]; then
1625         echo "There is no provisioning script for the device." >&2
1626         return 1
1627     fi
1628
1629     # Check if user really wants to do this.
1630     if [ "$1" = "--no-confirmation" ]; then
1631         shift 1
1632     else
1633         echo "This action will reflash your device."
1634         echo ""
1635         echo "ALL DATA ON THE DEVICE WILL BE IRREVOCABLY ERASED."
1636         echo ""
1637         echo -n "Are you sure you want to do this (yes/no)? "
1638         read
1639         if [[ "${REPLY}" != "yes" ]] ; then
1640             echo "Not taking any action. Exiting." >&2
1641             return 1
1642         fi
1643     fi
1644     "$ANDROID_PRODUCT_OUT/provision-device" "$@"
1645 }
1646
1647 if [ "x$SHELL" != "x/bin/bash" ]; then
1648     case `ps -o command -p $$` in
1649         *bash*)
1650             ;;
1651         *)
1652             echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results"
1653             ;;
1654     esac
1655 fi
1656
1657 # Execute the contents of any vendorsetup.sh files we can find.
1658 for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
1659          `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
1660          `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
1661 do
1662     echo "including $f"
1663     . $f
1664 done
1665 unset f
1666
1667 addcompletions