# -*- autoconf -*-
#########################################
##
# Checks for programs
##
#########################################

##
#   Shell checks:
##

#       Check for 'sh' overflow                         (HP-UX)
#         (taken from Perl's configure script)
#
AC_MSG_CHECKING([if I need to feed myself to ksh])
if test -f /hp-ux -a -f /bin/ksh; then
  if (PATH=.; alias -x) >/dev/null 2>&1; then
    AC_MSG_RESULT(no)
  else
    AC_MSG_RESULT(yes)
    if test "x$1" = "x"; then
      exec /bin/ksh $0
    else
      exec /bin/ksh $0 "$@"
    fi
  fi
else
  AC_MSG_RESULT(no)
fi


##
#   Standard and path program checks:
##

AC_PROG_EGREP
AC_PROG_GREP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_SED

AC_CHECK_PROGS([FILE], [file])
if test x$ac_cv_prog_FILE = x; then
  # The file program is not included in the default Cygwin setup, although
  # this program is essential for libtool to work properly. It is nontrivial
  # to deduce from the message printed by libtool that the 'file' tool is
  # missing and libtool does not abort when the file program is not found. So
  # stop now if the file program has not been found.
  AC_MSG_ERROR([file program not found although it is needed by libtool.], [1])
fi

AC_CHECK_PROGS(FIND,   find)
AC_CHECK_PROGS(WHOAMI, whoami logname, whoami)

AC_PATH_PROG(AUTOCONF,    autoconf)
AC_PATH_PROG(AUTOHEADER,  autoheader)
AC_PATH_PROG([PERLPROG],  perl)
AC_PATH_PROG([PSPROG],    ps)
AC_PATH_PROG([PYTHONPROG],python)

AC_PATH_PROG([UNAMEPROG], uname)
AC_DEFINE_UNQUOTED(UNAMEPROG,"$UNAMEPROG", [Where is the uname command])

if test "x$ac_cv_prog_AUTOCONF" = "x"; then
	AUTOCONF=":"
	AC_SUBST(AUTOCONF)
fi
if test "x$ac_cv_prog_AUTOHEADER" = "x"; then
	AUTOHEADER=":"
	AC_SUBST(AUTOHEADER)
fi

MAKE=${MAKE-"make"}
$MAKE -v -f /dev/null 2>/dev/null | $GREP GNU >/dev/null
have_gnu_make=$?


##
#   The Perl function system() is used for running the Net-SNMP regression
#   tests. Find out whether that function invokes a POSIX shell, which is
#   necessary in order to run the regression tests. When using Windows + MSYS
#   + ActiveState Perl, Perl's system() function does invoke Windows' cmd.exe
#   which is not a POSIX shell.
##

AC_MSG_CHECKING([whether the Perl function system() invokes a POSIX shell])
if test "x$PERLPROG" != 'x' && test -x "$PERLPROG" && test "x`$PERLPROG -e 'system('\''echo $OSTYPE'\'');'`" != 'x$OSTYPE'; then
    PERL_SYSTEM_INVOKES_POSIX_SHELL=yes
else
    PERL_SYSTEM_INVOKES_POSIX_SHELL=no
fi
AC_MSG_RESULT([$PERL_SYSTEM_INVOKES_POSIX_SHELL])
AC_SUBST([PERL_SYSTEM_INVOKES_POSIX_SHELL])


##
#   Compilation-related program checks:
##

AC_LANG([C])
AC_PROG_CC
AC_PROG_CPP
LINKCC=${LINKCC-"$CC"}
AC_SUBST(LINKCC)

AC_AIX
AC_C_CONST
AC_C_INLINE

#       libtool stuff for shared/static libraries.
#
LT_PREREQ([2.2.6])
LT_INIT([win32-dll])
AC_SUBST(LIBTOOL_DEPS)


##
#   Build environment:
##

#   developer build 
#       (enabled by default when building from SVN checkout)
#
if test "x$developer" != "xno" -a -f $srcdir/remove-files; then
    developer="yes"
fi
AC_MSG_CHECKING([for developer gcc flags])
if test "x$developer" = "xyes" -a "x$GCC" = "xyes"; then

    #       WWWXXX - strict type checking
    #
    DEVFLAGS="-Wall -Wstrict-prototypes -Wwrite-strings -Wcast-qual"
else
    DEVFLAGS=""
fi
AC_MSG_RESULT($DEVFLAGS)
AC_SUBST(DEVFLAGS)


#   building outside source directory
#
#       a) ensure build include paths are before source
#       b) ensure GNU make uses 'vpath' instead of 'VPATH'
#
NON_GNU_VPATH="VPATH ="
GNU_vpath="#vpath"

#       define include paths relative to top_srcdir
#       tweak includes if we're building outside of the source dir
#
if test "x$srcdir" = "x."; then
    TOP_INCLUDES=SRC_TOP_INCLUDES
    SNMPLIB_INCLUDES=SRC_SNMPLIB_INCLUDES
    AGENT_INCLUDES=SRC_AGENT_INCLUDES
    HELPER_INCLUDES=SRC_HELPER_INCLUDES
    MIBGROUP_INCLUDES=SRC_MIBGROUP_INCLUDES
else
    TOP_INCLUDES=BLD_TOP_INCLUDES
    SNMPLIB_INCLUDES=BLD_SNMPLIB_INCLUDES
    AGENT_INCLUDES=BLD_AGENT_INCLUDES
    HELPER_INCLUDES=BLD_HELPER_INCLUDES
    MIBGROUP_INCLUDES=BLD_MIBGROUP_INCLUDES
    if test $have_gnu_make -eq 0 ; then
        NON_GNU_VPATH="#VPATH ="
        GNU_vpath="vpath"
    fi
fi
AC_SUBST(TOP_INCLUDES)
AC_SUBST(SNMPLIB_INCLUDES)
AC_SUBST(AGENT_INCLUDES)
AC_SUBST(HELPER_INCLUDES)
AC_SUBST(MIBGROUP_INCLUDES)
AC_SUBST(EXTERNAL_MIBGROUP_INCLUDES)
AC_SUBST(GNU_vpath)
AC_SUBST(NON_GNU_VPATH)


##
#   System-related compilation checks:
##

#       What system are we building for
#
AC_CANONICAL_TARGET
changequote(, )
PARTIALTARGETOS=`echo $target_os | sed 's/[-._].*//'`
changequote([, ])
AC_MSG_CACHE_ADD(Building for:               $PARTIALTARGETOS)


#
#    Whether or not Cygwin's ld recognizes the flag -no-undefined. 
#

case x$target_os in
xcygwin*)
  saved_LDFLAGS=$LDFLAGS

  AC_MSG_CHECKING([whether the linker supports -no-undefined])
  LDFLAGS="$saved_LDFLAGS -Wl,-no-undefined"
  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
                 [AC_MSG_RESULT([yes]); dnl
                  LD_NO_UNDEFINED=-no-undefined],
                 [AC_MSG_RESULT([no])])
  
  LDFLAGS="$saved_LDFLAGS"
  ;;
esac

AC_SUBST(LD_NO_UNDEFINED)


#
#   Socket library: either 'default' (non-MinGW) or 'winsock2' (MinGW).
#
case x$target_os in
  xmingw*)
    with_socklib=winsock2
    if test "x$enable_ipv6" = "xyes"; then
      CFLAGS="-D_WIN32_WINNT=0x0501 $CFLAGS"
    fi
    ;;
  *)
    with_socklib=default;;
esac


#   Check system define behaviour
#       Does "-Ux -Dx=x" work as expected?
#
AC_MSG_CHECKING([whether to un-define target system token (before redefining)])
OLD_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="-U$PARTIALTARGETOS -D$PARTIALTARGETOS=$PARTIALTARGETOS"

AC_EGREP_CPP(yes,
    [[
#ifdef $PARTIALTARGETOS
yes
#endif
    ]],
    [  PARTIALTARGETFLAGS="-U$PARTIALTARGETOS -D$PARTIALTARGETOS=$PARTIALTARGETOS"
       AC_MSG_RESULT([yes])],
    [  PARTIALTARGETFLAGS="-D$PARTIALTARGETOS=$PARTIALTARGETOS"
       AC_MSG_RESULT([no])])
CFLAGS="$CFLAGS $PARTIALTARGETFLAGS"
CPPFLAGS="$OLD_CPPFLAGS"


#       Determine appropriate <net-snmp/system/{os}.h> include
#
AC_MSG_CHECKING([for system include file])
changequote(, )
filebase=$target_os
# ignore binary format indication
filebase=`echo $filebase | $SED 's/elf//'`
filebase=`echo $filebase | $SED 's/aout//'`
filebase=`echo $filebase | $SED 's/ecoff//'`
filebase=`echo $filebase | $SED 's/coff//'`
while test "x$filebase" != "x$last" -a ! -f $srcdir/include/net-snmp/system/$filebase.h
do
    last=$filebase
    filebase=`echo $filebase | $SED 's/[-._][^-._]*$//'`
    if test "x$filebase" = "x$last"; then
	filebase=`echo $filebase | $SED 's/[0-9]*$//'`
    fi
done

if test "x$filebase" = "x$last"; then
    filebase="generic"
fi
ac_cv_NETSNMP_SYSTEM_INCLUDE_FILE="net-snmp/system/$filebase.h"
changequote([, ])
AC_MSG_RESULT($ac_cv_NETSNMP_SYSTEM_INCLUDE_FILE)
AC_DEFINE_UNQUOTED(NETSNMP_SYSTEM_INCLUDE_FILE, "$ac_cv_NETSNMP_SYSTEM_INCLUDE_FILE")


#       Determine appropriate <net-snmp/machine/{cpu}.h> include
#
AC_MSG_CHECKING([for machine-type include file])
changequote(, )
filebase=$target_cpu
while test "x$filebase" != "x$last" -a ! -f $srcdir/include/net-snmp/machine/$filebase.h
do
    last=$filebase
    filebase=`echo $filebase | $SED 's/[-._][^-._]*$//'`
done

if test "x$filebase" = "x$last"; then
    filebase="generic"
fi
ac_cv_NETSNMP_MACHINE_INCLUDE_FILE="net-snmp/machine/$filebase.h"
changequote([, ])
AC_MSG_RESULT([$ac_cv_NETSNMP_MACHINE_INCLUDE_FILE])
AC_DEFINE_UNQUOTED(NETSNMP_MACHINE_INCLUDE_FILE, "$ac_cv_NETSNMP_MACHINE_INCLUDE_FILE")


##
#   Platform-specific compilation checks:
##

#   Preprocessor checks:
#

#       More sensible system identifier                 (MinGW)
#
if test "x$PARTIALTARGETOS" = "xmingw32msvc"; then
	CFLAGS="$CFLAGS -Dmingw32"
fi

#       Handle .in file extension                       (GCC)
#
AC_MSG_CHECKING([for additional cpp flags])
if test "x$GCC" = "xyes" -a "x$CPP" = "x$CC -E"; then
    EXTRACPPFLAGS="-x c"
else
    EXTRACPPFLAGS=""
fi

#       Solaris extra CPP flags                         (Solaris)
#
if test "x$GCC" != "xyes"; then
    case $target_os in
        solaris*) EXTRACPPFLAGS="$EXTRACPPFLAGS -Xs" ;;
    esac
fi

AC_SUBST(EXTRACPPFLAGS)
AC_MSG_RESULT($EXTRACPPFLAGS)


#   Compiler checks:
#

AC_PATH_PROG([CCPATH],$CC)
case $target_os in
    bsdi*)
        #   Check for bundled compiler                  (BSDi)
        #
	if test "x$CCPATH" = "x/usr/ucb/cc" -o "x$CCPATH" = "x/usr/bin/cc"; then
	    AC_MSG_ERROR([

*** The BSDI /usr/ucb/cc compiler does not work with this package.  
*** Please run configure with --with-cc=gcc
])
	fi
    ;;
    solaris*)
        #   Check for bundled compiler                  (Solaris)
        #
	if test "x$CCPATH" = "x/usr/ucb/cc"; then
	    AC_MSG_ERROR([

*** The solaris /usr/ucb/cc compiler does not work with this package.  
*** Please put a different compiler in your path first or run
*** configure with --with-cc=XX, where XX is the compiler you want to use.
])
	fi
    ;;
esac


#   Compiler flags:
#

# The Net-SNMP source code is not strict-aliasing safe, so add
# -fno-strict-aliasing to $CFLAGS if the compiler supports it.
AC_MSG_CHECKING([whether the compiler supports -fno-strict-aliasing])
netsnmp_save_CFLAGS="$CFLAGS"
CFLAGS="-fno-strict-aliasing $CFLAGS"
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [AC_MSG_RESULT([yes])], [
  AC_MSG_RESULT([no])
  CFLAGS="$netsnmp_save_CFLAGS"
])


#   Linker checks:
#
    
case $target_os in
    aix4.2*|aix4.3*|aix5*|aix6*|aix7*)
        #   Runtime linking flags                       (AIX)
        #
        AC_MSG_CHECKING([what linker flags to add to enable runtime linking on AIX])
        for ld_flag in $LDFLAGS; do
            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
                netsnmp_aix_runtimelinking_flags_ok=yes
                break
            fi
        done
        if test "X$netsnmp_aix_runtimelinking_flags_ok" != "Xyes"; then
	    if test "x$GCC" = "xyes"; then
	        netsnmp_aix_ldflags="-Wl,-brtl"
	    else
                netsnmp_aix_ldflags="-brtl"
	    fi
            LDFLAGS="$netsnmp_aix_ldflags $LDFLAGS"
	    AC_MSG_RESULT($netsnmp_aix_ldflags)
	else
	    AC_MSG_RESULT([none])
	fi
	;;

    darwin8*|darwin9*|darwin10*|darwin11*|darwin12*|darwin13*)
        #   Flat Namespace linking                      (Mac OS/X)
        #
        AC_MSG_CHECKING([whether darwin ld might need -flat_namespace])
	if test -z "$MACOSX_DEPLOYMENT_TARGET"; then
		LDFLAGS="-flat_namespace -framework CoreFoundation -framework CoreServices -framework DiskArbitration -framework IOKit $LDFLAGS"
		AC_MSG_RESULT([yes])
	else
		AC_MSG_RESULT([no])
	fi
	;;

    *)
        ;;
esac


#       dpkg package (swintst_apt)
#	    used in agent only
#
AC_PATH_PROG([DPKG_QUERY_PATH], dpkg-query)
if test x$DPKG_QUERY_PATH != x; then
    AC_DEFINE(HAVE_DPKG_QUERY, 1, [Set if the dpkg-query command is available])
fi


##
#   Non-program/compilation checks:
##

#       Substitute version number.
#
AC_SUBST(VERSION, $PACKAGE_VERSION)
AC_MSG_CACHE_ADD(Net-SNMP Version:           $PACKAGE_VERSION)

