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-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_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

# 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 build 1'
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 (Greenplum Database $GP_VERSION) (HAWQ $HQ_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-gphdfs enables GPHDFS support
#
PGAC_ARG_BOOL(enable, gphdfs, no, [  --enable-gphdfs        enables GPHDFS support],
              [AC_DEFINE([USE_GPHDFS], 1, 
                         [Define to 1 to build with gphdfs capabilities. (--enable-gphdfs)])])
AC_MSG_RESULT([checking whether to build with gphdfs...$enable_gphdfs])
AC_SUBST(enable_gphdfs)

#
# --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 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 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)

#
# 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, no,
              [  --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
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


#
# Assignments
#

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

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.])])
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

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.])], [])

# 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.])

# 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 depends/thirdparty/googletest/Makefile.global depends/libhdfs3/Makefile.global depends/libyarn/Makefile.global src/Makefile.global src/pl/pljava/src/java/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
