dnl
dnl Zabbix
dnl Copyright (C) 2001-2022 Zabbix SIA
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
dnl

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

AC_INIT([Zabbix],[6.2.0rc1])
AC_CONFIG_SRCDIR(src/zabbix_server/server.c)
AM_INIT_AUTOMAKE([subdir-objects tar-pax])

AC_MSG_NOTICE([Configuring $PACKAGE_NAME $PACKAGE_VERSION])

AC_PROG_MAKE_SET

AM_CONFIG_HEADER(include/common/config.h)

AC_SUBST(DEFAULT_INCLUDES, ['-I$(top_srcdir)/include/common -I$(top_srcdir)/include'])

AC_CANONICAL_HOST

dnl *****************************************************************
dnl *                                                               *
dnl *                     Checks for programs                       *
dnl *                                                               *
dnl *****************************************************************

AC_PROG_CC([cc c99 gcc clang])
AM_PROG_CC_C_O

dnl *****************************************************************
dnl *                                                               *
dnl *                   Checks for header files                     *
dnl *                                                               *
dnl *****************************************************************

AC_HEADER_STDC
AC_CHECK_HEADERS(stdio.h stdlib.h string.h unistd.h netdb.h signal.h \
  syslog.h time.h errno.h sys/types.h sys/stat.h netinet/in.h \
  math.h sys/socket.h dirent.h ctype.h \
  mtent.h fcntl.h sys/param.h arpa/inet.h \
  sys/vfs.h sys/pstat.h sys/sysinfo.h sys/statvfs.h sys/statfs.h \
  sys/socket.h sys/loadavg.h arpa/inet.h \
  sys/vmmeter.h strings.h vm/vm_param.h \
  sys/time.h kstat.h sys/syscall.h sys/sysmacros.h \
  stdint.h mach/host_info.h mach/mach_host.h knlist.h pwd.h \
  sys/var.h arpa/nameser.h assert.h sys/dkstat.h sys/disk.h sys/sched.h \
  zone.h nlist.h kvm.h linux/kernel.h procinfo.h sys/dk.h \
  sys/resource.h pthread.h windows.h process.h conio.h sys/wait.h \
  stdarg.h winsock2.h pdh.h psapi.h sys/sem.h sys/ipc.h sys/shm.h Winldap.h \
  Winber.h lber.h ws2tcpip.h inttypes.h sys/file.h grp.h \
  execinfo.h sys/systemcfg.h sys/mnttab.h mntent.h sys/times.h \
  dlfcn.h sys/utsname.h sys/un.h sys/protosw.h stddef.h limits.h float.h)
AC_CHECK_HEADERS(resolv.h, [], [], [
#ifdef HAVE_SYS_TYPES_H
#  include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#  include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#  include <arpa/nameser.h>
#endif
#ifdef HAVE_NETDB_H
#  include <netdb.h>
#endif
])
AC_CHECK_HEADERS(net/if.h net/if_mib.h, [], [], [
#include <stdio.h>
#ifdef STDC_HEADERS
#  include <stdlib.h>
#  include <stddef.h>
#else
#  ifdef HAVE_STDLIB_H
#    include <stdlib.h>
#  endif
#endif
#ifdef HAVE_SYS_TYPES_H
#  include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#  include <sys/socket.h>
#endif
/* for net/if_mib.h */
#ifdef HAVE_NET_IF_H
#  include <net/if.h>
#endif
])

AC_MSG_CHECKING(whether compiler supports -Werror=cpp)
checked_werror_cpp_CFLAGS=""
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -Werror=cpp"
AC_TRY_COMPILE(,[
  void f() {};
],checked_werror_cpp_CFLAGS="-Werror=cpp"
  AC_MSG_RESULT(yes),
  AC_MSG_RESULT(no)
)
CFLAGS="$saved_CFLAGS"

saved_CFLAGS="$CFLAGS"
CFLAGS="$checked_werror_cpp_CFLAGS $CFLAGS"
AC_CHECK_HEADERS(sys/mount.h sys/proc.h sys/sysctl.h sys/user.h, [], [], [
#ifdef HAVE_SYS_TYPES_H
#  include <sys/types.h>
#endif
#ifdef HAVE_SYS_PARAM_H
#  include <sys/param.h>
#endif
])
CFLAGS="$saved_CFLAGS"

AC_CHECK_HEADERS(sys/swap.h, [], [], [
#ifdef HAVE_SYS_PARAM_H
#  include <sys/param.h>
#endif
])
AC_CHECK_HEADERS(sys/ucontext.h, [], [], [
#ifdef HAVE_SIGNAL_H
#  include <signal.h>
#endif
])
AC_CHECK_HEADERS(devstat.h, [], [], [
#ifdef HAVE_SYS_DKSTAT_H
#  include <sys/dkstat.h>
#endif
])
AC_CHECK_HEADERS(linux/netlink.h, [
	AC_CHECK_HEADERS(linux/inet_diag.h, [
		AC_DEFINE([HAVE_INET_DIAG], 1, [Define to 1 if you have NETLINK INET_DIAG support.])
	])
], [], [
#ifdef HAVE_SYS_SOCKET_H
#  include <sys/socket.h>
#endif
])
AC_CHECK_HEADERS(libperfstat.h, [], [], [
#ifdef HAVE_SYS_PROTOSW_H
#  include <sys/protosw.h>
#endif
])

dnl *****************************************************************
dnl *                                                               *
dnl *                     Checks for libraries                      *
dnl *                                                               *
dnl *****************************************************************

AC_SEARCH_LIBS(socket, socket)
AC_SEARCH_LIBS(kstat_open, kstat)
AC_SEARCH_LIBS(gethostbyname, nsl)
AC_SEARCH_LIBS(clock_gettime, rt)
AC_SEARCH_LIBS(dlopen, dl)

dnl AIX
AC_SEARCH_LIBS(perfstat_memory_total, perfstat, [AC_DEFINE([HAVE_LIBPERFSTAT], 1, [Define to 1 if you have the 'libperfstat' library (-lperfstat)])])
AC_SEARCH_LIBS(devstat_getdevs, devstat, [AC_DEFINE([HAVE_LIBDEVSTAT], 1, [Define to 1 if you have the 'libdevstat' library (-ldevstat)])])
AC_SEARCH_LIBS(getdevs, devstat, [AC_DEFINE([HAVE_LIBDEVSTAT], 1, [Define to 1 if you have the 'libdevstat' library (-ldevstat)])])

dnl on FreeBSD we have to link with -lexecinfo to get backtraces
AC_SEARCH_LIBS(backtrace_symbols, execinfo, [AC_DEFINE([HAVE_LIBEXECINFO], 1, [Define to 1 if you have the 'libexecinfo' library (-lexecinfo)])])

AC_CHECK_LIB(m, main)
AC_CHECK_LIB(kvm, main)

dnl check for DNS lookup functions
found_resolv="no"
LIBRESOLV_CHECK_CONFIG([no])
if test "x$found_resolv" != "xyes"; then
	AC_MSG_ERROR([Unable to do DNS lookups (libresolv check failed)])
fi
LIBS="${LIBS} ${RESOLV_LIBS}"

dnl *****************************************************************
dnl *                                                               *
dnl *          Checks for type definitions and structures           *
dnl *                                                               *
dnl *****************************************************************

dnl large file support
largefile=yes

dnl disable large file support on 32-bit Solaris as it's incompatible with procfs and swapctl
case "${host_os}" in
	solaris*)
		largefile=no
		;;
esac

if test "x$largefile" = "xyes"; then
	AC_SYS_LARGEFILE
fi

AC_C_CONST
AC_TYPE_PID_T

AC_MSG_CHECKING(for socklen_t)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
],[socklen_t s;],
AC_MSG_RESULT(yes),
[AC_DEFINE(socklen_t, int, [Define socklen_t type.])
AC_MSG_RESULT(no)])

AC_MSG_CHECKING(for actual socklen_t parameter type in socket functions)
zbx_socklen_t=
for arg2 in "struct sockaddr" void; do
  for arg3 in socklen_t size_t int; do
    AC_TRY_COMPILE([
#ifdef HAVE_SYS_TYPES_H
#  include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#  include <sys/socket.h>
#endif
      extern int getpeername(int sockfd, $arg2 *addr, $arg3 *addrlen);
    ],[
      $arg3 addrlen;
      getpeername(0, 0, &addrlen);
    ],[
      zbx_socklen_t="$arg3"
      break 2
    ])
  done
done
if test "x$zbx_socklen_t" != "x"; then
  AC_MSG_RESULT($zbx_socklen_t)
  AC_DEFINE_UNQUOTED(ZBX_SOCKLEN_T, $zbx_socklen_t, [Define actual socklen_t parameter type in socket functions.])
else
  AC_MSG_RESULT(leaving undefined)
fi

AC_MSG_CHECKING(for integer field name in union sigval of struct siginfo_t)
zbx_sival_int=
for field in sival_int sigval_int; do
  AC_TRY_COMPILE([
#ifdef HAVE_SIGNAL_H
#  include <signal.h>
#endif
  ],[
    siginfo_t siginfo;
    siginfo.si_value.$field = 0;
  ],[
    zbx_sival_int="$field"
    break
  ])
done
if test "x$zbx_sival_int" != "x"; then
  AC_MSG_RESULT($zbx_sival_int)
  AC_DEFINE_UNQUOTED(ZBX_SIVAL_INT, $zbx_sival_int, [Define integer field name in union 'sigval' of struct 'siginfo_t'])
else
  AC_MSG_ERROR(Unable to find integer field name in union sigval of struct siginfo_t)
fi

AC_MSG_CHECKING(for res_ninit)
AC_TRY_LINK(
[
#ifdef HAVE_SYS_TYPES_H
#	include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#	include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#	include <arpa/nameser.h>
#endif
#ifdef HAVE_RESOLV_H
#	include <resolv.h>
#endif
#ifndef C_IN
#	define C_IN	ns_c_in
#endif	/* C_IN */
#ifndef T_SOA
#	define T_SOA	ns_t_soa
#endif	/* T_SOA */
],
[
	struct __res_state	res_state_local;

	res_ninit(&res_state_local);
],
AC_DEFINE(HAVE_RES_NINIT,1,[Define to 1 if 'res_ninit' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for res_ndestroy)
AC_TRY_LINK(
[
#ifdef HAVE_SYS_TYPES_H
#	include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#	include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#	include <arpa/nameser.h>
#endif
#ifdef HAVE_RESOLV_H
#	include <resolv.h>
#endif
#ifndef C_IN
#	define C_IN	ns_c_in
#endif	/* C_IN */
#ifndef T_SOA
#	define T_SOA	ns_t_soa
#endif	/* T_SOA */
],
[
	struct __res_state	res_state_local;

	res_ninit(&res_state_local);
	res_ndestroy(&res_state_local);
],
AC_DEFINE(HAVE_RES_NDESTROY,1,[Define to 1 if 'res_ndestroy' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for _res._u._ext.nsaddrs[])
AC_TRY_LINK(
[
#ifdef HAVE_SYS_TYPES_H
#	include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#	include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#	include <arpa/nameser.h>
#endif
#ifdef HAVE_RESOLV_H
#	include <resolv.h>
#endif
#ifndef C_IN
#	define C_IN	ns_c_in
#endif	/* C_IN */
#ifndef T_SOA
#	define T_SOA	ns_t_soa
#endif	/* T_SOA */
],
[
	struct sockaddr_in6	*sockaddrin6;

	sockaddrin6 = _res._u._ext.nsaddrs[0];
],
AC_DEFINE(HAVE_RES_U_EXT,1,[Define to 1 if '_res._u._ext.nsaddrs[]' exists. /Linux/])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for _res._u._ext.ext)
AC_TRY_LINK(
[
#ifdef HAVE_SYS_TYPES_H
#	include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#	include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#	include <arpa/nameser.h>
#endif
#ifdef HAVE_RESOLV_H
#	include <resolv.h>
#endif
#ifndef C_IN
#	define C_IN	ns_c_in
#endif	/* C_IN */
#ifndef T_SOA
#	define T_SOA	ns_t_soa
#endif	/* T_SOA */
],
[
	struct __res_state_ext	*ext;

	ext = _res._u._ext.ext;
],
AC_DEFINE(HAVE_RES_U_EXT_EXT,1,[Define to 1 if '_res._u._ext.ext' exists. /BSD/])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for _res._ext.ext.nsaddrs[])
AC_TRY_LINK(
[
#ifdef HAVE_SYS_TYPES_H
#	include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#	include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#	include <arpa/nameser.h>
#endif
#ifdef HAVE_RESOLV_H
#	include <resolv.h>
#endif
#ifndef C_IN
#	define C_IN	ns_c_in
#endif	/* C_IN */
#ifndef T_SOA
#	define T_SOA	ns_t_soa
#endif	/* T_SOA */
],
[
	union res_sockaddr_union	*na;

	na = &_res._ext.ext.nsaddrs[0];
],
AC_DEFINE(HAVE_RES_EXT_EXT,1,[Define to 1 if '_res._ext.ext.nsaddrs[]' exists. /AIX/])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for struct sockaddr_in6.sin6_len)
AC_TRY_LINK(
[
#ifdef HAVE_SYS_TYPES_H
#	include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#	include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#	include <arpa/nameser.h>
#endif
#ifdef HAVE_RESOLV_H
#	include <resolv.h>
#endif
#ifndef C_IN
#	define C_IN	ns_c_in
#endif	/* C_IN */
#ifndef T_SOA
#	define T_SOA	ns_t_soa
#endif	/* T_SOA */
],
[
	struct sockaddr_in6	sin6;
	unsigned int		len;

	len = sin6.sin6_len;
],
AC_DEFINE(HAVE_RES_SIN6_LEN,1,[Define to 1 if 'sockaddr_in6.sin6_len' exists. /BSD/])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for union semun)
AC_TRY_COMPILE(
[
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
],
[union semun foo;],
AC_DEFINE(HAVE_SEMUN, 1, [Define to 1 if union 'semun' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for struct swaptable in sys/swap.h)
AC_TRY_COMPILE(
[
#include <stdlib.h>
#include <sys/types.h>
#include <sys/syscall.h>
#include <sys/swap.h>

#ifndef NULL
#define NULL (void *)0
#endif
],
[
    register int cnt, i;
    register int t, f;
    struct swaptable *swt;
    struct swapent *ste;
    static char path[256];

    /* get total number of swap entries */
    cnt = swapctl(SC_GETNSWP, 0);

    /* allocate enough space to hold count + n swapents */
    swt = (struct swaptable *)malloc(sizeof(int) +
             cnt * sizeof(struct swapent));
    if (swt == NULL)
    {
  return;
    }
    swt->swt_n = cnt;

    /* fill in ste_path pointers: we do not care about the paths, so we
point
       them all to the same buffer */
    ste = &(swt->swt_ent[0]);
    i = cnt;
    while (--i >= 0)
    {
  ste++->ste_path = path;
    }

    /* grab all swap info */
    swapctl(SC_LIST, swt);

    /* walk through the structs and sum up the fields */
    t = f = 0;
    ste = &(swt->swt_ent[0]);
    i = cnt;
    while (--i >= 0)
    {
  /* do not count slots being deleted */
  if (!(ste->ste_flags & ST_INDEL) &&
      !(ste->ste_flags & ST_DOINGDEL))
  {
      t += ste->ste_pages;
      f += ste->ste_free;
  } ste++;
    }

    /* fill in the results */
    free(swt);

],
AC_DEFINE(HAVE_SYS_SWAP_SWAPTABLE,1,[Define to 1 if struct 'swaptable' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for struct sensordev in sys/sensors.h)
AC_TRY_COMPILE([
#include <stdlib.h>
#include <sys/queue.h>
#include <sys/sensors.h>],
[struct sensordev sensordev;
sensordev.xname[0]='\0';
sensordev.maxnumt[0]=0;
],
AC_DEFINE(HAVE_SENSORDEV,1,[Define to 1 if struct 'sensordev' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for struct statvfs64 in sys/statvfs.h)
AC_TRY_COMPILE(
[
#ifdef HAVE_SYS_TYPES_H
#	include <sys/types.h>
#endif
#ifdef HAVE_SYS_STATVFS_H
#	include <sys/statvfs.h>
#endif
],
[
	struct statvfs64	s;
	s.f_frsize = s.f_blocks = s.f_bfree = s.f_bavail = 0;
	statvfs64("/", &s);
],
AC_DEFINE(HAVE_SYS_STATVFS64, 1, [Define to 1 if struct 'statvfs64' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for struct statfs64 in sys/statfs.h)
AC_TRY_COMPILE(
[
#ifdef HAVE_SYS_TYPES_H
#	include <sys/types.h>
#endif
#ifdef HAVE_SYS_STATFS_H
#	include <sys/statfs.h>
#endif
],
[
	struct statfs64	s;
	s.f_bsize = s.f_blocks = s.f_bfree = s.f_bavail = 0;
	statfs64("/", &s);
],
AC_DEFINE(HAVE_SYS_STATFS64, 1, [Define to 1 if struct 'statfs64' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field ss_family in struct sockaddr_storage)
AC_TRY_COMPILE([#include <sys/socket.h>],
[struct sockaddr_storage ss;
ss.ss_family = 0;
],
AC_DEFINE(HAVE_SOCKADDR_STORAGE_SS_FAMILY, 1, [Define to 1 if 'sockaddr_storage.ss_family' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field mem_unit in struct sysinfo)
AC_TRY_COMPILE([#include <sys/sysinfo.h>],
[struct sysinfo sysinfo;
sysinfo.mem_unit=0;
],
AC_DEFINE(HAVE_SYSINFO_MEM_UNIT,1,[Define to 1 if 'sysinfo.mem_unit' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field freeswap in struct sysinfo)
AC_TRY_COMPILE([#include <sys/sysinfo.h>],
[struct sysinfo sysinfo;
sysinfo.freeswap=0;
],
AC_DEFINE(HAVE_SYSINFO_FREESWAP,1,[Define to 1 if 'sysinfo.freeswap' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field totalswap in struct sysinfo)
AC_TRY_COMPILE([#include <sys/sysinfo.h>],
[struct sysinfo sysinfo;
sysinfo.totalswap=0;
],
AC_DEFINE(HAVE_SYSINFO_TOTALSWAP,1,[Define to 1 if 'sysinfo.totalswap' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field totalram in struct sysinfo)
AC_TRY_COMPILE([#include <sys/sysinfo.h>],
[struct sysinfo sysinfo;
sysinfo.totalram=0;
],
AC_DEFINE(HAVE_SYSINFO_TOTALRAM,1,[Define to 1 if 'sysinfo.totalram' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field sharedram in struct sysinfo)
AC_TRY_COMPILE([#include <sys/sysinfo.h>],
[struct sysinfo sysinfo;
sysinfo.sharedram=0;
],
AC_DEFINE(HAVE_SYSINFO_SHAREDRAM,1,[Define to 1 if 'sysinfo.sharedram' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field bufferram in struct sysinfo)
AC_TRY_COMPILE([#include <sys/sysinfo.h>],
[struct sysinfo sysinfo;
sysinfo.bufferram=0;
],
AC_DEFINE(HAVE_SYSINFO_BUFFERRAM,1,[Define to 1 if 'sysinfo.bufferram' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field freeram in struct sysinfo)
AC_TRY_COMPILE([#include <sys/sysinfo.h>],
[struct sysinfo sysinfo;
sysinfo.freeram=0;
],
AC_DEFINE(HAVE_SYSINFO_FREERAM,1,[Define to 1 if 'sysinfo.freeram' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field uptime in struct sysinfo)
AC_TRY_COMPILE([#include <sys/sysinfo.h>],
[struct sysinfo sysinfo;
sysinfo.uptime=0;
],
AC_DEFINE(HAVE_SYSINFO_UPTIME,1,[Define to 1 if 'sysinfo.uptime' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field procs in struct sysinfo)
AC_TRY_COMPILE([#include <sys/sysinfo.h>],
[struct sysinfo sysinfo;
sysinfo.procs=0;
],
AC_DEFINE(HAVE_SYSINFO_PROCS,1,[Define to 1 if 'sysinfo.procs' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for field tm_gmtoff in struct tm)
AC_TRY_COMPILE([
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif	/* HAVE_SYS_TIME_H */

#ifdef HAVE_TIME_H
#include <time.h>
#endif	/* HAVE_TIME_H */
],
[
	struct tm tm;
	tm.tm_gmtoff;
],
AC_DEFINE(HAVE_TM_TM_GMTOFF,1,[Define to 1 if 'tm.tm_gmtoff' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for linker options --start-group/--end-group)
saved_LDFLAGS="$LDFLAGS"
LDFLAGS="-Wl,--start-group -Wl,--end-group"
AC_TRY_LINK([], [],
HAVE_START_GROUP="yes"
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no)
)
LDFLAGS="$saved_LDFLAGS"

AC_MSG_CHECKING(for '__thread' compiler support)
AC_TRY_COMPILE([#include <stdio.h>],[static __thread int a = 0;],
AC_DEFINE(HAVE_THREAD_LOCAL,1,[Define to 1 if compiler keyword '__thread' supported.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no)
HAVE_THREAD_LOCAL="no")

AC_MSG_CHECKING(for field updates in struct vminfo_t)
AC_TRY_COMPILE([
#include <sys/sysinfo.h>
],
[
	vminfo_t vminfo;
	vminfo.updates;
],
AC_DEFINE(HAVE_VMINFO_T_UPDATES,1,[Define to 1 if 'vminfo.updates' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

dnl *****************************************************************
dnl *                                                               *
dnl *                     Checks for functions                      *
dnl *                                                               *
dnl *****************************************************************

AC_MSG_CHECKING(for function sysconf() in unistd.h)
AC_TRY_COMPILE(
[
#include <unistd.h>
],
[	int i;

	i=sysconf(_SC_PHYS_PAGES)*sysconf(_SC_PHYS_PAGES);
	i=sysconf(_SC_AVPHYS_PAGES)*sysconf(_SC_PHYS_PAGES);
],
AC_DEFINE(HAVE_UNISTD_SYSCONF,1,[Define to 1 if function 'sysconf' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for function initgroups())
AC_TRY_LINK(
[
#include <sys/types.h>
#include <grp.h>
],
[
	char	*user = "zabbix";
	initgroups(user, 0);
],
AC_DEFINE(HAVE_FUNCTION_INITGROUPS,1,[Define to 1 if function 'initgroups' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for functions seteuid() and setegid())
AC_TRY_LINK(
[
#include <sys/types.h>
#include <unistd.h>
],
[
	seteuid(0);
	setegid(0);
],
AC_DEFINE(HAVE_FUNCTION_SETEUID,1,[Define to 1 if functions 'seteuid' and 'setegid' exist.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for function setproctitle())
AC_TRY_LINK(
[
#include <sys/types.h>
#include <unistd.h>
],
[
	setproctitle("Test %d", 1);
],
AC_DEFINE(HAVE_FUNCTION_SETPROCTITLE,1,[Define to 1 if function 'setproctitle' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for function sysctlbyname())
AC_TRY_LINK(
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */

#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif /* HAVE_SYS_PARAM_H */

#include <sys/sysctl.h>
],
[
	sysctlbyname("", 0, 0, 0, 0);
],
AC_DEFINE(HAVE_FUNCTION_SYSCTLBYNAME,1,[Define to 1 if 'sysctlbyname' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for function sysctl (KERN_BOOTTIME))
AC_TRY_COMPILE(
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */

#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif /* HAVE_SYS_PARAM_H */

#include <sys/sysctl.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
],
[
	size_t		len;
	struct timeval	uptime;
        int		mib[2];

        mib[0] = CTL_KERN;
        mib[1] = KERN_BOOTTIME;

        len = sizeof(uptime);
        sysctl(mib, 2, &uptime, &len, 0, 0);
],
AC_DEFINE(HAVE_FUNCTION_SYSCTL_KERN_BOOTTIME,1,[Define to 1 if 'KERN_BOOTTIME' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for function sysctl (HW_NCPU))
AC_TRY_COMPILE(
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */

#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif /* HAVE_SYS_PARAM_H */

#include <sys/sysctl.h>
],
[
	size_t	len;
	int	mib[2], ncpu;

	mib[0] = CTL_HW;
	mib[1] = HW_NCPU;

	len = sizeof(ncpu);
	sysctl(mib, 2, &ncpu, &len, 0, 0);
],
AC_DEFINE(HAVE_FUNCTION_SYSCTL_HW_NCPU,1,[Define to 1 if 'HW_NCPU' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for function sysctl (KERN_MAXFILES))
AC_TRY_COMPILE(
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */

#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif /* HAVE_SYS_PARAM_H */

#include <sys/sysctl.h>
],
[
	size_t	len;
        int	mib[2], maxfiles;

        mib[0] = CTL_KERN;
        mib[1] = KERN_MAXFILES;

        len = sizeof(maxfiles);
        sysctl(mib, 2, &maxfiles, &len, 0, 0);
],
AC_DEFINE(HAVE_FUNCTION_SYSCTL_KERN_MAXFILES,1,[Define to 1 if 'KERN_MAXFILES' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for function sysctl (KERN_MAXPROC))
AC_TRY_COMPILE(
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */

#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif /* HAVE_SYS_PARAM_H */

#include <sys/sysctl.h>
],
[
	size_t	len;
	int	mib[2], maxproc;

        mib[0] = CTL_KERN;
        mib[1] = KERN_MAXPROC;

        len = sizeof(maxproc);
        sysctl(mib, 2, &maxproc, &len, 0, 0);
],
AC_DEFINE(HAVE_FUNCTION_SYSCTL_KERN_MAXPROC,1,[Define to 1 if 'KERN_MAXPROC' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for function sysctl (KERN_CPTIME,KERN_CPTIME2))
AC_TRY_COMPILE(
[
#include <sys/param.h>
#include <sys/sysctl.h>
#if defined(HAVE_SYS_DKSTAT_H)
#	include <sys/dkstat.h>
#elif defined(HAVE_SYS_SCHED_H)
#	include <sys/sched.h>
#endif
],
[
size_t	sz;
int	i[] = {CP_USER, CP_NICE, CP_SYS, CP_INTR, CP_IDLE};

{
	long	states[CPUSTATES];
	int	mib[2] = {CTL_KERN, KERN_CPTIME};

	sz = sizeof(states);
	sysctl(mib, 2, &states, &sz, NULL, 0);
}

{
	u_int64_t	states[CPUSTATES];
	int		mib[3] = {CTL_KERN, KERN_CPTIME2, 0};

	sz = sizeof(states);
	sysctl(mib, 3, &states, &sz, NULL, 0);
}
],
AC_DEFINE(HAVE_FUNCTION_SYSCTL_KERN_CPTIME,1,[Define to 1 if 'KERN_CPTIME,KERN_CPTIME2' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for function clock_gettime in time.h)
AC_TRY_LINK([
#ifdef HAVE_TIME_H
#	include <time.h>
#elif HAVE_SYS_TIME_H
#	include <sys/time.h>
#endif	/* HAVE_SYS_TIME_H */
],
[struct timespec tp;
clock_gettime(CLOCK_REALTIME, &tp);
],
AC_DEFINE(HAVE_TIME_CLOCK_GETTIME,1,[Define to 1 if function 'clock_gettime' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

dnl *****************************************************************
dnl *                                                               *
dnl *                      Checks for macros                        *
dnl *                                                               *
dnl *****************************************************************

AC_MSG_CHECKING(for macro __va_copy() in stdarg.h)
AC_TRY_COMPILE(
[
#include <stdarg.h>
],
[
	va_list	src,dst;

	__va_copy(dst,src);
],
AC_DEFINE(HAVE___VA_COPY,1,[Define to 1 if macro '__va_copy' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for macro __VA_ARGS__)
AC_TRY_COMPILE(
[
#define ZBX_CONST_STRING(str)   str
int test(const char *fmt, ...) { return 0; }
],
[
#define TEST(fmt, ...) test(ZBX_CONST_STRING(fmt), ##__VA_ARGS__)
TEST("%s","test");
TEST("test");
],
AC_DEFINE(HAVE___VA_ARGS__,1,[Define to 1 if macro '__VA_ARGS__' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

dnl *****************************************************************
dnl *                                                               *
dnl *                 Checks for library functions                  *
dnl *                                                               *
dnl *****************************************************************

AC_TYPE_SIGNAL
AC_REPLACE_FUNCS(getloadavg)
AC_CHECK_FUNCS(hstrerror)
AC_CHECK_FUNCS(getenv)
AC_CHECK_FUNCS(putenv)
AC_CHECK_FUNCS(setenv)
AC_CHECK_FUNCS(tzset)
AC_CHECK_FUNCS(unsetenv)
AC_CHECK_FUNCS(sigqueue)
AC_CHECK_FUNCS(round)

dnl *****************************************************************
dnl *                                                               *
dnl *            Checks for file system characteristics             *
dnl *                                                               *
dnl *****************************************************************

AC_MSG_CHECKING(for /proc filesystem)
if test -d /proc; then
	AC_MSG_RESULT(yes)
	AC_DEFINE(HAVE_PROC,1,[Define to 1 if '/proc' file system should be used.])
else
	AC_MSG_RESULT(no)
fi

AC_MSG_CHECKING(for file /proc/stat)
if test -r /proc/stat; then
	AC_MSG_RESULT(yes)
	AC_DEFINE(HAVE_PROC_STAT,1,[Define to 1 if file '/proc/stat' should be used.])
else
	AC_MSG_RESULT(no)
fi

AC_MSG_CHECKING(for file /proc/cpuinfo)
if test -r /proc/cpuinfo; then
	AC_MSG_RESULT(yes)
	AC_DEFINE(HAVE_PROC_CPUINFO,1,[Define to 1 if file '/proc/cpuinfo' should be used.])
else
	AC_MSG_RESULT(no)
fi

dnl Solaris
AC_MSG_CHECKING(for file /proc/0/psinfo)
if test -r /proc/0/psinfo; then
	AC_MSG_RESULT(yes)
	AC_DEFINE(HAVE_PROC_0_PSINFO,1,[Define to 1 if file '/proc/0/psinfo' should be used.])
else
	AC_MSG_RESULT(no)
fi

AC_MSG_CHECKING(for file /proc/loadavg)
if test -r /proc/loadavg; then
	AC_MSG_RESULT(yes)
	AC_DEFINE(HAVE_PROC_LOADAVG,1,[Define to 1 if file '/proc/loadavg' should be used.])
else
	AC_MSG_RESULT(no)
fi

AC_MSG_CHECKING(for file /proc/net/dev)
if test -r /proc/net/dev; then
	AC_MSG_RESULT(yes)
	AC_DEFINE(HAVE_PROC_NET_DEV,1,[Define to 1 if file '/proc/net/dev' should be used.])
else
	AC_MSG_RESULT(no)
fi

dnl *****************************************************************
dnl *                                                               *
dnl *              Checks for compiler characteristics              *
dnl *                                                               *
dnl *****************************************************************

dnl Check for %qu format (FreeBSD 4.x)
dnl FreeBSD 4.x does not support %llu
AC_MSG_CHECKING(for long long format)
AC_TRY_RUN(
[
#include <sys/types.h>
int main()
{
        uint64_t i;

        sscanf("200000000010020", "%qu", &i);

        if (i == 200000000010020) return 0;
        else return -1;
}
],
AC_DEFINE(HAVE_LONG_LONG_QU, 1 ,[Define to 1 if format '%qu' exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no),
AC_MSG_RESULT(no))

dnl option -rdynamic is needed for readable backtraces
AC_MSG_CHECKING(for -rdynamic linking option)
saved_LDFLAGS="$LDFLAGS"
LDFLAGS="-rdynamic $LDFLAGS"
AC_TRY_LINK([#include <execinfo.h>],
[void *bcktrc[6];
(void)backtrace(bcktrc, 6);
],
LDFLAGS="-rdynamic $saved_LDFLAGS"
AC_MSG_RESULT(yes),
LDFLAGS="$saved_LDFLAGS"
AC_MSG_RESULT(no))

dnl *****************************************************************
dnl *                                                               *
dnl *                 Checks for operating systems                  *
dnl *                                                               *
dnl *****************************************************************

AC_MSG_CHECKING(for libperfstat 5.2.0.40 fileset)
AC_TRY_COMPILE([#include <sys/protosw.h>
#include <libperfstat.h>],
[perfstat_memory_total_t	memstats;
memstats.virt_active = 0;
],
AC_DEFINE(HAVE_AIXOSLEVEL_520004,1,[Define to 1 if libperfstat 5.2.0.40 fileset exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

AC_MSG_CHECKING(for libperfstat 5.3.0.60 fileset)
AC_TRY_COMPILE([#include <sys/protosw.h>
#include <libperfstat.h>],
[perfstat_partition_total_t	lparstats;
lparstats.type.b.donate_enabled = 0;
lparstats.idle_donated_purr = 0;
lparstats.busy_donated_purr = 0;
lparstats.idle_stolen_purr = 0;
lparstats.busy_stolen_purr = 0;
],
AC_DEFINE(HAVE_AIXOSLEVEL_530006,1,[Define to 1 if libperfstat 5.3.0.60 fileset exists.])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))

case "$host_os" in
linux*)
	ARCH="linux"
	;;
aix*)
	ARCH="aix"
	;;
darwin*|rhapsody*)
	ARCH="osx"
	AC_DEFINE([MAC_OS_X], 1, [Define to 1 if you are using Mac OS X.])
	;;
*solaris*)
	ARCH="solaris"
	;;
hpux*)
	ARCH="hpux"
	;;
freebsd*)
	ARCH="freebsd"
	;;
netbsd*)
	ARCH="netbsd"
	;;
osf*)
	ARCH="osf"
	;;
openbsd*)
	ARCH="openbsd"
	;;
*)
	ARCH="unknown"
	;;
esac

AC_MSG_CHECKING(for architecture)
AC_MSG_RESULT([$ARCH ($host_os)])

if test "x$ARCH" = "xlinux"; then
	AC_MSG_CHECKING([for the linux kernel version])

	kernel=`uname -r`

	case "${kernel}" in
		2.6.*)
			AC_MSG_RESULT([2.6 family (${kernel})])
			AC_DEFINE([KERNEL_2_6], 1, [Define to 1 if you are using Linux 2.6.x])
			;;
		2.4.*)
			AC_MSG_RESULT([2.4 family (${kernel})])
			AC_DEFINE([KERNEL_2_4], 1, [Define to 1 if you are using Linux 2.4.x])
			;;
		*)
			AC_MSG_RESULT([unknown family (${kernel})])
			;;
	esac
fi

if test "x$ARCH" = "xsolaris"; then
	dnl Forcing a 64-bit application for a 64-bit Solaris
	dnl A 32-bit program that uses /proc is able to look at 32-bit processes,
	dnl but is not able to understand all attributes of a 64-bit process.
	AC_MSG_CHECKING(for -m64 compilation flag)
	saved_CFLAGS="$CFLAGS"
	CFLAGS="-m64"
	AC_TRY_RUN(
	[int main(void) {return 0;}],
	CFLAGS="-m64 $saved_CFLAGS"
	AC_MSG_RESULT(yes),
	CFLAGS="$saved_CFLAGS"
	AC_MSG_RESULT(no))
	CFLAGS="${CFLAGS} -DZBX_OLD_SOLARIS"
fi

if test "x$ARCH" = "xhpux"; then
	dnl Low Level Discovery needs a way to get the list of network
	dnl interfaces available on the monitored system. On HP-UX systems
	dnl that way depends on the OS version.
	hpux_version=${host_os#hpux}
	hpux_major=${hpux_version%.*}
	hpux_minor=${hpux_version#*.}

	AC_DEFINE_UNQUOTED([HPUX_VERSION], $hpux_major$hpux_minor, [Define to HP-UX version])

	dnl This API level is needed so that "utsname.nodename" is not truncated.
	AC_MSG_CHECKING(for -D_HPUX_API_LEVEL=20040821 compilation flag)
	saved_CFLAGS="$CFLAGS"
	CFLAGS="-D_HPUX_API_LEVEL=20040821"
	AC_TRY_RUN(
[
#ifdef HAVE_DLFCN_H
#	include <dlfcn.h>
#endif
#ifdef HAVE_SYS_UTSNAME_H
#	include <sys/utsname.h>
#endif

int main(void)
{
	void		*p1, *p2;
	struct utsname	name;

	/* check that the compiler (e.g., GCC 4.3.0 and above) supports function-level versioning */

	p1 = uname;
	p2 = dlsym(RTLD_DEFAULT, "uname{20040821}");

	if (p1 != p2)
		return 1;

	/* uname() fails with EFAULT on HP-UX systems that were only partially upgraded to this API level */

	return -1 == uname(&name) ? 1 : 0;
}
],
	CFLAGS="-D_HPUX_API_LEVEL=20040821 $saved_CFLAGS"
	AC_MSG_RESULT(yes),
	CFLAGS="$saved_CFLAGS"
	AC_MSG_RESULT(no))
fi

AC_DEFINE_UNQUOTED([ARCH], "${ARCH}", [Define to OS name for code managing])
AC_SUBST(ARCH)

AC_CHECK_SIZEOF([void *])

dnl *****************************************************************
dnl *                                                               *
dnl *         Checks for options given on the command line          *
dnl *                                                               *
dnl *****************************************************************

AC_ARG_ENABLE(static,[  --enable-static         Build statically linked binaries],
[case "${enableval}" in
  yes)
    LDFLAGS="${LDFLAGS} -static"
    AC_MSG_CHECKING(if static linking is possible)
    AC_LINK_IFELSE([AC_LANG_PROGRAM(,)],
      [AC_MSG_RESULT([yes])
        static_linking=yes],
      [AC_MSG_RESULT([no])
        static_linking=no])
      if test "x$static_linking" = "xno"; then
        AC_MSG_ERROR([static linking is not possible on this system])
      fi
    ;;
  no) ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-static]) ;;
esac])

AC_ARG_ENABLE(static-libs,[  --enable-static-libs    Build statically linked binaries with selected libs from default folders],
[case "${enableval}" in
  yes)
    static_linking_libs=yes
    saved_LIBS="$LIBS"
    LIBS="${saved_LIBS} -Wl,-bstatic -Wl,-bdynamic"
    AC_MSG_CHECKING([if libs static linking with "-Wl,-b" is possible])
    AC_LINK_IFELSE([AC_LANG_PROGRAM(,)],
      [AC_MSG_RESULT([yes])
        static_linking_support="-Wl,-b"],
      [AC_MSG_RESULT([no])
        static_linking_support=no])
        LIBS="$saved_LIBS"

    if test "x$static_linking_support" = "xno"; then
      LIBS="${saved_LIBS} -Wl,-Bstatic -Wl,-Bdynamic"
      AC_MSG_CHECKING([if libs static linking with "-Wl,-B" is possible])
      AC_LINK_IFELSE([AC_LANG_PROGRAM(,)],
        [AC_MSG_RESULT([yes])
          static_linking_support="-Wl,-B"],
        [AC_MSG_RESULT([no])
          static_linking_support=no])
          LIBS="$saved_LIBS"
    fi
    ;;
  no) ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-static-libs]) ;;
esac])

AC_ARG_ENABLE(server,[  --enable-server         Turn on build of Zabbix server],
[case "${enableval}" in
  yes) server=yes ;;
  no)  server=no ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-server]) ;;
esac],
[server=no])
AM_CONDITIONAL(SERVER, test "x$server" = "xyes")

AC_ARG_ENABLE(proxy,[  --enable-proxy          Turn on build of Zabbix proxy],
[case "${enableval}" in
  yes) proxy=yes ;;
  no)  proxy=no ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-proxy]) ;;
esac],
[proxy=no])
AM_CONDITIONAL(PROXY, test "x$proxy" = "xyes")

AC_ARG_ENABLE(agent,[  --enable-agent          Turn on build of Zabbix agent and client utilities],
[case "${enableval}" in
  yes) agent=yes ;;
  no)  agent=no ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-agent]) ;;
esac],
[agent=no])
AM_CONDITIONAL(AGENT, test "x$agent" = "xyes")

AC_ARG_ENABLE(agent2,[  --enable-agent2         Turn on build of Zabbix agent 2],
[case "${enableval}" in
  yes) agent2=yes ;;
  no)  agent2=no ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-agent2]) ;;
esac
test "x$agent2" = "xyes" -a "x$HAVE_THREAD_LOCAL" = "xno" && AC_MSG_ERROR([C compiler is not compatible with agent2 assembly])
],
[agent2=no])
AM_CONDITIONAL(AGENT2, test "x$agent2" = "xyes")

AC_ARG_ENABLE(webservice,[  --enable-webservice         Turn on build of Zabbix web service],
[case "${enableval}" in
  yes) webservice=yes ;;
  no)  webservice=no ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-webservice]) ;;
esac
test "x$webservice" = "xyes" -a "x$HAVE_THREAD_LOCAL" = "xno" && AC_MSG_ERROR([C compiler is not compatible with webservice assembly])
],
[webservice=no])
AM_CONDITIONAL(WEBSERVICE, test "x$webservice" = "xyes")

AC_ARG_ENABLE(java,[  --enable-java           Turn on build of Zabbix Java gateway],
[case "${enableval}" in
  yes) java=yes ;;
  no)  java=no ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-java]) ;;
esac],
[java=no])
AM_CONDITIONAL(JAVA, test "x$java" = "xyes")

AC_ARG_ENABLE(ipv6,[  --enable-ipv6           Turn on support of IPv6],
[case "${enableval}" in
  yes) ipv6=yes ;;
  no)  ipv6=no ;;
  *) AC_MSG_ERROR([bad value ${enableval} for --enable-ipv6]) ;;
esac],
[ipv6=no])
AM_CONDITIONAL(IPV6, test "x$ipv6" = "xyes")

AM_CONDITIONAL([DBSCHEMA], [test -d create])

AM_CONDITIONAL([ZBXCMOCKA], [(test -f m4/conf_tests.m4) && (test "x$server" = "xyes" || test "x$proxy" = "xyes" || test "x$agent" = "xyes")])

have_db="no"
have_unixodbc="no"
have_web_monitoring="no"
have_snmp="no"
have_ipmi="no"
have_ipv6="no"
have_ssh="no"
have_tls="no"
have_libmodbus="no"


if test "x$ipv6" = "xyes"; then
	AC_DEFINE(HAVE_IPV6,1,[Define to 1 if IPv6 should be enabled.])
	have_ipv6="yes"
fi

if test "x$server" = "xyes" || test "x$proxy" = "xyes"; then


	dnl Checking for MySQL support
	AX_LIB_MYSQL()
	if test "x$want_mysql" = "xyes"; then
		if test "x$have_db" != "xno"; then
			AC_MSG_ERROR([You can configure for only one database.])
		fi

		if test "x$found_mysql" = "xyes"; then
			have_db="MySQL"
			have_multirow_insert="yes"
		else
			AC_MSG_ERROR([MySQL library not found])
		fi
	fi

	dnl Checking for Oracle support
	AX_LIB_ORACLE_OCI([10.0])
	if test "x$want_oracle_oci" = "xyes"; then
		if test "x$have_db" != "xno"; then
			AC_MSG_ERROR([You can configure for only one database.])
		fi

		if test "x$HAVE_ORACLE_OCI" = "xyes"; then
			have_db="Oracle"

			ORACLE_CPPFLAGS="$ORACLE_OCI_CFLAGS"
			ORACLE_LDFLAGS="$ORACLE_OCI_LDFLAGS"
			ORACLE_LIBS="$ORACLE_OCI_LIBS"

			AC_DEFINE(HAVE_ORACLE,1,[Define to 1 if Oracle should be enabled.])
		else
			AC_MSG_ERROR([Oracle OCI library not found])
		fi
	fi

	dnl Checking for PostgreSQL support
	AX_LIB_POSTGRESQL("9.2")
	if test "x$want_postgresql" = "xyes"; then
		if test "x$have_db" != "xno"; then
			AC_MSG_ERROR([You can configure for only one database.])
		fi

		if test "x$found_postgresql" = "xyes"; then
			if test "$postgresql_version_check" != "1"; then
				AC_MSG_ERROR([PostgreSQL version mismatch])
			fi

			have_db="PostgreSQL"

			if test "$postgresql_version_number" -ge 8002000; then
				have_multirow_insert="yes"
			fi

		else
			AC_MSG_ERROR([PostgreSQL library not found])
		fi
	fi

	dnl Checking for SQLite3 support
	AX_LIB_SQLITE3()
	if test "x$want_sqlite3" = "xyes"; then
		if test "x$server" = "xyes"; then
			AC_MSG_ERROR([SQLite is not supported as a main Zabbix database backend.])
		fi

		if test "x$have_db" != "xno"; then
			AC_MSG_ERROR([You can configure for only one database.])
		fi

		if test "x$found_sqlite3" = "xyes"; then
			have_db="SQLite v3.x"

			saved_CPPFLAGS="$CPPFLAGS"
			saved_LDFLAGS="$LDFLAGS"

			CPPFLAGS="$CPPFLAGS $SQLITE3_CPPFLAGS"
			LDFLAGS="$LDFLAGS $SQLITE3_LDFLAGS $SQLITE3_LIBS"

			AC_MSG_CHECKING([for function sqlite3_open_v2() in sqlite3.h])
			AC_TRY_LINK([#include <sqlite3.h>],
				[sqlite3 *conn = 0;
				sqlite3_open_v2("dbname", &conn, SQLITE_OPEN_READWRITE, 0);
				],
				AC_DEFINE(HAVE_FUNCTION_SQLITE3_OPEN_V2,1,[Define to 1 if function 'sqlite3_open_v2' exists.])
				AC_MSG_RESULT(yes),
				AC_MSG_RESULT(no))

			CPPFLAGS="$saved_CPPFLAGS"
			LDFLAGS="$saved_LDFLAGS"
		else
			AC_MSG_ERROR([SQLite3 library not found])
		fi
	fi

	AC_MSG_CHECKING(for Zabbix server/proxy database selection)
	if test "x$have_db" = "xno"; then
		AC_MSG_RESULT(error)
		AC_MSG_ERROR([No database selected for Zabbix server/proxy. Use --with-mysql or --with-oracle or --with-postgresql or --with-sqlite3.])
	else
		AC_MSG_RESULT(ok)
	fi

	AC_MSG_CHECKING(for multirow insert statements)
	if test "x$have_multirow_insert" = "xyes"; then
		AC_DEFINE(HAVE_MULTIROW_INSERT,1,[Define to 1 if database supports multirow insert statements.])
		AC_MSG_RESULT(yes)
	else
		AC_MSG_RESULT(no)
	fi

	DB_CFLAGS="$MYSQL_CFLAGS $ORACLE_CPPFLAGS $POSTGRESQL_CFLAGS $SQLITE3_CPPFLAGS"
	DB_LDFLAGS="$MYSQL_LDFLAGS $ORACLE_LDFLAGS $POSTGRESQL_LDFLAGS $SQLITE3_LDFLAGS"
	DB_LIBS="$MYSQL_LIBS $ORACLE_LIBS $POSTGRESQL_LIBS $SQLITE3_LIBS"

	AC_SUBST(DB_CFLAGS)
	AC_SUBST(DB_LDFLAGS)
	AC_SUBST(DB_LIBS)

	SERVER_LDFLAGS="${SERVER_LDFLAGS} ${DB_LDFLAGS}"
	SERVER_LIBS="${SERVER_LIBS} ${DB_LIBS}"

	PROXY_LDFLAGS="${PROXY_LDFLAGS} ${DB_LDFLAGS}"
	PROXY_LIBS="${PROXY_LIBS} ${DB_LIBS}"

	dnl Check for LIBXML2 [by default - skip]
	LIBXML2_CHECK_CONFIG([no])
	if test "x$want_libxml2" = "xyes"; then
		if test "x$found_libxml2" != "xyes"; then
			AC_MSG_ERROR([LIBXML2 library not found])
		else
			have_libxml2="yes"
		fi
	fi
	
	LDFLAGS="$LDFLAGS $LIBXML2_LDFLAGS"
	LIBS="$LIBS $LIBXML2_LIBS"

	AC_SUBST(LIBXML2_CFLAGS)

	dnl Checking for unixODBC support
	LIBUNIXODBC_CHECK_CONFIG([no])
	if test "x$want_unixodbc" = "xyes"; then
		if test "x$unixodbc_error" != "x"; then
			AC_MSG_ERROR($unixodbc_error)
		fi
		have_unixodbc="yes"
	fi
	SERVER_LDFLAGS="$SERVER_LDFLAGS $UNIXODBC_LDFLAGS"
	SERVER_LIBS="$SERVER_LIBS $UNIXODBC_LIBS"

	PROXY_LDFLAGS="$PROXY_LDFLAGS $UNIXODBC_LDFLAGS"
	PROXY_LIBS="$PROXY_LIBS $UNIXODBC_LIBS"

	AC_SUBST(UNIXODBC_CFLAGS)

	dnl Check for Net-SNMP [by default - skip]
	LIBNETSNMP_CHECK_CONFIG([no], "5.3.0")

	if test "x$want_netsnmp" = "xyes"; then
		if test "x$found_netsnmp" != "xyes"; then
			AC_MSG_ERROR([Invalid Net-SNMP directory - unable to find net-snmp-config])
		else
			have_snmp="yes"
		fi
	fi
	SERVER_LDFLAGS="$SNMP_LDFLAGS $SERVER_LDFLAGS"
	SERVER_LIBS="$SERVER_LIBS $SNMP_LIBS"

	PROXY_LDFLAGS="$SNMP_LDFLAGS $PROXY_LDFLAGS"
	PROXY_LIBS="$PROXY_LIBS $SNMP_LIBS"


	AC_SUBST(SNMP_CFLAGS)

	dnl Check for LIBSSH2 [by default - skip] at least of version 1.0.0.
	LIBSSH2_CHECK_CONFIG([no])
	LIBSSH_CHECK_CONFIG([no])
	if test "x$want_ssh2" = "xyes"; then
		if test "x$want_ssh" != "xno"; then
			AC_MSG_ERROR([You can configure for only one SSH library (--with-ssh or --with-ssh2).])
		fi

		if test "x$found_ssh2" != "xyes"; then
			AC_MSG_ERROR([SSH2 library not found])
		elif test "x$accept_ssh2_version" != "xyes"; then
			AC_MSG_ERROR([SSH2 library version requirement not met (>= 1.0.0)])
		else
			have_ssh="yes (libssh2)"
		fi
	fi
	SERVER_LDFLAGS="$SERVER_LDFLAGS $SSH2_LDFLAGS"
	SERVER_LIBS="$SERVER_LIBS $SSH2_LIBS"

	PROXY_LDFLAGS="$PROXY_LDFLAGS $SSH2_LDFLAGS"
	PROXY_LIBS="$PROXY_LIBS $SSH2_LIBS"
	
	AC_SUBST(SSH2_CFLAGS)

	dnl Check for LIBSSH [by default - skip] at least of version 0.7.0.
	if test "x$want_ssh" = "xyes"; then
		if test "x$found_ssh" != "xyes"; then
			AC_MSG_ERROR([SSH library not found])
		elif test "x$accept_ssh_version" != "xyes"; then
			AC_MSG_ERROR([SSH library version requirement not met (>= 0.6.0)])
		else
			have_ssh="yes (libssh)"
		fi
	fi
	SERVER_LDFLAGS="$SERVER_LDFLAGS $SSH_LDFLAGS"
	SERVER_LIBS="$SERVER_LIBS $SSH_LIBS"

	PROXY_LDFLAGS="$PROXY_LDFLAGS $SSH_LDFLAGS"
	PROXY_LIBS="$PROXY_LIBS $SSH_LIBS"
	
	AC_SUBST(SSH_CFLAGS)

	found_openipmi="no"
	dnl Check for libOpenIPMI [by default - skip]
	LIBOPENIPMI_CHECK_CONFIG([no])
	if test "x$want_openipmi" = "xyes"; then
		if test "x$found_openipmi" != "xyes"; then
			AC_MSG_ERROR([Invalid OPENIPMI directory - unable to find ipmiif.h])
		else
			have_ipmi="yes"
		fi
	fi

	SERVER_LDFLAGS="$SERVER_LDFLAGS $OPENIPMI_LDFLAGS"
	SERVER_LIBS="$SERVER_LIBS $OPENIPMI_LIBS"

	PROXY_LDFLAGS="$PROXY_LDFLAGS $OPENIPMI_LDFLAGS"
	PROXY_LIBS="$PROXY_LIBS $OPENIPMI_LIBS"

	AC_SUBST(OPENIPMI_CFLAGS)

	dnl Check for zlib, used by Zabbix server-proxy communications
	ZLIB_CHECK_CONFIG([no])
	if test "x$found_zlib" != "xyes"; then
		AC_MSG_ERROR([Unable to use zlib (zlib check failed)])
	fi

	AC_SUBST(ZLIB_CFLAGS)

	dnl Check for 'libpthread' library that supports PTHREAD_PROCESS_SHARED flag
	LIBPTHREAD_CHECK_CONFIG([no])
	if test "x$found_libpthread" != "xyes"; then
		AC_MSG_ERROR([Unable to use libpthread (libpthread check failed)])
	fi
fi

SERVER_LDFLAGS="$SERVER_LDFLAGS $ZLIB_LDFLAGS $LIBPTHREAD_LDFLAGS"
SERVER_LIBS="$SERVER_LIBS $ZLIB_LIBS $LIBPTHREAD_LIBS"

PROXY_LDFLAGS="$PROXY_LDFLAGS $ZLIB_LDFLAGS $LIBPTHREAD_LDFLAGS"
PROXY_LIBS="$PROXY_LIBS $ZLIB_LIBS $LIBPTHREAD_LIBS"

AGENT_LDFLAGS="$AGENT_LDFLAGS $ZLIB_LDFLAGS $LIBPTHREAD_LDFLAGS"
AGENT_LIBS="$AGENT_LIBS $ZLIB_LIBS $LIBPTHREAD_LIBS"

AGENT2_LDFLAGS="$AGENT2_LDFLAGS $ZLIB_LDFLAGS $LIBPTHREAD_LDFLAGS"
AGENT2_LIBS="$AGENT2_LIBS $ZLIB_LIBS $LIBPTHREAD_LIBS"

ZBXGET_LDFLAGS="$ZBXGET_LDFLAGS $ZLIB_LDFLAGS $LIBPTHREAD_LDFLAGS"
ZBXGET_LIBS="$ZBXGET_LIBS $ZLIB_LIBS $LIBPTHREAD_LIBS"

SENDER_LDFLAGS="$SENDER_LDFLAGS $ZLIB_LDFLAGS $LIBPTHREAD_LDFLAGS"
SENDER_LIBS="$SENDER_LIBS $ZLIB_LIBS $LIBPTHREAD_LIBS"

ZBXJS_LDFLAGS="$ZBXJS_LDFLAGS $ZLIB_LDFLAGS $LIBPTHREAD_LDFLAGS"
ZBXJS_LIBS="$ZBXJS_LIBS $ZLIB_LIBS $LIBPTHREAD_LIBS"

AM_CONDITIONAL(HAVE_IPMI, [test "x$have_ipmi" = "xyes"])
AM_CONDITIONAL(HAVE_LIBXML2, test "x$have_libxml2" = "xyes")

dnl Check if Zabbix internal IPC services are used
have_ipcservice="no"
if test "x$have_ipmi" = "xyes"; then
	have_ipcservice="yes"
fi

if test "x$server" = "xyes"; then
	have_ipcservice="yes"
fi

if test "x$proxy" = "xyes"; then
	have_ipcservice="yes"
fi

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

dnl Check for libevent, used by Zabbix IPC services
if test "x$have_ipcservice" = "xyes"; then
	AC_DEFINE([HAVE_IPCSERVICE], 1, [Define to 1 if Zabbix IPC services are used])

	LIBEVENT_CHECK_CONFIG([no])
	if test "x$found_libevent" != "xyes"; then
		AC_MSG_ERROR([Unable to use libevent (libevent check failed)])
	fi

	SERVER_LDFLAGS="$SERVER_LDFLAGS $LIBEVENT_LDFLAGS"
	SERVER_LIBS="$SERVER_LIBS $LIBEVENT_LIBS"

	PROXY_LDFLAGS="$PROXY_LDFLAGS $LIBEVENT_LDFLAGS"
	PROXY_LIBS="$PROXY_LIBS $LIBEVENT_LIBS"
fi

dnl Check for GnuTLS libgnutls [by default - skip]
LIBGNUTLS_CHECK_CONFIG([no])
if test "x$want_gnutls" = "xyes"; then
	if test "x$have_tls" != "xno"; then
		AC_MSG_ERROR([You can configure for only one TLS library (--with-gnutls or --with-openssl).])
	fi

	if test "x$found_gnutls" != "xyes"; then
		AC_MSG_ERROR([GnuTLS library libgnutls not found])
	elif test "x$accept_gnutls_version" != "xyes"; then
		AC_MSG_ERROR([GnuTLS library version requirement not met (>= 3.1.18)])
	else
		have_tls="GnuTLS"
	fi
	TLS_CFLAGS="$GNUTLS_CFLAGS"
	TLS_LDFLAGS="$GNUTLS_LDFLAGS"
	TLS_LIBS="$GNUTLS_LIBS"
fi

dnl Check for OpenSSL libssl and libcrypto [by default - skip]
LIBOPENSSL_CHECK_CONFIG([no])
if test "x$want_openssl" = "xyes"; then
	if test "x$have_tls" != "xno"; then
		AC_MSG_ERROR([You can configure for only one TLS library (--with-gnutls or --with-openssl).])
	fi

	if test "x$found_openssl" != "xOpenSSL" -a "x$found_openssl" != "xOpenSSL (PSK not supported)"; then
		AC_MSG_ERROR([OpenSSL library libssl or libcrypto not found])
	elif test "x$accept_openssl_version" != "xyes"; then
		AC_MSG_ERROR([OpenSSL library version requirement not met (>= 1.0.1)])
	else
		have_tls=$found_openssl
	fi
	TLS_CFLAGS="$OPENSSL_CFLAGS"
	TLS_LDFLAGS="$OPENSSL_LDFLAGS"
	TLS_LIBS="$OPENSSL_LIBS"
fi
AC_SUBST(TLS_CFLAGS)

SERVER_LDFLAGS="$SERVER_LDFLAGS $TLS_LDFLAGS"
SERVER_LIBS="$SERVER_LIBS $TLS_LIBS"

PROXY_LDFLAGS="$PROXY_LDFLAGS $TLS_LDFLAGS"
PROXY_LIBS="$PROXY_LIBS $TLS_LIBS"

AGENT_LDFLAGS="$AGENT_LDFLAGS $TLS_LDFLAGS"
AGENT_LIBS="$AGENT_LIBS $TLS_LIBS"

AGENT2_LDFLAGS="$AGENT2_LDFLAGS $TLS_LDFLAGS"
AGENT2_LIBS="$AGENT2_LIBS $TLS_LIBS"

ZBXGET_LDFLAGS="$ZBXGET_LDFLAGS $TLS_LDFLAGS"
ZBXGET_LIBS="$ZBXGET_LIBS $TLS_LIBS"

SENDER_LDFLAGS="$SENDER_LDFLAGS $TLS_LDFLAGS"
SENDER_LIBS="$SENDER_LIBS $TLS_LIBS"

ZBXJS_LDFLAGS="$ZLIB_LDFLAGS $TLS_LDFLAGS"
ZBXJS_LIBS="$ZBXJS_LIBS $TLS_LIBS"

dnl Check for libmodbus [by default - skip]
if test "x$agent" = "xyes"; then
	LIBMODBUS_CHECK_CONFIG([3.0.0])
	if test "x$want_libmodbus" = "xyes"; then
		if test "x$found_libmodbus" = "xyes"; then
			have_libmodbus="yes"
		fi
	fi
	LDFLAGS="$LDFLAGS $LIBMODBUS_LDFLAGS"
	CFLAGS="$CFLAGS $LIBMODBUS_CFLAGS"
	LIBS="$LIBS $LIBMODBUS_LIBS"
fi
AM_CONDITIONAL(HAVE_LIBMODBUS, [test "x$have_libmodbus" = "xyes"])

if test "x$agent2" = "xyes"; then
	AC_CHECK_PROGS([GO], [go], [no])
	if test "x$GO" = "xno"; then
		AC_MSG_ERROR([Unable to find "go" executable in path])
	fi
	AC_DEFINE(ZBX_BUILD_AGENT2,1,[Define to 1 if Agent2 is being built.])
fi

if test "x$webservice" = "xyes"; then
	AC_CHECK_PROGS([GO], [go], [no])
	if test "x$GO" = "xno"; then
		AC_MSG_ERROR([Unable to find "go" executable in path])
	fi
	AC_DEFINE(ZBX_BUILD_WEBSERVICE,1,[Define to 1 if Web Service is being built.])
fi

if test "x$java" = "xyes"; then
	AC_CHECK_PROGS([JAVAC], [javac], [no])
	if test "x$JAVAC" = "xno"; then
		AC_MSG_ERROR([Unable to find "javac" executable in path])
	fi
	AC_CHECK_PROGS([JAR], [jar], [no])
	if test "x$JAR" = "xno"; then
		AC_MSG_ERROR([Unable to find "jar" executable in path])
	fi
fi

found_ldap="no"
dnl Check for libLDAP [by default - skip]
LIBLDAP_CHECK_CONFIG([no])
if test "x$want_ldap" = "xyes"; then
	if test "x$found_ldap" != "xyes"; then
		AC_MSG_ERROR([Invalid LDAP directory - unable to find ldap.h])
	fi
fi
SERVER_LDFLAGS="$SERVER_LDFLAGS $LDAP_LDFLAGS"
SERVER_LIBS="$SERVER_LIBS $LDAP_LIBS"

PROXY_LDFLAGS="$PROXY_LDFLAGS $LDAP_LDFLAGS"
PROXY_LIBS="$PROXY_LIBS $LDAP_LIBS"

AGENT_LDFLAGS="$AGENT_LDFLAGS $LDAP_LDFLAGS"
AGENT_LIBS="$AGENT_LIBS $LDAP_LIBS"

AC_SUBST(LDAP_CPPFLAGS)

found_curl="no"
dnl Checking for libCurl [by default - skip]
LIBCURL_CHECK_CONFIG(, [7.13.1], [],[])
if test "x$want_curl" = "xyes"; then
	if test "x$found_curl" != "xyes"; then
		AC_MSG_ERROR([Curl library not found])
	fi
fi
if test "x$found_curl" = "xyes"; then
	have_web_monitoring="cURL"
fi
CFLAGS="$LIBCURL_CFLAGS $CFLAGS"

SERVER_LDFLAGS="$SERVER_LDFLAGS $LIBCURL_LDFLAGS"
SERVER_LIBS="$SERVER_LIBS $LIBCURL_LIBS"

PROXY_LDFLAGS="$PROXY_LDFLAGS $LIBCURL_LDFLAGS"
PROXY_LIBS="$PROXY_LIBS $LIBCURL_LIBS"

AM_CONDITIONAL(HAVE_LIBCURL, test "x$found_curl" = "xyes")

dnl Starting from 2.0 agent can do web monitoring
AGENT_LDFLAGS="$AGENT_LDFLAGS $LIBCURL_LDFLAGS"
AGENT_LIBS="$AGENT_LIBS $LIBCURL_LIBS"

ZBXGET_LDFLAGS="$ZBXGET_LDFLAGS $ZLIB_LDFLAGS $LIBPTHREAD_LDFLAGS"
ZBXGET_LIBS="$ZBXGET_LIBS $ZLIB_LIBS $LIBPTHREAD_LIBS"

SENDER_LDFLAGS="$SENDER_LDFLAGS $ZLIB_LDFLAGS $LIBPTHREAD_LDFLAGS"
SENDER_LIBS="$SENDER_LIBS $ZLIB_LIBS $LIBPTHREAD_LIBS"

ZBXJS_LDFLAGS="$ZBXJS_LDFLAGS $LIBCURL_LDFLAGS"
ZBXJS_LIBS="$ZBXJS_LIBS $LIBCURL_LIBS"

if test "x$server" = "xyes" || test "x$proxy" = "xyes" || test "x$agent" = "xyes" || test "x$agent2" = "xyes"; then
dnl Check for libpcre or libpcre2, used by Zabbix for regular expressions
dnl Must check for both pcre and pcre2 to check if both were selected by the user and produce an error in that case
LIBPCRE_CHECK_CONFIG([no])
if test "x$enable_static_libs" != "xyes" || test "x$found_libpcre" != "xyes"; then
LIBPCRE2_CHECK_CONFIG([no])
fi
if test "x$want_libpcre2" = "xyes"; then
	if test "x$want_libpcre" = "xyes"; then
		AC_MSG_ERROR([Cannot use both pcre and pcre2 at the same time!])
	fi

	if test "x$found_libpcre2" != "xyes"; then
		AC_MSG_ERROR([Unable to use libpcre2 (libpcre2 check failed)])
	fi

	CFLAGS="$CFLAGS $LIBPCRE2_CFLAGS"
	LDFLAGS="$LDFLAGS $LIBPCRE2_LDFLAGS"
	if test "x$ARCH" = "xosx"; then
		LIBS="$LIBPCRE2_LIBS $LIBS"
	else
		LIBS="$LIBS $LIBPCRE2_LIBS"
	fi

	AC_DEFINE([HAVE_PCRE2_H], 1, [Define to 1 if you have the 'libpcre2' library (-lpcre2-8)])
	have_pcre2=1
else
	if test "x$found_libpcre" != "xyes"; then
		AC_MSG_ERROR([Unable to use libpcre (libpcre check failed)])
	fi

	CFLAGS="$CFLAGS $LIBPCRE_CFLAGS"
	LDFLAGS="$LDFLAGS $LIBPCRE_LDFLAGS"
	if test "x$ARCH" = "xosx"; then
		LIBS="$LIBPCRE_LIBS $LIBS"
	else
		LIBS="$LIBS $LIBPCRE_LIBS"
	fi

	AC_DEFINE([HAVE_PCRE_H], 1, [Define to 1 if you have the 'libpcre' library (-lpcre)])
	have_pcre=1
fi
fi

AM_CONDITIONAL([HAVE_PCRE], [test "x$have_pcre" = "x1"])
AM_CONDITIONAL([HAVE_PCRE2], [test "x$have_pcre2" = "x1"])

found_iconv="no"
dnl Check for libiconv [by default - skip]
LIBICONV_CHECK_CONFIG([no])
if test "x$found_iconv" != "xyes"; then
	AC_MSG_ERROR([Unable to use iconv (libiconv check failed)])
fi
LDFLAGS="$LDFLAGS $ICONV_LDFLAGS"
LIBS="$LIBS $ICONV_LIBS"

RANLIB="ranlib"
AC_SUBST(RANLIB)

SERVER_CONFIG_FILE="${sysconfdir}/zabbix_server.conf"
PROXY_CONFIG_FILE="${sysconfdir}/zabbix_proxy.conf"
AGENT_CONFIG_FILE="${sysconfdir}/zabbix_agentd.conf"
AGENT2_CONFIG_FILE="${sysconfdir}/zabbix_agent2.conf"
AGENT2_CONFIG_PATH="${sysconfdir}/zabbix_agent2.d"
AGENT2_CONFIG_PLUGINS_PATH="${AGENT2_CONFIG_PATH}/plugins.d"
WEBSERVICE_CONFIG_FILE="${sysconfdir}/zabbix_web_service.conf"

EXTERNAL_SCRIPTS_PATH="${datadir}/zabbix/externalscripts"
ALERT_SCRIPTS_PATH="${datadir}/zabbix/alertscripts"

CURL_SSL_CERT_LOCATION="${datadir}/zabbix/ssl/certs"
CURL_SSL_KEY_LOCATION="${datadir}/zabbix/ssl/keys"

LOAD_MODULE_PATH="${libdir}/modules"

AC_SUBST(SERVER_LDFLAGS)
AC_SUBST(SERVER_LIBS)

AC_SUBST(PROXY_LDFLAGS)
AC_SUBST(PROXY_LIBS)

AC_SUBST(AGENT_LDFLAGS)
AC_SUBST(AGENT_LIBS)

AC_SUBST(AGENT2_LDFLAGS)
AC_SUBST(AGENT2_LIBS)

if test "x$HAVE_START_GROUP" = "xyes"; then
	LD_START_GROUP=-Wl,--start-group
	LD_END_GROUP=-Wl,--end-group
fi

if test "x$agent2" = "xyes"; then
	CGO_CFLAGS="$TLS_CFLAGS $LIBPCRE_CFLAGS $LIBPCRE2_CFLAGS"
	CGO_LDFLAGS="$AGENT2_LDFLAGS $LD_START_GROUP \
		\${abs_top_builddir}/src/zabbix_agent/logfiles/libzbxlogfiles.a \
		\${abs_top_builddir}/src/libs/zbxalgo/libzbxalgo.a \
		\${abs_top_builddir}/src/libs/zbxcommon/libzbxcommon.a \
		\${abs_top_builddir}/src/libs/zbxhash/libzbxhash.a \
		\${abs_top_builddir}/src/libs/zbxcomms/libzbxcomms.a \
		\${abs_top_builddir}/src/libs/zbxcompress/libzbxcompress.a \
		\${abs_top_builddir}/src/libs/zbxconf/libzbxconf.a \
		\${abs_top_builddir}/src/libs/zbxcrypto/libzbxcrypto.a \
		\${abs_top_builddir}/src/libs/zbxexec/libzbxexec.a \
		\${abs_top_builddir}/src/libs/zbxhttp/libzbxhttp.a \
		\${abs_top_builddir}/src/libs/zbxjson/libzbxjson.a \
		\${abs_top_builddir}/src/libs/zbxvariant/libzbxvariant.a \
		\${abs_top_builddir}/src/libs/zbxnix/libzbxnix.a \
		\${abs_top_builddir}/src/libs/zbxregexp/libzbxregexp.a \
		\${abs_top_builddir}/src/libs/zbxthreads/libzbxthreads.a \
		\${abs_top_builddir}/src/libs/zbxmutexs/libzbxmutexs.a \
		\${abs_top_builddir}/src/libs/zbxsysinfo/"$ARCH"/libspechostnamesysinfo.a \
		\${abs_top_builddir}/src/libs/zbxsysinfo/"$ARCH"/libspecsysinfo.a \
		\${abs_top_builddir}/src/libs/zbxsysinfo/common/libcommonsysinfo.a \
		\${abs_top_builddir}/src/libs/zbxsysinfo/libzbxagent2sysinfo.a \
		\${abs_top_builddir}/src/libs/zbxsysinfo/simple/libsimplesysinfo.a \
		\${abs_top_builddir}/src/libs/zbxsysinfo/alias/libalias.a \
		\${abs_top_builddir}/src/libs/zbxxml/libzbxxml.a \
		$LIBS $AGENT2_LIBS $LD_END_GROUP"

	AC_SUBST(CGO_CFLAGS)
	AC_SUBST(CGO_LDFLAGS)
fi

AC_SUBST(ZBXGET_LDFLAGS)
AC_SUBST(ZBXGET_LIBS)

AC_SUBST(SENDER_LDFLAGS)
AC_SUBST(SENDER_LIBS)

AC_SUBST(ZBXJS_LDFLAGS)
AC_SUBST(ZBXJS_LIBS)

AC_SUBST(SERVER_CONFIG_FILE)
AC_SUBST(PROXY_CONFIG_FILE)
AC_SUBST(AGENT_CONFIG_FILE)
AC_SUBST(AGENT2_CONFIG_FILE)
AC_SUBST(AGENT2_CONFIG_PATH)
AC_SUBST(AGENT2_CONFIG_PLUGINS_PATH)
AC_SUBST(WEBSERVICE_CONFIG_FILE)

AC_SUBST(EXTERNAL_SCRIPTS_PATH)
AC_SUBST(ALERT_SCRIPTS_PATH)

AC_SUBST(CURL_SSL_CERT_LOCATION)
AC_SUBST(CURL_SSL_KEY_LOCATION)

AC_SUBST(LOAD_MODULE_PATH)

GOBIN=${sbindir}
GOCMD=go
GOWORKDIR=$ac_abs_confdir/go/src/zabbix

export GOBIN=${GOBIN}
AC_SUBST(GOBIN)
AC_SUBST(GOCMD)
AC_SUBST(GOWORKDIR)

dnl *****************************************************************
dnl *                                                               *
dnl *                         Other checks                          *
dnl *                                                               *
dnl *****************************************************************

dnl Automake 1.8 to 1.9.6 sets mkdir_p macro (lower-cased).
AC_MSG_CHECKING(for mkdir -p candidate)
if test "x${MKDIR_P}" = "x"; then
        if test "x${mkdir_p}" = "x"; then
                AC_MSG_ERROR([No suitable "mkdir -p" candidate found.])
        fi
        AC_SUBST([MKDIR_P], ${mkdir_p})
fi
AC_MSG_RESULT([ok (${MKDIR_P})])

dnl Check if process statistics collector should be enabled
case "x$ARCH" in
	xlinux|xsolaris)
		AC_DEFINE(ZBX_PROCSTAT_COLLECTOR, 1 , [Define to 1 on linux and solaris platforms])
		;;
esac

dnl *****************************************************************
dnl *                                                               *
dnl *                 Output configuration results                  *
dnl *                                                               *
dnl *****************************************************************

m4_ifdef([CONF_TESTS],[CONF_TESTS])

AC_OUTPUT([
	Makefile
	include/Makefile
	database/Makefile
	database/mysql/Makefile
	database/oracle/Makefile
	database/postgresql/Makefile
	database/sqlite3/Makefile
	misc/Makefile
	src/Makefile
	src/go/Makefile
	src/libs/Makefile
	src/libs/zbxlog/Makefile
	src/libs/zbxalgo/Makefile
	src/libs/zbxshmem/Makefile
	src/libs/zbxhash/Makefile
	src/libs/zbxcrypto/Makefile
	src/libs/zbxconf/Makefile
	src/libs/zbxdbcache/Makefile
	src/libs/zbxdbhigh/Makefile
	src/libs/zbxgetopt/Makefile
	src/libs/zbxmedia/Makefile
	src/libs/zbxsysinfo/Makefile
	src/libs/zbxcommon/Makefile
	src/libs/zbxsysinfo/agent/Makefile
	src/libs/zbxsysinfo/alias/Makefile
	src/libs/zbxsysinfo/common/Makefile
	src/libs/zbxsysinfo/simple/Makefile
	src/libs/zbxsysinfo/linux/Makefile
	src/libs/zbxsysinfo/aix/Makefile
	src/libs/zbxsysinfo/freebsd/Makefile
	src/libs/zbxsysinfo/hpux/Makefile
	src/libs/zbxsysinfo/openbsd/Makefile
	src/libs/zbxsysinfo/osx/Makefile
	src/libs/zbxsysinfo/solaris/Makefile
	src/libs/zbxsysinfo/osf/Makefile
	src/libs/zbxsysinfo/netbsd/Makefile
	src/libs/zbxsysinfo/unknown/Makefile
	src/libs/zbxnix/Makefile
	src/libs/zbxthreads/Makefile
	src/libs/zbxmutexs/Makefile
	src/libs/zbxcomms/Makefile
	src/libs/zbxcommshigh/Makefile
	src/libs/zbxdiscovery/Makefile
	src/libs/zbxdb/Makefile
	src/libs/zbxdbupgrade/Makefile
	src/libs/zbxdbschema/Makefile
	src/libs/zbxjson/Makefile
	src/libs/zbxhttp/Makefile
	src/libs/zbxserver/Makefile
	src/libs/zbxicmpping/Makefile
	src/libs/zbxeval/Makefile
	src/libs/zbxserialize/Makefile
	src/libs/zbxexec/Makefile
	src/libs/zbxself/Makefile
	src/libs/zbxmodules/Makefile
	src/libs/zbxregexp/Makefile
	src/libs/zbxtasks/Makefile
	src/libs/zbxipcservice/Makefile
	src/libs/zbxhistory/Makefile
	src/libs/zbxcompress/Makefile
	src/libs/zbxembed/Makefile
	src/libs/zbxexport/Makefile
	src/libs/zbxprometheus/Makefile
	src/libs/zbxvault/Makefile
	src/libs/zbxhashicorp/Makefile
	src/libs/zbxcyberark/Makefile
	src/libs/zbxkvs/Makefile
	src/libs/zbxdiag/Makefile
	src/libs/zbxtrends/Makefile
	src/libs/zbxavailability/Makefile
	src/libs/zbxaudit/Makefile
	src/libs/zbxservice/Makefile
	src/libs/zbxxml/Makefile
	src/libs/zbxha/Makefile
	src/libs/zbxrtc/Makefile
	src/libs/zbxvariant/Makefile
	src/zabbix_agent/Makefile
	src/zabbix_agent/logfiles/Makefile
	src/zabbix_get/Makefile
	src/zabbix_js/Makefile
	src/zabbix_sender/Makefile
	src/zabbix_server/Makefile
	src/zabbix_server/alerter/Makefile
	src/zabbix_server/dbsyncer/Makefile
	src/zabbix_server/dbconfig/Makefile
	src/zabbix_server/diag/Makefile
	src/zabbix_server/discoverer/Makefile
	src/zabbix_server/ha/Makefile
	src/zabbix_server/housekeeper/Makefile
	src/zabbix_server/httppoller/Makefile
	src/zabbix_server/pinger/Makefile
	src/zabbix_server/poller/Makefile
	src/zabbix_server/snmptrapper/Makefile
	src/zabbix_server/timer/Makefile
	src/zabbix_server/trapper/Makefile
	src/zabbix_server/escalator/Makefile
	src/zabbix_server/proxypoller/Makefile
	src/zabbix_server/selfmon/Makefile
	src/zabbix_server/stats/Makefile
	src/zabbix_server/vmware/Makefile
	src/zabbix_server/taskmanager/Makefile
	src/zabbix_server/ipmi/Makefile
	src/zabbix_server/odbc/Makefile
	src/zabbix_server/scripts/Makefile
	src/zabbix_server/preprocessor/Makefile
	src/zabbix_server/availability/Makefile
	src/zabbix_server/service/Makefile
	src/zabbix_server/lld/Makefile
	src/zabbix_server/reporter/Makefile
	src/zabbix_proxy/Makefile
	src/zabbix_proxy/diag/Makefile
	src/zabbix_proxy/heart/Makefile
	src/zabbix_proxy/housekeeper/Makefile
	src/zabbix_proxy/proxyconfig/Makefile
	src/zabbix_proxy/datasender/Makefile
	src/zabbix_proxy/stats/Makefile
	src/zabbix_proxy/taskmanager/Makefile
	src/zabbix_java/Makefile
	man/Makefile
	])

dnl The following variables use autoconf variables such as
dnl ${sysconfdir} and ${datadir} . Which in turn contain
dnl variables such as ${prefix}. In order to completely
dnl substitute all variables and output end-value in
dnl Configuration output below it is required to perform 2
dnl substitutions.

SERVER_CONFIG_FILE=`eval echo "${SERVER_CONFIG_FILE}"`
SERVER_CONFIG_FILE=`eval echo "${SERVER_CONFIG_FILE}"`

PROXY_CONFIG_FILE=`eval echo "${PROXY_CONFIG_FILE}"`
PROXY_CONFIG_FILE=`eval echo "${PROXY_CONFIG_FILE}"`

AGENT_CONFIG_FILE=`eval echo "${AGENT_CONFIG_FILE}"`
AGENT_CONFIG_FILE=`eval echo "${AGENT_CONFIG_FILE}"`

AGENT2_CONFIG_FILE=`eval echo "${AGENT2_CONFIG_FILE}"`
AGENT2_CONFIG_FILE=`eval echo "${AGENT2_CONFIG_FILE}"`

AGENT2_CONFIG_PATH=`eval echo "${AGENT2_CONFIG_PATH}"`
AGENT2_CONFIG_PATH=`eval echo "${AGENT2_CONFIG_PATH}"`

AGENT2_CONFIG_PLUGINS_PATH=`eval echo "${AGENT2_CONFIG_PLUGINS_PATH}"`
AGENT2_CONFIG_PLUGINS_PATH=`eval echo "${AGENT2_CONFIG_PLUGINS_PATH}"`

WEBSERVICE_CONFIG_FILE=`eval echo "${WEBSERVICE_CONFIG_FILE}"`
WEBSERVICE_CONFIG_FILE=`eval echo "${WEBSERVICE_CONFIG_FILE}"`

EXTERNAL_SCRIPTS_PATH=`eval echo "${EXTERNAL_SCRIPTS_PATH}"`
EXTERNAL_SCRIPTS_PATH=`eval echo "${EXTERNAL_SCRIPTS_PATH}"`

ALERT_SCRIPTS_PATH=`eval echo "${ALERT_SCRIPTS_PATH}"`
ALERT_SCRIPTS_PATH=`eval echo "${ALERT_SCRIPTS_PATH}"`

CURL_SSL_CERT_LOCATION=`eval echo "${CURL_SSL_CERT_LOCATION}"`
CURL_SSL_CERT_LOCATION=`eval echo "${CURL_SSL_CERT_LOCATION}"`

CURL_SSL_KEY_LOCATION=`eval echo "${CURL_SSL_KEY_LOCATION}"`
CURL_SSL_KEY_LOCATION=`eval echo "${CURL_SSL_KEY_LOCATION}"`

LOAD_MODULE_PATH=`eval echo "${LOAD_MODULE_PATH}"`
LOAD_MODULE_PATH=`eval echo "${LOAD_MODULE_PATH}"`

echo "

Configuration:

  Detected OS:           ${host_os}
  Install path:          ${prefix}
  Compilation arch:      ${ARCH}

  Compiler:              ${CC}
  Compiler flags:        ${CFLAGS}

  Library-specific flags:"

if test "x$DB_CFLAGS" != "x"; then
	echo "    database:              ${DB_CFLAGS}"
fi

if test "x$LIBXML2_CFLAGS" != "x"; then
	echo "    libXML2:               ${LIBXML2_CFLAGS}"
fi

if test "x$UNIXODBC_CFLAGS" != "x"; then
	echo "    unixODBC:              ${UNIXODBC_CFLAGS}"
fi

if test "x$SNMP_CFLAGS" != "x"; then
	echo "    Net-SNMP:              ${SNMP_CFLAGS}"
fi

if test "x$OPENIPMI_CFLAGS" != "x"; then
	echo "    OpenIPMI:              ${OPENIPMI_CFLAGS}"
fi

if test "x$SSH2_CFLAGS" != "x"; then
	echo "    libssh2:               ${SSH2_CFLAGS}"
fi

if test "x$SSH_CFLAGS" != "x"; then
	echo "    libssh:                ${SSH_CFLAGS}"
fi

if test "x$LIBMODBUS_CFLAGS" != "x"; then
	echo "    libmodbus:                ${LIBMODBUS_CFLAGS}"
fi

if test "x$TLS_CFLAGS" != "x"; then
	echo "    TLS:                   ${TLS_CFLAGS}"
fi

if test "x$LDAP_CPPFLAGS" != "x"; then
	echo "    LDAP:                  ${LDAP_CPPFLAGS}"
fi

if test "x$ICONV_CFLAGS" != "x"; then
	echo "    iconv:                 ${ICONV_CFLAGS}"
fi

if test "x$LIBEVENT_CFLAGS" != "x"; then
	echo "    libevent:              ${LIBEVENT_CFLAGS}"
fi

echo "
  Enable server:         ${server}"

if test "x$server" != "xno"; then

echo "  Server details:
    With database:         ${have_db}
    WEB Monitoring:        ${have_web_monitoring}"

if test "x$have_web_monitoring" = "xcURL"; then
echo "      SSL certificates:      ${CURL_SSL_CERT_LOCATION}
      SSL keys:              ${CURL_SSL_KEY_LOCATION}"
fi

echo "    SNMP:                  ${have_snmp}
    IPMI:                  ${have_ipmi}
    SSH:                   ${have_ssh}
    TLS:                   ${have_tls}
    ODBC:                  ${have_unixodbc}
    Linker flags:          ${SERVER_LDFLAGS} ${LDFLAGS}
    Libraries:             ${SERVER_LIBS} ${LIBS}
    Configuration file:    ${SERVER_CONFIG_FILE}
    External scripts:      ${EXTERNAL_SCRIPTS_PATH}
    Alert scripts:         ${ALERT_SCRIPTS_PATH}
    Modules:               ${LOAD_MODULE_PATH}"

fi

echo "
  Enable proxy:          ${proxy}"

if test "x$proxy" != "xno"; then

echo "  Proxy details:
    With database:         ${have_db}
    WEB Monitoring:        ${have_web_monitoring}"

if test "x$have_web_monitoring" = "xcURL"; then
echo "      SSL certificates:      ${CURL_SSL_CERT_LOCATION}
      SSL keys:              ${CURL_SSL_KEY_LOCATION}"
fi

echo "    SNMP:                  ${have_snmp}
    IPMI:                  ${have_ipmi}
    SSH:                   ${have_ssh}
    TLS:                   ${have_tls}
    ODBC:                  ${have_unixodbc}
    Linker flags:          ${PROXY_LDFLAGS} ${LDFLAGS}
    Libraries:             ${PROXY_LIBS} ${LIBS}
    Configuration file:    ${PROXY_CONFIG_FILE}
    External scripts:      ${EXTERNAL_SCRIPTS_PATH}
    Modules:               ${LOAD_MODULE_PATH}"

fi

echo "
  Enable agent:          ${agent}"

if test "x$agent" != "xno"; then

echo "  Agent details:
    TLS:                   ${have_tls}
    Modbus:                ${have_libmodbus}
    Linker flags:          ${AGENT_LDFLAGS} ${LDFLAGS}
    Libraries:             ${AGENT_LIBS} ${LIBS}
    Configuration file:    ${AGENT_CONFIG_FILE}
    Modules:               ${LOAD_MODULE_PATH}"

fi

echo "
  Enable agent 2:        ${agent2}"

echo "
  Enable web service:    ${webservice}"

echo "
  Enable Java gateway:   ${java}"

if test "x$java" != "xno"; then

echo "  Java gateway details:
    Java compiler:         ${JAVAC}
    Java archiver:         ${JAR}"

fi

echo "
  LDAP support:          ${found_ldap}
  IPv6 support:          ${have_ipv6}"

echo
echo "***********************************************************"
echo "*            Now run '${am_make} install'                       *"
echo "*                                                         *"
echo "*            Thank you for using Zabbix!                  *"
echo "*              <http://www.zabbix.com>                    *"
echo "***********************************************************"
echo