#
# Makefile for snmpd
#

top_builddir	= ..

# use GNU vpath, if available, to only set a path for source and headers
# VPATH will pick up objects too, which is bad if you are sharing a
# source dir...
@GNU_vpath@ %.h $(srcdir)
@GNU_vpath@ %.c $(srcdir)
# fallback to regular VPATH for non-gnu...
@NON_GNU_VPATH@ $(srcdir)

#
# what to install
#
SUBDIRS=helpers mibgroup

INSTALLSBINPROGS= @SNMPD@
INSTALLLIBS	= libnetsnmpagent.$(LIB_EXTENSION)$(LIB_VERSION)
INSTALLPOSTLIBS	= libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION)

INCLUDESUBDIR=agent
INCLUDESUBDIRHEADERS=agent_read_config.h \
	agent_registry.h \
	agent_index.h \
	agent_sysORTable.h \
	agent_trap.h \
	auto_nlist.h \
	ds_agent.h \
	snmp_agent.h \
	snmp_vars.h \
	var_struct.h \
	agent_handler.h \
	net-snmp-agent-includes.h \
	mib_modules.h \
	agent_callbacks.h \
	sysORTable.h

INSTALLBUILTSUBDIRHEADERS=../include/net-snmp/agent/mib_module_config.h \
			  ../include/net-snmp/agent/agent_module_config.h \
			mibgroup/mib_module_includes.h
INSTALLBUILTSUBDIR=agent

INCLUDEMIBGROUPDIR=agent/mibgroup
INCLUDEMIBGROUPDIRHEADERS=struct.h util_funcs.h util_funcs/header_generic.h \
	util_funcs/header_simple_table.h util_funcs/MIB_STATS_CACHE_TIMEOUT.h

OTHERINSTALL=installmibgroupheaders @EMBEDPERLINSTALL@
OTHERUNINSTALL=@EMBEDPERLUNINSTALL@

# XXX: need to install these  They're really UCD specific, however.
BROKEINSTALL= \
	mibgroup/struct.h \
	mibgroup/util_funcs.h \
	mibgroup/mibincl.h \
	mibgroup/ucd-snmp/dlmod.h \
	mibgroup/utilities/execute.h \
	mibgroup/header_complex.h

INSTALLUCDHEADERS= \
	agent_index.h	\
	agent_read_config.h \
	agent_registry.h \
	agent_sysORTable.h \
	agent_trap.h	\
	auto_nlist.h	\
	ds_agent.h	\
	header_complex.h \
	mibincl.h	\
	snmp_agent.h	\
	ucd-snmp-includes.h	\
	ucd-snmp-agent-includes.h \
	util_funcs.h	\
	var_struct.h

#
# how to build it info
#
USELIBS		= ../snmplib/libnetsnmp.$(LIB_EXTENSION)$(LIB_VERSION)
HELPERLIB	= helpers/libnetsnmphelpers.$(LIB_EXTENSION)$(LIB_VERSION)
AGENTLIB	= libnetsnmpagent.$(LIB_EXTENSION)$(LIB_VERSION)
MIBLIB		= libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION)

LAGENTLIBS	= @LAGENTLIBS@
LMIBLIBS	= @LMIBLIBS@
PERLLDOPTS_FOR_APPS = @PERLLDOPTS_FOR_APPS@
PERLLDOPTS_FOR_LIBS = @PERLLDOPTS_FOR_LIBS@
LIBS		= $(USELIBS) @AGENTLIBS@ $(PERLLDOPTS_FOR_APPS)
OUR_AGENT_LIBS	= $(AGENTLIB) $(HELPERLIB) $(MIBLIB) $(LIBS) @DLLIBS@
CPPFLAGS	= $(TOP_INCLUDES) -I. $(AGENT_INCLUDES) $(MIBGROUP_INCLUDES) \
		  $(SNMPLIB_INCLUDES) @CPPFLAGS@ 


#
# Objects
#

# libnetsnmpmibs objects.
@mibgroup_list_lo@
@mibgroup_list_o@
@agentgroup_list_lo@
@agentgroup_list_o@
LMIBOBJS	= $(mibgroup_list_lo) mib_modules.lo auto_nlist.lo
MIBOBJS		= $(mibgroup_list_o) mib_modules.o auto_nlist.o

# libnetsnmpagent objects
LIBAGENTOBJS=snmp_agent.o snmp_vars.o agent_read_config.o \
	agent_registry.o agent_index.o agent_sysORTable.o agent_trap.o \
	kernel.o agent_handler.o $(agentgroup_list_o) @OTHERAGENTLIBOBJS@
LLIBAGENTOBJS=snmp_agent.lo snmp_vars.lo agent_read_config.lo \
	agent_registry.lo agent_index.lo agent_sysORTable.lo agent_trap.lo \
	kernel.lo agent_handler.lo $(agentgroup_list_lo) @OTHERAGENTLIBLOBJS@

# The agent objects.
AGENTOBJS=snmpd.o @other_agentobjs@
LAGENTOBJS=snmpd.lo @other_lagentobjs@

#
# Define OBJS and LOBJS for clean target (just this directory)
#
OBJS		= $(LIBAGENTOBJS)  $(AGENTOBJS)  mib_modules.o  auto_nlist.o
LOBJS		= $(LLIBAGENTOBJS) $(LAGENTOBJS) mib_modules.lo auto_nlist.lo


all: agentlib subdirs miblib $(INSTALLBINPROGS) $(INSTALLSBINPROGS)

#
# build stuff targets
#
getkstat: getkstat.o
	$(CC) $(CFLAGS) -o $@ $? $(LIBS)

getkstat.o: mibgroup/kernel_sunos5.c
	$(CC) $(CFLAGS) -o $@ -D_GETKSTAT_TEST -DDODEBUG -c $? 

getmibstat: getmibstat.o
	$(CC) $(CFLAGS) -o $@ $? $(LIBS)

getmibstat.o: mibgroup/kernel_sunos5.c
	$(CC) $(CFLAGS) -o $@ -D_GETMIBSTAT_TEST -DDODEBUG -c $? 

snmpd$(EXEEXT):	${LAGENTOBJS} $(USELIBS) $(AGENTLIB) $(HELPERLIB) $(MIBLIB) $(LIBTARG) 
	$(LINK) $(CFLAGS) -o $@ ${LAGENTOBJS} ${LDFLAGS} ${OUR_AGENT_LIBS}


libnetsnmpagent.$(LIB_EXTENSION)$(LIB_VERSION):    ${LLIBAGENTOBJS} $(USELIBS)
	$(LIB_LD_CMD) $(AGENTLIB) ${LLIBAGENTOBJS} $(USELIBS) ${LAGENTLIBS} $(LDFLAGS) $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS)
	$(RANLIB) $(AGENTLIB)

libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION): ${LMIBOBJS} $(HELPERLIB) $(AGENTLIB) $(USELIBS)
	$(LIB_LD_CMD) $(MIBLIB) ${LMIBOBJS} $(HELPERLIB) $(AGENTLIB) $(USELIBS) $(LDFLAGS) ${LMIBLIBS} $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS)
	$(RANLIB) $(MIBLIB)

agentlib: $(AGENTLIB)

miblib: $(MIBLIB)

libs: $(AGENTLIB) $(MIBLIB)

embedperlinstall:
	  @$(SHELL) $(srcdir)/../mkinstalldirs $(INSTALL_PREFIX)$(snmplibdir)
	  @$(INSTALL_DATA) $(srcdir)/snmp_perl.pl $(INSTALL_PREFIX)$(snmplibdir)/snmp_perl.pl
	  @echo "install:  installed snmp_perl.pl in $(INSTALL_PREFIX)$(snmplibdir)"

embedperluninstall:
	  @rm -f $(INSTALL_PREFIX)$(snmplibdir)/snmp_perl.pl
	  @echo "removed snmp_perl.pl from $(INSTALL_PREFIX)$(snmplibdir)"

installmibgroupheaders:
	@for it in $(INCLUDEMIBGROUPDIRHEADERS) ; do \
		itd=`dirname "$(INSTALL_PREFIX)$(includedir)/agent/$$it"` ; \
		if [ ! -d "$$itd" ] ; then \
			echo "creating directory $$itd" ; \
			$(SHELL) "$(top_srcdir)/mkinstalldirs" "$$itd" ; \
		fi ; \
		$(INSTALL_DATA) "$(top_srcdir)/$(INCLUDEMIBGROUPDIR)/$$it" \
			"$$itd" ; \
		echo "installing $$it in $$itd" ; \
	done

@module_list_deps@
@agent_module_list_deps@
@mib_module_list_deps@

mib_modules.lo: mibgroup/mib_module_inits.h
#
# dependency for snmplib object. it's here because the headers listed
# are relative to the agent directory.

$(HELPERLIB): subdirs
# the above is needed when building with '-j' argument - everything what needs 
# helper lib must wait until 'subdirs' target is finished

subdirs: agentlib
# wait for agentlib before building 'subdirs' target

