#!/bin/sh

PACKAGE=pingu
PACKAGE_VERSION=1.5

TMPDIR=${TMPDIR:-${TEMPDIR:-/tmp}}
TMPC="$TMPDIR/$PACKAGE-conf-$$.c"
TMPO="$TMPDIR/$PACKAGE-conf-$$.o"
TMPE="$TMPDIR/$PACKAGE-conf-$$"

trap "rm -f $TMPC $TMPO $TMPE" EXIT INT QUIT TERM
rm -f config.log

echo "# $PACKAGE configure log $(date)" >> config.log
printf "# Configured with:" >> config.log
printf " '%s'" "$0" "$@" >> config.log
echo >> config.log
echo "#" >> config.log

die() { echo "$*" >&2; exit 1; }

do_cc() {
	echo $cc "$@" >> config.log
	$cc "$@" >> config.log 2>&1 || return $?
}

compile_prog() {
	do_cc $CFLAGS $1 -o $TMPE $TMPC $LDFLAGS $2
}

usage () {
cat <<EOF
Usage: $0 [OPTION]... [VAR=VALUE]... [TARGET]

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Installation directories:
  --prefix=PREFIX         main installation prefix [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --rundir=DIR            pidfile and unix sockets [LOCALSTATEDIR/run]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --mandir=DIR            man documentation [DATAROOTDIR/man]

Optional features:
  --enable-debug          build with debugging information [disabled]
  --enable-warnings       build with recommended warnings flags [enabled]
  --enable-werror         build with -Werror [disabled]
  --enable-lua            build Lua client binding [disabled]
  --disable-doc           do not build manual pages [enabled]
  --with-luapc=LUAPC      build Lua client binding, using LUAPC pkg-config
                          package [disabled]

Some influential environment variables:
  CC                      C compiler command [detected]
  CFLAGS                  C compiler flags [-Os -pipe ...]
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>

Use these variables to override the choices made by configure.

EOF
exit 0
}

prefix=/usr/local
exec_prefix='$(prefix)'
bindir='$(exec_prefix)/bin'
sbindir='$(exec_prefix)/sbin'
sysconfdir='$(prefix)/etc'
localstatedir='$(prefix)/var'
libdir='$(exec_prefix)/lib'
datarootdir='$(prefix)/share'
mandir='$(datarootdir)/man'

enable_debug=false
enable_warnings=true
enable_werror=false
enable_lua=false
enable_doc=true

for arg; do
case "$arg" in
--help) usage ;;
--prefix=*) prefix=${arg#*=} ;;
--exec-prefix=*) exec_prefix=${arg#*=} ;;
--bindir=*) bindir=${arg#*=} ;;
--sbindir=*) sbindir=${arg#*=} ;;
--sysconfdir=*) sysconfdir=${arg#*=} ;;
--localstatedir=*) localstatedir=${arg#*=} ;;
--libdir=*) libdir=${arg#*=} ;;
--datarootdir=*) datarootdir=${arg#*=} ;;
--mandir=*) mandir=${arg#*=} ;;
--enable-debug) enable_debug=true ;;
--disable-debug) enable_debug=false ;;
--enable-warnings) enable_warnings=true ;;
--disable-warnings) enable_warnings=false ;;
--enable-werror) enable_werror=true ;;
--disable-werror) enable_werror=false ;;
--enable-doc) enable_doc=true ;;
--disable-doc) enable_doc=false ;;
--with-luapc=*) with_luapc=${arg#*=};;
-* ) die "$0: unknown option $arg" ;;
CC=*) CC="${arg#*=}" ;;
CFLAGS=*) CFLAGS="${arg#*=}" ;;
LDFLAGS=*) LDFLAGS="${arg#*=}" ;;
LIBEV_CFLAGS=*) LIBEV_CFLAGS="${arg#*=}" ;;
LIBEV_LIBS=*) LIBEV_LIBS="${arg#*=}" ;;
PKGCONFIG=*) PKGCONFIG="${arg#*=}" ;;
*=*) ;;
*) target=$arg ;;
esac
done

if $enable_debug; then
	CFLAGS="$CFLAGS -g"
fi

echo -n "Checking for -Wall: "
if $enable_warnings; then
	CFLAGS="$CFLAGS -Wall"
	echo "yes"
else
	echo "no"
fi

echo -n "Checking for -Werror: "
if $enable_werror; then
	CFLAGS="$CFLAGS -Werror"
	echo "yes"
else
	echo "no"
fi

echo -n "Checking for Lua support: "
if [ -n "$with_luapc" ]; then
	LUAPC="$with_luapc"
	echo $with_luapc
else
	echo disabled
fi

cc=${CC:-gcc}

cat > $TMPC << EOF
#include <string.h>
int main(void) {
	char src[4] = "asdf";
	char dst[4];
	return strlcpy(dst, src, sizeof(dst));
}
EOF

echo -n "Checking for strlcpy: "
if compile_prog "" ""; then
	HAVE_STRLCPY=1
	echo yes
else
	echo no
fi

echo -n "Checking if documentation should be built: "
if $enable_doc; then
	echo "yes"
	ENABLE_DOC=1
else
	echo "no"
fi

# find libev
: ${PKGCONFIG:=pkg-config}
echo -n "Checking for libev: "
if $PKGCONFIG --exist libev 2>/dev/null; then
       if [ -z "$LIBEV_CFLAGS" ]; then
               LIBEV_CFLAGS=$( $PKGCONFIG --cflags libev )
       fi
       if [ -z "$LIBEV_LIBS" ]; then
               LIBEV_LIBS=$( $PKGCONFIG --libs libev )
       fi
else
       LIBEV_LIBS="-lev"
fi

cat > $TMPC << EOF
#include <ev.h>
int main(void) {
       struct ev_loop *loop = ev_default_loop(0);
       return 0;
}
EOF

if compile_prog "$LIBEV_CFLAGS" "$LIBEV_LIBS"; then
       echo yes
else
       echo no
       die "libev is required"
fi

# generate config.h
config_h_vars="
PACKAGE
PACKAGE_VERSION
HAVE_STRLCPY
"

cat >config.h <<EOF
/* this file is generated by $0 */
#ifndef CONFIG_H
#define CONFIG_H

EOF
for var in $config_h_vars; do
	eval "value=\$$var"
	case "$value" in
	[0-9]) echo "#define $var $value" >> config.h;;
	"") echo "/* $var is unset */" >> config.h;;
	*) echo "#define $var \"$value\"" >> config.h;;
	esac
done
echo "" >> config.h
echo '#endif /* CONFIG_H */' >> config.h

CFLAGS="$CFLAGS -DHAVE_CONFIG_H"

# generate config.mk
config_mk_vars="
prefix
exec_prefix
bindir
sbindir
sysconfdir
localstatedir
libdir
datarootdir
mandir
LUAPC
CC
CFLAGS
ENABLE_DOC
LDFLAGS
PACKAGE
PACKAGE_VERSION
LIBEV_CFLAGS
LIBEV_LIBS
"

echo "# this file is generated by $0" >config.mk
for var in $config_mk_vars; do
	eval "value=\$$var"
	if [ -n "$value" ]; then
		echo "$var = $value" >> config.mk
	fi
done

echo "$PACKAGE is configured. Please run 'make' to build"
