#
# 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_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

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=util_funcs.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_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_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_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) ${LMIBLIBS} $(LDFLAGS) $(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:
	@if test "$(INCLUDEMIBGROUPDIRHEADERS)" != "" ; then \
                echo creating directory $(INSTALL_PREFIX)$(includedir)/agent ; \
                it="$(INCLUDEMIBGROUPDIRHEADERS)" ; \
                $(SHELL) $(top_srcdir)/mkinstalldirs $(INSTALL_PREFIX)$(includedir)/agent ; \
                for i in $$it ; do \
                        $(INSTALL_DATA) $(top_srcdir)/$(INCLUDEMIBGROUPDIR)/$$i $(INSTALL_PREFIX)$(includedir)/agent ; \
                        echo "installing $$i in $(INSTALL_PREFIX)$(includedir)/agent" ; \
                done \
        fi

@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

