#!/bin/bash
#
# slackbuild for Qemu, by Rudson R. Alves
# requires: qemu
# tested: kqemu-1.3.0pre9

CWD=`pwd`

if [ -e "/root/.slackbuildrc" ]; then
  source /root/.slackbuildrc
elif [ -e "/etc/slackbuildrc" ]; then
  source /etc/slackbuildrc
fi

# --------  Vari�veis de controle de vers�o  --------------
# Nome da fonte para a qual o slackbuild foi constru�do e
# o seu md5sum
SRC_ORIG="kqemu-1.3.0pre9.tar.gz"
MD5_ORIG="27888c3220844ad360a6a23345fa1bcb"
VERSION_ORIG="1.3.0" #`echo $SRC_ORIG | sed 's/\(.*\)-\(.*\)\.\(.*\..*\)$/\2/'`
EXTENSION=`echo $SRC_ORIG | sed 's/\(.*\)-\(.*\)\.\(.*\..*\)$/\3/'`

# -------  C�digos de erro para o createpkg  --------------
ERROR_WGET=31;      ERROR_MAKE=32;      ERROR_INSTALL=33
ERROR_MD5=34;       ERROR_CONF=35;      ERROR_HELP=36
ERROR_TAR=37;       ERROR_MKPKG=38

# ---------  Inicializa vari�veis de entrada  -------------
PACKAGE=`echo $SRC_ORIG | sed 's/\(.*\)-\(.*\)\.\(.*\..*\)$/\1/'`
ARCH=${ARCH:=i468}
SRC_DIR=${SRC:=$CWD}
if [ "$VERSION" != "" ]; then
    # Constroi nome do pacote
    SRC=$PACKAGE-$VERSION.$EXTENSION
else
    # Remove nome e vers�o do pacote
    SRC=$SRC_ORIG
    VERSION=$VERSION_ORIG
fi
BUILD=${BUILD:=1rud}
TMP=${TMP:=/tmp}
REPOS=${REPOS:=$TMP}
PREFIX=${PREFIX:=/usr}
OPTCONF=${OPTCONF:=""}
MD5=${MD5:=$MD5_ORIG}
URL=${URL:="http://fabrice.bellard.free.fr/qemu/$SRC"}

# ----------------  SlackBuild Help  ----------------------
if [ "$1" = "--help" -o "$1" = "help" ]; then
    echo -e "\033[01;32m
Use: var1=\"value 1\" var2=\"value 2\" ... <package>.SlackBuild
where:
    ARCH=machine arch (i386, i486, i686, ...)
    VERSION=package version
    BUILD=package build version (default 1rud)
    SRC=source name of package
    SRC_DIR=source directory (default $PWD)
    TMP=temporary directory (default /tmp)
    REPOS=repository directory
    PREFIX=prefix from install package
    OPTCONF=options to pass from ./configure. To configure
            help, use OPTCONF=\"--help\"
    MD5=md5sum from package source
    URL=url from package source
\033[m"
    exit $ERROR_HELP
fi

# ----------------  Download fontes  ----------------------
# Fonte a ser compilada, com o path
SOURCE=$SRC_DIR/$SRC
# Verifica exist�ncia do pacote em $SRC em $SRC_DIR
if [ ! -e $SOURCE ]; then
    echo -e "\n\n\033[01;32m Download $PACKAGE \n\033[m"
    wget "$URL" -P "$SRC_DIR/"
    # Verifica se o
    if [ $? -ne 0 ]; then
        echo -e "\n\n\033[01;31m No such source file in $URL\n\033[m"
        exit $ERROR_WGET
    fi
fi

# ------------------  Checa md5sum  -----------------------
if [ "$SRC_ORIG" = "$SRC" -o "$MD5" != "$MD5_ORIG" -a "$MD5" != "no" ]; then
    SUM=`md5sum $SRC_DIR/$SRC | awk '{print $1}'`
    if [ "$SUM" != "$MD5" ]; then
        echo -e "\n\n\033[01;31m MD5SUM error: run Slackbuild again \n\033[m"
        echo -e "\033[01;31m Remove $PACKAGE from $SRC_DIR and start Slackbuild again or use MD5=\"no\" \n\033[m"
        exit $ERROR_MD5
    fi
    echo -e "\n\n\033[01;32m Md5sum Ok \n\033[m"
fi

# -----------------  ARCH e LIBDIR  -----------------------
# Libdir, para arch x86_64
LIBDIR=$PREFIX/lib
# Seleciona flags para o compilador
if [ "$ARCH" = "i386" ]; then
    SLKCFLAGS="-O2 -march=i386 -mcpu=i686"
elif [ "$ARCH" = "i486" ]; then
    SLKCFLAGS="-O2 -march=i486 -mcpu=i686"
elif [ "$ARCH" = "i686" ]; then
    SLKCFLAGS="-O2 -march=i686"
elif [ "$ARCH" = "s390" ]; then
    SLKCFLAGS="-O2"
elif [ "$ARCH" = "x86_64" ]; then
    SLKCFLAGS="-O2"
    LIBDIR="$PREFIX/lib64"
fi

# --------------  Desempacota fontes  ---------------------
# Desempacota fontes em $TMP/$PACKAGE-source
PKG_SRC=$TMP/$PACKAGE-source
rm -rf $PKG_SRC 2>/dev/null
mkdir -p $PKG_SRC
# Desempacota $SOURCE em $TMP/$PACKAGE-source
tar xvf $SOURCE -C $PKG_SRC 2>/dev/null
if [ $? -ne 0 ]; then
    echo -e "\n\n\033[01;31m $SOURCE file error \n\033[m"
    exit $ERROR_TAR
fi
# Pega o nome do diret�rio das fontes independente de sua
# estrutura (package-version...)
PKG_DIR="$PKG_SRC/$( ls $PKG_SRC/ )"
cd $PKG_DIR

# --------------  Configura programa  ---------------------
# Configura programa
echo -e "\n\n\033[01;32m CFLAGS=\"$SLKCFLAGS\" ./configure --prefix=$PREFIX --libdir=$LIBDIR $OPTCONF \n\033[m"
CFLAGS="$SLKCFLAGS" ./configure --prefix=$PREFIX --libdir=$LIBDIR $OPTCONF
if [ $? -ne 0 -o "$OPTCONF" = "--help" ]; then
    echo -e "\n\n\033[01;31m Configure error \n\033[m"
    exit $ERROR_CONF
fi

# ----------------  Compila programa  ---------------------
echo -e "\n\n\033[01;32m make -j3 \n\033[m"
make -j3
if [ $? -ne 0 ]; then
    echo -e "\n\n\033[01;31m Build error \n\033[m"
    exit 0
fi

# -------------  Diret�rio Tempor�rio  --------------------
# Cria diret�rio tempor�rio para constru��o do pacote
PKG=$TMP/$PACKAGE
rm -rf $PKG
mkdir -p $PKG

# ---------------  Instala programa  ----------------------
#           #### Instala��o de bin�rios #####
# Instala programa em diret�rio tempor�rio
echo -e "\n\n\033[01;32m Install $PACKAGE in $PKG \n\033[m"

# Find module name
if [ -f kqemu.ko ] ; then
   MODULE=kqemu.ko
else
   MODULE=kqemu.o
fi

# Find kernel install path
KERNEL_PATH="/lib/modules/`uname -r`"

mkdir -p "$PKG/$KERNEL_PATH/misc"
cp "$MODULE" "$PKG/$KERNEL_PATH/misc"
#            #### Fim da instala��o #####

# -----------------  Stripa c�digo  -----------------------
cd $PKG
find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null

# ----------------  Cria doinstall  ----------------------
# Script de instala��o
mkdir $PKG/install
echo -e "\n\n\033[01;32m doinst.sh \n\033[m"
cat << EOF_DONINST > install/doinst.sh
#!/bin/sh
set +e
MODFILE=/etc/rc.d/rc.local

/sbin/depmod -a

# Create the kqemu device. No special priviledge is needed to use kqemu.
DEVICE="/dev/kqemu"
rm -f \$DEVICE
mknod \$DEVICE c 250 0
chmod 666 \$DEVICE

MODULE=\$(grep 'kqemu' \$MODFILE)
if [ "\$MODULE" = "" ]; then
    echo "# Loading kqemu module" >> \$MODFILE
    echo "/sbin/modprobe kqemu" >> \$MODFILE
    echo "echo 1024 > /proc/sys/dev/rtc/max-user-freq" >> \$MODFILE
else
    echo -e "\nCheck kqemu mudules install in \$MODFILE\n"
fi
echo "Loading kqemu module"
/sbin/modprobe kqemu
echo 1024 > /proc/sys/dev/rtc/max-user-freq
EOF_DONINST

# ----------------  Cria slack-desc  ----------------------
# Slack-desc
echo -e "\n\n\033[01;32m slack-desc \n\033[m"
cat << EOF_SLACK > install/slack-desc
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in.  You must make
# exactly 11 lines for the formatting to be correct.  It's also customary to
# leave one space after the ':'.

     |--------handy-ruler------------------------------------------------------|
kqemu: KQEMU package by Rudson R. Alves <rudsonalves[a]yahoo.com.br>
kqemu:
kqemu: QEMU Accelerator (KQEMU) is a driver allowing the QEMU PC emulator to
kqemu: run much faster when emulating a PC on an x86 host.
kqemu:
kqemu: KQEMU is supported on x86 or x86_64 Linux 2.4 or 2.6 hosts. Experimental
kqemu: versions are available for FreeBSD and Windows NT/2000/2003/XP.
kqemu:
kqemu:
kqemu:
kqemu:
EOF_SLACK

# -----------------  Documenta��es  -----------------------
# Criar diret�rio de documenta��o
PKG_DOC=$PKG/usr/doc/$PACKAGE-$VERSION
mkdir -p $PKG_DOC
cp $PKG_DIR/{Changelog,LICENSE,README} $PKG_DOC

# ---------------  Constroi o pacote  ---------------------
echo -e "\n\n\033[01;32m makepkg -c y -l y $REPOS/$PACKAGE-$VERSION-$ARCH-$BUILD.tgz \n\033[m"
makepkg -c y -l y $REPOS/$PACKAGE-$VERSION-$ARCH-$BUILD.tgz
if [ $? -ne 0 ]; then
    exit $ERROR_MKPKG
fi

# -----------  Remove arquivos tempor�rios  ---------------
if [ "$CLEANUP" = "yes" ]; then
    echo -e "\n\n\033[01;32m Remove files... \n\033[m"
    rm -rf $PKG $PKG_SRC
fi