1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

306 lines
7.9 KiB

#!/bin/bash
# ----------------------------------------------------------
# base setup
# export or set ROCKCHIP_DEVICE_DIR in .rockchip_device.mk
# to build image for different combos
KERNEL_VER=5.10
KERNEL_DIR=kernel-${KERNEL_VER}
UBOOT_DIR=u-boot
# lunched combo
PRODUCT=${TARGET_PRODUCT}
VARIANT=${TARGET_BUILD_VARIANT}
source build/envsetup.sh
true ${PRODUCT:="aosp_nanopi3"}
true ${VARIANT:="userdebug"}
#----------------------------------------------------------
# local functions
MAKE="make -j$(nproc)"
start_time=$(date +"%s")
FA_ShowTime() {
local ret=$1
local end_time=$(date +"%s")
local tdiff=$(($end_time-$start_time))
local hours=$(($tdiff / 3600 ))
local mins=$((($tdiff % 3600) / 60))
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"
else
color_failed=""
color_success=""
color_reset=""
fi
echo
if [ $ret -eq 0 ] ; then
echo -n "${color_success}#### make completed successfully "
else
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 [ $mins -gt 0 ] ; then
printf "(%02g:%02g (mm:ss))" $mins $secs
elif [ $secs -gt 0 ] ; then
printf "(%s seconds)" $secs
fi
echo " ####${color_reset}"
echo
return $ret
}
FA_RunCmd() {
[ "$V" = "1" ] && echo "+ ${@}"
eval $@ || exit $?
}
function usage()
{
echo "Usage: $0 [ARGS]"
echo
echo "Options:"
echo " -a build Android"
echo " -B build U-Boot"
echo " -K build Linux kernel"
echo
echo " -F, --all build all (U-Boot, kernel, Android)"
echo " -M make rockdev image"
echo " -u generate update.img"
echo
echo " -h show this help message and exit"
exit 1
}
function parse_args()
{
[ -z "$1" ] && usage;
TEMP=`getopt -o "aBKFMOuh" --long "all,clang,ota" -n "$SELF" -- "$@"`
if [ $? != 0 ] ; then exit 1; fi
eval set -- "$TEMP"
while true; do
case "$1" in
-a ) BUILD_ANDROID=true; shift 1;;
-B ) BUILD_UBOOT=true; shift 1;;
-K ) BUILD_KERNEL=true; shift 1;;
-O|--ota)
BUILD_OTA=true; shift 1;;
-F|--all)
BUILD_UBOOT=true;
BUILD_KERNEL=true;
BUILD_ANDROID=true;
shift 1;;
--clang)
BUILD_KERNEL_WITH_CLANG=true;
shift 1;;
-M ) MAKE_RKDEV_IMG=true; shift 1;;
-u ) GEN_UPDATE_IMG=true; shift 1;;
-h ) usage; exit 1 ;;
-- ) shift; break ;;
* ) echo "invalid option $1"; usage; return 1 ;;
esac
done
}
#----------------------------------------------------------
function check_android_ab() {
true
}
function build_uboot() {
local UBOOT_CFG=$(get_build_var PRODUCT_UBOOT_CONFIG)
check_android_ab
true ${UBOOT_CFG:=nanopi6}
cd ${UBOOT_DIR} && {
FA_RunCmd ./make.sh ${UBOOT_CFG}
ret=$?
FA_ShowTime $ret
cd - >/dev/null
}
}
function setup_clang() {
echo $PATH | grep clang-r416183b >/dev/null && return 0
true ${ANDROID_BUILD_TOP:=$(pwd)}
local CLANG=$ANDROID_BUILD_TOP/prebuilts/clang/host/linux-x86/clang-r416183b
export PATH=$CLANG/bin:$PATH
}
function build_kernel() {
local KERNEL_CFG=$(get_build_var PRODUCT_KERNEL_CONFIG)
local KERNEL_IMG=$(get_build_var PRODUCT_KERNEL_DTS)
true ${KERNEL_CFG:=nanopi6_android_defconfig}
true ${KERNEL_IMG:=nanopi6-images}
if [ "${KERNEL_VER}" = "5.10" ] ; then
echo "Force use clang and llvm to build ${KERNEL_DIR}"
BUILD_KERNEL_WITH_CLANG=true
fi
if [ "$BUILD_KERNEL_WITH_CLANG" = true ] ; then
ADDON_ARGS="CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1"
setup_clang
fi
cd ${KERNEL_DIR} && {
FA_RunCmd ${MAKE} ARCH=arm64 ${ADDON_ARGS} ${KERNEL_CFG}
FA_RunCmd ${MAKE} ARCH=arm64 ${ADDON_ARGS} ${KERNEL_IMG}
ret=$?
declare -F make >/dev/null || FA_ShowTime $ret
cd - >/dev/null
[ -d "$OUT" ] || return 0
}
# repack v2 boot
if [ "$BUILD_ANDROID" != "true" ]; then
echo "Repacking header 2 boot.img: "
local BOOT_CMDLINE=`get_build_var BOARD_KERNEL_CMDLINE`
local SECURITY_LEVEL=`get_build_var PLATFORM_SECURITY_PATCH`
local IMAGE_PATH=rockdev/Image-${PRODUCT}
local REL_OUT=$(realpath $OUT --relative-to=.)
local RAMDISK_IMG=$OUT/ramdisk.img
if [ "$(get_build_var BOARD_USES_RECOVERY_AS_BOOT)" = true ]; then
RAMDISK_IMG=$OUT/ramdisk-recovery.img
fi
if [ -n "${TARGET_BUILD_VARIANT}" ]; then
BOOT_CMDLINE+=" buildvariant=${TARGET_BUILD_VARIANT}"
fi
FA_RunCmd cp -af $KERNEL_DIR/arch/arm64/boot/Image $OUT/kernel
[ -f $OUT/dtb.img ] && DTB_IMG_ARGS="--dtb $OUT/dtb.img"
mkbootimg --kernel $OUT/kernel \
--ramdisk ${RAMDISK_IMG} ${DTB_IMG_ARGS} \
--cmdline "$BOOT_CMDLINE" \
--os_version 12 --os_patch_level $SECURITY_LEVEL \
--header_version 2 \
--second $KERNEL_DIR/resource.img \
--output $REL_OUT/boot.img &&
cp -av $REL_OUT/boot.img ${IMAGE_PATH}/boot.img
fi
}
function build_android() {
true ${BUILD_NUMBER:=$(date +"6%y%m%d")$(($(date +"%H")/4))}
export BUILD_NUMBER
FA_RunCmd lunch ${PRODUCT}-${VARIANT}
clean_prop_target "$(cat ./out/soong/build_number.txt 2>/dev/null)"
FA_RunCmd ${MAKE} $*
}
function make_rockdev_img() {
if [ -z ${TARGET_PRODUCT} ]; then
FA_RunCmd lunch ${PRODUCT}-${VARIANT}
fi
FA_RunCmd ./mkimage.sh
ret=$?
[ "$BUILD_OTA" = true ] && copy_ota_images
FA_ShowTime $ret
}
function build_ota() {
echo "generate ota package"
local OTA_FULL=$TARGET_PRODUCT-ota-${BUILD_NUMBER}.zip
local OTA_PATH=rockdev/otapackage
local ota_build_number=$(cat $OTA_PATH/build_number.txt 2>/dev/null)
local ota_target_start=$TARGET_PRODUCT-target_files-${ota_build_number}.zip
local ota_target_build=$TARGET_PRODUCT-target_files-${BUILD_NUMBER}.zip
build_android dist
ret=$?
mkdir -p $OTA_PATH
FA_RunCmd "cp out/dist/${ota_target_build} $OTA_PATH/ -f"
FA_RunCmd "cp out/dist/${OTA_FULL} $OTA_PATH/ -f"
if [ "$BUILD_NUMBER" != "$ota_build_number" ] &&
[ -f $OTA_PATH/${ota_target_start} ] &&
[ -f $OTA_PATH/${ota_target_build} ]; then
ota_from_target_files -v \
-i $OTA_PATH/${ota_target_start} \
$OTA_PATH/${ota_target_build} \
$OTA_PATH/ota-update-${BUILD_NUMBER}.zip
cp device/friendlyelec/nanopi3/gen_ota_json.sh $OTA_PATH/ -f
fi
FA_RunCmd "cp ./out/soong/build_number.txt $OTA_PATH/ -f"
FA_ShowTime $ret
}
function clean_prop_target() {
[ "$BUILD_NUMBER" == "$1" ] && return 0
FA_RunCmd "rm -f $OUT/obj/ETC/system_build_prop_intermediates/build.prop"
FA_RunCmd "rm -f $OUT/odm/etc/build.prop"
FA_RunCmd "rm -f $OUT/product/build.prop"
FA_RunCmd "rm -f $OUT/system/build.prop"
FA_RunCmd "rm -f $OUT/vendor/build.prop"
FA_RunCmd "rm -f $OUT/recovery/root/default.prop"
FA_RunCmd "rm -f $OUT/recovery/root/prop.default"
}
function copy_ota_images() {
local IMAGE_PATH=rockdev/Image-${PRODUCT}
local target_files=$OUT/obj/PACKAGING/target_files_intermediates
echo -n "copy mass production super.img for OTA..."
FA_RunCmd "cp -f $OUT/obj/PACKAGING/super.img_intermediates/super.img $IMAGE_PATH/"
echo "done."
}
function gen_update_img() {
echo "generate update.img"
local PACK_TOOL_DIR=RKTools/linux/Linux_Pack_Firmware
local IMAGE_PATH=rockdev/Image-${PRODUCT}
local UPDATE_GEN=rockdev/update_gen
[ -d ${IMAGE_PATH} ] || make_rockdev_img
[ -f ${IMAGE_PATH}/update.img ] && rm -vf ${IMAGE_PATH}/update.img
mkdir -p $PACK_TOOL_DIR/rockdev/Image/
FA_RunCmd "cp ${IMAGE_PATH}/* $PACK_TOOL_DIR/rockdev/Image/ -f"
check_android_ab
cd $PACK_TOOL_DIR/rockdev && {
./mkupdate.sh $TARGET_BOARD_PLATFORM Image
ret=$?
FA_ShowTime $ret
cd - >/dev/null
}
mv $PACK_TOOL_DIR/rockdev/update.img $IMAGE_PATH/
rm $PACK_TOOL_DIR/rockdev/Image -rf
}
#----------------------------------------------------------
parse_args $@
[ "$BUILD_UBOOT" = true ] && build_uboot
[ "$BUILD_KERNEL" = true ] && build_kernel
[ "$BUILD_ANDROID" = true ] && build_android
[ "$BUILD_OTA" = true ] && build_ota
[ "$MAKE_RKDEV_IMG" = true ] && make_rockdev_img
[ "$GEN_UPDATE_IMG" = true ] && gen_update_img