AC_INIT([zziplib.spec])
AC_PREREQ(2.61)
AC_COPYRIGHT([Guido Draheim <guido@gmx.de> for ZZipLib.SF.net])
AC_REVISION($Revision: 1.15 $)
AC_CONFIG_AUX_DIR([uses])
AC_CONFIG_MACRO_DIR([m4])
# =======================================================================
AC_CANONICAL_SYSTEM
dnl AM_ENABLE_MULTILIB([Makefile],[$host])
dnl AX_ENABLE_BUILDDIR
AC_SET_DEFAULT_PATHS_SYSTEM
# -----------------------------------------------------------------------
AC_ARG_ENABLE([thread-safe],
AS_HELP_STRING([--disable-thread-safe],[disable thread-safe libtool option])
   ,,[ enable_thread_safe="yes"])
THREAD_SAFE=""
test "$enable_thread_safe" = "yes" && THREAD_SAFE="-thread-safe"
test "$enable_thread_safe" = "$host_os" && THREAD_SAFE="-thread-safe"
AC_SUBST(THREAD_SAFE)
if test -n "$THREAD_SAFE" ; then
  AC_MSG_RESULT(...using thread-safe linkage)
else
  AC_MSG_RESULT(disabled thread-safe linkage)
fi
# ----------------------------------------------------------------
AC_MSG_CHECKING(zlib install prefix)
AC_ARG_WITH(zlib, 
AS_HELP_STRING([--with-zlib],[zlib prefix (e.g. '$HOME/software')])
    ,,[with_zlib="no"])
if test "${with_zlib}" = yes ; then # choose --prefix paths
   if test "${prefix}" = NONE ; then
      AC_MSG_RESULT([oops, but only itself...])
      AC_MSG_ERROR(--with-zlib requires a path argument or a --prefix path set)
   fi
   with_zlib="$prefix"
fi

case ".$with_zlib" in
   .no|.no,*)
      AC_MSG_RESULT(none)
      with_zlib="no, not configured" ;;
  ./usr)
      AC_MSG_RESULT([oops, ignored (may try --with-zlib=/usr/.)])
      with_zlib="no, /usr ignored" ;;
  *)  if test ! -d "$with_zlib/include" ; then
         AC_MSG_RESULT([oops, given but...])
         AC_MSG_ERROR("$with_zlib/include" is not a directory)
      fi
      if test ! -d "$with_zlib/lib" ; then
         AC_MSG_RESULT([oops, given but...])
         AC_MSG_ERROR("$with_zlib/lib" is not a directory)
      fi
      AC_MSG_RESULT($with_zlib)
      ZLIB_INCL="-I$with_zlib/include"
      ZLIB_LDIR="-L$with_zlib/lib"
      AC_MSG_RESULT(..adding CPPFLAGS $ZLIB_INCL)
      AC_MSG_RESULT(..adding LDFLAGS  $ZLIB_LDIR)
      CPPFLAGS="$CPPFLAGS $ZLIB_INCL"
      LDFLAGS="$LDFLAGS $ZLIB_LDIR"
  ;;
esac
AC_SUBST(ZLIB_INCL)
AC_SUBST(ZLIB_LDIR)
# -----------------------------------------------------------------------
AX_SPEC_DEFAULTS
AM_INIT_AUTOMAKE($PACKAGE,$VERSION)
AX_CHECK_ENABLE_DEBUG()
dnl test ".$CFLAGS" = "." && CFLAGS=""
AC_PROG_CC
dnl test ".$CFLAGS" = "." && test "$GCC" = "yes" && CFLAGS="-O3"
AC_PROG_INSTALL
AC_LIBTOOL_WIN32_DLL
AM_PROG_LIBTOOL
AX_SET_VERSION_INFO

# -----------------------------------------------------------------------
AC_MSG_RESULT([creating zzip/_msvc.in via zzip/_msvc.sed of config.h.in])
test -d zzip || mkdir zzip
sed -f $srcdir/zzip/_msvc.sed $srcdir/config.h.in >zzip/_msvc.in
AC_CONFIG_HEADERS([config.h])
AX_PREFIX_CONFIG_H([zzip/_config.h],[zzip],[config.h])
AX_PREFIX_CONFIG_H([zzip/_msvc.h],[zzip],[zzip/_msvc.in])
AM_MAINTAINER_MODE

AX_CREATE_PKGCONFIG_INFO(dnl
[zzip/zziplib.pc], [zzip-zlib-config],[-lzzip],,[ ])
# -----------------------------------------------------------------------
AX_PAX_TAR_CREATE
AX_PAX_TAR_EXTRACT
AC_PATH_PROGS(PERL, perl5 perl, echo no perl found for)
AC_PATH_PROGS(PYTHON, python3, echo no python found for)
AC_PATH_PROGS(MKZIP, zip pkzip, :)
AC_PATH_PROGS(XMLTO, xmlto, :)

AC_C_INLINE
AC_C_CONST
ACX_C_RESTRICT
AC_STDC_HEADERS
AC_HEADER_DIRENT
AC_CHECK_HEADERS(ansidecl.h stdint.h unistd.h windows.h winnt.h winbase.h sys/int_types.h)
AC_CHECK_HEADERS(sys/types.h sys/mman.h sys/stat.h sys/param.h) dnl posix'ish
AC_CHECK_HEADERS(io.h direct.h zlib.h byteswap.h)
AC_CHECK_HEADERS(fnmatch.h)
AC_CHECK_FUNCS( strcasecmp strnlen strndup )

AC_TYPE_OFF_T
AC_TYPE_SIZE_T
dnl AC_TYPE_SSIZE_T
AC_CHECK_TYPE(ssize_t,int)
AC_CHECK_TYPE(off64_t,_zzip_off_t)
AC_CHECK_TYPE(__int64,long long)
if test "xno" = "x$ac_cv_header_stdint_h" ; then
  AC_COMPILE_CHECK_SIZEOF([short])
  AC_COMPILE_CHECK_SIZEOF([int])
  AC_COMPILE_CHECK_SIZEOF([long])
  AC_COMPILE_CHECK_SIZEOF([int *])
fi
AC_C_BIGENDIAN
AX_CHECK_ALIGNED_ACCESS_REQUIRED
dnl -------------------------------------------------------------
# the default is _disabled_!! anyway, result is prefixed in zzip/_config.h!!
AC_SYS_LARGEFILE_SENSITIVE
test ".$LARGEFILE_CFLAGS" = "." && LARGEFILE_CFLAGS=""
AC_ARG_WITH(largefile,AC_HELP_STRING(
    [--with-largefile],[compile as off64_t instead of 32bit off_t])
    ,,[with_largefile="no"])
if test ".$ac_cv_sys_largefile_sensitive" = ".no" ; then
  AC_MSG_RESULT(compiles library with the only off_t seen)
elif test ".$with_largefile" != ".no" ; then
  AC_MSG_RESULT(compiles library as 64bit off_t variant dnl
- and renaming some function names)
  LARGEFILE_CFLAGS="$LARGEFILE_CFLAGS -D_LARGEFILE_SOURCE"
  AC_MSG_RESULT(..adding CFLAGS $LARGEFILE_CFLAGS)
  CFLAGS="$CFLAGS $LARGEFILE_CFLAGS"
  AC_MSG_RESULT(..adding 64 into RELEASE_INFO for the libraries)
  RELEASE_INFO="$RELEASE_INFO-64"
else
  AC_MSG_RESULT(compiles library as 32bit off_t variant dnl
- largefile is not the default here)
fi
AC_SUBST(LARGEFILE_CFLAGS)
dnl -------------------------------------------------------------
AC_MSG_CHECKING(for zlib being found)
if test "_$ac_cv_header_zlib_h" != "_yes" ; then
  AC_MSG_RESULT(dnl
...oops: zlib.h not found - try adding some CPPFLAGS to configure call)
         AC_MSG_RESULT(dnl
...note: and when linkage fails you might also need to set some LDFLAGS)
  case "$prefix" in
    NONE|/usr)
            AC_MSG_RESULT(dnl
...note: both can be set by specifying the install prefix of the zlib library)
            AC_MSG_RESULT(dnl
...note: via --with-zlib=path ... it will test for -Ipath/include -Lpath/lib)
    ;;
    *) if test -d $prefix/include ; then
         AC_MSG_RESULT(dnl
...note: -I$prefix/include is not added to CPPFLAGS automatically and)
         AC_MSG_RESULT(dnl
...note: neither is -L$prefix/lib for LDFLAGS .. both will be if you specify)
         AC_MSG_RESULT(dnl
...note: --with-zlib to configure call, or use --with-zlib=installprefix)
       fi
     ;;
  esac
  AC_MSG_ERROR(zlib.h not found: "zlib" is required to build "$PACKAGE")
  exit 1
fi
cat >conftest.c <<EOF
#include <zlib.h>
const char* zlib_VeRsIoN = ZLIB_VERSION "dEtEcT";
EOF
ZLIB_VERSION=`(eval "$ac_cpp conftest.c") 2>/dev/null \
| grep zlib_VeRsIoN | sed -e 's,.*= *.,,' -e 's,. *.dEtEcT.*,,'`
rm conftest.c
AC_SUBST(ZLIB_VERSION)
AC_MSG_RESULT(yes - $ZLIB_VERSION)
# ----------------------------------------------------------------
AC_MSG_CHECKING(docdir default)
AC_ARG_WITH(docdir, AC_HELP_STRING(
    [--with-docdir],[docdir prefix (prefix/share/doc)])
    ,,[with_docdir="no"])
case "${with_docdir}" in
 prefix/*)  docdir=` echo "$withval" | sed 's/^prefix/${prefix}'` ;;
 datadir/*) docdir=` echo "$withval" | sed 's/^datadir/${datadir}'` ;;
 yes) docdir='${prefix}/doc' ;;
 no)  docdir='${datadir}/doc' ;;
 /*|\\*|[a-zA-Z]:*) docdir="$with_docdir"  ;;
 *) AC_MSG_RESULT(oops)
    AC_MSG_ERROR(bad value ${withval} for --with-docdir)
 ;;
esac
AC_SUBST(docdir)
AC_MSG_RESULT($docdir)
# ----------------------------------------------------------------
AC_MSG_CHECKING(whether using debugging messages in libraries)
AC_ARG_WITH(debug, AC_HELP_STRING(
    [--with-debug],[debug messages in library])
    , [case "${withval}" in
		yes|no) with_debug="$withval" ;;
		*) AC_MSG_RESULT(oops)
                   AC_MSG_ERROR(bad value ${withval} for --with-debug) ;;
       esac], [with_debug="no"])
test "$with_debug" != "yes" && with_debug="no" # yes or no
test "$with_debug" = "yes" && export CFLAGS="$CFLAGS -DDEBUG"
result="$with_debug" ; test "$result" = "yes" && result="yes, added -DDEBUG"
AC_MSG_RESULT($result)
if test "$with_debug" = "yes" ; then if test -n "$RELEASE_INFO" ; then
   RELEASE_INFO="$RELEASE_INFO-dbg"
   AC_MSG_RESULT(modified release, $RELEASE_INFO)
fi fi
# ----------------------------------------------------------------
AC_MSG_CHECKING(whether thread stack is too small for bufsiz buffers)
 # many embedded platforms, superthreaded systems and kernel usage
 # will severely limit the stackspace for its threads. Use _LOWSTK
 # compile-define on those platforms.
AC_ARG_WITH(lowstk, AC_HELP_STRING(
    [--with-lowstk], [limited thread stack])
    , [case "${withval}" in
		yes|no|auto) with_lowstk="$withval" ;;
		*) AC_MSG_ERROR(bad value ${withval} for --with-lowstk) ;;
       esac], [with_lowstk="auto"])
if test "$with_lowstk" = "auto"; then
  case $target in
	*-palmos-*) $with_lowstk="yes" ;;
  esac
fi
test "$with_lowstk" != "yes" && with_lowstk="no" # yes or no
test "$with_lowstk" = "yes" && CFLAGS="$CFLAGS -D_LOWSTK"
result="$with_lowstk" ; test "$result" = "yes" && result="yes, added -D_LOWSTK"
AC_MSG_RESULT($with_lowstk)
# ---------------------------------------------------------------
AC_MSG_CHECKING(whether can use mmap for file scanning)
 # system with mmap are probably better performing an searching
 # and parsing - atleast memory consumption is far better
AC_ARG_ENABLE(mmap, AC_HELP_STRING(
   [--disable-mmap],[disable mmap usage])
   , [case "${enableval}" in
		yes|no|auto) enable_mmap="${enableval}" ;;
		*) AC_MSG_RESULT(oops)
                   AC_MSG_ERROR(bad value ${enableval} for --disable-mmap) ;;
      esac], [enable_mmap="auto"])
if test "$enable_mmap" = "auto"
then
    test "$ac_cv_header_winbase_h"  && enable_mmap="yes, winbase.h"
    test "$ac_cv_header_sys_mman_h" && enable_mmap="yes, sys/mman.h"
fi
case "$enable_mmap" in
   yes|yes,*) CFLAGS="$CFLAGS -D_USE_MMAP"
      AC_MSG_RESULT($enable_mmap, added -D_USE_MMAP) ;;
   *) enable_mmap="no"
      AC_MSG_RESULT(no (just a bit slower)) ;;
esac
# ---------------------------------------------------------------
PKG_PROG_PKG_CONFIG
AC_MSG_CHECKING(whether making SDL parts)
SDL=""
SDL_GENERATE=""
AC_ARG_ENABLE(sdl, AC_HELP_STRING(
    [--enable-sdl],[enable SDL usage (if present)])
    ,,[enable_sdl="no"])
if test "$enable_sdl" = "no" ; then
   AC_MSG_RESULT([no, disabled])
else
   enable_sdl1=`$PKG_CONFIG --modversion sdl 2>/dev/null`
   if test -z "$enable_sdl1"; then
      enable_sdl2=`$PKG_CONFIG --modversion sdl2 2>/dev/null`
      if test -z "$enable_sdl2"; then
        enable_sdl3=`sdl-config --version 2>/dev/null`
        SDL_GENERATE="sdl-uninstalled.pc"
        enable_sdl="$enable_sdl3 (sdl-config)"
      else
        enable_sdl="$enable_sdl2 (pkgconfig sdl2)"
      fi
   else
      enable_sdl="$enable_sdl1 (pkgconfig sdl)"
   fi
   enable_sdl="$enable_sdl."
   case ".$enable_sdl" in
     .1.*) AC_MSG_RESULT([yes, using SDL $enable_sdl])
           SDL="SDL" ;;
     .2.*) AC_MSG_RESULT([yes, untested $enable_sdl])
           SDL="SDL" ;;
     *)    AC_MSG_RESULT([no, $enable_sdl]) ;;
   esac
   if test -n "$SDL_GENERATE"; then
      AC_MSG_RESULT([enabled SDL generation of... $SDL_GENERATE])
   fi
fi
AC_SUBST([SDL])
AC_SUBST([SDL_GENERATE])

# ----------------------------------------------------------------
AC_MSG_CHECKING(whether using address sanitizer)
AC_ARG_WITH(asan, AC_HELP_STRING(
    [--with-asan],[compile with adress sanitizer])
    , [case "${withval}" in
		yes|no) with_asan="$withval" ;;
		*) AC_MSG_RESULT(oops)
                   AC_MSG_ERROR(bad value ${withval} for --with-asan) ;;
       esac], [with_asan="no"])
ASAN_LIBS=""
ASAN_CFLAGS=""
if test ".$with_asan" = ".yes" ; then
    ASAN_LIBS="-lasan"
    ASAN_CFLAGS="-fsanitize=address"
fi
AC_MSG_RESULT([$with_asan, $ASAN_CFLAGS])
AC_SUBST([ASAN_LIBS])
AC_SUBST([ASAN_CFLAGS])
# ---------------------------------------------------------------
AC_MSG_CHECKING(running extra tests on make check)
if test "MKZIP" != ":" ; then
  AC_MSG_RESULT(yes)
  ZIPTESTS=""
else
  AC_MSG_RESULT(no)
  ZIPTESTS="#"
fi
AC_SUBST(ZIPTESTS)
# ---------------------------------------------------------------
AC_MSG_CHECKING([link options])
ZZIPLIB_LDFLAGS=""
case "$host_os" in mingw*)
    # we may assume that the backend is gnu-ld but DLLs need full resolution
    ZZIPLIB_LDFLAGS="${wl}-no-undefined ${wl}-export-all-symbols -mconsole"
    RESOLVES=' '
;; darwin*)
    # darwin never uses gnu-ld but the linker can do it anyway
    ZZIPLIB_LDFLAGS="-export-dynamic"
    RESOLVES=" # "
;; *)
    if test ".$can_build_shared" != ".no" ; then
      ZZIPLIB_LDFLAGS="-export-dynamic"
      if test ".$lt_cv_prog_gnu_ld" == ".yes" ; then
         ZZIPLIB_LDFLAGS="${wl}--export-dynamic"
         # TODO: that is for backward compatibility only
      fi
    fi
    RESOLVES=" # "
;; esac
AC_MSG_RESULT([$ZZIPLIB_LDFLAGS $RESOLVES])
AC_SUBST([ZZIPLIB_LDFLAGS])
AC_SUBST([RESOLVES])
AC_ARG_WITH([defines], 
AS_HELP_STRING([--with-defines],[easy,harden,allow_modulo_entries]),
    ,[with_defines="normal"])

#
case ",$with_defines," in *,easy,*)
  AC_MSG_RESULT([..adding CFLAGS -DZZIP_EASY])
  CFLAGS="$CFLAGS -DZZIP_EASY"
;; esac
case ",$with_defines," in *,harden,*)
  AC_MSG_RESULT([..adding CFLAGS -DZZIP_HARDEN])
  CFLAGS="$CFLAGS -DZZIP_HARDEN"
;; esac
case ",$with_defines," in *,allow_modulo_entries,*)
  AC_MSG_RESULT([..adding CFLAGS -DZZIP_ALLOW_MODULO_ENTRIES])
  CFLAGS="$CFLAGS -DZZIP_ALLOW_MODULO_ENTRIES"
;; esac

# ---------------------------------------------------------------
AX_MAINTAINER_MODE_AUTO_SILENT
AX_NOT_ENABLE_FRAME_POINTER
AX_CFLAGS_WARN_ALL
AX_CFLAGS_GCC_OPTION(-Wpointer-arith)
AX_CFLAGS_GCC_OPTION(-Wsign-compare)
AX_CFLAGS_GCC_OPTION(-Wmissing-declarations)
AX_CFLAGS_GCC_OPTION(-Wdeclaration-after-statement)
AX_CFLAGS_GCC_OPTION(-Werror-implicit-function-declaration)
AX_CFLAGS_GCC_OPTION(-Wstrict-aliasing)
AX_CFLAGS_GCC_OPTION(-Warray-bounds)
AX_CFLAGS_NO_WRITABLE_STRINGS
AX_CFLAGS_STRICT_PROTOTYPES
# ---------------------------------------------------------------
AX_ENABLE_DEFAULT_PKGCONFIGDIR
AX_ENABLE_DEFAULT_ACLOCALDIR
AC_SUBST([CONFIG_FILES])
AC_OUTPUT([Makefile
           zzip/Makefile zzipwrap/Makefile SDL/Makefile
           docs/Makefile test/Makefile bins/Makefile])
dnl -------------------------------------------------------------
PATCH_LIBTOOL_ON_DARWIN_ZSH_OVERQUOTING
PATCH_LIBTOOL_SYS_LIB_SEARCH_PATH_SPEC
PATCH_LIBTOOL_TO_ADD_HOST_CC
# ---------------------------------------------------------------
echo '-----' $PACKAGE $VERSION $prefix
$SHELL libtool --features || true
echo "CPPFLAGS=$CPPFLAGS"
echo "CFLAGS=$CFLAGS"
test "$enable_mmap" != "no" && echo "enable  mmap   ($enable_mmap)"
test "$enable_mmap"  = "no" && echo "disable mmap   ($enable_mmap)"
test "$with_lowstk" != "no" && echo "with    lowstk ($with_lowstk)"
test "$with_lowstk"  = "no" && echo "without lowstk ($with_lowstk)"
test "$with_debug"  != "no" && echo "with    debug  ($with_debug)"
test "$with_debug"   = "no" && echo "without debug  ($with_debug)"
# test -f ./zziplib.spec && echo warning - do not build in the source dirs
echo '# make  && make check  && make install'
