envsetup.sh 29.2 KB
Newer Older
1
function hmm() {
2
cat <<EOF
3
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
4 5 6 7 8 9 10
- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
- mm:      Builds all of the modules in the current directory.
- mmm:     Builds all of the modules in the supplied directories.
- cgrep:   Greps on all local C/C++ files.
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
11
- godir:   Go to the directory containing a file.
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Look at the source to view more functions. The complete list is:
EOF
    T=$(gettop)
    local A
    A=""
    for i in `cat $T/build/envsetup.sh | sed -n "/^function /s/function \([a-z_]*\).*/\1/p" | sort`; do
      A="$A $i"
    done
    echo $A
}

# Get the value of a build variable as an absolute path.
function get_abs_build_var()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
32 33
    (cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
      make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-abs-$1)
34 35 36 37 38 39 40 41 42 43
}

# Get the exact value of a build variable.
function get_build_var()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
44 45 46 47 48 49 50 51 52 53 54 55 56
    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
      make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1
}

# check to see if the supplied product is one we can build
function check_product()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
57 58 59
        TARGET_PRODUCT=$1 \
        TARGET_BUILD_VARIANT= \
        TARGET_BUILD_TYPE= \
Joe Onorato's avatar
Joe Onorato committed
60
        TARGET_BUILD_APPS= \
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
        get_build_var TARGET_DEVICE > /dev/null
    # hide successful answers, but allow the errors to show
}

VARIANT_CHOICES=(user userdebug eng)

# check to see if the supplied variant is valid
function check_variant()
{
    for v in ${VARIANT_CHOICES[@]}
    do
        if [ "$v" = "$1" ]
        then
            return 0
        fi
    done
    return 1
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
}

function setpaths()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP."
        return
    fi

    ##################################################################
    #                                                                #
    #              Read me before you modify this code               #
    #                                                                #
    #   This function sets ANDROID_BUILD_PATHS to what it is adding  #
    #   to PATH, and the next time it is run, it removes that from   #
    #   PATH.  This is required so lunch can be run more than once   #
    #   and still have working paths.                                #
    #                                                                #
    ##################################################################

99 100 101
    # Note: on windows/cygwin, ANDROID_BUILD_PATHS will contain spaces
    # due to "C:\Program Files" being in the path.

102
    # out with the old
103
    if [ -n "$ANDROID_BUILD_PATHS" ] ; then
104 105
        export PATH=${PATH/$ANDROID_BUILD_PATHS/}
    fi
106
    if [ -n "$ANDROID_PRE_BUILD_PATHS" ] ; then
107 108 109
        export PATH=${PATH/$ANDROID_PRE_BUILD_PATHS/}
        # strip trailing ':', if any
        export PATH=${PATH/%:/}
110
    fi
111 112 113 114

    # and in with the new
    CODE_REVIEWS=
    prebuiltdir=$(getprebuilt)
115
    gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS)
116

117
    # The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it.
118
    export ANDROID_EABI_TOOLCHAIN=
119 120
    local ARCH=$(get_build_var TARGET_ARCH)
    case $ARCH in
121
        x86) toolchaindir=x86/i686-linux-android-4.6/bin
Mark D Horn's avatar
Mark D Horn committed
122
            ;;
123 124 125 126 127
        arm) toolchaindir=arm/arm-linux-androideabi-4.6/bin
            ;;
        *)
            echo "Can't find toolchain for unknown architecture: $ARCH"
            toolchaindir=xxxxxxxxx
Mark D Horn's avatar
Mark D Horn committed
128 129
            ;;
    esac
130 131
    if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
        export ANDROID_EABI_TOOLCHAIN=$gccprebuiltdir/$toolchaindir
132
    fi
133

Bruce Beare's avatar
Bruce Beare committed
134
    unset ARM_EABI_TOOLCHAIN ARM_EABI_TOOLCHAIN_PATH
Ying Wang's avatar
Ying Wang committed
135
    case $ARCH in
Bruce Beare's avatar
Bruce Beare committed
136 137 138 139 140 141
        arm)
            toolchaindir=arm/arm-eabi-4.6/bin
            if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
                 export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir"
                 ARM_EABI_TOOLCHAIN_PATH=":$gccprebuiltdir/$toolchaindir"
            fi
Ying Wang's avatar
Ying Wang committed
142 143
            ;;
        *)
Bruce Beare's avatar
Bruce Beare committed
144
            # No need to set ARM_EABI_TOOLCHAIN for other ARCHs
Ying Wang's avatar
Ying Wang committed
145 146 147
            ;;
    esac

148 149
    export ANDROID_TOOLCHAIN=$ANDROID_EABI_TOOLCHAIN
    export ANDROID_QTOOLS=$T/development/emulator/qtools
150
    export ANDROID_DEV_SCRIPTS=$T/development/scripts
Bruce Beare's avatar
Bruce Beare committed
151
    export ANDROID_BUILD_PATHS=:$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_QTOOLS:$ANDROID_TOOLCHAIN$ARM_EABI_TOOLCHAIN_PATH$CODE_REVIEWS:$ANDROID_DEV_SCRIPTS
152
    export PATH=$PATH$ANDROID_BUILD_PATHS
153

154
    unset ANDROID_JAVA_TOOLCHAIN
155
    unset ANDROID_PRE_BUILD_PATHS
156 157
    if [ -n "$JAVA_HOME" ]; then
        export ANDROID_JAVA_TOOLCHAIN=$JAVA_HOME/bin
158 159
        export ANDROID_PRE_BUILD_PATHS=$ANDROID_JAVA_TOOLCHAIN:
        export PATH=$ANDROID_PRE_BUILD_PATHS$PATH
160 161
    fi

162
    unset ANDROID_PRODUCT_OUT
163 164 165
    export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT)
    export OUT=$ANDROID_PRODUCT_OUT

166 167 168
    unset ANDROID_HOST_OUT
    export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT)

169 170 171 172
    # needed for processing samples collected by perf counters
    unset OPROFILE_EVENTS_DIR
    export OPROFILE_EVENTS_DIR=$T/external/oprofile/events

173
    # needed for building linux on MacOS
174 175 176 177 178 179
    # TODO: fix the path
    #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include
}

function printconfig()
{
180 181 182 183 184 185
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
    get_build_var report_config
186 187 188 189
}

function set_stuff_for_environment()
{
190
    settitle
191
    set_java_home
192 193
    setpaths
    set_sequence_number
194

195
    export ANDROID_BUILD_TOP=$(gettop)
196 197 198 199
}

function set_sequence_number()
{
200
    export BUILD_ENV_SEQUENCE_NUMBER=10
201 202 203 204
}

function settitle()
{
205
    if [ "$STAY_OFF_MY_LAWN" = "" ]; then
Joe Onorato's avatar
Joe Onorato committed
206 207 208 209 210 211 212 213
        local product=$TARGET_PRODUCT
        local variant=$TARGET_BUILD_VARIANT
        local apps=$TARGET_BUILD_APPS
        if [ -z "$apps" ]; then
            export PROMPT_COMMAND="echo -ne \"\033]0;[${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""
        else
            export PROMPT_COMMAND="echo -ne \"\033]0;[$apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\""
        fi
214
    fi
215 216
}

Kenny Root's avatar
Kenny Root committed
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
function addcompletions()
{
    local T dir f

    # Keep us from trying to run in something that isn't bash.
    if [ -z "${BASH_VERSION}" ]; then
        return
    fi

    # Keep us from trying to run in bash that's too old.
    if [ ${BASH_VERSINFO[0]} -lt 3 ]; then
        return
    fi

    dir="sdk/bash_completion"
    if [ -d ${dir} ]; then
233
        for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do
Kenny Root's avatar
Kenny Root committed
234 235 236 237 238 239
            echo "including $f"
            . $f
        done
    fi
}

240 241 242 243 244 245 246
function choosetype()
{
    echo "Build type choices are:"
    echo "     1. release"
    echo "     2. debug"
    echo

247
    local DEFAULT_NUM DEFAULT_VALUE
248 249
    DEFAULT_NUM=1
    DEFAULT_VALUE=release
250

251 252
    export TARGET_BUILD_TYPE=
    local ANSWER
253 254 255
    while [ -z $TARGET_BUILD_TYPE ]
    do
        echo -n "Which would you like? ["$DEFAULT_NUM"] "
256 257 258 259 260 261
        if [ -z "$1" ] ; then
            read ANSWER
        else
            echo $1
            ANSWER=$1
        fi
262 263 264 265 266 267 268
        case $ANSWER in
        "")
            export TARGET_BUILD_TYPE=$DEFAULT_VALUE
            ;;
        1)
            export TARGET_BUILD_TYPE=release
            ;;
269 270 271
        release)
            export TARGET_BUILD_TYPE=release
            ;;
272 273 274
        2)
            export TARGET_BUILD_TYPE=debug
            ;;
275 276 277
        debug)
            export TARGET_BUILD_TYPE=debug
            ;;
278 279 280 281 282 283
        *)
            echo
            echo "I didn't understand your response.  Please try again."
            echo
            ;;
        esac
284 285 286
        if [ -n "$1" ] ; then
            break
        fi
287 288 289 290 291
    done

    set_stuff_for_environment
}

292 293 294 295 296 297
#
# This function isn't really right:  It chooses a TARGET_PRODUCT
# based on the list of boards.  Usually, that gets you something
# that kinda works with a generic product, but really, you should
# pick a product by name.
#
298 299 300 301 302
function chooseproduct()
{
    if [ "x$TARGET_PRODUCT" != x ] ; then
        default_value=$TARGET_PRODUCT
    else
303
        default_value=full
304 305
    fi

306 307
    export TARGET_PRODUCT=
    local ANSWER
308 309
    while [ -z "$TARGET_PRODUCT" ]
    do
310
        echo -n "Which product would you like? [$default_value] "
311 312 313 314 315 316 317
        if [ -z "$1" ] ; then
            read ANSWER
        else
            echo $1
            ANSWER=$1
        fi

318 319
        if [ -z "$ANSWER" ] ; then
            export TARGET_PRODUCT=$default_value
320 321 322 323 324 325 326 327 328 329
        else
            if check_product $ANSWER
            then
                export TARGET_PRODUCT=$ANSWER
            else
                echo "** Not a valid product: $ANSWER"
            fi
        fi
        if [ -n "$1" ] ; then
            break
330 331 332 333 334 335
        fi
    done

    set_stuff_for_environment
}

336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
function choosevariant()
{
    echo "Variant choices are:"
    local index=1
    local v
    for v in ${VARIANT_CHOICES[@]}
    do
        # The product name is the name of the directory containing
        # the makefile we found, above.
        echo "     $index. $v"
        index=$(($index+1))
    done

    local default_value=eng
    local ANSWER

    export TARGET_BUILD_VARIANT=
    while [ -z "$TARGET_BUILD_VARIANT" ]
    do
        echo -n "Which would you like? [$default_value] "
        if [ -z "$1" ] ; then
            read ANSWER
        else
            echo $1
            ANSWER=$1
        fi

        if [ -z "$ANSWER" ] ; then
            export TARGET_BUILD_VARIANT=$default_value
        elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then
            if [ "$ANSWER" -le "${#VARIANT_CHOICES[@]}" ] ; then
367
                export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-1))]}
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
            fi
        else
            if check_variant $ANSWER
            then
                export TARGET_BUILD_VARIANT=$ANSWER
            else
                echo "** Not a valid variant: $ANSWER"
            fi
        fi
        if [ -n "$1" ] ; then
            break
        fi
    done
}

383 384
function choosecombo()
{
385
    choosetype $1
386 387 388

    echo
    echo
389
    chooseproduct $2
390 391 392

    echo
    echo
393
    choosevariant $3
394

395 396
    echo
    set_stuff_for_environment
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
    printconfig
}

# Clear this variable.  It will be built up again when the vendorsetup.sh
# files are included at the end of this file.
unset LUNCH_MENU_CHOICES
function add_lunch_combo()
{
    local new_combo=$1
    local c
    for c in ${LUNCH_MENU_CHOICES[@]} ; do
        if [ "$new_combo" = "$c" ] ; then
            return
        fi
    done
    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
413 414
}

415
# add the default one here
416
add_lunch_combo full-eng
Jean-Baptiste Queru's avatar
Jean-Baptiste Queru committed
417
add_lunch_combo full_x86-eng
418
add_lunch_combo vbox_x86-eng
419

420 421 422 423 424 425 426
function print_lunch_menu()
{
    local uname=$(uname)
    echo
    echo "You're building on" $uname
    echo
    echo "Lunch menu... pick a combo:"
427 428 429 430 431 432 433 434 435

    local i=1
    local choice
    for choice in ${LUNCH_MENU_CHOICES[@]}
    do
        echo "     $i. $choice"
        i=$(($i+1))
    done

436 437 438 439 440
    echo
}

function lunch()
{
441 442
    local answer

443
    if [ "$1" ] ; then
444
        answer=$1
445 446
    else
        print_lunch_menu
447
        echo -n "Which would you like? [full-eng] "
448
        read answer
449 450
    fi

451 452 453 454
    local selection=

    if [ -z "$answer" ]
    then
455
        selection=full-eng
456 457 458 459
    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
    then
        if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
        then
460
            selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
461 462
        fi
    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
463
    then
464
        selection=$answer
465 466
    fi

467 468 469 470 471 472 473
    if [ -z "$selection" ]
    then
        echo
        echo "Invalid lunch combo: $answer"
        return 1
    fi

Joe Onorato's avatar
Joe Onorato committed
474 475
    export TARGET_BUILD_APPS=

476 477 478
    local product=$(echo -n $selection | sed -e "s/-.*$//")
    check_product $product
    if [ $? -ne 0 ]
479
    then
480 481 482 483 484
        echo
        echo "** Don't have a product spec for: '$product'"
        echo "** Do you have the right repo manifest?"
        product=
    fi
485

486 487 488 489 490 491 492 493 494
    local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
    check_variant $variant
    if [ $? -ne 0 ]
    then
        echo
        echo "** Invalid variant: '$variant'"
        echo "** Must be one of ${VARIANT_CHOICES[@]}"
        variant=
    fi
495

496 497 498 499 500
    if [ -z "$product" -o -z "$variant" ]
    then
        echo
        return 1
    fi
501

502 503 504
    export TARGET_PRODUCT=$product
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_BUILD_TYPE=release
505

506 507 508 509
    echo

    set_stuff_for_environment
    printconfig
510 511
}

Jeff Davidson's avatar
Jeff Davidson committed
512 513 514 515 516 517 518 519 520 521 522 523 524
# Tab completion for lunch.
function _lunch()
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) )
    return 0
}
complete -F _lunch lunch

Joe Onorato's avatar
Joe Onorato committed
525 526 527 528
# Configures the build to build unbundled apps.
# Run tapas with one ore more app names (from LOCAL_PACKAGE_NAME)
function tapas()
{
529 530
    local variant=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$'))
    local apps=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng)$'))
Joe Onorato's avatar
Joe Onorato committed
531 532 533 534 535 536 537 538

    if [ $(echo $variant | wc -w) -gt 1 ]; then
        echo "tapas: Error: Multiple build variants supplied: $variant"
        return
    fi
    if [ -z "$variant" ]; then
        variant=eng
    fi
539 540 541
    if [ -z "$apps" ]; then
        apps=all
    fi
Joe Onorato's avatar
Joe Onorato committed
542

543
    export TARGET_PRODUCT=full
Joe Onorato's avatar
Joe Onorato committed
544 545 546 547 548 549 550 551
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_BUILD_TYPE=release
    export TARGET_BUILD_APPS=$apps

    set_stuff_for_environment
    printconfig
}

552 553
function gettop
{
554
    local TOPFILE=build/core/envsetup.mk
555 556 557 558
    if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
        echo $TOP
    else
        if [ -f $TOPFILE ] ; then
559 560 561 562
            # The following circumlocution (repeated below as well) ensures
            # that we record the true directory name and not one that is
            # faked up with symlink names.
            PWD= /bin/pwd
563 564 565 566
        else
            # We redirect cd to /dev/null in case it's aliased to
            # a command that prints something as a side-effect
            # (like pushd)
567
            local HERE=$PWD
568 569 570
            T=
            while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
                cd .. > /dev/null
571
                T=`PWD= /bin/pwd`
572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
            done
            cd $HERE > /dev/null
            if [ -f "$T/$TOPFILE" ]; then
                echo $T
            fi
        fi
    fi
}

function m()
{
    T=$(gettop)
    if [ "$T" ]; then
        make -C $T $@
    else
        echo "Couldn't locate the top of the tree.  Try setting TOP."
    fi
}

function findmakefile()
{
    TOPFILE=build/core/envsetup.mk
    # We redirect cd to /dev/null in case it's aliased to
    # a command that prints something as a side-effect
    # (like pushd)
597
    local HERE=$PWD
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619
    T=
    while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
        T=$PWD
        if [ -f "$T/Android.mk" ]; then
            echo $T/Android.mk
            cd $HERE > /dev/null
            return
        fi
        cd .. > /dev/null
    done
    cd $HERE > /dev/null
}

function mm()
{
    # If we're sitting in the root of the build tree, just do a
    # normal make.
    if [ -f build/core/envsetup.mk -a -f Makefile ]; then
        make $@
    else
        # Find the closest Android.mk file.
        T=$(gettop)
620
        local M=$(findmakefile)
621 622
        # Remove the path to top as the makefilepath needs to be relative
        local M=`echo $M|sed 's:'$T'/::'`
623 624 625 626 627
        if [ ! "$T" ]; then
            echo "Couldn't locate the top of the tree.  Try setting TOP."
        elif [ ! "$M" ]; then
            echo "Couldn't locate a makefile from the current directory."
        else
628
            ONE_SHOT_MAKEFILE=$M make -C $T all_modules $@
629 630 631 632 633 634 635 636
        fi
    fi
}

function mmm()
{
    T=$(gettop)
    if [ "$T" ]; then
637
        local MAKEFILE=
638
        local MODULES=
639 640
        local ARGS=
        local DIR TO_CHOP
641 642 643
        local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
        local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
        for DIR in $DIRS ; do
644 645 646 647 648
            MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'`
            if [ "$MODULES" = "" ]; then
                MODULES=all_modules
            fi
            DIR=`echo $DIR | sed -e 's/:.*//' -e 's:/$::'`
649
            if [ -f $DIR/Android.mk ]; then
650
                TO_CHOP=`(cd -P -- $T && pwd -P) | wc -c | tr -d ' '`
651
                TO_CHOP=`expr $TO_CHOP + 1`
652 653
                START=`PWD= /bin/pwd`
                MFILE=`echo $START | cut -c${TO_CHOP}-`
654 655 656 657 658 659 660 661 662 663 664
                if [ "$MFILE" = "" ] ; then
                    MFILE=$DIR/Android.mk
                else
                    MFILE=$MFILE/$DIR/Android.mk
                fi
                MAKEFILE="$MAKEFILE $MFILE"
            else
                if [ "$DIR" = snod ]; then
                    ARGS="$ARGS snod"
                elif [ "$DIR" = showcommands ]; then
                    ARGS="$ARGS showcommands"
665 666
                elif [ "$DIR" = dist ]; then
                    ARGS="$ARGS dist"
Ying Wang's avatar
Ying Wang committed
667 668
                elif [ "$DIR" = incrementaljavac ]; then
                    ARGS="$ARGS incrementaljavac"
669 670
                else
                    echo "No Android.mk in $DIR."
671
                    return 1
672 673 674
                fi
            fi
        done
675
        ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS $MODULES $ARGS
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
    else
        echo "Couldn't locate the top of the tree.  Try setting TOP."
    fi
}

function croot()
{
    T=$(gettop)
    if [ "$T" ]; then
        cd $(gettop)
    else
        echo "Couldn't locate the top of the tree.  Try setting TOP."
    fi
}

691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
function cproj()
{
    TOPFILE=build/core/envsetup.mk
    # We redirect cd to /dev/null in case it's aliased to
    # a command that prints something as a side-effect
    # (like pushd)
    local HERE=$PWD
    T=
    while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
        T=$PWD
        if [ -f "$T/Android.mk" ]; then
            cd $T
            return
        fi
        cd .. > /dev/null
    done
    cd $HERE > /dev/null
    echo "can't find Android.mk"
}

711 712 713 714 715 716 717 718 719 720 721
function pid()
{
   local EXE="$1"
   if [ "$EXE" ] ; then
       local PID=`adb shell ps | fgrep $1 | sed -e 's/[^ ]* *\([0-9]*\).*/\1/'`
       echo "$PID"
   else
       echo "usage: pid name"
   fi
}

722 723 724 725 726 727 728
# systemstack - dump the current stack trace of all threads in the system process
# to the usual ANR traces file
function systemstack()
{
    adb shell echo '""' '>>' /data/anr/traces.txt && adb shell chmod 776 /data/anr/traces.txt && adb shell kill -3 $(pid system_server)
}

729 730
function gdbclient()
{
731 732 733 734 735
   local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT)
   local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED)
   local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED)
   local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED)
   local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS)
Nick Kralevich's avatar
Nick Kralevich committed
736 737 738
   local ARCH=$(get_build_var TARGET_ARCH)
   local GDB
   case "$ARCH" in
739
       x86) GDB=i686-linux-android-gdb;;
Nick Kralevich's avatar
Nick Kralevich committed
740 741 742 743
       arm) GDB=arm-linux-androideabi-gdb;;
       *) echo "Unknown arch $ARCH"; return 1;;
   esac

744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
   if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then
       local EXE="$1"
       if [ "$EXE" ] ; then
           EXE=$1
       else
           EXE="app_process"
       fi

       local PORT="$2"
       if [ "$PORT" ] ; then
           PORT=$2
       else
           PORT=":5039"
       fi

       local PID
       local PROG="$3"
       if [ "$PROG" ] ; then
762 763 764 765 766
           if [[ "$PROG" =~ ^[0-9]+$ ]] ; then
               PID="$3"
           else
               PID=`pid $3`
           fi
767 768 769 770 771 772 773 774 775 776 777 778 779
           adb forward "tcp$PORT" "tcp$PORT"
           adb shell gdbserver $PORT --attach $PID &
           sleep 2
       else
               echo ""
               echo "If you haven't done so already, do this first on the device:"
               echo "    gdbserver $PORT /system/bin/$EXE"
                   echo " or"
               echo "    gdbserver $PORT --attach $PID"
               echo ""
       fi

       echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS"
780
       echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines"
781 782 783
       echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT"
       echo >>"$OUT_ROOT/gdbclient.cmds" ""

784
       $ANDROID_TOOLCHAIN/$GDB -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE"
785 786 787 788 789 790 791 792 793 794
  else
       echo "Unable to determine build system output dir."
   fi

}

case `uname -s` in
    Darwin)
        function sgrep()
        {
795
            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 "$@"
796 797 798 799 800 801
        }

        ;;
    *)
        function sgrep()
        {
802
            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 "$@"
803 804 805 806 807 808
        }
        ;;
esac

function jgrep()
{
809
    find . -name .repo -prune -o -name .git -prune -o  -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@"
810 811 812 813
}

function cgrep()
{
Mike Dodd's avatar
Mike Dodd committed
814
    find . -name .repo -prune -o -name .git -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@"
815 816 817 818
}

function resgrep()
{
819
    for dir in `find . -name .repo -prune -o -name .git -prune -o -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done;
820 821 822 823 824 825
}

case `uname -s` in
    Darwin)
        function mgrep()
        {
826
            find -E . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@"
827 828 829 830
        }

        function treegrep()
        {
831
            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 "$@"
832 833 834 835 836 837
        }

        ;;
    *)
        function mgrep()
        {
838
            find . -name .repo -prune -o -name .git -prune -o -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@"
839 840 841 842
        }

        function treegrep()
        {
843
            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 "$@"
844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860
        }

        ;;
esac

function getprebuilt
{
    get_abs_build_var ANDROID_PREBUILTS
}

function tracedmdump()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP."
        return
    fi
861
    local prebuiltdir=$(getprebuilt)
862
    local KERNEL=$T/prebuilt/android-arm/kernel/vmlinux-qemu
863

864
    local TRACE=$1
865 866 867 868 869
    if [ ! "$TRACE" ] ; then
        echo "usage:  tracedmdump  tracename"
        return
    fi

870 871 872 873 874
    if [ ! -r "$KERNEL" ] ; then
        echo "Error: cannot find kernel: '$KERNEL'"
        return
    fi

875
    local BASETRACE=$(basename $TRACE)
876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899
    if [ "$BASETRACE" = "$TRACE" ] ; then
        TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE
    fi

    echo "post-processing traces..."
    rm -f $TRACE/qtrace.dexlist
    post_trace $TRACE
    if [ $? -ne 0 ]; then
        echo "***"
        echo "*** Error: malformed trace.  Did you remember to exit the emulator?"
        echo "***"
        return
    fi
    echo "generating dexlist output..."
    /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
    echo "generating dmtrace data..."
    q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return
    echo "generating html file..."
    dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return
    echo "done, see $TRACE/dmtrace.html for details"
    echo "or run:"
    echo "    traceview $TRACE/dmtrace"
}

900 901
# communicate with a running device or emulator, set up necessary state,
# and run the hat command.
902 903
function runhat()
{
904 905
    # process standard adb options
    local adbTarget=""
906
    if [ "$1" = "-d" -o "$1" = "-e" ]; then
907 908
        adbTarget=$1
        shift 1
909
    elif [ "$1" = "-s" ]; then
910 911 912 913 914 915 916 917
        adbTarget="$1 $2"
        shift 2
    fi
    local adbOptions=${adbTarget}
    echo adbOptions = ${adbOptions}

    # runhat options
    local targetPid=$1
918 919

    if [ "$targetPid" = "" ]; then
920
        echo "Usage: runhat [ -d | -e | -s serial ] target-pid"
921 922 923
        return
    fi

924 925 926 927 928 929
    # confirm hat is available
    if [ -z $(which hat) ]; then
        echo "hat is not available in this configuration."
        return
    fi

930 931
    # issue "am" command to cause the hprof dump
    local devFile=/sdcard/hprof-$targetPid
932
    echo "Poking $targetPid and waiting for data..."
933
    adb ${adbOptions} shell am dumpheap $targetPid $devFile
934
    echo "Press enter when logcat shows \"hprof: heap dump completed\""
935 936 937
    echo -n "> "
    read

938
    local localFile=/tmp/$$-hprof
939

940 941
    echo "Retrieving file $devFile..."
    adb ${adbOptions} pull $devFile $localFile
942

943
    adb ${adbOptions} shell rm $devFile
944

945
    echo "Running hat on $localFile"
946 947
    echo "View the output by pointing your browser at http://localhost:7000/"
    echo ""
Dianne Hackborn's avatar
Dianne Hackborn committed
948
    hat -JXmx512m $localFile
949 950 951 952
}

function getbugreports()
{
953
    local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`)
954 955 956 957 958 959

    if [ ! "$reports" ]; then
        echo "Could not locate any bugreports."
        return
    fi

960 961
    local report
    for report in ${reports[@]}
962
    do
963 964 965
        echo "/sdcard/bugreports/${report}"
        adb pull /sdcard/bugreports/${report} ${report}
        gunzip ${report}
966 967 968 969 970
    done
}

function startviewserver()
{
971
    local port=4939
972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987
    if [ $# -gt 0 ]; then
            port=$1
    fi
    adb shell service call window 1 i32 $port
}

function stopviewserver()
{
    adb shell service call window 2
}

function isviewserverstarted()
{
    adb shell service call window 3
}

988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002
function key_home()
{
    adb shell input keyevent 3
}

function key_back()
{
    adb shell input keyevent 4
}

function key_menu()
{
    adb shell input keyevent 82
}

1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
function smoketest()
{
    if [ ! "$ANDROID_PRODUCT_OUT" ]; then
        echo "Couldn't locate output files.  Try running 'lunch' first." >&2
        return
    fi
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi

    (cd "$T" && mmm tests/SmokeTest) &&
      adb uninstall com.android.smoketest > /dev/null &&
      adb uninstall com.android.smoketest.tests > /dev/null &&
      adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk &&
      adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk &&
      adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner
}

1023 1024 1025 1026 1027 1028 1029 1030
# simple shortcut to the runtest command
function runtest()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
1031
    ("$T"/development/testrunner/runtest.py $@)
1032 1033
}

1034 1035 1036 1037 1038
function godir () {
    if [[ -z "$1" ]]; then
        echo "Usage: godir <regex>"
        return
    fi
1039
    T=$(gettop)
1040 1041
    if [[ ! -f $T/filelist ]]; then
        echo -n "Creating index..."
1042
        (cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist)
1043 1044 1045 1046
        echo " Done"
        echo ""
    fi
    local lines
1047
    lines=($(\grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq))
1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059
    if [[ ${#lines[@]} = 0 ]]; then
        echo "Not found"
        return
    fi
    local pathname
    local choice
    if [[ ${#lines[@]} > 1 ]]; then
        while [[ -z "$pathname" ]]; do
            local index=1
            local line
            for line in ${lines[@]}; do
                printf "%6s %s\n" "[$index]" $line
1060
                index=$(($index + 1))
1061 1062 1063 1064 1065 1066 1067 1068 1069
            done
            echo
            echo -n "Select one: "
            unset choice
            read choice
            if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then
                echo "Invalid choice"
                continue
            fi
1070
            pathname=${lines[$(($choice-1))]}
1071 1072 1073 1074 1075 1076 1077
        done
    else
        pathname=${lines[0]}
    fi
    cd $T/$pathname
}

1078 1079
# Force JAVA_HOME to point to java 1.6 if it isn't already set
function set_java_home() {
1080 1081 1082 1083 1084 1085 1086 1087 1088
    if [ ! "$JAVA_HOME" ]; then
        case `uname -s` in
            Darwin)
                export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
                ;;
            *)
                export JAVA_HOME=/usr/lib/jvm/java-6-sun
                ;;
        esac
1089
    fi
1090
}
1091

1092 1093 1094 1095 1096 1097 1098 1099 1100
if [ "x$SHELL" != "x/bin/bash" ]; then
    case `ps -o command -p $$` in
        *bash*)
            ;;
        *)
            echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results"
            ;;
    esac
fi
1101 1102

# Execute the contents of any vendorsetup.sh files we can find.
1103
for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/*/vendorsetup.sh device/*/*/vendorsetup.sh 2> /dev/null`
1104 1105 1106 1107 1108
do
    echo "including $f"
    . $f
done
unset f
Kenny Root's avatar
Kenny Root committed
1109 1110

addcompletions