#!/bin/sh

test_kver() {
	req_major=`echo $1 | awk -F . '{ print $1 }'`
	req_minor=`echo $1 | awk -F . '{ print $2 }'`
	req_rev=`echo $1 | awk -F . '{ print $3 }'`

	linux_rev=`uname -r | sed 's/-.*//'`
	kver_major=`echo $linux_rev | awk -F . '{ print $1 }'`
	kver_minor=`echo $linux_rev | awk -F . '{ print $2 }'`
	kver_rev=`echo $linux_rev | awk -F . '{ print $3 }'`

	if [ "$kver_major" -lt "$req_major" ]; then
		return 1
	fi
	if [ "$kver_major" = "$req_major" ]; then
		if [ "$kver_minor" -lt "$req_minor" ]; then
			return 1
		fi

		if [ "$kver_minor" = "$req_minor" -a "$kver_rev" -lt "$req_rev" ]; then
			return 1
		fi
	fi
	return 0
}

check_header() {
	printf "Looking for header: $1 ... " >&2
	echo "#include <$1>" >.chkhdr.c
	if cpp -I/usr/local/include $x11inc .chkhdr.c >/dev/null 2>&1; then
		echo found >&2
		echo "#define HAVE_`basename $1 | tr '[:lower:]' '[:upper:]' | sed 's/\./_/g'`"
	else
		echo not found >&2
	fi
	rm -f .chkhdr.c
}


PREFIX=/usr/local
OPT=yes
DBG=yes
X11=yes
HOTPLUG=yes
XINPUT=yes
VER=1.3.1
CFGDIR=/etc

if [ -z "$VER" ]; then
	VER=`git rev-parse --short HEAD`
	if [ -z "$VER" ]; then
		VER=v`pwd | grep 'spacenavd-[0-9]\+\.' | sed 's/.*spacenavd-\(\([0-9]\+\.\)\+[0-9]\+\).*$/\1/'`
		if [ $VER = v ]; then
			VER='<unknown version>'
		fi
	fi
fi

echo "configuring spacenavd - $VER"

sys=`uname -s`
if [ "$sys" = Linux ]; then
	# NETLINK_KOBJECT_UEVENT used for hotplug detection requires 2.6.10
	if test_kver 2.6.10; then
		HOTPLUG=yes
	else
		HOTPLUG=no
	fi
elif [ "$sys" = Darwin ]; then
	LDFLAGS='-framework CoreFoundation -framework IOKit'
else
	# TODO implement hotplug for other systems then switch this on
	HOTPLUG=no
fi

srcdir="`dirname "$0"`"

# process arguments
for arg; do
	case "$arg" in
	--prefix=*)
		value=`echo $arg | sed 's/--prefix=//'`
		PREFIX=${value:-$prefix}
		;;

	--cfgdir=*)
		value=`echo $arg | sed 's/--cfgdir=//'`
		CFGDIR=${value:-$cfgdir}
		;;
	
	--enable-opt)
		OPT=yes;;
	--disable-opt)
		OPT=no;;

	--enable-debug)
		DBG=yes;;
	--disable-debug)
		DBG=no;;
	
	--enable-x11)
		X11=yes;;
	--disable-x11)
		X11=no;;

	--enable-hotplug)
		HOTPLUG=yes;;
	--disable-hotplug)
		HOTPLUG=no;;

	--help)
		echo 'usage: ./configure [options]'
		echo 'options:'
		echo '  --prefix=<path>: installation path (default: /usr/local)'
		echo '  --enable-x11: enable X11 communication mode (default)'
		echo '  --disable-x11: disable X11 communication mode'
		echo '  --enable-hotplug: enable hotplug using NETLINK_KOBJECT_UEVENT (default)'
		echo '  --disable-hotplug: disable hotplug, fallback to polling for the device'
		echo '  --enable-opt: enable speed optimizations (default)'
		echo '  --disable-opt: disable speed optimizations'
		echo '  --enable-debug: include debugging symbols (default)'
		echo '  --disable-debug: do not include debugging symbols'
		echo 'all invalid options are silently ignored'
		exit 0
		;;
	esac
done

echo "  prefix: $PREFIX"
echo "  config dir: $CFGDIR"
echo "  optimize for speed: $OPT"
echo "  include debugging symbols: $DBG"
echo "  x11 communication method: $X11"
echo "  use hotplug: $HOTPLUG"
echo ""


HAVE_ALLOCA_H=`check_header alloca.h`
HAVE_MALLOC_H=`check_header malloc.h`
HAVE_STDINT_H=`check_header stdint.h`
HAVE_INTTYPES_H=`check_header inttypes.h`

if [ "$X11" = "no" ]; then
	echo "WARNING: you have disabled the X11 interface, the resulting daemon \
won't be compatible with applications written for the proprietary 3Dconnexion \
daemon (3dxserv)!"
	echo
else
	# find alternate X11 header/lib paths
	if [ -e /usr/local/include/X11/Xlib.h ]; then
		x11prefix='/usr/local'
	elif [ -e /usr/X11/include/X11/Xlib.h ]; then
		x11prefix='/usr/X11'
	elif [ -e /usr/X11R6/include/X11/Xlib.h ]; then
		x11prefix='/usr/X11R6'
	elif [ -e /opt/homebrew/include/X11/Xlib.h ]; then
		x11prefix='/opt/homebrew'
	fi
	if [ -n "$x11prefix" ]; then
		echo "X11 prefix: $x11prefix"
		x11inc=-I$x11prefix/include
		x11lib=-L$x11prefix/lib
	fi

	HAVE_XINPUT2_H=`check_header X11/extensions/XInput2.h`
	HAVE_XTEST_H=`check_header X11/extensions/XTest.h`

	if [ -z "$HAVE_XTEST_H" ]; then
		echo "WARNING: building without XTEST support, makes keyboard emulation \
less reliable (fallback to XSendEvent)."
	fi
fi

# create Makefile
echo 'creating Makefile ...'
echo "PREFIX = $PREFIX" >Makefile
echo "srcdir = $srcdir" >>Makefile
echo "ver = $VER" >>Makefile

if [ "$DBG" = 'yes' ]; then
	echo 'dbg = -g' >>Makefile
fi

if [ "$OPT" = 'yes' ]; then
	echo 'opt = -O2' >>Makefile
fi

if [ "$X11" = 'yes' ]; then
	echo "xinc = $x11inc" >>Makefile
	echo "xlib = $x11lib" >>Makefile

	if [ -n "$HAVE_XINPUT2_H" ]; then
		echo 'xlib += -lXi' >>Makefile
	fi
	if [ -n "$HAVE_XTEST_H" ]; then
		echo xlib += -lXtst >>Makefile
	fi
	echo 'xlib += -lX11 -lXext' >>Makefile
fi

if [ -n "$CFLAGS" ]; then
	echo "add_cflags = $CFLAGS" >>Makefile
fi
if [ -n "$LDFLAGS" ]; then
	echo "add_ldflags = $LDFLAGS" >>Makefile
fi

cat "$srcdir/Makefile.in" >>Makefile


# create config.h
cfgheader=$srcdir/src/config.h

echo 'creating config.h'
echo '#ifndef CONFIG_H_' >$cfgheader
echo '#define CONFIG_H_' >>$cfgheader
echo >>$cfgheader
if [ "$X11" = yes ]; then
	echo '#define USE_X11' >>$cfgheader
	echo >>$cfgheader
fi
if [ "$HOTPLUG" = yes ]; then
	echo '#define USE_NETLINK' >>$cfgheader
	echo >>$cfgheader
fi
echo '#define VERSION "'$VER'"' >>$cfgheader
echo >>$cfgheader

# check for alloca.h
[ -n "$HAVE_ALLOCA_H" ] && echo $HAVE_ALLOCA_H >>$cfgheader
[ -n "$HAVE_MALLOC_H" ] && echo $HAVE_MALLOC_H >>$cfgheader
[ -n "$HAVE_STDINT_H" ] && echo $HAVE_STDINT_H >>$cfgheader
[ -n "$HAVE_INTTYPES_H" ] && echo $HAVE_INTTYPES_H >>$cfgheader
[ -n "$HAVE_XINPUT2_H" ] && echo $HAVE_XINPUT2_H >>$cfgheader
[ -n "$HAVE_XTEST_H" ] && echo $HAVE_XTEST_H >>$cfgheader
echo >>$cfgheader

echo "#define CFGDIR \"$CFGDIR\"" >>$cfgheader
echo >>$cfgheader

echo '#endif	/* CONFIG_H_ */' >>$cfgheader

echo ''
echo 'Done. You can now type make (or gmake) to compile spacenavd.'
echo ''
