dnl Process this file with autoconf to produce a configure script.
dnl $PostgreSQL: pgsql/configure.in,v 1.546.2.11 2009/01/30 02:59:28 scrappy Exp $
dnl
dnl Developers, please strive to achieve this order:
dnl
dnl 0. Initialization and options processing
dnl 1. Programs
dnl 2. Libraries
dnl 3. Header files
dnl 4. Types
dnl 5. Structures
dnl 6. Compiler characteristics
dnl 7. Functions, global variables
dnl 8. System services
dnl
dnl Read the Autoconf manual for details.
dnl
m4_pattern_forbid(^PGAC_)dnl to catch undefined macros

AC_INIT([HAWQ], [8.2.15], [https://issues.apache.org/jira/browse/HAWQ])

AC_PREREQ(2.63)
dnl m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.63], [], [m4_fatal([Autoconf version 2.63 is required.
dnl Untested combinations of 'autoconf' and PostgreSQL versions are not
dnl recommended.  You can remove the check from 'configure.in' but it is then
dnl your responsibility whether the result works or not.])])
AC_COPYRIGHT([Copyright (c) 1996-2010, PostgreSQL Global Development Group])
AC_CONFIG_SRCDIR([src/backend/access/common/heaptuple.c])
AC_CONFIG_AUX_DIR(config)
AC_PREFIX_DEFAULT(/usr/local/hawq)
AC_SUBST(configure_args, [$ac_configure_args])

AC_DEFINE_UNQUOTED(PG_VERSION, "$PACKAGE_VERSION", [Postgres version HAWQ is based on])
[PG_MAJORVERSION=`expr "$PACKAGE_VERSION" : '\([0-9][0-9]*\.[0-9][0-9]*\)'`]
AC_SUBST(PG_MAJORVERSION)
AC_DEFINE_UNQUOTED(PG_MAJORVERSION, "$PG_MAJORVERSION", [PostgreSQL major version as a string])

AC_CANONICAL_HOST

template=
AC_MSG_CHECKING([which template to use])

PGAC_ARG_REQ(with, template, [],
[
  case $withval in
    list)   echo; ls "$srcdir/src/template"; exit;;
    *)      if test -f "$srcdir/src/template/$with_template" ; then
              template=$withval
            else
              AC_MSG_ERROR(['$withval' is not a valid template name. Use 'list' for a list.])
            fi;;
  esac
],
[
# --with-template not given

case $host_os in
     aix*) template=aix ;;
    bsdi*) template=bsdi ;;
  cygwin*) template=cygwin ;;
  darwin*) template=darwin ;;
dragonfly*) template=netbsd ;;
    dgux*) template=dgux ;;
 freebsd*) template=freebsd ;;
    hpux*) template=hpux ;;
    irix*) template=irix ;;
 linux*|gnu*|k*bsd*-gnu)
           template=linux ;;
   mingw*) template=win32 ;;
  netbsd*) template=netbsd ;;
nextstep*) template=nextstep ;;
 openbsd*) template=openbsd ;;
     osf*) template=osf ;;
     sco*) template=sco ;;
 solaris*) template=solaris ;;
   sunos*) template=sunos4 ;;
 sysv4.2*)
        case $host_vendor in
          univel) template=univel ;;
        esac ;;
   sysv4*) template=svr4 ;;
   sysv5*) template=unixware ;;
  ultrix*) template=ultrix4 ;;
esac

  if test x"$template" = x"" ; then
    AC_MSG_ERROR([[
*******************************************************************
PostgreSQL has apparently not been ported to your platform yet.
To try a manual configuration, look into the src/template directory
for a similar platform and use the '--with-template=' option.

Please also contact <pgsql-bugs@postgresql.org> to see about
rectifying this.  Include the above 'checking host system type...'
line.
*******************************************************************
]])
  fi

])

AC_MSG_RESULT([$template])

PORTNAME=$template
AC_SUBST(PORTNAME)

# Initialize default assumption that we do not need separate assembly code
# for TAS (test-and-set).  This can be overridden by the template file
# when it's executed.
need_tas=no
tas_file=dummy.s



##
## Command line options
##

#
# Installation directory for documentation
#
PGAC_ARG(with, docdir, [  --with-docdir=DIR       install the documentation in DIR [[PREFIX/docs]]
  --without-docdir        do not install the documentation],
         [AC_MSG_ERROR([option --with-docdir requires an argument])],
         [docdir=],
         [docdir=$withval],
         [docdir='${prefix}/docs'])
AC_SUBST(docdir)


#
# Add non-standard directories to the include path
#
PGAC_ARG_REQ(with, includes, [  --with-includes=DIRS    look for additional header files in DIRS])


#
# Add non-standard directories to the library search path
#
PGAC_ARG_REQ(with, libraries, [  --with-libraries=DIRS   look for additional libraries in DIRS],
             [LIBRARY_DIRS=$withval])

PGAC_ARG_REQ(with, libs,      [  --with-libs=DIRS        alternative spelling of --with-libraries],
             [LIBRARY_DIRS=$withval])


#
# 64-bit integer date/time storage: enabled by default.
#
AC_MSG_CHECKING([whether to build with 64-bit integer date/time support])
PGAC_ARG_BOOL(enable, integer-datetimes, yes, [disable 64-bit integer date/time support],
              [AC_DEFINE([USE_INTEGER_DATETIMES], 1,
                         [Define to 1 if you want 64-bit integer timestamp and interval support. (--enable-integer-datetimes)])])
AC_MSG_RESULT([$enable_integer_datetimes])


#
# NLS
#
AC_MSG_CHECKING([whether NLS is wanted])
PGAC_ARG_OPTARG(enable, nls,
                [[  --enable-nls[=LANGUAGES]  enable Native Language Support]],
                [],
                [WANTED_LANGUAGES=$enableval],
                [AC_DEFINE(ENABLE_NLS, 1,
                           [Define to 1 if you want National Language Support. (--enable-nls)])])
AC_MSG_RESULT([$enable_nls])
AC_SUBST(enable_nls)
AC_SUBST(WANTED_LANGUAGES)

#
# Default port number (--with-pgport), default 5432
#
AC_MSG_CHECKING([for default port number])
PGAC_ARG_REQ(with, pgport, [  --with-pgport=PORTNUM   change default port number [[5432]]],
             [default_port=$withval],
             [default_port=5432])
AC_MSG_RESULT([$default_port])
# Need both of these because some places want an integer and some a string
AC_DEFINE_UNQUOTED(DEF_PGPORT, ${default_port},
[Define to the default TCP port number on which the server listens and
to which clients will try to connect.  This can be overridden at run-time,
but it's convenient if your clients have the right default compiled in.
(--with-pgport=PORTNUM)])
AC_DEFINE_UNQUOTED(DEF_PGPORT_STR, "${default_port}",
                   [Define to the default TCP port number as a string constant.])
AC_SUBST(default_port)

#
# Option to disable shared libraries
#
PGAC_ARG_BOOL(enable, shared, yes,
              [  --disable-shared        do not build shared libraries])
AC_SUBST(enable_shared)

#
# '-rpath'-like feature can be disabled
#
PGAC_ARG_BOOL(enable, rpath, yes,
              [  --disable-rpath         do not embed shared library search path in executables])
AC_SUBST(enable_rpath)

#
# Spinlocks
#
PGAC_ARG_BOOL(enable, spinlocks, yes,
              [  --disable-spinlocks     do not use spinlocks])

#
# --enable-debug adds -g to compiler flags
#
PGAC_ARG_BOOL(enable, debug, no,
              [  --enable-debug          build with debugging symbols (-g)])
AC_SUBST(enable_debug)

#
# --enable-avx adds vector instruction optimization (-mavx -mavx2) to compiler flags
#
PGAC_ARG_BOOL(enable, avx, yes,
              [  --enable-avx            build with vector instruction optimization (-mavx -mavx2)])
AC_SUBST(enable_avx)

#
# --enable-profiling enables gcc profiling
#
PGAC_ARG_BOOL(enable, profiling, no,
              [  --enable-profiling      build with profiling enabled ])
AC_SUBST(enable_profiling)

#
# --enable-coverage enables generation of code coverage metrics with gcov
#
PGAC_ARG_BOOL(enable, coverage, no,
              [  --enable-coverage       build with coverage testing instrumentation],
              [AC_DEFINE([ENABLE_COVERAGE], 1, [Define to 1 to build with coverage enabled. (--enable-coverage)])],
[AC_CHECK_PROGS(GCOV, gcov)
if test -z "$GCOV"; then
  AC_MSG_ERROR([gcov not found])
fi
AC_CHECK_PROGS(LCOV, lcov)
if test -z "$LCOV"; then
  AC_MSG_ERROR([lcov not found])
fi
AC_CHECK_PROGS(GENHTML, genhtml)
if test -z "$GENHTML"; then
  AC_MSG_ERROR([genhtml not found])
fi])
AC_SUBST(enable_coverage)

#
# DTrace
#
PGAC_ARG_BOOL(enable, dtrace, no,
              [  --enable-dtrace         build with DTrace support],
[AC_DEFINE([ENABLE_DTRACE], 1,
           [Define to 1 to enable DTrace support. (--enable-dtrace)])
AC_CHECK_PROGS(DTRACE, dtrace)
if test -z "$DTRACE"; then
  AC_MSG_ERROR([dtrace not found])
fi
AC_SUBST(DTRACEFLAGS)])
AC_SUBST(enable_dtrace)

#
# C compiler
#

# For historical reasons you can also use --with-CC to specify the C compiler
# to use, although the standard way to do this is to set the CC environment
# variable.
PGAC_ARG_REQ(with, CC, [], [CC=$with_CC])

case $template in
  aix) pgac_cc_list="gcc xlc";;
 irix) pgac_cc_list="cc";; # no gcc
    *) pgac_cc_list="gcc cc";;
esac

AC_PROG_CC([$pgac_cc_list])

# Check if it's Intel's compiler, which (usually) pretends to be gcc,
# but has idiosyncrasies of its own.  We assume icc will define
# __INTEL_COMPILER regardless of CFLAGS.
AC_TRY_COMPILE([], [@%:@ifndef __INTEL_COMPILER
choke me
@%:@endif], [ICC=[yes]], [ICC=[no]])

# Check if it's Sun Studio compiler. We assume that
# __SUNPRO_C will be defined for Sun Studio compilers
AC_TRY_COMPILE([], [@%:@ifndef __SUNPRO_C
choke me
@%:@endif], [SUN_STUDIO_CC=yes], [SUN_STUDIO_CC=no])

AC_SUBST(SUN_STUDIO_CC)

unset CFLAGS

#
# Read the template
#
. "$srcdir/src/template/$template" || exit

# CFLAGS are selected so:
# If the user specifies something in the environment, that is used.
# else:  If the template file set something, that is used.
# else:  If coverage was enabled, don't set anything.
# else:  If the compiler is GCC, then we use -O3.
# else:  If the compiler is something else, then we use -O, unless debugging.

if test "$ac_env_CFLAGS_set" = set; then
  CFLAGS=$ac_env_CFLAGS_value
elif test "${CFLAGS+set}" = set; then
  : # (keep what template set)
elif test "$enable_coverage" = yes; then
  : # no optimization by default
elif test "$GCC" = yes; then
  if test "$enable_debug" == yes; then
    CFLAGS="-O0"
  else
    CFLAGS="-O3"
  fi
else
  # if the user selected debug mode, don't use -O
  if test "$enable_debug" != yes; then
    CFLAGS="-O"
  fi
fi

# For GPDB, Use C99, rather than C89, compile rules
#
#
if test "$GCC" = yes; then
  if test "$ICC" = yes; then
    CFLAGS="$CFLAGS -c99 "
  else
    CFLAGS="$CFLAGS -std=gnu99 "
  fi
fi


# Check for x86 cpuid instruction to determine if we can perform a
# runtime check
AC_CACHE_CHECK([for __get_cpuid], [pgac_cv__get_cpuid],
[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <cpuid.h>],
  [[unsigned int exx[4] = {0, 0, 0, 0};
  __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
  ]])],
  [pgac_cv__get_cpuid="yes"],
  [pgac_cv__get_cpuid="no"])])
if test x"$pgac_cv__get_cpuid" = x"yes"; then
  AC_DEFINE(HAVE__GET_CPUID, 1, [Define to 1 if you have __get_cpuid.])
fi

AC_CACHE_CHECK([for __cpuid], [pgac_cv__cpuid],
[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <intrin.h>],
  [[unsigned int exx[4] = {0, 0, 0, 0};
  __get_cpuid(exx[0], 1);
  ]])],
  [pgac_cv__cpuid="yes"],
  [pgac_cv__cpuid="no"])])
if test x"$pgac_cv__cpuid" = x"yes"; then
  AC_DEFINE(HAVE__CPUID, 1, [Define to 1 if you have __cpuid.])
fi

# Check for Intel SSE 4.2 intrinsics to do CRC calculations.
#
# First check if the _mm_crc32_u8 and _mm_crc32_u64 intrinsics can be used
# with the default compiler flags. If not, check if adding the -msse4.2
# flag helps. CFLAGS_SSE42 is set to -msse4.2 if that's required.
PGAC_SSE42_CRC32_INTRINSICS([])
if test x"$pgac_sse42_crc32_intrinsics" != x"yes"; then
  PGAC_SSE42_CRC32_INTRINSICS([-msse4.2])
fi
AC_SUBST(CFLAGS_SSE42)

# Are we targeting a processor that supports SSE 4.2? gcc, clang and icc all
# define __SSE4_2__ in that case.
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
#ifndef __SSE4_2__
#error __SSE4_2__ not defined
#endif
])], [SSE4_2_TARGETED=1])

# Select CRC-32C implementation.
#
# If we are targeting a processor that has SSE 4.2 instructions, we can use the
# special CRC instructions for calculating CRC-32C. If we're not targeting such
# a processor, but we can nevertheless produce code that uses the SSE
# intrinsics, perhaps with some extra CFLAGS, compile both implementations and
# select which one to use at runtime, depending on whether SSE 4.2 is supported
# by the processor we're running on.
#
# You can override this logic by setting the appropriate USE_*_CRC32 flag to 1
# in the template or configure command line.
if test x"$USE_SSE42_CRC32C" = x"" && test x"$USE_SSE42_CRC32C_WITH_RUNTIME_CHECK" = x"" && test x"$USE_SLICING_BY_8_CRC32C" = x""; then
  if test x"$pgac_sse42_crc32_intrinsics" = x"yes" && test x"$SSE4_2_TARGETED" = x"1" ; then
    USE_SSE42_CRC32C=1
  else
    # the CPUID instruction is needed for the runtime check.
    if test x"$pgac_sse42_crc32_intrinsics" = x"yes" && (test x"$pgac_cv__get_cpuid" = x"yes" || test x"$pgac_cv__cpuid" = x"yes"); then
      USE_SSE42_CRC32C_WITH_RUNTIME_CHECK=1
    else
      # fall back to slicing-by-8 algorithm which doesn't require any special
      # CPU support.
      USE_SLICING_BY_8_CRC32C=1
    fi
  fi
fi

# Set PG_CRC32C_OBJS appropriately depending on the selected implementation.
AC_MSG_CHECKING([which CRC-32C implementation to use])
if test x"$USE_SSE42_CRC32C" = x"1"; then
  AC_DEFINE(USE_SSE42_CRC32C, 1, [Define to 1 use Intel SSE 4.2 CRC instructions.])
  PG_CRC32C_OBJS="pg_crc32c_sse42.o"
  AC_MSG_RESULT(SSE 4.2)
else
  if test x"$USE_SSE42_CRC32C_WITH_RUNTIME_CHECK" = x"1"; then
    AC_DEFINE(USE_SSE42_CRC32C_WITH_RUNTIME_CHECK, 1, [Define to 1 to use Intel SSSE 4.2 CRC instructions with a runtime check.])
    PG_CRC32C_OBJS="pg_crc32c_sse42.o pg_crc32c_sb8.o pg_crc32c_choose.o"
    AC_MSG_RESULT(SSE 4.2 with runtime check)
  else
    AC_DEFINE(USE_SLICING_BY_8_CRC32C, 1, [Define to 1 to use Intel SSE 4.2 CRC instructions with a runtime check.])
    PG_CRC32C_OBJS="pg_crc32c_sb8.o"
    AC_MSG_RESULT(slicing-by-8)
  fi
fi
AC_SUBST(PG_CRC32C_OBJS)


# Some versions of GCC support some additional useful warning flags.
# Check whether they are supported, and add them to CFLAGS if so.
# ICC pretends to be GCC but it's lying; it doesn't support these flags,
# but has its own.  Also check other compiler-specific flags here.

if test "$GCC" = yes -a "$ICC" = no; then
  CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wpointer-arith "
  # These work in some but not all gcc versions
    PGAC_PROG_CC_CFLAGS_OPT([-Wendif-labels])
    #PGAC_PROG_CC_CFLAGS_OPT([-Wmissing-format-attribute])
  # This was included in -Wall/-Wformat in older GCC versions
  PGAC_PROG_CC_CFLAGS_OPT([-Wformat-security])
  # Disable strict-aliasing rules; needed for gcc 3.3+
  PGAC_PROG_CC_CFLAGS_OPT([-fno-strict-aliasing])
  # Disable optimizations that assume no overflow; needed for gcc 4.3+
  PGAC_PROG_CC_CFLAGS_OPT([-fwrapv])
  # Disable optimizations that do aggresive-loop-optimization for variable length array; needed for gcc 4.8+
  PGAC_PROG_CC_CFLAGS_OPT([-fno-aggressive-loop-optimizations])
elif test "$ICC" = yes; then
  # Intel's compiler has a bug/misoptimization in checking for
  # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS.
  PGAC_PROG_CC_CFLAGS_OPT([-mp1])
  # Make sure strict aliasing is off (though this is said to be the default)
  PGAC_PROG_CC_CFLAGS_OPT([-fno-strict-aliasing])
elif test "$PORTNAME" = "aix"; then
  # AIX's xlc has to have strict aliasing turned off too
  PGAC_PROG_CC_CFLAGS_OPT([-qnoansialias])
fi

# supply -g if --enable-debug
if test "$enable_debug" = yes && test "$ac_cv_prog_cc_g" = yes; then
  if test "$GCC" = yes; then
  	CFLAGS="$CFLAGS -g -ggdb"
  else
    CFLAGS="$CFLAGS -g"
  fi
fi

# enable code coverage if --enable-coverage
if test "$enable_coverage" = yes; then
  if test "$GCC" = yes; then
    CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
  else
    AC_MSG_ERROR([--enable-coverage is supported only when using GCC])
  fi
fi

# enable profiling if --enable-profiling
if test "$enable_profiling" = yes && test "$ac_cv_prog_cc_g" = yes; then
  if test "$GCC" = yes; then
    AC_DEFINE([PROFILE_PID_DIR], 1, 
           [Define to 1 to allow profiling output to be saved separately for each process.])
    CFLAGS="$CFLAGS -pg $PLATFORM_PROFILE_FLAGS"
  else
    AC_MSG_ERROR([--enable-profiling is supported only when using GCC])
  fi
fi

# disable avx if --enable-avx=no
if test "$enable_avx" = no; then
    CFLAGS="$CFLAGS -mno-avx -mno-avx2"
    CXXFLAGS="$CXXFLAGS -mno-avx -mno-avx2"
fi

# We already have this in Makefile.win32, but configure needs it too
if test "$PORTNAME" = "win32"; then
  CPPFLAGS="$CPPFLAGS -I$srcdir/src/include/port/win32 -DEXEC_BACKEND"
fi

# Check if the compiler still works with the template settings
AC_MSG_CHECKING([whether the C compiler still works])
AC_TRY_LINK([], [return 0;],
  [AC_MSG_RESULT(yes)],
  [AC_MSG_RESULT(no)
   AC_MSG_ERROR([cannot proceed])])

# Defend against gcc -ffast-math
if test "$GCC" = yes; then
AC_TRY_COMPILE([], [@%:@ifdef __FAST_MATH__
choke me
@%:@endif], [], [AC_MSG_ERROR([do not put -ffast-math in CFLAGS])])
fi

AC_PROG_CPP
AC_SUBST(GCC)

# Generate HAWQ version file.
if [[ -x getversion ]] ; then
	./getversion > VERSION
fi

# Get the HAWQ version string from ./VERSION
# If there is no VERSION file, set the version to devel
if [[ -f VERSION ]] ; then
    HQ_VERSION=`cat VERSION`
else
    HQ_VERSION="devel"
fi

GP_VERSION='4.2.0'
GP_VERSION_IN="src/include/catalog/gp_version.in"
GP_VERSION_HEADER="src/include/catalog/gp_version.h"
if grep '\$\$' $GP_VERSION_IN > /dev/null 2>&1 ; then
    sed "s,\\$.*\\$\\$,$HQ_VERSION," $GP_VERSION_IN > $GP_VERSION_HEADER
fi

# Create compiler version string
if test x"$GCC" = x"yes" ; then
  cc_string="GCC `${CC} --version | sed q`"
else
  cc_string=$CC
fi
AC_DEFINE_UNQUOTED(PG_VERSION_STR,
                   ["PostgreSQL $PACKAGE_VERSION (Apache HAWQ 3.0.0.0) (Greenplum Database $GP_VERSION) on $host, compiled by $cc_string"],
                   [A string containing the version number, platform, and C compiler])

if `echo "$HQ_VERSION" | grep "main build" > /dev/null 2>&1` ; then
   HQ_VERSION="1.0.0"
fi

AC_DEFINE_UNQUOTED(GP_VERSION,
                   ["$GP_VERSION"],
                   [A string containing the Greenplum version number])
                 
AC_DEFINE_UNQUOTED(HQ_VERSION,
                   ["$HQ_VERSION"],
                   [A string containing the HAWQ version number])
                 
dnl If we are a development build, fake a numeric version number  
dnl this needs to be manually updated each time we branch a new version

[GP_MAJORVERSION=`expr "$GP_VERSION" : '\([0-9][0-9]*\.[0-9][0-9]*\)'`]
AC_SUBST(GP_MAJORVERSION)
AC_DEFINE_UNQUOTED(GP_MAJORVERSION, "$GP_MAJORVERSION", [Greenplum major version as a string])

[HQ_MAJORVERSION=`expr "$HQ_VERSION" : '\([0-9][0-9]*\.[0-9][0-9]*\)'`]
AC_SUBST(HQ_MAJORVERSION)
AC_DEFINE_UNQUOTED(HQ_MAJORVERSION, "$HQ_MAJORVERSION", [HAWQ major version as a string])

#
# Set up TAS assembly code if needed; the template file has now had its
# chance to request this.
#
AC_CONFIG_LINKS([src/backend/port/tas.s:src/backend/port/tas/${tas_file}])

if test "$need_tas" = yes ; then
  TAS=tas.o
else
  TAS=""
fi
AC_SUBST(TAS)


#
# Automatic dependency tracking
#
PGAC_ARG_BOOL(enable, depend, no, [  --enable-depend         turn on automatic dependency tracking],
              [autodepend=yes])
AC_SUBST(autodepend)


#
# Enable assert checks
#
PGAC_ARG_BOOL(enable, cassert, no, [  --enable-cassert        enable assertion checks (for debugging)],
              [AC_DEFINE([USE_ASSERT_CHECKING], 1,
                         [Define to 1 to build with assertion checks. (--enable-cassert)])])

#
# Enable forced plans
#
PGAC_ARG_BOOL(enable, forceplan, no, [  --enable-forceplan        enable forcing of plans via EXPLAIN FORCE (for debugging)],
              [AC_DEFINE([USE_FORCE_PLAN], 1,
                         [Define to 1 to build with plan forcing capabilities. (--enable-forceplan)])])

#
# Enable debug_break
#
PGAC_ARG_BOOL(enable, debugbreak, no, [  --enable-debugbreak        enable debug_break and debug_break_n (for debugging)],
              [AC_DEFINE([USE_DEBUG_BREAK], 1,
                         [Define to 1 to build with debug_break capabilities. (--enable-debugbreak)])])

# Enable debug ntuplestore
PGAC_ARG_BOOL(enable, debugntuplestore, no, [  --enable-ntuplestore      enable debug_ntuplestore (for debugging)],
              [AC_DEFINE([USE_DEBUG_NTUPLESTORE], 1,
                         [Define to 1 to build with debug_ntuplestore. (--enable-ntuplestore)])])


#
# Enable testing utilities
#
PGAC_ARG_BOOL(enable, testutils, no, [  --enable-testutils        enable testing utilities],
              [AC_DEFINE([USE_TEST_UTILS], 1,
                         [Define to 1 to build with testing utilities. (--enable-testutils)])])
                         
#
# --enable-snmp enables snmp mib and trap/inform
#
PGAC_ARG_BOOL(enable, snmp, no, [  --enable-snmp        enable snmp for MIB and alerts via TRAP/INFORM],
              [AC_DEFINE([USE_SNMP], 1, 
                         [Define to 1 to build with snmp capabilities. (--enable-snmp)])])
AC_MSG_RESULT([checking whether to build with snmp... $enable_snmp])
AC_SUBST(enable_snmp)

#
# --enable-email enables email alerts
#
PGAC_ARG_BOOL(enable, email, no,  [  --enable-email        enable email alerts],
              [AC_DEFINE([USE_EMAIL], 1,
                         [Define to 1 to build with email alert capabilities. (--enable-email)])])
AC_MSG_RESULT([checking whether to build with email...$enable_email])
AC_SUBST(enable_email)

#
# Enable Pivotal Query Optimizer
#
PGAC_ARG_BOOL(enable, orca, no, [  --enable-orca        enable Pivotal Query Optimizer],
              [AC_DEFINE([USE_ORCA], 1,
                         [Define to 1 to build with Pivotal Query Optimizer. (--enable-orca)])])
AC_SUBST(enable_orca)

#
# Enable hawq ranger plugin
#
PGAC_ARG_BOOL(enable, rps, no, [  --enable-rps         enable hawq ranger plugin],
              [AC_DEFINE([USE_RANGER], 1,
                         [Define to 1 to build with hawq ranger plugin. (--enable-rps)])])
AC_SUBST(enable_rps)

#
# Enable thread-safe client libraries
#
AC_MSG_CHECKING([allow thread-safe client libraries])
# GPDB wants the default here to be "yes", unlike PostgreSQL.
# it's also required for Win32 client builds.
PGAC_ARG_BOOL(enable, thread-safety, yes, [  --disable-thread-safety  Do not make client libraries thread-safe])

PGAC_ARG_BOOL(enable, thread-safety-force, no, [  --enable-thread-safety-force  force thread-safety despite thread test failure])
if test "$enable_thread_safety" = yes -o \
        "$enable_thread_safety_force" = yes; then
  enable_thread_safety="yes"	# for 'force'
  AC_DEFINE([ENABLE_THREAD_SAFETY], 1,
          [Define to 1 to build client libraries as thread-safe code. (--enable-thread-safety)])
fi
AC_MSG_RESULT([$enable_thread_safety])
AC_SUBST(enable_thread_safety)

#
# Optionally build Magma Sanitize modules
#
AC_MSG_CHECKING([whether to build with Magma Sanitize])
PGAC_ARG_BOOL(with, magma_sanitize, no, [  --with-magma_sanitize   build with sanitize check])
AC_MSG_RESULT([$with_magma_sanitize])
AC_SUBST([with_magma_sanitize])

#
# Optionally build Tcl modules (PL/Tcl)
#
AC_MSG_CHECKING([whether to build with Tcl])
PGAC_ARG_BOOL(with, tcl, no, [  --with-tcl              build Tcl modules (PL/Tcl)])
AC_MSG_RESULT([$with_tcl])
AC_SUBST([with_tcl])

# We see if the path to the Tcl/Tk configuration scripts is specified.
# This will override the use of tclsh to find the paths to search.

PGAC_ARG_REQ(with, tclconfig, [  --with-tclconfig=DIR    tclConfig.sh is in DIR])

#
# Optionally build Perl modules (PL/Perl)
#
AC_MSG_CHECKING([whether to build Perl modules])
PGAC_ARG_BOOL(with, perl, no, [  --with-perl             build Perl modules (PL/Perl)])
AC_MSG_RESULT([$with_perl])
AC_SUBST(with_perl)

#
# Optionally build Python modules (PL/Python)
#
AC_MSG_CHECKING([whether to build Python modules])
PGAC_ARG_BOOL(with, python, no, [  --with-python           build Python modules (PL/Python)])
AC_MSG_RESULT([$with_python])
AC_SUBST(with_python)

#
# Optionally build Java modules (PL/Java)
#
AC_MSG_CHECKING([whether to build Java modules])
PGAC_ARG_BOOL(with, java, no, [  --with-java             build Java modules (PL/Java)])
AC_MSG_RESULT([$with_java])
AC_SUBST(with_java)

#
# Optionally build R modules (PL/R)
#
AC_MSG_CHECKING([whether to build R modules])
PGAC_ARG_BOOL(with, r, no, [  --with-r                build R modules (PL/R)])
AC_MSG_RESULT([$with_r])
AC_SUBST(with_r)

#
# Optionally build with pgcrypto.
#
AC_MSG_CHECKING([whether to build pgcrypto modules])
PGAC_ARG_BOOL(with, pgcrypto, no, [  --with-pgcrypto         build with pgcrypto ])
AC_MSG_RESULT([$with_pgcrypto])
AC_SUBST(with_pgcrypto)

#
# Optionally build with orc format in pluggable storage framework.
#
AC_MSG_CHECKING([whether to build orc modules])
PGAC_ARG_BOOL(with, orc, yes, [  --with-orc         build with orc format])
AC_MSG_RESULT([$with_orc])
AC_SUBST(with_orc)
#

# GSSAPI
#
AC_MSG_CHECKING([whether to build with GSSAPI support])
PGAC_ARG_BOOL(with, gssapi, no, [  --with-gssapi           build with GSSAPI support],
[
  AC_DEFINE(ENABLE_GSS, 1, [Define to build with GSSAPI support. (--with-gssapi)])
  krb_srvtab="FILE:\$(sysconfdir)/krb5.keytab"
])
AC_MSG_RESULT([$with_gssapi])
AC_SUBST(with_gssapi)

#
# Kerberos 5
#
AC_MSG_CHECKING([whether to build with Kerberos 5 support])
PGAC_ARG_BOOL(with, krb5, no, [  --with-krb5             build with Kerberos 5 support],
[
  AC_DEFINE(KRB5, 1, [Define to build with Kerberos 5 support. (--with-krb5)])
  krb_srvtab="FILE:\$(sysconfdir)/krb5.keytab"
])
AC_MSG_RESULT([$with_krb5])
AC_SUBST(with_krb5)


AC_SUBST(krb_srvtab)


#
# Kerberos configuration parameters
#
PGAC_ARG_REQ(with, krb-srvnam,
             [  --with-krb-srvnam=NAME  default service principal name in Kerberos [[postgres]]],
             [],
             [with_krb_srvnam="postgres"])
AC_DEFINE_UNQUOTED([PG_KRB_SRVNAM], ["$with_krb_srvnam"],
                   [Define to the name of the default PostgreSQL service principal in Kerberos. (--with-krb-srvnam=NAME)])


#
# PAM
#
AC_MSG_CHECKING([whether to build with PAM support])
PGAC_ARG_BOOL(with, pam, no,
              [  --with-pam              build with PAM support],
              [AC_DEFINE([USE_PAM], 1, [Define to 1 to build with PAM support. (--with-pam)])])
AC_MSG_RESULT([$with_pam])
AC_SUBST(with_pam)


#
# LDAP
#
AC_MSG_CHECKING([whether to build with LDAP support])
PGAC_ARG_BOOL(with, ldap, yes,
              [  --with-ldap             build with LDAP support],
              [AC_DEFINE([USE_LDAP], 1, [Define to 1 to build with LDAP support. (--with-ldap)])])
AC_MSG_RESULT([$with_ldap])
AC_SUBST(with_ldap)


#
# Bonjour
#
AC_MSG_CHECKING([whether to build with Bonjour support])
PGAC_ARG_BOOL(with, bonjour, no,
              [  --with-bonjour          build with Bonjour support],
              [AC_DEFINE([USE_BONJOUR], 1, [Define to 1 to build with Bonjour support. (--with-bonjour)])])
AC_MSG_RESULT([$with_bonjour])
AC_SUBST(with_bonjour)


#
# OpenSSL
#
AC_MSG_CHECKING([whether to build with OpenSSL support])
PGAC_ARG_BOOL(with, openssl, no, [  --with-openssl          build with OpenSSL support],
              [AC_DEFINE([USE_SSL], 1, [Define to build with (Open)SSL support. (--with-openssl)])])
AC_MSG_RESULT([$with_openssl])
AC_SUBST(with_openssl)


#
# Readline
#
PGAC_ARG_BOOL(with, readline, yes,
              [  --without-readline      do not use GNU Readline nor BSD Libedit for editing])
# readline on MinGW has problems with backslashes in psql and other bugs.
# This is particularly a problem with non-US code pages.
# Therefore disable its use until we understand the cause. 2004-07-20
if test "$PORTNAME" = "win32"; then
  if test "$with_readline" = yes; then
    AC_MSG_WARN([*** Readline does not work on MinGW --- disabling])
    with_readline=no
  fi
fi

#
# libyarn
#
PGAC_ARG_BOOL(with, libyarn, yes,
              [  --without-libyarn       do not build libyarn])
AC_SUBST(with_libyarn)

#
# libhdfs3
#
PGAC_ARG_BOOL(with, libhdfs3, yes,
              [  --without-libhdfs3      do not build libhdfs3])
AC_SUBST(with_libhdfs3)

#
# Prefer libedit
#
# In GPDB we want the default to be yes, because we don't want to link with GPL code.
#
PGAC_ARG_BOOL(with, libedit-preferred, yes,
              [  --without-libedit-preferred  Don't prefer BSD Libedit over GNU Readline])


#
# tzdata
#
PGAC_ARG_REQ(with, system-tzdata,
             [  --with-system-tzdata=DIR  use system time zone data in DIR])
AC_SUBST(with_system_tzdata)

#
# Zlib
#
PGAC_ARG_BOOL(with, zlib, yes,
              [  --without-zlib          do not use Zlib])
AC_SUBST(with_zlib)

#
# Realtime library
#
PGAC_ARG_BOOL(with, rt, yes,
              [  --without-rt            do not use Realtime Library])
AC_SUBST(with_rt)

#
# Elf
#

# Assume system is ELF if it predefines __ELF__ as 1,
# otherwise believe host_os based default.PostgreSQL
case $host_os in
    freebsd1*|freebsd2*) elf=no;;
    freebsd3*|freebsd4*) elf=yes;;
esac

AC_EGREP_CPP(yes,
[#if __ELF__
  yes
#endif
],
[ELF_SYS=true],
[if test "X$elf" = "Xyes" ; then
  ELF_SYS=true
else
  ELF_SYS=
fi])
AC_SUBST(ELF_SYS)

#
# Include directories
#
#INCLUDES="$INCLUDES -I$ac_pwd/depends/thirdparty/googletest/googletest/include -I$ac_pwd/depends/thirdparty/googletest/googlemock/include"

ac_save_IFS=$IFS
IFS="${IFS}${PATH_SEPARATOR}"
# SRCH_INC comes from the template file
for dir in $with_includes $SRCH_INC; do
  if test -d "$dir"; then
    INCLUDES="$INCLUDES -I$dir"
  else
    AC_MSG_WARN([*** Include directory $dir does not exist.])
  fi
done
IFS=$ac_save_IFS
INCLUDES="$INCLUDES -I$ac_pwd/depends/libhdfs3/build/install/include -I$ac_pwd/src/include/cwrapper"
AC_SUBST(INCLUDES)


#
# Library directories
#
#LIBDIRS="$LIBDIRS -L$ac_pwd/depends/thirdparty/googletest/build/googlemock/gtest -L$ac_pwd/depends/thirdparty/googletest/build/googlemock"

ac_save_IFS=$IFS
IFS="${IFS}${PATH_SEPARATOR}"
# LIBRARY_DIRS comes from command line, SRCH_LIB from template file.
for dir in $LIBRARY_DIRS $SRCH_LIB; do
  if test -d "$dir"; then
    LIBDIRS="$LIBDIRS -L$dir"
  else
    AC_MSG_WARN([*** Library directory $dir does not exist.])
  fi
done
IFS=$ac_save_IFS
LIBDIRS="$LIBDIRS -L$ac_pwd/depends/libhdfs3/build/install/lib"

#
# Assignments
#

CFLAGS="$CFLAGS -w"
CXXFLAGS="$CXXFLAGS -w"
CPPFLAGS="$CPPFLAGS $INCLUDES"
LDFLAGS="$LDFLAGS $LIBDIRS"

AC_ARG_VAR(LDFLAGS_EX, [extra linker flags for linking executables only])
AC_ARG_VAR(LDFLAGS_SL, [extra linker flags for linking shared libraries only])

AC_MSG_NOTICE([using CPPFLAGS=$CPPFLAGS])
AC_MSG_NOTICE([using LDFLAGS=$LDFLAGS])

PGAC_PROG_LD
AC_SUBST(LD)
AC_SUBST(with_gnu_ld)
case $host_os in sysv5*)
  AC_CACHE_CHECK([whether ld -R works], [pgac_cv_prog_ld_R],
  [
    pgac_save_LDFLAGS=$LDFLAGS; LDFLAGS="$LDFLAGS -Wl,-R/usr/lib"
    AC_TRY_LINK([], [], [pgac_cv_prog_ld_R=yes], [pgac_cv_prog_ld_R=no])
    LDFLAGS=$pgac_save_LDFLAGS
  ])
  ld_R_works=$pgac_cv_prog_ld_R
  AC_SUBST(ld_R_works)
esac
AC_PROG_RANLIB
PGAC_CHECK_STRIP
AC_CHECK_TOOL(AR, ar, ar)
if test "$PORTNAME" = "win32"; then
  AC_CHECK_TOOL(DLLTOOL, dlltool, dlltool)
  AC_CHECK_TOOL(DLLWRAP, dllwrap, dllwrap)
  AC_CHECK_TOOL(WINDRES, windres, windres)
fi

AC_PATH_PROG(TAR, tar)
AC_PROG_LN_S
AC_PROG_AWK
AC_PROG_MKDIR_P
# When Autoconf chooses install-sh as mkdir -p program it tries to generate
# a relative path to it in each makefile where it subsitutes it. This clashes
# with our Makefile.global concept. This workaround helps.
case $MKDIR_P in
  *install-sh*) MKDIR_P='\${SHELL} \${top_srcdir}/config/install-sh -c -d';;
esac

PGAC_PATH_BISON
PGAC_PATH_FLEX
PGAC_PATH_MAVEN
PGAC_PATH_GPERF

PGAC_PATH_PERL
PGAC_CHECK_PERL_MODULES([JSON])
if test "$with_perl" = yes; then
  if test -z "$PERL"; then
    AC_MSG_ERROR([Perl not found])
  fi
  PGAC_CHECK_PERL_CONFIGS([archlibexp,privlibexp,useshrplib])
  PGAC_CHECK_PERL_EMBED_LDFLAGS
fi

PGAC_PATH_PYTHON
  
if test "$with_python" = yes; then
  PGAC_CHECK_PYTHON_EMBED_SETUP
fi

if test "$with_java" = yes; then
  PGAC_PATH_JAVA
  PGAC_CHECK_JAVA_EMBED_SETUP
fi

if test "$enable_rps" = yes; then
  PGAC_PATH_TOMCAT
  PGAC_CHECK_TOMCAT_EMBED_SETUP
fi

ZIC=
if test "$cross_compiling" = yes && test -z "$with_system_tzdata"; then
  AC_PATH_PROG(ZIC, zic)
  if test -z "$ZIC"; then
    AC_MSG_ERROR([
When cross-compiling, either use the option --with-system-tzdata to use
existing time-zone data, or set the environment variable ZIC to a zic
program to use during the build.])
  fi
fi

# Supply a numeric version string for use by 3rd party add-ons
# awk -F is a regex on some platforms, and not on others, so make "." a tab
[PG_VERSION_NUM="`echo "$PACKAGE_VERSION" | sed 's/[A-Za-z].*$//' |
tr '.' '	' |
$AWK '{printf "%d%02d%02d", $1, $2, (NF >= 3) ? $3 : 0}'`"]
AC_DEFINE_UNQUOTED(PG_VERSION_NUM, $PG_VERSION_NUM, [PostgreSQL version as a number])

#
[GP_VERSION_NUM="`echo "$GP_VERSION" | sed 's/[A-Za-z].*$//' |
tr '.' '	' |
$AWK '{printf "%d%02d%02d", $1, $2, (NF >= 3) ? $3 : 0}'`"]
AC_DEFINE_UNQUOTED(GP_VERSION_NUM, $GP_VERSION_NUM, [Greenplum version as a number])

[HQ_VERSION_NUM="`echo "$HQ_VERSION" | sed 's/[A-Za-z].*$//' |
tr '.' '	' |
$AWK '{printf "%d%02d%02d", $1, $2, (NF >= 3) ? $3 : 0}'`"]
AC_DEFINE_UNQUOTED(HQ_VERSION_NUM, $HQ_VERSION_NUM, [HAWQ version as a number])

##
## Libraries
##
## Most libraries are included only if they demonstrably provide a function
## we need, but libm is an exception: always include it, because there are
## too many compilers that play cute optimization games that will break
## probes for standard functions such as pow().
##

AC_CHECK_LIB(m, main)
AC_SEARCH_LIBS(setproctitle, util)
AC_SEARCH_LIBS(dlopen, dl)
AC_SEARCH_LIBS(socket, [socket wsock32])
AC_SEARCH_LIBS(shl_load, dld)
# We only use libld in port/dynloader/aix.c
case $host_os in
     aix*)
	AC_SEARCH_LIBS(ldopen, ld)
	;;
esac
AC_SEARCH_LIBS(getopt_long, [getopt gnugetopt])
AC_SEARCH_LIBS(crypt, crypt)
# Solaris:
AC_SEARCH_LIBS(fdatasync, [rt posix4])
# Required for thread_test.c on Solaris 2.5:
# Other ports use it too (HP-UX) so test unconditionally
AC_SEARCH_LIBS(gethostbyname_r, nsl)
# Cygwin:
AC_SEARCH_LIBS(shmget, cygipc)

if test "$with_readline" = yes; then
  PGAC_CHECK_READLINE
  if test x"$pgac_cv_check_readline" = x"no"; then
    AC_MSG_ERROR([readline library not found
If you have readline already installed, see config.log for details on the
failure.  It is possible the compiler isn't looking in the proper directory.
Use --without-readline to disable readline support.])
  fi
fi

if test "$with_zlib" = yes; then
  AC_CHECK_LIB(z, inflate, [],
               [AC_MSG_ERROR([zlib library not found
If you have zlib already installed, see config.log for details on the
failure.  It is possible the compiler isn't looking in the proper directory.
Use --without-zlib to disable zlib support.])])
LIBS="-lz -llz4 $LIBS"
fi

if test "$with_r" = yes; then
  AC_MSG_CHECKING([R_HOME])
  if test "x${R_HOME}" = x; then
    r_home_guess=`pkg-config --variable=rhome libR 2>/dev/null`
	if test "x${r_home_guess}" != "x"; then
      R_HOME=$r_home_guess
	else
      AC_MSG_ERROR([Failed to set R_HOME. R is not installed? Or R_HOME is not set
or pkg-config is not installed to find R_HOME automatically.
Check config.log for details or not use --with-r if you do not want the PL/R support.])
    fi
  fi
  AC_MSG_RESULT(${R_HOME})
  AC_SUBST(R_HOME)
fi

if test "$enable_spinlocks" = yes; then
  AC_DEFINE(HAVE_SPINLOCKS, 1, [Define to 1 if you have spinlocks.])
else
  AC_MSG_WARN([
*** Not using spinlocks will cause poor performance.])
fi

if test "$with_gssapi" = yes ; then
  if test "$PORTNAME" != "win32"; then
    AC_SEARCH_LIBS(gss_init_sec_context, [gssapi_krb5 gss 'gssapi -lkrb5 -lcrypto'], [],
                    [AC_MSG_ERROR([could not find function 'gss_init_sec_context' required for GSSAPI.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-gssapi if you don't want the GSSAPI support.])])
  else
    LIBS="$LIBS -lgssapi32"
  fi
fi

if test "$with_krb5" = yes ; then
  if test "$PORTNAME" != "win32"; then
     AC_SEARCH_LIBS(com_err, [krb5 'krb5 -lcrypto -ldes -lasn1 -lroken' com_err 'com_err -lssl -lcrypto'], [],
                    [AC_MSG_ERROR([could not find function 'com_err' required for Kerberos 5.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-krb5 if you don't want the Kerberos 5 support.])])
     AC_SEARCH_LIBS(krb5_sendauth, [krb5 'krb5 -lcrypto -ldes -lasn1 -lroken'], [],
                    [AC_MSG_ERROR([could not find function 'krb5_sendauth' required for Kerberos 5.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-krb5 if you don't want the Kerberos 5 support.])])
  else
     AC_SEARCH_LIBS(com_err, 'comerr32 -lkrb5_32', [],
                    [AC_MSG_ERROR([could not find function 'com_err' required for Kerberos 5.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-krb5 if you don't want the Kerberos 5 support.])])
  fi
fi

if test "$with_openssl" = yes ; then
  dnl workaround for 'brew link openssl --force' error on MacOS 10.12
  if test "$PORTNAME" == "darwin"; then
	LDFLAGS = "$LDFLAGS -L/usr/local/opt/openssl/lib"
  fi
  dnl Order matters!
  if test "$PORTNAME" != "win32"; then
     AC_CHECK_LIB(crypto, CRYPTO_new_ex_data, [], [AC_MSG_ERROR([library 'crypto' is required for OpenSSL.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-openssl if you don't want the OpenSSL support.])])
     AC_CHECK_LIB(ssl,    SSL_library_init, [], [AC_MSG_ERROR([library 'ssl' is required for OpenSSL.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-openssl if you don't want the OpenSSL support.])])
  else
     AC_CHECK_LIB(eay32, CRYPTO_new_ex_data, [], [AC_MSG_ERROR([library 'eay32' is required for OpenSSL.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-openssl if you don't want the OpenSSL support.])])
     AC_CHECK_LIB(ssleay32,    SSL_library_init, [], [AC_MSG_ERROR([library 'ssleay32' is required for OpenSSL.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-openssl if you don't want the OpenSSL support.])])
  fi
fi

if test "$with_rt" = yes ; then
  AC_CHECK_LIB(rt, clock_gettime, [],
                [AC_MSG_WARN([Realtime library not found.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Use --without-rt to avoid using the Realtime library.])])
fi

if test "$with_pam" = yes ; then
  AC_CHECK_LIB(pam,    pam_start, [], [AC_MSG_ERROR([library 'pam' is required for PAM.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-pam if you don't want the PAM support.])])
fi

# Check for curl.
AC_CHECK_CURL([7.0.0])
CFLAGS="$CFLAGS $CURL_CFLAGS"
LIBS="$LIBS $CURL_LIBS"

# Check for bzip2
AC_CHECK_HEADERS(bzlib.h, [], [AC_MSG_ERROR([header file <bzlib.h> is required.
'bzip2' is used for table compression. Check config.log for details.
It is possible the compiler isn't looking in the proper directory.])])
AC_SEARCH_LIBS(BZ2_bzDecompress, bz2, [], [AC_MSG_ERROR([library 'bzip2' is required.
'bzip2' is used for table compression.  Check config.log for details.
It is possible the compiler isn't looking in the proper directory.])])

# Check for snappy
AC_CHECK_HEADERS(snappy-c.h, [], [AC_MSG_ERROR([header file <snappy-c.h> is required.
'snappy' is used for table compression. Check config.log for details.
It is possible the compiler isn't looking in the proper directory.])])
AC_SEARCH_LIBS(snappy_max_compressed_length, snappy, [], [AC_MSG_ERROR([library 'snappy' is required.
'snappy' is used for table compression. Check config.log for details.
It is possible the compiler isn't looking in the proper directory.])])

AC_LANG_PUSH([C++])

# Check for thrift
AC_CHECK_HEADERS(thrift/protocol/TBinaryProtocol.h, [], [AC_MSG_ERROR([thrift is required])])

# Check for boost
AC_CHECK_HEADERS(boost/chrono.hpp, [], [AC_MSG_ERROR([boost is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])

AC_LANG_POP([C++])

# Check for libyaml
AC_CHECK_HEADERS(yaml.h, [], [AC_MSG_ERROR([header file <yaml.h> is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])
AC_SEARCH_LIBS(yaml_get_version, yaml, [], [AC_MSG_ERROR([library 'libyaml' is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])

# Check for libevent
AC_CHECK_HEADERS(event.h, [], [AC_MSG_ERROR([header file <event.h> is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])
AC_SEARCH_LIBS(event_init, event, [], [AC_MSG_ERROR([library 'libevent' is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])

# Check for sigar
AC_SEARCH_LIBS(sigar_open, sigar)

# Check for net-snmp
if test "$enable_snmp" = yes ; then
	AC_CHECK_LIB(netsnmp,  netsnmp_ds_set_string,  [], [AC_MSG_ERROR([library 'netsnmp' is required for snmp support.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --enable-snmp if you don't want to enable the snmp support.])])
fi 

# Check for libesmtp
if test "$enable_email" = yes ; then
	if test "$with_openssl" != yes ; then
		AC_MSG_ERROR([--enable-email requires --with-openssl])
	fi
	AC_CHECK_LIB(esmtp,  smtp_start_session,  [], [AC_MSG_ERROR([library 'libesmtp' is required for email alert support.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --enable-email if you don't want to enable the email alert support.])])
fi

##
## Header files
##

dnl sys/socket.h is required by AC_FUNC_ACCEPT_ARGTYPES
AC_CHECK_HEADERS([crypt.h dld.h endian.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h poll.h pwd.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h kernel/OS.h kernel/image.h SupportDefs.h])

# On BSD, cpp test for net/if.h will fail unless sys/socket.h
# is included first.
AC_CHECK_HEADERS(net/if.h, [], [],
[AC_INCLUDES_DEFAULT
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
])

# At least on IRIX, cpp test for netinet/tcp.h will fail unless
# netinet/in.h is included first.
AC_CHECK_HEADERS(netinet/in.h)
AC_CHECK_HEADERS(netinet/tcp.h, [], [],
[AC_INCLUDES_DEFAULT
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
])

if expr x"$pgac_cv_check_readline" : 'x-lreadline' >/dev/null ; then
  AC_CHECK_HEADERS(readline/readline.h, [],
        [AC_CHECK_HEADERS(readline.h, [],
                [AC_MSG_ERROR([readline header not found
If you have readline already installed, see config.log for details on the
failure.  It is possible the compiler isn't looking in the proper directory.
Use --without-readline to disable readline support.])])])
  AC_CHECK_HEADERS(readline/history.h, [],
        [AC_CHECK_HEADERS(history.h, [],
                [AC_MSG_ERROR([history header not found
If you have readline already installed, see config.log for details on the
failure.  It is possible the compiler isn't looking in the proper directory.
Use --without-readline to disable readline support.])])])
fi

if expr x"$pgac_cv_check_readline" : 'x-ledit' >/dev/null ; then
# Some installations of libedit usurp /usr/include/readline/, which seems
# bad practice, since in combined installations readline will have its headers
# there.  We might have to resort to AC_EGREP checks to make sure we found
# the proper header...
  AC_CHECK_HEADERS(editline/readline.h, [],
        [AC_CHECK_HEADERS(readline.h, [],
                [AC_CHECK_HEADERS(readline/readline.h, [],
                        [AC_MSG_ERROR([readline header not found
If you have libedit already installed, see config.log for details on the
failure.  It is possible the compiler isn't looking in the proper directory.
Use --without-readline to disable libedit support.])])])])
# Note: in a libedit installation, history.h is sometimes a dummy, and may
# not be there at all.  Hence, don't complain if not found.  We must check
# though, since in yet other versions it is an independent header.
  AC_CHECK_HEADERS(editline/history.h, [],
        [AC_CHECK_HEADERS(history.h, [],
                [AC_CHECK_HEADERS(readline/history.h)])])
fi

if test "$with_zlib" = yes; then
  AC_CHECK_HEADER(zlib.h, [], [AC_MSG_ERROR([zlib header not found
If you have zlib already installed, see config.log for details on the
failure.  It is possible the compiler isn't looking in the proper directory.
Use --without-zlib to disable zlib support.])])
fi

if test "$with_gssapi" = yes ; then
  AC_CHECK_HEADERS(gssapi/gssapi.h, [],
	[AC_CHECK_HEADERS(gssapi.h, [], [AC_MSG_ERROR([gssapi.h header file is required for GSSAPI.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-gssapi if you don't want the GSSAPI support.])])])
fi

if test "$with_krb5" = yes ; then
  AC_CHECK_HEADER(krb5.h, [], [AC_MSG_ERROR([header file <krb5.h> is required for Kerberos 5.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-krb5 if you don't want the Kerberos 5 support.])])
fi

if test "$with_openssl" = yes ; then
  dnl workaround for 'brew link openssl --force' error on MacOS 10.12 
  if test "$PORTNAME" == "darwin"; then
      CPPFLAGS="$CPPFLAGS -I/usr/local/opt/openssl/include"
  fi
  AC_CHECK_HEADER(openssl/ssl.h, [], [AC_MSG_ERROR([header file <openssl/ssl.h> is required for OpenSSL.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-openssl if you don't want to the OpenSSL support.])])
  AC_CHECK_HEADER(openssl/err.h, [], [AC_MSG_ERROR([header file <openssl/err.h> is required for OpenSSL.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-openssl if you don't want to the OpenSSL support.])])
  AC_CHECK_FUNCS([ERR_set_mark])
fi

BACKUPCPPFLAG=${CPPFLAGS}
BACKUPLDFLAG=${LDFLAGS}

if test "$PORTNAME" == "darwin"; then
    CPPFLAGS="-I/usr/local/opt/openssl/include $CPPFLAGS"
    LDFLAGS="-L/usr/local/opt/openssl/lib $LDFLAGS"
fi

if test ! x"${DEPENDENCY_INSTALL_PREFIX}" == x""; then
    CPPFLAGS="-I${DEPENDENCY_INSTALL_PREFIX}/include $CPPFLAGS"
    LDFLAGS="-L${DEPENDENCY_INSTALL_PREFIX}/lib $LDFLAGS"
fi

AC_SEARCH_LIBS(EVP_aes_256_ctr,crypto, [], [AC_MSG_ERROR([function 'EVP_aes_256_ctr' in library 'openssl' is required by libhdfs3.You can export DEPENDENCY_INSTALL_PREFIX as custom path.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])

CPPFLAGS=${BACKUPCPPFLAG}
LDFLAGS=${BACKUPLDFLAG}

if test "$with_pam" = yes ; then
  AC_CHECK_HEADERS(security/pam_appl.h, [],
                   [AC_CHECK_HEADERS(pam/pam_appl.h, [],
                                     [AC_MSG_ERROR([header file <security/pam_appl.h> or <pam/pam_appl.h> is required for PAM.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Use --without-pam to disable the PAM support.])])])
fi

if test "$with_ldap" = yes ; then
  if test "$PORTNAME" != "win32"; then
     AC_CHECK_HEADERS(ldap.h, [],
                      [AC_MSG_ERROR([header file <ldap.h> is required for LDAP.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])
  else
     AC_CHECK_HEADERS(winldap.h, [],
                      [AC_MSG_ERROR([header file <winldap.h> is required for LDAP])],
                      [AC_INCLUDES_DEFAULT
#include <windows.h>
                      ])
  fi
fi

if test "$with_bonjour" = yes ; then
  AC_CHECK_HEADER(DNSServiceDiscovery/DNSServiceDiscovery.h, [], [AC_MSG_ERROR([header file <DNSServiceDiscovery/DNSServiceDiscovery.h> is required for Bonjour.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])
fi

# For processor affinity support in Linux on NUMA platforms such as
# AMD x86_64, the 'numactl' or 'libnuma' package is required.  See
#  http://lwn.net/Articles/67005/
#  http://www.x86-64.org/pipermail/discuss/2003-May/003528.html
case $template in
  linux*)
    AC_CHECK_LIB(numa, numa_available)
    AC_CHECK_HEADERS([numa.h])
    ;;
esac

# net-snmp
if test "$enable_snmp" = yes; then
	AC_CHECK_HEADERS([net-snmp/net-snmp-config.h], [],
					[AC_MSG_ERROR([header file <net-snmp/net-snmp-config.h> is required for snmp support.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Use --disable-snmp to disable the snmp support.])])
fi

# email
if test "$enable_email" = yes; then
	AC_CHECK_HEADERS(libesmtp.h, [],
					[AC_MSG_ERROR([header file <libesnmp.h> is required for email alert support.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Use --disable-email to disable the snmp support.])])
	AC_CHECK_HEADERS(auth-client.h, [],
					[AC_MSG_ERROR([header file <auth-client.h> is required for email alert support.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Use --disable-email to disable the snmp support.])])
fi

# realtime library header
if test "$with_rt" = yes; then
	AC_CHECK_HEADERS([time.h], [],
			 [AC_MSG_ERROR([header file <time.h> is required for realtime library support.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Use --without-rt to avoid using realtime library.])])
fi

# json-c 
AC_CHECK_HEADERS(json-c/json.h, [], [AC_MSG_ERROR([header file <json-c/json.h> is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])
AC_SEARCH_LIBS(json_tokener_parse, json-c json, [], [AC_MSG_ERROR([library 'json-c' is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])], [])

# uuid 
AC_CHECK_HEADERS(uuid/uuid.h, [], [AC_MSG_ERROR([header file <uuid/uuid.h> is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])
AC_SEARCH_LIBS(uuid, [], [AC_MSG_ERROR([library 'uuid' is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])], [])

# libxml2
AM_PATH_XML2([2.7.6], [], [AC_MSG_ERROR([libxml2 is required.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.])])
pgac_args="$pgac_args with_xml_prefix with_xml_exec_prefix enable_xmltest"
CFLAGS="$CFLAGS $XML_CPPFLAGS"

# apr for gpfdist
AC_CHECK_PROG([APR_CONFIG], [apr-1-config],[yes])
test -z "$APR_CONFIG" && AC_MSG_ERROR([Please install apr from http://apr.apache.org/ and add dir of 'apr-1-config' to env variable '$PATH'.])

##
## Types, structures, compiler characteristics
##

m4_defun([AC_PROG_CC_STDC], []) dnl We don't want that.
AC_C_BIGENDIAN
AC_C_CONST
AC_C_INLINE
AC_C_STRINGIZE
PGAC_C_SIGNED
AC_C_VOLATILE
PGAC_C_FUNCNAME_SUPPORT
PGAC_STRUCT_TIMEZONE
PGAC_UNION_SEMUN
PGAC_STRUCT_SOCKADDR_UN
PGAC_STRUCT_SOCKADDR_STORAGE
PGAC_STRUCT_SOCKADDR_STORAGE_MEMBERS
PGAC_STRUCT_ADDRINFO
AC_TYPE_INTPTR_T
AC_TYPE_UINTPTR_T
AC_TYPE_LONG_LONG_INT

AC_CHECK_TYPES([struct cmsgcred, struct fcred, struct sockcred], [], [],
[#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ucred.h>])

AC_CHECK_TYPES([struct option], [], [],
[#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif])

if test "$with_zlib" = yes; then
  # Check that <zlib.h> defines z_streamp (versions before about 1.0.4
  # did not).  While we could work around the lack of z_streamp, it
  # seems unwise to encourage people to use such old zlib versions...
  AC_CHECK_TYPE(z_streamp, [], [AC_MSG_ERROR([zlib version is too old
Use --without-zlib to disable zlib support.])],
                [#include <zlib.h>])
fi

if test "$with_krb5" = yes; then
# Check for differences between MIT and Heimdal (KTH) releases
  AC_CHECK_MEMBERS(krb5_ticket.enc_part2, [],
                   [AC_CHECK_MEMBERS(krb5_ticket.client, [],
                                     [AC_MSG_ERROR([could not determine how to get client name from Kerberos 5 ticket])],
                                     [#include <krb5.h>])],
                   [#include <krb5.h>])
  AC_CHECK_MEMBERS(krb5_error.text.data, [],
                   [AC_CHECK_MEMBERS(krb5_error.e_data, [],
                                     [AC_MSG_ERROR([could not determine how to extract Kerberos 5 error messages])],
                                     [#include <krb5.h>])],
                   [#include <krb5.h>])

# Win32 requires headers to be loaded for __stdcall, so can't use
# AC_CHECK_FUNCS here.
  AC_MSG_CHECKING(for krb5_free_unparsed_name)
  AC_TRY_LINK([#include <krb5.h>],
              [krb5_free_unparsed_name(NULL,NULL);],
              [AC_DEFINE(HAVE_KRB5_FREE_UNPARSED_NAME, 1, [Define to 1 if you have krb5_free_unparsed_name])
AC_MSG_RESULT(yes)],
              [AC_MSG_RESULT(no)])
fi


##
## Functions, global variables
##

PGAC_VAR_INT_TIMEZONE
AC_FUNC_ACCEPT_ARGTYPES
PGAC_FUNC_GETTIMEOFDAY_1ARG

AC_CHECK_FUNCS([cbrt dlopen fcvt fdatasync getifaddrs getpeereid getpeerucred getrlimit memmove poll pstat readlink setproctitle setsid sigprocmask symlink sysconf towlower utime utimes waitpid wcstombs])

# posix_fadvise() is a no-op on Solaris, so don't incur function overhead
# by calling it, 2009-04-02
# http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libc/port/gen/posix_fadvise.c
if test "$PORTNAME" != "solaris"; then
AC_CHECK_FUNCS(posix_fadvise)
AC_CHECK_DECLS(posix_fadvise, [], [], [#include <fcntl.h>])
fi

AC_CHECK_DECLS(fdatasync, [], [], [#include <unistd.h>])
AC_CHECK_DECLS([strlcat, strlcpy])
# This is probably only present on Darwin, but may as well check always
AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])

HAVE_IPV6=no
AC_CHECK_TYPE([struct sockaddr_in6],
        [AC_DEFINE(HAVE_IPV6, 1, [Define to 1 if you have support for IPv6.])
         HAVE_IPV6=yes],
        [],
[$ac_includes_default
#include <netinet/in.h>])
AC_SUBST(HAVE_IPV6)

AC_CACHE_CHECK([for PS_STRINGS], [pgac_cv_var_PS_STRINGS],
[AC_TRY_LINK(
[#include <machine/vmparam.h>
#include <sys/exec.h>
],
[PS_STRINGS->ps_nargvstr = 1;
PS_STRINGS->ps_argvstr = "foo";],
[pgac_cv_var_PS_STRINGS=yes],
[pgac_cv_var_PS_STRINGS=no])])
if test "$pgac_cv_var_PS_STRINGS" = yes ; then
  AC_DEFINE([HAVE_PS_STRINGS], [], [Define to 1 if the PS_STRINGS thing exists.])
fi


# We use our snprintf.c emulation if either snprintf() or vsnprintf()
# is missing.  Yes, there are machines that have only one.  We may
# also decide to use snprintf.c if snprintf() is present but does not
# have all the features we need --- see below.

if test "$PORTNAME" = "win32"; then
  # Win32 gets snprintf.c built unconditionally.
  #
  # To properly translate all NLS languages strings, we must support the
  # *printf() %$ format, which allows *printf() arguments to be selected
  # by position in the translated string. 
  # 
  # libintl versions < 0.13 use the native *printf() functions, and Win32
  # *printf() doesn't understand %$, so we must use our /port versions,
  # which do understand %$. libintl versions >= 0.13 include their own
  # *printf versions on Win32.  The libintl 0.13 release note text is:
  #
  #   C format strings with positions, as they arise when a translator
  #   needs to reorder a sentence, are now supported on all platforms.
  #   On those few platforms (NetBSD and Woe32) for which the native
  #   printf()/fprintf()/... functions don't support such format
  #   strings, replacements are provided through <libintl.h>.
  #
  # We could use libintl >= 0.13's *printf() if we were sure that we had
  # a litint >= 0.13 at runtime, but seeing that there is no clean way
  # to guarantee that, it is best to just use our own, so we are sure to
  # get %$ support. In include/port.h we disable the *printf() macros
  # that might have been defined by libintl.
  #
  # We do this unconditionally whether NLS is used or not so we are sure
  # that all Win32 libraries and binaries behave the same.
  pgac_need_repl_snprintf=yes
else
  pgac_need_repl_snprintf=no
  AC_CHECK_FUNCS(snprintf, [], pgac_need_repl_snprintf=yes)
  AC_CHECK_FUNCS(vsnprintf, [], pgac_need_repl_snprintf=yes)
fi


# Check whether <stdio.h> declares snprintf() and vsnprintf(); if not,
# include/c.h will provide declarations.  Note this is a separate test
# from whether the functions exist in the C library --- there are
# systems that have the functions but don't bother to declare them :-(

AC_CHECK_DECLS([snprintf, vsnprintf])


dnl Cannot use AC_CHECK_FUNC because isinf may be a macro
AC_CACHE_CHECK([for isinf], ac_cv_func_isinf,
[AC_TRY_LINK([
#include <math.h>
double glob_double;
],
[return isinf(glob_double) ? 0 : 1;],
[ac_cv_func_isinf=yes],
[ac_cv_func_isinf=no])])

if test $ac_cv_func_isinf = yes ; then
  AC_DEFINE(HAVE_ISINF, 1, [Define to 1 if you have isinf().])
else
  AC_LIBOBJ(isinf)
  # Look for a way to implement a substitute for isinf()
  AC_CHECK_FUNCS([fpclass fp_class fp_class_d class], [break])
fi

# Some versions of libedit contain strlcpy(); so disregard that library while
# checking for these standard libc functions.
pgac_save_LIBS="$LIBS"
LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g' -e 's/-lnetsnmp//g'`

AC_REPLACE_FUNCS([crypt fseeko getopt getrusage inet_aton random rint srandom strdup strerror strlcat strlcpy strtol strtoul unsetenv])

case $host_os in

        # Windows uses a specialised env handler
        mingw*)
                AC_DEFINE(HAVE_UNSETENV, 1, [Define to 1 because replacement version used.])
                ac_cv_func_unsetenv=yes;;
        *)
                AC_REPLACE_FUNCS([unsetenv])
		;;
esac

LIBS="$pgac_save_LIBS"

# System's version of getaddrinfo(), if any, may be used only if we found
# a definition for struct addrinfo; see notes in src/include/getaddrinfo.h.
# (Note: the AC_REPLACE_FUNCS probe fails on Windows, where the available
# versions of getaddrinfo don't follow normal C call protocol.  This is OK
# because we want to use our own getaddrinfo.c on Windows anyway.)
if test x"$ac_cv_type_struct_addrinfo" = xyes ; then
  AC_REPLACE_FUNCS([getaddrinfo])
else
  AC_LIBOBJ(getaddrinfo)
fi

# Similarly, use system's getopt_long() only if system provides struct option.
if test x"$ac_cv_type_struct_option" = xyes ; then
  AC_REPLACE_FUNCS([getopt_long])
else
  AC_LIBOBJ(getopt_long)
fi

# Solaris' getopt() doesn't do what we want for long options, so always use
# our version on that platform.
if test "$PORTNAME" = "solaris"; then
  AC_LIBOBJ(getopt)
fi

# Win32 support
if test "$PORTNAME" = "win32"; then
AC_REPLACE_FUNCS(gettimeofday)
AC_LIBOBJ(kill)
AC_LIBOBJ(open)
AC_LIBOBJ(rand)
AC_LIBOBJ(win32env)
AC_LIBOBJ(win32error)
AC_DEFINE([HAVE_SYMLINK], 1,
          [Define to 1 if you have the `symlink' function.])
fi

if test "$with_readline" = yes; then
  PGAC_VAR_RL_COMPLETION_APPEND_CHARACTER
  AC_CHECK_FUNCS([rl_completion_matches rl_filename_completion_function])
  AC_CHECK_FUNCS([replace_history_entry])
fi


dnl Cannot use AC_CHECK_FUNC because finite may be a macro
AC_MSG_CHECKING(for finite)
AC_TRY_LINK([
#include <math.h>
double glob_double;
],
            [return finite(glob_double) ? 0 : 1;],
            [AC_DEFINE(HAVE_FINITE, 1, [Define to 1 if you have finite().])
AC_MSG_RESULT(yes)],
            [AC_MSG_RESULT(no)])

dnl Cannot use AC_CHECK_FUNC because sigsetjmp may be a macro
dnl (especially on GNU libc)
dnl See also comments in c.h.
AC_MSG_CHECKING(for sigsetjmp)
AC_TRY_LINK([#include <setjmp.h>],
            [sigjmp_buf x; sigsetjmp(x, 1);],
            [AC_DEFINE(HAVE_SIGSETJMP, 1, [Define to 1 if you have sigsetjmp().])
AC_MSG_RESULT(yes)],
            [AC_MSG_RESULT(no)])

AC_DECL_SYS_SIGLIST

AC_CHECK_FUNC(syslog,
              [AC_CHECK_HEADER(syslog.h,
                               [AC_DEFINE(HAVE_SYSLOG, 1, [Define to 1 if you have the syslog interface.])])])

AC_CACHE_CHECK([for opterr], pgac_cv_var_int_opterr,
[AC_TRY_LINK([#include <unistd.h>],
  [extern int opterr; opterr = 1;],
  [pgac_cv_var_int_opterr=yes],
  [pgac_cv_var_int_opterr=no])])
if test x"$pgac_cv_var_int_opterr" = x"yes"; then
  AC_DEFINE(HAVE_INT_OPTERR, 1, [Define to 1 if you have the global variable 'int opterr'.])
fi

AC_CACHE_CHECK([for optreset], pgac_cv_var_int_optreset,
[AC_TRY_LINK([#include <unistd.h>],
  [extern int optreset; optreset = 1;],
  [pgac_cv_var_int_optreset=yes],
  [pgac_cv_var_int_optreset=no])])
if test x"$pgac_cv_var_int_optreset" = x"yes"; then
  AC_DEFINE(HAVE_INT_OPTRESET, 1, [Define to 1 if you have the global variable 'int optreset'.])
fi

AC_CHECK_FUNCS([strtoll strtoq], [break])
AC_CHECK_FUNCS([strtoull strtouq], [break])

# Check for one of atexit() or on_exit()
AC_CHECK_FUNCS(atexit, [],
               [AC_CHECK_FUNCS(on_exit, [],
               [AC_MSG_ERROR([neither atexit() nor on_exit() found])])])

AC_REPLACE_FUNCS(fseeko)
case $host_os in
	# BSD/OS & NetBSD use a custom fseeko/ftello built on fsetpos/fgetpos
	# Mingw uses macros to access Win32 API calls
	bsdi*|netbsd*|mingw*)
		AC_DEFINE(HAVE_FSEEKO, 1, [Define to 1 because replacement version used.])
		ac_cv_func_fseeko=yes;;
	*)
		AC_FUNC_FSEEKO;;
esac


#
# Pthreads
#
# For each platform, we need to know about any special compile and link
# libraries, and whether the normal C function names are thread-safe.
# See the comment at the top of src/port/thread.c for more information.
# WIN32 doesn't need the pthread tests;  it always uses threads
if test "$enable_thread_safety" = yes -a "$PORTNAME" != "win32"; then
ACX_PTHREAD	# set thread flags

# Some platforms use these, so just define them.  They can't hurt if they
# are not supported.  For example, on Solaris -D_POSIX_PTHREAD_SEMANTICS
# enables 5-arg getpwuid_r, among other things.
PTHREAD_CFLAGS="$PTHREAD_CFLAGS -D_REENTRANT -D_THREAD_SAFE -D_POSIX_PTHREAD_SEMANTICS"


# At this point, we don't want to muck with the compiler name for threading.
# Let's see who fails, perhaps AIX.  2004-04-23
if test "$PTHREAD_CC" != "$CC"; then
AC_MSG_ERROR([
PostgreSQL does not support platforms that require a special compiler
for thread safety.])
fi

if test "$THREAD_SUPPORT" = no; then
AC_MSG_ERROR([cannot enable threads on this platform
This platform is known to not support thread-safe programs.  For details,
compile and run src/bin/pg_thread_test.])
fi

# Check for *_r functions
_CFLAGS="$CFLAGS"
_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
LIBS="$LIBS $PTHREAD_LIBS"

if test "$PORTNAME" != "win32"; then
AC_CHECK_HEADER(pthread.h, [], [AC_MSG_ERROR([pthread.h not found, required for --enable-thread-safety])])
fi

AC_CHECK_FUNCS([strerror_r getpwuid_r gethostbyname_r])

# Do test here with the proper thread flags
PGAC_FUNC_GETPWUID_R_5ARG
PGAC_FUNC_STRERROR_R_INT

CFLAGS="$_CFLAGS"
LIBS="$_LIBS"

else
# do not use values from template file
PTHREAD_CFLAGS=
PTHREAD_LIBS=
fi

AC_SUBST(PTHREAD_CFLAGS)
AC_SUBST(PTHREAD_LIBS)


# We can test for libldap_r only after we know PTHREAD_LIBS
if test "$with_ldap" = yes ; then
  _LIBS="$LIBS"
  if test "$PORTNAME" != "win32"; then
    AC_CHECK_LIB(ldap, ldap_bind, [],
		 [AC_MSG_ERROR([library 'ldap' is required for LDAP])],
		 [$EXTRA_LDAP_LIBS])
    LDAP_LIBS_BE="-lldap $EXTRA_LDAP_LIBS"
    if test "$enable_thread_safety" = yes; then
      # on some platforms ldap_r fails to link without PTHREAD_LIBS
      AC_CHECK_LIB(ldap_r, ldap_simple_bind, [],
		   [AC_MSG_ERROR([library 'ldap_r' is required for LDAP])],
		   [$PTHREAD_CFLAGS $PTHREAD_LIBS $EXTRA_LDAP_LIBS])
      LDAP_LIBS_FE="-lldap_r $EXTRA_LDAP_LIBS"
    else
      LDAP_LIBS_FE="-lldap $EXTRA_LDAP_LIBS"
    fi
  else
    AC_CHECK_LIB(wldap32, ldap_bind, [], [AC_MSG_ERROR([library 'wldap32' is required for LDAP])])
    LDAP_LIBS_FE="-lwldap32"
    LDAP_LIBS_BE="-lwldap32"
  fi
  LIBS="$_LIBS"
fi
AC_SUBST(LDAP_LIBS_FE)
AC_SUBST(LDAP_LIBS_BE)


# This test makes sure that run tests work at all.  Sometimes a shared
# library is found by the linker, but the runtime linker can't find it.
# This check should come after all modifications of compiler or linker
# variables, and before any other run tests.
AC_MSG_CHECKING([test program])
AC_TRY_RUN([int main() { return 0; }],
[AC_MSG_RESULT(ok)],
[AC_MSG_RESULT(failed)
AC_MSG_ERROR([[
Could not execute a simple test program.  This may be a problem
related to locating shared libraries.  Check the file 'config.log'
for the exact reason.]])],
[AC_MSG_RESULT([cross-compiling])])

# --------------------
# Run tests below here
# --------------------

# Force use of our snprintf if system's doesn't do arg control
# See comment above at snprintf test for details.
if test "$enable_nls" = yes -a "$pgac_need_repl_snprintf" = no; then
  PGAC_FUNC_PRINTF_ARG_CONTROL
  if test $pgac_cv_printf_arg_control != yes ; then
    pgac_need_repl_snprintf=yes
  fi
fi


dnl Check to see if we have a working 64-bit integer type.
dnl This breaks down into two steps:
dnl (1) figure out if the compiler has a 64-bit int type with working
dnl arithmetic, and if so
dnl (2) see whether snprintf() can format the type correctly.  (Currently,
dnl snprintf is the only library routine we really need for int8 support.)
dnl It's entirely possible to have a compiler that handles a 64-bit type
dnl when the C library doesn't; this is fairly likely when using gcc on
dnl an older platform, for example.
dnl If there is no native snprintf() or it does not handle the 64-bit type,
dnl we force our own version of snprintf() to be used instead.
dnl Note this test must be run after our initial check for snprintf/vsnprintf.

dnl As of Postgres 8.4, we no longer support compilers without a working
dnl 64-bit type.  But we still handle the case of snprintf being broken.

PGAC_TYPE_64BIT_INT([long int])

if test x"$HAVE_LONG_INT_64" = x"no" ; then
  PGAC_TYPE_64BIT_INT([long long int])
  if test x"$HAVE_LONG_LONG_INT_64" = x"no" ; then
    AC_MSG_ERROR([Cannot find a working 64-bit integer type.])
  fi
fi


dnl If we need to use "long long int", figure out whether nnnLL notation works.

if test x"$HAVE_LONG_LONG_INT_64" = xyes ; then
  AC_TRY_COMPILE([
#define INT64CONST(x)  x##LL
long long int foo = INT64CONST(0x1234567890123456);
],
	[],
	[AC_DEFINE(HAVE_LL_CONSTANTS, 1, [Define to 1 if constants of type 'long long int' should have the suffix LL.])],
	[])
fi


# If we found "long int" is 64 bits, assume snprintf handles it.  If
# we found we need to use "long long int", better check.  We cope with
# snprintfs that use %lld, %qd, or %I64d as the format.  If none of these
# work, fall back to our own snprintf emulation (which we know uses %lld).

if test "$HAVE_LONG_LONG_INT_64" = yes ; then
  if test $pgac_need_repl_snprintf = no; then
    PGAC_FUNC_SNPRINTF_LONG_LONG_INT_FORMAT
    if test "$LONG_LONG_INT_FORMAT" = ""; then
      # Force usage of our own snprintf, since system snprintf is broken
      pgac_need_repl_snprintf=yes
      LONG_LONG_INT_FORMAT='%lld'
    fi
  else
    # Here if we previously decided we needed to use our own snprintf
    LONG_LONG_INT_FORMAT='%lld'
  fi
  LONG_LONG_UINT_FORMAT=`echo "$LONG_LONG_INT_FORMAT" | sed 's/d$/u/'`
  INT64_FORMAT="\"$LONG_LONG_INT_FORMAT\""
  UINT64_FORMAT="\"$LONG_LONG_UINT_FORMAT\""
else
  # Here if we are not using 'long long int' at all
  INT64_FORMAT='"%ld"'
  UINT64_FORMAT='"%lu"'
fi

AC_DEFINE_UNQUOTED(INT64_FORMAT, $INT64_FORMAT,
                   [Define to the appropriate snprintf format for 64-bit ints, if any.])

AC_DEFINE_UNQUOTED(UINT64_FORMAT, $UINT64_FORMAT,
                   [Define to the appropriate snprintf format for unsigned 64-bit ints, if any.])

# Define the length of char bytes needed to represent int32
AC_DEFINE(INT32_CHAR_SIZE, 12,
	  [Define number of bytes required to represent an Int32 in Char format])

# Now we have checked all the reasons to replace snprintf
if test $pgac_need_repl_snprintf = yes; then
  AC_DEFINE(USE_REPL_SNPRINTF, 1, [Use replacement snprintf() functions.])
  AC_LIBOBJ(snprintf)
fi

# Need a #define for the size of Datum (unsigned long)
AC_CHECK_SIZEOF([unsigned long])

# And check size of void *, size_t (enables tweaks for > 32bit address space)
AC_CHECK_SIZEOF([void *])
AC_CHECK_SIZEOF([size_t])

# Determine memory alignment requirements for the basic C data types.

PGAC_CHECK_ALIGNOF(short)
PGAC_CHECK_ALIGNOF(int)
PGAC_CHECK_ALIGNOF(long)
if test x"$HAVE_LONG_LONG_INT_64" = x"yes" ; then
  PGAC_CHECK_ALIGNOF(long long int)
fi
PGAC_CHECK_ALIGNOF(double)

# Compute maximum alignment of any basic type.
# We assume long's alignment is at least as strong as char, short, or int;
# but we must check long long (if it exists) and double.

MAX_ALIGNOF=$pgac_cv_alignof_long
if test $MAX_ALIGNOF -lt $pgac_cv_alignof_double ; then
  MAX_ALIGNOF=$pgac_cv_alignof_double
fi
if test x"$HAVE_LONG_LONG_INT_64" = xyes && test $MAX_ALIGNOF -lt $pgac_cv_alignof_long_long_int ; then
  MAX_ALIGNOF="$pgac_cv_alignof_long_long_int"
fi
AC_DEFINE_UNQUOTED(MAXIMUM_ALIGNOF, $MAX_ALIGNOF, [Define as the maximum alignment requirement of any C data type.])


# Some platforms predefine the types int8, int16, etc.  Only check
# a (hopefully) representative subset.
AC_CHECK_TYPES([int8, uint8, int64, uint64], [], [],
[#include <stdio.h>
#ifdef HAVE_SUPPORTDEFS_H
#include <SupportDefs.h>
#endif])

# We also check for sig_atomic_t, which *should* be defined per ANSI
# C, but is missing on some old platforms.
AC_CHECK_TYPES(sig_atomic_t, [], [], [#include <signal.h>])


# If the user did not disable integer datetimes, check that
# there is a working 64-bit integral type to use.
if test x"$USE_INTEGER_DATETIMES" = x"yes" &&
   test x"$HAVE_LONG_INT_64" = x"no" &&
   test x"$HAVE_LONG_LONG_INT_64" = x"no" &&
   test x"$HAVE_INT64" = x"no" ; then
  AC_MSG_ERROR([
Integer-based datetime support requires a 64-bit integer type,
but no such type could be found. The --disable-integer-datetimes
configure option can be used to disable integer-based storage
of datetime values.])
fi


if test "$PORTNAME" != "win32"
then
PGAC_FUNC_POSIX_SIGNALS
if test "$pgac_cv_func_posix_signals" != yes -a "$enable_thread_safety" = yes; then
  AC_MSG_ERROR([
Thread-safety requires POSIX signals, which are not supported by this
operating system.])
fi
fi

if test $ac_cv_func_fseeko = yes; then
AC_SYS_LARGEFILE
AC_SUBST(enable_largefile)
else
enable_largefile=no
AC_SUBST(enable_largefile)
fi

# Check for largefile support (must be after AC_SYS_LARGEFILE)
AC_CHECK_SIZEOF([off_t])

if test "$PORTNAME" != "win32"; then
# If we don't have largefile support, can't handle segsize >= 2GB.
if test "$ac_cv_sizeof_off_t" -lt 8 -a "$segsize" != "1"; then 
   AC_MSG_ERROR([Large file support is not enabled. Segment size cannot be larger than 1GB.]) 
fi
fi

# SunOS doesn't handle negative byte comparisons properly with +/- return
AC_FUNC_MEMCMP


# Select semaphore implementation type.
if test "$PORTNAME" != "win32"; then
  if test x"$USE_NAMED_POSIX_SEMAPHORES" = x"1" ; then
    AC_DEFINE(USE_NAMED_POSIX_SEMAPHORES, 1, [Define to select named POSIX semaphores.])
    SEMA_IMPLEMENTATION="src/backend/port/posix_sema.c"
  else
    if test x"$USE_UNNAMED_POSIX_SEMAPHORES" = x"1" ; then
      AC_DEFINE(USE_UNNAMED_POSIX_SEMAPHORES, 1, [Define to select unnamed POSIX semaphores.])
      SEMA_IMPLEMENTATION="src/backend/port/posix_sema.c"
    else
  AC_DEFINE(USE_SYSV_SEMAPHORES, 1, [Define to select SysV-style semaphores.])
  SEMA_IMPLEMENTATION="src/backend/port/sysv_sema.c"
    fi
  fi
else
  AC_DEFINE(USE_WIN32_SEMAPHORES, 1, [Define to select Win32-style semaphores.])
  SEMA_IMPLEMENTATION="src/backend/port/win32_sema.c"
fi


# Select shared-memory implementation type.
if test "$PORTNAME" != "win32"; then
AC_DEFINE(USE_SYSV_SHARED_MEMORY, 1, [Define to select SysV-style shared memory.])
SHMEM_IMPLEMENTATION="src/backend/port/sysv_shmem.c"
else
  AC_DEFINE(USE_WIN32_SHARED_MEMORY, 1, [Define to select Win32-style shared memory.])
  SHMEM_IMPLEMENTATION="src/backend/port/win32_shmem.c"
fi

# If not set in template file, set bytes to use libc memset()
if test x"$MEMSET_LOOP_LIMIT" = x"" ; then
  MEMSET_LOOP_LIMIT=1024
fi
AC_DEFINE_UNQUOTED(MEMSET_LOOP_LIMIT, ${MEMSET_LOOP_LIMIT}, [Define bytes to use libc memset().])


if test "$enable_nls" = yes ; then
  PGAC_CHECK_GETTEXT
fi

# Check for Tcl configuration script tclConfig.sh
if test "$with_tcl" = yes; then
    PGAC_PATH_TCLCONFIGSH([$with_tclconfig])
    PGAC_EVAL_TCLCONFIGSH([$TCL_CONFIG_SH],
                          [TCL_INCLUDE_SPEC,TCL_LIB_FILE,TCL_LIBS,TCL_LIB_SPEC,TCL_SHARED_BUILD])
    AC_SUBST(TCL_SHLIB_LD_LIBS)dnl don't want to double-evaluate that one
    # now that we have TCL_INCLUDE_SPEC, we can check for <tcl.h>
    ac_save_CPPFLAGS=$CPPFLAGS
    CPPFLAGS="$TCL_INCLUDE_SPEC $CPPFLAGS"
    AC_CHECK_HEADER(tcl.h, [], [AC_MSG_ERROR([header file <tcl.h> is required for Tcl.
Check config.log for details. It is possible the compiler isn't looking in the proper directory.
Don't use --with-tcl if you don't want to enable to PL/Tcl funciontality.])])
    CPPFLAGS=$ac_save_CPPFLAGS
fi

#
# Check for DocBook and tools
#
PGAC_PROG_NSGMLS
PGAC_PROG_JADE
PGAC_CHECK_DOCBOOK(4.2)
PGAC_PATH_DOCBOOK_STYLESHEETS
PGAC_PATH_COLLATEINDEX
AC_CHECK_PROGS(SGMLSPL, sgmlspl)

# Thread testing

# We have to run the thread test near the end so we have all our symbols
# defined.  Cross compiling throws a warning.
#
if test "$enable_thread_safety_force" = yes; then
if test "$PORTNAME" != "win32"
then
  AC_MSG_WARN([
*** Skipping thread test program.  --enable-thread-safety-force was used.
*** Run the program in src/test/thread on the your machine and add proper
*** locking function calls to your applications to guarantee thread safety.
])
else
AC_MSG_WARN([*** skipping thread test on Win32])
fi
elif test "$enable_thread_safety" = yes; then
if test "$PORTNAME" != "win32"
then
AC_MSG_CHECKING([thread safety of required library functions])

_CFLAGS="$CFLAGS"
_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS -DIN_CONFIGURE"
LIBS="$LIBS $PTHREAD_LIBS"
AC_TRY_RUN([#include "$srcdir/src/test/thread/thread_test.c"],
  [AC_MSG_RESULT(yes)],
  [AC_MSG_RESULT(no)
  AC_MSG_ERROR([thread test program failed
This platform is not thread-safe.  Check the file 'config.log' for the
exact reason.

You can use the configure option --enable-thread-safety-force to force
threads to be enabled.  But you must then run the program in
src/test/thread and add locking function calls to your applications to
guarantee thread safety.])],
  [AC_MSG_RESULT(maybe)
  AC_MSG_WARN([
*** Skipping thread test program because of cross-compile build.
*** Run the program in src/test/thread on the target machine.
])])
CFLAGS="$_CFLAGS"
LIBS="$_LIBS"
else
AC_MSG_WARN([*** skipping thread test on Win32])
fi
fi

# If compiler will take -Wl,--as-needed (or various platform-specific
# spellings thereof) then add that to LDFLAGS.  This is much easier than
# trying to filter LIBS to the minimum for each executable.
# (Note that shared library links won't use this switch, though.)
# On (at least) some Red-Hat-derived systems, this switch breaks linking to
# libreadline; therefore we postpone testing it until we know what library
# dependencies readline has.  The test code will try to link with $LIBS.
if test "$with_readline" = yes; then
  link_test_func=readline
else
  link_test_func=exit
fi

if test "$PORTNAME" = "darwin"; then
  PGAC_PROG_CC_LDFLAGS_OPT([-Wl,-dead_strip_dylibs], $link_test_func)
elif test "$PORTNAME" = "openbsd"; then
  PGAC_PROG_CC_LDFLAGS_OPT([-Wl,-Bdynamic], $link_test_func)
else
  PGAC_PROG_CC_LDFLAGS_OPT([-Wl,--as-needed], $link_test_func)
fi

# Begin output steps

AC_MSG_NOTICE([using CFLAGS=$CFLAGS])
AC_MSG_NOTICE([using CPPFLAGS=$CPPFLAGS])
AC_MSG_NOTICE([using LDFLAGS=$LDFLAGS])


# prepare build tree if outside source tree
# Note 1: test -ef might not exist, but it's more reliable than `pwd`.
# Note 2: /bin/pwd might be better than shell's built-in at getting
#         a symlink-free name.
if ( test "$srcdir" -ef . ) >/dev/null 2>&1 || test "`cd $srcdir && /bin/pwd`" = "`/bin/pwd`"; then
  vpath_build=no
else
  vpath_build=yes
  if test "$no_create" != yes; then
    _AS_ECHO_N([preparing build tree... ])
    pgac_abs_top_srcdir=`cd "$srcdir" && pwd`
    $SHELL "$ac_aux_dir/prep_buildtree" "$pgac_abs_top_srcdir" "." \
      || AC_MSG_ERROR(failed)
    AC_MSG_RESULT(done)
  fi
fi
AC_SUBST(vpath_build)

AC_CONFIG_FILES([GNUmakefile src/VERSIONS.mk src/pl/pljava/src/java/Makefile.global])
AC_CONFIG_FILES([depends/libhdfs3/Makefile.global])
AC_CONFIG_FILES([src/Makefile.global])
AC_CONFIG_FILES([ranger-plugin/Makefile.global])

AC_CONFIG_LINKS([
  src/backend/port/dynloader.c:src/backend/port/dynloader/${template}.c
  src/backend/port/pg_sema.c:${SEMA_IMPLEMENTATION}
  src/backend/port/pg_shmem.c:${SHMEM_IMPLEMENTATION}
  src/include/dynloader.h:src/backend/port/dynloader/${template}.h
  src/include/pg_config_os.h:src/include/port/${template}.h
  src/Makefile.port:src/makefiles/Makefile.${template}
])

if test "$PORTNAME" = "win32"; then
AC_CONFIG_COMMANDS([check_win32_symlinks],[
# Links sometimes fail undetected on Mingw -
# so here we detect it and warn the user
for FILE in $CONFIG_LINKS
 do
	# test -e works for symlinks in the MinGW console
	test -e `expr "$FILE" : '\([[^:]]*\)'` || AC_MSG_WARN([*** link for $FILE -- please fix by hand])
 done
])
fi

# Remove build_timestamp file to make sure rebuild depends lib: libhdfs & libyarn 
rm -f depends/libhdfs3/build/libhdfs3_build_timestamp
rm -f depends/libyarn/build/libyarn_build_timestamp
rm -f depends/thirdparty/gporca_build_timestamp
rm -f depends/thirdparty/gpos_build_timestamp
rm -f depends/thirdparty/gp-xerces_build_timestamp
rm -f depends/thirdparty/gpos_build_timestamp

AC_CONFIG_HEADERS([src/include/pg_config.h],
[
# Update timestamp for pg_config.h (see Makefile.global)
echo >src/include/stamp-h
])

AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h],
                  [echo >src/interfaces/ecpg/include/stamp-h])

AC_OUTPUT

# Warn about unknown options
PGAC_ARG_CHECK
