dotfiles/.local/bin/dot-build.sh

241 lines
7.9 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# dotOS build helper script, credit to @AOSPA, @YumeMichi
# red = errors, cyan = warnings, green = confirmations, blue = informational
# plain for generic text, bold for titles, reset flag at each end of line
# plain blue should not be used for readability reasons - use plain cyan instead
CLR_RST=$(tput sgr0) ## reset flag
CLR_RED=$CLR_RST$(tput setaf 1) # red, plain
CLR_GRN=$CLR_RST$(tput setaf 2) # green, plain
CLR_BLU=$CLR_RST$(tput setaf 4) # blue, plain
CLR_CYA=$CLR_RST$(tput setaf 6) # cyan, plain
CLR_BLD=$(tput bold) ## bold flag
CLR_BLD_RED=$CLR_RST$CLR_BLD$(tput setaf 1) # red, bold
CLR_BLD_GRN=$CLR_RST$CLR_BLD$(tput setaf 2) # green, bold
CLR_BLD_BLU=$CLR_RST$CLR_BLD$(tput setaf 4) # blue, bold
CLR_BLD_CYA=$CLR_RST$CLR_BLD$(tput setaf 6) # cyan, bold
# Set defaults
DOT_BUILD_VARIANT="userdebug"
DOT_MOD_VERSION="v6.0"
DOT_BUILD_DATE=$(date -u +%Y%m%d-%H%M)
DOT_BUILD_TYPE="UNOFFICIAL_GAPPS"
function checkExit () {
if [ $? -ne 0 ]; then
EXIT_CODE=$?
echo "${CLR_BLD_RED}Build failed!${CLR_RST}"
echo -e ""
exit $EXIT_CODE
fi
}
# Output usage help
function showHelpAndExit {
echo -e "${CLR_BLD_BLU}Usage: $0 <device> [options]${CLR_RST}"
echo -e ""
echo -e "${CLR_BLD_BLU}Options:${CLR_RST}"
echo -e "${CLR_BLD_BLU} -h, --help Display this help message${CLR_RST}"
echo -e "${CLR_BLD_BLU} -c, --clean Wipe the tree before building${CLR_RST}"
echo -e "${CLR_BLD_BLU} -i, --installclean Dirty build - Use 'installclean'${CLR_RST}"
echo -e "${CLR_BLD_BLU} -r, --repo-sync Sync before building${CLR_RST}"
echo -e "${CLR_BLD_BLU} -t, --build-type Specify build type${CLR_RST}"
echo -e "${CLR_BLD_BLU} -j, --jobs Specify jobs/threads to use${CLR_RST}"
echo -e "${CLR_BLD_BLU} -m, --module Build a specific module${CLR_RST}"
echo -e "${CLR_BLD_BLU} -g, --gms Build with GMS${CLR_RST}"
echo -e "${CLR_BLD_BLU} -s, --sign-keys Specify path to sign key mappings${CLR_RST}"
echo -e "${CLR_BLD_BLU} -p, --pwfile Specify path to sign key password file${CLR_RST}"
echo -e "${CLR_BLD_BLU} -z, --imgzip Generate fastboot flashable image zip from signed target_files${CLR_RST}"
exit 1
}
# Setup getopt.
long_opts="help,clean,installclean,repo-sync,build-type:,jobs:,module:,gms,sign-keys:,pwfile:,imgzip"
getopt_cmd=$(getopt -o hcir:t:j:m:gs:p:z --long "$long_opts" \
-n $(basename $0) -- "$@") || \
{ echo -e "${CLR_BLD_RED}\nError: Getopt failed. Extra args\n${CLR_RST}"; showHelpAndExit; exit 1;}
eval set -- "$getopt_cmd"
while true; do
case "$1" in
-h|--help|h|help) showHelpAndExit;;
-c|--clean|c|clean) FLAG_CLEAN_BUILD=y;;
-i|--installclean|i|installclean) FLAG_INSTALLCLEAN_BUILD=y;;
-r|--repo-sync|r|repo-sync) FLAG_SYNC=y;;
-t|--build-type|t|build-type) DOT_BUILD_VARIANT="$2"; shift;;
-j|--jobs|j|jobs) JOBS="$2"; shift;;
-m|--module|m|module) MODULES+=("$2"); echo $2; shift;;
-g|--gms|g|gms) FLAG_GMS="y";;
-s|--sign-keys|s|sign-keys) KEY_MAPPINGS="$2"; shift;;
-p|--pwfile|p|pwfile) PWFILE="$2"; shift;;
-z|--imgzip|img|imgzip) FLAG_IMG_ZIP=y;;
--) shift; break;;
esac
shift
done
# Mandatory argument
if [ $# -eq 0 ]; then
echo -e "${CLR_BLD_RED}Error: No device specified${CLR_RST}"
showHelpAndExit
fi
export DEVICE="$1"; shift
# Make sure we are running on 64-bit before carrying on with anything
ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
if [ "$ARCH" != "64" ]; then
echo -e "${CLR_BLD_RED}error: unsupported arch (expected: 64, found: $ARCH)${CLR_RST}"
exit 1
fi
# Set up paths
#cd $(dirname $0)
DIR_ROOT=$(pwd)
# Make sure everything looks sane so far
if [ ! -d "$DIR_ROOT/vendor/dot" ]; then
echo -e "${CLR_BLD_RED}error: insane root directory ($DIR_ROOT)${CLR_RST}"
exit 1
fi
# Initializationizing!
echo -e "${CLR_BLD_BLU}Setting up the environment${CLR_RST}"
echo -e ""
. build/envsetup.sh
echo -e ""
# Use the thread count specified by user
CMD=""
if [ $JOBS ]; then
CMD+="-j$JOBS"
fi
# Pick the default thread count (allow overrides from the environment)
if [ -z "$JOBS" ]; then
if [ "$(uname -s)" = 'Darwin' ]; then
JOBS=$(sysctl -n machdep.cpu.core_count)
else
JOBS=$(cat /proc/cpuinfo | grep '^processor' | wc -l)
fi
fi
# Grab the build version
DOT_VERSION=dotOS-$DOT_MOD_VERSION-$DEVICE-$DOT_BUILD_TYPE-$DOT_BUILD_DATE
# Prep for a clean build, if requested so
if [ "$FLAG_CLEAN_BUILD" = 'y' ]; then
echo -e "${CLR_BLD_BLU}Cleaning output files left from old builds${CLR_RST}"
echo -e ""
m clobber "$CMD"
fi
# Sync up, if asked to
if [ "$FLAG_SYNC" = 'y' ]; then
echo -e "${CLR_BLD_BLU}Downloading the latest source files${CLR_RST}"
echo -e ""
repo sync -j"$JOBS" -c --no-clone-bundle --current-branch --no-tags
fi
# GMS
if [ "$FLAG_GMS" = 'y' ]; then
echo -e "${CLR_BLD_BLU}Building with GMS${CLR_RST}"
echo -e ""
export WITH_GMS=true
fi
# Check the starting time (of the real build process)
TIME_START=$(date +%s.%N)
# Friendly logging to tell the user everything is working fine is always nice
echo -e "${CLR_BLD_GRN}Building $DOT_VERSION${CLR_RST}"
echo -e "${CLR_GRN}Start time: $(date)${CLR_RST}"
echo -e ""
# Lunch-time!
echo -e "${CLR_BLD_BLU}Lunching $DEVICE${CLR_RST} ${CLR_CYA}(Including dependencies sync)${CLR_RST}"
echo -e ""
lunch "dot_$DEVICE-$DOT_BUILD_VARIANT"
checkExit
echo -e ""
# Perform installclean, if requested so
if [ "$FLAG_INSTALLCLEAN_BUILD" = 'y' ]; then
echo -e "${CLR_BLD_BLU}Cleaning compiled image files left from old builds${CLR_RST}"
echo -e ""
m installclean "$CMD"
fi
# Build away!
echo -e "${CLR_BLD_BLU}Starting compilation${CLR_RST}"
echo -e ""
# Build a specific module(s)
if [ "${MODULES}" ]; then
m ${MODULES[@]} "$CMD"
checkExit
# Build signed rom package if specified
elif [ "${KEY_MAPPINGS}" ]; then
# Set sign key password file if specified
if [ "${PWFILE}" ]; then
export ANDROID_PW_FILE=$PWFILE
fi
# Make target-files-package
m otatools target-files-package "$CMD"
checkExit
echo -e "${CLR_BLD_BLU}Signing target files apks${CLR_RST}"
sign_target_files_apks -o -d $KEY_MAPPINGS \
"$OUT"/obj/PACKAGING/target_files_intermediates/dot_$DEVICE-target_files-eng.$USER.zip \
signed-target_files.zip
checkExit
if [ "$FLAG_IMG_ZIP" = 'y' ]; then
echo -e "${CLR_BLD_BLU}Generating signed fastboot package${CLR_RST}"
img_from_target_files \
signed-target_files.zip \
$DOT_VERSION-img.zip
checkExit
else
echo -e "${CLR_BLD_BLU}Generating signed install package${CLR_RST}"
ota_from_target_files -k $KEY_MAPPINGS/releasekey --block \
signed-target_files.zip \
$DOT_VERSION.zip
checkExit
fi
# Build rom package
elif [ "$FLAG_IMG_ZIP" = 'y' ]; then
m otatools target-files-package "$CMD"
checkExit
echo -e "${CLR_BLD_BLU}Generating fastboot package${CLR_RST}"
img_from_target_files \
"$OUT"/obj/PACKAGING/target_files_intermediates/dot_$DEVICE-target_files-eng.$USER.zip \
$DOT_VERSION-image.zip
checkExit
else
m otapackage "$CMD"
checkExit
mv -f $OUT/dot_$DEVICE-ota-eng.$USER.zip $DOT_VERSION.zip
echo "Package Complete: $DOT_VERSION.zip"
fi
echo -e ""
# Check the finishing time
TIME_END=$(date +%s.%N)
# Log those times at the end as a fun fact of the day
echo -e "${CLR_BLD_GRN}Total time elapsed:${CLR_RST} ${CLR_GRN}$(echo "($TIME_END - $TIME_START) / 60" | bc) minutes ($(echo "$TIME_END - $TIME_START" | bc) seconds)${CLR_RST}"
echo -e ""
exit 0