#  FLAC - Free Lossless Audio Codec
#  Copyright (C) 2001,2002,2003  Josh Coalson
#
#  This program is part of FLAC; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

# NOTE that for many of the AM_CONDITIONALs we use the prefix FLaC__
# instead of FLAC__ since autoconf triggers off 'AC_' in strings

AC_INIT(src/flac/main.c)
AM_INIT_AUTOMAKE(flac, 1.0.5_beta2)

# Don't automagically regenerate autoconf/automake generated files unless
# explicitly requested.  Eases autobuilding -mdz
AM_MAINTAINER_MODE

# Function to configure paths for id3lib; search for 'meat' to get to the end.
# adapted from ogg.m4
# This is here until id3lib comes with an equivalent.
# It is inline with configure.in instead of a separate file as a courtesy to users unaware of the -I flag to aclocal
dnl LOCAL__PATH_ID3LIB([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Test for libid3, and define ID3LIB_CFLAGS and ID3LIB_LIBS
dnl
AC_DEFUN(LOCAL__PATH_ID3LIB,
[dnl
dnl Get the cflags and libraries
dnl
AC_ARG_WITH(id3lib,[  --with-id3lib=PFX   Prefix where libid3 is installed (optional)], id3lib_prefix="$withval", id3lib_prefix="")
AC_ARG_WITH(id3lib-libraries,[  --with-id3lib-libraries=DIR   Directory where libid3 library is installed (optional)], id3lib_libraries="$withval", id3lib_libraries="")
AC_ARG_WITH(id3lib-includes,[  --with-id3lib-includes=DIR   Directory where libid3 header files are installed (optional)], id3lib_includes="$withval", id3lib_includes="")
AC_ARG_ENABLE(id3libtest, [  --disable-id3libtest       Do not try to compile and run a test id3lib program],, enable_id3libtest=yes)

	if test "x$id3lib_libraries" != "x" ; then
		ID3LIB_LIBS="-L$id3lib_libraries"
	elif test "x$id3lib_prefix" != "x" ; then
		ID3LIB_LIBS="-L$id3lib_prefix/lib"
	elif test "x$prefix" != "xNONE" ; then
		ID3LIB_LIBS="-L$prefix/lib"
	fi

	ID3LIB_LIBS="$ID3LIB_LIBS -lid3"

	if test "x$id3lib_includes" != "x" ; then
		ID3LIB_CFLAGS="-I$id3lib_includes"
	elif test "x$id3lib_prefix" != "x" ; then
		ID3LIB_CFLAGS="-I$id3lib_prefix/include"
	elif test "$prefix" != "xNONE"; then
		ID3LIB_CFLAGS="-I$prefix/include"
	fi

	AC_MSG_CHECKING(for id3lib)


	if test "x$enable_id3libtest" = "xyes" ; then
		id3lib_found=""
	else
		id3lib_found="yes"
	fi
	dnl There is some confusion over what libraries libid3 needs
	dnl so we must be pessimistic and try all permutations:
	dnl "-lid3" "-lid3 -lstdc++" "-lid3 -lz" "-lid3 -lz -lstdc++"
	for xtra_stdcpp in "" " -lstdc++" ; do
		for xtra_z in "" " -lz" ; do
			if test "x$id3lib_found" = "x" ; then
				ac_save_CFLAGS="$CFLAGS"
				ac_save_LIBS="$LIBS"
				CFLAGS="$CFLAGS $ID3LIB_CFLAGS"
				LIBS="$LIBS $ID3LIB_LIBS$xtra_stdcpp$xtra_z"
				rm -f conf.id3libtest
				AC_TRY_RUN([
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <id3.h>
int main () { system("touch conf.id3libtest"); return 0; }
], id3lib_found=yes,,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
				CFLAGS="$ac_save_CFLAGS"
				LIBS="$ac_save_LIBS"
			fi
			if test "x$id3lib_found" = "xyes" ; then
				ID3LIB_LIBS="$ID3LIB_LIBS$xtra_stdcpp$xtra_z"
			fi
		done
	done

	if test "x$id3lib_found" = "xyes" ; then
		AC_MSG_RESULT(yes)
		ifelse([$1], , :, [$1])
	else
		AC_MSG_RESULT(no)
		if test -f conf.id3libtest ; then
			:
		else
			echo "*** Could not run id3lib test program, checking why..."
			CFLAGS="$CFLAGS $ID3LIB_CFLAGS"
			LIBS="$LIBS $ID3LIB_LIBS"
			AC_TRY_LINK([
#include <stdio.h>
#include <id3.h>
],     [ return 0; ],
			[ echo "*** The test program compiled, but did not run. This usually means"
			echo "*** that the run-time linker is not finding id3lib or finding the wrong"
			echo "*** version of id3lib. If it is not finding id3lib, you'll need to set your"
			echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
			echo "*** to the installed location  Also, make sure you have run ldconfig if that"
			echo "*** is required on your system"
			echo "***"
			echo "*** If you have an old version installed, it is best to remove it, although"
			echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
			[ echo "*** The test program failed to compile or link. See the file config.log for the"
			echo "*** exact error that occured. This usually means id3lib was incorrectly installed"
			echo "*** or that you have moved id3lib since it was installed." ])
			CFLAGS="$ac_save_CFLAGS"
			LIBS="$ac_save_LIBS"
		fi
		ID3LIB_CFLAGS=""
		ID3LIB_LIBS=""
		ifelse([$2], , :, [$2])
	fi
	AC_SUBST(ID3LIB_CFLAGS)
	AC_SUBST(ID3LIB_LIBS)
	rm -f conf.id3libtest
])


dnl Now the meat of configure.in:

# We need two libtools, one that builds both shared and static, and
# one that builds only static.  This is because the resulting libtool
# does not allow us to choose which to build at runtime.
AM_PROG_LIBTOOL
sed -e 's/^build_old_libs=yes/build_old_libs=no/' libtool > libtool-disable-static
chmod +x libtool-disable-static

AC_PROG_CXX
AC_PROG_MAKE_SET

dnl check for getopt in standard library
dnl AC_CHECK_FUNCS(getopt_long , , [LIBOBJS="$LIBOBJS getopt.o getopt1.o"] )
AC_CHECK_FUNCS(getopt_long, [], [])

AC_CANONICAL_HOST
case "$host_cpu" in
	i*86)	cpu_ia32=true ; AC_DEFINE(FLAC__CPU_IA32) ;;
	powerpc)	cpu_ppc=true ; AC_DEFINE(FLAC__CPU_PPC) ;;
	sparc)	cpu_sparc=true ; AC_DEFINE(FLAC__CPU_SPARC) ;;
esac
AM_CONDITIONAL(FLaC__CPU_IA32, test x$cpu_ia32 = xtrue)
AM_CONDITIONAL(FLaC__CPU_PPC, test x$cpu_ppc = xtrue)
AM_CONDITIONAL(FLaC__CPU_SPARC, test x$cpu_sparc = xtrue)
case "$host" in
	i[[3-6]]86-*-openbsd*) OBJ_FORMAT=aoutb ;;
	*) OBJ_FORMAT=elf ;;
esac
AC_SUBST(OBJ_FORMAT)

if test x$cpu_ia32 = xtrue ; then
AC_DEFINE(FLAC__ALIGN_MALLOC_DATA)
fi

AC_ARG_ENABLE(asm-optimizations, [  --disable-asm-optimizations    Don't use any assembly optimization routines], asm_opt=no, asm_opt=yes)
AM_CONDITIONAL(FLaC__NO_ASM, test x$asm_opt = xno)
if test x$asm_opt = xno ; then
AC_DEFINE(FLAC__NO_ASM)
fi

AC_ARG_ENABLE(debug,
[  --enable-debug                 Turn on debugging],
[case "${enableval}" in
	yes) debug=true ;;
	no)  debug=false ;;
	*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
esac],[debug=false])
AM_CONDITIONAL(DEBUG, test x$debug = xtrue)

AC_ARG_ENABLE(sse,
[  --enable-sse                   Enable SSE support by asserting that the OS supports SSE instructions],
[case "${enableval}" in
	yes) sse_os=true ;;
	no)  sse_os=false ;;
	*) AC_MSG_ERROR(bad value ${enableval} for --enable-sse) ;;
esac],[sse_os=false])
AM_CONDITIONAL(FLaC__SSE_OS, test x$sse_os = xtrue)
if test x$sse_os = xtrue ; then
AC_DEFINE(FLAC__SSE_OS)
fi

AC_ARG_ENABLE(3dnow,
[  --disable-3dnow                Disable 3DNOW! optimizations],
[case "${enableval}" in
	yes) use_3dnow=true ;;
	no)  use_3dnow=false ;;
	*) AC_MSG_ERROR(bad value ${enableval} for --enable-3dnow) ;;
esac],[use_3dnow=true])
AM_CONDITIONAL(FLaC__USE_3DNOW, test x$use_3dnow = xtrue)
if test x$use_3dnow = xtrue ; then
AC_DEFINE(FLAC__USE_3DNOW)
fi

AC_ARG_ENABLE(exhaustive-tests,
[  --enable-exhaustive-tests      Enable exhaustive testing],
[case "${enableval}" in
	yes) exhaustive_tests=true ;;
	no)  exhaustive_tests=false ;;
	*) AC_MSG_ERROR(bad value ${enableval} for --enable-exhaustive-tests) ;;
esac],[exhaustive_tests=false])
AM_CONDITIONAL(FLaC__EXHAUSTIVE_TESTS, test x$exhaustive_tests = xtrue)
if test x$exhaustive_tests = xtrue ; then
AC_DEFINE(FLAC__EXHAUSTIVE_TESTS)
fi

AC_ARG_ENABLE(valgrind-testing,
[  --enable-valgrind-testing      Run all tests inside Valgrind],
[case "${enableval}" in
	yes) valgrind_testing=true ;;
	no)  valgrind_testing=false ;;
	*) AC_MSG_ERROR(bad value ${enableval} for --enable-valgrind-testing) ;;
esac],[valgrind_testing=false])
AM_CONDITIONAL(FLaC__VALGRIND_TESTING, test x$valgrind_testing = xtrue)
if test x$valgrind_testing = xtrue ; then
AC_DEFINE(FLAC__VALGRIND_TESTING)
fi

dnl check for ogg library
XIPH_PATH_OGG(have_ogg=yes, AC_MSG_WARN([*** Ogg development enviroment not installed - Ogg support will not be built]))
AM_CONDITIONAL(FLaC__HAS_OGG, [test x$have_ogg = xyes])
if test x$have_ogg = xyes ; then
AC_DEFINE(FLAC__HAS_OGG)
fi

AM_PATH_XMMS(0.9.5.1, , AC_MSG_WARN([*** XMMS >= 0.9.5.1 not installed - xmms support will not be built]))
AM_CONDITIONAL(FLaC__HAS_XMMS, test x$XMMS_INPUT_PLUGIN_DIR != x)

dnl check for i18n(internationalization); these are from libiconv/gettext
AM_ICONV
AM_LANGINFO_CODESET

dnl check for id3lib library
dnl LOCAL__PATH_ID3LIB is defined by us, and will be until such time as id3lib supplies one
LOCAL__PATH_ID3LIB(have_id3lib=yes, AC_MSG_WARN([*** id3lib not found - id3v2 support will not be built]))
AM_CONDITIONAL(FLaC__HAS_ID3LIB, [test x$have_id3lib = xyes])
if test x$have_id3lib = xyes ; then
AC_DEFINE(FLAC__HAS_ID3LIB)

dnl expected id3lib version for cross compiling
ID3LIB_MAJOR=3
ID3LIB_MINOR=8
ID3LIB_PATCH=0

CFLAGS_save_blah_blah_blah=$CFLAGS
CFLAGS="$ID3LIB_CFLAGS $CFLAGS"
LIBS_save_blah_blah_blah=$LIBS
LIBS="$ID3LIB_LIBS $LIBS"
AC_MSG_CHECKING(for id3lib version)
      AC_TRY_RUN([
#include <id3.h>
#include <stdio.h>
int
main ()
{
	FILE *output;
	output=fopen("conftest.id3","w");
	fprintf(output,"ID3LIB_MAJOR=%d\nID3LIB_MINOR=%d\nID3LIB_PATCH=%d\n",ID3LIB_MAJOR_VERSION,ID3LIB_MINOR_VERSION,ID3LIB_PATCH_VERSION);
	fclose(output);
	exit(0);
}
], . ./conftest.id3; echo "${ID3LIB_MAJOR}.${ID3LIB_MINOR}.${ID3LIB_PATCH}", AC_MSG_WARN(could not determine id3lib version),[echo $ac_n "cross compiling; assuming ${ID3LIB_MAJOR}.${ID3LIB_MINOR}.${ID3LIB_PATCH} $ac_c"])
AC_DEFINE_UNQUOTED(ID3LIB_MAJOR, $ID3LIB_MAJOR)
AC_DEFINE_UNQUOTED(ID3LIB_MINOR, $ID3LIB_MINOR)
AC_DEFINE_UNQUOTED(ID3LIB_PATCH, $ID3LIB_PATCH)
CFLAGS=$CFLAGS_save_blah_blah_blah
LIBS=$LIBS_save_blah_blah_blah
fi

AC_CHECK_PROGS(DOXYGEN, doxygen)
AM_CONDITIONAL(FLaC__HAS_DOXYGEN, test -n "$DOXYGEN")
if test -n "$DOXYGEN" ; then
AC_DEFINE(FLAC__HAS_DOXYGEN)
fi

AC_CHECK_PROGS(NASM, nasm)
AM_CONDITIONAL(FLaC__HAS_NASM, test -n "$NASM")
if test -n "$NASM" ; then
AC_DEFINE(FLAC__HAS_NASM)
fi

dnl Check for type sizes

AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(long long)

case 2 in
	$ac_cv_sizeof_short) FLaC__SIZE16="short" ; FLaC__USIZE16="unsigned short";;
	$ac_cv_sizeof_int) FLaC__SIZE16="int" ; FLaC__USIZE16="unsigned int";;
esac

case 4 in
	$ac_cv_sizeof_short) FLaC__SIZE32="short" ; FLaC__USIZE32="unsigned short";;
	$ac_cv_sizeof_int) FLaC__SIZE32="int" ; FLaC__USIZE32="unsigned int";;
	$ac_cv_sizeof_long) FLaC__SIZE32="long" ; FLaC__USIZE32="unsigned long";;
esac

case 8 in
	$ac_cv_sizeof_int) FLaC__SIZE64="int" ; FLaC__USIZE64="unsigned int";;
	$ac_cv_sizeof_long) FLaC__SIZE64="long" ; FLaC__USIZE64="unsigned long";;
	$ac_cv_sizeof_long_long) FLaC__SIZE64="long long" ; FLaC__USIZE64="unsigned long long";;
esac

if test -z "$FLaC__SIZE16"; then
	AC_MSG_ERROR(No 16 bit type found on this platform!)
fi
if test -z "$FLaC__USIZE16"; then
	AC_MSG_ERROR(No unsigned 16 bit type found on this platform!)
fi
if test -z "$FLaC__SIZE32"; then
	AC_MSG_ERROR(No 32 bit type found on this platform!)
fi
if test -z "$FLaC__USIZE32"; then
	AC_MSG_ERROR(No unsigned 32 bit type found on this platform!)
fi
if test -z "$FLaC__SIZE64"; then
	AC_MSG_WARN(No 64 bit type found on this platform!)
fi
if test -z "$FLaC__USIZE64"; then
	AC_MSG_ERROR(No unsigned 64 bit type found on this platform!)
fi

AC_SUBST(FLaC__SIZE16)
AC_SUBST(FLaC__USIZE16)
AC_SUBST(FLaC__SIZE32)
AC_SUBST(FLaC__USIZE32)
AC_SUBST(FLaC__SIZE64)
AC_SUBST(FLaC__USIZE64)

OUR_CFLAGS_HEAD='-I$(top_builddir) -I$(srcdir)/include -I$(top_srcdir)/include'
if test x$debug = xtrue; then
	OUR_CFLAGS_HEAD="$OUR_CFLAGS_HEAD -g -O0 -DDEBUG"
else
	OUR_CFLAGS_HEAD="$OUR_CFLAGS_HEAD -O3 -DNDEBUG"
	if test x$GCC = xyes; then
		OUR_CFLAGS_HEAD="$OUR_CFLAGS_HEAD -fomit-frame-pointer -funroll-loops -finline-functions -Wall -W -Winline -DFLaC__INLINE=__inline__"
	fi
fi
CFLAGS="$OUR_CFLAGS_HEAD $CFLAGS"
CXXFLAGS="$OUR_CFLAGS_HEAD $CXXFLAGS"

AM_CONFIG_HEADER(config.h)
AH_TEMPLATE(FLAC__ALIGN_MALLOC_DATA,  [define if XXX])
AH_TEMPLATE(FLAC__CPU_IA32,  [define if building for ia32/i386])
AH_TEMPLATE(FLAC__CPU_PPC,  [define if building for PowerPC])
AH_TEMPLATE(FLAC__CPU_SPARC,  [define if building for SPARC])
AH_TEMPLATE(FLAC__EXHAUSTIVE_TESTS,  [define to run even more tests])
AH_TEMPLATE(FLAC__VALGRIND_TESTING,  [define to enable use of Valgrind in testers])
AH_TEMPLATE(FLAC__HAS_DOXYGEN,  [define if you have Doxygen])
AH_TEMPLATE(FLAC__HAS_ID3LIB,  [define if you have the id3lib library])
AH_TEMPLATE(FLAC__HAS_NASM,  [define if you have the NASM assembler])
AH_TEMPLATE(FLAC__HAS_OGG,  [define if you have the ogg library])
AH_TEMPLATE(FLAC__NO_ASM,  [define to disable use of assembly code])
AH_TEMPLATE(FLAC__SSE_OS,  [define if your operating system supports SSE instructions])
AH_TEMPLATE(FLAC__USE_3DNOW,  [define to enable use of 3Dnow! instructions])
AH_TEMPLATE(ID3LIB_MAJOR,  [define to major version number of id3lib])
AH_TEMPLATE(ID3LIB_MINOR,  [define to minor version number of id3lib])
AH_TEMPLATE(ID3LIB_PATCH,  [define to patch level of id3lib])

AC_OUTPUT( \
	Makefile \
	src/Makefile \
	src/libFLAC/Makefile \
	src/libFLAC/ia32/Makefile \
	src/libFLAC/include/Makefile \
	src/libFLAC/include/private/Makefile \
	src/libFLAC/include/protected/Makefile \
	src/libFLAC++/Makefile \
	src/libOggFLAC/Makefile \
	src/libOggFLAC/include/Makefile \
	src/libOggFLAC/include/protected/Makefile \
	src/libOggFLAC++/Makefile \
	src/flac/Makefile \
	src/metaflac/Makefile \
	src/monkeys_audio_utilities/Makefile \
	src/monkeys_audio_utilities/flac_mac/Makefile \
	src/monkeys_audio_utilities/flac_ren/Makefile \
	src/plugin_common/Makefile \
	src/plugin_common/include/Makefile \
	src/plugin_common/include/private/Makefile \
	src/plugin_winamp2/Makefile \
	src/plugin_winamp2/include/Makefile \
	src/plugin_winamp2/include/winamp2/Makefile \
	src/plugin_winamp3/Makefile \
	src/plugin_xmms/Makefile \
	src/share/Makefile \
	src/share/gain_analysis/Makefile \
	src/share/getopt/Makefile \
	src/share/grabbag/Makefile \
	src/share/utf8/Makefile \
	src/test_grabbag/Makefile \
	src/test_grabbag/cuesheet/Makefile \
	src/test_libFLAC/Makefile \
	src/test_libFLAC++/Makefile \
	src/test_libOggFLAC/Makefile \
	src/test_libOggFLAC++/Makefile \
	src/test_streams/Makefile \
	include/Makefile \
	include/FLAC/Makefile \
	include/FLAC/ordinals.h \
	include/FLAC++/Makefile \
	include/OggFLAC/Makefile \
	include/OggFLAC++/Makefile \
	include/share/Makefile \
	include/share/grabbag/Makefile \
	doc/Makefile \
	doc/html/Makefile \
	doc/html/images/Makefile \
	doc/html/ru/Makefile \
	man/Makefile \
	test/Makefile \
	test/cuesheets/Makefile \
	build/Makefile \
	obj/Makefile \
	obj/debug/Makefile \
	obj/debug/bin/Makefile \
	obj/debug/lib/Makefile \
	obj/release/Makefile \
	obj/release/bin/Makefile \
	obj/release/lib/Makefile \
	flac.pbproj/Makefile \
)
