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

#
# dbcommon
#
PGAC_ARG_BOOL(with, dbcommon, yes,
              [  --without-dbcommon      do not build dbcommon])
AC_SUBST(with_dbcommon)

#
# univplan
#
PGAC_ARG_BOOL(with, univplan, yes,
              [  --without-univplan      do not build univplan])
AC_SUBST(with_univplan)

#
# storage
#
PGAC_ARG_BOOL(with, storage, yes,
              [  --without-storage      do not build storage])
AC_SUBST(with_storage)

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

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

# 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 depends/thirdparty/googletest/Makefile.global depends/libhdfs3/Makefile.global depends/libyarn/Makefile.global depends/dbcommon/Makefile.global depends/univplan/Makefile.global depends/storage/Makefile.global src/Makefile.global src/pl/pljava/src/java/Makefile.global 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 & dbcommon & univplan & storage
rm -f depends/libhdfs3/build/libhdfs3_build_timestamp
rm -f depends/libyarn/build/libyarn_build_timestamp
rm -f depends/dbcommon/build/dbcommon_build_timestamp
rm -f depends/univplan/build/univplan_build_timestamp
rm -f depends/storage/build/storage_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
