#!/bin/sh

DEPSFILE='.deps'
SRCS='irc.c fchat.c ircfossil.c'

function help {
	log 'usage: configure [-h] [-p prefix]'
	log ''
	log 'command line options'
	log '	-h	show this help message'
	log '	-p	set the installation prefix, override PREFIX'
	log ' '
	log 'environment variables'
	log '	PREFIX	Installation prefix path. Default /usr/local'
	log '	CC	C compiler to use. Default cc'
	log '	CFLAGS	Compiler flags.'
	log '	COPTS	Compiler options.'
	log '	LDFLAGS	Linker flags.'
}

function log {
	echo "${@}" >&2
}

function logn {
	echo -n "${@}" >&2
}

function checkstailq {
	logn 'checking for queue macros... '
	if [ -f /usr/include/sys/queue.h ]; then
		MACROS="${MACROS} -D_HAVE_STAILQ_"
		log 'use system version'
	else
		log 'use embedded copy'
	fi
}

function checkpledge {
	logn 'checking for pledge... '
	if grep pledge /usr/include/unistd.h >/dev/null 2>/dev/null; then
		MACROS="${MACROS} -D_HAVE_PLEDGE_"
		log 'use system version'
	else
		log 'use embedded copy'
	fi
}

function checkunveil {
	logn 'checking for unveil... '
	if grep unveil /usr/include/unistd.h >/dev/null 2>/dev/null; then
		MACROS="${MACROS} -D_HAVE_UNVEIL_"
		log 'use system version'
	else
		log 'use embedded copy'
	fi
}

function checkstrtonum {
	logn 'checking for strtonum... '
	if grep strtonum /usr/include/stdlib.h >/dev/null 2>/dev/null; then
		MACROS="${MACROS} -D_HAVE_STRTONUM_"
		log 'use system version'
	else
		SRCS="${SRCS} strtonum.c"
		log 'use embedded copy'
	fi
}

function checkdead {
	logn 'checking for __dead... '
	if grep __dead /usr/include/sys/cdefs.h >/dev/null 2>/dev/null; then
		MACROS="${MACROS} -D_HAVE_DEAD_"
		log 'use system version'
	else
		log 'use embedded copy'
	fi
}

function checkproctitle {
	logn 'checking for setproctitle... '
	if grep setproctitle /usr/include/stdlib.h >/dev/null 2>/dev/null; then
		MACROS="${MACROS} -D_HAVE_SETPROCTITLE_"
		log 'use system version'
	else
		if grep prctl /usr/include/sys/prctl.h >/dev/null 2>/dev/null; then
			MACROS="${MACROS} -D_HAVE_PRCTL_"
		fi
		if grep PR_SET_NAME /usr/include/sys/prctl.h >/dev/null 2>/dev/null; then
			MACROS="${MACROS} -D_HAVE_PR_SET_NAME_"
		fi
		SRCS="${SRCS} setproctitle.c"
		log 'use embedded copy'
	fi
}

function checkbzero {
	logn 'checking for explicit_bzero... '
	_name='explicit_bzero'
	_files='/usr/include/string.h /usr/include/strings.h'
	if grep ${_name} ${_files} >/dev/null 2>/dev/null; then
		MACROS="${MACROS} -D_HAVE_EXPLICIT_BZERO_"
		log 'use system version'
	else
		SRCS="${SRCS} explicit_bzero.c"
		log 'use embedded copy'
	fi
}

function checkstrlcpy {
	logn 'checking for strlcpy... '
	if grep strlcpy /usr/include/string.h >/dev/null 2>/dev/null; then
		MACROS="${MACROS} -D_HAVE_STRLCPY_"
		log 'use system version'
	else
		SRCS="${SRCS} strlcpy.c"
		log 'use embedded copy'
	fi
}

function checkstrlcat {
	logn 'checking for strlcat... '
	if grep strlcat /usr/include/string.h >/dev/null 2>/dev/null; then
		MACROS="${MACROS} -D_HAVE_STRLCAT_"
		log 'use system version'
	else
		SRCS="${SRCS} strlcat.c"
		log 'use embedded copy'
	fi
}

function checkprogname {
	logn 'checking for getprogname... '
	if grep getprogname /usr/include/stdlib.h >/dev/null 2>/dev/null; then
		MACROS="${MACROS} -D_HAVE_GETPROGNAME_"
		log 'use system version'
	else
		SRCS="${SRCS} getprogname.c"
		log 'use embedded copy'
	fi
}

function checkstrptime {
	logn 'checking for strptime... '
	case $(uname) in
	OpenBSD|FreeBSD|NetBSD)
		MACROS="${MACROS} -D_HAVE_STRPTIME_"
		log 'use system version'
		;;
	*)
		SRCS="${SRCS} strptime.c"
		log 'use embedded copy'
		;;
	esac
}

function checklibapi {
	_libapi='libapi.so.1.3'
	logn 'checking for libapi... '
	_file=$(find /usr/lib /usr/local/lib -name "${_libapi}" 2>/dev/null)
	if [ -n "${_file}" ]; then
		USE_LIBAPI=false
		log 'use installed version'
	else
		USE_LIBAPI=true
		log 'use local copy'
	fi
}

function checkman {
	logn 'checking for mandoc... '
	case $(uname) in
	OpenBSD|FreeBSD)
		MAN=ircfossil.1
		log 'use the mandoc man page'
		;;
	*)
		MAN=man/ircfossil.1
		log 'use the traditional man page'
		;;
	esac
}

while getopts 'h' _flag; do
	case ${_flag} in
	h)
		help
		exit 0
		;;
	p)
		PREFIX=${OPTARG}
		;;
	?)
		help >&2
		exit 1
		;;
	esac
done

log 'checking for missing functions'

checkstailq
checkpledge
checkunveil
checkstrtonum
checkdead
checkproctitle
checkbzero
checkstrlcpy
checkstrlcat
checkprogname
checkstrptime
checklibapi
checkman

>.deps

if ${USE_LIBAPI}; then
	log 'configuring local libapi'
	(cd libapi && ./configure)
	CFLAGS="${CFLAGS} -I./libapi"
	export CFLAGS
	OBJS="${OBJS} libapi/libapi.a"

	echo "libapi/libapi.a:" >>.deps
	echo "	(cd libapi && make libapi.a)" >>.deps
	echo >>.deps
else
	LDFLAGS="${LDFLAGS} -lapi"
	export LDFLAGS
fi

for _f in ${SRCS}; do
	OBJS="${_f%%.c}.o ${OBJS}"

	echo "${_f%%.c}.o: ${_f}"
	echo "	${CC:-cc} -c ${CFLAGS} ${COPTS} ${MACROS} ${_f}"
	echo
done >>.deps


m4 -DM4OBJS="${OBJS}" -DM4LDFLAGS="${LDFLAGS}" \
    -DM4PREFIX=${PREFIX:-/usr/local} -DM4MAN=${MAN} Makefile.m4 >Makefile

log 'done'
