# -*- autoconf -*-
#########################################
##
#   Command-line processing - --with/--enable
##
#########################################

##
#   System: Compiler settings
##

AC_ARG_WITH(cc, [
Compiler Options:
  --with-cc=CC                    use CC to compile (default=gcc).],
    [CC=$with_cc;export CC])

AC_ARG_WITH(linkcc, [
  --with-linkcc=CC                use CC to link (default=gcc).],
    [LINKCC=$with_linkcc;export LINKCC])

AC_ARG_WITH(ar,
[  --with-ar=AR                    use AR as the archiver.],
    [AR=$with_ar; export AR])

AC_ARG_WITH(endianness,
[  --with-endianness=big|little    define endianness of target platform when
                                  cross-compiling.],
    [if test $with_endianness != "big" -a $with_endianness != "little" ; then
       AC_MSG_ERROR([Endianness must be big or little, not "$with_endianness".]);
     fi
])

AC_ARG_WITH(cflags,
[  --with-cflags=CFLAGS            use CFLAGS as compile time arguments.],
    [CFLAGS=$with_cflags; export CFLAGS])

AC_ARG_WITH(ldflags,
[  --with-ldflags=LDFLAGS          use LDFLAGS as link time arguments to ld.],
    [LDFLAGS=$with_ldflags; export LDFLAGS])

AC_ARG_ENABLE(as-needed,
[  --disable-as-needed             Link libperl against applications rather
                                  than Net-SNMP libraries. Use only if the other
                                  way doesn't work.])

AC_ARG_WITH(libs,
[  --with-libs=LIBS                use LIBS as link time arguments to ld.],
    [LIBS=$with_libs; export LIBS])

AC_ARG_ENABLE(silent-libtool,
[  --enable-silent-libtool         Pass --silent to libtool.],
	LIBTOOLFLAGS=--silent)
AC_SUBST(LIBTOOLFLAGS)


##
#   System: Library settings
##

NETSNMP_ARG_WITH(dmalloc,
        AS_HELP_STRING([--with-dmalloc=PATH],
                [Use dmalloc library (www.dmalloc.com)]))

NETSNMP_ARG_WITH(efence,
[  --with-efence                   Look for and use libefence (malloc).],
      use_efence="$withval")

tryrsaref=no
NETSNMP_ARG_WITH(rsaref,
[  --with-rsaref=PATH              Look for librsaref in PATH/lib.],
    if test "x$withval" = "xyes"; then
      tryrsaref=yes
    elif test "x$withval" = "xno"; then
      tryrsaref=no
    elif test -d "$withval"; then
      AC_ADD_SEARCH_PATH($withval)
      tryrsaref=yes
    fi,
)

tryopenssl=defaultyes
askedopenssl=no
NETSNMP_ARG_WITH(openssl,
[  --with-openssl=PATH             Look for openssl in PATH/lib,
                                  or PATH may be "internal" to build with
                                  minimal copied OpenSSL code for USM only.],
    if test "x$withval" = "xyes"; then
      tryopenssl=yes
      askedopenssl=yes
    elif test "x$withval" = "xinternal"; then
      tryopenssl=internal
      askedopenssl=internal
    elif test "x$withval" = "xno"; then
      tryopenssl=no
    elif test -d "$withval"; then
      AC_ADD_SEARCH_PATH($withval)
      tryopenssl=yes
      askedopenssl=yes
    fi,
)
if test "x$tryopenssl" = "xdefaultyes"; then
      AC_ADD_SEARCH_PATH(/usr/local/ssl)
      tryopenssl=yes
fi
AC_ARG_WITH([ssl],,NETSNMP_INVALID_WITH([openssl]))
AC_ARG_ENABLE([ssl],,NETSNMP_INVALID_WITH([openssl]))

askedpkcs=no
NETSNMP_ARG_WITH(pkcs,
[  --with-pkcs=PATH                Look for pkcs11 in PATH/lib.],
    if test "x$withval" = "xyes"; then
      askedpkcs=yes
    elif test "x$withval" = "xno"; then
      askedpkcs=no
    elif test -d "$withval"; then
      AC_ADD_SEARCH_PATH($withval)
      askedpkcs=yes
    fi,
)

trykrb5=defaultyes
askedkrb5=no
NETSNMP_ARG_WITH(krb5,
[  --with-krb5=PATH                Look for krb5 in PATH/lib.],
    if test "x$withval" = "xyes"; then
      trykrb5=yes
      askedkrb5=yes
      krb5path=undef
    elif test "x$withval" = "xno"; then
      trykrb5=no
      krb5path=undef
    elif test -d "$withval"; then
      trykrb5=yes
      askedkrb5=yes
      krb5path=$withval
    fi,
)
if test "x$trykrb5" = "xdefaultyes"; then
      trykrb5=yes
      krb5path=/usr/kerberos
fi

NETSNMP_ARG_WITH(rpm,
[  --without-rpm                   Don't include support for the RPM package
                                  management system when building the host MIB
                                  module.])


##
#   Project: Build configuration settings
##

#       Install prefix
#
AC_ARG_WITH(install-prefix,
[  --with-install-prefix=PATH      Just for installing, prefix all 
                                  directories with PATH.  This is known not
                                  to work on some systems with shared
                                  libraries (eg, HPUX)],
      INSTALL_PREFIX="$withval")

if test "x$INSTALL_PREFIX" = "xyes" ; then
  AC_MSG_ERROR([--with-install-prefix requires an argument])
fi
if test "x$INSTALL_PREFIX" = "xno" ; then
  INSTALL_PREFIX=""
fi
AC_SUBST(INSTALL_PREFIX)


#   
#   Subsystems to build:
#       Agent
#
NETSNMP_ARG_ENABLE(agent,
[  --disable-agent                 Do not build the agent (snmpd).])
if test "x$enable_agent" != "xno"; then
   SNMPD='snmpd$(EXEEXT)'
   MAINSUBS="$MAINSUBS agent"
   TRAPLIBS='$(TRAPDWITHAGENT)'
   USETRAPLIBS='$(USEAGENTLIBS)'
else
   SNMPD=""
   # we still need/want the agentlibs (for subagents, e.g. snmptrapd)
   MAINSUBS="$MAINSUBS agent"
   # building snmptrapd w/o agentlibs doesn't work atm
   #TRAPLIBS='$(TRAPDWITHOUTAGENT)'
   #USETRAPLIBS='$(USELIBS)'
   TRAPLIBS='$(TRAPDWITHAGENT)'
   USETRAPLIBS='$(USEAGENTLIBS)'
fi
AC_SUBST(SNMPD)
AC_SUBST(TRAPLIBS)
AC_SUBST(USETRAPLIBS)

#       Applications
#
NETSNMP_ARG_ENABLE(applications,
[  --disable-applications          Do not build the apps (snmpget, ...).])
if test "x$enable_applications" != "xno"; then
   MAINSUBS="$MAINSUBS apps"
fi

#       Manual pages
#
NETSNMP_ARG_ENABLE(manuals,
[  --disable-manuals               Do not install the manuals.])
if test "x$enable_manuals" != "xno"; then
   MAINSUBS="$MAINSUBS man"
fi

#       Supporting scripts
#
NETSNMP_ARG_ENABLE(scripts,
[  --disable-scripts               Do not install the scripts (mib2c, ...).])
if test "x$enable_scripts" != "xno"; then
   MAINSUBS="$MAINSUBS local"
fi

#       MIB files
#
AC_ARG_ENABLE(mibs,
[  --disable-mibs                  Do not install the mib files.])
if test "x$enable_mibs" != "xno"; then
   MAINSUBS="$MAINSUBS mibs"
fi
# with-mibs is valid too, but means something else

AC_SUBST(MAINSUBS)
AC_MSG_CHECKING([what to build and install])
AC_MSG_RESULT([$MAINSUBS])


#       MIB module validation (during "configure")
#
NETSNMP_ARG_ENABLE(mib-config-checking,
[  --enable-mib-config-checking    Turns on extra checks during configuration
                                  of mib modules. Any conflicts will cause
                                  configure to abort (default is to issue a
                                  warning and continue.)],
  [if test "$enableval" = yes -o "$enableval" = no ; then
     with_mib_cfg_checks="$enableval"
   else
     AC_MSG_ERROR([Please use --enable/--disable-mib-config-checking])
   fi],
  [with_mib_cfg_checks="no"])

NETSNMP_ARG_ENABLE(mib-config-debug,
[  --enable-mib-config-debug       Turns on verbose output during mib module
                                  configure processing.],
  [if test "$enableval" = yes -o "$enableval" = no ; then
     with_mib_cfg_debug="$enableval"
   else
     AC_MSG_ERROR([Please use --enable/--disable-mib-config-debug])
   fi],
  [with_mib_cfg_debug="no"])


#       Version-specific features
#
AC_ARG_ENABLE([new-features],
        [AS_HELP_STRING([--enable-new-features],
                [Compile in new MIB modules and other experimental features
                 which are due to be included in future releases.])])

AC_ARG_ENABLE([old-features],
        [AS_HELP_STRING([--enable-old-features],
                [Compile in old MIB modules and other deprecated features
                 which were replaced in the default build of this release.])])

AC_ARG_WITH([features-of],
        [AS_HELP_STRING([--with-features-of=version],
                [Compile in MIB modules and other features as if this was
                 release "version" (default is ]AC_PACKAGE_VERSION[).])],,
        [with_features_of=$PACKAGE_VERSION])
   

#       Manual prompting during "configure"
#
NETSNMP_ARG_WITH(defaults,
[
Miscellaneous:
  --with-defaults         Use defaults for prompted values.],
  [if test "$withval" = yes -o "$withval" = no ; then
     defaults="$withval"
   else
     AC_MSG_ERROR([Please use --with/--without-defaults])
   fi],
  [defaults="no"])


#       UCD compatability
#
NETSNMP_ARG_ENABLE(ucd-snmp-compatibility,
[  --enable-ucd-snmp-compatibility Install ucd-snmp look-alike headers and libs.
])

if test "x$enable_ucd_snmp_compatibility" = "xyes" ; then	
  installucdheaders=installucdheaders
  installucdlibs=installucdlibs
  AC_MSG_CACHE_ADD(UCD-SNMP compatability:     enabled)
fi
AC_SUBST(installucdheaders)
AC_SUBST(installucdlibs)


##
#   Project: Library: MIB configuration settings
##

NETSNMP_ARG_ENABLE(mib-loading,
[  --disable-mib-loading           Do not include code that parses and 
                                  manipulates the mib files.])
if test "x$enable_mib_loading" = "xno"; then
  AC_DEFINE([NETSNMP_DISABLE_MIB_LOADING], 1, 
            [Define if mib loading and parsing code should not be included])
fi

NETSNMP_ARG_WITH(mibdirs,
[  --with-mibdirs="dir1:dir2:"   Default directories to look for mibs.
                                  (Default: \$HOME/.snmp/mibs:DATADIR/snmp/mibs)],
    [NETSNMP_DEFAULT_MIBDIRS="$with_mibdirs"
    AC_DEFINE_UNQUOTED(NETSNMP_DEFAULT_MIBDIRS,"$with_mibdirs",
        [default location to look for mibs to load using the above tokens
         and/or those in the MIBS envrionment variable])])

AC_ARG_WITH(mibs,
[  --with-mibs="item1:item2:"    Default mib IDs to read.
                                  (The default list is
                                   "SNMPv2-MIB:IF-MIB:IP-MIB:TCP-MIB:UDP-MIB"
                                  with the addition of any mibs used
                                  by the mib modules the agent is
                                  configured with)],
    NETSNMP_DEFAULT_MIBS="$with_mibs")
# enable-mibs is valid too, but means something else

NETSNMP_ARG_WITH(mibfiles,
[  --with-mibfiles="file1:file2" Default mib files to load.
                                  (Default:  none.  uses IDs above instead.)],
    AC_DEFINE_UNQUOTED(NETSNMP_DEFAULT_MIBFILES,"$with_mibfiles",
        [default mib files to load, specified by path.]))


##
#   Project: Library: Security configuration
##

NETSNMP_ARG_ENABLE(des,
[  --disable-des                   Do not support DES encryption.])
if test "x$enable_des" = "xno"; then
  AC_DEFINE([NETSNMP_DISABLE_DES], 1, 
            [Define if DES encryption should not be supported])
fi

NETSNMP_ARG_ENABLE(privacy,
[  --disable-privacy               Don't compile in support for privacy (encryption).])
if test "x$enable_privacy" != "xno"; then
  AC_DEFINE(NETSNMP_ENABLE_SCAPI_AUTHPRIV, 1,
    [define if you want to compile support for both authentication and
     privacy support.])
fi

NETSNMP_ARG_ENABLE(md5,
[  --disable-md5                   Do not support MD5 authentication.])
if test "x$enable_md5" = "xno"; then
  AC_DEFINE([NETSNMP_DISABLE_MD5], 1, 
            [Define if MD5 authentication should not be supported])
fi

NETSNMP_ARG_ENABLE(internal-md5,
[  --enable-internal-md5           Use the internal MD5 support.])
if test "x$enable_internal_md5" = "xyes"; then
  if test "x$enable_md5" = "xno"; then
    AC_MSG_ERROR(You can not specify both --enable-internal-md5 and --disable-md5)
  else
    AC_DEFINE(NETSNMP_USE_INTERNAL_MD5, 1,
      [define if you are using the MD5 code ...])
  fi
fi


##
#   Project: Library: Misc configuration
##

NETSNMP_ARG_WITH(opaque-special-types,
[  --without-opaque-special-types  Don't use special opaque encodings.
                                  SNMP normally cannot handle
                                  floating numbers, nor large 64 bit
                                  integers well.  By default, the
                                  net-snmp package compiles in
                                  support for these extra datatypes
                                  (in a legal way)])
# Only define if specifically chosen as --without (i.e., default to true).
if test "x$with_opaque_special_types" != "xno"; then
  AC_DEFINE(NETSNMP_WITH_OPAQUE_SPECIAL_TYPES, 1,
    [Should we compile to use special opaque types: float, double, counter64,
     i64, ui64, union?])
fi

NETSNMP_ARG_ENABLE(ipv6,
[  --enable-ipv6                   Generate IPv6 ready version.],
    [if test "x$enable_ipv6" = "xyes"; then
      AC_DEFINE(NETSNMP_ENABLE_IPV6, 1,
        [define if you want to enable IPv6 support])
    fi])

NETSNMP_ARG_WITH(logfile,
[  --with-logfile="location"       Default log file location for snmpd.],
    ac_cv_user_prompt_NETSNMP_LOGFILE="$with_logfile")
if test "$ac_cv_user_prompt_NETSNMP_LOGFILE" = "no"; then
    ac_cv_user_prompt_NETSNMP_LOGFILE="none"
fi

NETSNMP_ARG_WITH(persistent-directory,
[  --with-persistent-directory="directory"
                                  Default directory for persistent data storage.],ac_cv_user_prompt_NETSNMP_PERSISTENT_DIRECTORY="$with_persistent_directory")

NETSNMP_ARG_WITH(persistent-mask,
[  --with-persistent-mask="mask"  Default mask for persistent data storage.
                                  (Default: 077)],
  [if test [`expr "X$withval" : 'X[0-7]*$'`] -eq 4 ; then
     AC_MSG_RESULT([using persistent mask $withval])
     withval="0$withval"
   else
     AC_MSG_ERROR([Please provide a three digit octal persistent mask value])
   fi],
  [withval=077
   AC_MSG_RESULT([using default persistent mask $withval])])
AC_DEFINE_UNQUOTED(NETSNMP_PERSISTENT_MASK,$withval,
   [umask permissions to set up persistent files with])

NETSNMP_ARG_WITH(copy_persistent_files,
[  --with-copy-persistent-files="no" Don't copy persistent files
                                     (or use "yes" to copy them).
                                     (Default: yes)],
    ac_cv_user_prompt_COPY_PERSISTENT_FILES="$with_copy_persistent_files")

default_temp_file_pattern="/tmp/snmpdXXXXXX"
NETSNMP_ARG_WITH(temp-file-pattern,
[  --with-temp-file-pattern=PATTERN  Pattern of temporary files (Default: /tmp/snmpdXXXXXX)],
  [if test `expr "X$withval" : ".*XXXXXX$"` -ne 0 ; then
     AC_MSG_RESULT(using temporary file pattern $withval)
   else
     AC_MSG_ERROR([temporary file pattens must end with 6 X's])
   fi],
  [withval="$default_temp_file_pattern"
   AC_MSG_RESULT(using default temporary file pattern $withval)])
AC_DEFINE_UNQUOTED(NETSNMP_TEMP_FILE_PATTERN,"$withval",
  [Pattern of temporary files])


##
#   Project: Library: Version configuration
##

SNMP_VERSIONS=""
NETSNMP_ARG_ENABLE(snmpv1,
[  --disable-snmpv1                Do not include code that implements SNMPv1.])
if test "x$enable_snmpv1" = "xno"; then
  AC_DEFINE([NETSNMP_DISABLE_SNMPV1], 1, 
            [Define if SNMPv1 code should not be included])
else
  SNMP_VERSIONS="$SNMP_VERSIONS 1"
fi

NETSNMP_ARG_ENABLE(snmpv2c,
[  --disable-snmpv2c               Do not include code that implements SNMPv2c.])
if test "x$enable_snmpv2c" = "xno"; then
  AC_DEFINE([NETSNMP_DISABLE_SNMPV2C], 1, 
            [Define if SNMPv2c code should not be included])
else
  SNMP_VERSIONS="$SNMP_VERSIONS 2c"
fi

SNMP_VERSIONS="$SNMP_VERSIONS 3"
AC_MSG_CACHE_ADD(SNMP Versions Supported:   $SNMP_VERSIONS)

NETSNMP_ARG_WITH(default-snmp-version,
[  --with-default-snmp-version="3" Default version of SNMP to use.
                                    (Default: 3)
                                    Legal values: 1, 2 (for SNMPv2c) or 3.],
    ac_cv_user_prompt_NETSNMP_DEFAULT_SNMP_VERSION="$with_default_snmp_version")

# we test this now and later as well.  we test it now so configure can die
# early on with an error rather than waiting till the end of the script.
case "${ac_cv_user_prompt_NETSNMP_DEFAULT_SNMP_VERSION-3}" in
  [[123]]) ;;
  2c) ac_cv_user_prompt_NETSNMP_DEFAULT_SNMP_VERSION=2 ;;
  *)
    AC_MSG_ERROR([Illegal version number.  Only 1, 2 (for SNMPv2c) and 3 are supported.])
    ;;
esac


##
#   Project: Library: Transport modules
##

AC_ARG_WITH(transports,
[  --with-transports="t1 t2 ..."   Compile in the given SNMP transport
                                    modules (space or comma separated list).])
AC_ARG_WITH(out_transports,
[  --with-out-transports="t1 ..."  Exclude listed SNMP transports
                                    (space or comma separated list).

  Available SNMP transport modules are:

    UDP         support for SNMP over UDP/IP.
                This transport is always compiled in.
    UDPIPv6     support for SNMP over UDP/IPv6.
                This transport is available for Linux, Solaris and
                FreeBSD at least.
                This transport is compiled in by default if IPv6 support is enabled.
    TCPIPv6     support for SNMP over UDP/IPv6.
                This transport is available for Linux, Solaris and
                FreeBSD at least.
                This transport is compiled in by default if IPv6 support is enabled.
    TCP         support for SNMP over TCP/IP.
                This transport is compiled in by default, but may be omitted.
    Unix        support for SNMP over Unix domain protocols.
                This transport is compiled in by default except on Win32
                platforms, and may be omitted.
    Callback    support for SNMP over an internal locally connected pair
                of snmp_sessions.
    Alias       The alias transport simply lets you define more complex
                transport strings and alias them to simple names in
                the snmp.conf file.
    AAL5PVC     support for SNMP over AAL5 PVCs.
                This transport is presently only available for Linux,
                is never compiled in by default and may be omitted.
    IPX         support for SNMP over IPX per RFC 1420.
                This transport is presently only available for Linux,
                is never compiled in by default and may be omitted.
    DTLSUDP     support for tunneling SNMP over DTLS/UDP
    TLSTCP      support for tunneling SNMP over TLS/TCP
    SSH         (alpha) support for tunneling SNMP over SSH
])

#
# Catch common mistakes in transport options
#
AC_ARG_WITH(transport,, NETSNMP_INVALID_WITH([transports]))
AC_ARG_WITH(out-transport,, NETSNMP_INVALID_WITH([out-transports]))


##
#   Project: Library: Security modules
##

NETSNMP_ARG_WITH(security-modules,
[  --with-security-modules="s1 s2 ..."   Compile in the given SNMP security
                                    module services (space separated list).

  Available SNMP security services:

        usm                support for user based SNMP security
                           (required and always compiled in)
        ksm                support for kerberos based SNMP security
        tsm                support for the Transport-based security
                           (for use with the SSH, DTLSUDP and TLSTCP transports)
])


##
#   Project: Library: Developer-related settings
##

NETSNMP_ARG_ENABLE(debugging,
[  --enable-debugging              Outputs extra debugging information at all
                                  times.  Normally, you should not enable this,
                                  but instead use the -D flag of the commands,
                                  which toggles debuging output at runtime.
  --disable-debugging             Disallows debugging code to be built in.
                                  This might provide some speed benefits.],
    AC_DEFINE(NETSNMP_ALWAYS_DEBUG))
if test "x$enable_debugging" = "xno"; then
    AC_DEFINE(NETSNMP_NO_DEBUGGING)
fi

NETSNMP_ARG_ENABLE(developer,
[  --enable-developer              Turns on super-duper-extra-compile-warnings
                                  when using gcc.],
  [if test "$enableval" = yes ; then
     developer="yes"
   elif test "$enableval" != no ; then
     AC_MSG_ERROR([Please use --enable/--disable-developer])
   else
     developer="no"
   fi])

NETSNMP_ARG_ENABLE(testing-code,
[  --enable-testing-code           Enables some code sections that should 
                                  only be used for testing of certain
                                  SNMP functionalities.  This should *not* 
                                  be turned on for production use.  Ever.],
  [if test "$enableval" = yes ; then
     AC_DEFINE(NETSNMP_ENABLE_TESTING_CODE, 1, [testing code sections.])
   elif test "$enableval" != no ; then
     AC_MSG_ERROR([Please use --enable/--disable-testing-code])
   fi])

NETSNMP_ARG_ENABLE(reentrant,
[  --enable-reentrant              Enables locking functions that protect
                                  library resources in some multi-threading
                                  environments.  This does not guarantee
                                  thread-safe operation.
                                  Currently an experimental setting.],
  [if test "$enableval" = yes -o "$enableval" = no ; then
     with_res_locks="$enableval"
   else
     AC_MSG_ERROR([Please use --enable/--disable-reentrant])
   fi],
  [with_res_locks="no"])

NETSNMP_ARG_ENABLE(deprecated,
[  --disable-deprecated            Don't compile in deprecated functions.])
if test "$enable_deprecated" = no ; then
   AC_DEFINE([NETSNMP_NO_DEPRECATED_FUNCTIONS], 1,
             [Define to suppress inclusion of deprecated functions])
fi



##
#   Project: Agent configuration settings
##

NETSNMP_ARG_WITH(root-access,
[
Configuring the agent:
  --without-root-access           The snmpd agent won't require root access to
                                  run it.  The information it returns in the
                                  mib-II tree may not be correct, however.])
# Only define if specifically chosen as --without (i.e., default to true).
if test "x$with_root_access" = "xno"; then
  AC_DEFINE(NETSNMP_NO_ROOT_ACCESS, 1,
    [If you don't have root access don't exit upon kmem errors])
fi

NETSNMP_ARG_WITH(kmem-usage,
[  --without-kmem-usage            Do not include any code related to the use
                                  of kmem.])
# Only define if specifically chosen as --without (i.e., default to true).
if test "x$with_kmem_usage" = "xno"; then
  AC_DEFINE(NETSNMP_NO_KMEM_USAGE, 1, [If we don't want to use kmem.])
fi

NETSNMP_ARG_WITH(dummy-values,
[  --with-dummy-values             Provide 'placeholder' dummy values where
                                  the necessary information is not available.
                                  This is technically not compliant with the
                                  SNMP specifications, but was how the agent
                                  operated for versions < 4.0.])
# Define unless specifically suppressed (i.e., option defaults to false).
if test "x$with_dummy_values" != "xyes"; then
  AC_DEFINE(NETSNMP_NO_DUMMY_VALUES, 1,
    [If you don't want the agent to report on variables it doesn't have
     data for])
fi

NETSNMP_ARG_ENABLE(set-support,
[  --disable-set-support           Do not allow SNMP set requests.])
if test "x$enable_set_support" = "xno"; then
  AC_DEFINE([NETSNMP_DISABLE_SET_SUPPORT], 1, 
            [Define if SNMP SET support should be disabled])
fi


NETSNMP_ARG_WITH(sys_contact,
[  --with-sys-contact="who@where"  Default system contact.
                                    (Default: LOGIN@DOMAINNAME)],
    ac_cv_user_prompt_NETSNMP_SYS_CONTACT="$with_sys_contact")

NETSNMP_ARG_WITH(sys_location,
[  --with-sys-location="location"  Default system location.
                                    (Default: Unknown)],
    ac_cv_user_prompt_NETSNMP_SYS_LOC="$with_sys_location")



##
#   Project: Agent: Extensibility configuration
##

NETSNMP_ARG_ENABLE(local-smux,
[  --enable-local-smux             Restrict SMUX connections to localhost (by default).],
    [if test "x$enable_local_smux" = "xyes"; then
      AC_DEFINE(NETSNMP_ENABLE_LOCAL_SMUX, 1,
          [define if you want to restrict SMUX connections to localhost
           by default])
    fi])

NETSNMP_ARG_ENABLE(agentx-dom-sock-only,
[  --enable-agentx-dom-sock-only   Disable UDP/TCP transports for agentx.],
AC_DEFINE(NETSNMP_AGENTX_DOM_SOCK_ONLY, 1,
    [define if agentx transport is to use domain sockets only]))

NETSNMP_ARG_ENABLE(snmptrapd-subagent,
[  --disable-snmptrapd-subagent    Disable agentx subagent code in snmptrapd.])
if test "x$enable_snmptrapd_subagent" = "xno"; then
  AC_DEFINE(NETSNMP_SNMPTRAPD_DISABLE_AGENTX, 1,
    [define if you do not want snmptrapd to register as an AgentX subagent])
fi

default_agentx_socket="/var/agentx/master"
NETSNMP_ARG_WITH(agentx-socket,
[  --with-agentx-socket=FILE         AgentX socket (Default: /var/agentx/master as specified in RFC2741)],[
  if test "$withval" = yes; then
    AC_MSG_ERROR([ Please provide a full path ]);
  fi
  AC_MSG_RESULT(using AgentX socket $withval)
],[
  withval=$default_agentx_socket
  AC_MSG_RESULT(using default AgentX socket $default_agentx_socket)
])
AC_DEFINE_UNQUOTED(NETSNMP_AGENTX_SOCKET,"$withval",
        [Unix domain socket for AgentX master-subagent communication])


##
#   Project: Agent: MIB module configuration
##

NETSNMP_ARG_ENABLE(mini_agent,
[  --enable-mini-agent             Build a minimal agent.])
if test "x$enable_mini_agent" = "xyes"; then
    mini_agent="yes"
else
    mini_agent="no"
fi
AC_ARG_WITH([miniagent],,NETSNMP_INVALID_ENABLE([mini-agent]))
AC_ARG_ENABLE([miniagent],,NETSNMP_INVALID_ENABLE([mini-agent]))

NETSNMP_ARG_ENABLE(mfd-rewrites,
[  --enable-mfd-rewrites           Use new MFD rewrites of mib modules,
                                  where available. (default is to use
                                  original mib module code).])
if test "x$enable_mfd_rewrites" = "xyes"; then
   AC_DEFINE(NETSNMP_ENABLE_MFD_REWRITES, 1,
     [Define if you want to build MFD module rewrites])
fi


NETSNMP_ARG_WITH(mib_modules,
[  --with-mib-modules="item1 ..."  Compile with additional mib modules
                                    (Space separated list).])

NETSNMP_ARG_WITH(out_mib_modules,
[  --with-out-mib-modules="list"   Compile without these mib modules.

  Default mib modules compiled into the agent (which can be removed):
  
    mibII                  support for the mib-II tree.
    snmpv3mibs             support for the snmpv3 mib modules.
    ucd_snmp               UCD-SNMP-MIB specific extensions.
    agent_mibs             NET-SNMP-AGENT-MIB extensions
    agentx                 AgentX support (see below)
    notification           mibs supporting specification of trap destinations.
    target                 Support for the SNMP WGs TARGET-MIB.
    utilities              general agent configuration utilities.
    disman/event           support for the DISMAN-EVENT-MIB
                             (supports self monitoring and notification 
                              delivery when error conditions are found)
    disman/schedule        support for the DISMAN-SCHEDULE-MIB
                             (trigger SET requests at specified times)
    host                   host resources mib support.
                             (only on major supported platforms)

  Optional mib modules that can be built into the agent include:
    smux                   smux support to allow subagents to attach to snmpd.
    mibII/mta_sendmail     Sendmail statistics monitoring (MTA-MIB)
    ucd-snmp/diskio        Table of io-devices and how much data they have
                           read/written.  (only tested on Solaris, Linux)
    disman/old-event-mib   previous implementation of the DISMAN-EVENT-MIB

  Optional modules for specific platforms
    Linux
      ucd-snmp/lmSensors   hardware monitoring (LM-SENSORS-MIB)
      ip-mib/ipv4InterfaceTable  (experimental)
      ip-mib/ipv6InterfaceTable  (experimental)
      tunnel               Linux TUNNEL-MIB support (ifTable extension)
      mibII/interfaces     (old ifTable implementation)
      misc/ipfwacc         accounting rules IP firewall information
      ipfwchains/ipfwchains  firewall chains under ipfw
                             (See agent/mibgroup/ipfwchains/README)
      sctp-mib             support for the SCTP-MIB
      etherlike-mib        support for the EtherLike-MIB

    Solaris
      ucd-snmp/lmSensors   hardware monitoring (LM-SENSORS-MIB)
      if-mib               IF-MIB rewrite (add --enable-mfd-rewrites)
      tcp-mib              TCP-MIB rewrite (tcpConnectionTable and
                             tcpListenerTable; add --enable-mfd-rewrites)
      udp-mib              UDP-MIB rewrite (udpEndpointTable;
                             add --enable-mfd-rewrites)

    FreeBSD/OpenBSD
      if-mib               IF-MIB rewrite (add --enable-mfd-rewrites)

  AgentX support:
    agentx/subagent        allows the agent to run as either a snmp agent
                           or as an agentX sub-agent.
    agentx/master          makes the agent run as an agentX master agent
                           as well as a normal snmp agent.
    agentx                 includes both agentx/master and agentx/client.

  Optional modules for C coders to look at and/or include as extension examples:
  
    examples/ucdDemoPublic  SNMPv3 interoperability testing mib.
    examples/example        example C code extension.])


#
# Catch common mistakes in configure options
#
AC_ARG_WITH(mib-module,, NETSNMP_INVALID_WITH([mib-modules]))
AC_ARG_WITH(module,, NETSNMP_INVALID_WITH([mib-modules]))
AC_ARG_WITH(modules,, NETSNMP_INVALID_WITH([mib-modules]))

AC_ARG_WITH(out-mib-module,, NETSNMP_INVALID_WITH([out-mib-modules]))
AC_ARG_WITH(out-module,, NETSNMP_INVALID_WITH([out-mib-modules]))
AC_ARG_WITH(out-modules,, NETSNMP_INVALID_WITH([out-mib-modules]))


##
#   Project: Enterprise settings	(? Agent/Library/Both?)
##

NETSNMP_ARG_WITH(enterprise-oid,
[Enterprise OIDs:  (warning: this should be used with caution.)

  --with-enterprise-oid              The enterprise number assigned to the
                                     vendor by IANA.  See
                                     http://www.iana.org/cgi-bin/enterprise.pl
                                     to get one, though using the default is
                                     probably the right choice is most cases.
                                     (default 8072 = "enterprise.net-snmp")],[
  if test "$withval" = yes; then
    AC_MSG_ERROR([ Please provide a value for the enterprise number ]);
  fi
  AC_DEFINE_UNQUOTED(NETSNMP_ENTERPRISE_OID, $withval)
  ent_oid="1,3,6,1,4,1,$withval"
  AC_DEFINE_UNQUOTED(NETSNMP_ENTERPRISE_MIB, $ent_oid)
  ent_dot_oid="1.3.6.1.4.1.$withval"
  AC_DEFINE_UNQUOTED(NETSNMP_ENTERPRISE_DOT_MIB, $ent_dot_oid)
  AC_MSG_RESULT(using enterprise number $withval)
],[
  AC_MSG_RESULT(using default "enterprise.net-snmp")
])

NETSNMP_ARG_WITH(enterprise-sysoid,
[
  --with-enterprise-sysoid           The base OID for the sysObjectID
                                     of the system group
                                     (default .1.3.6.1.4.1.8072.3.2... = 
                                      "netSnmpAgentOIDs...")],[
  if test "$withval" = yes; then
    AC_MSG_ERROR([ Please provide a base OID value ]);
  fi
  sys_oid=`echo "$withval" | sed 's/^\.//' | sed 's/\./\,/g'`
  AC_DEFINE_UNQUOTED(NETSNMP_SYSTEM_MIB, $sys_oid)
  sys_dot_oid=`echo "$withval" | sed 's/^\.//'`
  AC_DEFINE_UNQUOTED(NETSNMP_SYSTEM_DOT_MIB, $sys_dot_oid)
  sysoid_len=`echo "$withval" | sed 's/[^\.]//g' | awk -F\. '{ print NF }'`
  AC_DEFINE_UNQUOTED(NETSNMP_SYSTEM_DOT_MIB_LENGTH, $sysoid_len)
  AC_MSG_RESULT(using enterprise sysOID $withval ....)
],[
  AC_MSG_RESULT(using default enterprise sysOID "NET-SNMP-MIB::netSnmpAgentOIDs...")
])

NETSNMP_ARG_WITH(enterprise-notification-oid,
[
  --with-enterprise-notification-oid The OID used for the root of
				     enterprise specific notifications.
                                     (default .1.3.6.1.4.1.8072.4 = 
                                      "netSnmpNotificationPrefix")],[
  if test "$withval" = yes; then
    AC_MSG_ERROR([ Please provide a base OID value ]);
  fi
  notification_oid=`echo "$withval" | sed 's/^\.//' | sed 's/\./\,/g'`
  AC_DEFINE_UNQUOTED(NETSNMP_NOTIFICATION_MIB, $notification_oid)
  notification_dot_oid=`echo "$withval" | sed 's/^\.//'`
  AC_DEFINE_UNQUOTED(NETSNMP_NOTIFICATION_DOT_MIB, $notification_dot_oid)
  notificationoid_len=`echo "$withval" | sed 's/[^\.]//g' | awk -F\. '{ print NF }'`
  AC_DEFINE_UNQUOTED(NETSNMP_NOTIFICATION_DOT_MIB_LENGTH, $notificationoid_len)
  AC_MSG_RESULT(using enterprise notifications $withval)
],[
  AC_MSG_RESULT(using default notifications "NET-SNMP-MIB::netSnmpNotifications")
])


##
#   Project: Perl settings
##

NETSNMP_ARG_WITH(perl-modules,
[
Perl:
  --with-perl-modules[=ARGS]      Install the Perl modules along with the rest
                                  of the net-snmp toolkit.  If ARGS is
                                  specified, they're passed to the
                                  Makefile.PL script.],[
    if test "$withval" = "no"; then
      install_perl="no"
    else
      install_perl="yes"
      if test "$withval" != "yes"; then
        PERLARGS="$withval"
      fi
    fi
], install_perl="try")

NETSNMP_ARG_ENABLE(embedded-perl,
[  --disable-embedded-perl         Disable embedded Perl in the SNMP agent and
                                  snmptrapd. [enabled by default]],
    embed_perl="$enableval", embed_perl="try")

NETSNMP_ARG_ENABLE(perl-cc-checks,
[  --disable-perl-cc-checks        Disable configure checks for whether Perl's
                                  C Compiler is compatible with ours when
                                  embedded Perl is enabled.])


##
#   Project: Python settings
##

AC_ARG_WITH(python-modules,
[
Python:
  --with-python-modules[=ARGS]    Install the python bindings along with the
                                  rest of the net-snmp toolkit.  If ARGS is
                                  specified, they're passed to the
                                  setup.py script as arguments.],[
    install_python="yes"
    if test "$withval" = "yes"; then
      PYTHONARGS=""
    elif test "$withval" = "no"; then
      PYTHONARGS=""
      install_python="no"
    else
      PYTHONARGS="$withval"
    fi
], install_python="no")


##
#   Project: Library settings
##

NETSNMP_ARG_WITH(server-send-buf,
[
Network Buffers:
  --with-server-send-buf[=ARG]    Use ARG for the default UDP/TCP send buffer instead
                                  of the OS buffer for server sockets that are
                                  created (snmpd, snmptrapd).  
                                  This default can be overridden in the runtime 
                                  configuration files.
                                  The ARG should be the size in bytes],[
   if test "$withval" = yes; then
    AC_MSG_ERROR([ Please provide a positive number for the server send buffer ])
   fi
   AC_DEFINE_UNQUOTED(NETSNMP_DEFAULT_SERVER_SEND_BUF, $withval)],
   AC_MSG_RESULT([using OS default send buffer size for server sockets]) )

NETSNMP_ARG_WITH(server-recv-buf,
[  --with-server-recv-buf[=ARG]    Similar as previous option, but for receive buffer],[
  if test "$withval" = yes; then
    AC_MSG_ERROR([ Please provide a positive number for the server recv buffer ])
  fi
  AC_DEFINE_UNQUOTED(NETSNMP_DEFAULT_SERVER_RECV_BUF, $withval)],
  AC_MSG_RESULT([using OS default recv buffer size for server sockets]) )

NETSNMP_ARG_WITH(client-send-buf,
[  --with-client-send-buf[=ARG]    Similar as previous options, but for the
                                  receive buffer of client sockets],[
  if test "$withval" = yes; then
    AC_MSG_ERROR([ Please provide a positive number for the client send buffer ])
  fi
  AC_DEFINE_UNQUOTED(NETSNMP_DEFAULT_CLIENT_SEND_BUF, $withval)],
  AC_MSG_RESULT([using OS default send buffer size for client sockets]) )

NETSNMP_ARG_WITH(client-recv-buf,
[  --with-client-recv-buf[=ARG]    Similar as previous options, but for the send buffer],[
  if test "$withval" = yes; then
    AC_MSG_ERROR([ Please provide a positive number for the client recv buffer ])
  fi
  AC_DEFINE_UNQUOTED(NETSNMP_DEFAULT_CLIENT_RECV_BUF, $withval)],
  AC_MSG_RESULT([using OS default recv buffer size for client sockets]) )

##
#   System: library settings  (more)
##

NETSNMP_ARG_WITH(elf,
  [AS_HELP_STRING([--without-elf],[use elf libraries])])

NETSNMP_ARG_WITH(nl,
  [AS_HELP_STRING([--with-nl],[use libnl to get netlink data (linux only).])])

NETSNMP_ARG_WITH(libwrap,
  [  --with-libwrap[=LIBPATH]  Compile in libwrap (tcp_wrappers) support.],
  [],
  [with_libwrap="no"])

NETSNMP_ARG_WITH(zlib,
  [  --with-zlib[=DIR]         use libz in DIR],
  [],
  [with_zlib="no"])

AC_ARG_WITH(bzip2,
  [  --with-bzip2[=DIR]        use libbz2 in DIR],
  [],
  [with_bzip2="no"])

NETSNMP_ARG_WITH(
 [mnttab],
 AS_HELP_STRING(
   [--with-mnttab="/etc/mnttab"],
   [Mount table location. The default is to autodetect this.]))

##
#   Project: mysql
##

NETSNMP_ARG_WITH(mysql,
  [  --with-mysql            Include support for MySQL.])
if test "x$with_mysql" = "xyes"; then
  AC_DEFINE(NETSNMP_USE_MYSQL, 1,
    [define if you are using the mysql code for snmptrapd ...])
fi
