#!/bin/sh
#
# assume that this script is installed below the source directory
# e.g. in /usr/src/spb2
unset do_clean
[ "$1" = "clean" ] && do_clean=1 && echo "with make clean (recommend when kernel source has changed)"
source_dir=../


kernel_version=linux-2.6.23.8
kernel_base_version=linux-2.6.23.8
# note: when kernel version changes /usr/src/sqlzma...
# has to be removed

#spblinux 2.2pre2:
#AUFS_VERSION="-D 20071031"

#kernel_version=linux-2.6.23-rc7
#kernel_base_version=linux-2.6.22
if [ "$kernel_version" != "$kernel_base_version" ]; then
 kernel_patch_version=patch-2.6.23-rc7
 kernel_patch=$kernel_patch_version.bz2
fi

kernel_source=$kernel_base_version.tar.bz2
kernel_server=ftp://ftp.kernel.org/pub/linux/kernel/v2.6

errorexit()
{
 echo -e $@
 exit 1
}

OLD_PWD=$PWD
if [ "$source_dir" = "../" ]; then
 src_dir=${PWD%/*}
else
 src_dir=${PWD}/${source_dir%/}
fi
TAR=tar
[ -x $OLD_PWD/tar ] && TAR=$OLD_PWD/tar


# extract kernel source
if ! [ -d $src_dir/$kernel_base_version ]; then
  echo "kernel $kernel_base_version not found!"
  errorexit "run spb-prepare-kernel to download and patch the kernel"
fi

# squashfs with lzma support
f1=http://www.squashfs-lzma.org/dl/sqlzma3.2-r2b.tar.bz2
f2=http://www.squashfs-lzma.org/dl/squashfs3.2-r2.tar.gz
f3=http://www.squashfs-lzma.org/dl/lzma443.tar.bz2
d_tmp=${f1##*/}
sqlzma_dir=${d_tmp%.tar*}
d_tmp=${f2##*/}
squashfs_dir=${d_tmp%.tar*}
d_tmp=${f3##*/}
lzma_dir=${d_tmp%.tar*}
unset d_tmp
for f in $f1 $f2 $f3; do
 [ -f ${f##*/} ] || wget $f
 [ -f ${f##*/} ] || errorexit "failed to download $f"
done
if ! [ -d $src_dir/$sqlzma_dir ]; then
 [ "${f1##*tar}" = ".gz" ] && xopt=z
 [ "${f1##*tar}" = ".bz2" ] && xopt=j
 mkdir $src_dir/$sqlzma_dir
 tar -C $src_dir/$sqlzma_dir -x${xopt}f ${f1##*/} || errorexit "failed to extract $f1 into $src_dir"
 [ -d $src_dir/$sqlzma_dir ] || errorexit "directory $src_dir/$sqlzma_dir not found."
fi
if ! [ -d $src_dir/$sqlzma_dir/$squashfs_dir ]; then
 [ "${f2##*tar}" = ".gz" ] && xopt=z
 [ "${f2##*tar}" = ".bz2" ] && xopt=j
 tar -C $src_dir/$sqlzma_dir -x${xopt}f ${f2##*/} || errorexit "failed to extract $f2 into $src_dir/$sqlzma_dir"
 [ -d $src_dir/$sqlzma_dir/$squashfs_dir ] || errorexit "directory $src_dir/$sqlzma_dir/$squashfs_dir not found."
fi
if ! [ -d $src_dir/$sqlzma_dir/$lzma_dir ]; then
 [ "${f3##*tar}" = ".gz" ] && xopt=z
 [ "${f3##*tar}" = ".bz2" ] && xopt=j
 mkdir $src_dir/$sqlzma_dir/$lzma_dir
 tar -C $src_dir/$sqlzma_dir/$lzma_dir -x${xopt}f ${f3##*/} || errorexit "failed to extract $f3 into $src_dir/$sqlzma_dir"
 [ -d $src_dir/$sqlzma_dir/$lzma_dir ] || errorexit "directory $src_dir/$sqlzma_dir/$lzma_dir not found."
 cd $src_dir/$sqlzma_dir/
 patch -p0 <sqlzma1-443.patch
 patch -p0 <sqlzma2u-3.2-r2.patch
 cat $OLD_PWD/m01_sqlzmaMakefile.diff |sed "s/2.6.22/${kernel_base_version#linux-}/" >$OLD_PWD/m01_sqlzmaMakefile.diff.tmp
 patch -p0 <$OLD_PWD/m01_sqlzmaMakefile.diff.tmp && rm $OLD_PWD/m01_sqlzmaMakefile.diff.tmp
fi
cd $src_dir/$sqlzma_dir/
[ "$do_clean" ] && make clean
OLD_GCC=`gcc-config -c`
# select other compiler (c++ required) for lzma user space utilities
#[ "$OLD_GCC" != "i686-pc-linux-gnu-4.2.2" ] && gcc-config i686-pc-linux-gnu-4.2.2 && . /etc/profile
make
#[ "$OLD_GCC" != "i686-pc-linux-gnu-4.2.2" ] && gcc-config "$OLD_GCC" && . /etc/profile
[ -d /lib/modules/${kernel_version#linux-}/extra ] || mkdir /lib/modules/${kernel_version#linux-}/extra
echo -n "lzma modules in /lib/modules/${kernel_version#linux-}/extra/ are: "
for m in $kernel_base_version/fs/squashfs/squashfs.ko \
    $sqlzma_dir/$lzma_dir/C/7zip/Compress/LZMA_C/kmod/sqlzma.ko \
    $sqlzma_dir/$lzma_dir/C/7zip/Compress/LZMA_C/kmod/unlzma.ko; do
    [ -f $src_dir/$m ] || errorexit "module $src_dir/$m not found"
    cp $src_dir/$m /lib/modules/${kernel_version#linux-}/extra/
    echo -n "${m##*/} "
done
echo
depmod -ae -F $src_dir/$kernel_base_version/System.map ${kernel_version#linux-}
echo -n "lzma programs in $src_dir/$sqlzma_dir/ are: "
for f in $lzma_dir/C/7zip/Compress/LZMA_Alone/lzma \
	$squashfs_dir/squashfs-tools/mksquashfs \
	$squashfs_dir/squashfs-tools/unsquashfs; do
    [ -f $src_dir/$sqlzma_dir/$f ] || errorexit "program $src_dir/$sqlzma_dir/$f not found"
    cp $src_dir/$sqlzma_dir/$f $src_dir/$sqlzma_dir/
    echo -n "${f##*/} "
done
echo
cd $OLD_PWD

# loop module from loop-aes.sourceforge.net
f1=http://loop-aes.sourceforge.net/loop-AES/loop-AES-v3.2a.tar.bz2
d_tmp=${f1##*/}
loopaes_dir=${d_tmp%.tar*}
for f in $f1; do
 [ -f ${f##*/} ] || wget $f
 [ -f ${f##*/} ] || errorexit "failed to download $f"
done
D=$src_dir/$loopaes_dir
f=$f1
if ! [ -d $D ]; then
 [ "${f##*tar}" = ".gz" ] && xopt=z
 [ "${f##*tar}" = ".bz2" ] && xopt=j
 tar -C $src_dir -x${xopt}f ${f##*/} || errorexit "failed to extract $f into $src_dir"
 [ -d $D ] || errorexit "directory $D not found."
fi
cd $D
[ "$do_clean" ] && make clean
make LINUX_SOURCE=$src_dir/$kernel_base_version || errorexit "build of loop.ko failed"
echo "module loop.ko installed into /lib/modules/${kernel_version#linux-}/extra/"
cd $OLD_PWD

# aufs (another unionfs) module from aufs.sourceforge.net
#if true; then
if ! [ "`which cvs 2>/dev/null`" ]; then
 echo
 echo "warning: program cvs, required to compile module aufs.ko, not found; use command: emerge cvs "
else
 d_tmp=${f1##*/}
 aufs_dir=aufs_cvs
 D=$src_dir/$aufs_dir
 if ! [ -d $D/aufs ]; then
  mkdir $D
  cd $D
#  echo "when asked, press enter (empty cvs password)"
#  cvs -d:pserver:anonymous@aufs.cvs.sourceforge.net:/cvsroot/aufs login
        
#  cvs -z3 -d:pserver:anonymous@aufs.cvs.sourceforge.net:/cvsroot/aufs co -D 20070831 aufs
#  cvs -z3 -d:pserver:anonymous@aufs.cvs.sourceforge.net:/cvsroot/aufs co -D 20070917 aufs
  cvs -z3 -d:pserver:anonymous@aufs.cvs.sourceforge.net:/cvsroot/aufs co $AUFS_VERSION aufs
  [ -d $D/aufs ] || errorexit "directory $D/aufs not found."
 fi
 cd $D/aufs
 [ "$do_clean" ] && make clean
 [ -f local.mk.orig ] || cp local.mk local.mk.orig
 # disable debug klog messages
 cat local.mk.orig |sed "s/^ *\(CONFIG_AUFS_DEBUG *=\).*/\1/" >local.mk
 make KDIR=/usr/src/$kernel_base_version -f local.mk || errorexit "build of aufs.ko failed"
 [ -d /lib/modules/${kernel_version#linux-}/block ] || mkdir /lib/modules/${kernel_version#linux-}/block
 cp fs/aufs/aufs.ko /lib/modules/${kernel_version#linux-}/block/
 depmod -ae -F $src_dir/$kernel_base_version/System.map ${kernel_version#linux-}
 echo "module aufs.ko installed into /lib/modules/${kernel_version#linux-}/block/"
fi
cd $OLD_PWD

# fusion module from directfb.org
f1=http://directfb.org/snapshots/linux-fusion-2007-09-09-04-25-24-UTC.tar.gz
d_tmp=${f1##*/}
fusion_dir=${d_tmp%.tar*}
for f in $f1; do
 [ -f ${f##*/} ] || wget $f
 [ -f ${f##*/} ] || errorexit "failed to download $f"
done
D=$src_dir/$fusion_dir
f=$f1
if ! [ -d $D ]; then
 [ "${f##*tar}" = ".gz" ] && xopt=z
 [ "${f##*tar}" = ".bz2" ] && xopt=j
 tar -C $src_dir -x${xopt}f ${f##*/} || errorexit "failed to extract $f into $src_dir"
 [ -d $D ] || errorexit "directory $D not found."
fi
cd $D
[ -f Makefile.orig ] || cp Makefile Makefile.orig
cat Makefile.orig |sed "s/\(^ *KERNEL_VERSION *=\).*/\1 ${kernel_version#linux-}/" >Makefile
make && make install || errorexit "build of fusion.ko failed"
echo "module fusion.ko installed into /lib/modules/${kernel_version#linux-}/drivers/char/fusion/"
cd $OLD_PWD

# dazuko module from dazuko.org
f1=http://dazuko.org/files/dazuko-2.3.4-pre3.tar.gz
d_tmp=${f1##*/}
dazuko_dir=${d_tmp%.tar*}
D=$src_dir/$dazuko_dir
f=$f1
for f in $f1; do
 [ -f ${f##*/} ] || wget $f
 [ -f ${f##*/} ] || errorexit "failed to download $f"
done
D=$src_dir/$dazuko_dir
f=$f1
if ! [ -d $D ]; then
 [ "${f##*tar}" = ".gz" ] && xopt=z
 [ "${f##*tar}" = ".bz2" ] && xopt=j
 tar -C $src_dir -x${xopt}f ${f##*/} || errorexit "failed to extract $f into $src_dir"
 [ -d $D ] || errorexit "directory $D not found."
fi
cd $D
./configure --kernelsrcdir=$src_dir/$kernel_base_version --mapfile=/lib/modules/${kernel_version#linux-}/build/System.map || errorexit "configure for dazuko.ko failed"
[ -f Makefile.orig ] || cp Makefile Makefile.orig
cat Makefile.orig |sed "s/\(depmod\).*/\1 -ae ${kernel_version#linux-}/" >Makefile
[ "$do_clean" ] && make clean
make || errorexit "build of dazuko.ko failed"
f=/lib/modules/${kernel_version#linux-}/extra/dazuko.ko
[ -f $f ] && rm $f
make install
echo "module dazuko.ko installed into /lib/modules/${kernel_version#linux-}/extra/"
cd $OLD_PWD

# kqemu module, acceleration module for qemu from http://fabrice.bellard.free.fr/qemu
gcc3=`which gcc-3.4 2>/dev/null`
#if ! [ "$gcc3" ]; then
# echo "warning: build of qemu skipped because gcc-3.4 is not installed (kqemu cannot be compiled with gcc-4.x)"
# echo "use command: emerge -pv \"<gcc-4\""
#fi
if true; then
 f1=http://fabrice.bellard.free.fr/qemu/kqemu-1.3.0pre11.tar.gz
 d_tmp=${f1##*/}
 kqemu_dir=${d_tmp%.tar*}
 D=$src_dir/$kqemu_dir
 f=$f1
 for f in $f1; do
  [ -f ${f##*/} ] || wget $f
  [ -f ${f##*/} ] || errorexit "failed to download $f"
 done
 D=$src_dir/$kqemu_dir
 f=$f1
 if ! [ -d $D ]; then
  [ "${f##*tar}" = ".gz" ] && xopt=z
  [ "${f##*tar}" = ".bz2" ] && xopt=j
  tar -C $src_dir -x${xopt}f ${f##*/} || errorexit "failed to extract $f into $src_dir"
  [ -d $D ] || errorexit "directory $D not found."
 fi
 cd $D
 ./configure --cc=gcc-3.4 --kernel-path=$src_dir/$kernel_base_version || errorexit "configure for kqemu.ko failed"
 [ "$do_clean" ] && make clean
 make || errorexit "build of kqemu.ko failed"
 [ -d /lib/modules/${kernel_version#linux-}/block ] || mkdir /lib/modules/${kernel_version#linux-}/block
 cp kqemu.ko /lib/modules/${kernel_version#linux-}/extra/
 depmod -ae -F $src_dir/$kernel_base_version/System.map ${kernel_version#linux-}
 echo "module kqemu.ko installed into /lib/modules/${kernel_version#linux-}/extra/"
 cd $OLD_PWD
fi

cd $OLD_PWD
