#!/bin/sh

. scripts/configure.sh || exit 1

check_cflags()
{
	check_cc_flag -std=gnu99 -pipe -Wall -Wshadow -Wcast-align -Wpointer-arith \
		-Wwrite-strings -Wundef -Wmissing-prototypes -Wredundant-decls

	for i in -Wdeclaration-after-statement -Wold-style-definition -Wno-pointer-sign
	do
		check_cc_flag $i
	done
	return 0
}

check_compat()
{
	COMPAT_LIBS=
	case `uname -s` in
	SunOS)
		# connect() etc.
		try_link -lsocket && COMPAT_LIBS="$COMPAT_LIBS -lsocket"

		# gethostbyname()
		try_link -lnsl && COMPAT_LIBS="$COMPAT_LIBS -lnsl"

		# nanosleep()
		if try_link -lrt
		then
			COMPAT_LIBS="$COMPAT_LIBS -lrt"
		elif try_link -lposix4
		then
			COMPAT_LIBS="$COMPAT_LIBS -lposix4"
		fi
		;;
	CYGWIN*)
		CONFIG_CYGWIN=y
		makefile_vars CONFIG_CYGWIN
	esac
	makefile_vars COMPAT_LIBS
}

check_ncurses()
{
	if check_library NCURSES "" -lncursesw
	then
		widechars=y
		return 0
	fi
	if check_library NCURSES "" -lncurses || check_library NCURSES "" -lcurses
	then
		widechars=n
		msg_error "Your ncurses does not support wide characters!"
		msg_error "Install ncursesw if you need wide character support,"
		msg_error "you can ignore this warning otherwise."
		return 0
	fi
	return 1
}

check_mpc()
{
	check_library MPC "" "-lmpcdec"
	return $?
}

check_flac()
{
	check_library FLAC "" "-lFLAC -lm" && return 0
	check_library FLAC "" "-lFLAC -lvorbisfile -lm"
	return $?
}

check_mad()
{
	pkg_config MAD "mad" "" "-lmad -lm"
	return $?
}

check_mikmod()
{
	app_config MIKMOD libmikmod-config && return 0
	# mikmod is linked against pthread
	check_library MIKMOD "$PTHREAD_CFLAGS" "-lmikmod $PTHREAD_LIBS"
	return $?
}

check_modplug()
{
	pkg_config MODPLUG "libmodplug" "-I/usr/include/libmodplug" "-lmodplug -lstdc++ -lm"
	return $?
}

check_vorbis()
{
	if test "$CONFIG_TREMOR" = y
	then
		pkg_config VORBIS "vorbisidec" "" "-lvorbisidec -lm"
		return $?
	else
		pkg_config VORBIS "vorbisfile" "" "-lvorbisfile -lvorbis -lm -logg"
		return $?
	fi
}

check_wavpack()
{
	pkg_config WAVPACK "wavpack" "" "-lwavpack"
	return $?
}

check_alsa()
{
	# the alsa.pc file should be always available
	pkg_config ALSA "alsa >= 1.0.11"
	return $?
}

check_ao()
{
	pkg_config AO "ao" "" "-lao"
	return $?
}

check_arts()
{
	app_config ARTS artsc-config
	return $?
}

check_oss()
{
	case `uname -s` in
		Linux|*FreeBSD)
			;;
		*BSD)
			check_library OSS "" "-lossaudio"
			return $?
			;;
		*)
			# unknown
			;;
	esac

	OSS_CFLAGS=""
	OSS_LIBS=""
	msg_checking "for header <sys/soundcard.h>"
	if test -f /usr/include/sys/soundcard.h
	then
		msg_result "yes"
		makefile_vars OSS_CFLAGS OSS_LIBS
		return 0
	else
		msg_result "no"
	fi
	return 1
}

check_sun()
{
	msg_checking "for header <sys/audioio.h>"
	if test -f /usr/include/sys/audioio.h
	then
		msg_result "yes"
		return 0
	else
		msg_result "no"
		return 1
	fi
}

check_waveout()
{
	case `uname -s` in
	CYGWIN*)
		check_library WAVEOUT "" "-lwinmm"
		return $?
	esac
	return 1
}

check_mp4()
{
	check_header faad.h &&
	check_library MP4 "" "-lmp4v2 -lfaad -lm"
	return $?
}

check_aac()
{
	check_header faad.h &&
	check_library AAC "" "-lfaad -lm"
	return $?
}

check_ffmpeg()
{
	pkg_config FFMPEG "libavformat"
	return $?
}

# defaults
prefix=/usr/local
DEBUG=1
CONFIG_TREMOR=n
CONFIG_MIKMOD=n
# unset CONFIG_* variables: if check succeeds 'y', otherwise 'n'

USAGE="
Options:
  prefix          Installation prefix    [$prefix]
  bindir          User executables       [\$prefix/bin]
  datadir         Read-only data         [\$prefix/share]
  libdir          Libraries              [\$prefix/lib]
  mandir          Man pages              [\$datadir/man]
  exampledir      Examples               [\$datadir/doc/cmus/examples]
  DEBUG           Debugging level (0-2)  [$DEBUG]

Optional Features: y/n
  CONFIG_FLAC     Free Lossless Audio Codec (.flac, .fla)         [auto]
  CONFIG_MAD      MPEG Audio Decoder (.mp3, .mp2, streams)        [auto]
  CONFIG_MODPLUG  libmodplug (.mod, .x3m, ...)                    [auto]
  CONFIG_MIKMOD   libmikmod (.mod, .x3m, ...)                     [n]
  CONFIG_MPC      libmpcdec (Musepack .mpc, .mpp, .mp+)           [auto]
  CONFIG_VORBIS   Ogg/Vorbis (.ogg, application/ogg, audio/x-ogg) [auto]
  CONFIG_TREMOR   Use Tremor as Ogg/Vorbis input plugin           [n]
  CONFIG_WAV      WAV                                             [y]
  CONFIG_WAVPACK  WavPack (.wv, audio/x-wavpack)                  [auto]
  CONFIG_MP4      MPEG-4 AAC (.mp4, .m4a, .m4b)                   [auto]
  CONFIG_AAC      AAC (.aac, audio/aac, audio/aacp)               [auto]
  CONFIG_FFMPEG   FFMPEG (.shn, .wma)                             [auto]
  CONFIG_ALSA     ALSA                                            [auto]
  CONFIG_AO       Libao cross-platform audio library              [auto]
  CONFIG_ARTS     ARTS                                            [auto]
  CONFIG_OSS      Open Sound System                               [auto]
  CONFIG_SUN      Sun Audio                                       [auto]
  CONFIG_WAVEOUT  Windows Wave Out                                [auto]

Also many standard variables like CC are recognized."

parse_command_line "$@"

case $DEBUG in
[0-2])
	;;
*)
	die "DEBUG must be 0-2"
	;;
esac

var_default bindir "${prefix}/bin"
var_default datadir "${prefix}/share"
var_default libdir "${prefix}/lib"
var_default mandir "${datadir}/man"
var_default exampledir "${datadir}/doc/cmus/examples"

check check_cc
check check_cflags
check check_cc_depgen
check check_endianness
check check_compat
check check_dl
check check_pthread
check check_ncurses
check check_iconv

check check_flac    CONFIG_FLAC
check check_mad     CONFIG_MAD
check check_mikmod  CONFIG_MIKMOD
check check_modplug CONFIG_MODPLUG
check check_mpc     CONFIG_MPC
check check_vorbis  CONFIG_VORBIS
check check_wavpack CONFIG_WAVPACK
check check_mp4     CONFIG_MP4
check check_aac     CONFIG_AAC
check check_ffmpeg  CONFIG_FFMPEG
# nothing to check, just validate the variable values
check true          CONFIG_TREMOR
check true          CONFIG_WAV
check check_alsa    CONFIG_ALSA
check check_ao      CONFIG_AO
check check_arts    CONFIG_ARTS
check check_oss     CONFIG_OSS
check check_sun     CONFIG_SUN
check check_waveout CONFIG_WAVEOUT

test "$WORDS_BIGENDIAN" = y && CFLAGS="${CFLAGS} -DWORDS_BIGENDIAN"

DATADIR="$datadir"
LIBDIR="$libdir"

config_header config/datadir.h DATADIR
config_header config/libdir.h LIBDIR
config_header config/debug.h DEBUG
config_header config/tremor.h CONFIG_TREMOR

makefile_vars bindir datadir libdir mandir exampledir
makefile_vars CONFIG_FLAC CONFIG_MAD CONFIG_MIKMOD CONFIG_MODPLUG CONFIG_MPC CONFIG_VORBIS CONFIG_WAVPACK CONFIG_WAV CONFIG_MP4 CONFIG_AAC CONFIG_FFMPEG
makefile_vars CONFIG_ALSA CONFIG_AO CONFIG_ARTS CONFIG_OSS CONFIG_SUN CONFIG_WAVEOUT

generate_config_mk
