#  FLAC - Free Lossless Audio Codec
#  Copyright (C) 2001,2002  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.3)

# 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,
[  --enable-3dnow                 Enable 3DNOW! support],
[case "${enableval}" in
	yes) use_3dnow=true ;;
	no)  use_3dnow=false ;;
	*) AC_MSG_ERROR(bad value ${enableval} for --enable-3dnow) ;;
esac],[use_3dnow=false])
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 ("make check" will take a LONG time!)],
[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

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)

SHARE_LIBS='$(top_builddir)/src/share/libutf8.a $(top_builddir)/src/share/libgetopt.a'

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(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)

AC_SUBST(SHARE_LIBS)

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

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/flac_mac/Makefile \
	src/monkeys_audio_utilities/flac_ren/Makefile \
	src/monkeys_audio_utilities/Makefile \
	src/plugin_common/Makefile \
	src/plugin_winamp2/Makefile \
	src/plugin_winamp3/Makefile \
	src/plugin_xmms/Makefile \
	src/share/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 \
	doc/Makefile \
	doc/html/Makefile \
	doc/html/images/Makefile \
	doc/html/ru/Makefile \
	man/Makefile \
	test/Makefile \
	build/Makefile \
	obj/bin/Makefile \
	obj/lib/Makefile \
	obj/Makefile \
	flac.pbproj/Makefile \
)
