#
#ident	"@(#)smail/src:RELEASE-3_2_0_115:Makefile,v 1.68 2003/06/18 07:03:36 woods Exp"
#
# Makefile for the smail program
#
#    Copyright (C) 1987, 1988 Ronald S. Karr and Landon Curt Noll
#    Copyright (C) 1992  Ronald S. Karr
# 
# See the file COPYING, distributed with smail, for restriction
# and warranty information.

SHELL=/bin/sh
AR=ar
LINT=lint

MKDEPEND=${ROOT}/conf/lib/mkdepend.sh
MKVERSION=${ROOT}/conf/lib/mkversion.sh
MKDEFS=${ROOT}/conf/lib/mkdefs.sh
MKDIRS=${ROOT}/conf/lib/mkdirs.sh
CHECKDEFS=${ROOT}/conf/lib/checkdefs.sh
INST=${ROOT}/conf/lib/inst.sh
INSTM=${ROOT}/conf/lib/instm.sh
XEXEC=${SHELL} ${ROOT}/conf/lib/xexec.sh
DEFS_SH=defs.sh
DEFS_H=defs.h
DEFS_SED=defs.sed
VERSION_SH=version.sh
VERSION_H=version.h
VERSION_SED=version.sed

ROOT=..

INCLUDES=$$DBM_INCLUDES $$INCLUDES

CSRC=addr.c alloc.c bindlib.c config.c copyright.c default.c direct.c \
     expand.c field.c hash.c header.c list.c log.c lookup.c main.c modes.c \
     notify.c parse.c pathto.c pwcache.c qualify.c queue.c resolve.c retry.c \
     route.c smailconf.c smtprecv.c spool.c string.c sysdep.c transport.c \
     version.c
LASTSRC=silly.c

HSRC=addr.h alloc.h bindlib.h bindsmtpth.h child.h config.h debug.h direct.h \
     dys.h error.h exitcodes.h extern.h field.h hash.h jump.h list.h lookup.h \
     log.h main.h parse.h route.h smail.h smailconf.h spool.h transport.h

MISCSRC=Makefile mkdriv.awk
SHSRC=mkdrivtab.sh bump_cnt.sh
STANDSRC=standalone.c
SRC=${CSRC} ${HSRC} ${SHSRC} ${MISCSRC} ${LASTSRC} ${STANDSRC}

FIRSTOBJ=copyright.o
OBJ=addr.o alloc.o bindlib.o config.o default.o direct.o drivertab.o \
    expand.o field.o hash.o header.o list.o log.o lookup.o main.o modes.o \
    notify.o parse.o pathto.o pwcache.o qualify.o queue.o resolve.o retry.o \
    route.o smailconf.o smtprecv.o spool.o string.o sysdep.o transport.o \
    version.o
LASTOBJ=silly.o

STANDOBJ=standalone.o stand_addr.o stand_field.o stand_hash.o stand_lookup.o \
	 stand_spool.o stand_silly.o
STAND=testaddr stand_addr.c \
      testfield stand_field.c \
      testhash stand_hash.c \
      testlookup stand_lookup.c \
      testspool stand_spool.c 

DRIVER_LIBS=directors/ddrivlib.a routers/rdrivlib.a transports/tdrivlib.a
DRIVER_MAKEFILES=directors/Makefile transports/Makefile routers/Makefile

DIRECTORS_HSRC=aliasfile.h altuser.h fwdfile.h include.h smartuser.h user.h
DIRECTORS_CSRC=aliasfile.c altuser.c fwdfile.c include.c smartuser.c user.c
DIRECTORS_SRC=${DIRECTORS_HSRC} ${DIRECTORS_CSRC}
ROUTERS_HSRC=bind.h rtlib.h gethost.h pathalias.h smarthost.h uuname.h \
	     queryprog.h reroute.h
ROUTERS_CSRC=bind.c rtlib.c gethost.c pathalias.c smarthost.c uuname.c \
	     queryprog.c reroute.c
ROUTERS_SRC=${ROUTERS_HSRC} ${ROUTERS_CSRC}
TRANSPORTS_HSRC=appendfile.h pipe.h tcpsmtp.h smtplib.h
TRANSPORTS_CSRC=appendfile.c pipe.c tcpsmtp.c smtplib.c
TRANSPORTS_SRC=${TRANSPORTS_HSRC} ${TRANSPORTS_CSRC}

COMPAT_LIB_DIR=${ROOT}/compat
COMPAT_LIB=${COMPAT_LIB_DIR}/libcompat.a

# Smail will be copied to BIN_DIR with links created for all of these names
BIN_NAMES=smail mailq pathto uupath runq rsmtp smtpd

.c.o:
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$CFLAGS ${INCLUDES} -c $*.c

all:	smail

smail:	${DEFS_SH} ${FIRSTOBJ} ${OBJ} ${DRIVER_LIBS} ${LASTOBJ} \
		${COMPAT_LIB} ldinfo.o
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$LDFLAGS -o smail \
		${FIRSTOBJ} ${OBJ} ${DRIVER_LIBS} ${LASTOBJ} \
		ldinfo.o ${COMPAT_LIB} $$DBM_LIB $$LIBS

ldinfo.c: ${DEFS_SH} ${OBJ} ${LASTOBJ} ${DRIVER_LIBS} bump_cnt.sh
	@. ./${DEFS_SH}; ${XEXEC} ${SHELL} bump_cnt.sh

ldinfo.o: ${DEFS_SH} ldinfo.c
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$CFLAGS ${INCLUDES} -c ldinfo.c

${FIRSTOBJ} ${OBJ} ${LASTOBJ}: ${DEFS_SH} ${DEFS_H}

${COMPAT_LIB}: .MAKE
	@if [ -f ${COMPAT_LIB_DIR}/.depend ] ; then 	\
		DEPMKFILE="-f Makefile -f .depend";	\
	fi;						\
	echo "cd ${COMPAT_LIB_DIR} && ${MAKE} $$DEPMKFILE all";	\
	cd ${COMPAT_LIB_DIR} && ${MAKE} $$DEPMKFILE all

# note you probably can't lint driver sources that you can't build, so
# we ask each driver makefile what sources it will actually build...
#
lint:	drivertab.c ${CSRC} ${DEFS_SH} ${VERSION_H} iobpeek.h
	@. ./${DEFS_SH}; \
	   files="drivertab.c ${CSRC}"; \
	   for i in `(cd directors && ${MAKE} csrc)`; do \
		files="$$files directors/$$i"; \
	   done; \
	   for i in `(cd routers && ${MAKE} csrc)`; do \
		files="$$files routers/$$i"; \
	   done; \
	   for i in `(cd transports && ${MAKE} csrc)`; do \
		files="$$files transports/$$i"; \
	   done; \
	   ${XEXEC} ${LINT} ${LINTFLAGS} $$CPPFLAGS ${INCLUDES} $$files ${LASTSRC}

tags:	drivertab.c ${SRC} ${DEFS_SH} ${DEFS_H} iobpeek.h
	@. ./${DEFS_SH}; \
	   files="drivertab.c ${SRC}"; \
	   for i in $(DIRECTORS_SRC) ; do \
		files="$$files directors/$$i"; \
	   done; \
	   for i in $(ROUTERS_SRC) ; do \
		files="$$files routers/$$i"; \
	   done; \
	   for i in $(TRANSPORTS_SRC) ; do \
		files="$$files transports/$$i"; \
	   done; \
	   ${XEXEC} ctags $(CTAGFLAGS) $$files

TAGS:	drivertab.c ${SRC} ${DEFS_SH} ${DEFS_H} iobpeek.h
	@. ./${DEFS_SH}; \
	   files="drivertab.c ${SRC}"; \
	   for i in $(DIRECTORS_SRC) ; do \
		files="$$files directors/$$i"; \
	   done; \
	   for i in $(ROUTERS_SRC) ; do \
		files="$$files routers/$$i"; \
	   done; \
	   for i in $(TRANSPORTS_SRC) ; do \
		files="$$files transports/$$i"; \
	   done; \
	   ${XEXEC} etags $(ETAGFLAGS) $$files

directors/ddrivlib.a: force directors/Makefile .MAKE
	@echo "Build default targets under directors ..."
	@if [ -f directors/.depend ] ; then 		\
		DEPMKFILE="-f Makefile -f .depend";	\
	fi;						\
	echo "cd directors && ${MAKE} $$DEPMKFILE all";	\
	cd directors && ${MAKE} $$DEPMKFILE all
	@echo "Done under directors."

routers/rdrivlib.a: force routers/Makefile .MAKE
	@echo "Build default targets under routers ..."
	@if [ -f routers/.depend ] ; then 		\
		DEPMKFILE="-f Makefile -f .depend";	\
	fi;						\
	echo "cd routers && ${MAKE} $$DEPMKFILE all";	\
	cd routers && ${MAKE} $$DEPMKFILE all
	@echo "Done under routers."

transports/tdrivlib.a: force transports/Makefile .MAKE
	@echo "Build default targets under transports ..."
	@if [ -f transports/.depend ] ; then 		\
		DEPMKFILE="-f Makefile -f .depend";	\
	fi;						\
	echo "cd transports && ${MAKE} $$DEPMKFILE all"; \
	cd transports && ${MAKE} $$DEPMKFILE all
	@echo "Done under transports."

clean clobber mkdefs depend: ${DRIVER_MAKEFILES} .MAKE
	-@for i in directors routers transports; do	\
	    if [ -f $$i/Makefile ]; then		\
		echo "Clean under $$i ...";		\
		(cd $$i && ${MAKE} $@);			\
		rc=$$?;					\
		if [ $$rc -ne 0 ] ; then		\
			exit $$rc;			\
		fi;					\
	    else					\
		echo "Ignoring $$i -- no Makefile";	\
	    fi;						\
	  done

# We could mark these targets as .PRECIOUS, but they don't really
# matter that much and they should NEVER be hand-edited!
#
drivertab.c ${DRIVER_MAKEFILES}: mkdrivtab.sh mkdriv.awk ${DEFS_SH}
	@. ./${DEFS_SH}; \
	   ${XEXEC} ${SHELL} mkdrivtab.sh $$DRIVER_CONFIGURATION

iobpeek.h: ${DEFS_SH}
	@rm -f iobpeek.h
	@. ./${DEFS_SH}; ${XEXEC} ${SHELL} geniobpeek.sh $$CC "'$$CFLAGS'"

depend: check_defs local-depend

local-depend: ${DEFS_SH} ${VERSION_H} iobpeek.h ${SRC}
	@rm -f .depend
	@. ./${DEFS_SH}; ${XEXEC} ${SHELL} ${MKDEPEND} $$CPPFLAGS ${INCLUDES} ${CSRC}
	. ./${DEFS_SH}; echo "$$DEFS_DEPEND" >> .depend;		\
	  echo "drivertab.c: $$DRIVER_CONFIGURATION" >> .depend;	\
	  echo "directors/Makefile: $$DRIVER_CONFIGURATION" >> .depend;	\
	  echo "routers/Makefile: $$DRIVER_CONFIGURATION" >> .depend;	\
	  echo "transports/Makefile: $$DRIVER_CONFIGURATION" >> .depend;

${VERSION_H} ${VERSION_SH} ${VERSION_SED}: ../level
	ROOT=${ROOT} ${SHELL} ${MKVERSION}

check_defs:
	SHELL=${SHELL} ROOT=${ROOT} ${SHELL} ${CHECKDEFS}

mkdefs: ${DEFS_H} ${DEFS_SED} ${DEFS_SH}

${DEFS_H} ${DEFS_SH} ${DEFS_SED}: ${ROOT}/conf/EDITME
	ROOT=${ROOT} ${SHELL} ${MKDEFS}

${ROOT}/conf/EDITME: .MAKE
	cd ${ROOT}/conf && ${MAKE} EDITME

clean: clean-local

clean-local:
	rm -f .${DEFS_SH} .${DEFS_H} .${DEFS_SED} .drivertab.c
	rm -f ${FIRSTOBJ} ${OBJ} ${LASTOBJ} ${STANDOBJ} core ldinfo.o

clobber: clean clobber-local

clobber-local:
	rm -f .depend
	rm -f ${DEFS_SH} ${DEFS_H} ${DEFS_SED}
	rm -f ${VERSION_SH} ${VERSION_H} ${VERSION_SED}
	rm -f smail ${STAND}
	rm -f drivertab.c iobpeek.h ldinfo.c

install: all install-dirs install-bins install-libs

install-bins: ${DEFS_SH}
	@. ./${DEFS_SH} ;\
	   case "$$DONT_INSTALL" in \
	   ?*)	echo Testing ... install-bins ignored; exit 0;; \
	   esac; \
	   l_flag=; \
	   case "$$USE_SYMLINKS" in \
	   ?*)	l_flag=-l;; \
	   esac; \
	   s_flag=; \
	   case "$$STRIP" in \
	   ?*)	s_flag=-s;; \
	   esac; \
	   ${XEXEC} ${SHELL} ${INST} $$s_flag $$l_flag -u root -m 4555 \
			    -d $$SMAIL_BIN_DIR \
			    smail ${BIN_NAMES} -k $$NEWALIASES \
			    $$OTHER_SMAIL_NAMES

# XXX I'm not so sure the "touch" commands are safe with TEST_BASE but
# then they don't really do anything but update the last modify time...
#
install-libs: ${DEFS_SH}
	@. ./${DEFS_SH}; \
	   case "$$DONT_INSTALL" in \
	   ?*)	echo Testing ... install-libs ignored; exit 0;; \
	   esac; \
	   if [ "X$$PATH_FORCE_PATHS_FILE" != "X" -a ! -f "$$PATH_FORCE_PATHS_FILE" ] ; then \
	     echo "touch $$PATH_FORCE_PATHS_FILE"; \
	     touch $$PATH_FORCE_PATHS_FILE; \
	   elif [ "X$$PATH_FORCE_PATHS_FILE" = "X" -a -f "$$LIB_DIR/forcepaths" ] ; then \
	     echo ""; \
	     echo "WARNING!!!!    You have an obsolete '$$LIB_DIR/forcepaths' file!"; \
	     echo ""; \
	   fi; \
	   if [ "X$$PATH_FORCE_SMTP_FILE" != "X" -a ! -f "$$PATH_FORCE_SMTP_FILE" ] ; then \
	     echo "touch $$PATH_FORCE_SMTP_FILE"; \
	     touch $$PATH_FORCE_SMTP_FILE; \
	   elif [ "X$$PATH_FORCE_SMTP_FILE" = "X" -a -f "$$LIB_DIR/forcesmtp" ] ; then \
	     echo ""; \
	     echo "WARNING!!!!    You have an obsolete '$$LIB_DIR/forcesmtp' file!"; \
	     echo ""; \
	   fi; \
	   if [ "X$$PATH_PATHS_FILE" != "X" -a ! -f "$$PATH_PATHS_FILE" ] ; then \
	     echo "touch $$PATH_PATHS_FILE"; \
	     touch $$PATH_PATHS_FILE; \
	   fi; \
	   if [ "X$$PATH_REWRITE_FILE" != "X" -a ! -f "$$PATH_REWRITE_FILE" ] ; then \
	     echo "touch $$PATH_REWRITE_FILE"; \
	     touch $$PATH_REWRITE_FILE; \
	   fi

install-dirs: ${DEFS_SH}
	@. ./${DEFS_SH}; \
	   case "$$DONT_INSTALL" in \
	   ?*)	echo Testing ... install-dirs ignored; exit 0;; \
	   esac; \
	   ${XEXEC} ${SHELL} ${MKDIRS} -m 0755 $$LIB_DIR $$LIB_DIR/methods \
				      $$SMAIL_BIN_DIR

# build standalone versions to test various subsystems
#
# NOTE:  these are not checked on a regular basis and are thus not
#	 guarranteed to be compilable.  Some of these rules also leave
#	 object files which are not suitable for loading into the final
#	 smail binary and thus must be removed.
#
# stand_silly.o is loaded as the last module to overcome some
# gdb problems on one of our testing machines

TESTADDR_OBJ=stand_addr.o string.o alloc.o config.o standalone.o
testaddr: $(TESTADDR_OBJ) ${DEFS_SH}
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$LDFLAGS ${INCLUDES} \
		-DSTANDALONE -o testaddr $(TESTADDR_OBJ) $$LIBS
stand_addr.o: addr.c addr.h ${DEFS_H} ${DEFS_SH}
	cp addr.c stand_addr.c
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$CFLAGS ${INCLUDES} -DSTANDALONE \
		-c stand_addr.c

TESTFIELD_OBJ=stand_field.o string.o alloc.o qualify.o addr.o \
	      smailconf.o config.o parse.o version.o standalone.o
testfield: $(TESTFIELD_OBJ) ${DEFS_SH}
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$LDFLAGS ${INCLUDES} \
		-DSTANDALONE -o testfield $(TESTFIELD_OBJ) $$LIBS
stand_field.o: field.c field.h ${DEFS_H} ${DEFS_SH}
	cp field.c stand_field.c
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$CFLAGS ${INCLUDES} -DSTANDALONE \
		-c stand_field.c

TESTHASH_OBJ=stand_hash.o string.o alloc.o config.o standalone.o
testhash: $(TESTHASH_OBJ) ${DEFS_SH}
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$LDFLAGS ${INCLUDES} \
		-DSTANDALONE -o testhash $(TESTHASH_OBJ) $$LIBS
stand_hash.o: hash.c hash.h ${DEFS_H} ${DEFS_SH}
	cp hash.c stand_hash.c
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$CFLAGS ${INCLUDES} -DSTANDALONE \
		-c stand_hash.c

TESTLOOKUP_OBJ=stand_lookup.o standalone.o parse.o config.o string.o alloc.o
testlookup: $(TESTLOOKUP_OBJ) ${DEFS_SH}
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$LDFLAGS ${INCLUDES} \
		-DSTANDALONE -o testlookup $(TESTLOOKUP_OBJ) $$LIBS
stand_lookup.o: lookup.c lookup.h ${DEFS_H} ${DEFS_SH} 
	cp lookup.c stand_lookup.c
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$CFLAGS ${INCLUDES} -DSTANDALONE \
		-c stand_lookup.c

TESTSPOOL_OBJ=stand_spool.o standalone.o config.o string.o alloc.o
testspool: $(TESTSPOOL_OBJ) ${DEFS_SH}
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$LDFLAGS ${INCLUDES} \
		-DSTANDALONE -o testspool $(TESTSPOOL_OBJ) $$LIBS
stand_spool.o: spool.c spool.h ${DEFS_H} ${DEFS_SH}
	cp spool.c stand_spool.c
	@. ./${DEFS_SH}; ${XEXEC} $$CC $$CFLAGS ${INCLUDES} -DSTANDALONE \
		-c stand_spool.c

force:

.MAKE:

.PHONY: all install local-install clean local-clean clobber local-clobber depend local-depend lint mkdefs check_defs tags TAGS
.PHONY: .MAKE force install-bins install-libs install-dirs

# special hard-coded dependencies:
version.o: version.h
smailconf.o: version.h
expand.o: version.h
modes.o: version.h
smtprecv.o: iobpeek.h
config.o: config.h extern.h
default.o: config.h smail.h direct.h route.h transport.h bindlib.h extern.h
default.o: directors/include.h directors/aliasfile.h directors/fwdfile.h directors/user.h directors/smartuser.h
default.o: routers/gethost.h routers/uuname.h routers/pathalias.h routers/smarthost.h routers/reroute.h
default.o: transports/pipe.h transports/appendfile.h transports/tcpsmtp.h transports/smtplib.h
string.o: smailstring.h
