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