#!/bin/bash

ALL_KERNELS="all.kernels"
RPMS=/export/Mandrake/RPMS

ARCH=`uname -m | sed -e 's/i.86/i386/' -e 's/sparc.*/sparc/'`


# move stuff to this new "kernel" directory
if [ ! -d all.kernels ]; then
  if [ -d ../all.kernels ]; then
  mv ../all.kernels .
  rm -rf ../all.modules
  else
    # make sure "all.kernels" directory exists
    mkdir all.kernels
  fi
fi

function create_marfile() {
    marfile=$1
    shift
    $GIBASEDIR/mdk-stage1/mar/mar -c $marfile $*
}

function create_modules() {
    kernel_path=$1
    kern=$2
    echo "Updating modules in '`pwd`' for kernel '$kern'"
    find $kernel_path/lib/modules/ -name "*.o" -exec cp -f {} . \;
    /sbin/depmod -F $kernel_path/boot/System.map* -e *.o | perl -pe 's/\\\n//' \
	| perl -ne 's/\.o//g; s/[ \t]+/ /g; print if /: /' > modules.dep
    perl -pi -e 's/((plip|ppa|imm): parport)/$1 parport_pc/' modules.dep

    /sbin/modinfo -f '%{filename} %{description}\n' *.o | perl -lne 'print "$1\t$2" if /(.*?)\.o "(.*)"/' > modules.description
}

function create_modules_mar() {
    echo -n "stripping $kern: "
    $GIBASEDIR/kernel/strip_modules *.o 2>/dev/null
    echo "done"

    echo -n "packdrake $kern: "
    ls *.o | packdrake -b9s "modules.cz" 400000
    echo "done"
    mv modules.cz ../modules.cz-$kern
    for i in network network_gigabit_usb network_gigabit network_usb cdrom hd hdcdrom_usb pcmcia all; do
        eval "modules=\$${i}_modules_raw"
        modules_with_deps=`perl -I $GIBASEDIR/kernel $GIBASEDIR/kernel/dependencies.pl modules.dep $modules`
        if [ -n "$MOVE" ]; then modules_with_deps="$modules_with_deps change_loop.o gzloop.o isofs.o zlib_inflate.o supermount.o"; fi
	eval "create_marfile ${i}_modules.mar $modules_with_deps"
    done
    echo
}

[ -e $ALL_KERNELS/.main ] && main=$(cat $ALL_KERNELS/.main)

if [ "$ARCH" == "ia64" ] || [ "$ARCH" == "ppc" ]; then
	rpm=$(rpm -qp --qf '%{name}' $RPMS/kernel-[0-9]*.rpm | perl -pe 's/kernel-((\.?[0-9]+){3})\.(.*)/$1-${3}/')
else 
        #- allow specifying a kernel file on commandline (./update_kernel /RPMS/kernel-2.4.22.10mdk-1-1mdk.i586.rpm 2.4.22-10mdk)
        if [ -n "$1" ]; then
            file=$1
            rpm=$2
            MOVE=1
        else
            file=$RPMS/kernel-BOOT-*.rpm
            rpm=$(rpm -qp --qf '%{name}' $file | perl -pe 's/kernel-BOOT-((\.?[0-9]+){3})\.(.*)/$1-${3}BOOT/')
        fi
fi
if [ -n "$rpm" -a ! -e $ALL_KERNELS/$rpm ]; then
    [ -n "$main" ] && rm -rf $ALL_KERNELS/$main
    cd $ALL_KERNELS
    rm -rf $rpm ; mkdir $rpm
    cd $rpm
    if [ "$ARCH" == "ia64" ] || [ "$ARCH" == "ppc" ]; then
      rpm2cpio $RPMS/kernel-[0-9]*.rpm | cpio -id
    else
      rpm2cpio $file | cpio -id
    fi
    find -type f -name "*.o.gz" | xargs gunzip
    cd ../..

    for dir in /tftpboot /var/lib/tftpboot; do
	rm -f $dir/{vmlinuz,network.rdz}
    done
fi 

[ -n "$main" -a -e $ALL_KERNELS/$main ] || {
    cd $ALL_KERNELS
    main=$(echo 2.* | sed 's/.* //')
    echo "Choosing $main"
    echo $main > .main
    cd ..
}


if [ "$ARCH" == "i386" ]; then
    for i in $ALL_KERNELS/*/boot/vmlinuz*; do
	#disable any existing resolution!!!
	/usr/sbin/rdev -v $i 65535 #788 #785 
    done
fi


GIBASEDIR=`pwd`/..

rm -rf all.modules ; mkdir all.modules
for i in $ALL_KERNELS/*; do
	kern=`basename $i`
	(
	    mkdir all.modules/$kern
	    cd all.modules/$kern

	    create_modules ../../$i $kern
	) || exit 1
done
cp -f all.modules/$main/modules.description .

l=`perl modules.pl images` || exit 1
eval $l

for i in $ALL_KERNELS/*; do
	kern=`basename $i`
	(
	    cd all.modules/$kern

	    if [ "$kern" = "$main" ]; then
		create_modules_mar ../../$i $kern
	    else
		echo "$kern ($main)"
		create_modules_mar ../../$i $kern 2>/dev/null
	    fi
	) || exit 1
done


./check_mar.pl