# #ident "@(#)smail/src:RELEASE-3_2_0_121:Makefile,v 1.81 2005/05/27 07:17:08 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. ROOT=.. THIS_DIR=src include ${ROOT}/conf/Make.local 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 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 match.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 match.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 match.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}: ${DOT_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} CTAGS = ctags ctags 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 ETAGS = emacs-etags etags 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 ${DOT_MAKE} @echo "Making default targets in '${THIS_DIR}/directors' next ..." @if [ -f directors/.depend ] ; then \ DEPMKFILE="-f Makefile -f .depend"; \ fi; \ echo "cd directors && ${MAKE} $$DEPMKFILE all"; \ cd directors && ${MAKE} $$DEPMKFILE all @echo "Done in directors." routers/rdrivlib.a: force routers/Makefile ${DOT_MAKE} @echo "Making default targets in '${THIS_DIR}/routers' next ..." @if [ -f routers/.depend ] ; then \ DEPMKFILE="-f Makefile -f .depend"; \ fi; \ echo "cd routers && ${MAKE} $$DEPMKFILE all"; \ cd routers && ${MAKE} $$DEPMKFILE all @echo "Done in routers." transports/tdrivlib.a: force transports/Makefile ${DOT_MAKE} @echo "Making default targets in '${THIS_DIR}/transports' next ..." @if [ -f transports/.depend ] ; then \ DEPMKFILE="-f Makefile -f .depend"; \ fi; \ echo "cd transports && ${MAKE} $$DEPMKFILE all"; \ cd transports && ${MAKE} $$DEPMKFILE all @echo "Done in transports." clean clobber mkdefs defs depend: ${DOT_MAKE} -@for i in directors routers transports; do \ if [ -f $$i/Makefile ]; then \ echo "Making $@ in ${THIS_DIR}/$$i ..."; \ (cd $$i && ${MAKE} $@); \ rc=$$?; \ if [ $$rc -ne 0 ] ; then \ exit $$rc; \ fi; \ else \ echo "Ignoring $$i -- no Makefile"; \ fi; \ done mkdefs defs depend: ${DRIVER_MAKEFILES} # We could mark these targets as .PRECIOUS, but they don't really # matter that much and they should NEVER be hand-edited! # drivertab.c drivertab.h ${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 # note these are all separate commands to accommodate old and less # capable shells... # 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 @. ./${DEFS_SH}; \ echo "drivertab.c: $$DRIVER_CONFIGURATION" >> .depend @. ./${DEFS_SH}; \ echo "directors/Makefile: $$DRIVER_CONFIGURATION" >> .depend @. ./${DEFS_SH}; \ echo "routers/Makefile: $$DRIVER_CONFIGURATION" >> .depend @. ./${DEFS_SH}; \ 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: ${DEFS_H} ${DEFS_SED} ${DEFS_SH} ${DEFS_H} ${DEFS_SH} ${DEFS_SED}: ${ROOT}/conf/EDITME ROOT=${ROOT} ${SHELL} ${MKDEFS} .PRECIOUS: ${ROOT}/conf/EDITME ${ROOT}/conf/EDITME: ${DOT_MAKE} @echo "Making $@ ..." cd ${ROOT}/conf && ${MAKE} EDITME clean: local-clean local-clean: rm -f .${DEFS_SH} .${DEFS_H} .${DEFS_SED} .drivertab.c .drivertab.h rm -f ${FIRSTOBJ} ${OBJ} ${LASTOBJ} ${STANDOBJ} ldinfo.o clobber: clean local-clobber local-clobber: local-clean 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 core *.core a.out rm -f drivertab.c drivertab.h iobpeek.h ldinfo.c rm -f tags TAGS 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 4551 \ -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 ... $@ ignored; exit 0;; \ esac; \ if [ "X$$PATH_FORCE_PATHS_FILE" != "X" -a ! -f "$$PATH_FORCE_PATHS_FILE" ] ; then \ ${XEXEC} 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 \ ${XEXEC} 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 \ ${XEXEC} touch $$PATH_PATHS_FILE; \ fi; \ if [ "X$$PATH_REWRITE_FILE" != "X" -a ! -f "$$PATH_REWRITE_FILE" ] ; then \ ${XEXEC} touch $$PATH_REWRITE_FILE; \ fi; \ if [ ! -f "$$LIB_DIR/dead-mail.senders" ] ; then \ ${XEXEC} touch $$LIB_DIR/dead-mail.senders; \ 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: .PHONY: all install local-install clean local-clean clobber local-clobber depend local-depend lint mkdefs defs check_defs ctags etags .PHONY: force install-bins install-libs install-dirs # special hard-coded dependencies for lazy people who don't use "make depend": version.o: version.h smailconf.o: version.h expand.o: version.h modes.o: version.h smtprecv.o: drivertab.h iobpeek.h config.o: config.h extern.h drivertab.o: drivertab.h default.o: ${DEFS_H} config.h drivertab.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