OBJS =  actions.o base64.o bots.o botserv.o channels.o chanserv.o command.o commands.o compat.o \
		config.o encrypt.o hashcomp.o hostserv.o init.o ircd.o language.o log.o mail.o main.o \
		memory.o memoserv.o messages.o misc.o modules.o nickserv.o operserv.o \
		process.o protocol.o send.o servers.o sessions.o slist.o sockets.o opertype.o users.o module.o modulemanager.o configreader.o \
		wildcard.o nickcore.o nickalias.o timers.o modes.o regchannel.o

INCLUDES = ../include/commands.h ../include/defs.h  ../include/language.h \
	../include/pseudo.h ../include/sysconf.h ../include/config.h \
	../include/messages.h ../include/services.h \
	../include/timers.h ../include/extern.h \
	../include/modules.h ../include/slist.h ../include/hashcomp.h

MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
	   'LDFLAGS=${LDFLAGS}' 'INSTDIR=${INSTDIR}' 'INSTALL=${INSTALL}' \
           'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
     	   'TOUCH=${TOUCH}' 'SHELL=${SHELL}' \
   	   'RUNGROUP=${RUNGROUP}' \
	   'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}' \
	   'MAKEBIN=${MAKEBIN}' 'MYSQLDIR=${MYSQLDIR}'

.c.o:
	$(MAKEBIN) $(CC) $(CFLAGS) -I../include/ -c $<

.cpp.o:
	$(MAKEBIN) $(CC) $(CFLAGS) -I../include/ -c $<

all: services

distclean: spotless
distclean_modules: clean_modules spotless

services:  $(OBJS) 
	$(MAKEBIN) $(CC) $(CFLAGS) $(OBJS) $(ANOPELIBS) $(MLIBS) -o $@ $(LDFLAGS)

$(OBJS): Makefile
modes.o:	modes.cpp $(INCLUDES)
timers.o:	timers.cpp $(INCLUDES)
nickcore.o:     nickcore.cpp $(INCLUDES)
nickalias.o:    nickalias.cpp $(INCLUDES)
actions.o:      actions.c   $(INCLUDES)
base64.o:       base64.c    $(INCLUDES)
bots.o:         bots.cpp    $(INCLUDES)
botserv.o:      botserv.c   $(INCLUDES)
channels.o:     channels.c  $(INCLUDES)
chanserv.o:     chanserv.c  $(INCLUDES)
command.o:     command.cpp  $(INCLUDES)
commands.o:     commands.c  $(INCLUDES)
compat.o:       compat.c    $(INCLUDES)
config.o:       config.c    $(INCLUDES)
encrypt.o:      encrypt.c   $(INCLUDES)
init.o:         init.c      $(INCLUDES)
ircd.o:         ircd.c      $(INCLUDES)
hostserv.o:     hostserv.c  $(INCLUDES)
language.o:     language.c  $(INCLUDES)
log.o:          log.c       $(INCLUDES)
mail.o:         mail.c      $(INCLUDES)
main.o:         main.c      $(INCLUDES)
memory.o:       memory.c    $(INCLUDES)
memoserv.o:     memoserv.c  $(INCLUDES)
messages.o:     messages.c  $(INCLUDES)
modules.o:      modules.c   $(INCLUDES)
module.o:       module.cpp   $(INCLUDES)
modulemanager.o:      modulemanager.cpp   $(INCLUDES)
misc.o:         misc.c      $(INCLUDES)
nickserv.o:     nickserv.c  $(INCLUDES)
operserv.o:     operserv.c  $(INCLUDES)
process.o:      process.c   $(INCLUDES)
protocol.o:     protocol.cpp  $(INCLUDES)
regchannel.o:	regchannel.cpp $(INCLUDES)
send.o:         send.c      $(INCLUDES)
servers.o:      servers.c   $(INCLUDES)
sessions.o:     sessions.c  $(INCLUDES)
slist.o:        slist.c     $(INCLUDES)
sockets.o:     sockets.cpp  $(INCLUDES)
opertype.o:   opertype.cpp  $(INCLUDES)
users.o:        users.c     $(INCLUDES)
vsnprintf.o:    vsnprintf.c $(INCLUDES)
wildcard.o:     wildcard.cpp $(INCLUDES)

modules: DUMMY
	@modules/configure modules
	@${MAKE} -C modules ${MAKEARGS} all

protocols: DUMMY
	@protocol/configure protocol
	@${MAKE} -C protocol ${MAKEARGS} all

core: DUMMY
	@core/configure core
	@${MAKE} -C core ${MAKEARGS} all

clean: clean_modules clean_protocols clean_core
	rm -f *.o services a.out

clean_modules:
	@touch modules/Makefile.inc # Horribly ugly...
	@${MAKE} -C modules clean

clean_protocols:
	@touch protocol/Makefile.inc
	@${MAKE} -C protocol clean

clean_core:
	@touch core/Makefile.inc
	@${MAKE} -C core clean

spotless:
	@${MAKE} -C modules distclean
	@${MAKE} -C protocol distclean
	@${MAKE} -C core distclean

install: services
	test -d ${INSTDIR} || mkdir ${INSTDIR}
	test -d ${INSTDIR}/bin || mkdir ${INSTDIR}/bin
	$(INSTALL) services $(INSTDIR)/bin/services
	$(INSTALL) bin/anoperc $(INSTDIR)/bin/anoperc
	test -d ${INSTDIR}/data || mkdir ${INSTDIR}/data
	(cd ../lang ; $(MAKE) install)
	$(CP) ../data/*.* $(INSTDIR)/data
	$(INSTALL) bin/mydbgen $(INSTDIR)/bin/mydbgen
	test -d $(INSTDIR)/data/backups || mkdir $(INSTDIR)/data/backups
	test -d $(INSTDIR)/data/logs || mkdir $(INSTDIR)/data/logs
	@if [ "$(INSTDIR)/data/modules" ] ; then \
		test -d ${INSTDIR}/data/modules || mkdir ${INSTDIR}/data/modules ; \
		test -d ${INSTDIR}/data/modules/runtime || mkdir ${INSTDIR}/data/modules/runtime ; \
		(cd modules ; $(MAKE) install) ; \
		(cd protocol ; ${MAKE} install) ; \
		(cd core ; ${MAKE} install) ; \
	fi
	@if [ "$(RUNGROUP)" ] ; then \
		echo chgrp -R $(RUNGROUP) $(INSTDIR)/data ; \
		chgrp -R $(RUNGROUP) $(INSTDIR)/data ; \
		echo chmod -R g+rw $(INSTDIR)/data ; \
		chmod -R g+rw $(INSTDIR)/data ; \
		echo find $(INSTDIR)/data -type d -exec chmod g+xs \'\{\}\' \\\; ; \
		find $(INSTDIR)/data -type d -exec chmod g+xs '{}' \; ; \
	fi

DUMMY:
