dnl
dnl autoconf for Pacemaker
dnl
dnl License: GNU General Public License (GPL)

dnl ===============================================
dnl Bootstrap
dnl ===============================================
AC_PREREQ(2.59)

dnl Suggested structure:
dnl     information on the package
dnl     checks for programs
dnl     checks for libraries
dnl     checks for header files
dnl     checks for types
dnl     checks for structures
dnl     checks for compiler characteristics
dnl     checks for library functions
dnl     checks for system services

m4_include([version.m4])
AC_INIT([pacemaker], VERSION_NUMBER, [users@clusterlabs.org],
        [pacemaker], PCMK_URL)
dnl Workaround autoconf < 2.64
if test x"${PACKAGE_URL}" = x""; then
	AC_SUBST([PACKAGE_URL], PCMK_URL)
fi

PCMK_FEATURES=""
HB_PKG=heartbeat

AC_CONFIG_AUX_DIR(.)
AC_CANONICAL_HOST

dnl Where #defines go (e.g. `AC_CHECK_HEADERS' below)
dnl
dnl Internal header: include/config.h
dnl   - Contains ALL defines
dnl   - include/config.h.in is generated automatically by autoheader
dnl   - NOT to be included in any header files except lha_internal.h
dnl     (which is also not to be included in any other header files)
dnl
dnl External header: include/crm_config.h
dnl   - Contains a subset of defines checked here
dnl   - Manually edit include/crm_config.h.in to have configure include
dnl     new defines
dnl   - Should not include HAVE_* defines
dnl   - Safe to include anywhere
AM_CONFIG_HEADER(include/config.h include/crm_config.h)
ALL_LINGUAS="en fr"

dnl Older distros may need: AM_INIT_AUTOMAKE($PACKAGE_NAME, $PACKAGE_VERSION)
dnl tar-ustar:      use (older) POSIX variant of generated tar rather than v7
AM_INIT_AUTOMAKE([foreign tar-ustar])
dnl Versioned attributes implementation is not yet production-ready
AC_DEFINE_UNQUOTED(ENABLE_VERSIONED_ATTRS, 0, Enable versioned attributes)

dnl automake >= 1.11 offers --enable-silent-rules for suppressing the output from
dnl normal compilation.  When a failure occurs, it will then display the full
dnl command line
dnl Wrap in m4_ifdef to avoid breaking on older platforms
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])

dnl Example 2.4. Silent Custom Rule to Generate a File
dnl %-bar.pc: %.pc
dnl	$(AM_V_GEN)$(LN_S) $(notdir $^) $@

CC_IN_CONFIGURE=yes
export CC_IN_CONFIGURE

LDD=ldd
BUILD_ATOMIC_ATTRD=1

dnl ========================================================================
dnl Compiler characteristics
dnl ========================================================================

AC_PROG_CC dnl Can force other with environment variable "CC".
AM_PROG_CC_C_O
AC_PROG_CC_STDC
gl_EARLY
gl_INIT

LT_INIT([dlopen])
LTDL_INIT([convenience])

AC_PROG_YACC
AM_PROG_LEX

AC_C_STRINGIZE
AC_TYPE_SIZE_T
AC_CHECK_SIZEOF(char)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(long long)
AC_STRUCT_TIMEZONE

dnl ===============================================
dnl Helpers
dnl ===============================================
cc_supports_flag() {
         local CFLAGS="-Werror $@"
         AC_MSG_CHECKING(whether $CC supports "$@")
         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])], [RC=0; AC_MSG_RESULT(yes)],[RC=1; AC_MSG_RESULT(no)])
         return $RC
}

try_extract_header_define() {
	  AC_MSG_CHECKING(if $2 in $1 exists)
	  Cfile=$srcdir/extract_define.$2.${$}
	  printf "#include <stdio.h>\n" > ${Cfile}.c
	  printf "#include <%s>\n" $1 >> ${Cfile}.c
	  printf "int main(int argc, char **argv) {\n" >> ${Cfile}.c
	  printf "#ifdef %s\n" $2 >> ${Cfile}.c
	  printf "printf(\"%%s\", %s);\n" $2 >> ${Cfile}.c
	  printf "#endif \n return 0; }\n" >> ${Cfile}.c
	  $CC $CFLAGS ${Cfile}.c -o ${Cfile} 2>/dev/null
	  value=
	  if test -x ${Cfile}; then
	      value=`${Cfile} 2>/dev/null`
	  fi
	  if  test x"${value}" == x""; then
	      value=$3
	      AC_MSG_RESULT(default: $value)
	  else
	      AC_MSG_RESULT($value)
	  fi
	  printf $value
	  rm -rf ${Cfile}.c ${Cfile} ${Cfile}.dSYM ${Cfile}.gcno
	}

extract_header_define() {
	  AC_MSG_CHECKING(for $2 in $1)
	  Cfile=$srcdir/extract_define.$2.${$}
	  printf "#include <stdio.h>\n" > ${Cfile}.c
	  printf "#include <%s>\n" $1 >> ${Cfile}.c
	  printf "int main(int argc, char **argv) { printf(\"%%s\", %s); return 0; }\n" $2 >> ${Cfile}.c
	  $CC $CFLAGS ${Cfile}.c -o ${Cfile}
	  value=`${Cfile}`
	  AC_MSG_RESULT($value)
	  printf $value
	  rm -rf ${Cfile}.c ${Cfile} ${Cfile}.dSYM ${Cfile}.gcno
	}

dnl ===============================================
dnl Configure Options
dnl ===============================================


dnl --enable-* options

AC_ARG_ENABLE([ansi],
    [AS_HELP_STRING([--enable-ansi],
        [force GCC to compile to ANSI standard for older compilers. @<:@no@:>@])],
)

AC_ARG_ENABLE([fatal-warnings],
    [AS_HELP_STRING([--enable-fatal-warnings],
        [enable pedantic and fatal warnings for gcc @<:@yes@:>@])],
)

AC_ARG_ENABLE([quiet],
    [AS_HELP_STRING([--enable-quiet],
        [suppress make output unless there is an error @<:@no@:>@])],
)

AC_ARG_ENABLE([no-stack],
    [AS_HELP_STRING([--enable-no-stack],
        [build only the policy engine and its requirements @<:@no@:>@])],
)

AC_ARG_ENABLE([upstart],
    [AS_HELP_STRING([--enable-upstart],
        [enable support for managing resources via Upstart @<:@try@:>@])],
    [],
    [enable_upstart=try],
)

AC_ARG_ENABLE([systemd],
    [AS_HELP_STRING([--enable-systemd],
        [enable support for managing resources via systemd @<:@try@:>@])],
    [],
    [enable_systemd=try],
)

AC_ARG_ENABLE([hardening],
    [AS_HELP_STRING([--enable-hardening],
        [harden the resulting executables/libraries @<:@try@:>@])],
    [ HARDENING="${enableval}" ],
    [ HARDENING=try ],
)

dnl --with-* options

AC_DEFUN([VERSION_ARG],
    [AC_ARG_WITH([version],
        [AS_HELP_STRING([--with-version=VERSION],
            [override package version @<:@$1@:>@])],
        [ PACKAGE_VERSION="$withval" ])]
)
VERSION_ARG(VERSION_NUMBER)

AC_ARG_WITH(ais,
    [AS_HELP_STRING([--with-ais],
        [support the Corosync messaging and membership layer])],
    [ SUPPORT_CS=$withval ],
    [ SUPPORT_CS=try ],
)

AC_ARG_WITH([corosync],
    [AS_HELP_STRING([--with-corosync],
        [support the Corosync messaging and membership layer])],
    [ SUPPORT_CS=$withval ]
dnl	initialized in AC_ARG_WITH(ais...) already,
dnl	don't reset to try if it was given as --without-ais
)

AC_ARG_WITH(heartbeat,
    [AS_HELP_STRING([--with-heartbeat],
       [support the Heartbeat messaging and membership layer])],
    [ SUPPORT_HEARTBEAT=$withval ],
    [ SUPPORT_HEARTBEAT=try ],
)

AC_ARG_WITH(cman,
    [AS_HELP_STRING([--with-cman],
       [support the consumption of membership and quorum from cman])],
    [ SUPPORT_CMAN=$withval ],
    [ SUPPORT_CMAN=try ],
)

AC_ARG_WITH(cpg,
    [AS_HELP_STRING([--with-cs-quorum],
       [support the consumption of membership and quorum from corosync])],
    [ SUPPORT_CS_QUORUM=$withval ],
    [ SUPPORT_CS_QUORUM=try ],
)

AC_ARG_WITH([nagios],
    [AS_HELP_STRING([--with-nagios],
        [support nagios remote monitoring])],
    [ SUPPORT_NAGIOS=$withval ],
    [ SUPPORT_NAGIOS=try ],
)

AC_ARG_WITH([nagios-plugin-dir],
    [AS_HELP_STRING([--with-nagios-plugin-dir=DIR],
        [directory for nagios plugins @<:@LIBEXECDIR/nagios/plugins@:>@])],
    [ NAGIOS_PLUGIN_DIR="$withval" ]
)

AC_ARG_WITH([nagios-metadata-dir],
    [AS_HELP_STRING([--with-nagios-metadata-dir=DIR],
        [directory for nagios plugins metadata @<:@DATADIR/nagios/plugins-metadata@:>@])],
    [ NAGIOS_METADATA_DIR="$withval" ]
)

AC_ARG_WITH(snmp,
    [AS_HELP_STRING([--with-snmp],
        [support the SNMP protocol])],
    [ SUPPORT_SNMP=$withval ],
    [ SUPPORT_SNMP=try ],
)

AC_ARG_WITH(esmtp,
    [AS_HELP_STRING([--with-esmtp],
        [support the sending mail notifications with the esmtp library])],
    [ SUPPORT_ESMTP=$withval ],
    [ SUPPORT_ESMTP=try ],
)

AC_ARG_WITH([acl],
    [AS_HELP_STRING([--with-acl],
        [support CIB ACL])],
    [ SUPPORT_ACL=$withval ],
    [ SUPPORT_ACL=yes ],
)

AC_ARG_WITH([cibsecrets],
    [AS_HELP_STRING([--with-cibsecrets],
        [support separate file for CIB secrets])],
    [ SUPPORT_CIBSECRETS=$withval ],
    [ SUPPORT_CIBSECRETS=no ],
)

PCMK_GNUTLS_PRIORITIES="NORMAL"
AC_ARG_WITH([gnutls-priorities],
    [AS_HELP_STRING([--with-gnutls-priorities],
        [default GnuTLS cipher priorities @<:@NORMAL@:>@])],
    [ test x"$withval" = x"no" || PCMK_GNUTLS_PRIORITIES="$withval" ]
)

CSPREFIX=""
AC_ARG_WITH(ais-prefix,
    [AS_HELP_STRING([--with-ais-prefix=DIR],
        [prefix used when Corosync was installed @<:@PREFIX@:>@])],
    [ CSPREFIX=$withval ],
    [ CSPREFIX=$prefix ])

INITDIR=""
AC_ARG_WITH([initdir],
    [AS_HELP_STRING([--with-initdir=DIR],
        [directory for init (rc) scripts])],
    [ INITDIR="$withval" ]
)

systemdsystemunitdir="${systemdsystemunitdir-}"
AC_ARG_WITH([systemdsystemunitdir],
    [AS_HELP_STRING([--with-systemdsystemunitdir=DIR],
        [directory for systemd unit files (advanced option: must match what systemd uses)])],
    [ systemdsystemunitdir="$withval" ]
)

SUPPORT_PROFILING=0
AC_ARG_WITH([profiling],
    [AS_HELP_STRING([--with-profiling],
        [disable optimizations for effective profiling])],
    [ SUPPORT_PROFILING=$withval ]
)

AC_ARG_WITH([coverage],
    [AS_HELP_STRING([--with-coverage],
        [disable optimizations for effective profiling])],
    [ SUPPORT_COVERAGE=$withval ]
)

PUBLICAN_BRAND="common"
AC_ARG_WITH([brand],
    [AS_HELP_STRING([--with-brand=brand],
        [brand to use for generated documentation (set empty for no docs) @<:@common@:>@])],
    [ test x"$withval" = x"no" || PUBLICAN_BRAND="$withval" ]
)
AC_SUBST(PUBLICAN_BRAND)

BUG_URL=""
AC_ARG_WITH([bug-url],
    [AS_HELP_STRING([--with-bug-url=DIR],
        [address where users should submit bug reports @<:@https://bugs.clusterlabs.org/enter_bug.cgi?product=Pacemaker@:>@])],
    [ BUG_URL="$withval" ]
)

ASCIIDOC_CLI_TYPE="pcs"
AC_ARG_WITH(doc-cli,
    [AS_HELP_STRING([--with-doc-cli=cli_type],
        [CLI type to use for generated documentation @<:@pcs@:>@])],
    [ ASCIIDOC_CLI_TYPE="$withval" ])
AC_SUBST(ASCIIDOC_CLI_TYPE)

CONFIGDIR=""
AC_ARG_WITH([configdir],
    [AS_HELP_STRING([--with-configdir=DIR],
        [directory for Pacemaker configuration file @<:@SYSCONFDIR/sysconfig@:>@])],
    [ CONFIGDIR="$withval" ]
)

dnl The not-yet-released autoconf 2.70 will have a --runstatedir option.
dnl Until that's available, emulate it with our own --with-runstatedir.
pcmk_runstatedir=""
AC_ARG_WITH([runstatedir],
    [AS_HELP_STRING([--with-runstatedir=DIR],
        [modifiable per-process data @<:@LOCALSTATEDIR/run@:>@ (ignored if --runstatedir is available)])],
    [ pcmk_runstatedir="$withval" ]
)

dnl This defaults to /usr/lib rather than libdir because it's determined by the
dnl OCF project and not pacemaker. Even if a user wants to install pacemaker to
dnl /usr/local or such, the OCF agents will be expected in their usual
dnl location. However, we do give the user the option to override it.
OCF_ROOT_DIR=""
AC_ARG_WITH([ocfdir],
    [AS_HELP_STRING([--with-ocfdir=DIR],
        [OCF resource agent root directory (advanced option: changing this may break other cluster components unless similarly configured) @<:@/usr/lib/ocf@:>@])],
    [ OCF_ROOT_DIR="$withval" ]
)

CRM_DAEMON_USER=""
AC_ARG_WITH([daemon-user],
    [AS_HELP_STRING([--with-daemon-user=USER],
        [user to run unprivileged Pacemaker daemons as (advanced option: changing this may break other cluster components unless similarly configured) @<:@hacluster@:>@])],
    [ CRM_DAEMON_USER="$withval" ]
)

CRM_DAEMON_GROUP=""
AC_ARG_WITH([daemon-group],
    [AS_HELP_STRING([--with-daemon-group=GROUP],
        [group to run unprivileged Pacemaker daemons as (advanced option: changing this may break other cluster components unless similarly configured) @<:@haclient@:>@])],
    [ CRM_DAEMON_GROUP="$withval" ]
)

dnl Options deprecated in 2.0 series

AC_ARG_WITH([pkg-name],
    [AS_HELP_STRING([--with-pkg-name=name],
        [override package name (if you are a packager needing to pretend)])],
    [ PACKAGE_NAME="$withval" ]
)

AC_ARG_WITH([pkgname],
    [AS_HELP_STRING([--with-pkgname=name],
        [name for pkg (typically for Solaris)])],
    [ PKGNAME="$withval" ],
    [ PKGNAME="LXHAhb" ],
)
AC_SUBST(PKGNAME)


dnl ===============================================
dnl General Processing
dnl ===============================================

AC_DEFINE_UNQUOTED(PACEMAKER_VERSION, "$PACKAGE_VERSION",
                   [Current pacemaker version])

PACKAGE_SERIES=`echo $PACKAGE_VERSION | awk -F. '{ print $1"."$2 }'`
AC_SUBST(PACKAGE_SERIES)
AC_SUBST(PACKAGE_VERSION)

AC_SUBST(HB_PKG)

INIT_EXT=""
echo Our Host OS: $host_os/$host


AC_MSG_NOTICE(Sanitizing prefix: ${prefix})
case $prefix in
  NONE)
	prefix=/usr
	dnl Fix default variables - "prefix" variable if not specified
	if test "$localstatedir" = "\${prefix}/var"; then
		localstatedir="/var"
	fi
	if test "$sysconfdir" = "\${prefix}/etc"; then
		sysconfdir="/etc"
	fi
	;;
esac


AC_MSG_NOTICE(Sanitizing exec_prefix: ${exec_prefix})
case $exec_prefix in
  dnl For consistency with Heartbeat, map NONE->$prefix
  NONE)	  exec_prefix=$prefix;;
  prefix) exec_prefix=$prefix;;
esac

AC_MSG_NOTICE(Sanitizing ais_prefix: ${CSPREFIX})
case $CSPREFIX in
  dnl For consistency with Heartbeat, map NONE->$prefix
  NONE)	  CSPREFIX=$prefix;;
  prefix) CSPREFIX=$prefix;;
esac

AC_MSG_NOTICE(Sanitizing INITDIR: ${INITDIR})
case $INITDIR in
  prefix) INITDIR=$prefix;;
  "")
    AC_MSG_CHECKING(which init (rc) directory to use)
      for initdir in /etc/init.d /etc/rc.d/init.d /sbin/init.d	\
	   /usr/local/etc/rc.d /etc/rc.d
      do
        if
          test -d $initdir
        then
          INITDIR=$initdir
          break
        fi
      done
      AC_MSG_RESULT($INITDIR);;
esac
AC_SUBST(INITDIR)

AC_MSG_NOTICE(Sanitizing libdir: ${libdir})
case $libdir in
  dnl For consistency with Heartbeat, map NONE->$prefix
  prefix|NONE)
    AC_MSG_CHECKING(which lib directory to use)
    for aDir in lib64 lib
    do
      trydir="${exec_prefix}/${aDir}"
      if
        test -d ${trydir}
      then
        libdir=${trydir}
        break
      fi
    done
    AC_MSG_RESULT($libdir);
    ;;
esac

dnl Expand autoconf variables so that we don't end up with '${prefix}'
dnl in #defines and python scripts
dnl NOTE: Autoconf deliberately leaves them unexpanded to allow
dnl    make exec_prefix=/foo install
dnl No longer being able to do this seems like no great loss to me...

eval prefix="`eval echo ${prefix}`"
eval exec_prefix="`eval echo ${exec_prefix}`"
eval bindir="`eval echo ${bindir}`"
eval sbindir="`eval echo ${sbindir}`"
eval libexecdir="`eval echo ${libexecdir}`"
eval datadir="`eval echo ${datadir}`"
eval sysconfdir="`eval echo ${sysconfdir}`"
eval sharedstatedir="`eval echo ${sharedstatedir}`"
eval localstatedir="`eval echo ${localstatedir}`"
eval libdir="`eval echo ${libdir}`"
eval includedir="`eval echo ${includedir}`"
eval oldincludedir="`eval echo ${oldincludedir}`"
eval infodir="`eval echo ${infodir}`"
eval mandir="`eval echo ${mandir}`"

dnl Home-grown variables

if [ test "x${runstatedir}" = "x" ]; then
    if [ test "x${pcmk_runstatedir}" = "x" ]; then
        runstatedir="${localstatedir}/run"
    else
        runstatedir="${pcmk_runstatedir}"
    fi
fi
eval runstatedir="$(eval echo ${runstatedir})"
AC_DEFINE_UNQUOTED([PCMK_RUN_DIR], ["$runstatedir"],
		   [Location for modifiable per-process data])
AC_SUBST(runstatedir)

eval INITDIR="${INITDIR}"
eval docdir="`eval echo ${docdir}`"
if test x"${docdir}" = x""; then
   docdir=${datadir}/doc/${PACKAGE}-${VERSION}
   #docdir=${datadir}/doc/packages/${PACKAGE}
fi
AC_SUBST(docdir)
if test x"${CONFIGDIR}" = x""; then
    CONFIGDIR="${sysconfdir}/sysconfig"
fi
AC_SUBST(CONFIGDIR)

if test x"${BUG_URL}" = x""; then
    BUG_URL="https://bugs.clusterlabs.org/enter_bug.cgi?product=Pacemaker"
fi
AC_SUBST(BUG_URL)


if test x"${PCMK_GNUTLS_PRIORITIES}" = x""; then
    AC_MSG_ERROR([Empty string not applicable with --with-gnutls-priorities])
fi
AC_DEFINE_UNQUOTED([PCMK_GNUTLS_PRIORITIES], ["$PCMK_GNUTLS_PRIORITIES"],
                   [GnuTLS cipher priorities])

for j in prefix exec_prefix bindir sbindir libexecdir datadir sysconfdir \
    sharedstatedir localstatedir libdir includedir oldincludedir infodir \
    mandir INITDIR docdir CONFIGDIR
do
  dirname=`eval echo '${'${j}'}'`
  if
    test ! -d "$dirname"
  then
    AC_MSG_WARN([$j directory ($dirname) does not exist!])
  fi
done

us_auth=
AC_CHECK_HEADER([sys/socket.h], [
    AC_CHECK_DECL([SO_PEERCRED], [
        # Linux
        AC_CHECK_TYPE([struct ucred], [
            us_auth=peercred_ucred;
            AC_DEFINE([US_AUTH_PEERCRED_UCRED], [1],
                      [Define if Unix socket auth method is
                       getsockopt(s, SO_PEERCRED, &ucred, ...)])
        ], [
            # OpenBSD
            AC_CHECK_TYPE([struct sockpeercred], [
                us_auth=localpeercred_sockepeercred;
                AC_DEFINE([US_AUTH_PEERCRED_SOCKPEERCRED], [1],
                          [Define if Unix socket auth method is
                           getsockopt(s, SO_PEERCRED, &sockpeercred, ...)])
            ], [], [[#include <sys/socket.h>]])
        ], [[#define _GNU_SOURCE
             #include <sys/socket.h>]])
    ], [], [[#include <sys/socket.h>]])
])

if test -z "${us_auth}"; then
    # FreeBSD
    AC_CHECK_DECL([getpeereid], [
        us_auth=getpeereid;
        AC_DEFINE([US_AUTH_GETPEEREID], [1],
                  [Define if Unix socket auth method is
                   getpeereid(s, &uid, &gid)])
    ], [
        # Solaris/OpenIndiana
        AC_CHECK_DECL([getpeerucred], [
            us_auth=getpeerucred;
            AC_DEFINE([US_AUTH_GETPEERUCRED], [1],
                      [Define if Unix socket auth method is
                       getpeercred(s, &ucred)])
        ], [
            AC_MSG_ERROR([No way to authenticate a Unix socket peer])
        ], [[#include <ucred.h>]])
    ])
fi

dnl This OS-based decision-making is poor autotools practice;
dnl feature-based mechanisms are strongly preferred.
dnl
dnl So keep this section to a bare minimum; regard as a "necessary evil".

case "$host_os" in
*bsd*)
		AC_DEFINE_UNQUOTED(ON_BSD, 1, Compiling for BSD platform)
		LIBS="-L/usr/local/lib"
		CPPFLAGS="$CPPFLAGS -I/usr/local/include"
		INIT_EXT=".sh"
		;;
*solaris*)
		AC_DEFINE_UNQUOTED(ON_SOLARIS, 1, Compiling for Solaris platform)
		;;
*linux*)
		AC_DEFINE_UNQUOTED(ON_LINUX, 1, Compiling for Linux platform)
 		;;
darwin*)
		AC_DEFINE_UNQUOTED(ON_DARWIN, 1, Compiling for Darwin platform)
  		LIBS="$LIBS -L${prefix}/lib"
  		CFLAGS="$CFLAGS -I${prefix}/include"
		;;
esac

dnl Eventually remove this
if test "$cross_compiling" != "yes"; then
   CPPFLAGS="$CPPFLAGS -I${prefix}/include/heartbeat"
fi

AC_SUBST(INIT_EXT)
AC_MSG_NOTICE(Host CPU: $host_cpu)

case "$host_cpu" in
  ppc64|powerpc64)
    case $CFLAGS in
     *powerpc64*)			;;
     *)	if test "$GCC" = yes; then
	  CFLAGS="$CFLAGS -m64"
	fi				;;
    esac
esac

AC_MSG_CHECKING(which format is needed to print uint64_t)

ac_save_CFLAGS=$CFLAGS
CFLAGS="-Wall -Werror"

AC_COMPILE_IFELSE(
    [AC_LANG_PROGRAM(
      [
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
      ],
      [
int max = 512;
uint64_t bignum = 42;
char *buffer = malloc(max);
const char *random = "random";
snprintf(buffer, max-1, "<quorum id=%lu quorate=%s/>", bignum, random);
fprintf(stderr, "Result: %s\n", buffer);
      ]
    )],
    [U64T="%lu"],
    [U64T="%llu"]
)
CFLAGS=$ac_save_CFLAGS

AC_MSG_RESULT($U64T)
AC_DEFINE_UNQUOTED(U64T, "$U64T", Correct printf format for logging uint64_t)

dnl ===============================================
dnl Program Paths
dnl ===============================================

PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin"
export PATH


dnl Replacing AC_PROG_LIBTOOL with AC_CHECK_PROG because LIBTOOL
dnl was NOT being expanded all the time thus causing things to fail.
AC_CHECK_PROGS(LIBTOOL, glibtool libtool libtool15 libtool13)

AM_PATH_PYTHON
AC_CHECK_PROGS(MAKE, gmake make)
AC_PATH_PROGS(HTML2TXT, lynx w3m)
AC_PATH_PROGS(HELP2MAN, help2man)
AC_PATH_PROGS(POD2MAN, pod2man, pod2man)
AC_PATH_PROGS([ASCIIDOC_CONV], [asciidoc asciidoctor])
AC_PATH_PROGS(PUBLICAN, publican)
AC_PATH_PROGS(INKSCAPE, inkscape)
AC_PATH_PROGS(XSLTPROC, xsltproc)
AC_PATH_PROGS(XMLCATALOG, xmlcatalog)
AC_PATH_PROGS(FOP, fop)
AC_PATH_PROGS(SSH, ssh, /usr/bin/ssh)
AC_PATH_PROGS(SCP, scp, /usr/bin/scp)
AC_PATH_PROGS(TAR, tar)
AC_PATH_PROGS(MD5, md5)
AC_PATH_PROGS(TEST, test)
PKG_PROG_PKG_CONFIG
AC_PATH_PROGS(XML2CONFIG, xml2-config)
AC_PATH_PROGS(VALGRIND_BIN, valgrind, /usr/bin/valgrind)
AC_DEFINE_UNQUOTED(VALGRIND_BIN, "$VALGRIND_BIN", Valgrind command)

dnl Disable these until we decide if the stonith config file should be supported
dnl AC_PATH_PROGS(BISON, bison)
dnl AC_PATH_PROGS(FLEX, flex)
dnl AC_PATH_PROGS(HAVE_YACC, $YACC)

if test x"${LIBTOOL}" = x""; then
   AC_MSG_ERROR(You need (g)libtool installed in order to build ${PACKAGE})
fi
if test x"${MAKE}" = x""; then
   AC_MSG_ERROR(You need (g)make installed in order to build ${PACKAGE})
fi

AM_CONDITIONAL(BUILD_HELP, test x"${HELP2MAN}" != x"")
if test x"${HELP2MAN}" != x""; then
   PCMK_FEATURES="$PCMK_FEATURES generated-manpages"
fi

MANPAGE_XSLT=""
if test x"${XSLTPROC}" != x""; then
  AC_MSG_CHECKING(docbook to manpage transform)
  # first try to figure out correct template using xmlcatalog query,
  # resort to extensive (semi-deterministic) file search if that fails
  DOCBOOK_XSL_URI='http://docbook.sourceforge.net/release/xsl/current'
  DOCBOOK_XSL_PATH='manpages/docbook.xsl'
  MANPAGE_XSLT=$(${XMLCATALOG} "" ${DOCBOOK_XSL_URI}/${DOCBOOK_XSL_PATH} \
                 | sed -n 's|^file://||p;q')
  if test x"${MANPAGE_XSLT}" = x""; then
    DIRS=$(find "${datadir}" -name $(basename $(dirname ${DOCBOOK_XSL_PATH})) \
           -type d | LC_ALL=C sort)
    XSLT=$(basename ${DOCBOOK_XSL_PATH})
    for d in ${DIRS}; do
      if test -f "${d}/${XSLT}"; then
         MANPAGE_XSLT="${d}/${XSLT}"
         break
      fi
    done
  fi
fi
AC_MSG_RESULT($MANPAGE_XSLT)
AC_SUBST(MANPAGE_XSLT)

AM_CONDITIONAL(BUILD_XML_HELP, test x"${MANPAGE_XSLT}" != x"")
if test x"${MANPAGE_XSLT}" != x""; then
   PCMK_FEATURES="$PCMK_FEATURES agent-manpages"
fi

AM_CONDITIONAL([IS_ASCIIDOC], [echo "${ASCIIDOC_CONV}" | grep -Eq 'asciidoc$'])
AM_CONDITIONAL([BUILD_ASCIIDOC], [test "x${ASCIIDOC_CONV}" != x])
if test "x${ASCIIDOC_CONV}" != x; then
   PCMK_FEATURES="$PCMK_FEATURES ascii-docs"
fi

SUPPORT_STONITH_CONFIG=0
if test x"${HAVE_YACC}" != x"" -a x"${FLEX}" != x"" -a x"${BISON}" != x""; then
   SUPPORT_STONITH_CONFIG=1
   PCMK_FEATURES="$PCMK_FEATURES st-conf"
fi

AM_CONDITIONAL(BUILD_STONITH_CONFIG, test $SUPPORT_STONITH_CONFIG = 1)
AC_DEFINE_UNQUOTED(SUPPORT_STONITH_CONFIG, $SUPPORT_STONITH_CONFIG, Support a stand-alone stonith config file in addition to the CIB)

publican_intree_brand=no
if test x"${PUBLICAN_BRAND}" != x"" \
   && test x"${PUBLICAN}" != x"" \
   && test x"${INKSCAPE}" != x""; then
   dnl special handling for clusterlabs brand (possibly in-tree version used)
   test "${PUBLICAN_BRAND}" != "clusterlabs" \
      || test -d /usr/share/publican/Common_Content/clusterlabs
   if test $? -ne 0; then
      dnl Unknown option: brand_dir vs. Option brand_dir requires an argument
      if ${PUBLICAN} build --brand_dir 2>&1 | grep -Eq 'brand_dir$'; then
         AC_MSG_WARN([Cannot use in-tree clusterlabs brand, resorting to common])
         PUBLICAN_BRAND=common
      else
         publican_intree_brand=yes
      fi
   fi
   AC_MSG_NOTICE([Enabling Publican-generated documentation using ${PUBLICAN_BRAND} brand])
   PCMK_FEATURES="$PCMK_FEATURES publican-docs"
fi
AM_CONDITIONAL([BUILD_DOCBOOK],
               [test x"${PUBLICAN_BRAND}" != x"" \
                && test x"${PUBLICAN}" != x"" \
                && test x"${INKSCAPE}" != x""])
AM_CONDITIONAL([PUBLICAN_INTREE_BRAND],
               [test x"${publican_intree_brand}" = x"yes"])

dnl ========================================================================
dnl checks for library functions to replace them
dnl
dnl     NoSuchFunctionName:
dnl             is a dummy function which no system supplies.  It is here to make
dnl             the system compile semi-correctly on OpenBSD which doesn't know
dnl             how to create an empty archive
dnl
dnl     scandir: Only on BSD.
dnl             System-V systems may have it, but hidden and/or deprecated.
dnl             A replacement function is supplied for it.
dnl
dnl     setenv: is some bsdish function that should also be avoided (use
dnl             putenv instead)
dnl             On the other hand, putenv doesn't provide the right API for the
dnl             code and has memory leaks designed in (sigh...)  Fortunately this
dnl             A replacement function is supplied for it.
dnl
dnl     strerror: returns a string that corresponds to an errno.
dnl             A replacement function is supplied for it.
dnl
dnl	strnlen: is a gnu function similar to strlen, but safer.
dnl		We wrote a tolearably-fast replacement function for it.
dnl
dnl	strndup: is a gnu function similar to strdup, but safer.
dnl		We wrote a tolearably-fast replacement function for it.

AC_REPLACE_FUNCS(alphasort NoSuchFunctionName scandir setenv strerror strchrnul unsetenv strnlen strndup)

dnl ===============================================
dnl Libraries
dnl ===============================================
AC_CHECK_LIB(socket, socket)			dnl -lsocket
AC_CHECK_LIB(c, dlopen)				dnl if dlopen is in libc...
AC_CHECK_LIB(dl, dlopen)			dnl -ldl (for Linux)
AC_CHECK_LIB(rt, sched_getscheduler)            dnl -lrt (for Tru64)
AC_CHECK_LIB(gnugetopt, getopt_long)		dnl -lgnugetopt ( if available )
AC_CHECK_LIB(pam, pam_start)			dnl -lpam (if available)

AC_CHECK_FUNCS([sched_setscheduler])

AC_CHECK_LIB(uuid, uuid_parse)			dnl load the library if necessary
AC_CHECK_FUNCS(uuid_unparse)			dnl OSX ships uuid_* as standard functions

AC_CHECK_HEADERS(uuid/uuid.h)

if test "x$ac_cv_func_uuid_unparse" != xyes; then
   AC_MSG_ERROR(You do not have the libuuid development package installed)
fi

if test x"${PKG_CONFIG}" = x""; then
   AC_MSG_ERROR(You need pkgconfig installed in order to build ${PACKAGE})
fi

if
   $PKG_CONFIG --exists glib-2.0
then
	GLIBCONFIG="$PKG_CONFIG glib-2.0"
else
	set -x
        echo PKG_CONFIG_PATH=$PKG_CONFIG_PATH
	$PKG_CONFIG --exists glib-2.0; echo $?
	$PKG_CONFIG --cflags glib-2.0; echo $?
	$PKG_CONFIG glib-2.0; echo $?
	set +x

	AC_MSG_ERROR(You need glib2-devel installed in order to build ${PACKAGE})
fi
AC_MSG_RESULT(using $GLIBCONFIG)

#
#	Where is dlopen?
#
if test "$ac_cv_lib_c_dlopen" = yes; then
	LIBADD_DL=""
elif test "$ac_cv_lib_dl_dlopen" = yes; then
	LIBADD_DL=-ldl
else
        LIBADD_DL=${lt_cv_dlopen_libs}
fi

if test "X$GLIBCONFIG" != X; then
	AC_MSG_CHECKING(for special glib includes: )
	GLIBHEAD=`$GLIBCONFIG --cflags`
	AC_MSG_RESULT($GLIBHEAD)
	CPPFLAGS="$CPPFLAGS $GLIBHEAD"

	AC_MSG_CHECKING(for glib library flags)
	GLIBLIB=`$GLIBCONFIG --libs`
	AC_MSG_RESULT($GLIBLIB)
	LIBS="$LIBS $GLIBLIB"
fi

dnl FreeBSD needs -lcompat for ftime() used by lrmd.c
AC_CHECK_LIB([compat], [ftime], [COMPAT_LIBS='-lcompat'])
AC_SUBST(COMPAT_LIBS)

dnl ========================================================================
dnl Headers
dnl ========================================================================

AC_HEADER_STDC
AC_CHECK_HEADERS(arpa/inet.h)
AC_CHECK_HEADERS(asm/types.h)
AC_CHECK_HEADERS(assert.h)
AC_CHECK_HEADERS(auth-client.h)
AC_CHECK_HEADERS(ctype.h)
AC_CHECK_HEADERS(dirent.h)
AC_CHECK_HEADERS(errno.h)
AC_CHECK_HEADERS(fcntl.h)
AC_CHECK_HEADERS(getopt.h)
AC_CHECK_HEADERS(glib.h)
AC_CHECK_HEADERS(grp.h)
AC_CHECK_HEADERS(limits.h)
AC_CHECK_HEADERS(linux/errqueue.h)
AC_CHECK_HEADERS(linux/swab.h)
AC_CHECK_HEADERS(malloc.h)
AC_CHECK_HEADERS(netdb.h)
AC_CHECK_HEADERS(netinet/in.h)
AC_CHECK_HEADERS(netinet/ip.h)
AC_CHECK_HEADERS(pam/pam_appl.h)
AC_CHECK_HEADERS(pthread.h)
AC_CHECK_HEADERS(pwd.h)
AC_CHECK_HEADERS(security/pam_appl.h)
AC_CHECK_HEADERS(sgtty.h)
AC_CHECK_HEADERS(signal.h)
AC_CHECK_HEADERS(stdarg.h)
AC_CHECK_HEADERS(stddef.h)
AC_CHECK_HEADERS(stdio.h)
AC_CHECK_HEADERS(stdlib.h)
AC_CHECK_HEADERS(string.h)
AC_CHECK_HEADERS(strings.h)
AC_CHECK_HEADERS(sys/dir.h)
AC_CHECK_HEADERS(sys/ioctl.h)
AC_CHECK_HEADERS(sys/param.h)
AC_CHECK_HEADERS(sys/poll.h)
AC_CHECK_HEADERS(sys/reboot.h)
AC_CHECK_HEADERS(sys/resource.h)
AC_CHECK_HEADERS(sys/select.h)
AC_CHECK_HEADERS(sys/socket.h)
AC_CHECK_HEADERS(sys/signalfd.h)
AC_CHECK_HEADERS(sys/sockio.h)
AC_CHECK_HEADERS(sys/stat.h)
AC_CHECK_HEADERS(sys/time.h)
AC_CHECK_HEADERS(sys/timeb.h)
AC_CHECK_HEADERS(sys/types.h)
AC_CHECK_HEADERS(sys/uio.h)
AC_CHECK_HEADERS(sys/un.h)
AC_CHECK_HEADERS(sys/utsname.h)
AC_CHECK_HEADERS(sys/wait.h)
AC_CHECK_HEADERS(time.h)
AC_CHECK_HEADERS(unistd.h)
AC_CHECK_HEADERS(winsock.h)

dnl These headers need prerequisits before the tests will pass
dnl AC_CHECK_HEADERS(net/if.h)
dnl AC_CHECK_HEADERS(netinet/icmp6.h)
dnl AC_CHECK_HEADERS(netinet/ip6.h)
dnl AC_CHECK_HEADERS(netinet/ip_icmp.h)

AC_MSG_CHECKING(for special libxml2 includes)
if test "x$XML2CONFIG" = "x"; then
   AC_MSG_ERROR(libxml2 config not found)
else
   XML2HEAD="`$XML2CONFIG --cflags`"
   AC_MSG_RESULT($XML2HEAD)
   AC_CHECK_LIB(xml2, xmlReadMemory)
   AC_CHECK_LIB(xslt, xsltApplyStylesheet)
fi

CPPFLAGS="$CPPFLAGS $XML2HEAD"

AC_CHECK_HEADERS(libxml/xpath.h)
AC_CHECK_HEADERS(libxslt/xslt.h)
if test "$ac_cv_header_libxml_xpath_h" != "yes"; then
   AC_MSG_ERROR(The libxml developement headers were not found)
fi
if test "$ac_cv_header_libxslt_xslt_h" != "yes"; then
   AC_MSG_ERROR(The libxslt developement headers were not found)
fi

AC_CACHE_CHECK(whether __progname and __progname_full are available,
                pf_cv_var_progname,
                AC_TRY_LINK([extern char *__progname, *__progname_full;],
                    [__progname = "foo"; __progname_full = "foo bar";],
                    pf_cv_var_progname="yes", pf_cv_var_progname="no"))

if test "$pf_cv_var_progname" = "yes"; then
    AC_DEFINE(HAVE___PROGNAME,1,[ ])
fi

dnl ========================================================================
dnl Structures
dnl ========================================================================

AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[[#include <time.h>]])
AC_CHECK_MEMBERS([lrm_op_t.rsc_deleted],,,[[#include <lrm/lrm_api.h>]])
AC_CHECK_MEMBER([struct dirent.d_type],
    AC_DEFINE(HAVE_STRUCT_DIRENT_D_TYPE,1,[Define this if struct dirent has d_type]),,
    [#include <dirent.h>])

dnl ========================================================================
dnl Functions
dnl ========================================================================

AC_CHECK_FUNCS(g_log_set_default_handler)
AC_CHECK_FUNCS(getopt, AC_DEFINE(HAVE_DECL_GETOPT,  1, [Have getopt function]))
AC_CHECK_FUNCS(nanosleep, AC_DEFINE(HAVE_DECL_NANOSLEEP,  1, [Have nanosleep function]))

dnl ========================================================================
dnl   bzip2
dnl ========================================================================
AC_CHECK_HEADERS(bzlib.h)
AC_CHECK_LIB(bz2, BZ2_bzBuffToBuffCompress)

if test x$ac_cv_lib_bz2_BZ2_bzBuffToBuffCompress != xyes ; then
   AC_MSG_ERROR(BZ2 libraries not found)
fi

if test x$ac_cv_header_bzlib_h != xyes; then
   AC_MSG_ERROR(BZ2 Development headers not found)
fi

dnl ========================================================================
dnl sighandler_t is missing from Illumos, Solaris11 systems
dnl ========================================================================

AC_MSG_CHECKING([for sighandler_t])
AC_TRY_COMPILE([#include <signal.h>],[sighandler_t *f;],
has_sighandler_t=yes,has_sighandler_t=no)
AC_MSG_RESULT($has_sighandler_t)
if test "$has_sighandler_t" = "yes" ; then
    AC_DEFINE( HAVE_SIGHANDLER_T, 1, [Define if sighandler_t available] )
fi

dnl ========================================================================
dnl   ncurses
dnl ========================================================================
dnl
dnl A few OSes (e.g. Linux) deliver a default "ncurses" alongside "curses".
dnl Many non-Linux deliver "curses"; sites may add "ncurses".
dnl
dnl However, the source-code recommendation for both is to #include "curses.h"
dnl (i.e. "ncurses" still wants the include to be simple, no-'n', "curses.h").
dnl
dnl ncurse takes precedence.
dnl
AC_CHECK_HEADERS(curses.h)
AC_CHECK_HEADERS(curses/curses.h)
AC_CHECK_HEADERS(ncurses.h)
AC_CHECK_HEADERS(ncurses/ncurses.h)

dnl Although n-library is preferred, only look for it if the n-header was found.
CURSESLIBS=''
if test "$ac_cv_header_ncurses_h" = "yes"; then
  AC_CHECK_LIB(ncurses, printw,
    [AC_DEFINE(HAVE_LIBNCURSES,1, have ncurses library)]
  )
  CURSESLIBS=`$PKG_CONFIG --libs ncurses` || CURSESLIBS='-lncurses'
fi

if test "$ac_cv_header_ncurses_ncurses_h" = "yes"; then
  AC_CHECK_LIB(ncurses, printw,
    [AC_DEFINE(HAVE_LIBNCURSES,1, have ncurses library)]
  )
  CURSESLIBS=`$PKG_CONFIG --libs ncurses` || CURSESLIBS='-lncurses'
fi

dnl Only look for non-n-library if there was no n-library.
if test X"$CURSESLIBS" = X"" -a "$ac_cv_header_curses_h" = "yes"; then
  AC_CHECK_LIB(curses, printw,
    [CURSESLIBS='-lcurses'; AC_DEFINE(HAVE_LIBCURSES,1, have curses library)]
  )
fi

dnl Only look for non-n-library if there was no n-library.
if test X"$CURSESLIBS" = X"" -a "$ac_cv_header_curses_curses_h" = "yes"; then
  AC_CHECK_LIB(curses, printw,
    [CURSESLIBS='-lcurses'; AC_DEFINE(HAVE_LIBCURSES,1, have curses library)]
  )
fi

if test "x$CURSESLIBS" != "x"; then
   PCMK_FEATURES="$PCMK_FEATURES ncurses"
fi

dnl Check for printw() prototype compatibility
if test X"$CURSESLIBS" != X"" && cc_supports_flag -Wcast-qual && cc_supports_flag -Werror; then
    ac_save_LIBS=$LIBS
    LIBS="$CURSESLIBS"
    ac_save_CFLAGS=$CFLAGS
    CFLAGS="-Wcast-qual -Werror"
    # avoid broken test because of hardened build environment in Fedora 23+
    # - https://fedoraproject.org/wiki/Changes/Harden_All_Packages
    # - https://bugzilla.redhat.com/1297985
    if cc_supports_flag -fPIC; then
        CFLAGS="$CFLAGS -fPIC"
    fi

    AC_MSG_CHECKING(whether printw() requires argument of "const char *")
    AC_LINK_IFELSE(
	    [AC_LANG_PROGRAM(
	      [
#if defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif
	      ],
	      [printw((const char *)"Test");]
	    )],
	    [ac_cv_compatible_printw=yes],
	    [ac_cv_compatible_printw=no]
    )

    LIBS=$ac_save_LIBS
    CFLAGS=$ac_save_CFLAGS

    AC_MSG_RESULT([$ac_cv_compatible_printw])

    if test "$ac_cv_compatible_printw" = no; then
		AC_MSG_WARN([The printw() function of your ncurses or curses library is old, we will disable usage of the library. If you want to use this library anyway, please update to newer version of the library, ncurses 5.4 or later is recommended. You can get the library from http://www.gnu.org/software/ncurses/.])
		AC_MSG_NOTICE([Disabling curses])
		AC_DEFINE(HAVE_INCOMPATIBLE_PRINTW, 1, [Do we have incompatible printw() in curses library?])
    fi
fi

AC_SUBST(CURSESLIBS)

dnl ========================================================================
dnl    Profiling and GProf
dnl ========================================================================

AC_MSG_NOTICE(Old CFLAGS: $CFLAGS)
case $SUPPORT_COVERAGE in
     1|yes|true)
	SUPPORT_PROFILING=1
	PCMK_FEATURES="$PCMK_FEATURES coverage"
	CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
	dnl During linking, make sure to specify -lgcov or -coverage

        dnl Enable gprof
	#LIBS="$LIBS -pg"
	#CFLAGS="$CFLAGS -pg"
	;;
esac

case $SUPPORT_PROFILING in
     1|yes|true)
	SUPPORT_PROFILING=1

	dnl Disable various compiler optimizations
	CFLAGS="$CFLAGS -fno-omit-frame-pointer -fno-inline -fno-builtin "
	dnl CFLAGS="$CFLAGS -fno-inline-functions -fno-default-inline -fno-inline-functions-called-once -fno-optimize-sibling-calls"

	dnl Turn off optimization so tools can get accurate line numbers
	CFLAGS=`echo $CFLAGS | sed -e 's/-O.\ //g' -e 's/-Wp,-D_FORTIFY_SOURCE=.\ //g' -e 's/-D_FORTIFY_SOURCE=.\ //g'`
	CFLAGS="$CFLAGS -O0 -g3 -gdwarf-2"

	dnl Update features
	PCMK_FEATURES="$PCMK_FEATURES profile"
	;;
     *) SUPPORT_PROFILING=0;;
esac
AC_MSG_NOTICE(New CFLAGS: $CFLAGS)
AC_DEFINE_UNQUOTED(SUPPORT_PROFILING, $SUPPORT_PROFILING, Support for profiling)

dnl ========================================================================
dnl    Cluster infrastructure - Heartbeat / LibQB
dnl ========================================================================

dnl Compatibility checks
AC_CHECK_MEMBERS([struct lrm_ops.fail_rsc],,,[[#include <lrm/lrm_api.h>]])

if test x${enable_no_stack} = xyes; then
    SUPPORT_HEARTBEAT=no
    SUPPORT_CS=no
fi

PKG_CHECK_MODULES(libqb, libqb >= 0.13)
CPPFLAGS="$libqb_CFLAGS $CPPFLAGS"
LIBS="$libqb_LIBS $LIBS"
AC_CHECK_HEADERS(qb/qbipc_common.h)
AC_CHECK_LIB(qb, qb_ipcs_connection_auth_set)

PCMK_FEATURES="$PCMK_FEATURES libqb-logging libqb-ipc"

AC_CHECK_FUNCS(qb_ipcs_connection_get_buffer_size, AC_DEFINE(HAVE_IPCS_GET_BUFFER_SIZE,  1, [Have qb_ipcc_get_buffer_size function]))


AC_CHECK_HEADERS(heartbeat/hb_config.h)
AC_CHECK_HEADERS(heartbeat/glue_config.h)
AC_CHECK_HEADERS(stonith/stonith.h)
AC_CHECK_HEADERS(agent_config.h)

GLUE_HEADER=none
HAVE_GLUE=0
if test "$ac_cv_header_heartbeat_glue_config_h" = "yes";  then
   GLUE_HEADER=glue_config.h
   HAVE_GLUE=1

elif test "$ac_cv_header_heartbeat_hb_config_h" = "yes"; then
   GLUE_HEADER=hb_config.h
   HAVE_GLUE=1
else
   AC_MSG_WARN(cluster-glue development headers were not found)
fi

if test "$ac_cv_header_stonith_stonith_h" = "yes";  then
   PCMK_FEATURES="$PCMK_FEATURES lha-fencing"
fi
AM_CONDITIONAL([BUILD_LHA_SUPPORT], [test "$ac_cv_header_stonith_stonith_h" = "yes"])

if test $HAVE_GLUE = 1; then
   dnl On Debian, AC_CHECK_LIBS fail if a library has any unresolved symbols
   dnl So check for all the dependencies (so they're added to LIBS) before checking for -lplumb
   AC_CHECK_LIB(pils, PILLoadPlugin)
   AC_CHECK_LIB(plumb, G_main_add_IPC_Channel)
fi

dnl ===============================================
dnl Variables needed for substitution
dnl ===============================================
CRM_DTD_DIRECTORY="${datadir}/pacemaker"
AC_DEFINE_UNQUOTED(CRM_DTD_DIRECTORY,"$CRM_DTD_DIRECTORY", Location for the Pacemaker Relax-NG Schema)
AC_SUBST(CRM_DTD_DIRECTORY)

CRM_CORE_DIR=`try_extract_header_define $GLUE_HEADER HA_COREDIR ${localstatedir}/lib/pacemaker/cores`
AC_DEFINE_UNQUOTED(CRM_CORE_DIR,"$CRM_CORE_DIR", Location to store core files produced by Pacemaker daemons)
AC_SUBST(CRM_CORE_DIR)

if test x"${CRM_DAEMON_USER}" = x""; then
    CRM_DAEMON_USER=`try_extract_header_define $GLUE_HEADER HA_CCMUSER hacluster`
fi
AC_DEFINE_UNQUOTED(CRM_DAEMON_USER,"$CRM_DAEMON_USER", User to run Pacemaker daemons as)
AC_SUBST(CRM_DAEMON_USER)

if test x"${CRM_DAEMON_GROUP}" = x""; then
    CRM_DAEMON_GROUP=`try_extract_header_define $GLUE_HEADER HA_APIGROUP haclient`
fi
AC_DEFINE_UNQUOTED(CRM_DAEMON_GROUP,"$CRM_DAEMON_GROUP", Group to run Pacemaker daemons as)
AC_SUBST(CRM_DAEMON_GROUP)

CRM_LOG_DIR="${localstatedir}/log/pacemaker"
AC_DEFINE_UNQUOTED(CRM_LOG_DIR,"$CRM_LOG_DIR", Where Pacemaker can store log files)
AC_SUBST(CRM_LOG_DIR)

CRM_PACEMAKER_DIR=${localstatedir}/lib/pacemaker
AC_DEFINE_UNQUOTED(CRM_PACEMAKER_DIR,"$CRM_PACEMAKER_DIR", Location to store directory produced by Pacemaker daemons)
AC_SUBST(CRM_PACEMAKER_DIR)

CRM_BLACKBOX_DIR=${localstatedir}/lib/pacemaker/blackbox
AC_DEFINE_UNQUOTED(CRM_BLACKBOX_DIR,"$CRM_BLACKBOX_DIR", Where to keep blackbox dumps)
AC_SUBST(CRM_BLACKBOX_DIR)

PE_STATE_DIR="${localstatedir}/lib/pacemaker/pengine"
AC_DEFINE_UNQUOTED(PE_STATE_DIR,"$PE_STATE_DIR", Where to keep PEngine outputs)
AC_SUBST(PE_STATE_DIR)

CRM_CONFIG_DIR="${localstatedir}/lib/pacemaker/cib"
AC_DEFINE_UNQUOTED(CRM_CONFIG_DIR,"$CRM_CONFIG_DIR", Where to keep configuration files)
AC_SUBST(CRM_CONFIG_DIR)

CRM_CONFIG_CTS="${localstatedir}/lib/pacemaker/cts"
AC_DEFINE_UNQUOTED(CRM_CONFIG_CTS,"$CRM_CONFIG_CTS", Where to keep cts stateful data)
AC_SUBST(CRM_CONFIG_CTS)

CRM_LEGACY_CONFIG_DIR="${localstatedir}/lib/heartbeat/crm"
AC_DEFINE_UNQUOTED(CRM_LEGACY_CONFIG_DIR,"$CRM_LEGACY_CONFIG_DIR", Where Pacemaker used to keep configuration files)
AC_SUBST(CRM_LEGACY_CONFIG_DIR)

CRM_DAEMON_DIR="${libexecdir}/pacemaker"
AC_DEFINE_UNQUOTED(CRM_DAEMON_DIR,"$CRM_DAEMON_DIR", Location for Pacemaker daemons)
AC_SUBST(CRM_DAEMON_DIR)

HB_DAEMON_DIR=`try_extract_header_define $GLUE_HEADER HA_LIBHBDIR $libdir/heartbeat`
AC_DEFINE_UNQUOTED(HB_DAEMON_DIR,"$HB_DAEMON_DIR", Location Heartbeat expects Pacemaker daemons to be in)
AC_SUBST(HB_DAEMON_DIR)

dnl Needed so that the Corosync plugin can clear out the directory as Heartbeat does
HA_STATE_DIR=`try_extract_header_define $GLUE_HEADER HA_VARRUNDIR ${runstatedir}`
AC_DEFINE_UNQUOTED(HA_STATE_DIR,"$HA_STATE_DIR", Where Heartbeat keeps state files and sockets)
AC_SUBST(HA_STATE_DIR)

CRM_STATE_DIR="${runstatedir}/crm"
AC_DEFINE_UNQUOTED([CRM_STATE_DIR], ["$CRM_STATE_DIR"],
		   [Where to keep state files and sockets])
AC_SUBST(CRM_STATE_DIR)

CRM_RSCTMP_DIR=`try_extract_header_define agent_config.h HA_RSCTMPDIR ${runstatedir}/resource-agents`
AC_MSG_CHECKING(Scratch dir for resource agents)
AC_MSG_RESULT($CRM_RSCTMP_DIR)
AC_DEFINE_UNQUOTED(CRM_RSCTMP_DIR,"$CRM_RSCTMP_DIR", Where resource agents should keep state files)
AC_SUBST(CRM_RSCTMP_DIR)

dnl Needed for the location of hostcache in CTS.py
HA_VARLIBHBDIR=`try_extract_header_define $GLUE_HEADER HA_VARLIBHBDIR ${localstatedir}/lib/heartbeat`
AC_SUBST(HA_VARLIBHBDIR)

AC_DEFINE_UNQUOTED(UUID_FILE,"$localstatedir/lib/heartbeat/hb_uuid", Location of Heartbeat's UUID file)

if test "x$OCF_ROOT_DIR" = "x"; then
    OCF_ROOT_DIR=`try_extract_header_define $GLUE_HEADER OCF_ROOT_DIR /usr/lib/ocf`
fi
AC_SUBST(OCF_ROOT_DIR)

OCF_RA_DIR=`try_extract_header_define $GLUE_HEADER OCF_RA_DIR $OCF_ROOT_DIR/resource.d`
AC_DEFINE_UNQUOTED(OCF_RA_DIR,"$OCF_RA_DIR", Location for OCF RAs)
AC_SUBST(OCF_RA_DIR)

RH_STONITH_DIR="$sbindir"
AC_DEFINE_UNQUOTED(RH_STONITH_DIR,"$RH_STONITH_DIR", Location for Red Hat Stonith agents)
AC_DEFINE_UNQUOTED(SBIN_DIR,"$sbindir", Location for system binaries)

RH_STONITH_PREFIX="fence_"
AC_DEFINE_UNQUOTED(RH_STONITH_PREFIX,"$RH_STONITH_PREFIX", Prefix for Red Hat Stonith agents)

AC_PATH_PROGS(GIT, git false)
AC_MSG_CHECKING(build version)

BUILD_VERSION=$Format:%h$
if test $BUILD_VERSION != ":%h$"; then
   AC_MSG_RESULT(archive hash: $BUILD_VERSION)

elif test -x $GIT -a -d .git; then
   BUILD_VERSION=`$GIT log --pretty="format:%h" -n 1`
   AC_MSG_RESULT(git hash: $BUILD_VERSION)

else
   # The current directory name make a reasonable default
   # Most generated archives will include the hash or tag
   BASE=`basename $PWD`
   BUILD_VERSION=`echo $BASE | sed s:.*[[Pp]]acemaker-::`
   AC_MSG_RESULT(directory based hash: $BUILD_VERSION)
fi

AC_DEFINE_UNQUOTED(BUILD_VERSION, "$BUILD_VERSION", Build version)
AC_SUBST(BUILD_VERSION)


HAVE_dbus=1
HAVE_upstart=0
HAVE_systemd=0
PKG_CHECK_MODULES(DBUS, dbus-1, ,HAVE_dbus=0)

AC_DEFINE_UNQUOTED(SUPPORT_DBUS, $HAVE_dbus, Support dbus)
AM_CONDITIONAL(BUILD_DBUS, test $HAVE_dbus = 1)

if test $HAVE_dbus = 1; then
   CFLAGS="$CFLAGS `$PKG_CONFIG --cflags dbus-1`"
fi

DBUS_LIBS="$CFLAGS `$PKG_CONFIG --libs dbus-1`"
AC_SUBST(DBUS_LIBS)

AC_CHECK_TYPES([DBusBasicValue],,,[[#include <dbus/dbus.h>]])

if test "x${enable_systemd}" != xno; then
	if test $HAVE_dbus = 0; then
		if test "x${enable_systemd}" = xyes; then
			AC_MSG_FAILURE([cannot enable systemd without DBus])
		else
			enable_systemd=no
		fi
	fi
	if test "x${enable_systemd}" = xtry; then
		AC_MSG_CHECKING([for systemd version query result via dbus-send])
		ret=$({ dbus-send --system --print-reply \
		        --dest=org.freedesktop.systemd1 \
		        /org/freedesktop/systemd1 \
		        org.freedesktop.DBus.Properties.Get \
		        string:org.freedesktop.systemd1.Manager \
		        string:Version 2>/dev/null \
		        || echo "this borked"; } | tail -n1)
		# sanitize output a bit (interested just in value, not type),
		# ret is intentionally unenquoted so as to normalize whitespace
		ret=$(echo ${ret} | cut -d' ' -f2-)
		AC_MSG_RESULT([${ret}])
		if test "x${ret}" != xborked \
		   || systemctl --version 2>/dev/null | grep -q systemd; then
			enable_systemd=yes
		else
			enable_systemd=no
		fi
	fi
fi

AC_MSG_CHECKING([whether to enable support for managing resources via systemd])
AC_MSG_RESULT([${enable_systemd}])
if test "x${enable_systemd}" = xyes; then
	HAVE_systemd=1
	PCMK_FEATURES="$PCMK_FEATURES systemd"

    AC_MSG_CHECKING([which system unit file directory to use])
    PKG_CHECK_VAR([systemdsystemunitdir], [systemd], [systemdsystemunitdir])
    AC_MSG_RESULT([${systemdsystemunitdir}])
    if test "x${systemdsystemunitdir}" = x""; then
        AC_MSG_FAILURE([cannot enable systemd when systemdsystemunitdir unresolved])
	fi
fi
AC_SUBST([systemdsystemunitdir])

AC_DEFINE_UNQUOTED(SUPPORT_SYSTEMD, $HAVE_systemd, Support systemd based system services)
AM_CONDITIONAL(BUILD_SYSTEMD, test $HAVE_systemd = 1)
AC_SUBST(SUPPORT_SYSTEMD)

if test "x${enable_upstart}" != xno; then
	if test $HAVE_dbus = 0; then
		if test "x${enable_upstart}" = xyes; then
			AC_MSG_FAILURE([cannot enable Upstart without DBus])
		else
			enable_upstart=no
		fi
	fi
	if test "x${enable_upstart}" = xtry; then
		AC_MSG_CHECKING([for Upstart version query result via dbus-send])
		ret=$({ dbus-send --system --print-reply --dest=com.ubuntu.Upstart \
		        /com/ubuntu/Upstart org.freedesktop.DBus.Properties.Get \
		        string:com.ubuntu.Upstart0_6 string:version 2>/dev/null \
		        || echo "this borked"; } | tail -n1)
		# sanitize output a bit (interested just in value, not type),
		# ret is intentionally unenquoted so as to normalize whitespace
		ret=$(echo ${ret} | cut -d' ' -f2-)
		AC_MSG_RESULT([${ret}])
		if test "x${ret}" != xborked \
		   || initctl --version 2>/dev/null | grep -q upstart; then
			enable_upstart=yes
		else
			enable_upstart=no
		fi
	fi
fi
AC_MSG_CHECKING([whether to enable support for managing resources via Upstart])
AC_MSG_RESULT([${enable_upstart}])
if test "x${enable_upstart}" = xyes; then
	HAVE_upstart=1
	PCMK_FEATURES="$PCMK_FEATURES upstart"
fi

AC_DEFINE_UNQUOTED(SUPPORT_UPSTART, $HAVE_upstart, Support upstart based system services)
AM_CONDITIONAL(BUILD_UPSTART, test $HAVE_upstart = 1)
AC_SUBST(SUPPORT_UPSTART)


case $SUPPORT_NAGIOS in
     1|yes|true|try)
        SUPPORT_NAGIOS=1;;
     *)
        SUPPORT_NAGIOS=0;;
esac

if test $SUPPORT_NAGIOS = 1; then
    PCMK_FEATURES="$PCMK_FEATURES nagios"
fi

AC_DEFINE_UNQUOTED(SUPPORT_NAGIOS, $SUPPORT_NAGIOS, Support nagios plugins)
AM_CONDITIONAL(BUILD_NAGIOS, test $SUPPORT_NAGIOS = 1)

if test x"$NAGIOS_PLUGIN_DIR" = x""; then
    NAGIOS_PLUGIN_DIR="${libexecdir}/nagios/plugins"
fi

AC_DEFINE_UNQUOTED(NAGIOS_PLUGIN_DIR, "$NAGIOS_PLUGIN_DIR", Directory for nagios plugins)
AC_SUBST(NAGIOS_PLUGIN_DIR)

if test x"$NAGIOS_METADATA_DIR" = x""; then
    NAGIOS_METADATA_DIR="${datadir}/nagios/plugins-metadata"
fi

AC_DEFINE_UNQUOTED(NAGIOS_METADATA_DIR, "$NAGIOS_METADATA_DIR", Directory for nagios plugins metadata)
AC_SUBST(NAGIOS_METADATA_DIR)

STACKS=""
CLUSTERLIBS=""

dnl ========================================================================
dnl    Cluster stack - Heartbeat
dnl ========================================================================

case $SUPPORT_HEARTBEAT in
1|yes|true|try)
   AC_MSG_CHECKING(for heartbeat support)
   AC_CHECK_LIB(hbclient, ll_cluster_new, [SUPPORT_HEARTBEAT=1],
		[if test $SUPPORT_HEARTBEAT != try; then
			AC_MSG_FAILURE(Unable to support Heartbeat: client libraries not found)
		fi])

   if test $SUPPORT_HEARTBEAT = 1 ; then
	STACKS="$STACKS heartbeat"
	dnl objdump -x ${libdir}/libccmclient.so | grep SONAME | awk '{print $2}'
	AC_DEFINE_UNQUOTED(CCM_LIBRARY, "libccmclient.so.1", Library to load for ccm support)
	AC_DEFINE_UNQUOTED(HEARTBEAT_LIBRARY, "libhbclient.so.1", Library to load for heartbeat support)
	BUILD_ATOMIC_ATTRD=0
   else
	SUPPORT_HEARTBEAT=0
   fi
   ;;
*) SUPPORT_HEARTBEAT=0;;
esac

AM_CONDITIONAL(BUILD_HEARTBEAT_SUPPORT, test $SUPPORT_HEARTBEAT = 1)
AC_DEFINE_UNQUOTED(SUPPORT_HEARTBEAT, $SUPPORT_HEARTBEAT, Support the Heartbeat messaging and membership layer)
AC_SUBST(SUPPORT_HEARTBEAT)

dnl ========================================================================
dnl    Cluster stack - Corosync
dnl ========================================================================

dnl Normalize the values
case $SUPPORT_CS in
     1|yes|true)
		SUPPORT_CS=yes
		missingisfatal=1;;
     try)	missingisfatal=0;;
     *) SUPPORT_CS=no;;
esac

AC_MSG_CHECKING(for native corosync)
COROSYNC_LIBS=""
CS_USES_LIBQB=0

PCMK_SERVICE_ID=9

if test $SUPPORT_CS = no; then
    AC_MSG_RESULT(no (disabled))
    SUPPORT_CS=0
else
    AC_MSG_RESULT($SUPPORT_CS, with '$CSPREFIX')
    SUPPORT_CS=1
    PKG_CHECK_MODULES(cpg,    libcpg) dnl Fatal
    PKG_CHECK_MODULES(cfg,    libcfg) dnl Fatal
    PKG_CHECK_MODULES(cmap,   libcmap,   HAVE_cmap=1,   HAVE_cmap=0)
    PKG_CHECK_MODULES(cman,   libcman,   HAVE_cman=1,   HAVE_cman=0)
    PKG_CHECK_MODULES(confdb, libconfdb, HAVE_confdb=1, HAVE_confdb=0)
    PKG_CHECK_MODULES(fenced, libfenced, HAVE_fenced=1, HAVE_fenced=0)
    PKG_CHECK_MODULES(quorum, libquorum, HAVE_quorum=1, HAVE_quorum=0)
    PKG_CHECK_MODULES(oldipc, libcoroipcc, HAVE_oldipc=1, HAVE_oldipc=0)

    if test $HAVE_oldipc = 1; then
	CFLAGS="$CFLAGS $oldipc_FLAGS $cpg_FLAGS $cfg_FLAGS"
        COROSYNC_LIBS="$COROSYNC_LIBS $oldipc_LIBS $cpg_LIBS $cfg_LIBS"
    else
        CS_USES_LIBQB=1
	CFLAGS="$CFLAGS $libqb_FLAGS $cpg_FLAGS $cfg_FLAGS"
        COROSYNC_LIBS="$COROSYNC_LIBS $libqb_LIBS $cpg_LIBS $cfg_LIBS"
        AC_CHECK_LIB(corosync_common, cs_strerror)
    fi

    AC_DEFINE_UNQUOTED(HAVE_CONFDB, $HAVE_confdb, Have the old herarchial Corosync config API)
    AC_DEFINE_UNQUOTED(HAVE_CMAP, $HAVE_cmap, Have the new non-herarchial Corosync config API)
fi


if test $SUPPORT_CS = 1 -a x$HAVE_oldipc = x0 ; then
    dnl Support for plugins was removed about the time the IPC was
    dnl moved to libqb.
    dnl The only option now is the built-in quorum API
    CFLAGS="$CFLAGS $cmap_CFLAGS $quorum_CFLAGS"
    COROSYNC_LIBS="$COROSYNC_LIBS $cmap_LIBS $quorum_LIBS"

    STACKS="$STACKS corosync-native"
    AC_DEFINE_UNQUOTED(SUPPORT_CS_QUORUM, 1, Support the consumption of membership and quorum from corosync)
fi

SUPPORT_PLUGIN=0
if test $SUPPORT_CS = 1 -a x$HAVE_confdb = x1; then
    dnl Need confdb to support cman and the plugins
    SUPPORT_PLUGIN=1
    BUILD_ATOMIC_ATTRD=0
    AC_MSG_CHECKING([for corosync path for plugins])
    PKG_CHECK_VAR([LCRSODIR], [corosync], [lcrsodir], [
       AC_MSG_RESULT([$LCRSODIR])
    ],[
       AC_SUBST([LCRSODIR], [$libdir])
       AC_MSG_RESULT([$LCRSODIR (fallback)])
    ])
    STACKS="$STACKS corosync-plugin"
    COROSYNC_LIBS="$COROSYNC_LIBS $confdb_LIBS"

    if test $SUPPORT_CMAN != no; then
        if test $HAVE_cman = 1 -a $HAVE_fenced = 1; then
            SUPPORT_CMAN=1
	    STACKS="$STACKS cman"
            CFLAGS="$CFLAGS $cman_FLAGS $fenced_FLAGS"
            COROSYNC_LIBS="$COROSYNC_LIBS $cman_LIBS $fenced_LIBS"
        fi
    fi
fi

dnl Normalize SUPPORT_CS and SUPPORT_CMAN for use with #if directives
if test $SUPPORT_CMAN != 1; then
    SUPPORT_CMAN=0
fi

if test $SUPPORT_CS = 1; then
    CLUSTERLIBS="$CLUSTERLIBS $COROSYNC_LIBS"

elif test $SUPPORT_CS != 0; then
    SUPPORT_CS=0
    if test $missingisfatal = 0; then
        AC_MSG_WARN(Unable to support Corosync: $aisreason)
    else
        AC_MSG_FAILURE(Unable to support Corosync: $aisreason)
    fi
fi

AC_DEFINE_UNQUOTED(SUPPORT_COROSYNC, $SUPPORT_CS,    Support the Corosync messaging and membership layer)
AC_DEFINE_UNQUOTED(SUPPORT_CMAN,     $SUPPORT_CMAN,  Support the consumption of membership and quorum from cman)
AC_DEFINE_UNQUOTED(CS_USES_LIBQB,    $CS_USES_LIBQB, Does corosync use libqb for its ipc)
AC_DEFINE_UNQUOTED(PCMK_SERVICE_ID,  $PCMK_SERVICE_ID, Corosync service number)
AC_DEFINE_UNQUOTED(SUPPORT_PLUGIN,   $SUPPORT_PLUGIN, Support the Pacemaker plugin for Corosync)

AM_CONDITIONAL(BUILD_CS_SUPPORT, test $SUPPORT_CS = 1)
AM_CONDITIONAL(BUILD_CS_PLUGIN, test $SUPPORT_PLUGIN = 1)
AM_CONDITIONAL(BUILD_CMAN, test $SUPPORT_CMAN = 1)

AM_CONDITIONAL(BUILD_ATOMIC_ATTRD, test $BUILD_ATOMIC_ATTRD = 1)
AC_DEFINE_UNQUOTED(HAVE_ATOMIC_ATTRD, $BUILD_ATOMIC_ATTRD, Support the new atomic attrd)

AC_SUBST(SUPPORT_CMAN)
AC_SUBST(SUPPORT_CS)
AC_SUBST(SUPPORT_PLUGIN)

dnl
dnl    Cluster stack - Sanity
dnl

if test x${enable_no_stack} = xyes; then
    AC_MSG_NOTICE(No cluster stack supported.  Just building the Policy Engine)
    PCMK_FEATURES="$PCMK_FEATURES no-cluster-stack"
else
    AC_MSG_CHECKING(for supported stacks)
    if test x"$STACKS" = x; then
      AC_MSG_FAILURE(You must support at least one cluster stack (heartbeat or corosync) )
    fi
    AC_MSG_RESULT($STACKS)
    PCMK_FEATURES="$PCMK_FEATURES $STACKS"
fi

if test ${BUILD_ATOMIC_ATTRD} = 1; then
    PCMK_FEATURES="$PCMK_FEATURES atomic-attrd"
fi
AC_SUBST(CLUSTERLIBS)

dnl ========================================================================
dnl    SNMP
dnl ========================================================================

case $SUPPORT_SNMP in
     1|yes|true) missingisfatal=1;;
     try)        missingisfatal=0;;
     *)		 SUPPORT_SNMP=no;;
esac

SNMPLIBS=""

AC_MSG_CHECKING(for snmp support)
if test $SUPPORT_SNMP = no; then
   AC_MSG_RESULT(no (disabled))
   SUPPORT_SNMP=0
else
    SNMPCONFIG=""
    AC_MSG_RESULT($SUPPORT_SNMP)
    AC_CHECK_HEADERS(net-snmp/net-snmp-config.h)

    if test "x${ac_cv_header_net_snmp_net_snmp_config_h}" != "xyes"; then
 	SUPPORT_SNMP="no"
    fi

    if test $SUPPORT_SNMP != no; then
	AC_PATH_PROGS(SNMPCONFIG, net-snmp-config)
	if test "X${SNMPCONFIG}" = "X"; then
		AC_MSG_RESULT(You need the net_snmp development package to continue.)
		SUPPORT_SNMP=no
	fi
    fi

    if test $SUPPORT_SNMP != no; then
	AC_MSG_CHECKING(for special snmp libraries)
	SNMPLIBS=`$SNMPCONFIG --agent-libs`
	AC_MSG_RESULT($SNMPLIBS)
    fi

    if test $SUPPORT_SNMP != no; then
        savedLibs=$LIBS
        LIBS="$LIBS $SNMPLIBS"

        dnl    On many systems libcrypto is needed when linking against libsnmp.
        dnl    Check to see if it exists, and if so use it.
	dnl AC_CHECK_LIB(crypto, CRYPTO_free, CRYPTOLIB="-lcrypto",)
	dnl AC_SUBST(CRYPTOLIB)

        AC_CHECK_FUNCS(netsnmp_transport_open_client)
        if test $ac_cv_func_netsnmp_transport_open_client != yes; then
            AC_CHECK_FUNCS(netsnmp_tdomain_transport)
            if test $ac_cv_func_netsnmp_tdomain_transport != yes; then
                SUPPORT_SNMP=no
	    else
                AC_DEFINE_UNQUOTED(NETSNMPV53, 1, [Use the older 5.3 version of the net-snmp API])
            fi
        fi
        LIBS=$savedLibs
    fi

    if test $SUPPORT_SNMP = no; then
   	SNMPLIBS=""
   	SUPPORT_SNMP=0
     	if test $missingisfatal = 0; then
	    AC_MSG_WARN(Unable to support SNMP)
        else
	    AC_MSG_FAILURE(Unable to support SNMP)
        fi
    else
   	SUPPORT_SNMP=1
    fi
fi

if test $SUPPORT_SNMP = 1; then
   PCMK_FEATURES="$PCMK_FEATURES snmp"
fi

AC_SUBST(SNMPLIBS)
AM_CONDITIONAL(ENABLE_SNMP, test "$SUPPORT_SNMP" = "1")
AC_DEFINE_UNQUOTED(ENABLE_SNMP, $SUPPORT_SNMP, Build in support for sending SNMP traps)

dnl ========================================================================
dnl    ESMTP
dnl ========================================================================

case $SUPPORT_ESMTP in
     1|yes|true) missingisfatal=1;;
     try)        missingisfatal=0;;
     *)		 SUPPORT_ESMTP=no;;
esac

ESMTPLIB=""

AC_MSG_CHECKING(for esmtp support)
if test $SUPPORT_ESMTP = no; then
   AC_MSG_RESULT(no (disabled))
   SUPPORT_ESMTP=0
else
   ESMTPCONFIG=""
   AC_MSG_RESULT($SUPPORT_ESMTP)
   AC_CHECK_HEADERS(libesmtp.h)

   if test "x${ac_cv_header_libesmtp_h}" != "xyes"; then
	ENABLE_ESMTP="no"
   fi

   if test $SUPPORT_ESMTP != no; then
	AC_PATH_PROGS(ESMTPCONFIG, libesmtp-config)
	if test "X${ESMTPCONFIG}" = "X"; then
		AC_MSG_RESULT(You need the libesmtp development package to continue.)
		SUPPORT_ESMTP=no
	fi
   fi

   if test $SUPPORT_ESMTP != no; then
	AC_MSG_CHECKING(for special esmtp libraries)
	ESMTPLIBS=`$ESMTPCONFIG --libs | tr '\n' ' '`
	AC_MSG_RESULT($ESMTPLIBS)
   fi

   if test $SUPPORT_ESMTP = no; then
   	SUPPORT_ESMTP=0
     	if test $missingisfatal = 0; then
	    AC_MSG_WARN(Unable to support ESMTP)
        else
	    AC_MSG_FAILURE(Unable to support ESMTP)
        fi
   else
   	SUPPORT_ESMTP=1
        PCMK_FEATURES="$PCMK_FEATURES libesmtp"
   fi
fi

AC_SUBST(ESMTPLIBS)
AM_CONDITIONAL(ENABLE_ESMTP, test "$SUPPORT_ESMTP" = "1")
AC_DEFINE_UNQUOTED(ENABLE_ESMTP, $SUPPORT_ESMTP, Build in support for sending mail notifications with ESMTP)

dnl ========================================================================
dnl    ACL
dnl ========================================================================

case $SUPPORT_ACL in
     1|yes|true) missingisfatal=1;;
     try)        missingisfatal=0;;
     *)		 SUPPORT_ACL=no;;
esac

AC_MSG_CHECKING(for acl support)
if test $SUPPORT_ACL = no; then
    AC_MSG_RESULT(no (disabled))
    SUPPORT_ACL=0
else
    AC_MSG_RESULT($SUPPORT_ACL)

    SUPPORT_ACL=1
    AC_CHECK_LIB(qb, qb_ipcs_connection_auth_set)
    if test $ac_cv_lib_qb_qb_ipcs_connection_auth_set != yes; then
        SUPPORT_ACL=0
    fi

    if test $SUPPORT_ACL = 0; then
        if test $missingisfatal = 0; then
            AC_MSG_WARN(Unable to support ACL. You need to use libqb > 0.13.0)
        else
            AC_MSG_FAILURE(Unable to support ACL. You need to use libqb > 0.13.0)
        fi
    fi
fi

if test $SUPPORT_ACL = 1; then
    PCMK_FEATURES="$PCMK_FEATURES acls"
fi

AM_CONDITIONAL(ENABLE_ACL, test "$SUPPORT_ACL" = "1")
AC_DEFINE_UNQUOTED(ENABLE_ACL, $SUPPORT_ACL, Build in support for CIB ACL)

dnl ========================================================================
dnl    CIB secrets
dnl ========================================================================

case $SUPPORT_CIBSECRETS in
     1|yes|true|try)
        SUPPORT_CIBSECRETS=1;;
     *)
        SUPPORT_CIBSECRETS=0;;
esac

AC_DEFINE_UNQUOTED(SUPPORT_CIBSECRETS, $SUPPORT_CIBSECRETS, Support CIB secrets)
AM_CONDITIONAL(BUILD_CIBSECRETS, test $SUPPORT_CIBSECRETS = 1)

if test $SUPPORT_CIBSECRETS = 1; then
    PCMK_FEATURES="$PCMK_FEATURES cibsecrets"

    LRM_CIBSECRETS_DIR="${localstatedir}/lib/pacemaker/lrm/secrets"
    AC_DEFINE_UNQUOTED(LRM_CIBSECRETS_DIR,"$LRM_CIBSECRETS_DIR", Location for CIB secrets)
    AC_SUBST(LRM_CIBSECRETS_DIR)

    LRM_LEGACY_CIBSECRETS_DIR="${localstatedir}/lib/heartbeat/lrm/secrets"
    AC_DEFINE_UNQUOTED(LRM_LEGACY_CIBSECRETS_DIR,"$LRM_LEGACY_CIBSECRETS_DIR", Legacy location for CIB secrets)
    AC_SUBST(LRM_LEGACY_CIBSECRETS_DIR)
fi

dnl ========================================================================
dnl    GnuTLS
dnl ========================================================================

AC_CHECK_HEADERS(gnutls/gnutls.h)
AC_CHECK_HEADERS(security/pam_appl.h pam/pam_appl.h)

dnl GNUTLS library: Attempt to determine by 'libgnutls-config' program.
dnl If no 'libgnutls-config', try traditional autoconf means.
AC_PATH_PROGS(LIBGNUTLS_CONFIG, libgnutls-config)

if test -n "$LIBGNUTLS_CONFIG"; then
	AC_MSG_CHECKING(for gnutls header flags)
	GNUTLSHEAD="`$LIBGNUTLS_CONFIG --cflags`";
	AC_MSG_RESULT($GNUTLSHEAD)
	AC_MSG_CHECKING(for gnutls library flags)
	GNUTLSLIBS="`$LIBGNUTLS_CONFIG --libs`";
	AC_MSG_RESULT($GNUTLSLIBS)
fi
AC_CHECK_LIB(gnutls, gnutls_init)
AC_CHECK_FUNCS(gnutls_priority_set_direct)
 AC_CHECK_FUNCS([gnutls_sec_param_to_pk_bits]) dnl since 2.12.0 (2011-03-24)

AC_SUBST(GNUTLSHEAD)
AC_SUBST(GNUTLSLIBS)


dnl ========================================================================
dnl    System Health
dnl ========================================================================

dnl Check if servicelog development package is installed
SERVICELOG=servicelog-1
SERVICELOG_EXISTS="no"
AC_MSG_CHECKING(for $SERVICELOG packages)
if
    $PKG_CONFIG --exists $SERVICELOG
then
    PKG_CHECK_MODULES([SERVICELOG], [servicelog-1])
    SERVICELOG_EXISTS="yes"
fi
AC_MSG_RESULT($SERVICELOG_EXISTS)
AM_CONDITIONAL(BUILD_SERVICELOG, test "$SERVICELOG_EXISTS" = "yes")

dnl Check if OpenIMPI packages and servicelog are installed
OPENIPMI="OpenIPMI OpenIPMIposix"
OPENIPMI_SERVICELOG_EXISTS="no"
AC_MSG_CHECKING(for $SERVICELOG $OPENIPMI packages)
if
    $PKG_CONFIG --exists $OPENIPMI $SERVICELOG
then
    PKG_CHECK_MODULES([OPENIPMI_SERVICELOG],[OpenIPMI OpenIPMIposix])
    OPENIPMI_SERVICELOG_EXISTS="yes"
fi
AC_MSG_RESULT($OPENIPMI_SERVICELOG_EXISTS)
AM_CONDITIONAL(BUILD_OPENIPMI_SERVICELOG, test "$OPENIPMI_SERVICELOG_EXISTS" = "yes")

dnl ========================================================================
dnl Compiler flags
dnl ========================================================================

dnl Make sure that CFLAGS is not exported. If the user did
dnl not have CFLAGS in their environment then this should have
dnl no effect. However if CFLAGS was exported from the user's
dnl environment, then the new CFLAGS will also be exported
dnl to sub processes.
if export | fgrep " CFLAGS=" > /dev/null; then
	SAVED_CFLAGS="$CFLAGS"
	unset CFLAGS
	CFLAGS="$SAVED_CFLAGS"
	unset SAVED_CFLAGS
fi

AC_ARG_VAR([CFLAGS_HARDENED_LIB], [extra C compiler flags for hardened libraries])
AC_ARG_VAR([LDFLAGS_HARDENED_LIB], [extra linker flags for hardened libraries])

AC_ARG_VAR([CFLAGS_HARDENED_EXE], [extra C compiler flags for hardened executables])
AC_ARG_VAR([LDFLAGS_HARDENED_EXE], [extra linker flags for hardened executables])

CC_EXTRAS=""

if test "$GCC" != yes; then
        CFLAGS="$CFLAGS -g"
	enable_fatal_warnings=no
else
        CFLAGS="$CFLAGS -ggdb"

dnl When we don't have diagnostic push / pull, we can't explicitly disable
dnl checking for nonliteral formats in the places where they occur on purpose
dnl thus we disable nonliteral format checking globally as we are aborting
dnl on warnings. 
dnl what makes the things really ugly is that nonliteral format checking is 
dnl obviously available as an extra switch in very modern gcc but for older
dnl gcc this is part of -Wformat=2 
dnl so if we have push/pull we can enable -Wformat=2 -Wformat-nonliteral
dnl if we don't have push/pull but -Wformat-nonliteral we can enable -Wformat=2
dnl otherwise none of both

        gcc_diagnostic_push_pull=no
        SAVED_CFLAGS="$CFLAGS"
        CFLAGS="$CFLAGS -Werror"
        AC_MSG_CHECKING([for gcc diagnostic push / pull])
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#pragma GCC diagnostic push
#pragma GCC diagnostic pop
        ]])], [
                AC_MSG_RESULT([yes])
                gcc_diagnostic_push_pull=yes
        ], AC_MSG_RESULT([no]))
        CFLAGS="$SAVED_CFLAGS"

        if cc_supports_flag "-Wformat-nonliteral"; then
                gcc_format_nonliteral=yes
        else
                gcc_format_nonliteral=no
        fi
        
	# We had to eliminate -Wnested-externs because of libtool changes
	# Make sure to order options so that the former stand for prerequisites
	# of the latter (e.g., -Wformat-nonliteral requires -Wformat).
        EXTRA_FLAGS="-fgnu89-inline
		-Wall
		-Waggregate-return
		-Wbad-function-cast
		-Wcast-align
		-Wdeclaration-after-statement
		-Wendif-labels
		-Wfloat-equal
		-Wformat-security
		-Wmissing-prototypes
		-Wmissing-declarations
		-Wnested-externs
		-Wno-long-long
		-Wno-strict-aliasing
		-Wpointer-arith
		-Wstrict-prototypes
		-Wwrite-strings
		-Wunused-but-set-variable
		-Wunsigned-char"

        if test "x$gcc_diagnostic_push_pull" = "xyes"; then
                AC_DEFINE([GCC_FORMAT_NONLITERAL_CHECKING_ENABLED], [],
			[gcc can complain about nonliterals in format])
                EXTRA_FLAGS="$EXTRA_FLAGS
                        -Wformat=2 
                        -Wformat-nonliteral"
        else
                if test "x$gcc_format_nonliteral" = "xyes"; then
                        EXTRA_FLAGS="$EXTRA_FLAGS
                        -Wformat=2"
                fi
        fi

# Additional warnings it might be nice to enable one day
#		-Wshadow
#		-Wunreachable-code
	for j in $EXTRA_FLAGS
	do
	  if
	    cc_supports_flag $CC_EXTRAS $j
	  then
	    CC_EXTRAS="$CC_EXTRAS $j"
	  fi
	done

dnl In lib/ais/Makefile.am there's a gcc option available as of v4.x

	GCC_MAJOR=`gcc -v 2>&1 | awk 'END{print $3}' | sed 's/[.].*//'`
	AM_CONDITIONAL(GCC_4, test "${GCC_MAJOR}" = 4)

dnl System specific options

	case "$host_os" in
  	*linux*|*bsd*)
		if test "${enable_fatal_warnings}" = "unknown"; then
        		enable_fatal_warnings=yes
        	fi
          	;;
	esac

	if test "x${enable_fatal_warnings}" != xno && cc_supports_flag -Werror ; then
	   enable_fatal_warnings=yes
	else
	   enable_fatal_warnings=no
        fi

	if test "x${enable_ansi}" = xyes && cc_supports_flag -std=iso9899:199409 ; then
	  AC_MSG_NOTICE(Enabling ANSI Compatibility)
	  CC_EXTRAS="$CC_EXTRAS -ansi -D_GNU_SOURCE -DANSI_ONLY"
	fi

  	AC_MSG_NOTICE(Activated additional gcc flags: ${CC_EXTRAS})
fi

dnl
dnl Hardening flags
dnl
dnl The prime control of whether to apply (targeted) hardening build flags and
dnl which ones is --{enable,disable}-hardening option passed to ./configure:
dnl
dnl --enable-hardening=try (default):
dnl     depending on whether any of CFLAGS_HARDENED_EXE, LDFLAGS_HARDENED_EXE,
dnl     CFLAGS_HARDENED_LIB or LDFLAGS_HARDENED_LIB environment variables
dnl     (see below) is set and non-null, all these custom flags (even if not
dnl     set) are used as are, otherwise the best effort is made to offer
dnl     reasonably strong hardening in several categories (RELRO, PIE,
dnl     "bind now", stack protector) according to what the selected toolchain
dnl     can offer
dnl
dnl --enable-hardening:
dnl     same effect as --enable-hardening=try when the environment variables
dnl     in question are suppressed
dnl
dnl --disable-hardening:
dnl     do not apply any targeted hardening measures at all
dnl
dnl The user-injected environment variables that regulate the hardening in
dnl default case are as follows:
dnl
dnl * CFLAGS_HARDENED_EXE, LDFLAGS_HARDENED_EXE
dnl    compiler and linker flags (respectively) for daemon programs
dnl    (attrd, cib, crmd, lrmd, stonithd, pacemakerd, pacemaker_remoted,
dnl    pengine)
dnl
dnl * CFLAGS_HARDENED_LIB, LDFLAGS_HARDENED_LIB
dnl    compiler and linker flags (respectively) for libraries linked
dnl    with the daemon programs
dnl
dnl Note that these are purposedly targeted variables (addressing particular
dnl targets all over the scattered Makefiles) and have no effect outside of
dnl the predestined scope (e.g., CLI utilities).  For a global reach,
dnl use CFLAGS, LDFLAGS, etc. as usual.
dnl
dnl For guidance on the suitable flags consult, for instance:
dnl https://fedoraproject.org/wiki/Changes/Harden_All_Packages#Detailed_Harden_Flags_Description
dnl https://owasp.org/index.php/C-Based_Toolchain_Hardening#GCC.2FBinutils
dnl

if test "x${HARDENING}" != "xtry"; then
	unset CFLAGS_HARDENED_EXE
	unset CFLAGS_HARDENED_LIB
	unset LDFLAGS_HARDENED_EXE
	unset LDFLAGS_HARDENED_LIB
fi
if test "x${HARDENING}" = "xno"; then
	AC_MSG_NOTICE([Hardening: explicitly disabled])
elif test "x${HARDENING}" = "xyes" \
    || test "$(env | grep -Ec '^(C|LD)FLAGS_HARDENED_(EXE|LIB)=.')" = 0; then
	dnl We'll figure out on our own...
	CFLAGS_HARDENED_EXE=
	CFLAGS_HARDENED_LIB=
	LDFLAGS_HARDENED_EXE=
	LDFLAGS_HARDENED_LIB=
	relro=0
	pie=0
	bindnow=0
	# daemons incl. libs: partial RELRO
	flag="-Wl,-z,relro"
	CC_CHECK_LDFLAGS(["${flag}"],
		[LDFLAGS_HARDENED_EXE="${LDFLAGS_HARDENED_EXE} ${flag}";
		 LDFLAGS_HARDENED_LIB="${LDFLAGS_HARDENED_LIB} ${flag}";
		 relro=1]
	)
	# daemons: PIE for both CFLAGS and LDFLAGS
	if cc_supports_flag -fPIE; then
		flag="-pie"
		CC_CHECK_LDFLAGS(["${flag}"],
			[CFLAGS_HARDENED_EXE="${CFLAGS_HARDENED_EXE} -fPIE";
			 LDFLAGS_HARDENED_EXE="${LDFLAGS_HARDENED_EXE} ${flag}";
			 pie=1]
		)
	fi
	# daemons incl. libs: full RELRO if sensible + as-needed linking
	#                     so as to possibly mitigate startup performance
	#                     hit caused by excessive linking with unneeded
	#                     libraries
	if test "${relro}" = 1 && test "${pie}" = 1; then
		flag="-Wl,-z,now"
		CC_CHECK_LDFLAGS(["${flag}"],
			[LDFLAGS_HARDENED_EXE="${LDFLAGS_HARDENED_EXE} ${flag}";
			 LDFLAGS_HARDENED_LIB="${LDFLAGS_HARDENED_LIB} ${flag}";
			 bindnow=1]
		)
	fi
	if test "${bindnow}" = 1; then
		flag="-Wl,--as-needed"
		CC_CHECK_LDFLAGS(["${flag}"],
			[LDFLAGS_HARDENED_EXE="${LDFLAGS_HARDENED_EXE} ${flag}";
			 LDFLAGS_HARDENED_LIB="${LDFLAGS_HARDENED_LIB} ${flag}"]
		)
	fi
	# universal: prefer strong > all > default stack protector if possible
	flag=
	if cc_supports_flag -fstack-protector-strong; then
		flag="-fstack-protector-strong"
	elif cc_supports_flag -fstack-protector-all; then
		flag="-fstack-protector-all"
	elif cc_supports_flag -fstack-protector; then
		flag="-fstack-protector"
	fi
	if test -n "${flag}"; then
		CC_EXTRAS="${CC_EXTRAS} ${flag}"
		stackprot=1
	fi
	if test "${relro}" = 1 \
	|| test "${pie}" = 1 \
	|| test "${stackprot}" = 1; then
		AC_MSG_NOTICE(
		[Hardening: relro=${relro} pie=${pie} bindnow=${bindnow} stackprot=${flag}])
	else
		AC_MSG_WARN([Hardening: no suitable features in the toolchain detected])
	fi
else
	AC_MSG_NOTICE([Hardening: using custom flags])
fi

CFLAGS="$CFLAGS $CC_EXTRAS"

NON_FATAL_CFLAGS="$CFLAGS"
AC_SUBST(NON_FATAL_CFLAGS)

dnl
dnl We reset CFLAGS to include our warnings *after* all function
dnl checking goes on, so that our warning flags don't keep the
dnl AC_*FUNCS() calls above from working.  In particular, -Werror will
dnl *always* cause us troubles if we set it before here.
dnl
dnl
if test "x${enable_fatal_warnings}" = xyes ; then
   AC_MSG_NOTICE(Enabling Fatal Warnings)
   CFLAGS="$CFLAGS -Werror"
fi
AC_SUBST(CFLAGS)

dnl This is useful for use in Makefiles that need to remove one specific flag
CFLAGS_COPY="$CFLAGS"
AC_SUBST(CFLAGS_COPY)

AC_SUBST(LIBADD_DL)	dnl extra flags for dynamic linking libraries
AC_SUBST(LIBADD_INTL)	dnl extra flags for GNU gettext stuff...

AC_SUBST(LOCALE)

dnl Options for cleaning up the compiler output
QUIET_LIBTOOL_OPTS=""
QUIET_MAKE_OPTS=""
if test "x${enable_quiet}" = "xyes"; then
   QUIET_LIBTOOL_OPTS="--quiet"
   QUIET_MAKE_OPTS="--quiet"
fi

AC_MSG_RESULT(Supress make details: ${enable_quiet})

dnl Put the above variables to use
LIBTOOL="${LIBTOOL} --tag=CC \$(QUIET_LIBTOOL_OPTS)"
MAKE="${MAKE} \$(QUIET_MAKE_OPTS)"

AC_SUBST(CC)
AC_SUBST(MAKE)
AC_SUBST(LIBTOOL)
AC_SUBST(QUIET_MAKE_OPTS)
AC_SUBST(QUIET_LIBTOOL_OPTS)
AC_DEFINE_UNQUOTED(CRM_FEATURES, "$PCMK_FEATURES", Set of enabled features)
AC_SUBST(PCMK_FEATURES)

dnl The Makefiles and shell scripts we output
AC_CONFIG_FILES(Makefile				        \
Doxyfile							\
coverage.sh							\
cts/Makefile					        	\
	cts/CTSvars.py						\
	cts/LSBDummy						\
	cts/HBDummy						\
	cts/benchmark/Makefile					\
	cts/benchmark/clubench					\
	cts/lxc_autogen.sh					\
	cts/pacemaker-cts-dummyd.service			\
cib/Makefile							\
attrd/Makefile							\
crmd/Makefile							\
pengine/Makefile						\
	pengine/regression.core.sh				\
doc/Makefile							\
	doc/Clusters_from_Scratch/publican.cfg			\
	doc/Pacemaker_Development/publican.cfg			\
	doc/Pacemaker_Explained/publican.cfg			\
	doc/Pacemaker_Remote/publican.cfg			\
include/Makefile						\
	include/crm/Makefile					\
		include/crm/cib/Makefile			\
		include/crm/common/Makefile			\
		include/crm/cluster/Makefile			\
		include/crm/fencing/Makefile			\
		include/crm/pengine/Makefile			\
replace/Makefile						\
lib/Makefile							\
	lib/pacemaker.pc					\
	lib/pacemaker-cib.pc					\
	lib/pacemaker-lrmd.pc					\
	lib/pacemaker-service.pc				\
	lib/pacemaker-pengine.pc				\
	lib/pacemaker-fencing.pc				\
	lib/pacemaker-cluster.pc				\
	lib/ais/Makefile					\
	lib/common/Makefile					\
	lib/cluster/Makefile					\
	lib/cib/Makefile					\
	lib/pengine/Makefile					\
	lib/transition/Makefile					\
	lib/fencing/Makefile					\
	lib/lrmd/Makefile					\
	lib/services/Makefile					\
mcp/Makefile							\
	mcp/pacemaker						\
	mcp/pacemaker.service					\
	mcp/pacemaker.upstart					\
	mcp/pacemaker.combined.upstart				\
fencing/Makefile                                                \
        fencing/regression.py                                   \
lrmd/Makefile                                                   \
        lrmd/regression.py                                      \
        lrmd/pacemaker_remote.service				\
        lrmd/pacemaker_remote					\
extra/Makefile							\
	extra/alerts/Makefile					\
	extra/resources/Makefile				\
	extra/logrotate/Makefile				\
	extra/logrotate/pacemaker				\
tools/Makefile							\
	tools/crm_report					\
        tools/report.collector                                  \
        tools/report.common                                     \
	tools/cibsecret						\
	tools/crm_mon.service					\
	tools/crm_mon.upstart					\
xml/Makefile							\
lib/gnu/Makefile						\
		)

AC_CONFIG_FILES([cts/pacemaker-cts-dummyd], [chmod +x cts/pacemaker-cts-dummyd])
AC_CONFIG_FILES([tools/pcmk_simtimes], [chmod +x tools/pcmk_simtimes])

dnl Now process the entire list of files added by previous
dnl  calls to AC_CONFIG_FILES()
AC_OUTPUT()

dnl *****************
dnl Configure summary
dnl *****************

AC_MSG_RESULT([])
AC_MSG_RESULT([$PACKAGE configuration:])
AC_MSG_RESULT([  Version                  = ${VERSION} (Build: $BUILD_VERSION)])
AC_MSG_RESULT([  Features                 =${PCMK_FEATURES}])
AC_MSG_RESULT([])
AC_MSG_RESULT([  Prefix                   = ${prefix}])
AC_MSG_RESULT([  Executables              = ${sbindir}])
AC_MSG_RESULT([  Man pages                = ${mandir}])
AC_MSG_RESULT([  Libraries                = ${libdir}])
AC_MSG_RESULT([  Header files             = ${includedir}])
AC_MSG_RESULT([  Arch-independent files   = ${datadir}])
AC_MSG_RESULT([  State information        = ${localstatedir}])
AC_MSG_RESULT([  System configuration     = ${sysconfdir}])
if test $SUPPORT_PLUGIN = 1; then
AC_MSG_RESULT([  Corosync Plugins         = ${LCRSODIR}])
fi
AC_MSG_RESULT([])
AC_MSG_RESULT([  HA group name            = ${CRM_DAEMON_GROUP}])
AC_MSG_RESULT([  HA user name             = ${CRM_DAEMON_USER}])
AC_MSG_RESULT([])
AC_MSG_RESULT([  CFLAGS                   = ${CFLAGS}])
AC_MSG_RESULT([  CFLAGS_HARDENED_EXE      = ${CFLAGS_HARDENED_EXE}])
AC_MSG_RESULT([  CFLAGS_HARDENED_LIB      = ${CFLAGS_HARDENED_LIB}])
AC_MSG_RESULT([  LDFLAGS_HARDENED_EXE     = ${LDFLAGS_HARDENED_EXE}])
AC_MSG_RESULT([  LDFLAGS_HARDENED_LIB     = ${LDFLAGS_HARDENED_LIB}])
AC_MSG_RESULT([  Libraries                = ${LIBS}])
AC_MSG_RESULT([  Stack Libraries          = ${CLUSTERLIBS}])
AC_MSG_RESULT([  Unix socket auth method  = ${us_auth}])
