dnl Process this file with autoconf to produce a configure script.

AC_INIT
AC_CONFIG_SRCDIR([libmng.h])
AC_PREREQ(2.52)

dnl this call will define PACKAGE and VERSION
dnl please use this as the primary reference for the version number
AM_INIT_AUTOMAKE(libmng, 1.0.9)

dnl pass the version string on the the makefiles
AC_SUBST(PACKAGE)
AC_SUBST(VERSION)

dnl Checks for programs.
AC_PROG_CC
AC_ISC_POSIX
AM_C_PROTOTYPES
if test "x$U" != "x"; then
  AC_MSG_ERROR(Compiler not ANSI compliant)
fi
AM_PROG_LIBTOOL
AC_PROG_INSTALL

dnl support for files >2GB
AC_SYS_LARGEFILE

dnl Check for required header files
AC_HEADER_STDC

dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST

dnl need pow and fabs
AC_CHECK_FUNC(pow, , AC_CHECK_LIB(m, pow, LIBS="$LIBS -lm"))


dnl what functionality we want to add (read, write, display).
dnl all on by default. see libmng_conf.h for full descriptions

dnl not building a standard shared object?
AC_ARG_ENABLE(buildso,
[  --disable-buildso       disable building standard shared object])
if test "x$enable_buildso" != "xno"; then
  AC_DEFINE(MNG_BUILD_SO)
fi

dnl we only support the full mng spec for now (no LC or VLC)
AC_DEFINE(MNG_SUPPORT_FULL)

dnl remove support in library to read images?
AC_ARG_ENABLE(read,
[  --disable-read          remove read support from library])
if test "x$enable_read" != "xno"; then
  AC_DEFINE(MNG_SUPPORT_READ)
fi

dnl remove support in library to write images?
AC_ARG_ENABLE(write,
[  --disable-write         remove write support from library])
if test "x$enable_write" != "xno"; then
  AC_DEFINE(MNG_SUPPORT_WRITE)
fi

dnl remove support in library to display images?
AC_ARG_ENABLE(display,
[  --disable-display       remove display support from library])
if test "x$enable_display" != "xno"; then
  AC_DEFINE(MNG_SUPPORT_DISPLAY)
fi

dnl remove support for 'dynamic' MNG?
AC_ARG_ENABLE(dynamic,
[  --disable-dynamic       remove dynamic MNG support from library])
if test "x$enable_dynamic" != "xno"; then
  AC_DEFINE(MNG_SUPPORT_DYNAMICMNG)
fi

dnl remove support in library to access chunks?
AC_ARG_ENABLE(chunks,
[  --disable-chunks        remove support for chunk access])
if test "x$enable_chunks" != "xno"; then
  AC_DEFINE(MNG_ACCESS_CHUNKS)
fi

dnl disable support for accessing chunks that have been previously read?
AC_ARG_ENABLE(storechunks,
[  --disable-storechunks   remove support for access of previous chunks])
if test "x$enable_storechunks" != "xno"; then
  AC_DEFINE(MNG_STORE_CHUNKS)
fi

dnl enable support for debug tracing callbacks and messages?
AC_ARG_ENABLE(trace,
[  --enable-trace          include support for debug tracing callbacks],[
if test "x$enable_trace" = "xyes"; then
  AC_DEFINE(MNG_SUPPORT_TRACE)
  AC_DEFINE(MNG_TRACE_TELLTALE)
fi
])

dnl verbose error text
dnl this should always be on
AC_DEFINE(MNG_ERROR_TELLTALE)


dnl libz is required.
AC_ARG_WITH(zlib,
[  --with-zlib[=DIR]       use zlib include/library files in DIR],[
  if test -d "$withval"; then
    CPPFLAGS="$CPPFLAGS -I$withval/include"
    LDFLAGS="$LDFLAGS -L$withval/lib"
  fi
])
AC_CHECK_HEADER(zlib.h,
    AC_CHECK_LIB(z, gzread, , AC_MSG_ERROR(zlib library not found)),
    AC_MSG_ERROR(zlib header not found)
)

dnl check for jpeg library
AC_ARG_WITH(jpeg,
[  --with-jpeg[=DIR]       use jpeg include/library files in DIR],
[with_jpeg=$withval],[with_jpeg=_auto])

  if test "x$with_jpeg" != "xno" -a "x$with_jpeg" != "xyes" -a \
	"x$with_jpeg" != "x_auto"; then
    # Save in case test with directory specified fails
    _cppflags=${CPPFLAGS}
    _ldflags=${LDFLAGS}
    _restore=1

    CPPFLAGS="${CPPFLAGS} -I$withval/include"
    LDFLAGS="${LDFLAGS} -L$withval/lib"
  else
    _restore=0
  fi

  if test "x$with_jpeg" != "xno"; then
    AC_CHECK_HEADER(jpeglib.h,
      AC_CHECK_LIB(jpeg, jpeg_read_header, [
	LIBS="$LIBS -ljpeg"
	AC_DEFINE(HAVE_LIBJPEG)
	_restore=0
      ],
    	AC_MSG_WARN(jpeg library not found)),
      AC_MSG_WARN(jpeg header not found)
    )
  fi

  test $_restore -eq 1 && CPPFLAGS=$_cppflags LDFLAGS=$_ldflags

dnl check for lcms library
AC_ARG_WITH(lcms,
[  --with-lcms[=DIR]       use lcms include/library files in DIR],
[with_lcms=$withval],[with_lcms=_auto])

  if test "x$with_lcms" != "xno" -a "x$with_lcms" != "xyes" -a \
	"x$with_lcms" != "x_auto"; then
    # Save in case test with directory specified fails
    _cppflags=$CPPFLAGS
    _ldflags=$LDFLAGS
    _restore=1

    CPPFLAGS="$CPPFLAGS -I$withval/include"
    LDFLAGS="$LDFLAGS -L$withval/lib"
  else
    _restore=0
  fi

  if test "x$with_lcms" != "xno"; then
    AC_CHECK_HEADER(lcms.h, [
      have_lcms=yes
      AC_CHECK_LIB(lcms, cmsCreateRGBProfile, [
        LIBS="$LIBS -llcms"
        AC_DEFINE(HAVE_LIBLCMS)
        dnl for now this implies MNG_INCLUDE_LCMS in the headers:
        AC_DEFINE(MNG_FULL_CMS)
	_restore=0
	have_lcms=yes
      ],[
	have_lcms=no
      ])
    ])
    dnl give feedback only if the user asked specifically for lcms
    if test "x$with_lcms" != "x_auto" -a "x$have_lcms" != "xyes"; then
      AC_MSG_WARN([lcms not found... disabling CMS support])
    fi
  fi

  test $_restore -eq 1 && CPPFLAGS=$_cppflags LDFLAGS=$_ldflags

AC_CONFIG_FILES([Makefile])
AC_OUTPUT
