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