#!/bin/bash

source ~/.colorc

export KERNEL_TOPDIR=$PWD
export GCC_PATH_DEFAULT=$PWD/../../0.GCCKIT/armgcc
export GCC_TYPE_DEFAULT=arm-linux

export MODULE_SRC_NAME=kernel
export MODULE_SRC_DIR=$KERNEL_TOPDIR/$MODULE_SRC_NAME
export MODULE_OUT_DIR=$KERNEL_TOPDIR/output
export MODULE_DEF_CFG=nuc972_coidea_defconfig
export MODULE_MOD_INS=$KERNEL_TOPDIR/install
export MODULE_CPY_DIR=${KERNEL_TOPDIR}/../../9.IMGBINS

check_compiler()
{
	$GCC_TYPE-gcc -v > /dev/null  2>&1
	if [ $? -eq 0 ]; then
		pinfo "check global gcc type : $GCC_TYPE"
	else
		pinfo "check local gcc type : $GCC_PATH"
		if [ -d $GCC_PATH ]; then
			pdone "check local gcc valid OK!"
			export PATH=$GCC_PATH/bin:$PATH
			$GCC_TYPE-gcc -v > /dev/null  2>&1
			if [ $? -eq 0 ]; then
				pdone "test local gcc valid OK!"
			else
				perro "test local gcc valid Failed!"
			exit 1
			fi
		else
			perro "check local gcc valid Failed!"
			exit 1
		fi
	fi
	
}

check_env()
{
	if [ -z "$GCC_TYPE" ]; then
		pwarn "No compile env configured!"
		pwarn "Set default compile env"
		export GCC_PATH=$GCC_PATH_DEFAULT
		export GCC_TYPE=$GCC_TYPE_DEFAULT
		export HOST=$GCC_TYPE
		export TARGET=$GCC_TYPE
		export CC="${HOST}-gcc"
		export CXX="${HOST}-g++"
		export OBJC="${CC}"
		export LD="${HOST}-ld"
		export ARCH=arm
		export CROSS_COMPILE=${HOST}-
		pinfo "--------default compile env------"
		pinfo "ARCH : $ARCH"
		pinfo "HOST : $HOST"
		pinfo "GCC_TYPE : $GCC_TYPE"
		pinfo "GCC_PATH : $GCC_PATH"
		pinfo "CROSS_COMPILE: $CROSS_COMPILE"
		pinfo "---------------------------------"
		check_compiler
	else
		pwarn "Get compile env configured!"
		pinfo "--------current compile env------"
		pinfo "ARCH : $ARCH"
		pinfo "HOST : $HOST"
		pinfo "GCC_TYPE : $GCC_TYPE"
		pinfo "GCC_PATH : $GCC_PATH"
		pinfo "CROSS_COMPILE: $CROSS_COMPILE"
		pinfo "---------------------------------"
	fi
	#Kernel with uImage need mkimage
	mkimage -V >/dev/null  2>&1
	if [ ! $? = 0 ]; then
		pwarn "No \"mkimage\" found, auto install..."
		sudo apt-get install u-boot-tools
		if [ $? = 0 ];then
			pdone 	"Install \"mkimage\" finish!"
		else
			perro "Install \"mkimage\" failed!"
			exit 1
		fi
	fi
}

dir_in()
{
	if [ -d  $MODULE_SRC_DIR ]; then
		pinfo "Now cd \$MODULE_SRC_DIR: $MODULE_SRC_DIR"
		cd $MODULE_SRC_DIR
	else
		perro "\$MODULE_SRC_DIR: $MODULE_SRC_DIR not found!"
		exit 1
	fi
}

dir_ret()
{
	pinfo "Exit $PWD"
	cd - > /dev/null
}

show_help()
{
	pinfo "Input: $0 build        to build cur kernel"
	pinfo "Input: $0 menuconfig   to menuconfig cur kernel"
	pinfo "Input: $0 defconfig    to defconfig kernel"
	pinfo "Input: $0 modules      to build and install modules"
	pinfo "Input: $0 clean        to clean kernel"
	pinfo "Input: $0 pack         to pack   kernel as .tar.gz"
}

check_option()
{	
	if [ -z "$1" ]; then
		perro "No extra param!"
		show_help
		exit 1
	else
		if [ "x$1" = "xbuild" ]; then
			$1
		elif [ "x$1" = "xmenuconfig" ]; then
			$1
		elif [ "x$1" = "xdefconfig" ]; then
			$1
		elif [ "x$1" = "xmodules" ]; then
			$1
		elif [ "x$1" = "xclean" ]; then
			$1
		elif [ "x$1" = "xpack" ]; then
			$1
		else
			perro "Invalid param : $1"
			show_help
			exit 1
		fi
	fi
}

check_lzop()
{
	lzop -V >/dev/null  2>&1
	if [ ! $? = 0 ]; then
		pwarn "No \"lzop\" found, auto install..."
		sudo apt-get install lzop
		if [ $? = 0 ];then
			pdone 	"Install \"lzop\" finish!"
		else
			perro "Install \"lzop\" failed!"
			exit 1
		fi
	fi
}

pack()
{
	if [ -d $MODULE_SRC_DIR ]; then
		pinfo "Start pack $MODULE_SRC_NAME as $MODULE_SRC_NAME.tar.gz"
		tar czf $MODULE_SRC_NAME.tar.gz $MODULE_SRC_NAME
		[ $? -ne 0 ] && perro "Pack kernel [ERROR]" && exit 1
	    pdone "Pack kernel [OK]"
	else
		perro "No MODULE_SRC_DIR: $MODULE_SRC_DIR found!"
		exit 1
	fi
}

clean()
{
	if [ ! -d $MODULE_OUT_DIR ]; then
		pdone "kernel allready clean!"
		exit 1
	fi
	check_env
	dir_in
    make O=$MODULE_OUT_DIR distclean
	[ $? -ne 0 ] && perro "--------------------------" && dir_ret && exit 1
    rm -rf $MODULE_OUT_DIR
	dir_ret
    pdone "--------------------------"
}

menuconfig()
{
	check_env
	dir_in
    pinfo "Kernel menuconfig start"
	make O=$MODULE_OUT_DIR menuconfig
	[ $? -ne 0 ] && perro "Menuconfig kernel [ERROR]" && dir_ret && exit 1
	dir_ret
    pdone "Menuconfig kernel [OK]"
}

defconfig()
{
	check_env
	if [ ! -d $MODULE_OUT_DIR ]; then
		mkdir -p $MODULE_OUT_DIR
	fi
	dir_in
    pinfo "Kernel defconfig refer to: $MODULE_DEF_CFG"
	if [ ! -d $MODULE_OUT_DIR/Makefile ]; then
		cp $MODULE_SRC_DIR/Makefile $MODULE_OUT_DIR/Makefile
	fi
    make O=$MODULE_OUT_DIR $MODULE_DEF_CFG
	[ $? -ne 0 ] && perro "Defconfig kernel [ERROR]" && dir_ret && exit 1
	dir_ret
	pdone "Defconfig kernel [OK]"
}

build()
{
	check_env
	check_lzop

	if [ ! -d $MODULE_OUT_DIR ]; then
		mkdir -p $MODULE_OUT_DIR
	fi

	dir_in

    make  O=$MODULE_OUT_DIR all -j4
	[ $? -ne 0 ] && perro "Build kernel [ERROR]" && dir_ret && exit 1
    pinfo "Build kernel [OK] output dir: $MODULE_OUT_DIR"

    make  O=$MODULE_OUT_DIR uImage -j4
	[ $? -ne 0 ] && perro "Build kernel uImage [ERROR]" && dir_ret && exit 1
    pinfo "Build kernel uImage [OK] output dir: $MODULE_OUT_DIR"

	dir_ret

	if [ ! -d $MODULE_CPY_DIR ]; then
		pwarn "Create new copy directory"
		sudo mkdir -p ${MODULE_CPY_DIR}
		sudo chmod 777 ${MODULE_CPY_DIR}
	fi
	cp $MODULE_OUT_DIR/arch/arm/boot/uImage $MODULE_CPY_DIR/4.dE000S250.kernel.bin
}
modules()
{
	check_env
	check_lzop

	if [ ! -d $MODULE_MOD_INS ]; then
		mkdir -p $MODULE_MOD_INS
	fi

	dir_in

    make  O=$MODULE_OUT_DIR modules
	[ $? -ne 0 ] && perro "Build kernel modules [ERROR]" && dir_ret && exit 1
    pinfo "Build kernel modules [OK] output dir: $MODULE_OUT_DIR"

    make  O=$MODULE_OUT_DIR modules_install INSTALL_MOD_PATH=${MODULE_MOD_INS}
	[ $? -ne 0 ] && perro "Install kernel modules [ERROR]" && dir_ret && exit 1
    pinfo "Intall kernel modules [OK] output dir: $MODULE_OUT_DIR"
	dir_ret
}

check_option $1