envsetup.sh 40.8 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
- lunch:   lunch <product_name>-<build_variant>
5
- tapas:   tapas [<App1> <App2> ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user]
6 7
- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
Ying Wang's avatar
Ying Wang committed
8 9
- mm:      Builds all of the modules in the current directory, but not their dependencies.
- 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.
Ying Wang's avatar
Ying Wang committed
11 12
- mma:     Builds all of the modules in the current directory, and their dependencies.
- mmma:    Builds all of the modules in the supplied directories, and their dependencies.
13
- cgrep:   Greps on all local C/C++ files.
Jon Boekenoogen's avatar
ggrep  
Jon Boekenoogen committed
14
- ggrep:   Greps on all local Gradle files.
15 16
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
17 18
- mangrep: Greps on all local AndroidManifest.xml files.
- sepgrep: Greps on all local sepolicy files.
19
- sgrep:   Greps on all local source files.
20
- godir:   Go to the directory containing a file.
21

Dan Albert's avatar
Dan Albert committed
22 23 24 25 26
Environemnt options:
- SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that
                 ASAN_OPTIONS=detect_leaks=0 will be set by default until the
                 build is leak-check clean.

27 28 29 30 31
Look at the source to view more functions. The complete list is:
EOF
    T=$(gettop)
    local A
    A=""
32
    for i in `cat $T/build/envsetup.sh | sed -n "/^[ \t]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do
33 34 35 36 37 38 39 40 41 42 43 44 45
      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
46
    (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
47
      command make --no-print-directory -f build/core/config.mk dumpvar-abs-$1)
48 49 50 51 52 53 54 55 56 57
}

# 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
58
    (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
59
      command make --no-print-directory -f build/core/config.mk dumpvar-$1)
60 61 62 63 64 65 66 67 68 69
}

# 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
70 71 72
        TARGET_PRODUCT=$1 \
        TARGET_BUILD_VARIANT= \
        TARGET_BUILD_TYPE= \
Joe Onorato's avatar
Joe Onorato committed
73
        TARGET_BUILD_APPS= \
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
        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
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
}

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.                                #
    #                                                                #
    ##################################################################

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

115
    # out with the old
116
    if [ -n "$ANDROID_BUILD_PATHS" ] ; then
117 118
        export PATH=${PATH/$ANDROID_BUILD_PATHS/}
    fi
119
    if [ -n "$ANDROID_PRE_BUILD_PATHS" ] ; then
120
        export PATH=${PATH/$ANDROID_PRE_BUILD_PATHS/}
121 122
        # strip leading ':', if any
        export PATH=${PATH/:%/}
123
    fi
124 125 126

    # and in with the new
    prebuiltdir=$(getprebuilt)
127
    gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS)
128

129 130
    # defined in core/config.mk
    targetgccversion=$(get_build_var TARGET_GCC_VERSION)
131
    targetgccversion2=$(get_build_var 2ND_TARGET_GCC_VERSION)
132
    export TARGET_GCC_VERSION=$targetgccversion
133

134
    # The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it.
135 136
    export ANDROID_TOOLCHAIN=
    export ANDROID_TOOLCHAIN_2ND_ARCH=
137 138
    local ARCH=$(get_build_var TARGET_ARCH)
    case $ARCH in
139
        x86) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin
Mark D Horn's avatar
Mark D Horn committed
140
            ;;
Pavel Chupin's avatar
Pavel Chupin committed
141 142
        x86_64) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin
            ;;
143
        arm) toolchaindir=arm/arm-linux-androideabi-$targetgccversion/bin
144
            ;;
145
        arm64) toolchaindir=aarch64/aarch64-linux-android-$targetgccversion/bin;
146
               toolchaindir2=arm/arm-linux-androideabi-$targetgccversion2/bin
147
            ;;
148
        mips|mips64) toolchaindir=mips/mips64el-linux-android-$targetgccversion/bin
Serban Constantinescu's avatar
Serban Constantinescu committed
149
            ;;
150 151 152
        *)
            echo "Can't find toolchain for unknown architecture: $ARCH"
            toolchaindir=xxxxxxxxx
Mark D Horn's avatar
Mark D Horn committed
153 154
            ;;
    esac
155
    if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
156
        export ANDROID_TOOLCHAIN=$gccprebuiltdir/$toolchaindir
157
    fi
158

159 160 161 162 163
    if [ -d "$gccprebuiltdir/$toolchaindir2" ]; then
        export ANDROID_TOOLCHAIN_2ND_ARCH=$gccprebuiltdir/$toolchaindir2
    fi

    unset ANDROID_KERNEL_TOOLCHAIN_PATH
Ying Wang's avatar
Ying Wang committed
164
    case $ARCH in
Bruce Beare's avatar
Bruce Beare committed
165
        arm)
166
            # Legacy toolchain configuration used for ARM kernel compilation
167
            toolchaindir=arm/arm-eabi-$targetgccversion/bin
Bruce Beare's avatar
Bruce Beare committed
168
            if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
169 170
                 export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir"
                 ANDROID_KERNEL_TOOLCHAIN_PATH="$ARM_EABI_TOOLCHAIN":
Bruce Beare's avatar
Bruce Beare committed
171
            fi
Ying Wang's avatar
Ying Wang committed
172 173
            ;;
        *)
Bruce Beare's avatar
Bruce Beare committed
174
            # No need to set ARM_EABI_TOOLCHAIN for other ARCHs
Ying Wang's avatar
Ying Wang committed
175 176 177
            ;;
    esac

178
    export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools:$T/external/selinux/prebuilts/bin
179
    export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_TOOLCHAIN:$ANDROID_TOOLCHAIN_2ND_ARCH:$ANDROID_KERNEL_TOOLCHAIN_PATH$ANDROID_DEV_SCRIPTS:
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194

    # If prebuilts/android-emulator/<system>/ exists, prepend it to our PATH
    # to ensure that the corresponding 'emulator' binaries are used.
    case $(uname -s) in
        Darwin)
            ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/darwin-x86_64
            ;;
        Linux)
            ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/linux-x86_64
            ;;
        *)
            ANDROID_EMULATOR_PREBUILTS=
            ;;
    esac
    if [ -n "$ANDROID_EMULATOR_PREBUILTS" -a -d "$ANDROID_EMULATOR_PREBUILTS" ]; then
195
        ANDROID_BUILD_PATHS=$ANDROID_BUILD_PATHS$ANDROID_EMULATOR_PREBUILTS:
196 197 198
        export ANDROID_EMULATOR_PREBUILTS
    fi

199
    export PATH=$ANDROID_BUILD_PATHS$PATH
200

201
    unset ANDROID_JAVA_TOOLCHAIN
202
    unset ANDROID_PRE_BUILD_PATHS
203 204
    if [ -n "$JAVA_HOME" ]; then
        export ANDROID_JAVA_TOOLCHAIN=$JAVA_HOME/bin
205 206
        export ANDROID_PRE_BUILD_PATHS=$ANDROID_JAVA_TOOLCHAIN:
        export PATH=$ANDROID_PRE_BUILD_PATHS$PATH
207 208
    fi

209
    unset ANDROID_PRODUCT_OUT
210 211 212
    export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT)
    export OUT=$ANDROID_PRODUCT_OUT

213 214 215
    unset ANDROID_HOST_OUT
    export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT)

216
    # needed for building linux on MacOS
217 218 219 220 221 222
    # TODO: fix the path
    #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include
}

function printconfig()
{
223 224 225 226 227 228
    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
229 230 231 232
}

function set_stuff_for_environment()
{
233
    settitle
234
    set_java_home
235 236
    setpaths
    set_sequence_number
237

238
    export ANDROID_BUILD_TOP=$(gettop)
Ben Cheng's avatar
Ben Cheng committed
239 240
    # With this environment variable new GCC can apply colors to warnings/errors
    export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
Dan Albert's avatar
Dan Albert committed
241
    export ASAN_OPTIONS=detect_leaks=0
242 243 244 245
}

function set_sequence_number()
{
246
    export BUILD_ENV_SEQUENCE_NUMBER=10
247 248 249 250
}

function settitle()
{
251
    if [ "$STAY_OFF_MY_LAWN" = "" ]; then
252
        local arch=$(gettargetarch)
Joe Onorato's avatar
Joe Onorato committed
253 254 255 256
        local product=$TARGET_PRODUCT
        local variant=$TARGET_BUILD_VARIANT
        local apps=$TARGET_BUILD_APPS
        if [ -z "$apps" ]; then
257
            export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""
Joe Onorato's avatar
Joe Onorato committed
258
        else
259
            export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\""
Joe Onorato's avatar
Joe Onorato committed
260
        fi
261
    fi
262 263
}

Kenny Root's avatar
Kenny Root committed
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
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
280
        for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do
Kenny Root's avatar
Kenny Root committed
281 282 283 284 285 286
            echo "including $f"
            . $f
        done
    fi
}

287 288 289 290 291 292 293
function choosetype()
{
    echo "Build type choices are:"
    echo "     1. release"
    echo "     2. debug"
    echo

294
    local DEFAULT_NUM DEFAULT_VALUE
295 296
    DEFAULT_NUM=1
    DEFAULT_VALUE=release
297

298 299
    export TARGET_BUILD_TYPE=
    local ANSWER
300 301 302
    while [ -z $TARGET_BUILD_TYPE ]
    do
        echo -n "Which would you like? ["$DEFAULT_NUM"] "
303 304 305 306 307 308
        if [ -z "$1" ] ; then
            read ANSWER
        else
            echo $1
            ANSWER=$1
        fi
309 310 311 312 313 314 315
        case $ANSWER in
        "")
            export TARGET_BUILD_TYPE=$DEFAULT_VALUE
            ;;
        1)
            export TARGET_BUILD_TYPE=release
            ;;
316 317 318
        release)
            export TARGET_BUILD_TYPE=release
            ;;
319 320 321
        2)
            export TARGET_BUILD_TYPE=debug
            ;;
322 323 324
        debug)
            export TARGET_BUILD_TYPE=debug
            ;;
325 326 327 328 329 330
        *)
            echo
            echo "I didn't understand your response.  Please try again."
            echo
            ;;
        esac
331 332 333
        if [ -n "$1" ] ; then
            break
        fi
334 335 336 337 338
    done

    set_stuff_for_environment
}

339 340 341 342 343 344
#
# 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.
#
345 346 347 348 349
function chooseproduct()
{
    if [ "x$TARGET_PRODUCT" != x ] ; then
        default_value=$TARGET_PRODUCT
    else
350
        default_value=full
351 352
    fi

353 354
    export TARGET_PRODUCT=
    local ANSWER
355 356
    while [ -z "$TARGET_PRODUCT" ]
    do
357
        echo -n "Which product would you like? [$default_value] "
358 359 360 361 362 363 364
        if [ -z "$1" ] ; then
            read ANSWER
        else
            echo $1
            ANSWER=$1
        fi

365 366
        if [ -z "$ANSWER" ] ; then
            export TARGET_PRODUCT=$default_value
367 368 369 370 371 372 373 374 375 376
        else
            if check_product $ANSWER
            then
                export TARGET_PRODUCT=$ANSWER
            else
                echo "** Not a valid product: $ANSWER"
            fi
        fi
        if [ -n "$1" ] ; then
            break
377 378 379 380 381 382
        fi
    done

    set_stuff_for_environment
}

383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
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
414
                export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-1))]}
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
            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
}

430 431
function choosecombo()
{
432
    choosetype $1
433 434 435

    echo
    echo
436
    chooseproduct $2
437 438 439

    echo
    echo
440
    choosevariant $3
441

442 443
    echo
    set_stuff_for_environment
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
    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)
460 461
}

462
# add the default one here
463
add_lunch_combo aosp_arm-eng
Serban Constantinescu's avatar
Serban Constantinescu committed
464
add_lunch_combo aosp_arm64-eng
465
add_lunch_combo aosp_mips-eng
Chris Dearman's avatar
Chris Dearman committed
466
add_lunch_combo aosp_mips64-eng
Serban Constantinescu's avatar
Serban Constantinescu committed
467
add_lunch_combo aosp_x86-eng
Pavel Chupin's avatar
Pavel Chupin committed
468
add_lunch_combo aosp_x86_64-eng
469

470 471 472 473 474 475 476
function print_lunch_menu()
{
    local uname=$(uname)
    echo
    echo "You're building on" $uname
    echo
    echo "Lunch menu... pick a combo:"
477 478 479 480 481 482 483 484 485

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

486 487 488 489 490
    echo
}

function lunch()
{
491 492
    local answer

493
    if [ "$1" ] ; then
494
        answer=$1
495 496
    else
        print_lunch_menu
497
        echo -n "Which would you like? [aosp_arm-eng] "
498
        read answer
499 500
    fi

501 502 503 504
    local selection=

    if [ -z "$answer" ]
    then
505
        selection=aosp_arm-eng
506 507 508 509
    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
    then
        if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
        then
510
            selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
511 512
        fi
    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
513
    then
514
        selection=$answer
515 516
    fi

517 518 519 520 521 522 523
    if [ -z "$selection" ]
    then
        echo
        echo "Invalid lunch combo: $answer"
        return 1
    fi

Joe Onorato's avatar
Joe Onorato committed
524 525
    export TARGET_BUILD_APPS=

526 527 528
    local product=$(echo -n $selection | sed -e "s/-.*$//")
    check_product $product
    if [ $? -ne 0 ]
529
    then
530 531 532 533 534
        echo
        echo "** Don't have a product spec for: '$product'"
        echo "** Do you have the right repo manifest?"
        product=
    fi
535

536 537 538 539 540 541 542 543 544
    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
545

546 547 548 549 550
    if [ -z "$product" -o -z "$variant" ]
    then
        echo
        return 1
    fi
551

552 553 554
    export TARGET_PRODUCT=$product
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_BUILD_TYPE=release
555

556 557 558 559
    echo

    set_stuff_for_environment
    printconfig
560 561
}

Jeff Davidson's avatar
Jeff Davidson committed
562 563 564 565 566 567 568 569 570 571 572 573 574
# 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
575
# Configures the build to build unbundled apps.
576
# Run tapas with one or more app names (from LOCAL_PACKAGE_NAME)
Joe Onorato's avatar
Joe Onorato committed
577 578
function tapas()
{
579
    local arch="$(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips|armv5|arm64|x86_64|mips64)$' | xargs)"
580
    local variant="$(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$' | xargs)"
Jeff Hamilton's avatar
Jeff Hamilton committed
581 582
    local density="$(echo $* | xargs -n 1 echo | \grep -E '^(ldpi|mdpi|tvdpi|hdpi|xhdpi|xxhdpi|xxxhdpi|alldpi)$' | xargs)"
    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)"
Joe Onorato's avatar
Joe Onorato committed
583

584 585 586 587
    if [ $(echo $arch | wc -w) -gt 1 ]; then
        echo "tapas: Error: Multiple build archs supplied: $arch"
        return
    fi
Joe Onorato's avatar
Joe Onorato committed
588 589 590 591
    if [ $(echo $variant | wc -w) -gt 1 ]; then
        echo "tapas: Error: Multiple build variants supplied: $variant"
        return
    fi
Jeff Hamilton's avatar
Jeff Hamilton committed
592 593 594 595
    if [ $(echo $density | wc -w) -gt 1 ]; then
        echo "tapas: Error: Multiple densities supplied: $density"
        return
    fi
596 597 598

    local product=full
    case $arch in
599 600 601 602 603 604
      x86)    product=full_x86;;
      mips)   product=full_mips;;
      armv5)  product=generic_armv5;;
      arm64)  product=aosp_arm64;;
      x86_64) product=aosp_x86_64;;
      mips64)  product=aosp_mips64;;
605
    esac
Joe Onorato's avatar
Joe Onorato committed
606 607 608
    if [ -z "$variant" ]; then
        variant=eng
    fi
609 610 611
    if [ -z "$apps" ]; then
        apps=all
    fi
612 613 614
    if [ -z "$density" ]; then
        density=alldpi
    fi
Joe Onorato's avatar
Joe Onorato committed
615

616
    export TARGET_PRODUCT=$product
Joe Onorato's avatar
Joe Onorato committed
617
    export TARGET_BUILD_VARIANT=$variant
Jeff Hamilton's avatar
Jeff Hamilton committed
618
    export TARGET_BUILD_DENSITY=$density
Joe Onorato's avatar
Joe Onorato committed
619 620 621 622 623 624 625
    export TARGET_BUILD_TYPE=release
    export TARGET_BUILD_APPS=$apps

    set_stuff_for_environment
    printconfig
}

626 627
function gettop
{
628
    local TOPFILE=build/core/envsetup.mk
629
    if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
630 631
        # The following circumlocution ensures we remove symlinks from TOP.
        (cd $TOP; PWD= /bin/pwd)
632 633
    else
        if [ -f $TOPFILE ] ; then
634 635 636 637
            # 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
638
        else
639
            local HERE=$PWD
640 641
            T=
            while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
642
                \cd ..
synergy's avatar
synergy committed
643
                T=`PWD= /bin/pwd -P`
644
            done
645
            \cd $HERE
646 647 648 649 650 651 652
            if [ -f "$T/$TOPFILE" ]; then
                echo $T
            fi
        fi
    fi
}

653 654 655 656 657 658 659
# Return driver for "make", if any (eg. static analyzer)
function getdriver()
{
    local T="$1"
    test "$WITH_STATIC_ANALYZER" = "0" && unset WITH_STATIC_ANALYZER
    if [ -n "$WITH_STATIC_ANALYZER" ]; then
        echo "\
660 661
$T/prebuilts/misc/linux-x86/analyzer/tools/scan-build/scan-build \
--use-analyzer $T/prebuilts/misc/linux-x86/analyzer/bin/analyzer \
662 663 664 665 666
--status-bugs \
--top=$T"
    fi
}

667 668
function m()
{
669 670
    local T=$(gettop)
    local DRV=$(getdriver $T)
671
    if [ "$T" ]; then
672
        $DRV make -C $T -f build/core/main.mk $@
673 674
    else
        echo "Couldn't locate the top of the tree.  Try setting TOP."
675
        return 1
676 677 678 679 680 681
    fi
}

function findmakefile()
{
    TOPFILE=build/core/envsetup.mk
682
    local HERE=$PWD
683 684
    T=
    while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
685
        T=`PWD= /bin/pwd`
686 687
        if [ -f "$T/Android.mk" ]; then
            echo $T/Android.mk
688
            \cd $HERE
689 690
            return
        fi
691
        \cd ..
692
    done
693
    \cd $HERE
694 695 696 697
}

function mm()
{
698 699
    local T=$(gettop)
    local DRV=$(getdriver $T)
700 701 702
    # 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
703
        $DRV make $@
704 705
    else
        # Find the closest Android.mk file.
706
        local M=$(findmakefile)
Ying Wang's avatar
Ying Wang committed
707 708 709
        local MODULES=
        local GET_INSTALL_PATH=
        local ARGS=
710 711
        # Remove the path to top as the makefilepath needs to be relative
        local M=`echo $M|sed 's:'$T'/::'`
712 713
        if [ ! "$T" ]; then
            echo "Couldn't locate the top of the tree.  Try setting TOP."
714
            return 1
715 716
        elif [ ! "$M" ]; then
            echo "Couldn't locate a makefile from the current directory."
717
            return 1
718
        else
Ying Wang's avatar
Ying Wang committed
719 720 721 722 723 724 725 726 727 728 729 730
            for ARG in $@; do
                case $ARG in
                  GET-INSTALL-PATH) GET_INSTALL_PATH=$ARG;;
                esac
            done
            if [ -n "$GET_INSTALL_PATH" ]; then
              MODULES=
              ARGS=GET-INSTALL-PATH
            else
              MODULES=all_modules
              ARGS=$@
            fi
731
            ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES $ARGS
732 733 734 735 736 737
        fi
    fi
}

function mmm()
{
738 739
    local T=$(gettop)
    local DRV=$(getdriver $T)
740
    if [ "$T" ]; then
741
        local MAKEFILE=
742
        local MODULES=
743 744
        local ARGS=
        local DIR TO_CHOP
Ying Wang's avatar
Ying Wang committed
745
        local GET_INSTALL_PATH=
746 747 748
        local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
        local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
        for DIR in $DIRS ; do
749 750 751 752 753
            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:/$::'`
754
            if [ -f $DIR/Android.mk ]; then
Ying Wang's avatar
Ying Wang committed
755 756 757 758
                local TO_CHOP=`(\cd -P -- $T && pwd -P) | wc -c | tr -d ' '`
                local TO_CHOP=`expr $TO_CHOP + 1`
                local START=`PWD= /bin/pwd`
                local MFILE=`echo $START | cut -c${TO_CHOP}-`
759 760 761 762 763 764 765
                if [ "$MFILE" = "" ] ; then
                    MFILE=$DIR/Android.mk
                else
                    MFILE=$MFILE/$DIR/Android.mk
                fi
                MAKEFILE="$MAKEFILE $MFILE"
            else
Ying Wang's avatar
Ying Wang committed
766
                case $DIR in
767
                  showcommands | snod | dist | incrementaljavac | *=*) ARGS="$ARGS $DIR";;
Ying Wang's avatar
Ying Wang committed
768 769 770
                  GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;;
                  *) echo "No Android.mk in $DIR."; return 1;;
                esac
771 772
            fi
        done
Ying Wang's avatar
Ying Wang committed
773 774 775 776
        if [ -n "$GET_INSTALL_PATH" ]; then
          ARGS=$GET_INSTALL_PATH
          MODULES=
        fi
777
        ONE_SHOT_MAKEFILE="$MAKEFILE" $DRV make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $ARGS
778 779
    else
        echo "Couldn't locate the top of the tree.  Try setting TOP."
780
        return 1
781 782 783
    fi
}

Ying Wang's avatar
Ying Wang committed
784 785
function mma()
{
786 787
  local T=$(gettop)
  local DRV=$(getdriver $T)
Ying Wang's avatar
Ying Wang committed
788
  if [ -f build/core/envsetup.mk -a -f Makefile ]; then
789
    $DRV make $@
Ying Wang's avatar
Ying Wang committed
790 791 792
  else
    if [ ! "$T" ]; then
      echo "Couldn't locate the top of the tree.  Try setting TOP."
793
      return 1
Ying Wang's avatar
Ying Wang committed
794 795
    fi
    local MY_PWD=`PWD= /bin/pwd|sed 's:'$T'/::'`
796
    $DRV make -C $T -f build/core/main.mk $@ all_modules BUILD_MODULES_IN_PATHS="$MY_PWD"
Ying Wang's avatar
Ying Wang committed
797 798 799 800 801
  fi
}

function mmma()
{
802 803
  local T=$(gettop)
  local DRV=$(getdriver $T)
Ying Wang's avatar
Ying Wang committed
804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
  if [ "$T" ]; then
    local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
    local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
    local MY_PWD=`PWD= /bin/pwd`
    if [ "$MY_PWD" = "$T" ]; then
      MY_PWD=
    else
      MY_PWD=`echo $MY_PWD|sed 's:'$T'/::'`
    fi
    local DIR=
    local MODULE_PATHS=
    local ARGS=
    for DIR in $DIRS ; do
      if [ -d $DIR ]; then
        if [ "$MY_PWD" = "" ]; then
          MODULE_PATHS="$MODULE_PATHS $DIR"
        else
          MODULE_PATHS="$MODULE_PATHS $MY_PWD/$DIR"
        fi
      else
        case $DIR in
825
          showcommands | snod | dist | incrementaljavac | *=*) ARGS="$ARGS $DIR";;
Ying Wang's avatar
Ying Wang committed
826 827 828 829
          *) echo "Couldn't find directory $DIR"; return 1;;
        esac
      fi
    done
830
    $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS all_modules BUILD_MODULES_IN_PATHS="$MODULE_PATHS"
Ying Wang's avatar
Ying Wang committed
831 832
  else
    echo "Couldn't locate the top of the tree.  Try setting TOP."
833
    return 1
Ying Wang's avatar
Ying Wang committed
834 835 836
  fi
}

837 838 839 840
function croot()
{
    T=$(gettop)
    if [ "$T" ]; then
841
        \cd $(gettop)
842 843 844 845 846
    else
        echo "Couldn't locate the top of the tree.  Try setting TOP."
    fi
}

847 848 849 850 851 852 853 854
function cproj()
{
    TOPFILE=build/core/envsetup.mk
    local HERE=$PWD
    T=
    while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
        T=$PWD
        if [ -f "$T/Android.mk" ]; then
855
            \cd $T
856 857
            return
        fi
858
        \cd ..
859
    done
860
    \cd $HERE
861 862 863
    echo "can't find Android.mk"
}

864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
# simplified version of ps; output in the form
# <pid> <procname>
function qpid() {
    local prepend=''
    local append=''
    if [ "$1" = "--exact" ]; then
        prepend=' '
        append='$'
        shift
    elif [ "$1" = "--help" -o "$1" = "-h" ]; then
		echo "usage: qpid [[--exact] <process name|pid>"
		return 255
	fi

    local EXE="$1"
    if [ "$EXE" ] ; then
880
		qpid | \grep "$prepend$EXE$append"
881 882 883 884 885 886 887
	else
		adb shell ps \
			| tr -d '\r' \
			| sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/'
	fi
}

888 889
function pid()
{
890 891 892 893 894 895 896 897 898 899 900
    local prepend=''
    local append=''
    if [ "$1" = "--exact" ]; then
        prepend=' '
        append='$'
        shift
    fi
    local EXE="$1"
    if [ "$EXE" ] ; then
        local PID=`adb shell ps \
            | tr -d '\r' \
901
            | \grep "$prepend$EXE$append" \
902 903 904 905 906 907
            | sed -e 's/^[^ ]* *\([0-9]*\).*$/\1/'`
        echo "$PID"
    else
        echo "usage: pid [--exact] <process name>"
		return 255
    fi
908 909
}

910
# coredump_setup - enable core dumps globally for any process
911 912
#                  that has the core-file-size limit set correctly
#
913
# NOTE: You must call also coredump_enable for a specific process
914 915 916
#       if its core-file-size limit is not set already.
# NOTE: Core dumps are written to ramdisk; they will not survive a reboot!

917
function coredump_setup()
918 919 920 921 922 923 924 925 926 927
{
	echo "Getting root...";
	adb root;
	adb wait-for-device;

	echo "Remounting root parition read-write...";
	adb shell mount -w -o remount -t rootfs rootfs;
	sleep 1;
	adb wait-for-device;
	adb shell mkdir -p /cores;
Nick Kralevich's avatar
Nick Kralevich committed
928
	adb shell mount -t tmpfs tmpfs /cores;
929 930 931 932 933 934 935 936 937 938 939
	adb shell chmod 0777 /cores;

	echo "Granting SELinux permission to dump in /cores...";
	adb shell restorecon -R /cores;

	echo "Set core pattern.";
	adb shell 'echo /cores/core.%p > /proc/sys/kernel/core_pattern';

	echo "Done."
}

940
# coredump_enable - enable core dumps for the specified process
941 942
# $1 = PID of process (e.g., $(pid mediaserver))
#
943
# NOTE: coredump_setup must have been called as well for a core
944 945
#       dump to actually be generated.

946
function coredump_enable()
947 948 949 950 951 952 953 954 955 956 957 958 959
{
	local PID=$1;
	if [ -z "$PID" ]; then
		printf "Expecting a PID!\n";
		return;
	fi;
	echo "Setting core limit for $PID to infinite...";
	adb shell prlimit $PID 4 -1 -1
}

# core - send SIGV and pull the core for process
# $1 = PID of process (e.g., $(pid mediaserver))
#
960
# NOTE: coredump_setup must be called once per boot for core dumps to be
961 962 963 964 965 966 967 968 969 970 971 972 973 974 975
#       enabled globally.

function core()
{
	local PID=$1;

	if [ -z "$PID" ]; then
		printf "Expecting a PID!\n";
		return;
	fi;

	local CORENAME=core.$PID;
	local COREPATH=/cores/$CORENAME;
	local SIG=SEGV;

976
	coredump_enable $1;
977 978 979 980 981 982 983 984 985 986 987 988

	local done=0;
	while [ $(adb shell "[ -d /proc/$PID ] && echo -n yes") ]; do
		printf "\tSending SIG%s to %d...\n" $SIG $PID;
		adb shell kill -$SIG $PID;
		sleep 1;
	done;

	adb shell "while [ ! -f $COREPATH ] ; do echo waiting for $COREPATH to be generated; sleep 1; done"
	echo "Done: core is under $COREPATH on device.";
}

989 990 991 992
# systemstack - dump the current stack trace of all threads in the system process
# to the usual ANR traces file
function systemstack()
{
993 994 995 996 997 998 999 1000
    stacks system_server
}

function stacks()
{
    if [[ $1 =~ ^[0-9]+$ ]] ; then
        local PID="$1"
    elif [ "$1" ] ; then
1001 1002 1003 1004 1005 1006 1007 1008
        local PIDLIST="$(pid $1)"
        if [[ $PIDLIST =~ ^[0-9]+$ ]] ; then
            local PID="$PIDLIST"
        elif [ "$PIDLIST" ] ; then
            echo "more than one process: $1"
        else
            echo "no such process: $1"
        fi
1009 1010 1011 1012 1013
    else
        echo "usage: stacks [pid|process name]"
    fi

    if [ "$PID" ] ; then
1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037
        # Determine whether the process is native
        if adb shell ls -l /proc/$PID/exe | grep -q /system/bin/app_process ; then
            # Dump stacks of Dalvik process
            local TRACES=/data/anr/traces.txt
            local ORIG=/data/anr/traces.orig
            local TMP=/data/anr/traces.tmp

            # Keep original traces to avoid clobbering
            adb shell mv $TRACES $ORIG

            # Make sure we have a usable file
            adb shell touch $TRACES
            adb shell chmod 666 $TRACES

            # Dump stacks and wait for dump to finish
            adb shell kill -3 $PID
            adb shell notify $TRACES >/dev/null

            # Restore original stacks, and show current output
            adb shell mv $TRACES $TMP
            adb shell mv $ORIG $TRACES
            adb shell cat $TMP
        else
            # Dump stacks of native process
1038 1039
            local USE64BIT="$(is64bit $PID)"
            adb shell debuggerd$USE64BIT -b $PID
1040
        fi
1041
    fi
1042 1043
}

1044 1045
# Read the ELF header from /proc/$PID/exe to determine if the process is
# 64-bit.
1046 1047 1048 1049
function is64bit()
{
    local PID="$1"
    if [ "$PID" ] ; then
1050
        if [[ "$(adb shell cat /proc/$PID/exe | xxd -l 1 -s 4 -ps)" -eq "02" ]] ; then
1051 1052 1053 1054 1055 1056 1057
            echo "64"
        else
            echo ""
        fi
    else
        echo ""
    fi
John Michelau's avatar
John Michelau committed
1058 1059
}

1060 1061 1062 1063
case `uname -s` in
    Darwin)
        function sgrep()
        {
1064
            find -E . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl)' -print0 | xargs -0 grep --color -n "$@"
1065 1066 1067 1068 1069 1070
        }

        ;;
    *)
        function sgrep()
        {
1071
            find . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\)' -print0 | xargs -0 grep --color -n "$@"
1072 1073 1074 1075
        }
        ;;
esac

1076 1077 1078 1079 1080
function gettargetarch
{
    get_build_var TARGET_ARCH
}

Jon Boekenoogen's avatar
ggrep  
Jon Boekenoogen committed
1081 1082 1083 1084 1085
function ggrep()
{
    find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.gradle" -print0 | xargs -0 grep --color -n "$@"
}

1086 1087
function jgrep()
{
1088
    find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@"
1089 1090 1091 1092
}

function cgrep()
{
1093
    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' \) -print0 | xargs -0 grep --color -n "$@"
1094 1095 1096 1097
}

function resgrep()
{
1098
    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;
1099 1100
}

1101 1102 1103 1104 1105
function mangrep()
{
    find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' -print0 | xargs -0 grep --color -n "$@"
}

1106 1107 1108 1109 1110
function sepgrep()
{
    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 "$@"
}

1111 1112 1113 1114 1115
function rcgrep()
{
    find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.rc*" -print0 | xargs -0 grep --color -n "$@"
}

1116 1117 1118 1119
case `uname -s` in
    Darwin)
        function mgrep()
        {
1120
            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 "$@"
1121 1122 1123 1124
        }

        function treegrep()
        {
1125
            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 "$@"
1126 1127 1128 1129 1130 1131
        }

        ;;
    *)
        function mgrep()
        {
1132
            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 "$@"
1133 1134 1135 1136
        }

        function treegrep()
        {
1137
            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 "$@"
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154
        }

        ;;
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
1155
    local prebuiltdir=$(getprebuilt)
1156 1157
    local arch=$(gettargetarch)
    local KERNEL=$T/prebuilts/qemu-kernel/$arch/vmlinux-qemu
1158

1159
    local TRACE=$1
1160 1161 1162 1163 1164
    if [ ! "$TRACE" ] ; then
        echo "usage:  tracedmdump  tracename"
        return
    fi

1165 1166 1167 1168 1169
    if [ ! -r "$KERNEL" ] ; then
        echo "Error: cannot find kernel: '$KERNEL'"
        return
    fi

1170
    local BASETRACE=$(basename $TRACE)
1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194
    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"
}

1195 1196
# communicate with a running device or emulator, set up necessary state,
# and run the hat command.
1197 1198
function runhat()
{
1199 1200
    # process standard adb options
    local adbTarget=""
1201
    if [ "$1" = "-d" -o "$1" = "-e" ]; then
1202 1203
        adbTarget=$1
        shift 1
1204
    elif [ "$1" = "-s" ]; then
1205 1206 1207 1208
        adbTarget="$1 $2"
        shift 2
    fi
    local adbOptions=${adbTarget}
1209
    #echo adbOptions = ${adbOptions}
1210 1211 1212

    # runhat options
    local targetPid=$1
1213 1214

    if [ "$targetPid" = "" ]; then
1215
        echo "Usage: runhat [ -d | -e | -s serial ] target-pid"
1216 1217 1218
        return
    fi

1219 1220 1221 1222 1223 1224
    # confirm hat is available
    if [ -z $(which hat) ]; then
        echo "hat is not available in this configuration."
        return
    fi

1225
    # issue "am" command to cause the hprof dump
Nick Kralevich's avatar
Nick Kralevich committed
1226
    local devFile=/data/local/tmp/hprof-$targetPid
1227
    echo "Poking $targetPid and waiting for data..."
1228
    echo "Storing data at $devFile"
1229
    adb ${adbOptions} shell am dumpheap $targetPid $devFile
1230
    echo "Press enter when logcat shows \"hprof: heap dump completed\""
1231 1232 1233
    echo -n "> "
    read

1234
    local localFile=/tmp/$$-hprof
1235

1236 1237
    echo "Retrieving file $devFile..."
    adb ${adbOptions} pull $devFile $localFile
1238

1239
    adb ${adbOptions} shell rm $devFile
1240

1241
    echo "Running hat on $localFile"
1242 1243
    echo "View the output by pointing your browser at http://localhost:7000/"
    echo ""
Dianne Hackborn's avatar
Dianne Hackborn committed
1244
    hat -JXmx512m $localFile
1245 1246 1247 1248
}

function getbugreports()
{
1249
    local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`)
1250 1251 1252 1253 1254 1255

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

1256 1257
    local report
    for report in ${reports[@]}
1258
    do
1259 1260 1261
        echo "/sdcard/bugreports/${report}"
        adb pull /sdcard/bugreports/${report} ${report}
        gunzip ${report}
1262 1263 1264
    done
}

1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286
function getsdcardpath()
{
    adb ${adbOptions} shell echo -n \$\{EXTERNAL_STORAGE\}
}

function getscreenshotpath()
{
    echo "$(getsdcardpath)/Pictures/Screenshots"
}

function getlastscreenshot()
{
    local screenshot_path=$(getscreenshotpath)
    local screenshot=`adb ${adbOptions} ls ${screenshot_path} | grep Screenshot_[0-9-]*.*\.png | sort -rk 3 | cut -d " " -f 4 | head -n 1`
    if [ "$screenshot" = "" ]; then
        echo "No screenshots found."
        return
    fi
    echo "${screenshot}"
    adb ${adbOptions} pull ${screenshot_path}/${screenshot}
}

1287 1288
function startviewserver()
{
1289
    local port=4939
1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305
    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
}

1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
function key_home()
{
    adb shell input keyevent 3
}

function key_back()
{
    adb shell input keyevent 4
}

function key_menu()
{
    adb shell input keyevent 82
}

1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332
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

1333
    (\cd "$T" && mmm tests/SmokeTest) &&
1334 1335 1336 1337 1338 1339 1340
      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
}

1341 1342 1343 1344 1345 1346 1347 1348
# 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
1349
    ("$T"/development/testrunner/runtest.py $@)
1350 1351
}

1352 1353 1354 1355 1356
function godir () {
    if [[ -z "$1" ]]; then
        echo "Usage: godir <regex>"
        return
    fi
1357
    T=$(gettop)
1358 1359 1360 1361 1362 1363 1364
    if [ ! "$OUT_DIR" = "" ]; then
        mkdir -p $OUT_DIR
        FILELIST=$OUT_DIR/filelist
    else
        FILELIST=$T/filelist
    fi
    if [[ ! -f $FILELIST ]]; then
1365
        echo -n "Creating index..."
1366
        (\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > $FILELIST)
1367 1368 1369 1370
        echo " Done"
        echo ""
    fi
    local lines
1371
    lines=($(\grep "$1" $FILELIST | sed -e 's/\/[^/]*$//' | sort | uniq))
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383
    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
1384
                index=$(($index + 1))
1385 1386 1387 1388 1389 1390 1391 1392 1393
            done
            echo
            echo -n "Select one: "
            unset choice
            read choice
            if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then
                echo "Invalid choice"
                continue
            fi
1394
            pathname=${lines[$(($choice-1))]}
1395 1396 1397 1398
        done
    else
        pathname=${lines[0]}
    fi
1399
    \cd $T/$pathname
1400 1401
}

Neil Fuller's avatar
Neil Fuller committed
1402
# Force JAVA_HOME to point to java 1.7 if it isn't already set.
1403 1404 1405 1406
#
# Note that the MacOS path for java 1.7 includes a minor revision number (sigh).
# For some reason, installing the JDK doesn't make it show up in the
# JavaVM.framework/Versions/1.7/ folder.
1407
function set_java_home() {
1408
    # Clear the existing JAVA_HOME value if we set it ourselves, so that
Narayan Kamath's avatar
Narayan Kamath committed
1409 1410
    # we can reset it later, depending on the version of java the build
    # system needs.
1411 1412 1413 1414 1415 1416 1417
    #
    # If we don't do this, the JAVA_HOME value set by the first call to
    # build/envsetup.sh will persist forever.
    if [ -n "$ANDROID_SET_JAVA_HOME" ]; then
      export JAVA_HOME=""
    fi

1418
    if [ ! "$JAVA_HOME" ]; then
Neil Fuller's avatar
Neil Fuller committed
1419 1420 1421 1422 1423 1424 1425 1426
      case `uname -s` in
          Darwin)
              export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
              ;;
          *)
              export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
              ;;
      esac
1427 1428 1429 1430

      # Keep track of the fact that we set JAVA_HOME ourselves, so that
      # we can change it on the next envsetup.sh, if required.
      export ANDROID_SET_JAVA_HOME=true
1431
    fi
1432
}
1433

1434 1435
# Print colored exit condition
function pez {
1436 1437 1438 1439 1440 1441 1442 1443 1444
    "$@"
    local retval=$?
    if [ $retval -ne 0 ]
    then
        echo -e "\e[0;31mFAILURE\e[00m"
    else
        echo -e "\e[0;32mSUCCESS\e[00m"
    fi
    return $retval
1445 1446
}

1447 1448 1449 1450 1451
function get_make_command()
{
  echo command make
}

1452 1453 1454
function make()
{
    local start_time=$(date +"%s")
1455
    $(get_make_command) "$@"
1456 1457 1458 1459 1460 1461
    local ret=$?
    local end_time=$(date +"%s")
    local tdiff=$(($end_time-$start_time))
    local hours=$(($tdiff / 3600 ))
    local mins=$((($tdiff % 3600) / 60))
    local secs=$(($tdiff % 60))
1462 1463 1464 1465 1466 1467 1468 1469 1470 1471
    local ncolors=$(tput colors 2>/dev/null)
    if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then
        color_failed="\e[0;31m"
        color_success="\e[0;32m"
        color_reset="\e[00m"
    else
        color_failed=""
        color_success=""
        color_reset=""
    fi
1472 1473
    echo
    if [ $ret -eq 0 ] ; then
1474
        echo -n -e "${color_success}#### make completed successfully "
1475
    else
1476
        echo -n -e "${color_failed}#### make failed to build some targets "
1477 1478 1479 1480 1481 1482 1483 1484
    fi
    if [ $hours -gt 0 ] ; then
        printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs
    elif [ $mins -gt 0 ] ; then
        printf "(%02g:%02g (mm:ss))" $mins $secs
    elif [ $secs -gt 0 ] ; then
        printf "(%s seconds)" $secs
    fi
1485
    echo -e " ####${color_reset}"
1486 1487 1488 1489
    echo
    return $ret
}

1490 1491 1492 1493 1494 1495 1496 1497 1498
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
1499 1500

# Execute the contents of any vendorsetup.sh files we can find.
1501 1502
for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
         `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
1503 1504 1505 1506 1507
do
    echo "including $f"
    . $f
done
unset f
Kenny Root's avatar
Kenny Root committed
1508 1509

addcompletions