| The Android Open Source Project | 88b6079 | 2009-03-03 19:28:42 -0800 | [diff] [blame] | 1 | function help() { | 
 | 2 | cat <<EOF | 
 | 3 | Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment: | 
 | 4 | - croot:   Changes directory to the top of the tree. | 
 | 5 | - m:       Makes from the top of the tree. | 
 | 6 | - mm:      Builds all of the modules in the current directory. | 
 | 7 | - mmm:     Builds all of the modules in the supplied directories. | 
 | 8 | - cgrep:   Greps on all local C/C++ files. | 
 | 9 | - jgrep:   Greps on all local Java files. | 
 | 10 | - resgrep: Greps on all local res/*.xml files. | 
 | 11 | - godir:   Go to the directory containing a file. | 
 | 12 |  | 
 | 13 | Look at the source to view more functions. The complete list is: | 
 | 14 | EOF | 
 | 15 |     T=$(gettop) | 
 | 16 |     local A | 
 | 17 |     A="" | 
 | 18 |     for i in `cat $T/build/envsetup.sh | sed -n "/^function /s/function \([a-z_]*\).*/\1/p" | sort`; do | 
 | 19 |       A="$A $i" | 
 | 20 |     done | 
 | 21 |     echo $A | 
 | 22 | } | 
 | 23 |  | 
 | 24 | # Get the value of a build variable as an absolute path. | 
 | 25 | function get_abs_build_var() | 
 | 26 | { | 
 | 27 |     T=$(gettop) | 
 | 28 |     if [ ! "$T" ]; then | 
 | 29 |         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2 | 
 | 30 |         return | 
 | 31 |     fi | 
 | 32 |     CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ | 
 | 33 |       make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-abs-$1 | 
 | 34 | } | 
 | 35 |  | 
 | 36 | # Get the exact value of a build variable. | 
 | 37 | function get_build_var() | 
 | 38 | { | 
 | 39 |     T=$(gettop) | 
 | 40 |     if [ ! "$T" ]; then | 
 | 41 |         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2 | 
 | 42 |         return | 
 | 43 |     fi | 
 | 44 |     CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ | 
 | 45 |       make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1 | 
 | 46 | } | 
 | 47 |  | 
 | 48 | # check to see if the supplied product is one we can build | 
 | 49 | function check_product() | 
 | 50 | { | 
 | 51 |     T=$(gettop) | 
 | 52 |     if [ ! "$T" ]; then | 
 | 53 |         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2 | 
 | 54 |         return | 
 | 55 |     fi | 
 | 56 |     CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ | 
 | 57 |         TARGET_PRODUCT=$1 TARGET_BUILD_VARIANT= \ | 
 | 58 |         TARGET_SIMULATOR= TARGET_BUILD_TYPE= \ | 
 | 59 |         get_build_var TARGET_DEVICE > /dev/null | 
 | 60 |     # hide successful answers, but allow the errors to show | 
 | 61 | } | 
 | 62 |  | 
 | 63 | VARIANT_CHOICES=(user userdebug eng) | 
 | 64 |  | 
 | 65 | # check to see if the supplied variant is valid | 
 | 66 | function check_variant() | 
 | 67 | { | 
 | 68 |     for v in ${VARIANT_CHOICES[@]} | 
 | 69 |     do | 
 | 70 |         if [ "$v" = "$1" ] | 
 | 71 |         then | 
 | 72 |             return 0 | 
 | 73 |         fi | 
 | 74 |     done | 
 | 75 |     return 1 | 
 | 76 | } | 
 | 77 |  | 
 | 78 | function setpaths() | 
 | 79 | { | 
 | 80 |     T=$(gettop) | 
 | 81 |     if [ ! "$T" ]; then | 
 | 82 |         echo "Couldn't locate the top of the tree.  Try setting TOP." | 
 | 83 |         return | 
 | 84 |     fi | 
 | 85 |  | 
 | 86 |     ################################################################## | 
 | 87 |     #                                                                # | 
 | 88 |     #              Read me before you modify this code               # | 
 | 89 |     #                                                                # | 
 | 90 |     #   This function sets ANDROID_BUILD_PATHS to what it is adding  # | 
 | 91 |     #   to PATH, and the next time it is run, it removes that from   # | 
 | 92 |     #   PATH.  This is required so lunch can be run more than once   # | 
 | 93 |     #   and still have working paths.                                # | 
 | 94 |     #                                                                # | 
 | 95 |     ################################################################## | 
 | 96 |  | 
 | 97 |     # out with the old | 
 | 98 |     if [ -n $ANDROID_BUILD_PATHS ] ; then | 
 | 99 |         export PATH=${PATH/$ANDROID_BUILD_PATHS/} | 
 | 100 |     fi | 
 | 101 |  | 
 | 102 |     # and in with the new | 
 | 103 |     CODE_REVIEWS= | 
 | 104 |     prebuiltdir=$(getprebuilt) | 
 | 105 |     export ANDROID_EABI_TOOLCHAIN=$prebuiltdir/toolchain/arm-eabi-4.2.1/bin | 
 | 106 |     export ANDROID_TOOLCHAIN=$ANDROID_EABI_TOOLCHAIN | 
 | 107 |     export ANDROID_QTOOLS=$T/development/emulator/qtools | 
 | 108 |     export ANDROID_BUILD_PATHS=:$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_QTOOLS:$ANDROID_TOOLCHAIN:$ANDROID_EABI_TOOLCHAIN$CODE_REVIEWS | 
 | 109 |     export PATH=$PATH$ANDROID_BUILD_PATHS | 
 | 110 |  | 
 | 111 |     unset ANDROID_PRODUCT_OUT | 
 | 112 |     export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT) | 
 | 113 |     export OUT=$ANDROID_PRODUCT_OUT | 
 | 114 |  | 
 | 115 |     # needed for building linux on MacOS | 
 | 116 |     # TODO: fix the path | 
 | 117 |     #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include | 
 | 118 |  | 
 | 119 |     # needed for OProfile to post-process collected samples | 
 | 120 |     export OPROFILE_EVENTS_DIR=$prebuiltdir/oprofile | 
 | 121 | } | 
 | 122 |  | 
 | 123 | function printconfig() | 
 | 124 | { | 
 | 125 |     T=$(gettop) | 
 | 126 |     if [ ! "$T" ]; then | 
 | 127 |         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2 | 
 | 128 |         return | 
 | 129 |     fi | 
 | 130 |     get_build_var report_config | 
 | 131 | } | 
 | 132 |  | 
 | 133 | function set_stuff_for_environment() | 
 | 134 | { | 
 | 135 |     settitle | 
 | 136 |     setpaths | 
 | 137 |     set_sequence_number | 
 | 138 |  | 
 | 139 |     # Don't try to do preoptimization until it works better on OSX. | 
 | 140 |     export DISABLE_DEXPREOPT=true | 
 | 141 |  | 
 | 142 |     export ANDROID_BUILD_TOP=$(gettop) | 
 | 143 | } | 
 | 144 |  | 
 | 145 | function set_sequence_number() | 
 | 146 | { | 
 | 147 |     export BUILD_ENV_SEQUENCE_NUMBER=9 | 
 | 148 | } | 
 | 149 |  | 
 | 150 | function settitle() | 
 | 151 | { | 
 | 152 |     if [ "$STAY_OFF_MY_LAWN" = "" ]; then | 
 | 153 |         local product=$(get_build_var TARGET_PRODUCT) | 
 | 154 |         local variant=$(get_build_var TARGET_BUILD_VARIANT) | 
 | 155 |         export PROMPT_COMMAND="echo -ne \"\033]0;[${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\"" | 
 | 156 |     fi | 
 | 157 | } | 
 | 158 |  | 
 | 159 | case `uname -s` in | 
 | 160 |     Linux) | 
 | 161 |         function choosesim() | 
 | 162 |         { | 
 | 163 |             echo "Build for the simulator or the device?" | 
 | 164 |             echo "     1. Device" | 
 | 165 |             echo "     2. Simulator" | 
 | 166 |             echo | 
 | 167 |  | 
 | 168 |             export TARGET_SIMULATOR= | 
 | 169 |             local ANSWER | 
 | 170 |             while [ -z $TARGET_SIMULATOR ] | 
 | 171 |             do | 
 | 172 |                 echo -n "Which would you like? [1] " | 
 | 173 |                 if [ -z "$1" ] ; then | 
 | 174 |                     read ANSWER | 
 | 175 |                 else | 
 | 176 |                     echo $1 | 
 | 177 |                     ANSWER=$1 | 
 | 178 |                 fi | 
 | 179 |                 case $ANSWER in | 
 | 180 |                 "") | 
 | 181 |                     export TARGET_SIMULATOR=false | 
 | 182 |                     ;; | 
 | 183 |                 1) | 
 | 184 |                     export TARGET_SIMULATOR=false | 
 | 185 |                     ;; | 
 | 186 |                 Device) | 
 | 187 |                     export TARGET_SIMULATOR=false | 
 | 188 |                     ;; | 
 | 189 |                 2) | 
 | 190 |                     export TARGET_SIMULATOR=true | 
 | 191 |                     ;; | 
 | 192 |                 Simulator) | 
 | 193 |                     export TARGET_SIMULATOR=true | 
 | 194 |                     ;; | 
 | 195 |                 *) | 
 | 196 |                     echo | 
 | 197 |                     echo "I didn't understand your response.  Please try again." | 
 | 198 |                     echo | 
 | 199 |                     ;; | 
 | 200 |                 esac | 
 | 201 |                 if [ -n "$1" ] ; then | 
 | 202 |                     break | 
 | 203 |                 fi | 
 | 204 |             done | 
 | 205 |  | 
 | 206 |             set_stuff_for_environment | 
 | 207 |         } | 
 | 208 |         ;; | 
 | 209 |     *) | 
 | 210 |         function choosesim() | 
 | 211 |         { | 
 | 212 |             echo "Only device builds are supported for" `uname -s` | 
 | 213 |             echo "     Forcing TARGET_SIMULATOR=false" | 
 | 214 |             echo | 
 | 215 |             if [ -z "$1" ] | 
 | 216 |             then | 
 | 217 |                 echo -n "Press enter: " | 
 | 218 |                 read | 
 | 219 |             fi | 
 | 220 |  | 
 | 221 |             export TARGET_SIMULATOR=false | 
 | 222 |             set_stuff_for_environment | 
 | 223 |         } | 
 | 224 |         ;; | 
 | 225 | esac | 
 | 226 |  | 
 | 227 | function choosetype() | 
 | 228 | { | 
 | 229 |     echo "Build type choices are:" | 
 | 230 |     echo "     1. release" | 
 | 231 |     echo "     2. debug" | 
 | 232 |     echo | 
 | 233 |  | 
 | 234 |     local DEFAULT_NUM DEFAULT_VALUE | 
 | 235 |     if [ $TARGET_SIMULATOR = "false" ] ; then | 
 | 236 |         DEFAULT_NUM=1 | 
 | 237 |         DEFAULT_VALUE=release | 
 | 238 |     else | 
 | 239 |         DEFAULT_NUM=2 | 
 | 240 |         DEFAULT_VALUE=debug | 
 | 241 |     fi | 
 | 242 |  | 
 | 243 |     export TARGET_BUILD_TYPE= | 
 | 244 |     local ANSWER | 
 | 245 |     while [ -z $TARGET_BUILD_TYPE ] | 
 | 246 |     do | 
 | 247 |         echo -n "Which would you like? ["$DEFAULT_NUM"] " | 
 | 248 |         if [ -z "$1" ] ; then | 
 | 249 |             read ANSWER | 
 | 250 |         else | 
 | 251 |             echo $1 | 
 | 252 |             ANSWER=$1 | 
 | 253 |         fi | 
 | 254 |         case $ANSWER in | 
 | 255 |         "") | 
 | 256 |             export TARGET_BUILD_TYPE=$DEFAULT_VALUE | 
 | 257 |             ;; | 
 | 258 |         1) | 
 | 259 |             export TARGET_BUILD_TYPE=release | 
 | 260 |             ;; | 
 | 261 |         release) | 
 | 262 |             export TARGET_BUILD_TYPE=release | 
 | 263 |             ;; | 
 | 264 |         2) | 
 | 265 |             export TARGET_BUILD_TYPE=debug | 
 | 266 |             ;; | 
 | 267 |         debug) | 
 | 268 |             export TARGET_BUILD_TYPE=debug | 
 | 269 |             ;; | 
 | 270 |         *) | 
 | 271 |             echo | 
 | 272 |             echo "I didn't understand your response.  Please try again." | 
 | 273 |             echo | 
 | 274 |             ;; | 
 | 275 |         esac | 
 | 276 |         if [ -n "$1" ] ; then | 
 | 277 |             break | 
 | 278 |         fi | 
 | 279 |     done | 
 | 280 |  | 
 | 281 |     set_stuff_for_environment | 
 | 282 | } | 
 | 283 |  | 
 | 284 | # | 
 | 285 | # This function isn't really right:  It chooses a TARGET_PRODUCT | 
 | 286 | # based on the list of boards.  Usually, that gets you something | 
 | 287 | # that kinda works with a generic product, but really, you should | 
 | 288 | # pick a product by name. | 
 | 289 | # | 
 | 290 | function chooseproduct() | 
 | 291 | { | 
| The Android Open Source Project | 88b6079 | 2009-03-03 19:28:42 -0800 | [diff] [blame] | 292 |     if [ "x$TARGET_PRODUCT" != x ] ; then | 
 | 293 |         default_value=$TARGET_PRODUCT | 
 | 294 |     else | 
 | 295 |         if [ "$TARGET_SIMULATOR" = true ] ; then | 
 | 296 |             default_value=sim | 
 | 297 |         else | 
 | 298 |             default_value=generic | 
 | 299 |         fi | 
 | 300 |     fi | 
 | 301 |  | 
 | 302 |     export TARGET_PRODUCT= | 
 | 303 |     local ANSWER | 
 | 304 |     while [ -z "$TARGET_PRODUCT" ] | 
 | 305 |     do | 
| Joe Onorato | 8849aed | 2009-04-29 15:56:47 -0700 | [diff] [blame] | 306 |         echo -n "Which product would you like? [$default_value] " | 
| The Android Open Source Project | 88b6079 | 2009-03-03 19:28:42 -0800 | [diff] [blame] | 307 |         if [ -z "$1" ] ; then | 
 | 308 |             read ANSWER | 
 | 309 |         else | 
 | 310 |             echo $1 | 
 | 311 |             ANSWER=$1 | 
 | 312 |         fi | 
 | 313 |  | 
 | 314 |         if [ -z "$ANSWER" ] ; then | 
 | 315 |             export TARGET_PRODUCT=$default_value | 
| The Android Open Source Project | 88b6079 | 2009-03-03 19:28:42 -0800 | [diff] [blame] | 316 |         else | 
 | 317 |             if check_product $ANSWER | 
 | 318 |             then | 
 | 319 |                 export TARGET_PRODUCT=$ANSWER | 
 | 320 |             else | 
 | 321 |                 echo "** Not a valid product: $ANSWER" | 
 | 322 |             fi | 
 | 323 |         fi | 
 | 324 |         if [ -n "$1" ] ; then | 
 | 325 |             break | 
 | 326 |         fi | 
 | 327 |     done | 
 | 328 |  | 
 | 329 |     set_stuff_for_environment | 
 | 330 | } | 
 | 331 |  | 
 | 332 | function choosevariant() | 
 | 333 | { | 
 | 334 |     echo "Variant choices are:" | 
 | 335 |     local index=1 | 
 | 336 |     local v | 
 | 337 |     for v in ${VARIANT_CHOICES[@]} | 
 | 338 |     do | 
 | 339 |         # The product name is the name of the directory containing | 
 | 340 |         # the makefile we found, above. | 
 | 341 |         echo "     $index. $v" | 
 | 342 |         index=$(($index+1)) | 
 | 343 |     done | 
 | 344 |  | 
 | 345 |     local default_value=eng | 
 | 346 |     local ANSWER | 
 | 347 |  | 
 | 348 |     export TARGET_BUILD_VARIANT= | 
 | 349 |     while [ -z "$TARGET_BUILD_VARIANT" ] | 
 | 350 |     do | 
 | 351 |         echo -n "Which would you like? [$default_value] " | 
 | 352 |         if [ -z "$1" ] ; then | 
 | 353 |             read ANSWER | 
 | 354 |         else | 
 | 355 |             echo $1 | 
 | 356 |             ANSWER=$1 | 
 | 357 |         fi | 
 | 358 |  | 
 | 359 |         if [ -z "$ANSWER" ] ; then | 
 | 360 |             export TARGET_BUILD_VARIANT=$default_value | 
 | 361 |         elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then | 
 | 362 |             if [ "$ANSWER" -le "${#VARIANT_CHOICES[@]}" ] ; then | 
 | 363 |                 export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-$_arrayoffset))]} | 
 | 364 |             fi | 
 | 365 |         else | 
 | 366 |             if check_variant $ANSWER | 
 | 367 |             then | 
 | 368 |                 export TARGET_BUILD_VARIANT=$ANSWER | 
 | 369 |             else | 
 | 370 |                 echo "** Not a valid variant: $ANSWER" | 
 | 371 |             fi | 
 | 372 |         fi | 
 | 373 |         if [ -n "$1" ] ; then | 
 | 374 |             break | 
 | 375 |         fi | 
 | 376 |     done | 
 | 377 | } | 
 | 378 |  | 
 | 379 | function tapas() | 
 | 380 | { | 
 | 381 |     choosecombo | 
 | 382 | } | 
 | 383 |  | 
 | 384 | function choosecombo() | 
 | 385 | { | 
 | 386 |     choosesim $1 | 
 | 387 |  | 
 | 388 |     echo | 
 | 389 |     echo | 
 | 390 |     choosetype $2 | 
 | 391 |  | 
 | 392 |     echo | 
 | 393 |     echo | 
 | 394 |     chooseproduct $3 | 
 | 395 |  | 
 | 396 |     echo | 
 | 397 |     echo | 
 | 398 |     choosevariant $4 | 
 | 399 |  | 
 | 400 |     echo | 
 | 401 |     set_stuff_for_environment | 
 | 402 |     printconfig | 
 | 403 | } | 
 | 404 |  | 
 | 405 | # Clear this variable.  It will be built up again when the vendorsetup.sh | 
 | 406 | # files are included at the end of this file. | 
 | 407 | unset LUNCH_MENU_CHOICES | 
 | 408 | function add_lunch_combo() | 
 | 409 | { | 
 | 410 |     local new_combo=$1 | 
 | 411 |     local c | 
 | 412 |     for c in ${LUNCH_MENU_CHOICES[@]} ; do | 
 | 413 |         if [ "$new_combo" = "$c" ] ; then | 
 | 414 |             return | 
 | 415 |         fi | 
 | 416 |     done | 
 | 417 |     LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo) | 
 | 418 | } | 
 | 419 |  | 
 | 420 | # add the default one here | 
 | 421 | add_lunch_combo generic-eng | 
 | 422 |  | 
 | 423 | # if we're on linux, add the simulator.  There is a special case | 
 | 424 | # in lunch to deal with the simulator | 
 | 425 | if [ "$(uname)" = "Linux" ] ; then | 
 | 426 |     add_lunch_combo simulator | 
 | 427 | fi | 
 | 428 |  | 
 | 429 | function print_lunch_menu() | 
 | 430 | { | 
 | 431 |     local uname=$(uname) | 
 | 432 |     echo | 
 | 433 |     echo "You're building on" $uname | 
 | 434 |     echo | 
 | 435 |     echo ${LUNCH_MENU_CHOICES[@]} | 
 | 436 |     echo "Lunch menu... pick a combo:" | 
 | 437 |  | 
 | 438 |     local i=1 | 
 | 439 |     local choice | 
 | 440 |     for choice in ${LUNCH_MENU_CHOICES[@]} | 
 | 441 |     do | 
 | 442 |         echo "     $i. $choice" | 
 | 443 |         i=$(($i+1)) | 
 | 444 |     done | 
 | 445 |  | 
 | 446 |     echo | 
 | 447 | } | 
 | 448 |  | 
 | 449 | function lunch() | 
 | 450 | { | 
 | 451 |     local answer | 
 | 452 |  | 
 | 453 |     if [ "$1" ] ; then | 
 | 454 |         answer=$1 | 
 | 455 |     else | 
 | 456 |         print_lunch_menu | 
 | 457 |         echo -n "Which would you like? [generic-eng] " | 
 | 458 |         read answer | 
 | 459 |     fi | 
 | 460 |  | 
 | 461 |     local selection= | 
 | 462 |  | 
 | 463 |     if [ -z "$answer" ] | 
 | 464 |     then | 
 | 465 |         selection=generic-eng | 
 | 466 |     elif [ "$answer" = "simulator" ] | 
 | 467 |     then | 
 | 468 |         selection=simulator | 
 | 469 |     elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") | 
 | 470 |     then | 
 | 471 |         if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ] | 
 | 472 |         then | 
 | 473 |             selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]} | 
 | 474 |         fi | 
 | 475 |     elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") | 
 | 476 |     then | 
 | 477 |         selection=$answer | 
 | 478 |     fi | 
 | 479 |  | 
 | 480 |     if [ -z "$selection" ] | 
 | 481 |     then | 
 | 482 |         echo | 
 | 483 |         echo "Invalid lunch combo: $answer" | 
 | 484 |         return 1 | 
 | 485 |     fi | 
 | 486 |  | 
 | 487 |     # special case the simulator | 
 | 488 |     if [ "$selection" = "simulator" ] | 
 | 489 |     then | 
 | 490 |         export TARGET_PRODUCT=sim | 
 | 491 |         export TARGET_BUILD_VARIANT=eng | 
 | 492 |         export TARGET_SIMULATOR=true | 
 | 493 |         export TARGET_BUILD_TYPE=debug | 
 | 494 |     else | 
 | 495 |         local product=$(echo -n $selection | sed -e "s/-.*$//") | 
 | 496 |         check_product $product | 
 | 497 |         if [ $? -ne 0 ] | 
 | 498 |         then | 
 | 499 |             echo | 
 | 500 |             echo "** Don't have a product spec for: '$product'" | 
 | 501 |             echo "** Do you have the right repo manifest?" | 
 | 502 |             product= | 
 | 503 |         fi | 
 | 504 |  | 
 | 505 |         local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") | 
 | 506 |         check_variant $variant | 
 | 507 |         if [ $? -ne 0 ] | 
 | 508 |         then | 
 | 509 |             echo | 
 | 510 |             echo "** Invalid variant: '$variant'" | 
 | 511 |             echo "** Must be one of ${VARIANT_CHOICES[@]}" | 
 | 512 |             variant= | 
 | 513 |         fi | 
 | 514 |  | 
 | 515 |         if [ -z "$product" -o -z "$variant" ] | 
 | 516 |         then | 
 | 517 |             echo | 
 | 518 |             return 1 | 
 | 519 |         fi | 
 | 520 |  | 
 | 521 |         export TARGET_PRODUCT=$product | 
 | 522 |         export TARGET_BUILD_VARIANT=$variant | 
 | 523 |         export TARGET_SIMULATOR=false | 
 | 524 |         export TARGET_BUILD_TYPE=release | 
 | 525 |     fi # !simulator | 
 | 526 |  | 
 | 527 |     echo | 
 | 528 |  | 
 | 529 |     set_stuff_for_environment | 
 | 530 |     printconfig | 
 | 531 | } | 
 | 532 |  | 
 | 533 | function gettop | 
 | 534 | { | 
 | 535 |     local TOPFILE=build/core/envsetup.mk | 
 | 536 |     if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then | 
 | 537 |         echo $TOP | 
 | 538 |     else | 
 | 539 |         if [ -f $TOPFILE ] ; then | 
 | 540 |             echo $PWD | 
 | 541 |         else | 
 | 542 |             # We redirect cd to /dev/null in case it's aliased to | 
 | 543 |             # a command that prints something as a side-effect | 
 | 544 |             # (like pushd) | 
 | 545 |             local HERE=$PWD | 
 | 546 |             T= | 
 | 547 |             while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do | 
 | 548 |                 cd .. > /dev/null | 
 | 549 |                 T=$PWD | 
 | 550 |             done | 
 | 551 |             cd $HERE > /dev/null | 
 | 552 |             if [ -f "$T/$TOPFILE" ]; then | 
 | 553 |                 echo $T | 
 | 554 |             fi | 
 | 555 |         fi | 
 | 556 |     fi | 
 | 557 | } | 
 | 558 |  | 
 | 559 | function m() | 
 | 560 | { | 
 | 561 |     T=$(gettop) | 
 | 562 |     if [ "$T" ]; then | 
 | 563 |         make -C $T $@ | 
 | 564 |     else | 
 | 565 |         echo "Couldn't locate the top of the tree.  Try setting TOP." | 
 | 566 |     fi | 
 | 567 | } | 
 | 568 |  | 
 | 569 | function findmakefile() | 
 | 570 | { | 
 | 571 |     TOPFILE=build/core/envsetup.mk | 
 | 572 |     # We redirect cd to /dev/null in case it's aliased to | 
 | 573 |     # a command that prints something as a side-effect | 
 | 574 |     # (like pushd) | 
 | 575 |     local HERE=$PWD | 
 | 576 |     T= | 
 | 577 |     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do | 
 | 578 |         T=$PWD | 
 | 579 |         if [ -f "$T/Android.mk" ]; then | 
 | 580 |             echo $T/Android.mk | 
 | 581 |             cd $HERE > /dev/null | 
 | 582 |             return | 
 | 583 |         fi | 
 | 584 |         cd .. > /dev/null | 
 | 585 |     done | 
 | 586 |     cd $HERE > /dev/null | 
 | 587 | } | 
 | 588 |  | 
 | 589 | function mm() | 
 | 590 | { | 
 | 591 |     # If we're sitting in the root of the build tree, just do a | 
 | 592 |     # normal make. | 
 | 593 |     if [ -f build/core/envsetup.mk -a -f Makefile ]; then | 
 | 594 |         make $@ | 
 | 595 |     else | 
 | 596 |         # Find the closest Android.mk file. | 
 | 597 |         T=$(gettop) | 
 | 598 |         local M=$(findmakefile) | 
 | 599 |         if [ ! "$T" ]; then | 
 | 600 |             echo "Couldn't locate the top of the tree.  Try setting TOP." | 
 | 601 |         elif [ ! "$M" ]; then | 
 | 602 |             echo "Couldn't locate a makefile from the current directory." | 
 | 603 |         else | 
 | 604 |             ONE_SHOT_MAKEFILE=$M make -C $T files $@ | 
 | 605 |         fi | 
 | 606 |     fi | 
 | 607 | } | 
 | 608 |  | 
 | 609 | function mmm() | 
 | 610 | { | 
 | 611 |     T=$(gettop) | 
 | 612 |     if [ "$T" ]; then | 
 | 613 |         local MAKEFILE= | 
 | 614 |         local ARGS= | 
 | 615 |         local DIR TO_CHOP | 
 | 616 |         local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') | 
 | 617 |         local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') | 
 | 618 |         for DIR in $DIRS ; do | 
 | 619 |             DIR=`echo $DIR | sed -e 's:/$::'` | 
 | 620 |             if [ -f $DIR/Android.mk ]; then | 
 | 621 |                 TO_CHOP=`echo $T | wc -c | tr -d ' '` | 
 | 622 |                 TO_CHOP=`expr $TO_CHOP + 1` | 
 | 623 |                 MFILE=`echo $PWD | cut -c${TO_CHOP}-` | 
 | 624 |                 if [ "$MFILE" = "" ] ; then | 
 | 625 |                     MFILE=$DIR/Android.mk | 
 | 626 |                 else | 
 | 627 |                     MFILE=$MFILE/$DIR/Android.mk | 
 | 628 |                 fi | 
 | 629 |                 MAKEFILE="$MAKEFILE $MFILE" | 
 | 630 |             else | 
 | 631 |                 if [ "$DIR" = snod ]; then | 
 | 632 |                     ARGS="$ARGS snod" | 
 | 633 |                 elif [ "$DIR" = showcommands ]; then | 
 | 634 |                     ARGS="$ARGS showcommands" | 
 | 635 |                 else | 
 | 636 |                     echo "No Android.mk in $DIR." | 
 | 637 |                 fi | 
 | 638 |             fi | 
 | 639 |         done | 
 | 640 |         ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS files $ARGS | 
 | 641 |     else | 
 | 642 |         echo "Couldn't locate the top of the tree.  Try setting TOP." | 
 | 643 |     fi | 
 | 644 | } | 
 | 645 |  | 
 | 646 | function croot() | 
 | 647 | { | 
 | 648 |     T=$(gettop) | 
 | 649 |     if [ "$T" ]; then | 
 | 650 |         cd $(gettop) | 
 | 651 |     else | 
 | 652 |         echo "Couldn't locate the top of the tree.  Try setting TOP." | 
 | 653 |     fi | 
 | 654 | } | 
 | 655 |  | 
 | 656 | function pid() | 
 | 657 | { | 
 | 658 |    local EXE="$1" | 
 | 659 |    if [ "$EXE" ] ; then | 
 | 660 |        local PID=`adb shell ps | fgrep $1 | sed -e 's/[^ ]* *\([0-9]*\).*/\1/'` | 
 | 661 |        echo "$PID" | 
 | 662 |    else | 
 | 663 |        echo "usage: pid name" | 
 | 664 |    fi | 
 | 665 | } | 
 | 666 |  | 
 | 667 | function gdbclient() | 
 | 668 | { | 
 | 669 |    local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT) | 
 | 670 |    local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED) | 
 | 671 |    local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) | 
 | 672 |    local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED) | 
 | 673 |    local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) | 
 | 674 |    if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then | 
 | 675 |        local EXE="$1" | 
 | 676 |        if [ "$EXE" ] ; then | 
 | 677 |            EXE=$1 | 
 | 678 |        else | 
 | 679 |            EXE="app_process" | 
 | 680 |        fi | 
 | 681 |  | 
 | 682 |        local PORT="$2" | 
 | 683 |        if [ "$PORT" ] ; then | 
 | 684 |            PORT=$2 | 
 | 685 |        else | 
 | 686 |            PORT=":5039" | 
 | 687 |        fi | 
 | 688 |  | 
 | 689 |        local PID | 
 | 690 |        local PROG="$3" | 
 | 691 |        if [ "$PROG" ] ; then | 
 | 692 |            PID=`pid $3` | 
 | 693 |            adb forward "tcp$PORT" "tcp$PORT" | 
 | 694 |            adb shell gdbserver $PORT --attach $PID & | 
 | 695 |            sleep 2 | 
 | 696 |        else | 
 | 697 |                echo "" | 
 | 698 |                echo "If you haven't done so already, do this first on the device:" | 
 | 699 |                echo "    gdbserver $PORT /system/bin/$EXE" | 
 | 700 |                    echo " or" | 
 | 701 |                echo "    gdbserver $PORT --attach $PID" | 
 | 702 |                echo "" | 
 | 703 |        fi | 
 | 704 |  | 
 | 705 |        echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" | 
 | 706 |        echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS" | 
 | 707 |        echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" | 
 | 708 |        echo >>"$OUT_ROOT/gdbclient.cmds" "" | 
 | 709 |  | 
 | 710 |        arm-eabi-gdb -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" | 
 | 711 |   else | 
 | 712 |        echo "Unable to determine build system output dir." | 
 | 713 |    fi | 
 | 714 |  | 
 | 715 | } | 
 | 716 |  | 
 | 717 | case `uname -s` in | 
 | 718 |     Darwin) | 
 | 719 |         function sgrep() | 
 | 720 |         { | 
 | 721 |             find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n "$@" | 
 | 722 |         } | 
 | 723 |  | 
 | 724 |         ;; | 
 | 725 |     *) | 
 | 726 |         function sgrep() | 
 | 727 |         { | 
 | 728 |             find . -type f -iregex '.*\.\(c\|h\|cpp\|S\|java\|xml\)' -print0 | xargs -0 grep --color -n "$@" | 
 | 729 |         } | 
 | 730 |         ;; | 
 | 731 | esac | 
 | 732 |  | 
 | 733 | function jgrep() | 
 | 734 | { | 
 | 735 |     find . -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@" | 
 | 736 | } | 
 | 737 |  | 
 | 738 | function cgrep() | 
 | 739 | { | 
 | 740 |     find . -type f -name "*\.c*" -print0 | xargs -0 grep --color -n "$@" | 
 | 741 | } | 
 | 742 |  | 
 | 743 | function resgrep() | 
 | 744 | { | 
 | 745 |     for dir in `find . -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done; | 
 | 746 | } | 
 | 747 |  | 
 | 748 | case `uname -s` in | 
 | 749 |     Darwin) | 
 | 750 |         function mgrep() | 
 | 751 |         { | 
 | 752 |             find -E . -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@" | 
 | 753 |         } | 
 | 754 |  | 
 | 755 |         function treegrep() | 
 | 756 |         { | 
 | 757 |             find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n -i "$@" | 
 | 758 |         } | 
 | 759 |  | 
 | 760 |         ;; | 
 | 761 |     *) | 
 | 762 |         function mgrep() | 
 | 763 |         { | 
 | 764 |             find . -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@" | 
 | 765 |         } | 
 | 766 |  | 
 | 767 |         function treegrep() | 
 | 768 |         { | 
 | 769 |             find . -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f -print0 | xargs -0 grep --color -n -i "$@" | 
 | 770 |         } | 
 | 771 |  | 
 | 772 |         ;; | 
 | 773 | esac | 
 | 774 |  | 
 | 775 | function getprebuilt | 
 | 776 | { | 
 | 777 |     get_abs_build_var ANDROID_PREBUILTS | 
 | 778 | } | 
 | 779 |  | 
 | 780 | function tracedmdump() | 
 | 781 | { | 
 | 782 |     T=$(gettop) | 
 | 783 |     if [ ! "$T" ]; then | 
 | 784 |         echo "Couldn't locate the top of the tree.  Try setting TOP." | 
 | 785 |         return | 
 | 786 |     fi | 
 | 787 |     local prebuiltdir=$(getprebuilt) | 
| Jack Veenstra | 8f8b99c | 2009-04-10 10:30:51 -0700 | [diff] [blame] | 788 |     local KERNEL=$T/prebuilt/android-arm/kernel/vmlinux-qemu | 
| The Android Open Source Project | 88b6079 | 2009-03-03 19:28:42 -0800 | [diff] [blame] | 789 |  | 
 | 790 |     local TRACE=$1 | 
 | 791 |     if [ ! "$TRACE" ] ; then | 
 | 792 |         echo "usage:  tracedmdump  tracename" | 
 | 793 |         return | 
 | 794 |     fi | 
 | 795 |  | 
| Jack Veenstra | 8f8b99c | 2009-04-10 10:30:51 -0700 | [diff] [blame] | 796 |     if [ ! -r "$KERNEL" ] ; then | 
 | 797 |         echo "Error: cannot find kernel: '$KERNEL'" | 
 | 798 |         return | 
 | 799 |     fi | 
 | 800 |  | 
| The Android Open Source Project | 88b6079 | 2009-03-03 19:28:42 -0800 | [diff] [blame] | 801 |     local BASETRACE=$(basename $TRACE) | 
 | 802 |     if [ "$BASETRACE" = "$TRACE" ] ; then | 
 | 803 |         TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE | 
 | 804 |     fi | 
 | 805 |  | 
 | 806 |     echo "post-processing traces..." | 
 | 807 |     rm -f $TRACE/qtrace.dexlist | 
 | 808 |     post_trace $TRACE | 
 | 809 |     if [ $? -ne 0 ]; then | 
 | 810 |         echo "***" | 
 | 811 |         echo "*** Error: malformed trace.  Did you remember to exit the emulator?" | 
 | 812 |         echo "***" | 
 | 813 |         return | 
 | 814 |     fi | 
 | 815 |     echo "generating dexlist output..." | 
 | 816 |     /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 | 
 | 817 |     echo "generating dmtrace data..." | 
 | 818 |     q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return | 
 | 819 |     echo "generating html file..." | 
 | 820 |     dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return | 
 | 821 |     echo "done, see $TRACE/dmtrace.html for details" | 
 | 822 |     echo "or run:" | 
 | 823 |     echo "    traceview $TRACE/dmtrace" | 
 | 824 | } | 
 | 825 |  | 
 | 826 | # communicate with a running device or emulator, set up necessary state, | 
 | 827 | # and run the hat command. | 
 | 828 | function runhat() | 
 | 829 | { | 
 | 830 |     # process standard adb options | 
 | 831 |     local adbTarget="" | 
 | 832 |     if [ $1 = "-d" -o $1 = "-e" ]; then | 
 | 833 |         adbTarget=$1 | 
 | 834 |         shift 1 | 
 | 835 |     elif [ $1 = "-s" ]; then | 
 | 836 |         adbTarget="$1 $2" | 
 | 837 |         shift 2 | 
 | 838 |     fi | 
 | 839 |     local adbOptions=${adbTarget} | 
 | 840 |     echo adbOptions = ${adbOptions} | 
 | 841 |  | 
 | 842 |     # runhat options | 
 | 843 |     local targetPid=$1 | 
 | 844 |     local outputFile=$2 | 
 | 845 |  | 
 | 846 |     if [ "$targetPid" = "" ]; then | 
 | 847 |         echo "Usage: runhat [ -d | -e | -s serial ] target-pid [output-file]" | 
 | 848 |         return | 
 | 849 |     fi | 
 | 850 |  | 
 | 851 |     # confirm hat is available | 
 | 852 |     if [ -z $(which hat) ]; then | 
 | 853 |         echo "hat is not available in this configuration." | 
 | 854 |         return | 
 | 855 |     fi | 
 | 856 |  | 
 | 857 |     adb ${adbOptions} shell >/dev/null mkdir /data/misc | 
 | 858 |     adb ${adbOptions} shell chmod 777 /data/misc | 
 | 859 |  | 
 | 860 |     # send a SIGUSR1 to cause the hprof dump | 
 | 861 |     echo "Poking $targetPid and waiting for data..." | 
 | 862 |     adb ${adbOptions} shell kill -10 $targetPid | 
 | 863 |     echo "Press enter when logcat shows \"hprof: heap dump completed\"" | 
 | 864 |     echo -n "> " | 
 | 865 |     read | 
 | 866 |  | 
 | 867 |     local availFiles=( $(adb ${adbOptions} shell ls /data/misc | grep '^heap-dump' | sed -e 's/.*heap-dump-/heap-dump-/' | sort -r | tr '[:space:][:cntrl:]' ' ') ) | 
 | 868 |     local devFile=/data/misc/${availFiles[0]} | 
 | 869 |     local localFile=/tmp/$$-hprof | 
 | 870 |  | 
 | 871 |     echo "Retrieving file $devFile..." | 
 | 872 |     adb ${adbOptions} pull $devFile $localFile | 
 | 873 |  | 
 | 874 |     adb ${adbOptions} shell rm $devFile | 
 | 875 |  | 
 | 876 |     echo "Running hat on $localFile" | 
 | 877 |     echo "View the output by pointing your browser at http://localhost:7000/" | 
 | 878 |     echo "" | 
 | 879 |     hat $localFile | 
 | 880 | } | 
 | 881 |  | 
 | 882 | function getbugreports() | 
 | 883 | { | 
 | 884 |     local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`) | 
 | 885 |  | 
 | 886 |     if [ ! "$reports" ]; then | 
 | 887 |         echo "Could not locate any bugreports." | 
 | 888 |         return | 
 | 889 |     fi | 
 | 890 |  | 
 | 891 |     local report | 
 | 892 |     for report in ${reports[@]} | 
 | 893 |     do | 
 | 894 |         echo "/sdcard/bugreports/${report}" | 
 | 895 |         adb pull /sdcard/bugreports/${report} ${report} | 
 | 896 |         gunzip ${report} | 
 | 897 |     done | 
 | 898 | } | 
 | 899 |  | 
 | 900 | function startviewserver() | 
 | 901 | { | 
 | 902 |     local port=4939 | 
 | 903 |     if [ $# -gt 0 ]; then | 
 | 904 |             port=$1 | 
 | 905 |     fi | 
 | 906 |     adb shell service call window 1 i32 $port | 
 | 907 | } | 
 | 908 |  | 
 | 909 | function stopviewserver() | 
 | 910 | { | 
 | 911 |     adb shell service call window 2 | 
 | 912 | } | 
 | 913 |  | 
 | 914 | function isviewserverstarted() | 
 | 915 | { | 
 | 916 |     adb shell service call window 3 | 
 | 917 | } | 
 | 918 |  | 
 | 919 | function smoketest() | 
 | 920 | { | 
 | 921 |     if [ ! "$ANDROID_PRODUCT_OUT" ]; then | 
 | 922 |         echo "Couldn't locate output files.  Try running 'lunch' first." >&2 | 
 | 923 |         return | 
 | 924 |     fi | 
 | 925 |     T=$(gettop) | 
 | 926 |     if [ ! "$T" ]; then | 
 | 927 |         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2 | 
 | 928 |         return | 
 | 929 |     fi | 
 | 930 |  | 
 | 931 |     (cd "$T" && mmm tests/SmokeTest) && | 
 | 932 |       adb uninstall com.android.smoketest > /dev/null && | 
 | 933 |       adb uninstall com.android.smoketest.tests > /dev/null && | 
 | 934 |       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk && | 
 | 935 |       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk && | 
 | 936 |       adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner | 
 | 937 | } | 
 | 938 |  | 
 | 939 | # simple shortcut to the runtest command | 
 | 940 | function runtest() | 
 | 941 | { | 
 | 942 |     T=$(gettop) | 
 | 943 |     if [ ! "$T" ]; then | 
 | 944 |         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2 | 
 | 945 |         return | 
 | 946 |     fi | 
| Brett Chabot | 3ec9f33 | 2009-05-05 12:47:09 -0700 | [diff] [blame] | 947 |     (cd "$T" && development/testrunner/runtest.py $@) | 
| The Android Open Source Project | 88b6079 | 2009-03-03 19:28:42 -0800 | [diff] [blame] | 948 | } | 
 | 949 |  | 
| Brett Chabot | 3ec9f33 | 2009-05-05 12:47:09 -0700 | [diff] [blame] | 950 | # TODO: Remove this some time after 1 June 2009 | 
| Brett Chabot | 03e1e28 | 2009-03-31 14:53:34 -0700 | [diff] [blame] | 951 | function runtest_py() | 
| Brett Chabot | e253d82 | 2009-03-27 20:17:02 -0700 | [diff] [blame] | 952 | { | 
| Brett Chabot | 3ec9f33 | 2009-05-05 12:47:09 -0700 | [diff] [blame] | 953 |     echo "runtest_py is obsolete; use runtest instead" >&2 | 
 | 954 |     return 1 | 
| Brett Chabot | e253d82 | 2009-03-27 20:17:02 -0700 | [diff] [blame] | 955 | } | 
 | 956 |  | 
| The Android Open Source Project | 88b6079 | 2009-03-03 19:28:42 -0800 | [diff] [blame] | 957 | function godir () { | 
 | 958 |     if [[ -z "$1" ]]; then | 
 | 959 |         echo "Usage: godir <regex>" | 
 | 960 |         return | 
 | 961 |     fi | 
 | 962 |     if [[ ! -f $T/filelist ]]; then | 
 | 963 |         echo -n "Creating index..." | 
 | 964 |         (cd $T; find . -wholename ./out -prune -o -type f > filelist) | 
 | 965 |         echo " Done" | 
 | 966 |         echo "" | 
 | 967 |     fi | 
 | 968 |     local lines | 
 | 969 |     lines=($(grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq))  | 
 | 970 |     if [[ ${#lines[@]} = 0 ]]; then | 
 | 971 |         echo "Not found" | 
 | 972 |         return | 
 | 973 |     fi | 
 | 974 |     local pathname | 
 | 975 |     local choice | 
 | 976 |     if [[ ${#lines[@]} > 1 ]]; then | 
 | 977 |         while [[ -z "$pathname" ]]; do | 
 | 978 |             local index=1 | 
 | 979 |             local line | 
 | 980 |             for line in ${lines[@]}; do | 
 | 981 |                 printf "%6s %s\n" "[$index]" $line | 
 | 982 |                 index=$(($index + 1))  | 
 | 983 |             done | 
 | 984 |             echo | 
 | 985 |             echo -n "Select one: " | 
 | 986 |             unset choice | 
 | 987 |             read choice | 
 | 988 |             if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then | 
 | 989 |                 echo "Invalid choice" | 
 | 990 |                 continue | 
 | 991 |             fi | 
 | 992 |             pathname=${lines[$(($choice-$_arrayoffset))]} | 
 | 993 |         done | 
 | 994 |     else | 
 | 995 |         # even though zsh arrays are 1-based, $foo[0] is an alias for $foo[1] | 
 | 996 |         pathname=${lines[0]} | 
 | 997 |     fi | 
 | 998 |     cd $T/$pathname | 
 | 999 | } | 
 | 1000 |  | 
 | 1001 | # determine whether arrays are zero-based (bash) or one-based (zsh) | 
 | 1002 | _xarray=(a b c) | 
 | 1003 | if [ -z "${_xarray[${#_xarray[@]}]}" ] | 
 | 1004 | then | 
 | 1005 |     _arrayoffset=1 | 
 | 1006 | else | 
 | 1007 |     _arrayoffset=0 | 
 | 1008 | fi | 
 | 1009 | unset _xarray | 
 | 1010 |  | 
 | 1011 | # Execute the contents of any vendorsetup.sh files we can find. | 
 | 1012 | for f in `/bin/ls vendor/*/vendorsetup.sh 2> /dev/null` | 
 | 1013 | do | 
 | 1014 |     echo "including $f" | 
 | 1015 |     . $f | 
 | 1016 | done | 
 | 1017 | unset f |