選單
#!/bin/bash
set -o errexit
usage() {
cat <<USAGE
Usage:
bash $0 <TARGET_PRODUCT> [OPTIONS]
Description:
Builds Android tree for given TARGET_PRODUCT
OPTIONS:
-c, --clean_build
Clean build - build from scratch by removing entire out dir
-d, --debug
Enable debugging - captures all commands while doing the build
-h, --help
Display this help message
-i, --image
Specify image to be build/re-build (bootimg/sysimg/usrimg)
-j, --jobs
Specifies the number of jobs to run simultaneously (Default: 8)
-k, --kernel_defconf
Specify defconf file to be used for compiling Kernel
-l, --log_file
Log file to store build logs (Default: <TARGET_PRODUCT>.log)
-m, --module
Module to be build
-p, --project
Project to be build
-s, --setup_ccache
Set CCACHE for faster incremental builds (true/false - Default: true)
-u, --update-api
Update APIs
-v, --build_variant
Build variant (Default: userdebug)
USAGE
}
clean_build() {
echo -e "\nINFO: Removing entire out dir. . .\n"
make clobber
}
build_android() {
echo -e "\nINFO: Build Android tree for $TARGET\n"
make $@ | tee $LOG_FILE.log
}
build_bootimg() {
echo -e "\nINFO: Build bootimage for $TARGET\n"
make bootimage $@ | tee $LOG_FILE.log
}
build_sysimg() {
echo -e "\nINFO: Build systemimage for $TARGET\n"
make systemimage $@ | tee $LOG_FILE.log
}
build_usrimg() {
echo -e "\nINFO: Build userdataimage for $TARGET\n"
make userdataimage $@ | tee $LOG_FILE.log
}
build_module() {
echo -e "\nINFO: Build $MODULE for $TARGET\n"
make $MODULE $@ | tee $LOG_FILE.log
}
build_project() {
echo -e "\nINFO: Build $PROJECT for $TARGET\n"
mmm $PROJECT | tee $LOG_FILE.log
}
update_api() {
echo -e "\nINFO: Updating APIs\n"
make update-api | tee $LOG_FILE.log
}
setup_ccache() {
export CCACHE_DIR=../.ccache
export USE_CCACHE=1
}
delete_ccache() {
prebuilts/misc/linux-x86/ccache/ccache -C
rm -rf $CCACHE_DIR
}
create_ccache() {
echo -e "\nINFO: Setting CCACHE with 10 GB\n"
setup_ccache
delete_ccache
prebuilts/misc/linux-x86/ccache/ccache -M 10G
}
# Set defaults
VARIANT="userdebug"
JOBS=8
CCACHE="true"
# Setup getopt.
long_opts="clean_build,debug,help,image:,jobs:,kernel_defconf:,log_file:,module:,"
long_opts+="project:,setup_ccache:,update-api,build_variant:"
getopt_cmd=$(getopt -o cdhi:j:k:l:m:p:s:uv: --long "$long_opts" \
-n $(basename $0) -- "$@") || \
{ echo -e "\nERROR: Getopt failed. Extra args\n"; usage; exit 1;}
eval set -- "$getopt_cmd"
while true; do
case "$1" in
-c|--clean_build) CLEAN_BUILD="true";;
-d|--debug) DEBUG="true";;
-h|--help) usage; exit 0;;
-i|--image) IMAGE="$2"; shift;;
-j|--jobs) JOBS="$2"; shift;;
-k|--kernel_defconf) DEFCONFIG="$2"; shift;;
-l|--log_file) LOG_FILE="$2"; shift;;
-m|--module) MODULE="$2"; shift;;
-p|--project) PROJECT="$2"; shift;;
-u|--update-api) UPDATE_API="true";;
-s|--setup_ccache) CCACHE="$2"; shift;;
-v|--build_variant) VARIANT="$2"; shift;;
--) shift; break;;
esac
shift
done
# Mandatory argument
if [ $# -eq 0 ]; then
echo -e "\nERROR: Missing mandatory argument: TARGET_PRODUCT\n"
usage
exit 1
fi
if [ $# -gt 1 ]; then
echo -e "\nERROR: Extra inputs. Need TARGET_PRODUCT only\n"
usage
exit 1
fi
TARGET="$1"; shift
if [ -z $LOG_FILE ]; then
LOG_FILE=$TARGET
fi
CMD="-j $JOBS"
if [ "$DEBUG" = "true" ]; then
CMD+=" showcommands"
fi
if [ -n "$DEFCONFIG" ]; then
CMD+=" KERNEL_DEFCONFIG=$DEFCONFIG"
fi
if [ "$CCACHE" = "true" ]; then
setup_ccache
fi
source build/envsetup.sh
lunch $TARGET-$VARIANT
if [ "$CLEAN_BUILD" = "true" ]; then
clean_build
if [ "$CCACHE" = "true" ]; then
create_ccache
fi
fi
if [ "$UPDATE_API" = "true" ]; then
update_api
fi
if [ -n "$MODULE" ]; then
build_module "$CMD"
fi
if [ -n "$PROJECT" ]; then
build_project
fi
if [ -n "$IMAGE" ]; then
build_$IMAGE "$CMD"
fi
build_android "$CMD"