function hmm() {
cat <<EOF
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
-- lunch: lunch <product_name>-<build_variant>
-- tapas: tapas [<App1> <App2> ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user]
-- croot: Changes directory to the top of the tree.
-- m: Makes from the top of the tree.
-- mm: Builds all of the modules in the current directory, but not their dependencies.
-- mmm: Builds all of the modules in the supplied directories, but not their dependencies.
- To limit the modules being built use the syntax: mmm dir/:target1,target2.
-- 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.
-- cgrep: Greps on all local C/C++ files.
-- ggrep: Greps on all local Gradle files.
-- jgrep: Greps on all local Java files.
-- resgrep: Greps on all local res/*.xml files.
-- mangrep: Greps on all local AndroidManifest.xml files.
-- sepgrep: Greps on all local sepolicy files.
-- sgrep: Greps on all local source files.
-- godir: Go to the directory containing a file.
-
-Environemnt options:
+- lunch: lunch <product_name>-<build_variant>
+- tapas: tapas [<App1> <App2> ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user]
+- croot: Changes directory to the top of the tree.
+- cout: Changes directory to out.
+- m: Makes from the top of the tree.
+- 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.
+ To limit the modules being built use the syntax: mmm dir/:target1,target2.
+- 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.
+- mmap: Builds all of the modules in the current directory, and its dependencies, then pushes the package to the device.
+- mmp: Builds all of the modules in the current directory and pushes them to the device.
+- mmmp: Builds all of the modules in the supplied directories and pushes them to the device.
+- mms: Short circuit builder. Quickly re-build the kernel, rootfs, boot and system images
+ without deep dependencies. Requires the full build to have run before.
+- provision: Flash device with all required partitions. Options will be passed on to fastboot.
+- cgrep: Greps on all local C/C++ files.
+- ggrep: Greps on all local Gradle files.
+- jgrep: Greps on all local Java files.
+- resgrep: Greps on all local res/*.xml files.
+- mangrep: Greps on all local AndroidManifest.xml files.
+- mgrep: Greps on all local Makefiles files.
+- sepgrep: Greps on all local sepolicy files.
+- sgrep: Greps on all local source files.
+- godir: Go to the directory containing a file.
+- cmremote: Add git remote for CM Gerrit Review
+- cmgerrit: A Git wrapper that fetches/pushes patch from/to CM Gerrit Review
+- aospremote: Add git remote for matching AOSP repository
+- cafremote: Add git remote for matching CodeAurora repository.
+- cmrebase: Rebase a Gerrit change and push it again
+- mka: Builds using SCHED_BATCH on all processors
+- mkap: Builds the module(s) using mka and pushes them to the device.
+- cmka: Cleans and builds using mka.
+- repolastsync: Prints date and time of last repo sync.
+- reposync: Parallel repo sync using ionice and SCHED_BATCH
+- repopick: Utility to fetch changes from Gerrit.
+- installboot: Installs a boot.img to the connected device.
+- installrecovery: Installs a recovery.img to the connected device.
+- repodiff: Diff 2 different branches or tags within the same repo
+
+Environment 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.
Look at the source to view more functions. The complete list is:
EOF
T=$(gettop)
- local A
- A=""
- for i in `cat $T/build/envsetup.sh | sed -n "/^[ \t]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do
- A="$A $i"
+ for i in `cat $T/build/envsetup.sh | sed -n "/^[[:blank:]]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do
+ echo "$i"
+ done | column
+}
+
+# Get all the build variables needed by this script in a single call to the build system.
+function build_build_var_cache()
+{
+ T=$(gettop)
+ # Grep out the variable names from the script.
+ cached_vars=`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/get_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`
+ cached_abs_vars=`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/get_abs_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`
+ # Call the build system to dump the "<val>=<value>" pairs as a shell script.
+ build_dicts_script=`\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
+ command make --no-print-directory -f build/core/config.mk \
+ dump-many-vars \
+ DUMP_MANY_VARS="$cached_vars" \
+ DUMP_MANY_ABS_VARS="$cached_abs_vars" \
+ DUMP_VAR_PREFIX="var_cache_" \
+ DUMP_ABS_VAR_PREFIX="abs_var_cache_"`
+ local ret=$?
+ if [ $ret -ne 0 ]
+ then
+ unset build_dicts_script
+ return $ret
+ fi
+ # Excute the script to store the "<val>=<value>" pairs as shell variables.
+ eval "$build_dicts_script"
+ ret=$?
+ unset build_dicts_script
+ if [ $ret -ne 0 ]
+ then
+ return $ret
+ fi
+ BUILD_VAR_CACHE_READY="true"
+}
+
+# Delete the build var cache, so that we can still call into the build system
+# to get build variables not listed in this script.
+function destroy_build_var_cache()
+{
+ unset BUILD_VAR_CACHE_READY
+ for v in $cached_vars; do
+ unset var_cache_$v
+ done
+ unset cached_vars
+ for v in $cached_abs_vars; do
+ unset abs_var_cache_$v
done
- echo $A
+ unset cached_abs_vars
}
# Get the value of a build variable as an absolute path.
function get_abs_build_var()
{
+ if [ "$BUILD_VAR_CACHE_READY" = "true" ]
+ then
+ eval echo \"\${abs_var_cache_$1}\"
+ return
+ fi
+
T=$(gettop)
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP." >&2
# Get the exact value of a build variable.
function get_build_var()
{
+ if [ "$BUILD_VAR_CACHE_READY" = "true" ]
+ then
+ eval echo \"\${var_cache_$1}\"
+ return
+ fi
+
T=$(gettop)
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP." >&2
echo "Couldn't locate the top of the tree. Try setting TOP." >&2
return
fi
+
+ if (echo -n $1 | grep -q -e "^cm_") ; then
+ CM_BUILD=$(echo -n $1 | sed -e 's/^cm_//g')
+ export BUILD_NUMBER=$((date +%s%N ; echo $CM_BUILD; hostname) | openssl sha1 | sed -e 's/.*=//g; s/ //g' | cut -c1-10)
+ else
+ CM_BUILD=
+ fi
+ export CM_BUILD
+
TARGET_PRODUCT=$1 \
TARGET_BUILD_VARIANT= \
TARGET_BUILD_TYPE= \
export ANDROID_TOOLCHAIN_2ND_ARCH=$gccprebuiltdir/$toolchaindir2
fi
- unset ANDROID_KERNEL_TOOLCHAIN_PATH
- case $ARCH in
- arm)
- # Legacy toolchain configuration used for ARM kernel compilation
- toolchaindir=arm/arm-eabi-$targetgccversion/bin
- if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
- export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir"
- ANDROID_KERNEL_TOOLCHAIN_PATH="$ARM_EABI_TOOLCHAIN":
- fi
- ;;
- *)
- # No need to set ARM_EABI_TOOLCHAIN for other ARCHs
- ;;
- esac
-
export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools:$T/external/selinux/prebuilts/bin
- export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_TOOLCHAIN:$ANDROID_TOOLCHAIN_2ND_ARCH:$ANDROID_KERNEL_TOOLCHAIN_PATH$ANDROID_DEV_SCRIPTS:
+ export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_TOOLCHAIN:$ANDROID_TOOLCHAIN_2ND_ARCH:$ANDROID_DEV_SCRIPTS:
# If prebuilts/android-emulator/<system>/ exists, prepend it to our PATH
# to ensure that the corresponding 'emulator' binaries are used.
fi
export PATH=$ANDROID_BUILD_PATHS$PATH
+ export PYTHONPATH=$T/development/python-packages:$PYTHONPATH
unset ANDROID_JAVA_TOOLCHAIN
unset ANDROID_PRE_BUILD_PATHS
unset ANDROID_HOST_OUT
export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT)
+ if [ -n "$ANDROID_CCACHE_DIR" ]; then
+ export CCACHE_DIR=$ANDROID_CCACHE_DIR
+ fi
+
# needed for building linux on MacOS
# TODO: fix the path
#export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include
setpaths
set_sequence_number
- export ANDROID_BUILD_TOP=$(gettop)
# 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'
export ASAN_OPTIONS=detect_leaks=0
local product=$TARGET_PRODUCT
local variant=$TARGET_BUILD_VARIANT
local apps=$TARGET_BUILD_APPS
+ if [ -z "$PROMPT_COMMAND" ]; then
+ # No prompts
+ PROMPT_COMMAND="echo -ne \"\033]0;${USER}@${HOSTNAME}: ${PWD}\007\""
+ elif [ -z "$(echo $PROMPT_COMMAND | grep '033]0;')" ]; then
+ # Prompts exist, but no hardstatus
+ PROMPT_COMMAND="echo -ne \"\033]0;${USER}@${HOSTNAME}: ${PWD}\007\";${PROMPT_COMMAND}"
+ fi
+ if [ ! -z "$ANDROID_PROMPT_PREFIX" ]; then
+ PROMPT_COMMAND="$(echo $PROMPT_COMMAND | sed -e 's/$ANDROID_PROMPT_PREFIX //g')"
+ fi
+
if [ -z "$apps" ]; then
- export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""
+ ANDROID_PROMPT_PREFIX="[${arch}-${product}-${variant}]"
else
- export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\""
+ ANDROID_PROMPT_PREFIX="[$arch $apps $variant]"
fi
+ export ANDROID_PROMPT_PREFIX
+
+ # Inject build data into hardstatus
+ export PROMPT_COMMAND="$(echo $PROMPT_COMMAND | sed -e 's/\\033]0;\(.*\)\\007/\\033]0;$ANDROID_PROMPT_PREFIX \1\\007/g')"
fi
}
-function addcompletions()
+function check_bash_version()
{
- local T dir f
-
# Keep us from trying to run in something that isn't bash.
if [ -z "${BASH_VERSION}" ]; then
- return
+ return 1
fi
# Keep us from trying to run in bash that's too old.
- if [ ${BASH_VERSINFO[0]} -lt 3 ]; then
- return
+ if [ "${BASH_VERSINFO[0]}" -lt 4 ] ; then
+ return 2
fi
- dir="sdk/bash_completion"
- if [ -d ${dir} ]; then
- for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do
- echo "including $f"
- . $f
- done
- fi
+ return 0
}
function choosetype()
fi
done
+ build_build_var_cache
set_stuff_for_environment
+ destroy_build_var_cache
}
#
if [ "x$TARGET_PRODUCT" != x ] ; then
default_value=$TARGET_PRODUCT
else
- default_value=full
+ default_value=aosp_arm
fi
+ export TARGET_BUILD_APPS=
export TARGET_PRODUCT=
local ANSWER
while [ -z "$TARGET_PRODUCT" ]
fi
done
+ build_build_var_cache
set_stuff_for_environment
+ destroy_build_var_cache
}
function choosevariant()
choosevariant $3
echo
+ build_build_var_cache
set_stuff_for_environment
printconfig
+ destroy_build_var_cache
}
# Clear this variable. It will be built up again when the vendorsetup.sh
local uname=$(uname)
echo
echo "You're building on" $uname
+ if [ "$(uname)" = "Darwin" ] ; then
+ echo " (ohai, koush!)"
+ fi
echo
- echo "Lunch menu... pick a combo:"
+ if [ "z${CM_DEVICES_ONLY}" != "z" ]; then
+ echo "Breakfast menu... pick a combo:"
+ else
+ echo "Lunch menu... pick a combo:"
+ fi
local i=1
local choice
for choice in ${LUNCH_MENU_CHOICES[@]}
do
- echo " $i. $choice"
+ echo " $i. $choice "
i=$(($i+1))
- done
+ done | column
+
+ if [ "z${CM_DEVICES_ONLY}" != "z" ]; then
+ echo "... and don't forget the bacon!"
+ fi
echo
}
+function brunch()
+{
+ breakfast $*
+ if [ $? -eq 0 ]; then
+ mka bacon
+ else
+ echo "No such item in brunch menu. Try 'breakfast'"
+ return 1
+ fi
+ return $?
+}
+
+function breakfast()
+{
+ target=$1
+ local variant=$2
+ CM_DEVICES_ONLY="true"
+ unset LUNCH_MENU_CHOICES
+ add_lunch_combo full-eng
+ for f in `/bin/ls vendor/cm/vendorsetup.sh 2> /dev/null`
+ do
+ echo "including $f"
+ . $f
+ done
+ unset f
+
+ if [ $# -eq 0 ]; then
+ # No arguments, so let's have the full menu
+ lunch
+ else
+ echo "z$target" | grep -q "-"
+ if [ $? -eq 0 ]; then
+ # A buildtype was specified, assume a full device name
+ lunch $target
+ else
+ # This is probably just the CM model name
+ if [ -z "$variant" ]; then
+ variant="userdebug"
+ fi
+ lunch cm_$target-$variant
+ fi
+ fi
+ return $?
+}
+
+alias bib=breakfast
+
function lunch()
{
local answer
+ LUNCH_MENU_CHOICES=($(for l in ${LUNCH_MENU_CHOICES[@]}; do echo "$l"; done | sort))
if [ "$1" ] ; then
answer=$1
export TARGET_BUILD_APPS=
- local product=$(echo -n $selection | sed -e "s/-.*$//")
- check_product $product
- if [ $? -ne 0 ]
- then
- echo
- echo "** Don't have a product spec for: '$product'"
- echo "** Do you have the right repo manifest?"
- product=
- fi
-
local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
check_variant $variant
if [ $? -ne 0 ]
variant=
fi
+ local product=$(echo -n $selection | sed -e "s/-.*$//")
+ TARGET_PRODUCT=$product \
+ TARGET_BUILD_VARIANT=$variant \
+ build_build_var_cache
+ if [ $? -ne 0 ]
+ then
+ # if we can't find a product, try to grab it off the CM github
+ T=$(gettop)
+ pushd $T > /dev/null
+ build/tools/roomservice.py $product
+ popd > /dev/null
+ check_product $product
+ else
+ build/tools/roomservice.py $product true
+ fi
+ if [ $? -ne 0 ]
+ then
+ echo
+ echo "** Don't have a product spec for: '$product'"
+ echo "** Do you have the right repo manifest?"
+ product=
+ fi
+
if [ -z "$product" -o -z "$variant" ]
then
echo
echo
+ fixup_common_out_dir
+
set_stuff_for_environment
printconfig
+ destroy_build_var_cache
}
# Tab completion for lunch.
COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) )
return 0
}
-complete -F _lunch lunch
+complete -F _lunch lunch 2>/dev/null
# Configures the build to build unbundled apps.
# Run tapas with one or more app names (from LOCAL_PACKAGE_NAME)
return
fi
- local product=full
+ local product=aosp_arm
case $arch in
- x86) product=full_x86;;
- mips) product=full_mips;;
+ x86) product=aosp_x86;;
+ mips) product=aosp_mips;;
armv5) product=generic_armv5;;
arm64) product=aosp_arm64;;
x86_64) product=aosp_x86_64;;
export TARGET_BUILD_TYPE=release
export TARGET_BUILD_APPS=$apps
+ build_build_var_cache
set_stuff_for_environment
printconfig
+ destroy_build_var_cache
+}
+
+function eat()
+{
+ if [ "$OUT" ] ; then
+ MODVERSION=$(get_build_var CM_VERSION)
+ ZIPFILE=cm-$MODVERSION.zip
+ ZIPPATH=$OUT/$ZIPFILE
+ if [ ! -f $ZIPPATH ] ; then
+ echo "Nothing to eat"
+ return 1
+ fi
+ adb start-server # Prevent unexpected starting server message from adb get-state in the next line
+ if [ $(adb get-state) != device -a $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then
+ echo "No device is online. Waiting for one..."
+ echo "Please connect USB and/or enable USB debugging"
+ until [ $(adb get-state) = device -o $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do
+ sleep 1
+ done
+ echo "Device Found.."
+ fi
+ if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD");
+ then
+ # if adbd isn't root we can't write to /cache/recovery/
+ adb root
+ sleep 1
+ adb wait-for-device
+ cat << EOF > /tmp/command
+--sideload_auto_reboot
+EOF
+ if adb push /tmp/command /cache/recovery/ ; then
+ echo "Rebooting into recovery for sideload installation"
+ adb reboot recovery
+ adb wait-for-sideload
+ adb sideload $ZIPPATH
+ fi
+ rm /tmp/command
+ else
+ echo "Nothing to eat"
+ return 1
+ fi
+ return $?
+ else
+ echo "The connected device does not appear to be $CM_BUILD, run away!"
+ fi
+}
+
+function omnom
+{
+ brunch $*
+ eat
}
function gettop
local M=$(findmakefile)
local MODULES=
local GET_INSTALL_PATH=
- local ARGS=
# Remove the path to top as the makefilepath needs to be relative
local M=`echo $M|sed 's:'$T'/::'`
if [ ! "$T" ]; then
done
if [ -n "$GET_INSTALL_PATH" ]; then
MODULES=
- ARGS=GET-INSTALL-PATH
+ # set all args to 'GET-INSTALL-PATH'
+ set -- GET-INSTALL-PATH
else
MODULES=all_modules
- ARGS=$@
fi
- ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES $ARGS
+ ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES "$@"
fi
fi
}
local ARGS=
local DIR TO_CHOP
local GET_INSTALL_PATH=
- local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
- local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
+
+ if [ "$(__detect_shell)" = "zsh" ]; then
+ set -lA DASH_ARGS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
+ set -lA DIRS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
+ else
+ local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
+ local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
+ fi
+
for DIR in $DIRS ; do
MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'`
if [ "$MODULES" = "" ]; then
MAKEFILE="$MAKEFILE $MFILE"
else
case $DIR in
- showcommands | snod | dist | incrementaljavac | *=*) ARGS="$ARGS $DIR";;
+ showcommands | snod | dist | *=*) ARGS="$ARGS $DIR";;
GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;;
- *) echo "No Android.mk in $DIR."; return 1;;
+ *) if [ -d $DIR ]; then
+ echo "No Android.mk in $DIR.";
+ else
+ echo "Couldn't locate the directory $DIR";
+ fi
+ return 1;;
esac
fi
done
return 1
fi
local MY_PWD=`PWD= /bin/pwd|sed 's:'$T'/::'`
- $DRV make -C $T -f build/core/main.mk $@ all_modules BUILD_MODULES_IN_PATHS="$MY_PWD"
+ local MODULES_IN_PATHS=MODULES-IN-$MY_PWD
+ # Convert "/" to "-".
+ MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
+ $DRV make -C $T -f build/core/main.mk $@ $MODULES_IN_PATHS
fi
}
local T=$(gettop)
local DRV=$(getdriver $T)
if [ "$T" ]; then
- local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
- local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
+ if [ "$(__detect_shell)" = "zsh" ]; then
+ set -lA DASH_ARGS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
+ set -lA DIRS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
+ else
+ local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
+ local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
+ fi
local MY_PWD=`PWD= /bin/pwd`
if [ "$MY_PWD" = "$T" ]; then
MY_PWD=
MY_PWD=`echo $MY_PWD|sed 's:'$T'/::'`
fi
local DIR=
- local MODULE_PATHS=
+ local MODULES_IN_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"
+ # Remove the leading ./ and trailing / if any exists.
+ DIR=${DIR#./}
+ DIR=${DIR%/}
+ if [ "$MY_PWD" != "" ]; then
+ DIR=$MY_PWD/$DIR
fi
+ MODULES_IN_PATHS="$MODULES_IN_PATHS MODULES-IN-$DIR"
else
case $DIR in
- showcommands | snod | dist | incrementaljavac | *=*) ARGS="$ARGS $DIR";;
+ showcommands | snod | dist | *=*) ARGS="$ARGS $DIR";;
*) echo "Couldn't find directory $DIR"; return 1;;
esac
fi
done
- $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS all_modules BUILD_MODULES_IN_PATHS="$MODULE_PATHS"
+ # Convert "/" to "-".
+ MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
+ $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS $MODULES_IN_PATHS
else
echo "Couldn't locate the top of the tree. Try setting TOP."
return 1
fi
}
+function cout()
+{
+ if [ "$OUT" ]; then
+ cd $OUT
+ else
+ echo "Couldn't locate out directory. Try setting OUT."
+ fi
+}
+
function cproj()
{
TOPFILE=build/core/envsetup.mk
append='$'
shift
elif [ "$1" = "--help" -o "$1" = "-h" ]; then
- echo "usage: qpid [[--exact] <process name|pid>"
- return 255
- fi
+ echo "usage: qpid [[--exact] <process name|pid>"
+ return 255
+ fi
local EXE="$1"
if [ "$EXE" ] ; then
- qpid | \grep "$prepend$EXE$append"
- else
- adb shell ps \
- | tr -d '\r' \
- | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/'
- fi
+ qpid | \grep "$prepend$EXE$append"
+ else
+ adb shell ps \
+ | tr -d '\r' \
+ | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/'
+ fi
}
function pid()
echo "$PID"
else
echo "usage: pid [--exact] <process name>"
- return 255
+ return 255
fi
}
function coredump_setup()
{
- echo "Getting root...";
- adb root;
- adb wait-for-device;
+ 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;
- adb shell mount -t tmpfs tmpfs /cores;
- adb shell chmod 0777 /cores;
+ echo "Remounting root partition read-write...";
+ adb shell mount -w -o remount -t rootfs rootfs;
+ sleep 1;
+ adb wait-for-device;
+ adb shell mkdir -p /cores;
+ adb shell mount -t tmpfs tmpfs /cores;
+ adb shell chmod 0777 /cores;
- echo "Granting SELinux permission to dump in /cores...";
- adb shell restorecon -R /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 "Set core pattern.";
+ adb shell 'echo /cores/core.%p > /proc/sys/kernel/core_pattern';
- echo "Done."
+ echo "Done."
}
# coredump_enable - enable core dumps for the specified process
function coredump_enable()
{
- 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
+ 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
function core()
{
- local PID=$1;
+ local PID=$1;
- if [ -z "$PID" ]; then
- printf "Expecting a PID!\n";
- return;
- fi;
+ if [ -z "$PID" ]; then
+ printf "Expecting a PID!\n";
+ return;
+ fi;
- local CORENAME=core.$PID;
- local COREPATH=/cores/$CORENAME;
- local SIG=SEGV;
+ local CORENAME=core.$PID;
+ local COREPATH=/cores/$CORENAME;
+ local SIG=SEGV;
- coredump_enable $1;
+ coredump_enable $1;
- 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;
+ 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.";
+ adb shell "while [ ! -f $COREPATH ] ; do echo waiting for $COREPATH to be generated; sleep 1; done"
+ echo "Done: core is under $COREPATH on device.";
}
# systemstack - dump the current stack trace of all threads in the system process
fi
}
+function dddclient()
+{
+ local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT)
+ local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED)
+ local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED)
+ local OUT_VENDOR_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_VENDOR_SHARED_LIBRARIES_UNSTRIPPED)
+ local OUT_EXE_SYMBOLS=$(get_symbols_directory)
+ local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS)
+ local ARCH=$(get_build_var TARGET_ARCH)
+ local GDB
+ case "$ARCH" in
+ arm) GDB=arm-linux-androideabi-gdb;;
+ arm64) GDB=arm-linux-androideabi-gdb; GDB64=aarch64-linux-android-gdb;;
+ mips|mips64) GDB=mips64el-linux-android-gdb;;
+ x86) GDB=x86_64-linux-android-gdb;;
+ x86_64) GDB=x86_64-linux-android-gdb;;
+ *) echo "Unknown arch $ARCH"; return 1;;
+ esac
+
+ if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then
+ local EXE="$1"
+ if [ "$EXE" ] ; then
+ EXE=$1
+ if [[ $EXE =~ ^[^/].* ]] ; then
+ EXE="system/bin/"$EXE
+ fi
+ else
+ EXE="app_process"
+ fi
+
+ local PORT="$2"
+ if [ "$PORT" ] ; then
+ PORT=$2
+ else
+ PORT=":5039"
+ fi
+
+ local PID="$3"
+ if [ "$PID" ] ; then
+ if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
+ PID=`pid $3`
+ if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
+ # that likely didn't work because of returning multiple processes
+ # try again, filtering by root processes (don't contain colon)
+ PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'`
+ if [[ ! "$PID" =~ ^[0-9]+$ ]]
+ then
+ echo "Couldn't resolve '$3' to single PID"
+ return 1
+ else
+ echo ""
+ echo "WARNING: multiple processes matching '$3' observed, using root process"
+ echo ""
+ fi
+ fi
+ fi
+ adb forward "tcp$PORT" "tcp$PORT"
+ local USE64BIT="$(is64bit $PID)"
+ adb shell gdbserver$USE64BIT $PORT --attach $PID &
+ sleep 2
+ else
+ echo ""
+ echo "If you haven't done so already, do this first on the device:"
+ echo " gdbserver $PORT /system/bin/$EXE"
+ echo " or"
+ echo " gdbserver $PORT --attach <PID>"
+ echo ""
+ fi
+
+ OUT_SO_SYMBOLS=$OUT_SO_SYMBOLS$USE64BIT
+ OUT_VENDOR_SO_SYMBOLS=$OUT_VENDOR_SO_SYMBOLS$USE64BIT
+
+ echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS"
+ echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl"
+ echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb"
+ echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT"
+ # Enable special debugging for ART processes.
+ if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then
+ echo >> "$OUT_ROOT/gdbclient.cmds" "art-on"
+ fi
+ echo >>"$OUT_ROOT/gdbclient.cmds" ""
+
+ local WHICH_GDB=
+ # 64-bit exe found
+ if [ "$USE64BIT" != "" ] ; then
+ WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB64
+ # 32-bit exe / 32-bit platform
+ elif [ "$(get_build_var TARGET_2ND_ARCH)" = "" ]; then
+ WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB
+ # 32-bit exe / 64-bit platform
+ else
+ WHICH_GDB=$ANDROID_TOOLCHAIN_2ND_ARCH/$GDB
+ fi
+
+ ddd --debugger $WHICH_GDB -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE"
+ else
+ echo "Unable to determine build system output dir."
+ fi
+}
+
case `uname -s` in
Darwin)
function sgrep()
{
- 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 "$@"
+ find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl|vts)' \
+ -exec grep --color -n "$@" {} +
}
;;
*)
function sgrep()
{
- 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 "$@"
+ find . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\|vts\)' \
+ -exec grep --color -n "$@" {} +
}
;;
esac
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 "$@"
+ find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.gradle" \
+ -exec grep --color -n "$@" {} +
}
function jgrep()
{
- find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@"
+ find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" \
+ -exec grep --color -n "$@" {} +
}
function cgrep()
{
- 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 "$@"
+ 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' \) \
+ -exec grep --color -n "$@" {} +
}
function resgrep()
{
- 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;
+ 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' -exec grep --color -n "$@" {} +
+ done
}
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 "$@"
+ find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' \
+ -exec grep --color -n "$@" {} +
}
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 "$@"
+ find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -name sepolicy -type d \
+ -exec grep --color -n -r --exclude-dir=\.git "$@" {} +
}
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 "$@"
+ find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.rc*" \
+ -exec grep --color -n "$@" {} +
}
case `uname -s` in
Darwin)
function mgrep()
{
- 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 "$@"
+ find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' \
+ -exec grep --color -n "$@" {} +
}
function treegrep()
{
- 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 "$@"
+ find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cpp|S|java|xml)' \
+ -exec grep --color -n -i "$@" {} +
}
;;
*)
function mgrep()
{
- 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 "$@"
+ find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f \
+ -exec grep --color -n "$@" {} +
}
function treegrep()
{
- 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 "$@"
+ find . -name .repo -prune -o -name .git -prune -o -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f \
+ -exec grep --color -n -i "$@" {} +
}
;;
\cd $T/$pathname
}
-# Force JAVA_HOME to point to java 1.7 if it isn't already set.
-#
-# 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.
+function cmremote()
+{
+ if ! git rev-parse --git-dir &> /dev/null
+ then
+ echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up."
+ return 1
+ fi
+ git remote rm cmremote 2> /dev/null
+ GERRIT_REMOTE=$(git config --get remote.github.projectname)
+ CMUSER=$(git config --get review.review.cyanogenmod.org.username)
+ if [ -z "$CMUSER" ]
+ then
+ git remote add cmremote ssh://review.cyanogenmod.org:29418/$GERRIT_REMOTE
+ else
+ git remote add cmremote ssh://$CMUSER@review.cyanogenmod.org:29418/$GERRIT_REMOTE
+ fi
+ echo "Remote 'cmremote' created"
+}
+
+function aospremote()
+{
+ if ! git rev-parse --git-dir &> /dev/null
+ then
+ echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up."
+ return 1
+ fi
+ git remote rm aosp 2> /dev/null
+ PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##")
+ if (echo $PROJECT | grep -qv "^device")
+ then
+ PFX="platform/"
+ fi
+ git remote add aosp https://android.googlesource.com/$PFX$PROJECT
+ echo "Remote 'aosp' created"
+}
+
+function cafremote()
+{
+ if ! git rev-parse --git-dir &> /dev/null
+ then
+ echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up."
+ return 1
+ fi
+ git remote rm caf 2> /dev/null
+ PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##")
+ if (echo $PROJECT | grep -qv "^device")
+ then
+ PFX="platform/"
+ fi
+ git remote add caf git://codeaurora.org/$PFX$PROJECT
+ echo "Remote 'caf' created"
+}
+
+function installboot()
+{
+ if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ];
+ then
+ echo "No recovery.fstab found. Build recovery first."
+ return 1
+ fi
+ if [ ! -e "$OUT/boot.img" ];
+ then
+ echo "No boot.img found. Run make bootimage first."
+ return 1
+ fi
+ PARTITION=`grep "^\/boot" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}`
+ if [ -z "$PARTITION" ];
+ then
+ # Try for RECOVERY_FSTAB_VERSION = 2
+ PARTITION=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}`
+ PARTITION_TYPE=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}`
+ if [ -z "$PARTITION" ];
+ then
+ echo "Unable to determine boot partition."
+ return 1
+ fi
+ fi
+ adb start-server
+ adb wait-for-online
+ adb root
+ sleep 1
+ adb wait-for-online shell mount /system 2>&1 > /dev/null
+ adb wait-for-online remount
+ if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD");
+ then
+ adb push $OUT/boot.img /cache/
+ for i in $OUT/system/lib/modules/*;
+ do
+ adb push $i /system/lib/modules/
+ done
+ adb shell dd if=/cache/boot.img of=$PARTITION
+ adb shell chmod 644 /system/lib/modules/*
+ echo "Installation complete."
+ else
+ echo "The connected device does not appear to be $CM_BUILD, run away!"
+ fi
+}
+
+function installrecovery()
+{
+ if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ];
+ then
+ echo "No recovery.fstab found. Build recovery first."
+ return 1
+ fi
+ if [ ! -e "$OUT/recovery.img" ];
+ then
+ echo "No recovery.img found. Run make recoveryimage first."
+ return 1
+ fi
+ PARTITION=`grep "^\/recovery" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}`
+ if [ -z "$PARTITION" ];
+ then
+ # Try for RECOVERY_FSTAB_VERSION = 2
+ PARTITION=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}`
+ PARTITION_TYPE=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}`
+ if [ -z "$PARTITION" ];
+ then
+ echo "Unable to determine recovery partition."
+ return 1
+ fi
+ fi
+ adb start-server
+ adb wait-for-online
+ adb root
+ sleep 1
+ adb wait-for-online shell mount /system 2>&1 >> /dev/null
+ adb wait-for-online remount
+ if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD");
+ then
+ adb push $OUT/recovery.img /cache/
+ adb shell dd if=/cache/recovery.img of=$PARTITION
+ echo "Installation complete."
+ else
+ echo "The connected device does not appear to be $CM_BUILD, run away!"
+ fi
+}
+
+function makerecipe() {
+ if [ -z "$1" ]
+ then
+ echo "No branch name provided."
+ return 1
+ fi
+ cd android
+ sed -i s/'default revision=.*'/'default revision="refs\/heads\/'$1'"'/ default.xml
+ git commit -a -m "$1"
+ cd ..
+
+ repo forall -c '
+
+ if [ "$REPO_REMOTE" = "github" ]
+ then
+ pwd
+ cmremote
+ git push cmremote HEAD:refs/heads/'$1'
+ fi
+ '
+}
+
+function cmgerrit() {
+
+ if [ "$(__detect_shell)" = "zsh" ]; then
+ # zsh does not define FUNCNAME, derive from funcstack
+ local FUNCNAME=$funcstack[1]
+ fi
+
+ if [ $# -eq 0 ]; then
+ $FUNCNAME help
+ return 1
+ fi
+ local user=`git config --get review.review.cyanogenmod.org.username`
+ local review=`git config --get remote.github.review`
+ local project=`git config --get remote.github.projectname`
+ local command=$1
+ shift
+ case $command in
+ help)
+ if [ $# -eq 0 ]; then
+ cat <<EOF
+Usage:
+ $FUNCNAME COMMAND [OPTIONS] [CHANGE-ID[/PATCH-SET]][{@|^|~|:}ARG] [-- ARGS]
+
+Commands:
+ fetch Just fetch the change as FETCH_HEAD
+ help Show this help, or for a specific command
+ pull Pull a change into current branch
+ push Push HEAD or a local branch to Gerrit for a specific branch
+
+Any other Git commands that support refname would work as:
+ git fetch URL CHANGE && git COMMAND OPTIONS FETCH_HEAD{@|^|~|:}ARG -- ARGS
+
+See '$FUNCNAME help COMMAND' for more information on a specific command.
+
+Example:
+ $FUNCNAME checkout -b topic 1234/5
+works as:
+ git fetch http://DOMAIN/p/PROJECT refs/changes/34/1234/5 \\
+ && git checkout -b topic FETCH_HEAD
+will checkout a new branch 'topic' base on patch-set 5 of change 1234.
+Patch-set 1 will be fetched if omitted.
+EOF
+ return
+ fi
+ case $1 in
+ __cmg_*) echo "For internal use only." ;;
+ changes|for)
+ if [ "$FUNCNAME" = "cmgerrit" ]; then
+ echo "'$FUNCNAME $1' is deprecated."
+ fi
+ ;;
+ help) $FUNCNAME help ;;
+ fetch|pull) cat <<EOF
+usage: $FUNCNAME $1 [OPTIONS] CHANGE-ID[/PATCH-SET]
+
+works as:
+ git $1 OPTIONS http://DOMAIN/p/PROJECT \\
+ refs/changes/HASH/CHANGE-ID/{PATCH-SET|1}
+
+Example:
+ $FUNCNAME $1 1234
+will $1 patch-set 1 of change 1234
+EOF
+ ;;
+ push) cat <<EOF
+usage: $FUNCNAME push [OPTIONS] [LOCAL_BRANCH:]REMOTE_BRANCH
+
+works as:
+ git push OPTIONS ssh://USER@DOMAIN:29418/PROJECT \\
+ {LOCAL_BRANCH|HEAD}:refs/for/REMOTE_BRANCH
+
+Example:
+ $FUNCNAME push fix6789:gingerbread
+will push local branch 'fix6789' to Gerrit for branch 'gingerbread'.
+HEAD will be pushed from local if omitted.
+EOF
+ ;;
+ *)
+ $FUNCNAME __cmg_err_not_supported $1 && return
+ cat <<EOF
+usage: $FUNCNAME $1 [OPTIONS] CHANGE-ID[/PATCH-SET][{@|^|~|:}ARG] [-- ARGS]
+
+works as:
+ git fetch http://DOMAIN/p/PROJECT \\
+ refs/changes/HASH/CHANGE-ID/{PATCH-SET|1} \\
+ && git $1 OPTIONS FETCH_HEAD{@|^|~|:}ARG -- ARGS
+EOF
+ ;;
+ esac
+ ;;
+ __cmg_get_ref)
+ $FUNCNAME __cmg_err_no_arg $command $# && return 1
+ local change_id patchset_id hash
+ case $1 in
+ */*)
+ change_id=${1%%/*}
+ patchset_id=${1#*/}
+ ;;
+ *)
+ change_id=$1
+ patchset_id=1
+ ;;
+ esac
+ hash=$(($change_id % 100))
+ case $hash in
+ [0-9]) hash="0$hash" ;;
+ esac
+ echo "refs/changes/$hash/$change_id/$patchset_id"
+ ;;
+ fetch|pull)
+ $FUNCNAME __cmg_err_no_arg $command $# help && return 1
+ $FUNCNAME __cmg_err_not_repo && return 1
+ local change=$1
+ shift
+ git $command $@ http://$review/p/$project \
+ $($FUNCNAME __cmg_get_ref $change) || return 1
+ ;;
+ push)
+ $FUNCNAME __cmg_err_no_arg $command $# help && return 1
+ $FUNCNAME __cmg_err_not_repo && return 1
+ if [ -z "$user" ]; then
+ echo >&2 "Gerrit username not found."
+ return 1
+ fi
+ local local_branch remote_branch
+ case $1 in
+ *:*)
+ local_branch=${1%:*}
+ remote_branch=${1##*:}
+ ;;
+ *)
+ local_branch=HEAD
+ remote_branch=$1
+ ;;
+ esac
+ shift
+ git push $@ ssh://$user@$review:29418/$project \
+ $local_branch:refs/for/$remote_branch || return 1
+ ;;
+ changes|for)
+ if [ "$FUNCNAME" = "cmgerrit" ]; then
+ echo >&2 "'$FUNCNAME $command' is deprecated."
+ fi
+ ;;
+ __cmg_err_no_arg)
+ if [ $# -lt 2 ]; then
+ echo >&2 "'$FUNCNAME $command' missing argument."
+ elif [ $2 -eq 0 ]; then
+ if [ -n "$3" ]; then
+ $FUNCNAME help $1
+ else
+ echo >&2 "'$FUNCNAME $1' missing argument."
+ fi
+ else
+ return 1
+ fi
+ ;;
+ __cmg_err_not_repo)
+ if [ -z "$review" -o -z "$project" ]; then
+ echo >&2 "Not currently in any reviewable repository."
+ else
+ return 1
+ fi
+ ;;
+ __cmg_err_not_supported)
+ $FUNCNAME __cmg_err_no_arg $command $# && return
+ case $1 in
+ #TODO: filter more git commands that don't use refname
+ init|add|rm|mv|status|clone|remote|bisect|config|stash)
+ echo >&2 "'$FUNCNAME $1' is not supported."
+ ;;
+ *) return 1 ;;
+ esac
+ ;;
+ #TODO: other special cases?
+ *)
+ $FUNCNAME __cmg_err_not_supported $command && return 1
+ $FUNCNAME __cmg_err_no_arg $command $# help && return 1
+ $FUNCNAME __cmg_err_not_repo && return 1
+ local args="$@"
+ local change pre_args refs_arg post_args
+ case "$args" in
+ *--\ *)
+ pre_args=${args%%-- *}
+ post_args="-- ${args#*-- }"
+ ;;
+ *) pre_args="$args" ;;
+ esac
+ args=($pre_args)
+ pre_args=
+ if [ ${#args[@]} -gt 0 ]; then
+ change=${args[${#args[@]}-1]}
+ fi
+ if [ ${#args[@]} -gt 1 ]; then
+ pre_args=${args[0]}
+ for ((i=1; i<${#args[@]}-1; i++)); do
+ pre_args="$pre_args ${args[$i]}"
+ done
+ fi
+ while ((1)); do
+ case $change in
+ ""|--)
+ $FUNCNAME help $command
+ return 1
+ ;;
+ *@*)
+ if [ -z "$refs_arg" ]; then
+ refs_arg="@${change#*@}"
+ change=${change%%@*}
+ fi
+ ;;
+ *~*)
+ if [ -z "$refs_arg" ]; then
+ refs_arg="~${change#*~}"
+ change=${change%%~*}
+ fi
+ ;;
+ *^*)
+ if [ -z "$refs_arg" ]; then
+ refs_arg="^${change#*^}"
+ change=${change%%^*}
+ fi
+ ;;
+ *:*)
+ if [ -z "$refs_arg" ]; then
+ refs_arg=":${change#*:}"
+ change=${change%%:*}
+ fi
+ ;;
+ *) break ;;
+ esac
+ done
+ $FUNCNAME fetch $change \
+ && git $command $pre_args FETCH_HEAD$refs_arg $post_args \
+ || return 1
+ ;;
+ esac
+}
+
+function cmrebase() {
+ local repo=$1
+ local refs=$2
+ local pwd="$(pwd)"
+ local dir="$(gettop)/$repo"
+
+ if [ -z $repo ] || [ -z $refs ]; then
+ echo "CyanogenMod Gerrit Rebase Usage: "
+ echo " cmrebase <path to project> <patch IDs on Gerrit>"
+ echo " The patch IDs appear on the Gerrit commands that are offered."
+ echo " They consist on a series of numbers and slashes, after the text"
+ echo " refs/changes. For example, the ID in the following command is 26/8126/2"
+ echo ""
+ echo " git[...]ges_apps_Camera refs/changes/26/8126/2 && git cherry-pick FETCH_HEAD"
+ echo ""
+ return
+ fi
+
+ if [ ! -d $dir ]; then
+ echo "Directory $dir doesn't exist in tree."
+ return
+ fi
+ cd $dir
+ repo=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g)
+ echo "Starting branch..."
+ repo start tmprebase .
+ echo "Bringing it up to date..."
+ repo sync .
+ echo "Fetching change..."
+ git fetch "http://review.cyanogenmod.org/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD
+ if [ "$?" != "0" ]; then
+ echo "Error cherry-picking. Not uploading!"
+ return
+ fi
+ echo "Uploading..."
+ repo upload .
+ echo "Cleaning up..."
+ repo abandon tmprebase .
+ cd $pwd
+}
+
+function mka() {
+ local T=$(gettop)
+ if [ "$T" ]; then
+ case `uname -s` in
+ Darwin)
+ make -C $T -j `sysctl hw.ncpu|cut -d" " -f2` "$@"
+ ;;
+ *)
+ mk_timer schedtool -B -n 1 -e ionice -n 1 make -C $T -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@"
+ ;;
+ esac
+
+ else
+ echo "Couldn't locate the top of the tree. Try setting TOP."
+ fi
+}
+
+function cmka() {
+ if [ ! -z "$1" ]; then
+ for i in "$@"; do
+ case $i in
+ bacon|otapackage|systemimage)
+ mka installclean
+ mka $i
+ ;;
+ *)
+ mka clean-$i
+ mka $i
+ ;;
+ esac
+ done
+ else
+ mka clean
+ mka
+ fi
+}
+
+function mms() {
+ local T=$(gettop)
+ if [ -z "$T" ]
+ then
+ echo "Couldn't locate the top of the tree. Try setting TOP."
+ return 1
+ fi
+
+ case `uname -s` in
+ Darwin)
+ local NUM_CPUS=$(sysctl hw.ncpu|cut -d" " -f2)
+ ONE_SHOT_MAKEFILE="__none__" \
+ make -C $T -j $NUM_CPUS "$@"
+ ;;
+ *)
+ local NUM_CPUS=$(cat /proc/cpuinfo | grep "^processor" | wc -l)
+ ONE_SHOT_MAKEFILE="__none__" \
+ mk_timer schedtool -B -n 1 -e ionice -n 1 \
+ make -C $T -j $NUM_CPUS "$@"
+ ;;
+ esac
+}
+
+
+function repolastsync() {
+ RLSPATH="$ANDROID_BUILD_TOP/.repo/.repo_fetchtimes.json"
+ RLSLOCAL=$(date -d "$(stat -c %z $RLSPATH)" +"%e %b %Y, %T %Z")
+ RLSUTC=$(date -d "$(stat -c %z $RLSPATH)" -u +"%e %b %Y, %T %Z")
+ echo "Last repo sync: $RLSLOCAL / $RLSUTC"
+}
+
+function reposync() {
+ case `uname -s` in
+ Darwin)
+ repo sync -j 4 "$@"
+ ;;
+ *)
+ schedtool -B -n 1 -e ionice -n 1 `which repo` sync -j 4 "$@"
+ ;;
+ esac
+}
+
+function repodiff() {
+ if [ -z "$*" ]; then
+ echo "Usage: repodiff <ref-from> [[ref-to] [--numstat]]"
+ return
+ fi
+ diffopts=$* repo forall -c \
+ 'echo "$REPO_PATH ($REPO_REMOTE)"; git diff ${diffopts} 2>/dev/null ;'
+}
+
+# Return success if adb is up and not in recovery
+function _adb_connected {
+ {
+ if [[ "$(adb get-state)" == device &&
+ "$(adb shell test -e /sbin/recovery; echo $?)" == 0 ]]
+ then
+ return 0
+ fi
+ } 2>/dev/null
+
+ return 1
+};
+
+# Credit for color strip sed: http://goo.gl/BoIcm
+function dopush()
+{
+ local func=$1
+ shift
+
+ adb start-server # Prevent unexpected starting server message from adb get-state in the next line
+ if ! _adb_connected; then
+ echo "No device is online. Waiting for one..."
+ echo "Please connect USB and/or enable USB debugging"
+ until _adb_connected; do
+ sleep 1
+ done
+ echo "Device Found."
+ fi
+
+ if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD") || [ "$FORCE_PUSH" = "true" ];
+ then
+ # retrieve IP and PORT info if we're using a TCP connection
+ TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \
+ | head -1 | awk '{print $1}')
+ adb root &> /dev/null
+ sleep 0.3
+ if [ -n "$TCPIPPORT" ]
+ then
+ # adb root just killed our connection
+ # so reconnect...
+ adb connect "$TCPIPPORT"
+ fi
+ adb wait-for-device &> /dev/null
+ sleep 0.3
+ adb remount &> /dev/null
+
+ mkdir -p $OUT
+ ($func $*|tee $OUT/.log;return ${PIPESTATUS[0]})
+ ret=$?;
+ if [ $ret -ne 0 ]; then
+ rm -f $OUT/.log;return $ret
+ fi
+
+ # Install: <file>
+ if [ `uname` = "Linux" ]; then
+ LOC="$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Install: ' | cut -d ':' -f 2)"
+ else
+ LOC="$(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Install: ' | cut -d ':' -f 2)"
+ fi
+
+ # Copy: <file>
+ if [ `uname` = "Linux" ]; then
+ LOC="$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Copy: ' | cut -d ':' -f 2)"
+ else
+ LOC="$LOC $(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Copy: ' | cut -d ':' -f 2)"
+ fi
+
+ # If any files are going to /data, push an octal file permissions reader to device
+ if [ -n "$(echo $LOC | egrep '(^|\s)/data')" ]; then
+ CHKPERM="/data/local/tmp/chkfileperm.sh"
+(
+cat <<'EOF'
+#!/system/xbin/sh
+FILE=$@
+if [ -e $FILE ]; then
+ ls -l $FILE | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' | cut -d ' ' -f1
+fi
+EOF
+) > $OUT/.chkfileperm.sh
+ echo "Pushing file permissions checker to device"
+ adb push $OUT/.chkfileperm.sh $CHKPERM
+ adb shell chmod 755 $CHKPERM
+ rm -f $OUT/.chkfileperm.sh
+ fi
+
+ stop_n_start=false
+ for FILE in $(echo $LOC | tr " " "\n"); do
+ # Make sure file is in $OUT/system or $OUT/data
+ case $FILE in
+ $OUT/system/*|$OUT/data/*)
+ # Get target file name (i.e. /system/bin/adb)
+ TARGET=$(echo $FILE | sed "s#$OUT##")
+ ;;
+ *) continue ;;
+ esac
+
+ case $TARGET in
+ /data/*)
+ # fs_config only sets permissions and se labels for files pushed to /system
+ if [ -n "$CHKPERM" ]; then
+ OLDPERM=$(adb shell $CHKPERM $TARGET)
+ OLDPERM=$(echo $OLDPERM | tr -d '\r' | tr -d '\n')
+ OLDOWN=$(adb shell ls -al $TARGET | awk '{print $2}')
+ OLDGRP=$(adb shell ls -al $TARGET | awk '{print $3}')
+ fi
+ echo "Pushing: $TARGET"
+ adb push $FILE $TARGET
+ if [ -n "$OLDPERM" ]; then
+ echo "Setting file permissions: $OLDPERM, $OLDOWN":"$OLDGRP"
+ adb shell chown "$OLDOWN":"$OLDGRP" $TARGET
+ adb shell chmod "$OLDPERM" $TARGET
+ else
+ echo "$TARGET did not exist previously, you should set file permissions manually"
+ fi
+ adb shell restorecon "$TARGET"
+ ;;
+ /system/priv-app/SystemUI/SystemUI.apk|/system/framework/*)
+ # Only need to stop services once
+ if ! $stop_n_start; then
+ adb shell stop
+ stop_n_start=true
+ fi
+ echo "Pushing: $TARGET"
+ adb push $FILE $TARGET
+ ;;
+ *)
+ echo "Pushing: $TARGET"
+ adb push $FILE $TARGET
+ ;;
+ esac
+ done
+ if [ -n "$CHKPERM" ]; then
+ adb shell rm $CHKPERM
+ fi
+ if $stop_n_start; then
+ adb shell start
+ fi
+ rm -f $OUT/.log
+ return 0
+ else
+ echo "The connected device does not appear to be $CM_BUILD, run away!"
+ fi
+}
+
+alias mmp='dopush mm'
+alias mmmp='dopush mmm'
+alias mmap='dopush mma'
+alias mkap='dopush mka'
+alias cmkap='dopush cmka'
+
+function repopick() {
+ T=$(gettop)
+ $T/build/tools/repopick.py $@
+}
+
+function fixup_common_out_dir() {
+ common_out_dir=$(get_build_var OUT_DIR)/target/common
+ target_device=$(get_build_var TARGET_DEVICE)
+ if [ ! -z $CM_FIXUP_COMMON_OUT ]; then
+ if [ -d ${common_out_dir} ] && [ ! -L ${common_out_dir} ]; then
+ mv ${common_out_dir} ${common_out_dir}-${target_device}
+ ln -s ${common_out_dir}-${target_device} ${common_out_dir}
+ else
+ [ -L ${common_out_dir} ] && rm ${common_out_dir}
+ mkdir -p ${common_out_dir}-${target_device}
+ ln -s ${common_out_dir}-${target_device} ${common_out_dir}
+ fi
+ else
+ [ -L ${common_out_dir} ] && rm ${common_out_dir}
+ mkdir -p ${common_out_dir}
+ fi
+}
+
+# Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set.
function set_java_home() {
# Clear the existing JAVA_HOME value if we set it ourselves, so that
# we can reset it later, depending on the version of java the build
fi
if [ ! "$JAVA_HOME" ]; then
- 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
+ if [ -n "$LEGACY_USE_JAVA7" ]; then
+ echo Warning: Support for JDK 7 will be dropped. Switch to JDK 8.
+ 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
+ else
+ case `uname -s` in
+ Darwin)
+ export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
+ ;;
+ *)
+ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
+ ;;
+ esac
+ fi
# Keep track of the fact that we set JAVA_HOME ourselves, so that
# we can change it on the next envsetup.sh, if required.
local retval=$?
if [ $retval -ne 0 ]
then
- echo -e "\e[0;31mFAILURE\e[00m"
+ echo $'\E'"[0;31mFAILURE\e[00m"
else
- echo -e "\e[0;32mSUCCESS\e[00m"
+ echo $'\E'"[0;32mSUCCESS\e[00m"
fi
return $retval
}
echo command make
}
-function make()
+function mk_timer()
{
local start_time=$(date +"%s")
- $(get_make_command) "$@"
+ $@
local ret=$?
local end_time=$(date +"%s")
local tdiff=$(($end_time-$start_time))
local secs=$(($tdiff % 60))
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"
+ color_failed=$'\E'"[0;31m"
+ color_success=$'\E'"[0;32m"
+ color_reset=$'\E'"[00m"
else
color_failed=""
color_success=""
fi
echo
if [ $ret -eq 0 ] ; then
- echo -n -e "${color_success}#### make completed successfully "
+ echo -n "${color_success}#### make completed successfully "
else
- echo -n -e "${color_failed}#### make failed to build some targets "
+ echo -n "${color_failed}#### make failed to build some targets "
fi
if [ $hours -gt 0 ] ; then
printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs
elif [ $secs -gt 0 ] ; then
printf "(%s seconds)" $secs
fi
- echo -e " ####${color_reset}"
+ echo " ####${color_reset}"
echo
return $ret
}
-if [ "x$SHELL" != "x/bin/bash" ]; then
+function provision()
+{
+ if [ ! "$ANDROID_PRODUCT_OUT" ]; then
+ echo "Couldn't locate output files. Try running 'lunch' first." >&2
+ return 1
+ fi
+ if [ ! -e "$ANDROID_PRODUCT_OUT/provision-device" ]; then
+ echo "There is no provisioning script for the device." >&2
+ return 1
+ fi
+
+ # Check if user really wants to do this.
+ if [ "$1" = "--no-confirmation" ]; then
+ shift 1
+ else
+ echo "This action will reflash your device."
+ echo ""
+ echo "ALL DATA ON THE DEVICE WILL BE IRREVOCABLY ERASED."
+ echo ""
+ echo -n "Are you sure you want to do this (yes/no)? "
+ read
+ if [[ "${REPLY}" != "yes" ]] ; then
+ echo "Not taking any action. Exiting." >&2
+ return 1
+ fi
+ fi
+ "$ANDROID_PRODUCT_OUT/provision-device" "$@"
+}
+
+function make()
+{
+ mk_timer $(get_make_command) "$@"
+}
+
+function __detect_shell() {
case `ps -o command -p $$` in
*bash*)
+ echo bash
+ ;;
+ *zsh*)
+ echo zsh
;;
*)
- echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results"
+ echo unknown
+ return 1
;;
esac
+ return
+}
+
+
+if ! __detect_shell > /dev/null; then
+ echo "WARNING: Only bash and zsh are supported, use of other shell may lead to erroneous results"
fi
# Execute the contents of any vendorsetup.sh files we can find.
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`
+ `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
+ `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
do
echo "including $f"
. $f
done
unset f
-addcompletions
+# Add completions
+check_bash_version && {
+ dirs="sdk/bash_completion vendor/cm/bash_completion"
+ for dir in $dirs; do
+ if [ -d ${dir} ]; then
+ for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do
+ echo "including $f"
+ . $f
+ done
+ fi
+ done
+}
+
+export ANDROID_BUILD_TOP=$(gettop)