#!/bin/sh
#
# Description		: Build Android Script.
# Authors			: http://www.9tripod.com
# Version			: 0.01
# Notes				: None
#

export ANDROID_JAVA_HOME=/usr/lib/jvm/java-6-sun/
SOURCE_DIR=$(cd `dirname $0` ; pwd)

TOOLS_DIR=${SOURCE_DIR}/tools/
RELEASE_DIR=${SOURCE_DIR}/out/release
TARGET_DIR=${SOURCE_DIR}/out/target/product/smdkv210/
KERNEL_DIR=${SOURCE_DIR}/kernel/
BOOTLOADER_UBOOT_CONFIG=x210_nand_config
BOOTLOADER_XBOOT_CONFIG=arm-mpad
ANDROID_KERNEL_CONFIG=x210_android_defconfig
INITRD_KERNEL_CONFIG=x210_initrd_defconfig
FILESYSTEM_CONFIG=PRODUCT-full_smdkv210-eng

export PATH=$SOURCE_DIR/uboot/tools:$PATH

CPU_NUM=$(cat /proc/cpuinfo |grep processor|wc -l)
CPU_NUM=$((CPU_NUM+1))

setup_environment()
{
	cd ${SOURCE_DIR};
	mkdir -p ${RELEASE_DIR} || return 1;
	mkdir -p ${TARGET_DIR} || return 1;
}

build_bootloader_uboot()
{
	cd ${SOURCE_DIR}/uboot || return 1
	make distclean || return 1;
	make ${BOOTLOADER_UBOOT_CONFIG} || return 1;
	make -j${CPU_NUM}
        mv u-boot.bin uboot_nand.bin

        if [ -f uboot_nand.bin ]; then
		cp uboot_nand.bin ${RELEASE_DIR}/uboot.bin
		echo "^_^ uboot_nand.bin is finished successful!"
		exit
	else
		echo "make error,cann't compile u-boot.bin!"
		exit
	fi

	return 0
}

build_bootloader_xboot()
{
	if [ ! -f ${RELEASE_DIR}/zImage-initrd ]; then
		echo "not found kernel zImage-initrd, please build kernel first" >&2
		return 1
	fi

	if [ ! -f ${RELEASE_DIR}/zImage-android ]; then
		echo "not found kernel zImage-android, please build kernel first" >&2
		return 1
	fi

	# copy zImage-initrd and zImage-android to xboot's romdisk directory
	cp -v ${RELEASE_DIR}/zImage-initrd ${SOURCE_DIR}/xboot/src/arch/arm/mach-mpad/romdisk/boot || return 1;
	cp -v ${RELEASE_DIR}/zImage-android ${SOURCE_DIR}/xboot/src/arch/arm/mach-mpad/romdisk/boot || return 1;

	# compiler xboot
	cd ${SOURCE_DIR}/xboot || return 1
	make TARGET=${BOOTLOADER_XBOOT_CONFIG} CROSS=/usr/local/arm/arm-none-eabi-2010-09-51/bin/arm-none-eabi- clean || return 1;
	make TARGET=${BOOTLOADER_XBOOT_CONFIG} CROSS=/usr/local/arm/arm-none-eabi-2010-09-51/bin/arm-none-eabi- || return 1;

	# rm zImage-initrd and zImage-android
	rm -fr ${SOURCE_DIR}/xboot/src/arch/arm/mach-mpad/romdisk/boot/zImage-initrd
	rm -fr ${SOURCE_DIR}/xboot/src/arch/arm/mach-mpad/romdisk/boot/zImage-android

	# copy xboot.bin to release directory
	cp -v ${SOURCE_DIR}/xboot/output/xboot.bin ${RELEASE_DIR}

	echo "" >&2
	echo "^_^ xboot path: ${RELEASE_DIR}/xboot.bin" >&2
	return 0
}

build_kernel_android()
{
	cd ${SOURCE_DIR}/kernel || return 1

	make ${ANDROID_KERNEL_CONFIG} || return 1
	make -j${threads} || return 1
	dd if=${SOURCE_DIR}/kernel/arch/arm/boot/zImage of=${RELEASE_DIR}/zImage-android bs=2048 count=8192 conv=sync;

	echo "" >&2
	echo "^_^ android kernel path: ${RELEASE_DIR}/zImage-android" >&2

	return 0
}

build_kernel_linux()
{
	cd ${SOURCE_DIR}/kernel || return 1

	make ${INITRD_KERNEL_CONFIG} || return 1
	make -j${threads} || return 1
	dd if=${SOURCE_DIR}/kernel/arch/arm/boot/zImage of=${RELEASE_DIR}/zImage-initrd bs=2048 count=8192 conv=sync;

	echo "" >&2
	echo "^_^ initrd kernel path: ${RELEASE_DIR}/zImage-initrd" >&2

	return 0
}

build_system()
{
	cd ${SOURCE_DIR} || return 1
	make -j${threads} ${FILESYSTEM_CONFIG} || return 1

	# create android.img.cpio
	rm -fr ${TARGET_DIR}/cpio_list ${TARGET_DIR}/android.img.cpio || { return 1; }
	$TOOLS_DIR/gen_initramfs_list.sh ${TARGET_DIR}/root > ${TARGET_DIR}/cpio_list || { return 1; }
	$TOOLS_DIR/gen_init_cpio ${TARGET_DIR}/cpio_list > ${TARGET_DIR}/android.img.cpio || { return 1; }

	# create data.tar
	cd ${TARGET_DIR}/data || { echo "Error: Could not enter the ${TARGET_DIR}/data directory."; return 1; }
	rm -fr ${TARGET_DIR}/data.tar || { return 1; }
	tar cvf ${TARGET_DIR}/data.tar ./* || { return 1; }

	# create system.tar
	cd ${TARGET_DIR}/system || { echo "Error: Could not enter the ${TARGET_DIR}/system directory."; return 1; }
	rm -fr ${TARGET_DIR}/system.tar || { return 1; }
	tar cvf ${TARGET_DIR}/system.tar ./* || { return 1; }

	cp -av ${TARGET_DIR}/installed-files.txt ${RELEASE_DIR}/ || return 1;
	cp -av ${TARGET_DIR}/installed-files.txt ${RELEASE_DIR}/ || return 1;
	cp -av ${TARGET_DIR}/android.img.cpio ${RELEASE_DIR}/ || return 1;
	cp -av ${TARGET_DIR}/android.img.cpio ${KERNEL_DIR}/ || return 1;
	cp -av ${TARGET_DIR}/system.img ${RELEASE_DIR}/ || return 1;
	cp -av ${TARGET_DIR}/system.tar ${RELEASE_DIR}/ || return 1;
	cp -av ${TARGET_DIR}/userdata.img ${RELEASE_DIR}/ || return 1;
	cp -av ${TARGET_DIR}/data.tar ${RELEASE_DIR}/ || return 1;

	echo "" >&2
	echo "^_^ system path: ${RELEASE_DIR}/system.tar" >&2

	# create uboot_img
	cd ${TARGET_DIR}
	echo '****** Make ramdisk image for u-boot ******'
	mkimage -A arm -O linux -T ramdisk -C none -a 0x30800000 -n "ramdisk" -d ramdisk.img x210-uramdisk.img
	cp x210-uramdisk.img $RELEASE_DIR/
	rm -f ramdisk.img
	
	return 0
}

gen_update_bin()
{
	# check image files
	if [ ! -f ${RELEASE_DIR}/xboot.bin ]; then
		echo "not found bootloader xboot.bin, please build bootloader" >&2
		return 1
	fi

	if [ ! -f ${RELEASE_DIR}/zImage-initrd ]; then
		echo "not found kernel zImage-initrd, please build kernel first" >&2
		return 1
	fi

	if [ ! -f ${RELEASE_DIR}/zImage-android ]; then
		echo "not found kernel zImage-android, please build kernel first" >&2
		return 1
	fi

	if [ ! -f ${RELEASE_DIR}/system.tar ]; then
		echo "not found system.tar, please build system" >&2
		return 1
	fi

	if [ ! -f ${RELEASE_DIR}/data.tar ]; then
		echo "not found data.tar, please build system" >&2
		return 1
	fi

	rm -fr ${RELEASE_DIR}/tmp || return 1;
	rm -fr ${RELEASE_DIR}/update.bin || return 1;
	mkdir -p ${RELEASE_DIR}/tmp || return 1;

	# copy image files
	cp ${RELEASE_DIR}/xboot.bin ${RELEASE_DIR}/tmp/;
	cp ${RELEASE_DIR}/zImage-initrd ${RELEASE_DIR}/tmp/;
	cp ${RELEASE_DIR}/zImage-android ${RELEASE_DIR}/tmp/;
	cp ${RELEASE_DIR}/system.tar ${RELEASE_DIR}/tmp/;
	cp ${RELEASE_DIR}/data.tar ${RELEASE_DIR}/tmp/;

	# create md5sum.txt
	cd ${RELEASE_DIR}/tmp/;
	find . -type f -print | while read line; do
		if [ $line != 0 ]; then
			md5sum ${line} >> md5sum.txt
		fi
	done

	# genromfs
	genromfs -v -d ${RELEASE_DIR}/tmp/ -f ${RELEASE_DIR}/update.bin || return 1;

	cd ${SOURCE_DIR} || return 1 
	rm -fr ${RELEASE_DIR}/tmp || return 1;
	return 0;
}

threads=4;
uboot=no;
xboot=no;
kernel_android=no;
kernel_linux=no;
system=no;
update=no;

if [ -z $1 ]; then
	uboot=yes
	xboot=yes
	kernel_android=yes
        kernel_linux=yes
	system=yes
	update=yes
fi

while [ "$1" ]; do
    case "$1" in
	-j=*)
		x=$1
		threads=${x#-j=}
		;;
	-u|--uboot)
		uboot=yes
	    ;;
	-x|--xboot)
		xboot=yes
	    ;;
	-k|--kernel_android)
	    kernel_android=yes
            kernel_xboot=no
	    ;;
        -l|--kernel_linux)
	    kernel_linux=yes
	    ;;
	-s|--system)
		system=yes
	    ;;
	-U|--update)
		update=yes
	    ;;
	-a|--all)
		uboot=yes
		xboot=yes
		kernel_android=yes
                kernel_linux=yes
		system=yes
		update=yes
	    ;;
	-h|--help)
	    cat >&2 <<EOF
Usage: build.sh [OPTION]
Build script for compile the source of telechips project.

  -j=n                 using n threads when building source project (example: -j=16)
  -u, --uboot          build bootloader uboot from source file
  -x, --xboot          build bootloader xboot from source file
  -k, --kernel_android build kernel for android and using default config file
  -l, --kernel_linux   build kernel for linux and using default config file
  -s, --system         build file system from source file
  -U, --update         gen update package update.bin
  -a, --all            build all, include anything
  -h, --help           display this help and exit
EOF
	    exit 0
	    ;;
	*)
	    echo "build.sh: Unrecognised option $1" >&2
	    exit 1
	    ;;
    esac
    shift
done

setup_environment || exit 1

if [ "${system}" = yes ]; then
	build_system || exit 1
fi

if [ "${kernel_android}" = yes ]; then
	build_kernel_android || exit 1
fi

if [ "${kernel_linux}" = yes ]; then
	build_kernel_linux || exit 1
fi

if [ "${uboot}" = yes ]; then
	build_bootloader_uboot || exit 1
fi

if [ "${xboot}" = yes ]; then
	build_bootloader_xboot || exit 1
fi

if [ "${update}" = yes ]; then
	gen_update_bin || exit 1
fi

exit 0

