# -*- autoconf -*-
#
# Maybe add library extensions for thread mutex locking.
#

if test "x$with_res_locks" = "xyes"; then
  AC_DEFINE(NETSNMP_REENTRANT, 1,
    [Define to 1 if you want to build with reentrant/threaded
     code (incomplete).])

    case $target_os in

    aix*)
	CC_RUNTIME_ARG="$CC_RUNTIME_ARG -lpthreads"
	;;

    *)
	;;

    esac
fi

#
# Add platform-specific source files.
#
AC_MSG_CHECKING([for platform-specific source])
other_src_list=""
other_objs_list=""
other_lobjs_list=""
other_agentobjs=""
other_lagentobjs=""
other_trapd_objects=""

# Win32 service code
if test "x$PARTIALTARGETOS" = "xmingw32" -o "x$PARTIALTARGETOS" = "xmingw32msvc"; then
  other_src_list="$other_src_list winservice.c winservicerc.rc"
  other_objs_list="$other_objs_list winservice.o winservicerc.o"
  other_lobjs_list="$other_lobjs_list winservice.lo winservicerc.lo"
  other_agentobjs="../snmplib/winservicerc.o"
  other_lagentobjs="../snmplib/winservicerc.lo"
  other_trapd_objects="../snmplib/winservicerc.o" 
fi
  
# Win32 pipes
if test "x$PARTIALTARGETOS" = "xmingw32" -o "x$PARTIALTARGETOS" = "xmingw32msvc"; then
  other_src_list="$other_src_list winpipe.c"
  other_objs_list="$other_objs_list winpipe.o"
  other_lobjs_list="$other_lobjs_list winpipe.lo"
fi

AC_SUBST(other_src_list)
AC_SUBST(other_objs_list)
AC_SUBST(other_lobjs_list)
AC_SUBST(other_agentobjs)
AC_SUBST(other_lagentobjs)
AC_SUBST(other_trapd_objects)

AC_MSG_RESULT([$other_src_list $other_objs_list $other_lobjs_list])
AC_MSG_RESULT([$other_agentobjs $other_lagentobjs $other_trapd_objects])
  
#
# Create directory structure for build
#
if test ! -d include; then
  mkdir include
fi
if test ! -d include/net-snmp; then
  mkdir include/net-snmp
fi
if test ! -d include/net-snmp/agent; then
  mkdir include/net-snmp/agent
fi
if test ! -d include/net-snmp/library; then
  mkdir include/net-snmp/library
fi
if test ! -d include/ucd-snmp; then
  mkdir include/ucd-snmp
fi

if test ! -d snmplib; then
  mkdir snmplib
fi
if test ! -d snmplib/transports ; then
  mkdir snmplib/transports
fi

#
# Do transport module processing.
#
AC_MSG_CHECKING([for and configuring transport modules to use])

# include the actual code checking
m4_include(configure.d/config_modules_transports)

AC_SUBST(transport_hdr_list)
AC_SUBST(transport_src_list)
AC_SUBST(transport_obj_list)
AC_SUBST(transport_lobj_list)
for i in $transport_def_list; do
  AC_DEFINE_UNQUOTED($i)
done
AC_MSG_RESULT($transport_result_list.)
AC_MSG_CACHE_ADD(Network transport support: $transport_result_list)

# cleanup
rm -f module_tmp_header.h

#
# Security modules to use
# 

AC_MSG_CHECKING([for security modules to use])
m4_include(configure.d/config_modules_security_modules)
AC_SUBST(security_src_list)
AC_SUBST(security_hdr_list)
AC_SUBST(security_obj_list) 	 
AC_SUBST(security_lobj_list)
AC_MSG_RESULT($new_with_security)
AC_MSG_CACHE_ADD(SNMPv3 Security Modules:    $new_with_security)

#
# Handle the special case of KSM to see which crypto API we support
#

rebuilt_new_with_security=
already_checked_krb5=no

for sec in $new_with_security
do
  if test "x$sec" = "xksm"; then
    if test "xyes" = "x$already_checked_krb5"; then
      continue
    else
      already_checked_krb5=yes
    fi
  fi

  if test x$sec != xksm; then
    rebuilt_new_with_security="$rebuilt_new_with_security $sec"
  else
    if test no = $trykrb5; then
      AC_MSG_NOTICE([configured not to use krb5. disabling ksm])
      continue
    fi

    AC_PATH_PROG([krb5_config],krb5-config,[no],$krb5path/bin:$PATH)

    if test no != $krb5_config; then
      CPPFLAGS="$CPPFLAGS `$krb5_config --cflags`"
      LIBS="$LIBS `$krb5_config --libs`"
    elif test $krb5path != no; then
      AC_ADD_SEARCH_PATH($krb5path)
    else
      AC_ADD_SEARCH_PATH(/usr/kerberos)
    fi

    AC_MSG_CHECKING([for krb5])
    AC_CACHE_VAL(ac_cv_have_krb5,
      AC_CHECK_LIB(krb5, krb5_init_context,
	ac_cv_have_krb5=yes, ac_cv_have_krb5=no
      )
    )

    if test $ac_cv_have_krb5 = no; then
      if test "x$askedkrb5" = "xyes"; then
	AC_MSG_ERROR(Asked to use krb5 but I couldn't find it.)
      fi
      AC_MSG_RESULT(no. disabling ksm)
      continue
    fi
      
    AC_MSG_RESULT(yes)
    rebuilt_new_with_security="$rebuilt_new_with_security ksm"

    AC_MSG_CHECKING([[for heimdal]])
    AC_CACHE_VAL(ac_cv_heimdal,
    [AC_TRY_COMPILE(
      [#include <krb5.h>],
      [const char *v = heimdal_version;],
      ac_cv_heimdal=yes,
      ac_cv_heimdal=no
    )])
    AC_MSG_RESULT($ac_cv_heimdal)
    if test $ac_cv_heimdal = yes; then
      AC_DEFINE(NETSNMP_USE_KERBEROS_HEIMDAL, 1,
        [Define this if you're using Heimdal Kerberos])
      if test no = $krb5_config; then
	LIBS="$LIBS -lkrb5 -lasn1 -lcom_err -lroken"
      fi
    elif test no = $krb5_config; then
	LIBS="$LIBS -lkrb5 -lcom_err"
    fi

    AC_MSG_CHECKING([to see which crypto API we need to use])
    AC_CACHE_VAL(ac_cv_NETSNMP_USE_KERBEROS_MIT,
      AC_CHECK_LIB(k5crypto, krb5_init_context,
	ac_cv_NETSNMP_USE_KERBEROS_MIT=yes, ac_cv_NETSNMP_USE_KERBEROS_MIT=no
      )
    )

    if test yes = $ac_cv_NETSNMP_USE_KERBEROS_MIT; then
      AC_MSG_RESULT(new MIT crypto API)
      AC_DEFINE(NETSNMP_USE_KERBEROS_MIT, 1,
        [Define this if we're using the new MIT crypto API])
      if test no = $krb5_config; then
	LIBS="$LIBS -lk5crypto"
      fi
    else
      AC_MSG_RESULT(old MIT crypto API)
    fi
    AC_CHECK_FUNCS([krb5_auth_con_getsendsubkey])
  fi
done

new_with_security=$rebuilt_new_with_security

#
# Detect lm_sensors version
#
if test "x$ac_cv_header_sensors_sensors_h" = "xyes"; then
    AC_CHECK_DECLS([sensors_get_all_subfeatures],
        [AC_DEFINE(NETSNMP_USE_SENSORS_V3, 1,
            [Define this if you have lm_sensors v3 or later])],,
        [[#include <sensors/sensors.h>]])
fi
