#!/bin/sh
# 
# Copyright (c) 2006-2007 Ed Schouten <ed@fxq.nl>
# 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.
# 
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS 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 AUTHOR 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.
# 

APP_NAME=herrie
APP_VERSION=1.5.1

# Default compilation switches
CFG_AO=ao
unset CFG_BINEXT
CFG_FTELLO=yes
CFG_HTTP=yes
CFG_MODPLUG=yes
CFG_MP3=yes
CFG_RES_INIT=yes
CFG_SCROBBLER=yes
unset CFG_SETPROCTITLE
unset CFG_SIGWINCH
CFG_SNDFILE=yes
CFG_TRANS='nl tr'
CFG_VORBIS=yes
CFG_CURSES_HEADER=ncurses
CFG_CURSES_LIB=ncurses

# Operating system defaults
[ "$OS" != "" ] || OS=`uname`
case $OS in
CYGWIN*)
	unset CFG_HTTP
	unset CFG_RES_INIT
	[ "$CONFDIR" = "" ] && CONFDIR=/etc
	[ "$PREFIX" = "" ] && PREFIX=/usr
	;;
Darwin)
	LDFLAGS="$LDFLAGS -lresolv"
	[ "$PREFIX" = "" ] && PREFIX=/opt/local
	;;
FreeBSD)
	CFG_AO=oss
	CFG_SETPROCTITLE=yes
	[ "$PREFIX" = "" ] && PREFIX=/usr/local
	[ "$MANDIR" = "" ] && MANDIR=$PREFIX/man
	;;
Linux)
	CFG_AO=oss
	[ "$CONFDIR" = "" ] && CONFDIR=/etc
	[ "$PREFIX" = "" ] && PREFIX=/usr
	;;
NetBSD)
	CFG_AO=oss
	CFG_SETPROCTITLE=yes
	[ "$PREFIX" = "" ] && PREFIX=/usr/pkg
	;;
OpenBSD)
	CFG_AO=oss
	CFG_SETPROCTITLE=yes
	CFG_SIGWINCH=yes
	[ "$PREFIX" = "" ] && PREFIX=/usr/local
	[ "$MANDIR" = "" ] && MANDIR=$PREFIX/man
	;;
SunOS)
	unset CFG_HTTP
	unset CFG_TRANS
	[ "$PREFIX" = "" ] && PREFIX=/opt/sfw
	CFLAGS="$CFLAGS -I$PREFIX/include/ncurses"
	;;
Windows)
	CFG_AO=null
	CFG_BINEXT=.exe
	unset CFG_FTELLO
	unset CFG_HTTP
	unset CFG_MODPLUG
	unset CFG_SCROBBLER
	CFG_CURSES_HEADER=curses
	CFG_CURSES_LIB=pdcurses
	;;
*)
	echo "Warning: unknown operating system"
	[ "$PREFIX" = "" ] && PREFIX=/usr/local
esac
SRCDIR=`dirname $0`
BINDIR=$PREFIX/bin
[ "$CONFDIR" = "" ] && CONFDIR=$PREFIX/etc
CONFFILE=$CONFDIR/$APP_NAME.conf
[ "$MANDIR" = "" ] && MANDIR=$PREFIX/share/man
TRANSDIR=$PREFIX/share/locale
[ "$CC" = "" ] && CC=gcc

# Command line options
while [ $# -gt 0 ]
do
	case $1 in
	no_http)
		unset CFG_HTTP
		;;
	no_modplug)
		unset CFG_MODPLUG
		;;
	no_mp3)
		unset CFG_MP3
		;;
	no_scrobbler)
		unset CFG_SCROBBLER
		;;
	no_sndfile)
		unset CFG_SNDFILE
		;;
	no_trans)
		unset CFG_TRANS
		;;
	no_vorbis)
		unset CFG_VORBIS
		;;

	ao|null|oss|sdl)
		CFG_AO=$1
		;;
	
	xcurses)
		CFG_CURSES_HEADER=xcurses
		CFG_CURSES_LIB=XCurses
		unset CFG_SIGWINCH
		;;

	*)
		echo "Error: unknown option: $1"
		exit 1
	esac

	shift
done

# Standard options
[ "$CFLAGS" = "" ] && CFLAGS="-O2"
CFLAGS="$CFLAGS `pkg-config --cflags glib-2.0 gthread-2.0` \
    -Wall -Wsign-compare -Werror -Wmissing-prototypes \
    -DAPP_NAME=\\\"$APP_NAME\\\" -DAPP_VERSION=\\\"$APP_VERSION\\\" \
    -I$PREFIX/include -DCURSES_HEADER=\\<$CFG_CURSES_HEADER.h\\> \
    -include $SRCDIR/src/stdinc.h"
CFLAGS_main="-DAUDIO_OUTPUT=\\\"$CFG_AO\\\" -DCONFFILE=\\\"$CONFFILE\\\""
LDFLAGS="$LDFLAGS `pkg-config --libs glib-2.0 gthread-2.0` \
    -L$PREFIX/lib -l$CFG_CURSES_LIB"
SRCS="audio_file audio_output_$CFG_AO config gui_browser gui_draw \
    gui_input gui_msgbar gui_playq gui_vfslist main playq playq_party \
    playq_xmms vfs vfs_playlist vfs_regular"

# ftello() usage
[ "$CFG_FTELLO" != "" ] && CFLAGS="$CFLAGS -DBUILD_FTELLO"
# HTTP and Scrobbler code need cURL
if [ "$CFG_HTTP" != "" -o "$CFG_SCROBBLER" != "" ]
then
	if [ "$CFG_HTTP" != "" ]
	then
		CFLAGS="$CFLAGS -DBUILD_HTTP"
		SRCS="$SRCS vfs_http"
	fi
	if [ "$CFG_SCROBBLER" != "" ]
	then
		CFLAGS="$CFLAGS -DBUILD_SCROBBLER"
		LDFLAGS="$LDFLAGS -lssl"
		SRCS="$SRCS scrobbler scrobbler_hash scrobbler_send"
	fi
	CFLAGS="$CFLAGS `curl-config --cflags`"
	LDFLAGS="$LDFLAGS `curl-config --libs`"
fi
# Modplug support
if [ "$CFG_MODPLUG" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_MODPLUG"
	CFLAGS_audio_format_modplug="`pkg-config --cflags libmodplug`"
	LDFLAGS="$LDFLAGS `pkg-config --libs libmodplug`"
	SRCS="$SRCS audio_format_modplug"
fi
# MP3 support
if [ "$CFG_MP3" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_MP3"
	LDFLAGS="$LDFLAGS -lmad -lid3tag -lz"
	SRCS="$SRCS audio_format_mp3"
fi
# res_init() usage
if [ "$CFG_RES_INIT" != "" ]
then
	CFLAGS_vfs="-DBUILD_RES_INIT"
fi
# setproctitle() usage
if [ "$CFG_SETPROCTITLE" != "" ]
then
	CFLAGS_gui_playq="-DBUILD_SETPROCTITLE"
fi
# SIGWINCH wrapper
if [ "$CFG_SIGWINCH" != "" ]
then
	CFLAGS_gui_input="-DBUILD_GUI_SIGWINCH_WRAPPER"
fi
# libsndfile support
if [ "$CFG_SNDFILE" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_SNDFILE"
	LDFLAGS="$LDFLAGS -lsndfile"
	SRCS="$SRCS audio_format_sndfile"
fi
# Translation support
if [ "$CFG_TRANS" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_TRANS"
	CFLAGS_main="$CFLAGS_main -DTRANSDIR=\\\"$TRANSDIR\\\""
fi
# Ogg Vorbis support
if [ "$CFG_VORBIS" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_VORBIS"
	LDFLAGS="$LDFLAGS -lvorbisfile -lvorbis -logg"
	SRCS="$SRCS audio_format_vorbis"
fi

# Audio output options
case $CFG_AO in
ao)
	CFLAGS_main="$CFLAGS_main -DCLOSE_STDERR"
	LDFLAGS="$LDFLAGS -lao"
	;;
oss)
	case $OS in
	NetBSD|OpenBSD)
		CFLAGS_config="-DOSS_DEVICE=\\\"/dev/audio\\\""
		CFLAGS_audio_output_oss="-DOSS_HEADER=\\<soundcard.h\\>"
		LDFLAGS="$LDFLAGS -lossaudio"
		;;
	*)
		CFLAGS_config="-DOSS_DEVICE=\\\"/dev/dsp\\\""
		CFLAGS_audio_output_oss="-DOSS_HEADER=\\<sys/soundcard.h\\>"
		;;
	esac
	;;
sdl)
	CFLAGS="$CFLAGS `sdl-config --cflags`"
	LDFLAGS="$LDFLAGS `sdl-config --libs`"
	;;
esac

unset OBJS
for i in $SRCS
do
	OBJS="$OBJS $i.o"
done
unset LINGUAS
for i in $CFG_TRANS
do
	LINGUAS="$LINGUAS $i.mo"
done

echo "Configuration:"
echo "- Installing $APP_NAME$CFG_BINEXT in $BINDIR"
echo "- Installing manual page in $MANDIR"
echo "- Using $CONFFILE configuration file"
[ "$CFG_TRANS" != "" ] && echo "- Installing translations in $TRANSDIR"
echo "- Using -l$CFG_CURSES_LIB and <$CFG_CURSES_HEADER.h>"
echo "- Using $CFG_AO audio output"
[ "$CFG_HTTP" != "" ] && echo "- Support for HTTP streams"
[ "$CFG_MODPLUG" != "" ] && echo "- Support for libmodplug"
[ "$CFG_MP3" != "" ] && echo "- Support for MP3"
[ "$CFG_SCROBBLER" != "" ] && echo "- Support for AudioScrobbler"
[ "$CFG_SNDFILE" != "" ] && echo "- Support for libsndfile"
[ "$CFG_VORBIS" != "" ] && echo "- Support for Ogg Vorbis"

(cat << EOF
CFLAGS=$CFLAGS
LDFLAGS=$LDFLAGS
OBJS=$OBJS
all: $APP_NAME$CFG_BINEXT $APP_NAME.1.gz $SRCDIR/$APP_NAME.conf.sample $LINGUAS
$APP_NAME$CFG_BINEXT: \$(OBJS)
	$CC \$(OBJS) \$(LDFLAGS) -o $APP_NAME$CFG_BINEXT
$APP_NAME.1.gz: $SRCDIR/$APP_NAME.1 Makefile
	sed -e 's|%%CONFFILE%%|$CONFFILE|' < $SRCDIR/$APP_NAME.1 | gzip -9 > $APP_NAME.1.gz
clean:
	rm -f *.core *.o .gdb_history
distclean: clean
	rm -f $APP_NAME$CFG_BINEXT $APP_NAME.1.gz *.mo Makefile
install: all
	install -s $APP_NAME$CFG_BINEXT \$(DESTROOT)$BINDIR/$APP_NAME$CFG_BINEXT
	install -m 444 $APP_NAME.1.gz \$(DESTROOT)$MANDIR/man1/$APP_NAME.1.gz
	install -m 444 $SRCDIR/$APP_NAME.conf.sample \$(DESTROOT)$CONFDIR/$APP_NAME.conf.sample
EOF
for i in $CFG_TRANS
do
	echo "	mkdir -p \$(DESTROOT)$TRANSDIR/$i/LC_MESSAGES"
	echo "	install -m 444 $i.mo \$(DESTROOT)$TRANSDIR/$i/LC_MESSAGES/$APP_NAME.mo"
done
. $SRCDIR/depends
for i in $SRCS
do
	unset DEPS
	for j in `eval echo \\\$DEPENDS_\$i`
	do
		DEPS="$DEPS $SRCDIR/src/$j.h"
	done
	echo "$i.o: Makefile $SRCDIR/src/$i.c $SRCDIR/src/stdinc.h $DEPS"
	echo "	$CC -c $SRCDIR/src/$i.c \$(CFLAGS) `eval echo \\\$CFLAGS_\$i` -o $i.o"
done
for i in $CFG_TRANS
do
	echo "$i.mo: $SRCDIR/lang/$i.po"
	echo "	msgfmt -o $i.mo $SRCDIR/lang/$i.po"
done) > Makefile

echo
echo "Run \`make' to compile $APP_NAME"
