#!/bin/bash
# iMedia Linux Kernel build script
# Version 0.1.4

# Generic build options
# Set to 1 if you want to be presented with the kernel menuconfig
WANT_KERNEL_CONFIGURE=0
# Use gentoo kernel modules packages (disable if you don't run gentoo)
# This won't build the kernel modules that we use from gentoo
USE_GENTOO_PACKAGES=1

LOG_DIR="/imedia/kernel-build"
EXTERNAL_MODULES_ROOT="/extra/kernel/kernel-modules-2.6"

# Where the kernel sources are located
KERNEL_SRC_DIR="/usr/src/linux"
KERNEL_CONFIGS_DIR="$KERNEL_SRC_DIR/Configs"
KERNEL_TARGETS="i686 i586 wrap"
#KERNEL_TARGETS="wrap"

KERNEL_MAKE_OPTS="-j3"

BUILD_DATE=`date +%d-%m-%Y`

# Modules we use from Gentoo Portage
GENTOO_MODULES=(gspcav1)

# External modules list
EXTERNAL_MODULES=(lirc lirc_serial emlog drm madwifi ivtv ndiswrapper)

EXTERNAL_MODULES_PATHS=(\
"$EXTERNAL_MODULES_ROOT/lirc/lirc" \
"$EXTERNAL_MODULES_ROOT/lirc/lirc" \
"$EXTERNAL_MODULES_ROOT/emlog" \
"$EXTERNAL_MODULES_ROOT/drm/drm/linux-core" \
"$EXTERNAL_MODULES_ROOT/madwifi/madwifi-ng" \
"$EXTERNAL_MODULES_ROOT/ivtv/src/ivtv-0.10.1" \
"$EXTERNAL_MODULES_ROOT/ndiswrapper/ndiswrapper-1.38" \
)


EXTERNAL_MODULES_COMPILE=(\
'./configure_custom ; make' \
'./configure_custom_serial ; make' \
'make' \
'make' \
'make DRM_MODULES=via' \
'make' \
'make' \
)

EXTERNAL_MODULES_INSTALL=(\
"make install" \
"make install" \
"make install" \
"make -f Makefile.install" \
"make install" \
"make install" \
"make install" \
)



function error()
{
    error_string=$*
    echo -n -e "FATAL ERROR: $error_string"
    exit 1
}

# Kernel version from the KERNEL_SRC_DIR
function detect_kernel_version()
{
    current_dir=`pwd`
    
    if [ ! -e "$KERNEL_SRC_DIR/Makefile" ]
    then
	error "Cannot find kernel sources\n"
    fi
    
    cd $KERNEL_SRC_DIR
    KERNEL_VERSION=`make kernelversion`
    
    cd $current_dir
}
# Copy the config.$TARGET to .config and backup the old one
# Will also parse this config with make and prepare the kernel 
# tree for compiling
function prepare_source_tree()
{
    TARGET=$1
    
    echo -e " > Cleaning source tree"
    cd $KERNEL_SRC_DIR
    make $KERNEL_MAKE_OPTS mrproper >> $CURRENT_LOG 2>&1
    
    CURRENT_CONFIG="$KERNEL_CONFIGS_DIR/.config.$TARGET"
    
    if [ -e "$CURRENT_CONFIG" ]; then
	cp "$CURRENT_CONFIG" "$KERNEL_SRC_DIR/.config"
	if [ $WANT_KERNEL_CONFIGURE -eq 1 ]; then
	    cp "$CURRENT_CONFIG" "$CURRENT_CONFIG.$BUILD_DATE"
	    cd $KERNEL_SRC_DIR
	    echo -e " > Running make config"
	    make $KERNEL_MAKE_OPTS config
	    cp "$KERNEL_SRC_DIR/.config" $CURRENT_CONFIG
	    cd -
	else
	    cd $KERNEL_SRC_DIR
	    echo -e " > Configuring source tree"
	    make $KERNEL_MAKE_OPTS silentoldconfig >> $CURRENT_LOG 2>&1
	fi
	echo -e " > Preparing source tree"
	make $KERNEL_MAKE_OPTS prepare >> $CURRENT_LOG 2>&1
    fi
}

function build_kernel()
{
    TARGET=$1
    
    if [ -e "$KERNEL_SRC_DIR/.config" ]; then    
        echo " > Building kernel for $TARGET"
	cd $KERNEL_SRC_DIR
	make $KERNEL_MAKE_OPTS bzImage >> $CURRENT_LOG 2>&1
    fi
}

function build_kernel_modules()
{
    TARGET=$1
    
    if [ -e "$KERNEL_SRC_DIR/.config" ]; then    
        echo "  > Building kernel modules for $TARGET"
	cd $KERNEL_SRC_DIR
	make $KERNEL_MAKE_OPTS modules >> $CURRENT_LOG 2>&1
    fi
}

function build_external_modules()
{

    for index in $(seq 0 $((${#EXTERNAL_MODULES[@]} - 1)))
    do
	echo "   > Building module ${EXTERNAL_MODULES[$index]}"
	MODULE_LOG="$LOG_DIR/${EXTERNAL_MODULES[$index]}-module-$TARGET.log"
	rm -f $MODULE_LOG
	cd ${EXTERNAL_MODULES_PATHS[$index]}
	echo "    > Compiling module ${EXTERNAL_MODULES[$index]}"
	${EXTERNAL_MODULES_COMPILE[$index]} >> $MODULE_LOG 2>&1
	echo "    > Installing module ${EXTERNAL_MODULES[$index]}"
	${EXTERNAL_MODULES_INSTALL[$index]} >> $MODULE_LOG 2>&1
    done
    
    if [ $USE_GENTOO_PACKAGES -eq 1 ]; then
	for index in $(seq 0 $((${#GENTOO_MODULES[@]} - 1)))
	do
	    echo "   > Building module ${GENTOO_MODULES[$index]}"
	    MODULE_LOG="$LOG_DIR/${GENTOO_MODULES[$index]}-module-$TARGET.log"
	    rm -f $MODULE_LOG
	    echo "    > Emerging module ${GENTOO_MODULES[$index]}"
	    emerge ${GENTOO_MODULES[$index]} >> $MODULE_LOG 2>&1
	done
    fi
}


function copy_kernel_image()
{
    if [ -e "$KERNEL_SRC_DIR/.config" ]; then    
        echo "  > Copying kernel image for $TARGET"
	echo "   > Saving kernel image to /boot"
	cp "$KERNEL_SRC_DIR/arch/i386/boot/bzImage" "/boot/imedia-$KERNEL_VERSION-$TARGET"
	echo "   > Saving kernel image to /imedia/arch-diff/common/$TARGET/boot/"
	cp "$KERNEL_SRC_DIR/arch/i386/boot/bzImage" "/imedia/arch-diff/common/$TARGET/boot/imedia"
    fi
}

function install_kernel_modules()
{
    if [ -e "$KERNEL_SRC_DIR/.config" ]; then    
        echo "  > Installing kernel modules for $TARGET"
	cd $KERNEL_SRC_DIR
	make $KERNEL_MAKE_OPTS modules_install >> $CURRENT_LOG 2>&1
    fi
}

function make_symlinks()
{
    echo "  > Making $TARGET symlinks"
    rm -rf "/lib/modules/imedia-modules-$TARGET"
    ln -sf "/lib/modules/$KERNEL_VERSION-$TARGET" "/lib/modules/imedia-modules-$TARGET"
}

detect_kernel_version

for TARGET in $KERNEL_TARGETS; do
    echo "* Building $KERNEL_VERSION for $TARGET"
    export KVER=$KERNEL_VERSION-$TARGET
    export KVERS=$KERNEL_VERSION-$TARGET
    CURRENT_LOG="$LOG_DIR/kernel-build-$TARGET.log"
    rm -f $CURRENT_LOG
    prepare_source_tree $TARGET
    build_kernel $TARGET
    build_kernel_modules $TARGET
    copy_kernel_image $TARGET
    install_kernel_modules $TARGET
    build_external_modules
    make_symlinks
done


