# -*- autoconf -*-
#
# generate empty files
#
# Create include file list for snmp_vars.h to use.
mibdir="agent/mibgroup"
if test ! -d agent; then
  mkdir agent
fi
if test ! -d agent/mibgroup; then
  mkdir agent/mibgroup
fi
j="$mibdir/mib_module_includes.h  $mibdir/agent_module_includes.h \
   $mibdir/mib_module_inits.h     $mibdir/agent_module_inits.h    \
   $mibdir/mib_module_shutdown.h  $mibdir/agent_module_shutdown.h \
   include/net-snmp/agent/mib_module_config.h                     \
                   include/net-snmp/agent/agent_module_config.h   \
   $mibdir/mib_module_dot_conf.h  $mibdir/agent_module_dot_conf.h"

for i in $j; do
  rm -f $i
  echo "/* This file is automatically generated by configure.  Do not modify by hand. */" > $i
done

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

# set up the CPP command
MODULECPP="$CPP $PARTIALTARGETFLAGS $CPPFLAGS -DNETSNMP_FEATURE_CHECKING -I${srcdir}/include -I${srcdir}/agent/mibgroup"
if test "x$enable_mfd_rewrites" = "xyes"; then
  MODULECPP="$MODULECPP -DNETSNMP_ENABLE_MFD_REWRITES"
fi

module_list=""
mib_module_list=""
agent_module_list=""
new_with_mib_modules=`echo $with_mib_modules | $SED 's/,/ /g;'`
new_with_out_mib_modules=`echo $with_out_mib_modules | $SED 's/,/ /g;'`

# set up initial module list
new_module_list="$new_with_mib_modules default_modules"

# minor modifications
if test "x$enable_agent" = "xno"; then
   # minimum mib module list for snmptrapd
   new_module_list="mibII/vacm_vars mibII/vacm_conf utilities/execute $new_with_mib_modules"
   default_mibs=SNMPv2-MIB:IF-MIB:IP-MIB:TCP-MIB:UDP-MIB
   default_mibs_install=" "
elif test "x$mini_agent" = "xyes"; then
   # define the mini agent flag to reduce our load list from default_mibs.h
   MODULECPP="$MODULECPP -DNETSNMP_MINI_AGENT"
fi

test_modules="$new_module_list"
new_module_list=""

# remove modules that were explicitly excluded
for i in $test_modules
 do
  if echo " $new_with_out_mib_modules " | $GREP " $i " > /dev/null; then
    mib_cfg_msg="mib module '$i' is both included and excluded."
    AC_MSG_WARN([mib module conflict])
    if test "x$with_mib_cfg_checks" = "xyes"; then
      AC_MSG_WARN([user with    : $with_mib_modules])
      AC_MSG_WARN([final with   : $new_module_list])
      AC_MSG_WARN([user without : $with_out_mib_modules])
      AC_MSG_WARN([final without: $new_with_out_mib_modules])
      AC_MSG_ERROR([$mib_cfg_msg])
    else
      AC_MSG_WARN([$mib_cfg_msg It will be excluded])
      AC_MSG_CACHE_ADD([*** MIB Module warning *** $mib_cfg_msg It has been excluded.])
    fi
  else
    new_module_list="$new_module_list $i"
  fi
done

new_module_list=`(echo $new_module_list | tr ' ' '\n' | sort | tr '\n' ' '; echo '') | $SED 's/ $//'`

AC_MSG_RESULT([$new_module_list.])

#---------------------
# loop over module list
#
all_warnings=""
if test "x$with_mib_cfg_debug" = "xyes"; then
   module_debug=1
else
   module_debug=0
fi
first_pass=1
output_to=normal

if test ! -d mk ; then
  mkdir mk
fi


module_rules=mk/module_rules.mk
echo "# contents below built automatically by configure; do not edit by hand" > $module_rules

#
# make file sub-pieces
#
for i in module_list_deps mib_module_list_deps agent_module_list_deps ; do
  eval "$i=mk/${i}.mk"
  echo "# contents below built automatically by configure; do not edit by hand" > mk/${i}.mk
done

#
# variable settings sub-pieces
#
for i in module_list_code mib_module_list_code agent_module_list_code module_list mib_module_list agent_module_list ; do
  eval "$i=mk/${i}.mk"
  echo "# contents below built automatically by configure; do not edit by hand" > mk/${i}.mk
  echo "$i= \\" >> mk/${i}.mk
done

echo $ECHO_N "echo " $ECHO_C > mk/MODULE_LIST.mk
MODULE_LIST=mk/MODULE_LIST.mk


#---------------------
# until we have an empty module list...
#   (modules may add new modules, and until all dependencies are done...)
#
while test "x$new_module_list" != "x"; do
  AC_MSG_MODULE_DBG(-e,"\n****************************************************************")
  AC_MSG_MODULE_DBG("nml: $new_module_list")

  #---------------------
  # loop over all the modules in the current list
  #
  for j in $new_module_list
    do

    #---------------------
    # figure out which sub-blocks to build in parts
    if echo "$j" | $GREP "=" ; then
       # build a shared object file
       # format: sofilename=module1:module2
       # XXX: currently doesn't do this
       dl_name=`echo $j | $SED 's/=.*//'`
       dl_names="$dl_names $dl_name"
       dl_objects=`echo $j | $SED 's/.*=//'`
       module_sublist=`echo $dl_objects | $SED 's/:/ /g'`
       saved_sublist=""
       saved_sublist_code=""
       output_to=separate

       # create output files
       # these actually get nuked later
       output_inits="agent/mibgroup/${dl_name}-dll.c"
       output_hdrs="agent/mibgroup/${dl_name}-hdrs.h"
    else
       # not a special token invocation
       module_sublist=$j
       output_to=normal
       output_t=
    fi

    while test "x$module_sublist" != "x" ; do

    #---------------------
    # loop over all the modules in the sub list
    for i in $module_sublist
    do

    AC_MSG_MODULE_DBG(-e "\n================================================================")
    AC_MSG_MODULE_DBG("testing $i")
    need_header=0

    #---------------------
    # build a pseudo include header that includes current config and
    # system symbols:
    rm -f conftest.$ac_ext module_tmp_header.h
    AC_LANG_CONFTEST([AC_LANG_SOURCE([[
#include NETSNMP_SYSTEM_INCLUDE_FILE
#include "$srcdir/$mibdir/$i.h"]])])
    mv conftest.$ac_ext module_tmp_header.h

    #---------------------
    # macro: config_belongs_in(ARG)
    #   ARG: either
    #     - mib_module   => libnetsnmpmibs   (default)
    #     - agent_module => libnetsnmpagent
    #
    AH_TOP([#define config_belongs_in(x)])
    module_type=mib_module
    if test -f $srcdir/$mibdir/$i.h; then
      changequote(, )
      module_type=`$MODULECPP module_tmp_header.h | \
                   $SED -n 's@.*config_belongs_in(\([^)]*\)).*@\1@p'`
      changequote([, ])
    fi
    if test "x$module_type" = "x" ; then
      module_type=mib_module
    fi
    if test "x$output_to" = "xnormal" ; then
     	output_inits="$mibdir/${module_type}_inits.h"
     	output_hdrs="$mibdir/${module_type}_includes.h"
    fi

    #--------------------
    # check for duplicates within the dll system. 
    #   - if found in a dll, then remove from the dll and add to main
    dblfix=""
    for dltest in $dl_names ; do
      eval mod_files="\"\$dl_${dltest}_files\""
      if echo " $mod_files " | $GREP " $i " > /dev/null; then
        # some dll module has already seen this, unload it from that list
        # and include it in the core (again)
        AC_MSG_MODULE_DBG("removing $i from $dltest")
        mod_files=`echo " $mod_files " | $SED "s@ $i @@"`
        dblfix="__XXX__"
        eval "dl_${dltest}_files=\"$mod_files\""

        module_list="$module_list $i"
	echo "read_config.lo: mibgroup/$i.h" >> $module_list_deps
	if test $module_type = "agent_module" ; then
 	    echo "snmp_vars.lo: mibgroup/$i.h" >> $agent_module_list_deps
        else
 	    echo "mib_modules.lo: mibgroup/$i.h" >> $mib_module_list_deps
        fi
        eval ${module_type}_list="\"\$${module_type}_list $i\""
	echo "	$i \\" >> $module_list_code
	echo $ECHO_N " $i" $ECHO_C >> $MODULE_LIST
        eval tmpfilevar=\$`echo ${module_type}_list_code`
        echo "	$i \\" >> $tmpfilevar

	# XXX: add this to the main init list; this is possible not
	# quite in the right spot any longer but we're stuck with it.
	# Adding it back to the original ordered spot would be a
	# nightmare.  Ok, we're already in nightmare code so that
	# wolud have to be a night-terror.
        mnm=`echo $i | $SED 's/.*\///;s/\.c$//;'`
	output_inits_tmp="$mibdir/${module_type}_inits.h"
	echo "  if (should_init(\"$mnm\")) init_$mnm();" >> $output_inits_tmp
        # XXX: even worse, we loose whether the header is needed or not.
     	output_hdrs_tmp="$mibdir/${module_type}_includes.h"
        echo '#include "'"mibgroup/$i.h"'"' >> $output_hdrs_tmp
      fi
    done

    #---------------------
    # make sure module wasn't explicitly excluded, or already added
    #
    if test "x$dblfix" != "x" ; then
      AC_MSG_MODULE_DBG("$i was duplicated -- putting into main")
    elif echo " $new_with_out_mib_modules " | $GREP " $i " > /dev/null; then
      AC_MSG_MODULE_DBG("$i was excluded")
    elif echo " $module_list " | $GREP " $i " > /dev/null; then
      AC_MSG_MODULE_DBG("$i already tested")
    else

      #---------------------
      # process modules header, checking for config_ pseudo-macros
      #

      #---------------------
      # does the header file for the module exist?
      #   macros are only processed if it does
      if test -f $srcdir/$mibdir/$i.h; then
        new_list=""

        #---------------------
      	# macro: config_exclude(modules)
      	#  - lists conflicts with other modules
      	#    - EG: new MIB implementations exclude old and vice-versa
      	#
        # check if $i has any conflicts
        #
        AH_TOP([#define config_exclude(x)])
        new_list_excl=`$MODULECPP module_tmp_header.h | \
                       $SED -n 's/.*config_exclude(\(.*\)).*/\1/p'`
	if test "x$new_list_excl" != "x"; then
          AC_MSG_MODULE_DBG("$i excludes $new_list_excl")
	  for j in $new_list_excl
	    do
	    if echo " $module_list $new_mib_module_list $new_list_two " | $GREP " $j " > /dev/null; then
              mib_cfg_msg="mib module '$i' excludes module '$j' but another module requires it"
              AC_MSG_WARN([mib module error])
              if test "x$with_mib_cfg_checks" = "xyes"; then
	        AC_MSG_ERROR([$mib_cfg_msg])
              else
	        AC_MSG_WARN([$mib_cfg_msg])
                AC_MSG_CACHE_ADD([*** MIB Module warning *** $mib_cfg_msg])
              fi
	    else
	      new_with_out_mib_modules="$j $new_with_out_mib_modules"
              AC_MSG_MODULE_DBG("$j added to excluded list")
	    fi
	  done
	fi

        #---------------------
      	# macro: config_arch_require(ARCH,modules)
      	#  - lists modules required for a given ARCH
        #
        # check if $i has any architecture specific requirements
        #
        AH_TOP([#define config_arch_require(x,y)])
        changequote(, )
        new_list_arch=`$MODULECPP module_tmp_header.h | \
                       $SED -n 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/p'`
        changequote([, ])
	if test "x$new_list_arch" != "x"; then
          for j in $new_list_arch
	    do
	    archtest=`echo $j | $SED 's/-xarchx-.*//'`
	    # target_os may have been changed to a #define of 1...
	    if test "x$archtest" = "x1" -o "x$target_os" = "x$archtest" -o "x$PARTIALTARGETOS" = "x$archtest"; then
	      new_list="$new_list `echo $j | $SED 's/.*-xarchx-//'`"
              AC_MSG_MODULE_DBG(" $i required adding arch files: `echo $j | $SED 's/.*-xarchx-//'`")
	    fi
	  done
	fi
        AC_MSG_MODULE_DBG(" $i required arch files: $new_list")

        #---------------------
      	# macro: config_version_require((base, version, version-modules, ...))
      	#  - lists alternative modules used from different versions.
        #
        AH_TOP([#define config_version_require(x)])
        [new_list_alt3=`$MODULECPP module_tmp_header.h | \
            $AWK '
                BEGIN {
                    if("'"$enable_new_features"'" == "yes")
                        method="max";
                    else if("'"$enable_old_features"'" == "yes")
                        method="max-less";
                    else
                        method="max-less-equal";
                    FS = ".";
                    split("'"$with_features_of"'", a);
                    version=sprintf("%03d%03d%03d%03d", a[1], a[2], a[3], a[4]);
                }
                /config_version_require/ {
                    gsub("^.*config_version_require *\\\\(\\\\(", "");
                    gsub("\\\\)\\\\).*$", "");
                    gsub(", *", ",");
                    FS = ",";
                    n = split($0, a);
                    FS = ".";
                    actver = "000000000000";
                    actstr = a[1];
                    for(i = 2; i < n; i += 2) {
                        split(a[i], b);
                        curver=sprintf("%03d%03d%03d%03d", b[1], b[2], b[3], b[4]);
                        if (curver > actver && (method != "max-less" || curver < version) && (method != "max-less-equal" || curver <= version)) {
                            actver = curver;
                            actstr = a[i + 1];
                        }
                    }
                    printf(" %s", actstr);
                }'`]
        AC_MSG_MODULE_DBG(" $i required versioned features: $new_list_alt3")
        new_list="${new_list}${new_list_alt3}"

        #---------------------
      	# macro: config_require(modules)
      	#  - lists modules required for this module
        #
        # check if $i has any other required modules
        #
        AH_TOP([#define config_require(x)])
        new_list="$new_list `$MODULECPP module_tmp_header.h | \
                  $SED -n 's/.*config_require(\(.*\)).*/\1/p'`"
        AC_MSG_MODULE_DBG(" $i will test: $new_list")
	if test "x$new_list" != "x"; then
	  for j in $new_list
	    do
            AC_MSG_MODULE_DBG(-n " $i wants to add $j: ")
	    if test ! -f $srcdir/$mibdir/$j.h -a ! -f $srcdir/$mibdir/$j.c; then
              AC_MSG_WARN([mib module error])
	      AC_MSG_ERROR([mib module "$i" requires module "$j" but $j.h or $j.c could not be found in $srcdir/$mibdir])
	    elif echo " $new_with_out_mib_modules " | $GREP " $j " > /dev/null; then
	      if test "x$i" != "xdefault_modules" ; then
                mib_cfg_msg="mib module '$i' requires module '$j' but someone told me to compile without it"
                AC_MSG_WARN([mib module error])
                if test "x$with_mib_cfg_checks" = "xyes"; then
                  AC_MSG_ERROR([$mib_cfg_msg])
                else
                  AC_MSG_WARN([$mib_cfg_msg])
                  AC_MSG_CACHE_ADD([*** MIB Module warning *** $mib_cfg_msg])
                fi
#	    elif echo " $module_list $new_list_two $new_module_list " | $GREP " $j " > /dev/null; then
#              AC_MSG_MODULE_DBG("  $j included previously")
              fi
	    else
	      new_list_two="$new_list_two $j"
              AC_MSG_MODULE_DBG("  $j included")
	    fi
	  done
	fi

        #---------------------
      	# macro: config_add_mib(SOME-MIB)
      	#  - lists MIBs to be added to the default to-load list.
        #
        # check if $i has any mibs to add
        #
        AH_TOP([#define config_add_mib(x)])
        new_mibs=`$MODULECPP module_tmp_header.h | \
                  $SED -n 's/.*config_add_mib(\(.*\)).*/\1/p'`
	if test "x$new_mibs" != "x"; then
	    for j in $new_mibs
		do
		if test "x`echo :$default_mibs: | $GREP :$j:`" = "x"; then
		    default_mibs="$default_mibs:$j"
		fi
		if test -f $srcdir/mibs/$j.txt; then
		    if echo $default_mibs_install | $GREP " $j " > /dev/null; then
			    :
		    else
			    default_mibs_install="$default_mibs_install $j.txt"
		    fi
		fi
	    done
	fi # new mibs

        #-------------------
        # add the current module to the list of stuff to compile, etc.
        #
        # add $i to module list
        #
        AC_MSG_MODULE_DBG("  $i added (based on $i.h)")
        module_list="$module_list $i"
        eval ${module_type}_list="\"\$${module_type}_list $i\""

	echo "read_config.lo: mibgroup/$i.h" >> $module_list_deps
	if test $module_type = "agent_module" ; then
 	    echo "snmp_vars.lo: mibgroup/$i.h" >> $agent_module_list_deps
        else
 	    echo "mib_modules.lo: mibgroup/$i.h" >> $mib_module_list_deps
        fi

        #-------------------
        # check for unsupported config_load_mib
        #
        if $MODULECPP module_tmp_header.h | $GREP -q config_load_mib; then
          AC_MSG_WARN([mib module error])
      	  AC_MSG_WARN([mib module "$i" uses the "config_load_mib" directive, which is no longer supported.  It probably won't work.])
        fi # grep config_load_mib

        #-------------------
        # check for config_parse_dot_conf
        #  (generally not used any longer; old auto-load a .conf token)
        #
        AH_TOP([#define config_parse_dot_conf(w,x,y,z)])
        changequote(, )
        $MODULECPP module_tmp_header.h | \
        $SED -n 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@p' >> $mibdir/mib_module_dot_conf.h
	changequote([, ])

        #---------------------
      	# macro: config_error(error text)
      	#  - used to signal a configuration error from a module
        #
        # check if $i has any errors, or warnings
        #
        AH_TOP([#define config_error(x)])
        error=`$MODULECPP module_tmp_header.h | \
               $SED -n 's/.*config_error(\(.*\)).*/\1/p'`
	if test "x$error" != "x"; then
          echo
          echo
          AC_MSG_ERROR([$i: *** $error ***])
        fi

        #---------------------
      	# macro: config_warning(warning text)
      	#  - used to signal a configuration "warning" to be printed to the user
        #
        AH_TOP([#define config_warning(x)])
        warning=`$MODULECPP module_tmp_header.h | \
                 $SED -n 's/.*config_warning(\(.*\)).*/\1/p'`
	if test "x$warning" != "x"; then
          all_warnings="$all_warnings $warning
"
        fi

      #---------------------
      # Check for a .c file if the .h didn't exist
      #
      elif test -f $srcdir/$mibdir/$i.c; then
        if echo " $module_list $new_list_two $new_module_list " | $GREP " $i      " > /dev/null; then
           AC_MSG_MODULE_DBG("  $i already included")
        else
           AC_MSG_MODULE_DBG("  $i added (based on $i.c)")
	   module_list="$module_list $i"
	   mib_module_list="$mib_module_list $i"
        fi

      #---------------------
      # No .h or .c = error!  (typo?)
      #
      else # no $i.h or $i.c
        AC_MSG_WARN([mib module error])
	AC_MSG_ERROR([module files $i.h or $i.c could not be found in $srcdir/$mibdir])
      fi # no $i.h

      #-------------------
      # check for init/shutdown routines too
      #
      has_c_code=no
      if test -f $srcdir/$mibdir/$i.c; then
        if test "x$output_to" = "xnormal" ; then
	  echo "	$i \\" >> $module_list_code
  	  echo $ECHO_N " $i" $ECHO_C >> $MODULE_LIST
          eval tmpfilevar=\$`echo ${module_type}_list_code`
          echo "	$i \\" >> $tmpfilevar
        else
          eval "dl_${dl_name}_files=\"\$dl_${dl_name}_files $i\""
          saved_sublist_code="$saved_sublist_code $i"
        fi
        mnm=`echo $i | $SED 's/.*\///;s/\.c$//;'`
        AC_MSG_MODULE_DBG(-e "\nchecking '$srcdir/$mibdir/$i.c' ($mnm/`basename $i`) C file for init/shutdown")
        if test "x$mnm" != "x`basename $i`"; then
           AC_MSG_WARN([mib module error])
	   AC_MSG_ERROR([conflicting names: $mnm != `basename $i`])
        fi
        temp_init=`$GREP init_$mnm $srcdir/$mibdir/$i.c | $GREP -v _init_$mnm`
	if test "x$temp_init" != "x"; then
            AC_MSG_MODULE_DBG(-e "adding init_$mnm() to list")
            need_header=1
	    echo "  if (should_init(\"$mnm\")) init_$mnm();" >> $output_inits
	fi
	$GREP shutdown_$mnm $srcdir/$mibdir/$i.c > /dev/null
        if test $? -eq 0 ; then
            if test $module_debug -eq 1; then
              echo -e "\nadding shutdown_$mnm() to list"
            fi
            need_header=1
	    echo "  if (should_init(\"$mnm\")) shutdown_$mnm();" >> $mibdir/${module_type}_shutdown.h
	fi
      fi # test -f $srcdir/$mibdir/$i.c

      #-------------------
      # if there is a shutdown/init list,
      #
      if test $need_header -eq 1 ; then
         echo '#include "'"mibgroup/$i.h"'"' >> $output_hdrs
      else
         echo '/*#include "'"mibgroup/$i.h"'"*/' >> $output_hdrs
      fi

      #-------------------
      # check for output directory (for building outside of source tree
      #
      changequote(, )
      if test "x`echo $i | $SED 's/\///g;'`" != "x$i"; then
	mnd=`echo $i | $SED 's/\/[^/]*$//;'`
	if test ! -d ./$mibdir/$mnd; then
	    module_directories="$module_directories ./$mibdir/$mnd"
	fi
      fi # module directory test
      changequote([, ])

      #-------------------
      # define USING_*_MODULE
      #
      changequote(, )
      sym="`echo ${i} | $SED 's/[^a-zA-Z0-9_]/_/g' | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`"
      changequote([, ])
      echo "/* Define if compiling with the ${i} module files.  */" >> include/net-snmp/agent/${module_type}_config.h
      echo "#define USING_${sym}_MODULE 1" >> include/net-snmp/agent/${module_type}_config.h
      echo " " >> include/net-snmp/agent/${module_type}_config.h

      #-------------------
      echo $ECHO_N " $i$ECHO_C"
    fi #
    done # for i in $module_sublist

    if test "$output_to" = "separate" ; then
      if test "x$new_list_two" = "x" ; then
        # no new sub-modules to add to the current target
        output_to="normal"

        dllcleans="$saved_sublist_o $dllcleans"
        output_inits=""
        module_sublist=""
      else
        # a module had sub-modules required; keep goin'
        saved_sublist="$saved_sublist $module_sublist"
        module_sublist="$new_list_two"
        new_list_two=""
      fi
    else
      module_sublist=""
    fi

    done # while module_sublist
  done # for j in $new_module_list

  # remember the top level modules for later reporting
  if test $first_pass = 1 ; then
    # remember this list for later reporting
    top_level_modules="$new_module_list => $new_list_two"
    first_pass=0
  fi
  #-------------------
  # if $i added new modules vis config_*,
  # check those modules for requirements too
  #
  # transfer the new module to check list to the normal variable
  #
  if test "x$new_list_two" ; then
    output_to=normal
  fi
  new_module_list="$new_list_two"
  new_list_two=""
done # while test "x$new_module_list" != "x"; do
echo ""

#--------------------
# construct the dll code files and make rules.  This can't be done
# until now because duplicate use of a module means it gets removed
# from the dll and put into the main agent.
#
for i in $dl_names ; do
  eval mod_files="\"\$dl_${i}_files\""
  echo "components in the $i dll: $mod_files"

  output_inits="agent/mibgroup/${i}-dll.c"
  output_hdrs="agent/mibgroup/${i}-hdrs.h"

  AC_MSG_MODULE_DBG("creating dll file: $output_inits")
  for ofile in $output_inits $output_hdrs ; do
    if test -f $ofile ; then
      if $GREP "this file created automatically by configure" $ofile > /dev/null 2>&1 ; then
  	:
      else
  	AC_MSG_ERROR([$ofile already existed ; can't build dll object $i])
      fi
    fi
    cat > $ofile << EOFIF
/* xDo not edit; this file created automatically by configure */
EOFIF
  done

  cat >> $output_inits << EOFOC
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "${i}-hdrs.h"
void
init_$i(void) {
EOFOC

  # create the .so rule
  saved_sublist_o=`echo "$mod_files " | $SED 's/^ *//g;s/  */.o /g;'`

  # create the rules for each object
  for j in $mod_files ; do
    cat >> $module_rules << EOFR
$j.o: $j.c
	\$(CC) -c \$(CPPFLAGS) \$(CFLAGS) \$(DLFLAGS) -o \$@ \$<

EOFR
    mnm=`echo $j | $SED 's/.*\///;s/\.c$//;'`
    echo "  if (should_init(\"$mnm\")) init_$mnm();" >> $output_inits
  done

  # create the rule for the .so and wrapper code
  cat >> $module_rules << EOFM
${i}-dll.o: ${i}-dll.c
	\$(CC) -c \$(CPPFLAGS) \$(CFLAGS) \$(DLFLAGS) -o \$@ \$<

${i}.so: $saved_sublist_o ${i}-dll.o
	\$(CC) \$(CPPFLAGS) \$(CFLAGS) \$(DLFLAGS) -o \$@ $saved_sublist_o ${i}-dll.o

EOFM
        cat >> $output_inits << EOFOCFIN
}
EOFOCFIN

done

# cleanup
rm -f conftest.$ac_ext module_tmp_header.h

#-------------------
# build module lists for Makefiles
#
changequote(, )

for i in module_list_o module_list_c module_list_lo module_list_ft mib_module_list_o mib_module_list_c mib_module_list_lo mib_module_list_ft mibgroup_list_o mibgroup_list_lo mibgroup_list_ft agent_module_list_o agent_module_list_c agent_module_list_lo agent_module_list_ft agentgroup_list_o agentgroup_list_lo agentgroup_list_ft ; do
  eval "$i=mk/${i}.mk"
done

$SED 's/^module_list_code/module_list_o/;s/\([^=]\)  *\\/\1.o \\/g'  < $module_list_code  > $module_list_o
$SED 's/^module_list_code/module_list_c/;s/\([^=]\)  *\\/\1.c \\/g'  < $module_list_code  > $module_list_c
$SED 's/^module_list_code/module_list_lo/;s/\([^=]\)  *\\/\1.lo \\/g' < $module_list_code  > $module_list_lo
$SED 's/^module_list_code/module_list_ft/;s/\([^=]\)  *\\/\1.ft \\/g' < $module_list_code  > $module_list_ft

$SED 's/^mib_module_list_code/mib_module_list_o/;s/\([^=]\)  *\\/\1.o \\/g'  < $mib_module_list_code  > $mib_module_list_o
$SED 's/^mib_module_list_code/mib_module_list_c/;s/\([^=]\)  *\\/\1.c \\/g'  < $mib_module_list_code  > $mib_module_list_c
$SED 's/^mib_module_list_code/mib_module_list_lo/;s/\([^=]\)  *\\/\1.lo \\/g' < $mib_module_list_code  > $mib_module_list_lo
$SED 's/^mib_module_list_code/mib_module_list_ft/;s/\([^=]\)  *\\/\1.ft \\/g' < $mib_module_list_code  > $mib_module_list_ft

$SED 's/^mib_module_list_o/mibgroup_list_o/;s@\([^ 	]*\)\.o@mibgroup/\1.o@g' < $mib_module_list_o > $mibgroup_list_o
$SED 's/^mib_module_list_lo/mibgroup_list_lo/;s@\([^ 	]*\)\.lo@mibgroup/\1.lo@g' < $mib_module_list_lo > $mibgroup_list_lo
$SED 's/^mib_module_list_ft/mibgroup_list_ft/;s@\([^ 	]*\)\.ft@mibgroup/\1.ft@g' < $mib_module_list_ft > $mibgroup_list_ft

$SED 's/^agent_module_list_code/agent_module_list_o/;s/\([^=]\)  *\\/\1.o \\/g'  < $agent_module_list_code  > $agent_module_list_o
$SED 's/^agent_module_list_code/agent_module_list_c/;s/\([^=]\)  *\\/\1.c \\/g'  < $agent_module_list_code  > $agent_module_list_c
$SED 's/^agent_module_list_code/agent_module_list_lo/;s/\([^=]\)  *\\/\1.lo \\/g' < $agent_module_list_code  > $agent_module_list_lo
$SED 's/^agent_module_list_code/agent_module_list_ft/;s/\([^=]\)  *\\/\1.ft \\/g' < $agent_module_list_code  > $agent_module_list_ft

$SED 's/^agent_module_list_o/agentgroup_list_o/;s@\([^ 	]*\)\.o@mibgroup/\1.o@g' < $agent_module_list_o > $agentgroup_list_o
$SED 's/^agent_module_list_lo/agentgroup_list_lo/;s@\([^ 	]*\)\.lo@mibgroup/\1.lo@g' < $agent_module_list_lo > $agentgroup_list_lo
$SED 's/^agent_module_list_ft/agentgroup_list_ft/;s@\([^ 	]*\)\.ft@mibgroup/\1.ft@g' < $agent_module_list_ft > $agentgroup_list_ft

for i in module_list_o module_list_c module_list_lo module_list_ft mib_module_list_o mib_module_list_c mib_module_list_lo mib_module_list_ft mibgroup_list_o mibgroup_list_lo mibgroup_list_ft agent_module_list_o agent_module_list_c agent_module_list_lo agent_module_list_ft agentgroup_list_o agentgroup_list_lo agentgroup_list_ft ; do
	# hpux make (at least) doesn't like a trailing \ on the last
	# line even when the next line contains nothing but
	# whitespace.
	lasttoken=`awk '{lasttoken=$1}END{print lasttoken}' mk/$i.mk`
	$SED "s#$lasttoken \\\\#$lasttoken#" < mk/$i.mk > mk/$i.mk.tmp
	mv mk/$i.mk.tmp mk/$i.mk

	# add a closing comment
	echo "" >> mk/$i.mk
	echo "# end configure generated code" >> mk/$i.mk
done

changequote([, ])

if test $module_debug -eq 1; then
   echo -e "\nFinal module list: $module_list_code"
   exit
fi
if test "x$with_mib_cfg_checks" = "xyes"; then
  AC_MSG_CACHE_ADD([Agent Module list: $module_list_code])
fi
AC_SUBST_FILE(MODULE_LIST)
AC_SUBST_FILE(module_list_c)
AC_SUBST_FILE(module_list_o)
AC_SUBST_FILE(module_list_lo)
AC_SUBST_FILE(module_list_ft)
AC_SUBST_FILE(mib_module_list_c)
AC_SUBST_FILE(mib_module_list_o)
AC_SUBST_FILE(mib_module_list_lo)
AC_SUBST_FILE(mib_module_list_ft)
AC_SUBST_FILE(agent_module_list_c)
AC_SUBST_FILE(agent_module_list_o)
AC_SUBST_FILE(agent_module_list_lo)
AC_SUBST_FILE(agent_module_list_ft)
AC_SUBST_FILE(mibgroup_list_o)
AC_SUBST_FILE(mibgroup_list_lo)
AC_SUBST_FILE(mibgroup_list_ft)
AC_SUBST_FILE(agentgroup_list_o)
AC_SUBST_FILE(agentgroup_list_lo)
AC_SUBST_FILE(agentgroup_list_ft)

AC_SUBST(default_mibs_install)
AC_SUBST(dllcleans)
AC_SUBST_FILE(module_rules)
AC_SUBST_FILE(module_list_deps)
AC_SUBST_FILE(mib_module_list_deps)
AC_SUBST_FILE(agent_module_list_deps)

AC_MSG_RESULT(.)

if test $module_debug -eq 1; then
AC_MSG_CACHE_ADD(Agent MIB code:            $module_list)
fi
AC_MSG_CACHE_ADD(Agent MIB code:            $top_level_modules)

# end hairy agent module processing

AC_MSG_CHECKING([if directories need to be created])
for i in $module_directories; do
  $srcdir/mkinstalldirs $i
done
AC_MSG_RESULT(.)

#-------------------
# Define default mibs
#
AC_MSG_CHECKING([default mib files to read])
if test "x$NETSNMP_DEFAULT_MIBS" = "x"; then
  NETSNMP_DEFAULT_MIBS="$default_mibs"
fi
if test "x$ENV_SEPARATOR" != "x"; then
  :
elif test "x$PARTIALTARGETOS" = "xmingw32" -o "x$PARTIALTARGETOS" = "xmingw32msvc" -o "x$PARTIALTARGETOS" = "xcygwin"; then
  # mingw32 and cygwin use ';' as the default environment variable separator
  ENV_SEPARATOR=";"
  NETSNMP_DEFAULT_MIBS=`echo "$NETSNMP_DEFAULT_MIBS" | $SED 's/:/;/g'`
  default_mibs=`echo "$default_mibs" | $SED 's/:/;/g'`
else
  ENV_SEPARATOR=":"
fi
AC_SUBST(ENV_SEPARATOR)
AC_DEFINE_UNQUOTED([ENV_SEPARATOR], ["$ENV_SEPARATOR"],
         [Environment separator character surrounded by double quotes.])
AC_DEFINE_UNQUOTED([ENV_SEPARATOR_CHAR], ['$ENV_SEPARATOR'],
          [Environment separator character surrounded by single quotes.])
AC_DEFINE_UNQUOTED(NETSNMP_DEFAULT_MIBS,"$NETSNMP_DEFAULT_MIBS")
AC_SUBST(NETSNMP_DEFAULT_MIBS)
AC_MSG_RESULT($NETSNMP_DEFAULT_MIBS)

#-------------------
# Define symbols for conditional compilation in makefiles
#

if echo " $agent_module_list " | \
   fgrep ' agentx/agentx_config ' | \
   fgrep ' agentx/client ' | \
   fgrep ' agentx/protocol ' > /dev/null ; then
   NETSNMP_HAVE_AGENTX_LIBS_TRUE=''
   NETSNMP_HAVE_AGENTX_LIBS_FALSE='#'
else
   NETSNMP_HAVE_AGENTX_LIBS_TRUE='#'
   NETSNMP_HAVE_AGENTX_LIBS_FALSE=''
fi
AC_SUBST([NETSNMP_HAVE_AGENTX_LIBS_TRUE])
AC_SUBST([NETSNMP_HAVE_AGENTX_LIBS_FALSE])
