# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

# This file is part of avahi.
#
# avahi is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# avahi 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 Lesser General Public
# License along with avahi; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA.

AC_PREREQ(2.63)
AC_INIT([avahi],[0.6.31],[avahi (at) lists (dot) freedesktop (dot) org])
AC_CONFIG_SRCDIR([avahi-core/server.c])
AC_CONFIG_MACRO_DIR([common])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign 1.11 -Wall -Wno-portability silent-rules tar-pax])

AC_SUBST(PACKAGE_URL, [http://avahi.org/])

AC_SUBST(LIBAVAHI_COMMON_VERSION_INFO, [8:3:5])
AC_SUBST(LIBAVAHI_CORE_VERSION_INFO, [7:2:0])
AC_SUBST(LIBAVAHI_CLIENT_VERSION_INFO, [5:9:2])
AC_SUBST(LIBAVAHI_GLIB_VERSION_INFO, [1:2:0])
AC_SUBST(LIBAVAHI_GOBJECT_VERSION_INFO, [0:4:0])
AC_SUBST(LIBAVAHI_QT3_VERSION_INFO, [1:2:0])
AC_SUBST(LIBAVAHI_QT4_VERSION_INFO, [1:2:0])
AC_SUBST(LIBAVAHI_UI_VERSION_INFO, [1:4:1])

# Do not touch these, since they we took this version-info from upstream HOWL/Bonjour
AC_SUBST(LIBAVAHI_COMPAT_LIBDNS_SD_VERSION_INFO, [1:0:0])
AC_SUBST(LIBAVAHI_COMPAT_HOWL_VERSION_INFO, [0:0:0])
AC_SUBST(HOWL_COMPAT_VERSION, [0.9.8])

AC_CANONICAL_HOST

AM_SILENT_RULES([yes])

AC_CHECK_PROG([STOW], [stow], [yes], [no])

AS_IF([test "x$STOW" = "xyes" && test -d /usr/local/stow], [
        AC_MSG_NOTICE([*** Found /usr/local/stow: default install prefix set to /usr/local/stow/${PACKAGE_NAME}-${PACKAGE_VERSION} ***])
        ac_default_prefix="/usr/local/stow/${PACKAGE_NAME}-${PACKAGE_VERSION}"
])

# Checks for programs.
AC_PROG_CC
AC_PROG_CC_C99
AC_PROG_CXX
AM_PROG_CC_C_O
AC_USE_SYSTEM_EXTENSIONS
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_GCC_TRADITIONAL

# -fstack-protector
AC_ARG_ENABLE([stack-protector],
    [AS_HELP_STRING([--disable-stack-protector],
        [Disable GCC's/libc's stack-smashing protection])],
    [case "${enableval}" in
         yes) enable_ssp=yes ;;
          no) enable_ssp=no ;;
           *) AC_MSG_ERROR([invalid value ${enableval} for --disable-stack-protector]) ;;
     esac],
    [enable_ssp=yes])

if test x"$enable_ssp" = x"yes" && test x"$GCC" != x"yes"; then
    AC_MSG_NOTICE([Disabling stack-smashing protection because compiler is not GCC])
    enable_ssp=no
fi

if test x"$enable_ssp" = x"yes"; then
    # Check for broken ssp in libc: http://www.avahi.org/ticket/105
    # libc's brokenness will get in the way regardless of whether -lssp is
    # provided, but provide it anyway (otherwise non-libc ssp would wrongly
    # break here)

    # Get -lssp if it exists
    GCC_STACK_PROTECT_LIB

    AC_MSG_CHECKING([whether stack-smashing protection is available])
    ssp_old_cflags="$CFLAGS"
    ssp_old_ldflags="$LDFLAGS"
    CFLAGS="$CFLAGS -Werror -fstack-protector-all -fPIC"
    LDFLAGS="$LDFLAGS -Wl,-z,defs"
    cat confdefs.h > conftest.c
    cat >>conftest.c <<_ACEOF
void test_broken_ssp(c)
    const char *c;
{
    char arr[[123]], *p; /* beware of possible double-braces if copying this */
    for (p = arr; *c; ++p) {
        *p = *c;
        ++c;
    }
}
_ACEOF
    rm -f conftest.o

    if $CC -c $CFLAGS $CPPFLAGS -o conftest.o conftest.c >/dev/null 2>&1; then
        AC_MSG_RESULT([yes])
        AC_MSG_CHECKING([whether stack-smashing protection is buggy])
        if $CC -o conftest.so $LDFLAGS -shared conftest.o $LIBS >/dev/null 2>&1; then
            AC_MSG_RESULT([no])
        else
            AC_MSG_RESULT([yes])
            enable_ssp=no
        fi
    else
        AC_MSG_RESULT([no])
    fi

    rm -f conftest.c conftest.o conftest.so

    CFLAGS="$ssp_old_cflags"
    LDFLAGS="$ssp_old_ldflags"
fi

if test x"$enable_ssp" = x"yes"; then
    # Do this the long way so we don't call GCC_STACK_PROTECT_LIB twice
    GCC_STACK_PROTECT_CC

    AC_LANG_PUSH([C++])
    GCC_STACK_PROTECT_CXX
    AC_LANG_POP([C++])
    # XXX: Update the enable_ssp value now for output later?
fi

# libtool stuff
AC_PROG_LIBTOOL

AC_CACHE_CHECK([whether the C++ compiler works], [avahi_cv_sys_cxx_works], [
    AC_LANG_PUSH([C++])
    AC_COMPILE_IFELSE([int main() { return 0; }], [avahi_cv_sys_cxx_works=yes],
        [avahi_cv_sys_cxx_works=no])
    AC_LANG_POP([C++])
    ])
[ if [ "x$avahi_cv_sys_cxx_works" = "xno" ]; then ]
    AC_MSG_FAILURE([The C++ compiler does not work])
[ fi ]

ACX_PTHREAD(,AC_MSG_ERROR([Missing POSIX Threads support]))

#
# Check for netlink.h
#
AC_CHECK_HEADER(linux/netlink.h,
HAVE_NETLINK=yes
AC_DEFINE([HAVE_NETLINK],[],[Support for Linux netlink])
, [], [
#include <sys/socket.h>
#include <asm/types.h>
])

AM_CONDITIONAL(HAVE_NETLINK, [ test x"$HAVE_NETLINK" = xyes ])

#
# Check for net/route.h
#
AC_CHECK_HEADER(net/route.h,
HAVE_PF_ROUTE=yes
AC_DEFINE([HAVE_PF_ROUTE],[],[Support for PF_ROUTE])
, [], [
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if_dl.h>
])

AM_CONDITIONAL(HAVE_PF_ROUTE, [ test x"$HAVE_PF_ROUTE" = xyes ])

#
# Check for sys/filio.h; needed for FIONREAD on Solaris
#
AC_CHECK_HEADER(sys/filio.h,
HAVE_SYS_FILIO_H=yes
AC_DEFINE([HAVE_SYS_FILIO_H],[],[Support for sys/filio.h])
, [], [
])

AM_CONDITIONAL(HAVE_SYS_FILIO_H, [ test x"$HAVE_SYS_FILIO_H" = xyes ])

#
# Check for sys/sysctl.h; not present on Solaris
#
AC_CHECK_HEADER(sys/sysctl.h,
HAVE_SYS_SYSCTL=yes
AC_DEFINE([HAVE_SYS_SYSCTL_H],[],[Support for sys/sysctl.h])
, [], [
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/param.h>
])

AM_CONDITIONAL(HAVE_SYS_SYSCTL_H, [ test x"$HAVE_SYS_SYSCTL_H" = xyes ])

#
# Check for lifconf struct; only present on Solaris
#
AC_MSG_CHECKING(for struct lifconf)
AC_CACHE_VAL(avahi_cv_has_struct_lifconf,
[AC_TRY_COMPILE(
[#include <sys/socket.h>
#include <net/if.h>
],[sizeof (struct lifconf);],
avahi_cv_has_struct_lifconf=yes,avahi_cv_has_struct_lifconf=no)])
AC_MSG_RESULT($avahi_cv_has_struct_lifconf)
if test $avahi_cv_has_struct_lifconf = yes; then
    AC_DEFINE(HAVE_STRUCT_LIFCONF,1,[Define if there is a struct lifconf.])
fi

#
# Check for struct ip_mreqn
#
AC_MSG_CHECKING(for struct ip_mreqn)
AC_TRY_COMPILE([#include <netinet/in.h>], [
	struct ip_mreqn mreq;
	mreq.imr_address.s_addr = 0;
], [
	# Yes, we have it...
	AC_MSG_RESULT(yes)
	AC_DEFINE([HAVE_STRUCT_IP_MREQN],[],[Support for struct ip_mreqn])
], [
	# We'll just have to try and use struct ip_mreq
	AC_MSG_RESULT(no)
	AC_MSG_CHECKING(for struct ip_mreq)
	AC_TRY_COMPILE([#include <netinet/in.h>], [
		struct ip_mreq mreq;
		mreq.imr_interface.s_addr = 0;
	], [
		# Yes, we have it...
		AC_MSG_RESULT(yes)
		AC_DEFINE([HAVE_STRUCT_IP_MREQ],[],[Support for struct ip_mreq])
	], [
		# No multicast support
			AC_MSG_RESULT(no)
	])
])

#
# Detecting the linux distribution for specific things like init scripts.
#
AC_ARG_WITH(distro, AS_HELP_STRING([--with-distro=DISTRO],[Specify the distribution to target: One of lfs, debian, gentoo, archlinux, fedora, mandriva, darwin, netbsd, freebsd, slackware or none]))
if test "z$with_distro" = "z"; then
    if test "$cross_compiling" = yes; then
        AC_MSG_WARN([Target distribution cannot be reliably detected when cross-compiling. You should specify it with --with-distro (see $0 --help for recognized distros)])
    else
        AC_CHECK_FILE(/etc/lfs-release,with_distro="lfs")
        AC_CHECK_FILE(/etc/SuSE-release,with_distro="suse")
        AC_CHECK_FILE(/etc/gentoo-release,with_distro="gentoo")
        AC_CHECK_FILE(/etc/arch-release,with_distro="archlinux")
        AC_CHECK_FILE(/etc/debian_version,with_distro="debian")
        AC_CHECK_FILE(/etc/redhat-release,with_distro="fedora")
        AC_CHECK_FILE(/etc/mandriva-release,with_distro="mandriva")
        AC_CHECK_FILE(/etc/slackware-version,with_distro="slackware")
    fi
    if test "z$with_distro" = "z"; then
        with_distro=`uname -s`
    fi
fi
with_distro=`echo ${with_distro} | tr '[[:upper:]]' '[[:lower:]]' `

case $with_distro in
    lfs|debian|gentoo|archlinux|suse|fedora|mandriva|darwin|freebsd|slackware|none)
     ;;
    netbsd)
     AC_MSG_WARN([Your distribution (${with_distro}) is supported but no init script exist yet! (patches welcome)])
     ;;
    linux)
     AC_MSG_ERROR([Linux distribution autodetection failed, you must specify the distribution to target using --with-distro=DISTRO, set DISTRO to none if your distribution is not supported.])
     ;;
    *)
     AC_MSG_ERROR([Your distribution (${with_distro}) is not yet supported, init scripts and D-Bus configuration will not be installed! (patches welcome), you can specify --with-distro=none to skip this check])
     ;;
esac

AM_CONDITIONAL(TARGET_LFS, test x"$with_distro" = xlfs)
AM_CONDITIONAL(TARGET_SUSE, test x"$with_distro" = xsuse)
AM_CONDITIONAL(TARGET_GENTOO, test x"$with_distro" = xgentoo)
AM_CONDITIONAL(TARGET_DEBIAN, test x"$with_distro" = xdebian)
AM_CONDITIONAL(TARGET_ARCHLINUX, test x"$with_distro" = xarchlinux)
AM_CONDITIONAL(TARGET_FEDORA, test x"$with_distro" = xfedora)
AM_CONDITIONAL(TARGET_MANDRIVA, test x"$with_distro" = xmandriva)
AM_CONDITIONAL(TARGET_DARWIN, test x"$with_distro" = xdarwin)
AM_CONDITIONAL(TARGET_NETBSD, test x"$with_distro" = xnetbsd)
AM_CONDITIONAL(TARGET_FREEBSD, test x"$with_distro" = xfreebsd)
AM_CONDITIONAL(TARGET_SLACKWARE, test x"$with_distro" = xslackware)

test_gcc_flag() {
    AC_LANG_CONFTEST([int main() {}])
    $CC -c conftest.c $CFLAGS $@ > /dev/null 2> /dev/null
    ret=$?
    rm -f conftest.o
    return $ret
}

# If using GCC specify some additional parameters
if test "x$GCC" = "xyes" ; then

    DESIRED_FLAGS="-Wall -W -Wextra -pedantic -pipe -Wformat -Wold-style-definition -Wdeclaration-after-statement -Wfloat-equal -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wendif-labels -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -fdiagnostics-show-option -Wno-cast-qual -fno-strict-aliasing"

    if test "x$HAVE_NETLINK" = "xyes" ; then
        # Test whether rtnetlink.h can be included when compiled with -std=c99
        # some distributions (e.g. archlinux) have broken headers that dont
        # define __u64 with -std=c99
        AC_MSG_CHECKING([checking whether rtnetlink.h can be included with -std=c99])
        OLDCFLAGS="$CFLAGS"
        CFLAGS="-std=c99"
        AC_TRY_COMPILE([#include <linux/rtnetlink.h>], [],
            use_stdc99=yes, use_stdc99=no)

        if test x"$use_stdc99" = xyes; then
            DESIRED_FLAGS="-std=c99 $DESIRED_FLAGS"
            AC_MSG_RESULT([yes])
        else
            AC_MSG_RESULT([no])
        fi

        CFLAGS="$OLDCFLAGS"
    else
        DESIRED_FLAGS="-std=c99 $DESIRED_FLAGS"
    fi

    for flag in $DESIRED_FLAGS ; do
        AC_MSG_CHECKING([whether $CC accepts $flag])
        if test_gcc_flag $flag ; then
           CFLAGS="$CFLAGS $flag"
           AC_MSG_RESULT([yes])
        else
           AC_MSG_RESULT([no])
        fi
    done
fi

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h limits.h netinet/in.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h unistd.h netdb.h syslog.h])
AC_HEADER_STDBOOL

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_HEADER_SYS_WAIT

 # Solaris stuff
 AC_SEARCH_LIBS([inet_ntop],[nsl])
 AC_SEARCH_LIBS([recv],[socket])
 AC_CHECK_DECL([CMSG_SPACE],,CFLAGS="$CFLAGS -D_XOPEN_SOURCE=500 -D__EXTENSIONS__", [[#include <sys/socket.h>]])

# Checks for library functions.
AC_FUNC_MEMCMP
AC_FUNC_SELECT_ARGTYPES
# avahi_malloc actually returns NULL for avahi_malloc(0), so it does not matter
# whether libc's malloc does too. (Same for realloc.)
#AC_FUNC_MALLOC
#AC_FUNC_REALLOC
AC_CHECK_FUNCS([gethostname memchr memmove memset mkdir select socket strchr strcspn strdup strerror strrchr strspn strstr uname setresuid setreuid setresgid setregid strcasecmp gettimeofday putenv strncasecmp strlcpy gethostbyname seteuid setegid setproctitle getprogname])

AC_FUNC_CHOWN
AC_FUNC_STAT
AC_TYPE_MODE_T
AC_TYPE_PID_T

AC_CHECK_DECLS(environ)

# check if gcc's -fvisibility is supported
CHECK_VISIBILITY_HIDDEN

enable_chroot=yes
AC_CHECK_HEADERS([sys/capability.h],,enable_chroot=no)
AC_CHECK_HEADERS([sys/prctl.h],,enable_chroot=no)
AC_CHECK_FUNCS([chroot],,enable_chroot=no)

AM_CONDITIONAL(ENABLE_CHROOT, test "x$enable_chroot" = "xyes")

if test "x$enable_chroot" = "xyes" ; then
   AC_DEFINE([ENABLE_CHROOT], 1, [Enable chroot() usage])
fi

AC_CHECK_LIB(dl, dlopen, [ AC_CHECK_HEADERS(dlfcn.h, HAVE_DLOPEN=yes, HAVE_DLOPEN=no) ], HAVE_DLOPEN=no)
if test "x$HAVE_DLOPEN" = "xyes" ; then
    AC_DEFINE([HAVE_DLOPEN],1,[Have dlopen()])
fi
AM_CONDITIONAL(HAVE_DLOPEN, test "x$HAVE_DLOPEN" = "xyes")

have_inotify=no
AC_CHECK_HEADERS([sys/inotify.h], [have_inotify=yes])

AM_CONDITIONAL(HAVE_INOTIFY, test "x$have_inotify" = "xyes")

if test "x$have_inotify" = "xyes" ; then
   AC_DEFINE([HAVE_INOTIFY], 1, [Enable Linux inotify() usage])
fi

have_kqueue=yes
AC_CHECK_FUNCS([kqueue],,have_kqueue=no)

AM_CONDITIONAL(HAVE_KQUEUE, test "x$have_kqueue" = "xyes")

if test "x$have_kqueue" = "xyes" ; then
    AC_DEFINE([HAVE_KQUEUE], 1, [Enable BSD kqueue() usage])
fi

IT_PROG_INTLTOOL([0.35.0])
GETTEXT_PACKAGE=avahi
AC_SUBST([GETTEXT_PACKAGE])
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE],["$GETTEXT_PACKAGE"],[Gettext package])
AM_GLIB_GNU_GETTEXT

avahilocaledir='${prefix}/${DATADIRNAME}/locale'
AC_SUBST(avahilocaledir)

# Check for pkg-config manually first, as if its not installed the
# PKG_PROG_PKG_CONFIG macro won't be defined.
AC_CHECK_PROG(have_pkg_config, pkg-config, yes, no)

if test x"$have_pkg_config" = "xno"; then
    AC_MSG_ERROR(pkg-config is required to install this program)
fi

PKG_PROG_PKG_CONFIG

#
# Check for GLIB 2.0
#
AC_ARG_ENABLE(glib,
        AS_HELP_STRING([--disable-glib],[Disable use of GLib]),
        [case "${enableval}" in
                yes) HAVE_GLIB=yes ;;
                no)  HAVE_GLIB=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-glib) ;;
        esac],
        [HAVE_GLIB=yes])

if test "x$HAVE_GLIB" = "xyes" ; then
        PKG_CHECK_MODULES(GLIB20, [ glib-2.0 >= 2.4.0 ])
        AC_SUBST(GLIB20_CFLAGS)
        AC_SUBST(GLIB20_LIBS)
fi
AM_CONDITIONAL(HAVE_GLIB, test "x$HAVE_GLIB" = "xyes")

#
# Check for GLIB's gobject 2.0
#
AC_ARG_ENABLE(gobject,
        AS_HELP_STRING([--disable-gobject],[Disable use of GLib GObject]),
        [case "${enableval}" in
                yes) HAVE_GOBJECT=yes ;;
                no)  HAVE_GOBJECT=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-gobject) ;;
        esac],
        [HAVE_GOBJECT=yes])

if test "x$HAVE_GOBJECT" = "xyes" ; then
        PKG_CHECK_MODULES(GOBJECT, [ glib-2.0 >= 2.4.0 gobject-2.0 ])
        AC_SUBST(GOBJECT_CFLAGS)
        AC_SUBST(GOBJECT_LIBS)
fi
AM_CONDITIONAL(HAVE_GOBJECT, test "x$HAVE_GOBJECT" = "xyes")

#
# Introspection support.
#
GOBJECT_INTROSPECTION_CHECK([0.9.5])

#
# Check for Qt 3
#
AC_ARG_ENABLE(qt3,
        AS_HELP_STRING([--disable-qt3],[Disable building of Qt3 mainloop integration]),
        [case "${enableval}" in
                yes) HAVE_QT3=yes ;;
                no)  HAVE_QT3=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-qt3) ;;
        esac],
        [HAVE_QT3=yes])

if test "x$HAVE_QT3" = "xyes" ; then
        PKG_CHECK_MODULES( QT3, [ qt-mt >= 3.0.0 ])
        AC_SUBST(QT3_CFLAGS)
        AC_SUBST(QT3_LIBS)
	    QT3_PREFIX="`$PKG_CONFIG --variable=prefix qt-mt`/bin"
        AC_PATH_PROGS(MOC_QT3, [moc-qt3 moc], no, [$QT3_PREFIX])
        if test "$MOC_QT3" = no; then
            AC_MSG_ERROR([Could not find QT3 moc])
        fi
        AC_SUBST(MOC_QT3)
fi
AM_CONDITIONAL(HAVE_QT3, test "x$HAVE_QT3" = "xyes")

#
# Check for Qt 4
#
AC_ARG_ENABLE(qt4,
        AS_HELP_STRING([--disable-qt4],[Disable building of Qt4Core mainloop integration]),
        [case "${enableval}" in
                yes) HAVE_QT4=yes ;;
                no)  HAVE_QT4=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-qt4) ;;
        esac],
        [HAVE_QT4=yes])

if test "x$HAVE_QT4" = "xyes" ; then
        PKG_CHECK_MODULES( QT4, [ QtCore >= 4.0.0 ])
        AC_SUBST(QT4_CFLAGS)
        AC_SUBST(QT4_LIBS)
	    QT4_PREFIX="`$PKG_CONFIG --variable=prefix QtCore`/bin"
        AC_PATH_PROGS(MOC_QT4, [moc-qt4 moc], no, [$QT4_PREFIX])
        if test "$MOC_QT4" = no; then
            AC_MSG_ERROR([Could not find QT4 moc])
        fi
        AC_SUBST(MOC_QT4)
fi
AM_CONDITIONAL(HAVE_QT4, test "x$HAVE_QT4" = "xyes")

#
# Check for GTK+ 2.0
#
AC_ARG_ENABLE(gtk,
        AS_HELP_STRING([--disable-gtk],[Disable use of GTK+ 2]),
        [case "${enableval}" in
                yes) HAVE_GTK=yes ;;
                no)  HAVE_GTK=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-gtk) ;;
        esac],
        [HAVE_GTK=yes])

if test "x$HAVE_GTK" = "xyes" ; then
        # Check for GTK 2.0
        PKG_CHECK_MODULES(GTK20, [ gtk+-2.0 >= 2.14.0 ])
        AC_SUBST(GTK20_CFLAGS)
        AC_SUBST(GTK20_LIBS)
fi
AM_CONDITIONAL(HAVE_GTK, test "x$HAVE_GTK" = "xyes")

#
# Check for GTK+ 3.0
#
AC_ARG_ENABLE(gtk3,
        AS_HELP_STRING([--disable-gtk3],[Disable use of GTK+ 3]),
        [case "${enableval}" in
                yes) HAVE_GTK3=yes ;;
                no)  HAVE_GTK3=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-gtk3) ;;
        esac],
        [HAVE_GTK3=yes])

if test "x$HAVE_GTK3" = "xyes" ; then
        # Check for GTK 3.0
        PKG_CHECK_MODULES(GTK30, [ gtk+-3.0 ])
        AC_SUBST(GTK30_CFLAGS)
        AC_SUBST(GTK30_LIBS)
fi
AM_CONDITIONAL(HAVE_GTK3, test "x$HAVE_GTK3" = "xyes")

AM_CONDITIONAL(HAVE_GTK2OR3, test "x$HAVE_GTK3" = "xyes" -o "x$HAVE_GTK" = "xyes" )

#
# D-Bus
#
AC_ARG_ENABLE(dbus,
        AS_HELP_STRING([--disable-dbus],[Disable use of D-Bus]),
        [case "${enableval}" in
                yes) HAVE_DBUS=yes ;;
                no)  HAVE_DBUS=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-dbus) ;;
        esac],
        [HAVE_DBUS=yes])

AC_ARG_WITH(dbus-sys, AS_HELP_STRING([--with-dbus-sys=<dir>], [Path to D-Bus system.d directory]))
AC_ARG_WITH(dbus-system-socket, AS_HELP_STRING([--with-dbus-system-address=<address>], [Path to the D-Bus system socket, you probably want to put unix:path= at the start. Only needed for very old D-Bus releases]))

DBUS_VERSION="Disabled"
DBUS_SYS_DIR="Disabled"
DBUS_SYSTEM_BUS_DEFAULT_ADDRESS="Disabled"
if test "x$HAVE_DBUS" = "xyes" ; then
    PKG_CHECK_MODULES(DBUS, [ dbus-1 >= 0.34 ])

    AC_DEFINE(HAVE_DBUS, 1, [Whether we have D-Bus or not])

    DBUS_VERSION=`$PKG_CONFIG dbus-1 --modversion`
    DBUS_VERSION_MAJOR=`echo $DBUS_VERSION | awk -F. '{print $1}'`
    DBUS_VERSION_MINOR=`echo $DBUS_VERSION | awk -F. '{print $2}'`
    DBUS_VERSION_MICRO=`echo $DBUS_VERSION | awk -F. '{print $3}'`
    if test "z$DBUS_VERSION_MAJOR" = "z"; then
        DBUS_VERSION_MAJOR="0"
    fi
    if test "z$DBUS_VERSION_MINOR" = "z"; then
        DBUS_VERSION_MINOR="0"
    fi
    if test "z$DBUS_VERSION_MICRO" = "z"; then
        DBUS_VERSION_MICRO="0"
    fi

    if test "z$DBUS_VERSION_MAJOR" = "z0" -a "z$DBUS_VERSION_MINOR" = "z0" -a "z$DBUS_VERSION_MICRO" = "z0"; then
        echo "Error: Couldn't determine the version of your D-Bus package."
        echo "  This is probably an error in this script, please report it"
        echo "  along with the following information:"
        echo "      Base D-Buss version ='$DBUS_VERSION'"
        echo "      DBUS_VERSION_MAJOR='$DBUS_VERSION_MAJOR'"
        echo "      DBUS_VERSION_MINOR='$DBUS_VERSION_MINOR'"
        echo "      DBUS_VERSION_MICRO='$DBUS_VERSION_MICRO'"
        exit 1
    else
        echo "Your D-Bus version is $DBUS_VERSION_MAJOR,$DBUS_VERSION_MINOR,$DBUS_VERSION_MICRO."
        DBUS_CFLAGS="$DBUS_CFLAGS -DDBUS_VERSION_MAJOR=$DBUS_VERSION_MAJOR"
        DBUS_CFLAGS="$DBUS_CFLAGS -DDBUS_VERSION_MINOR=$DBUS_VERSION_MINOR"
        DBUS_CFLAGS="$DBUS_CFLAGS -DDBUS_VERSION_MICRO=$DBUS_VERSION_MICRO"
    fi

    DBUS_CFLAGS="$DBUS_CFLAGS -DDBUS_API_SUBJECT_TO_CHANGE"
    AC_SUBST(DBUS_CFLAGS)
    AC_SUBST(DBUS_LIBS)

    if ! test -z "$with_dbus_sys" ; then
        DBUS_SYS_DIR="$with_dbus_sys"
    else
        DBUS_SYS_DIR="${sysconfdir}/dbus-1/system.d"
    fi
    AC_SUBST(DBUS_SYS_DIR)

    if ! test -z "$with_dbus_system_address" ; then
        DBUS_SYSTEM_BUS_DEFAULT_ADDRESS="$with_dbus_system_address"
    else
        # This is ugly, but D-Bus doesn't export this address for us
        # so we have to guess, pretty much all setups i've seen have
        # it in /var/lib/dbus or /var/run/dbus, and its defaulted to
        # /var/run upstream so we will try guess first then default
        # to /var/run/dbus.

        DBUS_SYSTEM_BUS_DEFAULT_ADDRESS="unix:path=/var/run/dbus/system_bus_socket"
        TRY_SOCKETS="/var/lib/dbus/system_bus_socket /var/run/dbus/system_bus_socket ${localstatedir}/run/dbus/system_bus_socket ${prefix}/var/run/dbus/system_bus_socket"
        for sock in $TRY_SOCKETS; do
            if test -S $sock; then
                DBUS_SYSTEM_BUS_DEFAULT_ADDRESS="unix:path=$sock"
            fi
        done
    fi
    AC_SUBST(DBUS_SYSTEM_BUS_DEFAULT_ADDRESS)

    SAVED_LIBS="$LIBS"
    LIBS="$LIBS $DBUS_LIBS"
    AC_CHECK_FUNCS([dbus_connection_close dbus_bus_get_private])
    LIBS="$SAVED_LIBS"
fi
AM_CONDITIONAL(HAVE_DBUS, test "x$HAVE_DBUS" = "xyes")

#
# Expat
#
AC_ARG_WITH(xml, AS_HELP_STRING([--with-xml=[expat/bsdxml/none]],[XML library to use]))
use_expat=false
use_bsdxml=false

# See what we have
AC_CHECK_LIB(expat, XML_ParserCreate, [ AC_CHECK_HEADERS(expat.h, have_expat=true, have_expat=false) ], have_expat=false)
AC_CHECK_LIB(bsdxml, XML_ParserCreate, [ AC_CHECK_HEADERS(bsdxml.h, have_bsdxml=true, have_bsdxml=false) ], have_bsdxml=false)

if test "x$with_xml" = "xnone"; then
        :
elif test "x$with_xml" = "xexpat"; then
	use_expat=true
	if ! $have_expat ; then
		AC_MSG_ERROR([*** libexpat requested, but not found ***])
	fi
elif test "x$with_xml" = "xbsdxml"; then
	use_bsdxml=true
	if ! $have_bsdxml ; then
		AC_MSG_ERROR([*** libbsdxml requested, but not found ***])
	fi
elif test "x$with_xml" != "x"; then
	AC_MSG_ERROR([*** unknown with-xml option ***])
else
	if $have_expat ; then
		use_expat=true
	elif $have_bsdxml ; then
		use_bsdxml=true
	else
		AC_MSG_ERROR([*** neither libexpat not libbsdxml could be found ***])
	fi
fi

if $use_expat; then
	with_xml=expat
	XML_CFLAGS=-DUSE_EXPAT_H
	XML_LIBS=-lexpat
fi
if $use_bsdxml; then
	with_xml=bsdxml
	XML_CFLAGS=-DUSE_BSDXML_H
	XML_LIBS=-lbsdxml
fi
AC_SUBST(XML_LIBS)
AC_SUBST(XML_CFLAGS)

if $use_expat || $use_bsdxml; then
	HAVE_XML=yes
fi

AM_CONDITIONAL(HAVE_XML, test "x$HAVE_XML" = "xyes")

#
# GDBM
#
#
# Check for dbm
#
AC_ARG_ENABLE(dbm,
        AS_HELP_STRING([--enable-dbm],[Enable use of DBM]),
        [case "${enableval}" in
                yes) HAVE_DBM=yes ;;
                no)  HAVE_DBM=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-dbm) ;;
        esac],
        [HAVE_DBM=no])

AC_ARG_ENABLE(gdbm,
        AS_HELP_STRING([--disable-gdbm],[Disable use of GDBM]),
        [case "${enableval}" in
                yes) HAVE_GDBM=yes ;;
                no)  HAVE_GDBM=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --disable-gdbm) ;;
        esac],
        [HAVE_GDBM=yes])

if test "x$HAVE_GDBM" = "xyes" ; then
    if test "x$HAVE_DBM" = "xyes" ; then
        AC_MSG_ERROR([*** --enable-gdbm and --enable-dbm both specified ***])
    fi
    AC_CHECK_LIB(gdbm, gdbm_open, [ AC_CHECK_HEADERS(gdbm.h, have_gdbm=true, have_gdbm=false) ], have_gdbm=false)

    if ! $have_gdbm ; then
        AC_MSG_ERROR([*** libgdbm not found ***])
    fi
    AC_DEFINE([HAVE_GDBM],[],[Support for GDBM])
else
    if test "x$HAVE_DBM" = "xyes" ; then
        AC_CHECK_HEADERS(ndbm.h, have_dbm=true, have_dbm=false)

        if ! $have_dbm ; then
            AC_MSG_ERROR([*** dbm not found ***])
        fi
        AC_DEFINE([HAVE_DBM],[],[Support for DBM])
    fi
fi
AM_CONDITIONAL(HAVE_GDBM, test "x$HAVE_GDBM" = "xyes")
AM_CONDITIONAL(HAVE_DBM, test "x$HAVE_DBM" = "xyes")

#
# libdaemon
#
AC_ARG_ENABLE(libdaemon,
        AS_HELP_STRING([--disable-libdaemon],[Disable use of libdaemon]),
        [case "${enableval}" in
                yes) HAVE_LIBDAEMON=yes ;;
                no)  HAVE_LIBDAEMON=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-libdaemon) ;;
        esac],
        [HAVE_LIBDAEMON=yes])

if test "x$HAVE_LIBDAEMON" = "xyes" ; then
    PKG_CHECK_MODULES(LIBDAEMON, [ libdaemon >= 0.14 ])
    AC_SUBST(LIBDAEMON_CFLAGS)
    AC_SUBST(LIBDAEMON_LIBS)
fi
AM_CONDITIONAL(HAVE_LIBDAEMON, test "x$HAVE_LIBDAEMON" = "xyes")

#
# Python stuff
#
AC_ARG_ENABLE(python,
    AS_HELP_STRING([--disable-python], [Disable scripts that depends on python]),
    [case "${enableval}" in
          yes) HAVE_PYTHON=yes ;;
          no)  HAVE_PYTHON=no ;;
          *) AC_MSG_ERROR([bad value ${enableval} for --enable-python]) ;;
    esac],[HAVE_PYTHON=yes])

HAVE_PYTHON_DBUS=no
HAVE_PYGTK=no

if test "x$HAVE_PYTHON" = "xyes" ; then
    AM_PATH_PYTHON([2.4])

    AC_ARG_ENABLE(pygtk,
        AS_HELP_STRING([--disable-pygtk],[Disable use of GTK in Python]),
        [case "${enableval}" in
                yes) HAVE_PYGTK=yes ;;
                no)  HAVE_PYGTK=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-pygtk) ;;
        esac],
        [HAVE_PYGTK=yes])

    if test "x$HAVE_PYGTK" = "xyes" ; then
        AM_CHECK_PYMOD(gtk,,,[AC_MSG_ERROR(Could not find Python module gtk)])
    fi


    if test "x$HAVE_DBUS" = "xyes" ; then
        AC_ARG_ENABLE(python-dbus,
	    AS_HELP_STRING([--disable-python-dbus],[Disable use of D-Bus in Python]),
            [case "${enableval}" in
                   yes) HAVE_PYTHON_DBUS=yes ;;
                   no)  HAVE_PYTHON_DBUS=no ;;
                   *) AC_MSG_ERROR(bad value ${enableval} for --enable-python-dbus) ;;
            esac],
            [HAVE_PYTHON_DBUS=yes])

        if test "x$HAVE_PYTHON_DBUS" = "xyes"; then
            AM_CHECK_PYMOD(dbus,,,[AC_MSG_ERROR(Could not find Python module dbus)])
        fi

        AM_CHECK_PYMOD(socket,,,[AC_MSG_ERROR(Could not find Python module socket)])
        if test "x$HAVE_GDBM" = "xyes"; then
            AM_CHECK_PYMOD(gdbm,,,[AC_MSG_ERROR(Could not find Python module gdbm)])
        fi
        if test "x$HAVE_DBM" = "xyes"; then
            AM_CHECK_PYMOD(dbm,,,[AC_MSG_ERROR(Could not find Python module dbm)])
        fi
    fi
fi
AM_CONDITIONAL(HAVE_PYTHON, [test "x$HAVE_PYTHON" = "xyes" ])
AM_CONDITIONAL(HAVE_PYGTK, test "x$HAVE_PYGTK" = "xyes")
AM_CONDITIONAL(HAVE_PYTHON_DBUS, test "x$HAVE_PYTHON_DBUS" = "xyes")

#
# Check for mono stuff
#
HAVE_MONO=no
if test "x$HAVE_DBUS" = "xyes" ; then
    AC_ARG_ENABLE(mono,
            AS_HELP_STRING([--disable-mono],[Disable mono bindings]),
            [case "${enableval}" in
                    yes) HAVE_MONO=yes ;;
                    no)  HAVE_MONO=no ;;
                    *) AC_MSG_ERROR(bad value ${enableval} for --enable-mono) ;;
            esac],
            [HAVE_MONO=yes])

    if test "x$HAVE_MONO" = "xyes" ; then
        AC_PATH_PROG(MCS, mcs)
        if test "x$MCS" = "x" ; then
            AC_MSG_ERROR([Can not find "mcs" - The Mono C-Sharp Compiler) in your PATH])
        fi

        AC_PATH_PROG(GACUTIL, gacutil)
        if test "x$GACUTIL" = "x" ; then
            AC_MSG_ERROR([Can not find "gacutil" in your PATH])
        fi

        AC_SUBST(MCS)
        AC_SUBST(GACUTIL)
    fi
fi
AM_CONDITIONAL(HAVE_MONO, test "x$HAVE_MONO" = "xyes")

#
# Check for monodoc stuff
#
HAVE_MONODOC=no
AC_ARG_ENABLE(monodoc,
        AS_HELP_STRING([--disable-monodoc],[Disable documentation for mono bindings]),
        [case "${enableval}" in
                yes) HAVE_MONODOC=yes ;;
                no)  HAVE_MONODOC=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-monodoc) ;;
        esac],
        [HAVE_MONODOC=yes])

if test "x$HAVE_MONO" = "xyes" && test "x$HAVE_MONODOC" = "xyes" ; then
        PKG_CHECK_MODULES(MONODOC, [monodoc >= 1.1.8])
        MONODOC_DIR=`$PKG_CONFIG --variable=sourcesdir monodoc`

        AC_PATH_PROG(MONODOCER, monodocer)
        AC_PATH_PROG(MDASSEMBLER, mdassembler)

        AC_SUBST(MONODOC_DIR)
        AC_SUBST(MONODOCER)
        AC_SUBST(MDASSEMBLER)
fi
AM_CONDITIONAL(HAVE_MONODOC, test "x$HAVE_MONODOC" = "xyes")

#
# Build autoipd?
#
AC_ARG_ENABLE(autoipd,
        AS_HELP_STRING([--disable-autoipd],[Disable building of avahi-autoipd]),
        [case "${enableval}" in
                yes) ENABLE_AUTOIPD=yes ;;
                no)  ENABLE_AUTOIPD=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --disable-autoipd) ;;
        esac],
        [ENABLE_AUTOIPD=yes])

AM_CONDITIONAL(ENABLE_AUTOIPD, test "x$ENABLE_AUTOIPD" = "xyes")

#
# Defining users and groups
#
AC_ARG_WITH(avahi_user, AS_HELP_STRING([--with-avahi-user=<user>],[User for running avahi-daemon (avahi)]))
if test -z "$with_avahi_user" ; then
    AVAHI_USER=avahi
else
    AVAHI_USER=$with_avahi_user
fi
AC_SUBST(AVAHI_USER)
AC_DEFINE_UNQUOTED(AVAHI_USER,"$AVAHI_USER", [User for running the Avahi daemon])

AC_ARG_WITH(avahi_group,AS_HELP_STRING([--with-avahi-group=<group>],[Group for running avahi-daemon (avahi)]))
if test -z "$with_avahi_group" ; then
    AVAHI_GROUP=avahi
else
    AVAHI_GROUP=$with_avahi_group
fi
AC_SUBST(AVAHI_GROUP)
AC_DEFINE_UNQUOTED(AVAHI_GROUP,"$AVAHI_GROUP", [Group for Avahi])

AC_ARG_WITH(avahi_priv_access_group,AS_HELP_STRING([--with-avahi-priv-access-group=<group>],[Priviliged access group for Avahi clients (netdev)]))
if test -z "$with_avahi_priv_access_group" ; then
    AVAHI_PRIV_ACCESS_GROUP=netdev
else
    AVAHI_PRIV_ACCESS_GROUP=$with_avahi_priv_access_group
fi
AC_SUBST(AVAHI_PRIV_ACCESS_GROUP)
AC_DEFINE_UNQUOTED(AVAHI_PRIV_ACCESS_GROUP,"$AVAHI_PRIV_ACCESS_GROUP", [Privileged access group for Avahi clients])

AC_ARG_WITH(autoipd_user, AS_HELP_STRING([--with-autoipd-user=<user>],[User for running the avahi-autoipd daemon (avahi-autoipd)]))
if test -z "$with_autoipd_user" ; then
    AVAHI_AUTOIPD_USER=avahi-autoipd
else
    AVAHI_AUTOIPD_USER=$with_autoipd_user
fi
AC_SUBST(AVAHI_AUTOIPD_USER)
AC_DEFINE_UNQUOTED(AVAHI_AUTOIPD_USER,"$AVAHI_AUTOIPD_USER", [User for running the avahi-autoipd daemon])

AC_ARG_WITH(autoipd_group,AS_HELP_STRING([--with-autoipd-group=<group>],[Group for running the avahi-autoipd daemon (avahi-autoipd)]))
if test -z "$with_autoipd_group" ; then
    AVAHI_AUTOIPD_GROUP=avahi-autoipd
else
    AVAHI_AUTOIPD_GROUP=$with_autoipd_group
fi
AC_SUBST(AVAHI_AUTOIPD_GROUP)
AC_DEFINE_UNQUOTED(AVAHI_AUTOIPD_GROUP,"$AVAHI_AUTOIPD_GROUP", [Group for running the avahi-autoipd daemon])

#
# Avahi runtime dir
#
avahi_runtime_dir="${localstatedir}/run"
avahi_socket="${avahi_runtime_dir}/avahi-daemon/socket"
AC_SUBST(avahi_runtime_dir)
AC_SUBST(avahi_socket)

#
# Avahi interfaces dir
#
if test "x$HAVE_PYTHON_DBUS" = "xyes" -o "x$HAVE_GTK" = "xyes"; then
	interfacesdir="${datadir}/${PACKAGE}/interfaces/"
	AC_SUBST(interfacesdir)
fi

#
# Doxygen
#
DX_HTML_FEATURE(ON)
DX_CHM_FEATURE(OFF)
DX_CHI_FEATURE(OFF)
DX_MAN_FEATURE(OFF)
DX_RTF_FEATURE(OFF)
DX_XML_FEATURE(ON)
DX_PDF_FEATURE(OFF)
DX_PS_FEATURE(OFF)
DX_INIT_DOXYGEN(avahi, doxygen.cfg, doxygen)

AC_ARG_ENABLE(core-docs,
        AS_HELP_STRING([--enable-core-docs],[Enable building of documentation for avahi-core]),
[case "${enableval}" in
  yes) ENABLE_CORE_DOCS=yes ;;
  no)  ENABLE_CORE_DOCS=no ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-core-docs]) ;;
esac],[ENABLE_CORE_DOCS=no])

AM_CONDITIONAL([ENABLE_CORE_DOCS], [test "x$ENABLE_CORE_DOCS" = xyes])

#
# Build and Install man pages
#
AC_ARG_ENABLE(manpages,
        AS_HELP_STRING([--disable-manpages],[Disable building and installation of man pages]),
[case "${enableval}" in
  yes) manpages=yes ;;
  no)  manpages=no ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --disable-manpages]) ;;
esac],[manpages=yes])

if test x$manpages = xyes ; then
    #
    # XMLTOMAN manpage generation
    #
    AC_ARG_ENABLE(xmltoman,
    AS_HELP_STRING([--disable-xmltoman],[Disable rebuilding of man pages with xmltoman]),
    [case "${enableval}" in
      yes) xmltoman=yes ;;
      no)  xmltoman=no ;;
      *) AC_MSG_ERROR([bad value ${enableval} for --disable-xmltoman]) ;;
    esac],[xmltoman=yes])

    if test x$xmltoman = xyes ; then
        AC_CHECK_PROG(have_xmltoman, xmltoman, yes, no)
    fi

    if test x$have_xmltoman = xno -o x$xmltoman = xno; then
        if ! test -e man/avahi-daemon.8 ; then
            AC_MSG_ERROR([*** xmltoman was not found or was disabled, it is required to build the manpages as they have not been pre-built, install xmltoman, pass --disable-manpages or dont pass --disable-xmltoman])
            exit 1
        fi
        AC_MSG_WARN([*** Not rebuilding man pages as xmltoman is not found ***])
        xmltoman=no
    fi
fi
AM_CONDITIONAL([USE_XMLTOMAN], [test "x$xmltoman" = xyes])
AM_CONDITIONAL([BUILD_MANPAGES], [test "x$manpages" = xyes])

#
# Conditionally compile test and example programs
#
AC_ARG_ENABLE(tests,
        AS_HELP_STRING([--enable-tests],[Enable building of tests and examples]),
        [case "${enableval}" in
                yes) ENABLE_TESTS=yes ;;
                no)  ENABLE_TESTS=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-tests) ;;
        esac],
        [ENABLE_TESTS=no])

AM_CONDITIONAL([ENABLE_TESTS], [test "x$ENABLE_TESTS" = "xyes"])

#
# Optionally enable libdns_sd compatibility support
#
AC_ARG_ENABLE(compat-libdns_sd,
        AS_HELP_STRING([--enable-compat-libdns_sd],[Enable compatibility layer for libdns_sd]),
        [case "${enableval}" in
                yes) ENABLE_COMPAT_LIBDNS_SD=yes ;;
                no)  ENABLE_COMPAT_LIBDNS_SD=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-compat-libdns_sd) ;;
        esac],
        [ENABLE_COMPAT_LIBDNS_SD=no])

AM_CONDITIONAL([ENABLE_COMPAT_LIBDNS_SD], [test "x$ENABLE_COMPAT_LIBDNS_SD" = "xyes"])

#
# Optionally enable HOWL compatibility support
#
AC_ARG_ENABLE(compat-howl,
        AS_HELP_STRING([--enable-compat-howl],[Enable compatibility layer for HOWL]),
        [case "${enableval}" in
                yes) ENABLE_COMPAT_HOWL=yes ;;
                no)  ENABLE_COMPAT_HOWL=no ;;
                *) AC_MSG_ERROR(bad value ${enableval} for --enable-compat-howl) ;;
        esac],
        [ENABLE_COMPAT_HOWL=no])

AM_CONDITIONAL([ENABLE_COMPAT_HOWL], [test "x$ENABLE_COMPAT_HOWL" = "xyes"])

#
# systemd
#
AC_ARG_WITH([systemdsystemunitdir],
        AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
        [],
        [with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)])
if test "x$with_systemdsystemunitdir" != xno; then
        AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
fi
AM_CONDITIONAL(HAVE_SYSTEMD, [test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ])

# ==========================================================================
AC_CONFIG_FILES([
Makefile
avahi-common/Makefile
avahi-core/Makefile
avahi-glib/Makefile
avahi-gobject/Makefile
avahi-qt/Makefile
avahi-daemon/Makefile
avahi-daemon/avahi-dbus.conf
avahi-discover-standalone/Makefile
avahi-client/Makefile
initscript/Makefile
initscript/debian/Makefile
initscript/gentoo/Makefile
initscript/archlinux/Makefile
initscript/suse/Makefile
initscript/fedora/Makefile
initscript/lfs/Makefile
initscript/mandriva/Makefile
initscript/darwin/Makefile
initscript/freebsd/Makefile
initscript/slackware/Makefile
avahi-dnsconfd/Makefile
avahi-utils/Makefile
avahi-python/Makefile
avahi-python/avahi/Makefile
avahi-python/avahi-discover/Makefile
examples/Makefile
common/Makefile
man/Makefile
tests/Makefile
service-type-database/Makefile
avahi-sharp/Makefile
avahi-ui-sharp/Makefile
avahi-compat-libdns_sd/Makefile
avahi-compat-howl/Makefile
avahi-compat-howl/samples/Makefile
avahi-autoipd/Makefile
avahi-ui/Makefile
po/Makefile.in
])
AC_OUTPUT

# ==========================================================================
echo "
 ---{ $PACKAGE_NAME $VERSION }---

    prefix:                                    ${prefix}
    sysconfdir:                                ${sysconfdir}
    localstatedir:                             ${localstatedir}
    avahi socket:                              ${avahi_socket}
    dbus-1 system.d dir:                       ${DBUS_SYS_DIR}
    dbus-1 version:                            ${DBUS_VERSION}
    dbus-1 system socket:                      ${DBUS_SYSTEM_BUS_DEFAULT_ADDRESS}
    C Compiler:                                ${CC}
    CFLAGS:                                    ${CFLAGS}
    Enable GLIB:                               ${HAVE_GLIB}
    Enable GLIB GObject:                       ${HAVE_GOBJECT}
    Enable GObject Introspection:              ${found_introspection}
    Enable GTK 2.0:                            ${HAVE_GTK}
    Enable GTK 3.0:                            ${HAVE_GTK3}
    Enable D-Bus:                              ${HAVE_DBUS}
    With XML:                                  ${with_xml}
    Enable GDBM:                               ${HAVE_GDBM}
    Enable DBM:                                ${HAVE_DBM}
    Enable libdaemon:                          ${HAVE_LIBDAEMON}
    Enable Python:                             ${HAVE_PYTHON}
    Enable pygtk:                              ${HAVE_PYGTK}
    Enable python-dbus:                        ${HAVE_PYTHON_DBUS}
    Enable QT3:                                ${HAVE_QT3}
    Enable QT4:                                ${HAVE_QT4}
    Enable Mono:                               ${HAVE_MONO}
    Enable Monodoc:                            ${HAVE_MONODOC}
    Distribution/OS:                           ${with_distro}
    User for avahi-daemon:                     ${AVAHI_USER}
    Group for avahi-daemon:                    ${AVAHI_GROUP}
    Priviliged access group for Avahi clients: ${AVAHI_PRIV_ACCESS_GROUP}
    User for avahi-autoipd:                    ${AVAHI_AUTOIPD_USER}
    Group for avahi-autoipd:                   ${AVAHI_AUTOIPD_GROUP}
    Enable chroot():                           ${enable_chroot}
    Enable Linux inotify:                      ${have_inotify}
    Enable stack-smashing protection:          ${enable_ssp}
    systemd unit directory:                    ${with_systemdsystemunitdir}
"

BUILD_DAEMON="no   (You need libdaemon and expat/bsdxml!)"

if test "x$HAVE_XML" = "xyes" -a "x$HAVE_LIBDAEMON" = "xyes" ; then
    BUILD_DAEMON=yes
fi

BUILD_PYTHON="no   (You need python, pygtk and python-dbus!)"

if test "x$BUILD_DAEMON" = "xyes" -a "x$HAVE_DBUS" = "xyes" -a "x$HAVE_PYTHON" = "xyes" -a "x$HAVE_PYTHON_DBUS" = "xyes" -a "x$HAVE_PYGTK" = "xyes" ; then
    BUILD_PYTHON=yes
fi

BUILD_CLIENT="no   (You need avahi-daemon and D-Bus!)"

if test "x$BUILD_DAEMON" = "xyes" -a "x$HAVE_DBUS" = "xyes" ; then
    BUILD_CLIENT=yes
fi

if test "x$ENABLE_COMPAT_LIBDNS_SD" = "xyes" -a "x$BUILD_CLIENT" != "xyes" ; then
   ENABLE_COMPAT_LIBDNS_SD="no   (You need libavahi-client!)"
fi
if test "x$ENABLE_COMPAT_HOWL" = "xyes" -a "x$BUILD_CLIENT" != "xyes" ; then
   ENABLE_COMPAT_HOWL="no   (You need libavahi-client!)"
fi
if test "x$ENABLE_AUTOIPD" = "xyes" -a "x$HAVE_LIBDAEMON" != "xyes" ; then
   ENABLE_AUTOIPD="no   (You need libdaemon!)"
fi

HAVE_GTK2OR3=no
if test "x$HAVE_GTK" = "xyes" -o "x$HAVE_GTK3" = "xyes" ; then
   HAVE_GTK2OR3=yes
fi

BUILD_UI="no"
if test "x$HAVE_GTK2OR3" = "xyes" -a "x$BUILD_CLIENT" = "xyes" ; then
   BUILD_UI="yes"
fi

BUILD_GOBJECT="no"
if test "x$BUILD_CLIENT" = "xyes" -a "x$HAVE_GOBJECT" = "xyes" ; then
   BUILD_GOBJECT="yes"
fi

echo "\
    Building libavahi-core              yes
    Building avahi-daemon:              ${BUILD_DAEMON}
    Building avahi-dnsconfd:            ${BUILD_DAEMON}
    Building libavahi-client:           ${BUILD_CLIENT}
    Building avahi-utils:               ${BUILD_CLIENT}
    Building avahi-python:              ${BUILD_PYTHON}
    Building libavahi-glib:             ${HAVE_GLIB}
    Building libavahi-gobject:          ${BUILD_GOBJECT}
    Building avahi-discover-standalone: ${HAVE_GTK2OR3}
    Building libavahi-qt3:              ${HAVE_QT3}
    Building libavahi-qt4:              ${HAVE_QT4}
    Building avahi-sharp:               ${HAVE_MONO}
    Building avahi-compat-libdns_sd:    ${ENABLE_COMPAT_LIBDNS_SD}
    Building avahi-compat-howl:         ${ENABLE_COMPAT_HOWL}
    Building tests:                     ${ENABLE_TESTS}
    Building avahi-core documentation:  ${ENABLE_CORE_DOCS}
    Building avahi-autoipd:             ${ENABLE_AUTOIPD}
    Building libavahi-ui:               ${BUILD_UI}
"
