dnl $Id$
dnl Process this file with autoconf to produce a configure script.

dnl stick the revision info into the resulting configure script
AC_REVISION($Revision$) dnl
AC_PREREQ(2.50)

AC_INIT(quake2, 0.1, quake2-devel@lists.quakeforge.net)
AC_CONFIG_SRCDIR(src/main.c)
AM_CONFIG_HEADER(config.h)

dnl get the build and target hosts
AC_CANONICAL_SYSTEM

AM_INIT_AUTOMAKE([1.6 foreign])

dnl configure --enable-maintainer-mode gets some extra targets
AM_MAINTAINER_MODE

dnl set some macros
AC_DEFINE_UNQUOTED(BUILDHOST, "${target_cpu}-${target_os}", 
	[Set to the canonical name of the target machine])
AC_SUBST(PROGRAM)
AC_SUBST(VERSION)

dnl -------------------
dnl Checks for programs
dnl -------------------

AC_PROG_CC

dnl libtool is evil
AC_PROG_LIBTOOL

HAVE_MASM=""
AC_SUBST(HAVE_MASM)

AS="$CC"
ASFLAGS="\$(DEFS) \$(CFLAGS) \$(CPPFLAGS) \$(DEFAULT_INCLUDES) \$(INCLUDES)"
CCAS="$AS"
CCASFLAGS="$ASFLAGS"
AC_SUBST(AS)
AC_SUBST(ASFLAGS)
AC_SUBST(CCAS)
AC_SUBST(CCASFLAGS)

dnl --------------------
dnl Checks for libraries
dnl --------------------

AC_PATH_PROG(unamepath, uname)
if test "_$unamepath" = _; then
	system="unknown"
else
	AC_MSG_CHECKING(system type)
	system=`$unamepath -s`
	AC_MSG_RESULT($system)
	if test "$system" = "SunOS"; then
		SYSTEM_LIBS="$SYSTEM_LIBS -lsocket -lnsl"
	else
		SYSTEM_LIBS=""
	fi
	AC_SUBST(SYSTEM_LIBS)
fi

dnl Check for ossaudio on NetBSD
OSS_LIBS=""
AC_CHECK_LIB([ossaudio], [_oss_ioctl], [OSS_LIBS="-lossaudio"])
AC_SUBST(OSS_LIBS)

dnl Check for POSIX threads
ACX_PTHREAD(,AC_MSG_ERROR(["POSIX threads required!"]))

dnl Check for SVGAlib
AC_ARG_WITH(svgalib,
	[  --with-svgalib=DIR      use SVGAlib found in DIR ],
	HAVE_SVGALIB=$withval, HAVE_SVGALIB=auto)
if test "x$HAVE_SVGALIB" != xno; then
	if test "x$HAVE_SVGALIB" != xauto; then
		SVGALIB_CFLAGS="$SVGALIB_CFLAGS -I$withval/include"
		SVGALIB_LIBS="$SVGALIB_LIBS -L$withval/lib"
		dnl The default system location is /usr/include or
		dnl /usr/local/include and we don't need to set CFLAGS
		dnl for that
	fi
	save_CPPFLAGS="$CPPFLAGS"
	CPPFLAGS="$CPPFLAGS $SVGALIB_CFLAGS"
	AC_CHECK_HEADER(vga.h, HAVE_SVGALIB=yes, HAVE_SVGALIB=no)
	CPPFLAGS="$save_CPPFLAGS"
	dnl make sure -lvga works
	if test "x$HAVE_SVGALIB" = xyes; then
		AC_CHECK_LIB(vga, vga_getmousetype, 
			SVGALIB_LIBS="$SVGALIB_LIBS -lvga"
			HAVE_SVGALIB=yes,
			HAVE_SVGALIB=no,
			[$SVGALIB_LIBS]
		)
	fi
	if test "x$HAVE_SVGALIB" != xyes; then
		SVGALIB_CFLAGS="" SVGALIB_LIBS=""
	fi
fi
AC_SUBST(HAVE_SVGALIB)
AC_SUBST(SVGALIB_CFLAGS)
AC_SUBST(SVGALIB_LIBS)

dnl Check for X11
AC_PATH_XTRA
if test "x$no_x" = x; then
	HAVE_X=yes
	HAVE_XF86_VIDMODE=yes
	HAVE_XF86_DGA=yes
	XTRA_LIBS="-lX11"
	AC_CHECK_LIB(Xext, XShmQueryExtension,
		XTRA_LIBS="$XTRA_LIBS -lXext",
		HAVE_X=no,
		[ $X_LIBS $XTRA_LIBS $X_EXTRA_LIBS ]
	)
	if test "x$HAVE_X" = xyes; then
		save_CPPFLAGS="$CPPFLAGS"
		CPPFLAGS="$CPPFLAGS $X_CFLAGS"
		AC_CHECK_HEADER(X11/extensions/xf86vmode.h,
			dnl Make sure the library works
			AC_CHECK_LIB(Xxf86vm, XF86VidModeSwitchToMode,
				XTRA_LIBS="$XTRA_LIBS -lXxf86vm"
				AC_DEFINE(HAVE_XF86_VIDMODE, 1, [Define this if you have the xf86vmode extension and its Xxf86vm library.]),
				HAVE_XF86_VIDMODE=no,
				[$X_LIBS $XTRA_LIBS $X_EXTRA_LIBS]
			),
			HAVE_XF86_VIDMODE=no,
			[#include <X11/Xlib.h>]
		)
		CPPFLAGS="$save_CPPFLAGS"
	fi
	if test "x$HAVE_X" = xyes; then
		save_CPPFLAGS="$CPPFLAGS"
		CPPFLAGS="$CPPFLAGS $X_CFLAGS"
		AC_CHECK_HEADER(X11/extensions/xf86dga.h,
			AC_CHECK_LIB(Xxf86dga, XF86DGAQueryVersion,
				XTRA_LIBS="$XTRA_LIBS -lXxf86dga"
				AC_DEFINE(HAVE_XF86_DGA, 1, [Define this if you have the xf86dga extension and its Xxf86dga library.]),
				HAVE_XF86_DGA=no,
				[$X_LIBS $XTRA_LIBS $X_EXTRA_LIBS]
			),
			HAVE_XF86_DGA=no,
			[#include <X11/Xlib.h>]
		)
		CPPFLAGS="$save_CPPFLAGS"
	fi
	if test "x$HAVE_X" != xyes; then
		XTRA_LIBS=""
	fi
fi
AC_SUBST(HAVE_X)
AC_SUBST(HAVE_XF86_VIDMODE)
AC_SUBST(HAVE_XF86_DGA)
AC_SUBST(XTRA_LIBS)

dnl Check for OpenGL
AC_ARG_WITH(opengl,
	[  --with-opengl=DIR       use OpenGL in DIR ],  
	HAVE_OPENGL=$withval,
	HAVE_OPENGL=auto)
if test "x$HAVE_OPENGL" != xno; then
	if test "x$HAVE_OPENGL" != xauto; then
		OPENGL_CFLAGS="$OPENGL_CFLAGS -I$withval/include"
		OPENGL_LIBS="$OPENGL_LIBS -L$withval/lib"
	fi
	save_CPPFLAGS="$CPPFLAGS"
	CPPFLAGS="$CPPFLAGS $OPENGL_CFLAGS"
	AC_CHECK_HEADER(GL/gl.h, HAVE_OPENGL=yes, HAVE_OPENGL=no)
	CPPFLAGS="$save_CPPFLAGS"
	if test "x$HAVE_OPENGL" = xyes; then
		AC_CHECK_LIB(GL, glBegin,
			OPENGL_LIBS="$OPENGL_LIBS -lGL"
			HAVE_OPENGL=yes,
			dnl add -lX11 and -lXext if the first test failed
			dnl (for, e.g. FreeBSD)
			unset ac_cv_lib_GL_glBegin
			AC_CHECK_LIB(GL, glBegin,
				OPENGL_LIBS="$OPENGL_LIBS -lX11 -lXext"
				HAVE_OPENGL=yes,
				HAVE_OPENGL=no,
				[$OPENGL_LIBS -lX11 -lXext]
			),
			[$OPENGL_LIBS]
		)
	fi
	if test "x$HAVE_OPENGL" = xyes; then
		AC_CHECK_HEADER(GL/glext.h, HAVE_OPENGL_GLEXT=yes
			AC_DEFINE(HAVE_OPENGL_GLEXT, 1, [Define this if you have GL/glext.h]),
		HAVE_OPENGL_GLEXT=no,
		[#include <GL/gl.h>])
	fi
	if test "x$HAVE_OPENGL" != xyes; then
		OPENGL_CFLAGS=""
		OPENGL_LIBS=""
	fi
fi
AC_SUBST(HAVE_OPENGL)
AC_SUBST(OPENGL_LIBS)
AC_SUBST(OPENGL_CFLAGS)

dnl Check for SDL
AC_ARG_ENABLE(sdl,
[  --disable-sdl           disable checking for SDL ],
)
if test "x$enable_sdl" != xno; then
	AM_PATH_SDL(1.2.0,
		HAVE_SDL=yes,
		HAVE_SDL=no)
	AC_SUBST(HAVE_SDL)
fi

#AC_CHECK_LIB(GL, glBegin)
# FIXME: Replace `main' with a function in `-lX11':
#AC_CHECK_LIB(X11, [main])
# FIXME: Replace `main' with a function in `-lXext':
#AC_CHECK_LIB([Xext], [main])
# FIXME: Replace `main' with a function in `-lXxf86dga':
#AC_CHECK_LIB([Xxf86dga], [main])
# FIXME: Replace `main' with a function in `-lXxf86vm':
#AC_CHECK_LIB([Xxf86vm], [main])

dnl -----------------------
dnl Checks for header files
dnl -----------------------

#AC_PATH_X
#AC_HEADER_DIRENT
#AC_HEADER_STDC
dnl AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS([ sys/soundcard.h ])

dnl -------------------------------------------------------------
dnl Checks for typedefs, structures, and compiler characteristics
dnl -------------------------------------------------------------

AC_C_CONST
AC_C_INLINE
AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_STRUCT_TM
AC_TYPE_UID_T
AC_TYPE_VA_LIST

AC_MSG_CHECKING(for underscore prefix in names)
AC_TRY_LINK(
	[asm(".long _bar");
	int bar;],
	[],
	AC_DEFINE(HAVE_SYM_PREFIX_UNDERSCORE, 1, [Define this if C symbols are prefixed with an underscore]) AC_MSG_RESULT(yes),
	AC_MSG_RESULT(no)
)

if test "x$ac_cv_header_sys_soundcard_h" = "xyes"; then
	AC_MSG_CHECKING(for AFMT_S16_NE in sys/soundcard.h)
	AC_EGREP_CPP([QF_maGiC_VALUE], 
		[ #include <sys/soundcard.h>
		  #ifdef AFMT_S16_NE
		  QF_maGiC_VALUE
		  #endif ],
		HAVE_AFMT_S16_NE=yes
		AC_MSG_RESULT(yes)
		,
		AC_MSG_RESULT(no)
	)
else if test "x$ac_cv_header_soundcard_h" = "xyes"; then
	AC_MSG_CHECKING(for AFMT_S16_NE in soundcard.h)
	AC_EGREP_CPP([QF_maGiC_VALUE], 
		[ #include <soundcard.h>
		  #ifdef AFMT_S16_NE
		  QF_maGiC_VALUE
		  #endif ],
		HAVE_AFMT_S16_NE=yes
		AC_MSG_RESULT(yes)
		,
		AC_MSG_RESULT(no)
	)
     fi
fi
AC_SUBST(HAVE_AFMT_S16_NE)

dnl -----------------------------
dnl Checks for library functions.
dnl -----------------------------

#AC_FUNC_ERROR_AT_LINE
#AC_PROG_GCC_TRADITIONAL
#AC_FUNC_MALLOC
#AC_FUNC_MEMCMP
#AC_FUNC_MMAP
#AC_TYPE_SIGNAL
#AC_FUNC_STAT
#AC_FUNC_VPRINTF
#AC_CHECK_FUNCS([bzero floor getcwd gethostbyname getmntent getpagesize gettimeofday memmove memset mkdir munmap pow putenv select socket sqrt strcasecmp strchr strdup strerror strrchr strstr])
AC_FUNC_VA_COPY
AC_FUNC__VA_COPY

dnl Check for dynamic loader -- needed for the GL refreshers
AC_CHECK_FUNCS(dlopen)
DL_LIBS=""
if test "x$ac_cv_func_dlopen" != "xyes"; then
	AC_CHECK_LIB(dl, 
		dlopen,
		AC_DEFINE(HAVE_DLOPEN, 1, [Define if you have the dlopen function.]) DL_LIBS="-ldl"
	)
fi
AC_SUBST(DL_LIBS)

#SDL_FLAGS=`sdl-config --libs`
#AC_SUBST(SDL_FLAGS)

dnl --------------------
dnl Input device support
dnl --------------------

AC_MSG_CHECKING(whether to enable joystick support)
AC_ARG_ENABLE(joystick,
	[  --disable-joystick      disable joystick support ],
	AC_MSG_RESULT(no),
	AC_MSG_RESULT(yes)
	HAVE_JOYSTICK=yes
)
if test "x$HAVE_JOYSTICK" = "xyes";then
	AC_CHECK_HEADER(linux/joystick.h, HAVE_JOYSTICK=yes
		AC_DEFINE(HAVE_JOYSTICK, 1, [Define this if you want joystick support to be built])
	, HAVE_JOYSTICK=no)
fi

dnl -------------------------
dnl Optimising compiler flags
dnl -------------------------

OPT_CFLAGS=""
USE_OPT=""
AC_MSG_CHECKING(whether to allow compiler optimisations)
AC_ARG_ENABLE(opt,
	[  --disable-opt           disable compiler optimisations ],
	AC_MSG_RESULT(no),
	AC_MSG_RESULT(yes)
	USE_OPT="yes"
	OPT_CFLAGS="$OPT_CFLAGS -O2 -ffast-math -funroll-loops -fomit-frame-pointer -fexpensive-optimizations"
)
if test "x$USE_OPT" = "xyes"; then
	case "${host}" in
		i?86-*-*)
			AC_MSG_CHECKING(whether -falign-functions works)
			save_CFLAGS="$CFLAGS"
			CFLAGS="-falign-functions"
			AC_TRY_COMPILE(
				[],
				[],
				OPT_CFLAGS="$OPT_CFLAGS -falign-loops=2 -falign-jumps=2 -falign-functions=2"
				AC_MSG_RESULT(yes),
				OPT_CFLAGS="$OPT_CFLAGS -malign-loops=2 -malign-jumps=2 -malign-functions=2"
				AC_MSG_RESULT(no),
			)
			CFLAGS="$save_CFLAGS"
			;;
		*)
			;;
	esac
fi
AC_SUBST(OPT_CFLAGS)

dnl -------------------
dnl Checks for asm junk
dnl -------------------

AC_MSG_CHECKING(if assembler can be used)
case "${host}" in
	i?86-*-*)
		AC_MSG_RESULT(yes)
		AC_MSG_CHECKING(if asm is disabled)
		AC_ARG_ENABLE(asm,
			[  --disable-asm           disable assembler optimisation ],
			AC_MSG_RESULT(asm disabled),
			AC_DEFINE(USE_ASM, 1, [Define this if you want to use assembler optimised code])
			ASM_ARCH=yes
			AC_MSG_RESULT(asm enabled)
		)
		;;
	*)
		AC_MSG_RESULT(no)
		;;
esac
AM_CONDITIONAL(ASM_ARCH, test "$ASM_ARCH" = "yes")

dnl -------------------
dnl Checks for SDL-only platforms
dnl -------------------

AC_MSG_CHECKING(if SDL sound can be used instead of native drivers)
case "${host}" in
	*-sun-solaris*)
		AC_MSG_RESULT(yes)
		AC_MSG_WARN(Defaulting to SDL sound under Solaris due to temporary lack of native support.)
		BUILD_SDLQUAKE2=yes
		AC_DEFINE(BUILD_SDLQUAKE2, 1, [Define this if you want SDL sound instead of native drivers])
		;;
	i?86-*-*)
		AC_MSG_RESULT(yes)
		AC_MSG_CHECKING(if SDL sound will be used)
		AC_ARG_ENABLE(sdlsound,
			[  --enable-sdlsound       enable SDL sound instead of native drivers ],
			AC_MSG_RESULT(yes)
			AC_DEFINE(BUILD_SDLQUAKE2, 1, [Define this if you want SDL sound instead of native drivers])
			BUILD_SDLQUAKE2=yes,
			AC_MSG_RESULT(no)
		)
		;;
	*)
		AC_MSG_RESULT(no)
		;;
esac
AM_CONDITIONAL(BUILD_SDLQUAKE2, test "x$BUILD_SDLQUAKE2" = "xyes")

dnl ---------------------------------------------------
dnl Check if the xatrix and rogue sources are available
dnl ---------------------------------------------------

AC_MSG_CHECKING(if Xatrix missionpack source is available)
if test -f src/xatrix/g_main.c; then
	AC_MSG_RESULT(yes)
	DO_XATRIX=yes
else
	AC_MSG_RESULT(no)
fi

AC_MSG_CHECKING(if Rogue missionpack source is available)
if test -f src/rogue/g_main.c; then
	AC_MSG_RESULT(yes)
	DO_ROGUE=yes
else
	AC_MSG_RESULT(no)
fi

AM_CONDITIONAL(DO_XATRIX, test "$DO_XATRIX" = "yes")
AM_CONDITIONAL(DO_ROGUE, test "$DO_ROGUE" = "yes")

dnl ----------------------
dnl Fill in path variables
dnl ----------------------

dnl $libdir usually gets set to ${exec_prefix}/lib,
dnl $prefix and $exec_prefix is likely to be "NONE"
dnl Autoconf usually sets pkglibdir correctly in the Makefile, but not in
dnl the configure script :(
test "$prefix" = "NONE" && prefix=/usr/local
test "$exec_prefix" = "NONE" && exec_prefix=$prefix

eval PKGLIBDIR="$libdir/$PACKAGE"
AC_DEFINE_UNQUOTED(PKGLIBDIR, "$PKGLIBDIR", [Define this to the path containing the dynamic modules (\${exec-prefix}/lib/quake2/)])

eval PKGDATADIR="$datadir/$PACKAGE"
AC_DEFINE_UNQUOTED(PKGDATADIR, "$PKGDATADIR", [Define this to the path containing the game data (\${prefix}/share/quake2/)])

dnl ---------------------------------
dnl Work out what refreshers to build
dnl ---------------------------------

VID_REFS=""

if test "x$HAVE_SVGALIB" = xyes; then
	VID_REFS="$VID_REFS ref_soft.la"
	BUILD_SOFT="yes"
fi

if test "x$HAVE_X" = xyes; then
	VID_REFS="$VID_REFS ref_softx.la"
	BUILD_SOFTX="yes"
fi

if test "x$HAVE_SDL" = xyes; then
	VID_REFS="$VID_REFS ref_softsdl.la"
	BUILD_SOFTSDL="yes"
fi

if test "x$HAVE_X" = xyes -a "x$HAVE_OPENGL" = xyes; then
	VID_REFS="$VID_REFS ref_glx.la"
	BUILD_GLX="yes"
fi

if test "x$HAVE_X" = xyes -a "x$HAVE_OPENGL" = xyes -a "x$HAVE_SVGALIB" = xyes; then
	VID_REFS="$VID_REFS ref_tdfx.la"
	BUILD_TDFX="yes"
fi

if test "x$HAVE_X" = xyes -a "x$HAVE_OPENGL" = xyes -a "x$HAVE_SDL" = xyes; then
	VID_REFS="$VID_REFS ref_sdlgl.la"
	BUILD_SDLGL="yes"
fi

AM_CONDITIONAL(BUILD_SOFT, test "x$BUILD_SOFT" = xyes)
AM_CONDITIONAL(BUILD_SOFTX, test "x$BUILD_SOFTX" = xyes)
AM_CONDITIONAL(BUILD_SOFTSDL, test "x$BUILD_SOFTSDL" = xyes)
AM_CONDITIONAL(BUILD_GLX, test "x$BUILD_GLX" = xyes)
AM_CONDITIONAL(BUILD_TDFX, test "x$BUILD_TDFX" = xyes)
AM_CONDITIONAL(BUILD_SDLGL, test "x$BUILD_SDLGL" = xyes)

AC_SUBST(VID_REFS)

dnl -----------
dnl Dump it out
dnl -----------

AC_CONFIG_FILES([
	Makefile
	src/Makefile
	src/baseq2/Makefile
	src/ctf/Makefile
	src/xatrix/Makefile
	src/rogue/Makefile
	data/Makefile
	data/pixmaps/Makefile
	data/baseq2/Makefile
])
AC_OUTPUT

VID_REFS=`echo $VID_REFS | sed -e 's/ref_//g' -e 's/\.la//g'`
AC_MSG_RESULT([
	Video refreshers: ${VID_REFS- none}
	Platform: ${host}
])
