dnl Process this file with autoconf to produce a configure script.

AC_INIT(src/framing.c)

AM_INIT_AUTOMAKE(libogg,1.2.0)
AM_MAINTAINER_MODE

dnl Library versioning

LIB_CURRENT=7
LIB_REVISION=0
LIB_AGE=7
AC_SUBST(LIB_CURRENT)
AC_SUBST(LIB_REVISION)
AC_SUBST(LIB_AGE)

AC_PROG_CC
AM_PROG_LIBTOOL
AM_PROG_CC_C_O

dnl config.h
AM_CONFIG_HEADER(config.h)

dnl Set some options based on environment

cflags_save="$CFLAGS"
if test -z "$GCC"; then
        case $host in 
        *-*-irix*)
                DEBUG="-g -signed" 
                CFLAGS="-O2 -w -signed"
                PROFILE="-p -g3 -O2 -signed"
		;;
        sparc-sun-solaris*)
                DEBUG="-v -g"
                CFLAGS="-xO4 -fast -w -fsimple -native -xcg92"
                PROFILE="-v -xpg -g -xO4 -fast -native -fsimple -xcg92 -Dsuncc"
		;;
        *)
                DEBUG="-g"
                CFLAGS="-O"
                PROFILE="-g -p" 
		;;
        esac
else
        case $host in 
        *-*-linux*)
                DEBUG="-g -Wall -fsigned-char"
                CFLAGS="-O20 -ffast-math -fsigned-char"
                PROFILE="-Wall -W -pg -g -O20 -ffast-math -fsigned-char"
		;;
        sparc-sun-*)
                sparc_cpu=""
                AC_MSG_CHECKING([if gcc supports -mv8])
                old_cflags="$CFLAGS"
                CFLAGS="$CFLAGS -mv8"
                AC_TRY_COMPILE(, [return 0;], [
                        AC_MSG_RESULT([yes])
                        sparc_cpu="-mv8"
                ])
                CFLAGS="$old_cflags"
                DEBUG="-g -Wall -fsigned-char $sparc_cpu"
                CFLAGS="-O20 -ffast-math -fsigned-char $sparc_cpu"
                PROFILE="-pg -g -O20 -fsigned-char $sparc_cpu" 
		;;
	*-*-darwin*)
		DEBUG="-fno-common -g -Wall -fsigned-char"
		CFLAGS="-fno-common -O4 -Wall -fsigned-char -ffast-math"
		PROFILE="-fno-common -O4 -Wall -pg -g -fsigned-char -ffast-math"
		;;
        *)
                DEBUG="-g -Wall -fsigned-char"
                CFLAGS="-O20 -fsigned-char"
                PROFILE="-O20 -g -pg -fsigned-char" 
		;;
        esac
fi
CFLAGS="$CFLAGS $cflags_save"
DEBUG="$DEBUG $cflags_save"
PROFILE="$PROFILE $cflags_save"

dnl Checks for programs.

dnl Checks for libraries.

dnl Checks for header files.
AC_HEADER_STDC

dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST

dnl Check for types

AC_MSG_CHECKING(for int16_t)
AC_CACHE_VAL(has_cv_int16_t,
[AC_TRY_RUN([
#if defined __BEOS__ && !defined __HAIKU__
#include <inttypes.h>
#endif
#include <sys/types.h>
int16_t foo;
int main() {return 0;}
],
has_cv_int16_t=yes,
has_cv_int16_t=no,
has_cv_int16_t=no
)])
AC_MSG_RESULT($has_cv_int16_t)

AC_MSG_CHECKING(for int32_t)
AC_CACHE_VAL(has_cv_int32_t,
[AC_TRY_RUN([
#if defined __BEOS__ && !defined __HAIKU__
#include <inttypes.h>
#endif
#include <sys/types.h>
int32_t foo;
int main() {return 0;}
],
has_cv_int32_t=yes,
has_cv_int32_t=no,
has_cv_int32_t=no
)])
AC_MSG_RESULT($has_cv_int32_t)

AC_MSG_CHECKING(for uint32_t)
AC_CACHE_VAL(has_cv_uint32_t,
[AC_TRY_RUN([
#if defined __BEOS__ && !defined __HAIKU__
#include <inttypes.h>
#endif
#include <sys/types.h>
uint32_t foo;
int main() {return 0;}
],
has_cv_uint32_t=yes,
has_cv_uint32_t=no,
has_cv_uint32_t=no
)])
AC_MSG_RESULT($has_cv_uint32_t)

AC_MSG_CHECKING(for uint16_t)
AC_CACHE_VAL(has_cv_uint16_t,
[AC_TRY_RUN([
#if defined __BEOS__ && !defined __HAIKU__
#include <inttypes.h>
#endif
#include <sys/types.h>
uint16_t foo;
int main() {return 0;}
],
has_cv_uint16_t=yes,
has_cv_uint16_t=no,
has_cv_uint16_t=no
)])
AC_MSG_RESULT($has_cv_uint16_t)

AC_MSG_CHECKING(for u_int32_t)
AC_CACHE_VAL(has_cv_u_int32_t,
[AC_TRY_RUN([
#if defined __BEOS__ && !defined __HAIKU__
#include <inttypes.h>
#endif
#include <sys/types.h>
u_int32_t foo;
int main() {return 0;}
],
has_cv_u_int32_t=yes,
has_cv_u_int32_t=no,
has_cv_u_int32_t=no
)])
AC_MSG_RESULT($has_cv_u_int32_t)

AC_MSG_CHECKING(for u_int16_t)
AC_CACHE_VAL(has_cv_u_int16_t,
[AC_TRY_RUN([
#if defined __BEOS__ && !defined __HAIKU__
#include <inttypes.h>
#endif
#include <sys/types.h>
u_int16_t foo;
int main() {return 0;}
],
has_cv_u_int16_t=yes,
has_cv_u_int16_t=no,
has_cv_u_int16_t=no
)])
AC_MSG_RESULT($has_cv_u_int16_t)

AC_MSG_CHECKING(for int64_t)
AC_CACHE_VAL(has_cv_int64_t,
[AC_TRY_RUN([
#if defined __BEOS__ && !defined __HAIKU__
#include <inttypes.h>
#endif
#include <sys/types.h>
int64_t foo;
int main() {return 0;}
],
has_cv_int64_t=yes,
has_cv_int64_t=no,
has_cv_int64_t=no
)])
AC_MSG_RESULT($has_cv_int64_t)

AC_CHECK_SIZEOF(short,2)
AC_CHECK_SIZEOF(int,4)
AC_CHECK_SIZEOF(long,4)
AC_CHECK_SIZEOF(long long,8)


if test x$has_cv_int16_t = "xyes" ; then
        SIZE16="int16_t"
else
        case 2 in
                $ac_cv_sizeof_short) SIZE16="short";;
                $ac_cv_sizeof_int) SIZE16="int";;
        esac
fi

if test x$has_cv_int32_t = "xyes" ; then
        SIZE32="int32_t"
else
        case 4 in
                $ac_cv_sizeof_short) SIZE32="short";;
                $ac_cv_sizeof_int) SIZE32="int";;
                $ac_cv_sizeof_long) SIZE32="long";;
        esac
fi

if test x$has_cv_uint32_t = "xyes" ; then
        USIZE32="uint32_t"
else
        if test x$has_cv_u_int32_t = "xyes" ; then
                USIZE32="u_int32_t"
        else
                case 4 in
                        $ac_cv_sizeof_short) USIZE32="unsigned short";;
                        $ac_cv_sizeof_int) USIZE32="unsigned int";;
                        $ac_cv_sizeof_long) USIZE32="unsigned long";;
                esac
        fi
fi

if test x$has_cv_uint16_t = "xyes" ; then
        USIZE16="uint16_t"
else
        if test x$has_cv_u_int16_t = "xyes" ; then
                USIZE16="u_int16_t"
        else
                case 2 in
                        $ac_cv_sizeof_short) USIZE16="unsigned short";;
                        $ac_cv_sizeof_int) USIZE16="unsigned int";;
                        $ac_cv_sizeof_long) USIZE16="unsigned long";;
                esac
        fi
fi

if test x$has_cv_int64_t = "xyes" ; then
        SIZE64="int64_t"
else
case 8 in
        $ac_cv_sizeof_int) SIZE64="int";;
        $ac_cv_sizeof_long) SIZE64="long";;
        $ac_cv_sizeof_long_long) SIZE64="long long";;
esac
fi

if test -z "$SIZE16"; then
        AC_MSG_ERROR(No 16 bit type found on this platform!)
fi
if test -z "$USIZE16"; then
        AC_MSG_ERROR(No unsigned 16 bit type found on this platform!)
fi
if test -z "$SIZE32"; then
        AC_MSG_ERROR(No 32 bit type found on this platform!)
fi
if test -z "$USIZE32"; then
        AC_MSG_ERROR(No unsigned 32 bit type found on this platform!)
fi
if test -z "$SIZE64"; then
        AC_MSG_WARN(No 64 bit type found on this platform!)
fi

dnl Checks for library functions.
AC_FUNC_MEMCMP

dnl Make substitutions

AC_SUBST(LIBTOOL_DEPS)
AC_SUBST(SIZE16)
AC_SUBST(USIZE16)
AC_SUBST(SIZE32)
AC_SUBST(USIZE32)
AC_SUBST(SIZE64)
AC_SUBST(OPT)
AC_SUBST(LIBS)
AC_SUBST(DEBUG)
AC_SUBST(CFLAGS)
AC_SUBST(PROFILE)

AC_OUTPUT([
Makefile
src/Makefile
doc/Makefile doc/libogg/Makefile
include/Makefile include/ogg/Makefile include/ogg/config_types.h
libogg.spec
ogg.pc
ogg-uninstalled.pc
])
