#!/bin/sh
#
# Copyright (c) 1998-99 University College London
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
#    must display the following acknowledgement:
#      This product includes software developed by the Computer Science
#      Department at University College London
# 4. Neither the name of the University nor of the Department may be used
#    to endorse or promote products derived from this software without
#    specific prior written permission.
# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#

VERSION=`cat VERSION`

OSTYPE=`uname -s`
case $OSTYPE in
  SunOS                  ) OSTYPE=`uname -s`_`uname -r | awk -F. '{print $1}'`
  			   if [ $OSTYPE = SunOS_4 ]; then
			   	OSTYPE=SunOS
			   elif [ $OSTYPE = SunOS_5 ]; then
			   	OSTYPE=Solaris
			   fi
                           ;;
  HP-UX                  ) OSTYPE=HPUX
                           ;;
  Linux | IRIX | FreeBSD | NetBSD ) 
                           ;;
  *                      ) echo "$OSTYPE not supported. Sorry."
                           exit
                           ;;
esac

echo "Configuring common code library v$VERSION for $OSTYPE"

GCCWFLAGS="-W -Wall -Wbad-function-cast -Wmissing-prototypes -Werror"
DEFS=""

AR="ar"
RANLIB="ranlib"
ECHO="echo"

case $OSTYPE in
  SunOS   ) CC="gcc"
            WFLAGS=$GCCWFLAGS
	    INCLUDE=""
	    LDLIBS="-laudio -lm"
	    DEBUG="-g"
	    CHAR="-fsigned-char"
	    OPTIMIZE="-O4"
	    PROFILE="-pg"
            ;;
  Solaris ) CC="gcc -pipe"
            WFLAGS=$GCCWFLAGS
	    INCLUDE=""
	    LDLIBS="-lsocket -ldl -lnsl -lm"
	    DEBUG="-g"
	    CHAR="-fsigned-char"
	    OPTIMIZE="-O4"
	    PROFILE="-pg"
	    ECHO=/usr/bin/echo
            ;;
  IRIX    ) CC="cc"
            WFLAGS="-fullwarn -w2"
	    INCLUDE=""
	    LDLIBS="-lm"
	    DEBUG="-g"
	    CHAR="-signed"
	    OPTIMIZE="-O2"
	    PROFILE=""
            ;;
  Linux   ) CC="gcc"
            WFLAGS=$GCCWFLAGS
	    INCLUDE=""
	    LDLIBS="-lm -ldl"
	    DEBUG="-g"
	    CHAR="-fsigned-char"
	    OPTIMIZE="-O4"
	    PROFILE="-pg"
	    ECHO="echo -e"
            ;;
  FreeBSD ) CC="gcc"
            WFLAGS=$GCCWFLAGS
	    INCLUDE="-I/usr/local/include"
	    LDLIBS="-lm"
	    DEBUG="-g"
	    CHAR="-fsigned-char"
	    OPTIMIZE="-O4"
	    PROFILE="-pg"
	    ECHO=/bin/echo
            ;;
  HPUX    ) CC="gcc"
            WFLAGS=$GCCWFLAGS
	    INCLUDE=""
	    LDLIBS="-lm -ldld"
	    DEBUG="-g"
	    CHAR="-fsigned-char"
	    OPTIMIZE="-O4"
	    PROFILE="-pg"
            ;;
  NetBSD )  CC="gcc"
            WFLAGS=$GCCWFLAGS
	    INCLUDE="-I/usr/local/include"
	    LDLIBS="-lm"
	    DEBUG="-g"
	    CHAR="-fsigned-char"
	    OPTIMIZE="-O4"
	    PROFILE="-pg"
            ;;
esac

${ECHO} "Searching for in_addr_t in <netinet/in.h>... \c"
T1=`grep -c in_addr_t /usr/include/netinet/in.h`
if [ $T1 = 0 ]; then
	DEFS="$DEFS -DNEED_IN_ADDR_T"
	${ECHO} "no"
else 
	${ECHO} "yes"
fi

# This is the usual place for inet_pton()...
${ECHO} "Searching for inet_pton in <arpa/inet.h>... \c"
T2=`grep -c inet_pton /usr/include/arpa/inet.h`
if [ $T2 = 0 ]; then
	${ECHO} "no"
	DEFS="$DEFS -DNEED_INET_PTON -DNEED_INET_PTON_STATIC"
else 
	# Okay, we have a header for inet_pton(), but is the function
	# really there? 
	cat > configure.inet_pton.c <<EOF
		#include <sys/types.h>
		#include <sys/socket.h>
		#include <netinet/in.h>
		#include <arpa/inet.h> 
		int main()               
		{                        
			inet_pton(0,0,0);
			return 0;        
		}                        
EOF
	${CC} ${LDLIBS} -o configure.inet_pton.bin configure.inet_pton.c 2> configure.inet_pton.out
	T3=`wc -l configure.inet_pton.out | awk '{print $1}'`
	if [ $T3 = 0 ]; then
		${ECHO} "yes"
	else 
		${ECHO} "header, no implementation"
		DEFS="$DEFS -DNEED_INET_PTON"
	fi
	rm -f configure.inet_pton.c configure.inet_pton.out configure.inet_pton.bin
fi

# This is the usual place for inet_aton()...
${ECHO} "Searching for inet_aton in <arpa/inet.h>... \c"
T2=`grep -c inet_aton /usr/include/arpa/inet.h`
if [ $T2 = 0 ]; then
	${ECHO} "no"
	DEFS="$DEFS -DNEED_INET_ATON -DNEED_INET_ATON_STATIC"
else 
	# Okay, we have a header for inet_aton(), but is the function
	# really there? 
	cat > configure.inet_aton.c <<EOF
		#include <sys/types.h>
		#include <sys/socket.h>
		#include <netinet/in.h>
		#include <arpa/inet.h>  
		int main()             
		{                      
			inet_aton(0,0);
			return 0;      
		}                      
EOF
	${CC} ${LDLIBS} -o configure.inet_aton.bin configure.inet_aton.c 2> configure.inet_aton.out
	T3=`wc -l configure.inet_aton.out | awk '{print $1}'`
	if [ $T3 = 0 ]; then
		${ECHO} "yes"
	else 
		${ECHO} "header, no implementation"
		DEFS="$DEFS -DNEED_INET_ATON"
	fi
	rm -f configure.inet_aton.c configure.inet_aton.out configure.inet_aton.bin
fi

${ECHO} "Searching for getipnodebyname in <netdb.h>... \c"
T1=`grep -c getipnodebyname /usr/include/netdb.h`
if [ $T1 = 0 ]; then
	${ECHO} "no"
else 
	DEFS="$DEFS -DHAVE_IPv6"
	${ECHO} "yes"
fi

${ECHO} "Searching for vsnprintf in <stdio.h>... \c"
T1=`grep -c vsnprintf /usr/include/stdio.h`
if [ $T1 = 0 ]; then
	DEFS="$DEFS -DNEED_VSNPRINTF"
	${ECHO} "no - unsafe replacement enabled"
else 
	${ECHO} "yes"
fi

# Process options to the configure script...
DEBUG2=""
OPTIMIZE2=""
PROFILE2=""
CHECK_FLAG=""
CHECK_LIB=""
while test $# -gt 0
do
	if [ $1 = "-debug" ]; then
		DEBUG2=$DEBUG
		DEFS="$DEFS -DDEBUG"
		echo "Enabled debug option"
	elif [ $1 = "-optimize" ]; then
		OPTIMIZE2=$OPTIMIZE
		DEFS="$DEFS -DNDEBUG"
		echo "Enabled optimize option"
	elif [ $1 = "-profile" ]; then
		PROFILE2=$PROFILE
		echo "Enabled profile option"
	elif [ $1 = "-bounds" ]; then
		CHECK_FLAG=-fbounds-checking
		CHECK_LIB=-lcheck
		echo "Enabled bounds checking option" 
	else 
		DEFS="$DEFS $1"
		echo "Added $1 compile flag"
	fi
	shift
done

# Create Makefile
echo "Generating Makefile"
echo "# Generated automatically from Makefile.in" > Makefile
echo "# DO NOT EDIT THIS FILE" >> Makefile

cat > Makefile.sed <<EOF
s@__OSTYPE__@$OSTYPE@
s@__CC__@$CC@
s@__AR__@$AR@
s@__RANLIB__@$RANLIB@
s@__WFLAGS__@$WFLAGS@
s@__INCLUDE__@$INCLUDE@
s@__LDLIBS__@$LDLIBS@
s@__CHAR__@$CHAR@
s@__DEBUG__@$DEBUG2@
s@__OPTIMIZE__@$OPTIMIZE2@
s@__PROFILE__@$PROFILE2@
s@__DEFS__@$DEFS@
s@__CHECK_FLAG__@$CHECK_FLAG@
s@__CHECK_LIB__@$CHECK_LIB@
EOF

sed -f Makefile.sed Makefile.in >> Makefile
rm -f Makefile.sed

# Create version.h
echo "Generating version.h"
echo \#define CCL_VERSION \"CCL v$VERSION $OSTYPE\" > version.h

