#!/bin/bash

ZLIB=-1
BZLIB=-1
CVERS=""
STATIC="#"
MODULE="#"
CCPOS="gcc cc `which gcc | grep -v which` `which cc | grep -v which` `ls /usr/bin/*cc* /usr/local/bin/*cc* /usr/etc/*cc* 2>/dev/null`"
DESTDIR="/usr/local/bin"
if [ "`uname -n`" = "rkeene" -o "`uname -n`" = "mobile-keene" -o "`uname -n`" = "trinity" ]; then
  DEBUG=
else
  DEBUG="#"
fi
TWO_BYTES_1="/*"
TWO_BYTES_2="short"
TWO_BYTES_3="*/"
FOUR_BYTES_1="/*"
FOUR_BYTES_2="int"
FOUR_BYTES_3="*/"
NEED_UINT="#"
HAVE_GETOPT="."
MODULE_DIR="/usr/local/lib/dact/"

CR_MOD="OBJ"
BZHRD_DEP="comp_bzlib,"
ZHRD_DEP="comp_zlib,comp_mzlib,comp_mzlib2,"

while `[ "$1" != "" ]`; do
	CMD=`echo $1 | cut -f 1 -d =`
	ARG=`echo $1 | cut -f 2 -d =`
	case "$CMD" in
		--h*)
			echo "Usage: $0 [options]"
			echo "Options: [defaults in brackets]"
			echo "Compilation:"
			echo "  --cc=CC                 Use CC as C compiler [CC=gcc]"
			echo "  --debug                 Enable debugging options."
			echo "Features and packages:"
			echo "  --with-bzlib[=path]     Use BZ2 compression"
			echo "  --with-getopt           Use getopt"
			echo "  --with-zlib[=path]      Use Zlib compression"
			echo "  --with-check-version    Check version at runtime"
			echo "  --enable-static         Build static binary"
			echo "  --with-modules[=path]   Disable module support"
			echo "  --enable-module=algo    Build ALGO as a module"
			exit
			;;
		--without-z*)
			ZLIB=0
			;;
		--with-z*)
			ZLIBPATH=$ARG
			ZLIB=1
			;;
		--without-b*)
			BZLIB=0
			;;
		--with-b*)
			BZLIBPATH=$ARG
			BZLIB=1
			;;
		--with-g*)
			HAVE_GETOPT=""
			;;
		--without-g*)
			HAVE_GETOPT="#"
			;;
		--cc)
			CCPOS=$ARG
			;;
		--de*)
			DEBUG=""
			;;
		--no-de*)
			DEBUG="#"
			;;
		--with-c*)
			CVERS=""
			;;
		--without-c*)
			CVERS="#"
			;;
		--enable-st*)
			STATIC=""
			MODULE="#"
			;;
		--disable-st*)
			STATIC="#"
			;;
		--with-modules)
			if [ $ARG != "" ]; then
				MODULE_DIR=$ARG
			fi
			MODULE=""
			STATIC="#"
			;;
		--without-modules)
			MODULE="#"
			;;
		--disable-module)
			MOD="comp_`echo $ARG | dd conv=lcase 2>/dev/null`"

			if [ "$MOD" = "comp_range" ]; then
				CR_MOD="OBJ"
			fi

			MODULES=`echo $MODULES | sed s/$MOD//g`
			;;
		--enable-module)
			MODULE=""
			STATIC="#"

			MOD="comp_`echo $ARG | dd conv=lcase 2>/dev/null`"

			echo -n "Checking that $ARG is modulizable ... "

			if grep AS_MODULE $MOD.c 2>/dev/null > /dev/null; then
				echo "yes."
				MODULES="$MODULES $MOD"

				BZHRD_DEP=`echo $BZHRD_DEP | sed s/$MOD\,//g`
				ZHRD_DEP=`echo $ZHRD_DEP | sed s/$MOD\,//g`
				if [ "$MOD" = "comp_range" ]; then
					CR_MOD="CR_OBJ"
				fi

			else
				echo "no, skipping."
			fi

			;;
	esac
	shift
done

if [ "$BZHRD_DEP" = "" ]; then
	BZHRD="#"
fi

if [ "$ZHRD_DEP" = "" ]; then
	ZHRD="#"
fi

if [ "$BZLIBPATH" != "" ]; then
  BZLIBINC="-I$BZLIBPATH"
  BZLIBLIB="-L$BZLIBPATH"
fi

if [ "$ZLIBPATH" != "" ]; then
  ZLIBINC="-I$ZLIBPATH"
  ZLIBLIB="-L$ZLIBPATH"
fi

if [ "$DEBUG" = "" ]; then
  echo "Enabling developmental features (`uname -n`)"
fi

echo -e "int main(void) { return(0); }" > TEST.c

echo -n "Checking for a C compiler ... "
for i in $CCPOS; do
	$i TEST.c -o TEST 2>/dev/null
	if [ -e ./TEST ]; then
		CC=$i
		echo "ok ( $CC )"
		echo -n "Checking for cross compilation ... "
		if `./TEST 2>/dev/null`; then
			CROSS_COMP=0
			echo "no"
		else
			CROSS_COMP=1
			echo "yes"
		fi
		rm -f TEST 2>/dev/null
		break
	fi
done

if [ "$CC" = "" ]; then
	echo "none found."
	echo "ERROR: You need a C compiler to compile this."
	rm -f TEST.c
	exit -1
fi

echo -n "Checking to see if CC accepts -Wall ... "
if $CC -Wall -o TEST TEST.c 2>/dev/null >/dev/null; then
  echo "yes"
  WALL="-Wall"
else
  echo "no"
fi

echo -n "Checking to see if CC accepts -Werror ... "
if $CC -Werror -o TEST TEST.c 2>/dev/null >/dev/null; then
  echo "yes"
  WERROR="-Werror"
else
  echo "no"
fi

rm -f TEST.c 2>/dev/null

echo -n "Checking to see if CC accepts double-slash ... "
echo -e "int main(void) {\n// Test\nreturn(0); }" > TEST.c
if $CC -o TEST TEST.c 2>/dev/null >/dev/null; then
  echo "yes"
else
  echo "no"
  . ./patch-dbl-slash
fi

rm -f TEST.c 2>/dev/null


if [ $CROSS_COMP = 0 ]; then

	echo -n "Checking sizeof long ... "
	echo -e "#include <stdio.h>\nvoid main(void) { printf(\"%i\",sizeof(long)); }" > TEST1.c
	echo -e "#include <unistd.h>\nvoid main(void) { char joe=(sizeof(long)+48); write(STDOUT_FILENO, &joe, 1); }" > TEST2.c
	$CC TEST1.c -o TEST 2>/dev/null >/dev/null
	if [ ! -e ./TEST ]; then
		$CC TEST2.c -o TEST 2>/dev/null >/dev/null
	fi
	if [ ! -e ./TEST ]; then
		echo "unknown"
		SLONG=-1
	else
		SLONG=`./TEST`
		echo "$SLONG"
	fi


	echo -n "Checking sizeof int ... "
	echo -e "#include <stdio.h>\nvoid main(void) { printf(\"%i\",sizeof(int)); }" > TEST1.c
	echo -e "#include <unistd.h>\nvoid main(void) { char joe=(sizeof(int)+48); write(STDOUT_FILENO, &joe, 1); }" > TEST2.c
	$CC TEST1.c -o TEST 2>/dev/null >/dev/null
	if [ ! -e ./TEST ]; then
		$CC TEST2.c -o TEST 2>/dev/null >/dev/null
	fi
	if [ ! -e ./TEST ]; then
		echo "unknown"
		SINT=-1
	else
		SINT=`./TEST`
		echo "$SINT"
	fi

	echo -n "Checking sizeof short ... "
	echo -e "#include <stdio.h>\nvoid main(void) { printf(\"%i\",sizeof(short)); }" > TEST1.c
	echo -e "#include <unistd.h>\nvoid main(void) { char joe=(sizeof(short)+48); write(STDOUT_FILENO, &joe, 1); }" > TEST2.c
	$CC TEST1.c -o TEST 2>/dev/null >/dev/null
	if [ ! -e ./TEST ]; then
		$CC TEST2.c -o TEST 2>/dev/null >/dev/null
	fi
	if [ ! -e ./TEST ]; then
		echo "unknown"
		SSHORT=-1
	else
		SSHORT=`./TEST`
		echo "$SSHORT"
	fi

	if [ $SLONG =  2 ]; then TWO_BYTES_1=""; TWO_BYTES_2="unsigned long"; TWO_BYTES_3="";  fi
	if [ $SINT  =  2 ]; then TWO_BYTES_1=""; TWO_BYTES_2="unsigned int"; TWO_BYTES_3=""; fi
	if [ $SSHORT = 2 ]; then TWO_BYTES_1=""; TWO_BYTES_2="unsigned short"; TWO_BYTES_3=""; fi
	if [ $SLONG =  4 ]; then FOUR_BYTES_1=""; FOUR_BYTES_2="unsigned long"; FOUR_BYTES_3=""; fi
	if [ $SINT  =  4 ]; then FOUR_BYTES_1=""; FOUR_BYTES_2="unsigned int"; FOUR_BYTES_3="";  fi


	rm -f TEST TEST1.c TEST2.c 2>/dev/null >/dev/null
fi

echo -n "Checking for uint ... "
echo -e "#include <sys/types.h>\nint main(void) { uint bob; return(bob=0); }" > TEST.c
if `$CC $WALL $WERROR TEST.c -o TEST 2>/dev/null >/dev/null`; then
	NEED_UINT="#"
else
	NEED_UINT=""
	echo -n "not "
fi
echo "found."
rm -f TEST.c TEST


if [ "$ZLIB" -eq "-1" ]; then
	echo -n "Checking for zlib.h ... "

	echo -e "#include <zlib.h>\nint main(void) { return(0); }" > TEST.c	

	if `$CC TEST.c -o TEST $ZLIBINC 2>/dev/null`; then
		ZLIB=1
	else
		ZLIB=0
		echo -n "not "
	fi
	echo "found."
	rm -f TEST.c TEST 2>/dev/null
fi

if [ "$ZLIB" = 1 ]; then
  echo -n "Checking for compress2 ... "

  echo -e "#include <zlib.h>\nint main(void) {\nchar bob[30], sally[60];\nunsigned long sLen=30, dLen=60;\ncompress2(sally,&dLen,bob,sLen,Z_BEST_COMPRESSION); return(0); }" > TEST.c

  if $CC $ZLIBINC $ZLIBLIB -lz TEST.c -o TEST 2>/dev/null >/dev/null; then
    COMPRESS2=""
  else
    COMPRESS2="#"
    echo -n "not "
  fi
  echo "found"
  rm -f TEST TEST.c 2>/dev/null
fi

if [ "$ZLIB" = 1 ]; then
	ZLIB=""
else
	ZLIB="#"
fi



if [ "$BZLIB" -eq "-1" ]; then
	echo -n "Checking for bzlib.h ... "

	echo -e "#include <stdio.h>\n#include <bzlib.h>\nint main(void) { return(0); }" > TEST.c	

	if `$CC TEST.c -o TEST $BZLIBINC 2>/dev/null`; then
		BZLIB=1
	else
		BZLIB=0
		echo -n "not "
	fi
	echo "found."
	rm -f TEST.c TEST 2>/dev/null
fi

if [ "$BZLIB" = 1 ]; then
	BZLIB=""
else
	BZLIB="#"
fi

if [ "$HAVE_GETOPT" = "." ]; then
	echo -n "Checking for getopt ... "

	echo -e "#include <unistd.h>\nextern char *optarg;\nextern int optind, opterr, optopt;\nint main (int argc, char **argv) {\n  char ch;\n  ch=getopt(argc,argv,\"a\");\n  return(0);\n}" > TEST.c

	if `$CC TEST.c -o TEST 2> /dev/null`; then
		HAVE_GETOPT=""
	else
		HAVE_GETOPT="#"
		echo -n "not "
	fi
	echo "found."

	rm -f TEST.c TEST 2>/dev/null
fi

if [ "$MODULE" = "" ]; then
	echo -n "Checking for dynamic linking support (modules) ... "
	echo -e "#include <dlfcn.h>\nint main(int argc, char **argv) {\nvoid *mh;\nmh=dlopen(\"bob\", RTLD_LAZY);\nreturn(0);\n}\n" > TEST.c

	if $CC -Wall -Werror TEST.c -o TEST -ldl -rdynamic -shared 2>/dev/null; then
		echo "ok."
	else
		MODULE="#"
		MODULES=""
		echo "failed!"
	fi

	rm -f TEST.c TEST
fi

if [ "$CVERS" = "" ]; then
	echo -n "Checking to see if we need to link for socket() ... "
	echo -e "#include \"net.c\"\nint main(int argc, char **argv) {\nreturn(0);\n}" > TEST.c

	CF_LINK=FAIL
	LD_LINK=FAIL
	for m in "" -lsocket -lnsl "-lsocket -lnsl"; do
		for k in "" -DUSE_ADDR; do
			if $CC TEST.c -o TEST $m $k 2>/dev/null; then
				LD_LINK=$m
				CF_LINK=$k
				break;
			fi
		done
		if [ "$LD_LINK" != "FAIL" ]; then
			break;
		fi
	done
	if [ "$LD_LINK" = "FAIL" ]; then
		echo -n "not "
		CVERS="#"
		LD_LINK=""
		CF_LINK=""
	fi
	echo "found."

	rm -f TEST.c TEST
fi



. ./Makefile.in > Makefile
. comp_range/Makefile.in > comp_range/Makefile
. ./config.h.in > config.h
. ./dact.conf.in > dact.conf

rm -f ./TEST*
