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

AC_INIT([libogg],[1.3.5],[ogg-dev@xiph.org])

LT_INIT
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR(src/framing.c)

AM_INIT_AUTOMAKE
AM_MAINTAINER_MODE([enable])

dnl Library versioning

LIB_CURRENT=8
LIB_REVISION=5
LIB_AGE=8
AC_SUBST(LIB_CURRENT)
AC_SUBST(LIB_REVISION)
AC_SUBST(LIB_AGE)

AC_PROG_CC
AM_PROG_CC_C_O

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="-O2 -Wall -ffast-math -fsigned-char"
                PROFILE="-Wall -W -pg -g -O2 -ffast-math -fsigned-char"
		;;
        sparc-sun-*)
                DEBUG="-g -Wall -fsigned-char"
                CFLAGS="-O2 -ffast-math -fsigned-char"
                PROFILE="-pg -g -O2 -fsigned-char"
		;;
	*-*-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="-O2 -fsigned-char"
                PROFILE="-O2 -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
INCLUDE_INTTYPES_H=0
INCLUDE_STDINT_H=0
INCLUDE_SYS_TYPES_H=0
AC_CHECK_HEADER(inttypes.h,INCLUDE_INTTYPES_H=1)
AC_CHECK_HEADER(stdint.h,INCLUDE_STDINT_H=1)
AC_CHECK_HEADER(sys/types.h,INCLUDE_SYS_TYPES_H=1)

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

dnl Check for types

AC_CHECK_SIZEOF(int16_t)
AC_CHECK_SIZEOF(uint16_t)
AC_CHECK_SIZEOF(u_int16_t)
AC_CHECK_SIZEOF(int32_t)
AC_CHECK_SIZEOF(uint32_t)
AC_CHECK_SIZEOF(u_int32_t)
AC_CHECK_SIZEOF(int64_t)
AC_CHECK_SIZEOF(uint64_t)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(long long)

case 2 in
     $ac_cv_sizeof_int16_t) SIZE16="int16_t";;
     $ac_cv_sizeof_short) SIZE16="short";;
     $ac_cv_sizeof_int) SIZE16="int";;
esac

case 2 in
     $ac_cv_sizeof_uint16_t) USIZE16="uint16_t";;
     $ac_cv_sizeof_short) USIZE16="unsigned short";;
     $ac_cv_sizeof_int) USIZE16="unsigned int";;
     $ac_cv_sizeof_u_int16_t) USIZE16="u_int16_t";;
esac

case 4 in
     $ac_cv_sizeof_int32_t) SIZE32="int32_t";;
     $ac_cv_sizeof_short) SIZE32="short";;
     $ac_cv_sizeof_int) SIZE32="int";;
     $ac_cv_sizeof_long) SIZE32="long";;
esac

case 4 in
     $ac_cv_sizeof_uint32_t) USIZE32="uint32_t";;
     $ac_cv_sizeof_short) USIZE32="unsigned short";;
     $ac_cv_sizeof_int) USIZE32="unsigned int";;
     $ac_cv_sizeof_long) USIZE32="unsigned long";;
     $ac_cv_sizeof_u_int32_t) USIZE32="u_int32_t";;
esac

case 8 in
     $ac_cv_sizeof_int64_t) SIZE64="int64_t";;
     $ac_cv_sizeof_int) SIZE64="int";;
     $ac_cv_sizeof_long) SIZE64="long";;
     $ac_cv_sizeof_long_long) SIZE64="long long";;
esac

case 8 in
     $ac_cv_sizeof_uint64_t) USIZE64="uint64_t";;
     $ac_cv_sizeof_unsigned_int) USIZE64="unsigned int";;
     $ac_cv_sizeof_unsigned_long) USIZE64="unsigned long";;
     $ac_cv_sizeof_unsigned_long_long) USIZE64="unsigned long long";;
esac

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
if test -z "$USIZE64"; then
        AC_MSG_WARN(No unsigned 64 bit type found on this platform!)
fi

AC_ARG_ENABLE([crc],
    [AS_HELP_STRING([--disable-crc],
                    [Disable CRC in the demuxer])],,
    [enable_crc=yes])

AM_CONDITIONAL([DISABLE_CRC], [test "$enable_crc" = "no"])

AS_IF([test "$enable_crc" = "no"],[
  AC_DEFINE([DISABLE_CRC], [1], [Do not build with CRC])
])

dnl Checks for library functions.
AC_FUNC_MEMCMP

dnl Make substitutions

AC_SUBST(LIBTOOL_DEPS)
AC_SUBST(INCLUDE_INTTYPES_H)
AC_SUBST(INCLUDE_STDINT_H)
AC_SUBST(INCLUDE_SYS_TYPES_H)
AC_SUBST(SIZE16)
AC_SUBST(USIZE16)
AC_SUBST(SIZE32)
AC_SUBST(USIZE32)
AC_SUBST(SIZE64)
AC_SUBST(USIZE64)
AC_SUBST(OPT)
AC_SUBST(LIBS)
AC_SUBST(DEBUG)
AC_SUBST(CFLAGS)
AC_SUBST(PROFILE)


AC_CONFIG_FILES([
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
])
AC_CONFIG_HEADERS([config.h])

AC_OUTPUT
