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