# Development tree name for this version PRODUCT = annoyance-filter VERSION = 1.0d TREE = $(PRODUCT)-$(VERSION) # Build environment OSNAME = Darwin # Libraries INCLUDE_LIBS = -IDCDFlib/doc # Utilities used in building the program SHELL = /bin/sh CC = cc CXX = c++ CTANGLE = cweb/ctangle CWEAVE = cweb/cweave DVIPS = dvips INSTALL = /usr/bin/install -c -o root -g wheel INSTALL_PROGRAM = install -s -o root -g wheel -m 555 INSTALL_DATA = install -o root -g wheel -m 444 PAGER = less PDFTEX = pdftex TEX = tex XDVI = xdvi COMPRESSOR = gzip PERL = perl MAN2HTML = man2html MAN2HTMLHOST = www.fourmilab.ch # Utility options CFLAGS = -fno-common LDFLAGS = -lm # Targets TOOLS = cweb/ctangle cweb/cweave PROGS = $(TOOLS) $(PRODUCT) statlib_test DATA = DOCUMENTS = $(PRODUCT).tex $(PRODUCT).pdf statlib.pdf $(PRODUCT)_man.html # Installation destinations ## The 'DESTDIR' variable allows you to install the program into a different ## location, e.g., for packaging, without affecting the compiled-in pathnames. DESTDIR = # Publication destinations ## PUBDEST specifies the location into which the "publish" ## target should copy the components downloadable from the ## Web page. This is set for the www.fourmilab.ch site ## architecture, and may be modified for mirror sites or ## to publish experimental versions in other locations. WEBDIR = /ftp PUBDEST = $(WEBDIR)/$(PRODUCT) prefix = exec_prefix = ${prefix} bindir = ${exec_prefix}/bin mandir = ${prefix}/man man1dir = $(mandir)/man1 man1ext = .1 BINDIR = $(DESTDIR)$(bindir) MAN1DIR = $(DESTDIR)$(man1dir) prog: $(PROGS) $(DATA) data: $(DATA) doc: $(DOCUMENTS) all: $(PROGS) $(DATA) $(DOCUMENTS) # DCDFlib objects DCDFLIB_OBJS = dcdflib.o ipmpar.o dcdflib.o: DCDFlib/src/dcdflib.c $(CXX) $(CFLAGS) -IDCDFlib/src -c DCDFlib/src/dcdflib.c ipmpar.o: DCDFlib/src/ipmpar.c $(CXX) $(CFLAGS) -IDCDFlib/src -c DCDFlib/src/ipmpar.c # Annoyance filter program $(PRODUCT): $(PRODUCT).o statlib.o $(DCDFLIB_OBJS) $(CXX) $(PRODUCT).o statlib.o $(DCDFLIB_OBJS) -o $(PRODUCT) $(CFLAGS) $(LDFLAGS) @rm -f core core.* $(PRODUCT).o: $(PRODUCT).cc config.h $(PRODUCT).cc: $(PRODUCT).w $(PRODUCT).tex: $(PRODUCT).w log.w $(TOOLS) $(PRODUCT).view: $(PRODUCT).dvi getopt.o: getopt.c getopt.h getopt1.o: getopt1.c getopt.h # Statistical library statlib_test: statlib_test.o statlib.o $(DCDFLIB_OBJS) $(CXX) statlib_test.o statlib.o -o statlib_test $(DCDFLIB_OBJS) $(CFLAGS) $(LDFLAGS) statlib.o: statlib.cc config.h getopt.h statlib.cc: statlib.w statlib_test.o: statlib_test.cc statlib_test.cc: statlib.w statlib.h: statlib.w statlib.tex: statlib.w $(TOOLS) statlib.view: statlib.dvi # CTANGLE and CWEAVE utilities cweb/ctangle: cweb/ctangle.c cweb/common.c cweb/common.h $(CC) -o cweb/ctangle cweb/common.c cweb/ctangle.c -Icweb cweb/cweave: cweb/cweave.c cweb/common.c cweb/common.h $(CC) -o cweb/cweave cweb/common.c cweb/cweave.c -Icweb # Build auto-configuration scripts configurator: rm -f config.cache autoconf # Installation install: $(PRODUCT) $(PRODUCT)-run @if [ ! -d $(HOME)/.$(PRODUCT) ] ;\ then echo 'Creating directory $(HOME)/.$(PRODUCT)' ;\ mkdir $(HOME)/.$(PRODUCT) ;\ fi $(INSTALL_PROGRAM) $(PRODUCT) $(HOME)/.$(PRODUCT)/$(PRODUCT) $(INSTALL_PROGRAM) $(PRODUCT)-run $(HOME)/.$(PRODUCT)/$(PRODUCT)-run @if [ -f dict.bin ] ;\ then if [ dict.bin -nt $(HOME)/.$(PRODUCT)/dict.bin ] ;\ then $(INSTALL_DATA) dict.bin $(HOME)/.$(PRODUCT)/dict.bin ;\ echo "Installed dict.bin in $(HOME)/.$(PRODUCT)/dict.bin" ;\ else echo "dict.bin not updated--not later than $(HOME)/.$(PRODUCT)/dict.bin" ;\ fi ;\ else if [ ! -f $(HOME)/.$(PRODUCT)/dict.bin ] ;\ then echo "You now need to build the dict.bin database and" ;\ echo "install it in $(HOME)/.$(PRODUCT)/dict.bin" ;\ else echo "Using existing dictionary $(HOME)/.$(PRODUCT)/dict.bin" ;\ fi ;\ fi # Uninstallation uninstall: echo rm -rf $(HOME)/.$(PRODUCT) # Update dependencies among source files depend: makedepend *.cc *.c # There are a variety of levels of cleanliness # # clean: Remove object code, but leave C and TeX extracts from web # and generated documentation. The current build configuration # is preserved. clean: rm -f $(PROGS) *.o *.bak *.shar *.zip *.tar.gz *.tar.Z *.sig \ *.dvi core core.* *.out *.log *.aux *.toc *.idx \ *.scn *.gif *.pdb winarch.zip \ annoyance-filter_man_raw.html rm -rf ii_files ( cd cweb ; make clean ) # # distclean: Remove everything not present in the distribution. # This wipes out the build configuration; you must # re-run ./configure before rebuilding. distclean: clean rm -f config.cache config.h Makefile config.log config.status rm -f $(PRODUCT).tex $(PRODUCT).idx \ $(PRODUCT).scn $(PRODUCT).toc \ statlib.tex statlib.idx statlib.scn statlib.toc # # maintainer-clean: Remove everything derivative from the # master web. We don't delete $(PRODUCT).cc # because that causes configure to fail. maintainer-clean: distclean @echo 'This command is intended for maintainers to use; it' @echo 'deletes files that may need special tools to rebuild.' rm -f *.ps *.pdf $(PRODUCT)_man.html $(PRODUCT).1 # reconfigure: This is a geeky target for those who # wish to test on multiple platforms. # Assuming you've already configured and # have a more or less valid Makefile, it # uses it to reconfigure for a different # platform. reconfigure: rm -f config.cache ./configure make clean # Create distribution archives ARCH_SOURCE = Makefile.in $(PRODUCT).cc $(PRODUCT).w config.h.in \ $(PRODUCT)-run \ getopt.c getopt1.c getopt.h \ mystrstream.h mystrstream_new.h fdstream.hpp \ statlib.cc statlib_test.cc statlib.h statlib.w \ cweb DCDFlib makew32.sh makew32.bat testw32.bat ARCH_DOC = $(PRODUCT).1 $(PRODUCT).pdf $(PRODUCT)_man.html \ $(PRODUCT).manm \ statlib.pdf log.w \ COPYING COPYING.GNU INSTALL README README.WIN ARCH_BIN = $(PRODUCT).exe ../cygwin/cygwin1.dll pop3proxy.pif ARCH_BIN_DOC = COPYING.GNU README.WIN ARCH_UTIL = docutil utilities ARCH_DICT_TXT = ARCH_CONF = configure configure.in install-sh ARCH_FILES = $(ARCH_SOURCE) $(ARCH_DOC) $(ARCH_BIN) $(ARCH_CONF) \ $(ARCH_UTIL) $(ARCH_DICT_TXT) ARCH_EXCLUDE = --exclude CVS dist: all # Make zipped archive of Win32 executable rm -f $(PRODUCT).zip zip -j $(PRODUCT).zip $(ARCH_BIN) $(ARCH_BIN_DOC) # Make gzipped tar archive of complete distribution ( cd cweb ; make clean ) rm -f $(TREE).tar.gz rm -rf $(TREE) mkdir $(TREE) chmod 777 $(TREE) @echo "Copying distribution files" @for file in $(ARCH_FILES); do \ cp -pr $$file $(TREE); \ done tar cfv $(TREE).tar $(ARCH_EXCLUDE) $(TREE) $(COMPRESSOR) $(TREE).tar rm -rf $(TREE) # Sign distribution files with GPG (www.fourmilab.ch specific) signatures: dist rm -f *.sig gpg -u 'www.fourmilab.ch Distribution Signing Key' -sb $(TREE).tar.gz gpg -u 'www.fourmilab.ch Distribution Signing Key' -sb $(PRODUCT).zip # Publish distribution on Web page (www.fourmilab.ch specific) publish: signatures dist cp -pf $(PRODUCT).pdf statlib.pdf $(TREE).tar.gz $(PRODUCT)_man.html $(PUBDEST) cp -pf $(PRODUCT).zip $(PUBDEST) cp -pf *.sig $(PUBDEST) -mkdir $(WEBDIR)/$(PRODUCT)/prior-releases/$(TREE) cp -pf $(PRODUCT).pdf statlib.pdf $(TREE).tar.gz $(PRODUCT)_man.html $(WEBDIR)/$(PRODUCT)/prior-releases/$(TREE) cp -pf $(PRODUCT).zip $(WEBDIR)/$(PRODUCT)/prior-releases/$(TREE) cp -pf *.sig $(WEBDIR)/$(PRODUCT)/prior-releases/$(TREE) # Manual page $(PRODUCT).1: $(PRODUCT).manm $(PRODUCT).w $(PERL) docutil/manm_expand.pl $(PRODUCT).manm $(PRODUCT).1 # View manual page manpage: $(PRODUCT).1 nroff -man $(PRODUCT).1 | $(PAGER) # View manual page in TROFF format (assumes groff -X works) mantroff: $(PRODUCT).1 groff -man -X $(PRODUCT).1 # Print manual page printman: $(PRODUCT).1 groff -man $(PRODUCT).1 | lp # HTML edition of manual page manhtml: $(PRODUCT)_man.html # Test it # Uncomment (and edit as you wish) the following line to test recognition of phrases #PHRASE = --verb --phrasemin 1 --phrasemax 4 check: $(PRODUCT) @( \ pass=0 ;\ fail=0 ;\ ./$(PRODUCT) $(PHRASE) --mail $(PRODUCT).w --junk statlib.w --prune \ --fwrite dictf.tmp --write dict.tmp --csvw dictc.tmp ; \ a=`./$(PRODUCT) $(PHRASE) --read dict.tmp --trans - -t $(PRODUCT).w | \ head -50 | grep 'X-Annoyance-Filter-Classification: Mail'` ;\ if [ "$$a" = 'X-Annoyance-Filter-Classification: Mail' ] ;\ then echo 'Mail detection test passed.' ;\ pass=`expr $$pass + 1` ;\ else echo '*** Mail detection test failed! ***' ;\ fail=`expr $$fail + 1` ;\ fi ; \ a=`./$(PRODUCT) $(PHRASE) --fread dictf.tmp --trans - --test statlib.w | \ head -50 | grep 'X-Annoyance-Filter-Classification: Junk'` ;\ if [ "$$a" = 'X-Annoyance-Filter-Classification: Junk' ] ;\ then echo 'Junk detection test passed.' ;\ pass=`expr $$pass + 1` ;\ else echo '*** Junk detection test failed! ***' ;\ fail=`expr $$fail + 1` ;\ fi ;\ if [ $$fail -eq 0 ] ;\ then echo 'All tests passed.' ;\ else if [ $$pass -eq 0 ] ;\ then echo '*** All tests failed. ***' ;\ else echo "*** $$fail tests failed; $$pass passed. ***" ;\ fi ;\ fi ;\ ) @rm -f dict*.tmp # Make Zipped source to build Windows executable # The .w files are not actually required to build on # Windows, but are extremely handy to have if you # should encounter compile errors, as they are reported # with line numbers from the .w files. winarch: $(PRODUCT).cc rm -f winarch.zip zip -pr winarch.zip $(PRODUCT).cc \ statlib.h statlib.cc \ getopt1.c getopt.c \ DCDFlib \ config.h getopt.h \ mystrstream.h mystrstream_new.h \ fdstream.hpp \ makew32.sh makew32.bat testw32.bat \ $(PRODUCT).w statlib.w -x \*CVS\* # Compile a program .c.o: $(CC) $(CFLAGS) $(INCLUDE_LIBS) -c $< .c: $(CC) $(CFLAGS) $(INCLUDE_LIBS) $(LDFLAGS) -o $@ $< .cc.o: $(CXX) $(CFLAGS) $(INCLUDE_LIBS) -c $< .cc: $(CXX) $(CFLAGS) $(INCLUDE_LIBS) $(LDFLAGS) -o $@ $< .w.c: $(CTANGLE) $< .c.cc: mv $*.c $*.cc .w.tex: $(TOOLS) $(CWEAVE) $< .tex.dvi: TEXINPUTS=.:./cweb:$(TEXINPUTS) $(TEX) $< .tex.pdf: TEXINPUTS=.:./cweb:$(TEXINPUTS) $(PDFTEX) $< .dvi.view: $(XDVI) -s 0 $< .SUFFIXES: .SUFFIXES: .bin .c .cc .o .ch .dvi .pdf .tex .view .w .1 .html .manm