#!/bin/sh
# 
# Copyright (c) 2006-2008 Ed Schouten <ed@80386.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=2.1
APP_LINGUAS='ca da de es fi ga nl pl pt_BR ru sv tr vi zh_CN'

# Default compilation switches
CFG_AO=oss
unset CFG_BINEXT
CFG_CURSES_HEADER=ncurses
CFG_CURSES_LIB=ncursesw
CFG_HTTP=yes
CFG_MODPLUG=yes
CFG_MP3=yes
CFG_RES_INIT=yes
CFG_SCROBBLER=yes
unset CFG_SETPROCTITLE
CFG_SNDFILE=yes
unset CFG_DEBUG
unset CFG_STRICT
CFG_STRIP=-s
unset CFG_VOLUME
CFG_VORBIS=yes
CFG_XSPF=yes
DOIT=@

# Operating system defaults
[ "$OS" != "" ] || OS=`uname`
case $OS in
CYGWIN*|Windows_*)
	CFG_BINEXT=.exe
	unset CFG_HTTP
	unset CFG_RES_INIT
	[ "$CONFDIR" = "" ] && CONFDIR=/etc
	[ "$PREFIX" = "" ] && PREFIX=/usr
	;;
Darwin)
	CFG_AO=coreaudio
	LDFLAGS="$LDFLAGS -lresolv"
	[ "$PREFIX" = "" ] && PREFIX=/opt/local
	;;
FreeBSD)
	CFG_SETPROCTITLE=yes
	[ "$PREFIX" = "" ] && PREFIX=/usr/local
	[ "$MANDIR" = "" ] && MANDIR=$PREFIX/man
	;;
GNU/kFreeBSD)
	[ "$CONFDIR" = "" ] && CONFDIR=/etc
	[ "$PREFIX" = "" ] && PREFIX=/usr
	;;
Linux)
	CFG_AO=alsa
	[ "$CONFDIR" = "" ] && CONFDIR=/etc
	[ "$PREFIX" = "" ] && PREFIX=/usr
	;;
NetBSD)
	CFG_SETPROCTITLE=yes
	[ "$PREFIX" = "" ] && PREFIX=/usr/pkg
	;;
OpenBSD)
	CFG_SETPROCTITLE=yes
	[ "$PREFIX" = "" ] && PREFIX=/usr/local
	[ "$MANDIR" = "" ] && MANDIR=$PREFIX/man
	;;
SunOS)
	CFG_AO=ao
	unset CFG_HTTP
	[ "$PREFIX" = "" ] && PREFIX=/opt/sfw
	LDFLAGS="$LDFLAGS -lresolv"
	[ "$INSTALL" = "" ] && INSTALL=ginstall
	;;
*)
	echo "Warning: unknown operating system: $OS"
	CFG_AO=ao
	[ "$PREFIX" = "" ] && PREFIX=/usr/local
esac
SRCDIR=`dirname $0`
BINDIR=$PREFIX/bin
[ "$CONFDIR" = "" ] && CONFDIR=$PREFIX/etc
CONFFILE=$CONFDIR/$APP_NAME.conf
[ "$LINGUAS" = "" ] && LINGUAS=$APP_LINGUAS
[ "$MANDIR" = "" ] && MANDIR=$PREFIX/share/man
TRANSDIR=$PREFIX/share/locale
[ "$CC" = "" ] && CC=cc
[ "$INSTALL" = "" ] && INSTALL=install
MANPARTS="00-man 02-man 04-man 06-man"
MANREGEX="-e 's|%%CONFFILE%%|$CONFFILE|'"

# 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_nls)
		unset LINGUAS
		;;
	no_vorbis)
		unset CFG_VORBIS
		;;
	no_xspf)
		unset CFG_XSPF
		;;

	alsa|ao|coreaudio|null|oss|pulse)
		CFG_AO=$1
		;;
	
	no_strip)
		unset CFG_STRIP
		;;
	debug)
		CFG_DEBUG=yes
		unset CFG_STRIP
		;;
	strict)
		CFG_STRICT=yes
		;;
	verbose)
		unset DOIT
		;;
	
	ncurses)
		CFG_CURSES_HEADER=ncurses
		CFG_CURSES_LIB=ncurses
		;;
	xcurses)
		CFG_CURSES_HEADER=xcurses
		CFG_CURSES_LIB=XCurses
		;;

	*)
		echo "Error: unknown option: $1"
		echo "See the README file for a list of valid options"
		exit 1
	esac

	shift
done

test_pkgconfig()
{
	PKG_CFLAGS="`pkg-config --cflags $2 2> /dev/null`"
	if [ $? -ne 0 ]
	then
		echo "Error: $1 not found"
		exit 1
	fi
	eval CFLAGS$3="\"\$CFLAGS$3 \$PKG_CFLAGS\""

	LDFLAGS="$LDFLAGS `pkg-config --libs $2`"
}

[ "$CFLAGS" = "" ] && CFLAGS="-O"
CFLAGS="$CFLAGS -DAPP_NAME=\\\"$APP_NAME\\\" \
     -DAPP_VERSION=\\\"$APP_VERSION\\\" \
    -I$PREFIX/include -I$PREFIX/include/ncursesw \
    -I$PREFIX/include/ncurses -DCURSES_HEADER=\\<$CFG_CURSES_HEADER.h\\>"
if [ $? -ne 0 ]
then
	echo "Error: Glib not found"
	exit 1
fi
CFLAGS_main="-DAUDIO_OUTPUT=\\\"$CFG_AO\\\" -DCONFFILE=\\\"$CONFFILE\\\""
LDFLAGS="$LDFLAGS -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"

# We always use glib
test_pkgconfig "GLib" "glib-2.0" ""
test_pkgconfig "GLib threading library" "gthread-2.0" ""

# 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"
		SRCS="$SRCS md5 scrobbler util"
		MANPARTS="$MANPARTS 05-scrobbler"
	fi
	test_pkgconfig "cURL" "libcurl" ""
fi
# Modplug support
if [ "$CFG_MODPLUG" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_MODPLUG"
	test_pkgconfig "libmodplug" "libmodplug" "_audio_format_modplug"
	SRCS="$SRCS audio_format_modplug"
fi
# MP3 support
if [ "$CFG_MP3" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_MP3"
	LDFLAGS="$LDFLAGS -lmad -lid3tag"
	#test_pkgconfig "libmad" "mad" "_audio_format_mp3"
	#test_pkgconfig "libid3tag" "id3tag" "_audio_format_mp3"
	SRCS="$SRCS audio_format_mp3"
fi
# res_init() usage
[ "$CFG_RES_INIT" != "" ] && CFLAGS="$CFLAGS -DBUILD_RES_INIT"
# setproctitle() usage
[ "$CFG_SETPROCTITLE" != "" ] && CFLAGS_gui_playq="-DBUILD_SETPROCTITLE"
# libsndfile support
if [ "$CFG_SNDFILE" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_SNDFILE"
	LDFLAGS="$LDFLAGS -lsndfile"
	SRCS="$SRCS audio_format_sndfile"
fi
# Strict compilation
[ "$CFG_STRICT" != "" ] && CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wsign-compare -Werror"
[ "$CFG_STRICT" != "" ] && CFLAGS="$CFLAGS -g -DBUILD_DEBUG"
# Translation support
# Remove all broken translations
unset CFG_LINGUAS
unset MOS
for i in `echo $LINGUAS | xargs -n 1 | sort | uniq`
do
	for j in $APP_LINGUAS
	do
		if [ "$i" = "$j" ]
		then
			CFG_LINGUAS="$CFG_LINGUAS $i"
			MOS="$MOS $i.mo"
			continue 2
		fi
	done
	echo "Warning: unknown language: $i"
done
if [ "$CFG_LINGUAS" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_NLS"
	CFLAGS_main="$CFLAGS_main -DTRANSDIR=\\\"$TRANSDIR\\\""
fi
# Ogg Vorbis support
if [ "$CFG_VORBIS" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_VORBIS"
	LDFLAGS="$LDFLAGS -lvorbisfile"
	SRCS="$SRCS audio_format_vorbis"
fi
# XSPF support
if [ "$CFG_XSPF" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_XSPF"
	LDFLAGS="$LDFLAGS -lspiff"
	SRCS="$SRCS util vfs_xspf"
	PLAYQ_DUMPFILE="autosave.xspf"
else
	PLAYQ_DUMPFILE="autosave.pls"
fi
CFLAGS_config="$CFLAGS_config -DPLAYQ_DUMPFILE=\\\"$PLAYQ_DUMPFILE\\\""
MANREGEX="$MANREGEX -e 's|%%PLAYQ_DUMPFILE%%|$PLAYQ_DUMPFILE|'"

# Audio output options
case $CFG_AO in
alsa)
	CFG_VOLUME=yes
	CFLAGS="$CFLAGS -DBUILD_ALSA"
	LDFLAGS="$LDFLAGS -lasound"
	MANPARTS="$MANPARTS 03-alsa"
	;;
ao)
	CFLAGS="$CFLAGS -DBUILD_AO"
	CFLAGS_main="$CFLAGS_main -DCLOSE_STDERR"
	LDFLAGS="$LDFLAGS -lao"
	MANPARTS="$MANPARTS 03-ao"
	;;
coreaudio)
	CFG_VOLUME=yes
	LDFLAGS="$LDFLAGS -framework CoreAudio"
	;;
oss)
	case $OS in
	NetBSD|OpenBSD)
		CFLAGS="$CFLAGS -DOSS_HEADER=\\<soundcard.h\\>"
		LDFLAGS="$LDFLAGS -lossaudio"
		OSS_DEVICE="/dev/audio"
		;;
	*)
		# The OSS-through-ALSA compat may generate noise
		[ "$OS" = "Linux" ] && CFLAGS_main="$CFLAGS_main -DCLOSE_STDERR"
		CFLAGS="$CFLAGS -DOSS_HEADER=\\<sys/soundcard.h\\>"
		OSS_DEVICE="/dev/dsp"
		;;
	esac
	CFG_VOLUME=yes
	CFLAGS="$CFLAGS -DBUILD_OSS -I$PREFIX/lib/oss/include"
	CFLAGS_config="$CFLAGS_config -DOSS_DEVICE=\\\"$OSS_DEVICE\\\""
	MANPARTS="$MANPARTS 03-oss"
	MANREGEX="$MANREGEX -e 's|%%OSS_DEVICE%%|$OSS_DEVICE|'"
	;;
pulse)
	CFLAGS="$CFLAGS -DBUILD_PULSE"
	test_pkgconfig "PulseAudio" "libpulse-simple" "_audio_output_pulse"
	;;
esac

if [ "$CFG_VOLUME" != "" ]
then
	CFLAGS="$CFLAGS -DBUILD_VOLUME"
	MANPARTS="$MANPARTS 01-volume"
fi

echo "Configuration:"
echo "- Installing $APP_NAME$CFG_BINEXT in $BINDIR"
echo "- Installing manual page in $MANDIR"
echo "- Using $CONFFILE configuration file"
[ "$CFG_LINGUAS" != "" ] && echo "- Installing translations$CFG_LINGUAS 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"
[ "$CFG_XSPF" != "" ] && echo "- Support for XSPF (\`Spiff')"
echo

# Perform a simple compiler test
eval $CC $SRCDIR/src/conftest.c $CFLAGS $LDFLAGS -o conftest$CFG_BINEXT
if [ $? -ne 0 ]
then
	echo "Error: some dependencies are missing"
	echo "See the README file for a list of dependencies"
	exit 1
fi
rm conftest$CFG_BINEXT

# Don't generate duplicate rules
SRCS=`echo $SRCS | xargs -n 1 | sort | uniq`

unset OBJS
for i in $SRCS
do
	OBJS="$OBJS $i.o"
done
unset MANFILES
for i in `echo $MANPARTS | xargs -n 1 | sort | uniq`
do
	MANFILES="$MANFILES $SRCDIR/man/$i"
done

(cat << EOF
all: $APP_NAME$CFG_BINEXT $APP_NAME.1.gz $SRCDIR/$APP_NAME.conf.sample $MOS
$APP_NAME$CFG_BINEXT: $OBJS
	# Linking $APP_NAME$CFG_BINEXT
	$DOIT$CC $OBJS $LDFLAGS -o $APP_NAME$CFG_BINEXT
$APP_NAME.1.gz: $MANFILES Makefile
	# Generating manual page $APP_NAME.1.gz
	${DOIT}sed $MANREGEX $MANFILES | gzip -9 > $APP_NAME.1.gz
clean:
	# Removing $APP_NAME$CFG_BINEXT $APP_NAME.1.gz *.dSYM *.mo *.o
	${DOIT}rm -f $APP_NAME$CFG_BINEXT $APP_NAME.1.gz *.mo *.o
	${DOIT}rm -Rf *.dSYM
distclean: clean
	# Removing Makefile
	${DOIT}rm -f Makefile
Makefile: $0 `dirname $0`/depends
	# WARNING: Your Makefile is outdated. Please re-run $0!
install: all
	# Installing \$(DESTDIR)$BINDIR/$APP_NAME$CFG_BINEXT
	${DOIT}mkdir -p \$(DESTDIR)$BINDIR
	$DOIT$INSTALL $CFG_STRIP $APP_NAME$CFG_BINEXT \$(DESTDIR)$BINDIR/$APP_NAME$CFG_BINEXT
	# Installing \$(DESTDIR)$MANDIR/man1/$APP_NAME.1.gz
	${DOIT}mkdir -p \$(DESTDIR)$MANDIR/man1
	$DOIT$INSTALL -m 444 $APP_NAME.1.gz \$(DESTDIR)$MANDIR/man1/$APP_NAME.1.gz
	# Installing \$(DESTDIR)$CONFDIR/$APP_NAME.conf.sample
	${DOIT}mkdir -p \$(DESTDIR)$CONFDIR
	$DOIT$INSTALL -m 444 $SRCDIR/$APP_NAME.conf.sample \$(DESTDIR)$CONFDIR/$APP_NAME.conf.sample
EOF
for i in $CFG_LINGUAS
do
	echo "	# Installing \$(DESTDIR)$TRANSDIR/$i/LC_MESSAGES/$APP_NAME.mo"
	echo "	${DOIT}mkdir -p \$(DESTDIR)$TRANSDIR/$i/LC_MESSAGES"
	echo "	$DOIT$INSTALL -m 444 $i.mo \$(DESTDIR)$TRANSDIR/$i/LC_MESSAGES/$APP_NAME.mo"
done
cat << EOF
uninstall:
	# Uninstalling \$(DESTDIR)$BINDIR/$APP_NAME$CFG_BINEXT
	${DOIT}rm -f \$(DESTDIR)$BINDIR/$APP_NAME$CFG_BINEXT
	# Uninstalling \$(DESTDIR)$MANDIR/man1/$APP_NAME.1.gz
	${DOIT}rm -f \$(DESTDIR)$MANDIR/man1/$APP_NAME.1.gz
	# Uninstalling \$(DESTDIR)$CONFDIR/$APP_NAME.conf.sample
	${DOIT}rm -f  \$(DESTDIR)$CONFDIR/$APP_NAME.conf.sample
EOF
for i in $CFG_LINGUAS
do
	echo "	# Uninstalling \$(DESTDIR)$TRANSDIR/$i/LC_MESSAGES/$APP_NAME.mo"
	echo "	${DOIT}rm -f \$(DESTDIR)$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 "	# Compiling $i.o"
	echo "	$DOIT$CC -c $SRCDIR/src/$i.c $CFLAGS `eval echo \\\$CFLAGS_\$i` -o $i.o"
done
for i in $CFG_LINGUAS
do
	echo "$i.mo: $SRCDIR/po/$i.po"
	echo "	# Generating translation $i.mo"
	echo "	${DOIT}msgfmt -o $i.mo $SRCDIR/po/$i.po"
done) > Makefile

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