#!/bin/sh

VERSION="0.8.6"
kernel_dirs="/lib/modules/`uname -r`/build \
    /usr/src/linux-`uname -r` \
    /usr/src/kernel-source-`uname -r` \
    /usr/src/linux"
FAILS=0
WARNINGS=0
CONFIG_SED="config.sed"

trap 'rm -f $CONFIG_SED; echo; echo "*** Interrupted"; exit 1' 1 2 15

CFLAGS=""
enable_agp="no"
enable_convert="no"
enable_cvs="no"
enable_asm="yes"

while [ $# -gt 0 ]; do
  case "$1" in
     --help | -h)
        cat <<EOF
Usage: $0 [options]
Options:
  --help		        show usage info (this message)
  --enable-agp		        enable some experimental AGP code
  --enable-software-conversion	enable software colour conversions
  --with-kernel=DIR	        kernel source tree located in DIR
  --disable-asm                 disable assembler code (useful for AMD64)
EOF
	exit 0
        ;;
     --with-kernel=*)
       kernel_dirs=`echo $1 | sed -e 's/--with-kernel=//'`
       ;;
     --enable-agp | --enable-agp=yes)
       enable_agp="yes"
       ;;
     --enable-software-conversion | --enable-software-conversion=yes)
       enable_convert="yes"
        ;;
     --disable-asm | --disable-asm=yes)
       enable_asm="no"
       ;;
  esac
  shift
done

echo -n "Checking for configured kernel headers... "

for k in $kernel_dirs; do
    if [ -f $k/include/linux/version.h ]; then
	kernel=$k
	echo "found [$kernel]"
	break
    fi
done
if test "$kernel" = ""; then
    echo "not found"
    echo "*** ERROR:"
    echo "*** In order to build RivaTV you need a set of kernel headers properly"
    echo "*** configured for the kernel you intend to use RivaTV with."
    FAILS=`expr $FAILS + 1`
    exit 1
fi

echo -n "Checking for linux kernel >= 2.4.0... "

error="`cat $kernel/include/linux/version.h | grep '#error' | sed -e 's/.*#error \\"\(.*\)\\"/echo \\"*** \1\\";/g'`"
if test -n "$error"; then
	echo "no, SuSE specific"
	echo "*** ERROR:"
	eval "$error"
	FAILS=`expr $FAILS + 1`
	exit 1
fi

UTS_RELEASE="`awk '/UTS_RELEASE/ {print $3}' $kernel/include/linux/version.h | sed -e 's/\\"//g' | sed -n '$p'`"
MAJOR=`echo $UTS_RELEASE | cut -nb 1,3 -`
if test `expr $MAJOR` -ge 24; then
	echo "yes [$UTS_RELEASE]"
else
	echo "no"
	echo "*** ERROR:"
	echo "*** Linux kernel 2.4.0 or higher required"
	FAILS=`expr $FAILS + 1`
fi

echo -n "Using bttv sources in... "

if test `expr $MAJOR` -ge 26; then
    bttvdir="bttv-2.6"
else
    bttvdir="bttv-2.4"
fi
echo $bttvdir
rm -f bttv && ln -s $bttvdir bttv

echo -n "Checking for kernel build system... "

if [ -f $kernel/Makefile ]; then
    DEFAULT="all-kbuild"
    echo "found"
else
    DEFAULT="all-native"
    echo "not found"
    echo "*** WARNING:"
    echo "*** Kernel build system not found. Trying reasonable defaults."
    WARNINGS=`expr $WARNINGS + 1`
fi

echo -n "Checking for kernel configuration... "

cfgfile="$kernel/.config"
if [ -r $cfgfile ]; then
    echo "found"
    cfg="CONFIG_MODVERSIONS"
    echo -n "Checking for $cfg... "
    result="`cat $cfgfile | grep \"$cfg=\" | sed -e 's/'$cfg'=\([a-z]\)/\1/g'`"
    test -n "$result" || result=n
    if test $result != "n"; then
	echo "yes"
	MODVERS="-DMODVERSIONS -include $kernel/include/linux/modversions.h"
    else
	echo "no"
    fi
    checks="PCI VIDEO_DEV PROC_FS I2C I2C_ALGOBIT MODULES"
    for config in $checks; do
	cfg="CONFIG_$config"
	echo -n "Checking for $cfg... "
        result="`cat $cfgfile | grep \"$cfg=\" | sed -e 's/'$cfg'=\([a-z]\)/\1/g' | sed -n '$p'`"
	test -n "$result" || result=n
	if test "$result" != "n"; then
	    echo "yes [$result]"
	else
	    echo "no"
	    echo "*** ERROR:"
	    echo "*** Your kernel is not correctly configured, please enable $cfg"
	    FAILS=`expr $FAILS + 1`
	fi
    done
else
    echo "not found"
    echo "*** WARNING:"
    echo "*** configure can not check your kernel configuration."
    WARNINGS=`expr $WARNINGS + 1`
fi

echo -n "Checking for kernel dependencies... "

if [ -r $kernel/.depend ]; then
	echo "found"
else
	if test `expr $MAJOR` -ge 26; then
	    echo "not needed for 2.6.x kernels"
	else
	    echo "not found"
	    echo "*** WARNING:"
	    echo "*** Your kernel dependencies are not set up."
	    echo "*** Please run \"make dep\" in $kernel"
	    WARNINGS=`expr $WARNINGS + 1`
	fi
fi

echo -n "Checking for RedHat or Mandrake kernel... "

if test -e /etc/redhat-release -a ! -e /etc/mandrake-release -a \
                                  ! -e /etc/fedora-release; then
	if [ -f $kernel/include/linux/rhconfig.h ]; then
	    CFLAGS="$CFLAGS -DRIVATV_ISREDHAT"
	    echo "yes"
	fi
else
	echo "no"
fi

echo -n "Checking whether AGP code should be included... "

if test "$enable_agp" = "yes"; then
	echo "yes"
else
	CFLAGS="$CFLAGS -DRIVATV_DISABLE_AGP"
	echo "no"
fi

echo -n "Checking whether software conversion code should be included... "

if test "$enable_convert" = "yes"; then
	echo "yes"
else
	CFLAGS="$CFLAGS -DRIVATV_DISABLE_CONVERSION"
	echo "no"
fi

echo -n "Checking whether assembler code is enabled... "

if test "$enable_asm" = "yes"; then
	CFLAGS="$CFLAGS -DRIVATV_ENABLE_ASM"
	echo "yes"
else
	echo "no"
fi

echo -n "Creating Makefile... "

cat <<EOF > $CONFIG_SED
s%@KERNEL@%$kernel%g
s%@UTS_RELEASE@%$UTS_RELEASE%g
s%@MODVERS@%$MODVERS%g
s%@VERSION@%$VERSION%g
s%@DEFAULT@%$DEFAULT%g
s%@CFLAGS@%$CFLAGS%g
EOF
cat Makefile.in | sed -f $CONFIG_SED > Makefile
rm -f $CONFIG_SED

echo "done"


echo "Checking your current setup for incompatibilities..."

echo -n "Checking for /proc... "

if test -n "`/bin/mount | grep \"type proc\"`"; then
	echo "yes"
else
	echo "no"
	echo "*** ERROR:"
	echo "*** proc-fs is needed for testing"
	echo "*** We recommend you enable proc-fs in your kernel"
	exit 1
fi

echo -n "Checking for kernel gcc... "

kgcc=`cat /proc/version | sed 's/\(.*\)gcc[ -][vV]ersion \([0-9.]*\).*/\2/'`
bgcc=`gcc -v 2>&1 |tail -n 1|sed 's/\(.*\)gcc[ -][vV]ersion \([0-9.]*\).*/\2/'`
echo $kgcc

if test "$bgcc" != "$kgcc"; then
	echo "*** WARNING:"
	echo "*** If you are going to use the running kernel (compiled with"
	echo "*** gcc version $kgcc) with RivaTV (will be compiled"
	echo "*** with gcc version $bgcc) you may experience system crashes."
	WARNINGS=`expr $WARNINGS + 1`
fi

# Check for write access to kernel sources

if test "$MAJOR" != "24"; then
	echo -n "Checking for write access to $kernel... "
	if test -w $kernel; then
		echo "yes"
	else
		echo "no"
		echo "*** WARNING:"
		echo "*** It looks like you do not have write access to the kernel sources,"
		echo "*** which is required when building for 2.6 kernels."
		WARNINGS=`expr $WARNINGS + 1`
	fi
fi

echo -n "Checking for framebuffer... "

VESAFB=`cat /proc/iomem|grep -i -c vesafb`
RIVAFB=`cat /proc/iomem|grep -i -c rivafb`
if test `expr $VESAFB + $RIVAFB` -eq 0; then
	echo "none"
elif test `expr $VESAFB` -eq 1; then
	echo "vesafb"
else
	echo "rivafb"
	echo "*** WARNING:"
	echo "*** RivaTV may not work with a framebuffer running"
	echo "*** Boot system with vga=normal or disable your framebuffer altogether"
	WARNINGS=`expr $WARNINGS + 1`
fi

echo -n "Checking for SMP... "

CPUS=`cat /proc/cpuinfo|grep -E -c -i "^processor"`
if test `expr $CPUS` -gt 1; then
	echo "yes"

	config="/etc/X11/XF86Config-4 /usr/X11R6/lib/X11/XF86Config
	/usr/X11R6/etc/X11/XF86Config /etc/XF86Config /etc/X11/XF86Config"

	file=none
	nvidia=""
	nv=""
	nvdriver=""

	echo -n "Checking for XF86Config... "
	for f in $config; do
		if [ -r $f ]; then
			echo "found in $f"
			file=$f
		fi
	done
	if test $file = none; then
	echo "not found."
	else
		echo -n "Checking for use of nvidia driver... "
		nvidia=`cat $file | sed -e 's/#.*//g' | grep "Driver[[:space:]]*\"nvidia\""`
		if test -n "$nvidia"; then
			echo "yes"
		else
			echo "no"
		fi
		echo -n "Checking for use of nv driver... "
		nv=`cat $file | sed -e 's/#.*//g' | grep "Driver[[:space:]]*\"nv\""`
		if test -n "$nv"; then
			echo "yes"
		else
			echo "no"
		fi
	fi

	echo -n "Checking for running NVdriver or nvidia... "
	nvdriver1=`grep NVdriver /proc/modules`
	nvdriver2=`grep nvidia /proc/modules`
	if test -n "$nvdriver1" -o -n "$nvdriver2"; then
		echo "yes"
		nvidia="yes"
	else
		echo "no"
	fi

	if test -n "$nvidia"; then
		echo "*** ERROR:"
		echo "*** You are currently using the closed-source accelerated 'nvidia' driver"
		echo "*** In combination with RivaTV, this may cause crashes."
		echo "*** To work around, either use UP + NVdriver (nvidia), or SMP + nv"
		FAILS=`expr $FAILS + 1`
	else
		echo -n "Checking for availability of NVdriver or nvidia..."
		if test -f /lib/modules/`uname -r`/kernel/drivers/video/NVdriver.o -o \
			-f /lib/modules/`uname -r`/kernel/drivers/video/NVdriver.ko -o \
			-f /lib/modules/`uname -r`/kernel/drivers/video/nvidia.o -o \
			-f /lib/modules/`uname -r`/kernel/drivers/video/nvidia.ko; then
			echo "yes"
			echo "*** WARNING:"
			echo "*** If you use SMP and NVdriver together, the system can become unstable"
			echo "*** To work around, either use UP + NVdriver (nvidia), or SMP + nv"
			WARNINGS=`expr $WARNINGS + 1`
		else
			echo "no"
		fi
	fi
else
	echo "no"
fi

echo
if test `expr $FAILS + $WARNINGS` -gt 0; then
	echo "Your setup got $FAILS error(s) and $WARNINGS warning(s)."
	echo "We recommend you try to resolve the issues before using RivaTV."
	exit 1
else
	echo "No problems found."
	echo "To build RivaTV type \`make'.  For cleaning up type \`make clean\`."
fi
