##  $Id: Makefile 7488 2005-12-25 00:26:08Z eagle $

include Makefile.global

##  All installation directories except for $(PATHRUN), which has a
##  different mode than the rest.
INSTDIRS      = $(PATHNEWS) $(PATHBIN) $(PATHAUTH) $(PATHAUTHRESOLV) \
		$(PATHAUTHPASSWD) $(PATHCONTROL) $(PATHFILTER) \
		$(PATHRNEWS) $(PATHDB) $(PATHDOC) $(PATHETC) $(PATHLIB) \
		$(PATHMAN) $(MAN1) $(MAN3) $(MAN5) $(MAN8) $(PATHSPOOL) \
		$(PATHTMP) $(PATHARCHIVE) $(PATHARTICLES) $(PATHINCOMING) \
		$(PATHINBAD) $(PATHTAPE) $(PATHOVERVIEW) $(PATHOUTGOING) \
		$(PATHLOG) $(PATHLOG)/OLD $(PATHINCLUDE)

##  LIBDIRS are built before PROGDIRS, make update runs in all UPDATEDIRS,
##  and make install runs in all ALLDIRS.  Nothing runs in test except the
##  test target itself and the clean targets.  Currently, include is built
##  before anything else but nothing else runs in it except clean targets.
LIBDIRS     = include lib storage history
PROGDIRS    = innd nnrpd innfeed control expire frontends backends authprogs \
              scripts
UPDATEDIRS  = $(LIBDIRS) $(PROGDIRS) doc
ALLDIRS     = $(UPDATEDIRS) samples site
CLEANDIRS   = $(ALLDIRS) include tests

##  The directory name and tar file to use when building a release.
TARDIR      = inn-$(VERSION)
TARFILE     = $(TARDIR).tar

##  The directory to use when building a snapshot.
SNAPDIR     = inn-$(SNAPSHOT)-$(SNAPDATE)

##  DISTDIRS gets all directories from the MANIFEST, and DISTFILES gets all
##  regular files.  Anything not listed in the MANIFEST will not be included
##  in a distribution.  These are arguments to sed.
DISTDIRS    = -e 1,2d -e '/(Directory)/!d' -e 's/ .*//' -e 's;^;$(TARDIR)/;'
SNAPDIRS    = -e 1,2d -e '/(Directory)/!d' -e 's/ .*//' -e 's;^;$(SNAPDIR)/;'
DISTFILES   = -e 1,2d -e '/(Directory)/d' -e 's/ .*//'


##  Major target -- build everything.  Rather than just looping through
##  all the directories, use a set of parallel rules so that make -j can
##  work on more than one directory at a time.
all: all-include all-libraries all-programs
	cd doc     && $(MAKE) all
	cd samples && $(MAKE) all
	cd site    && $(MAKE) all

all-libraries:	all-lib all-storage all-history

all-include:			; cd include   && $(MAKE) all
all-lib:	all-include	; cd lib       && $(MAKE) all
all-storage:	all-lib		; cd storage   && $(MAKE) library
all-history:	all-storage	; cd history   && $(MAKE) all

all-programs:	all-innd all-nnrpd all-innfeed all-control all-expire \
		all-frontends all-backends all-authprogs all-scripts \
		all-store-util

all-authprogs:	all-lib		; cd authprogs && $(MAKE) all
all-backends:	all-libraries	; cd backends  && $(MAKE) all
all-control:			; cd control   && $(MAKE) all
all-expire:	all-libraries	; cd expire    && $(MAKE) all
all-frontends:	all-libraries	; cd frontends && $(MAKE) all
all-innd:	all-libraries	; cd innd      && $(MAKE) all
all-innfeed:	all-libraries	; cd innfeed   && $(MAKE) all
all-nnrpd:	all-libraries	; cd nnrpd     && $(MAKE) all
all-scripts:			; cd scripts   && $(MAKE) all
all-store-util:	all-libraries	; cd storage   && $(MAKE) programs


##  If someone tries to run make before running configure, tell them to run
##  configure first.
Makefile.global:
	@echo 'Run ./configure before running make.  See INSTALL for details.'
	@exit 1


##  Installation rules.  make install installs everything; make update only
##  updates the binaries, scripts, and documentation and leaves config
##  files alone.
install: directories
	@for D in $(ALLDIRS) ; do \
	    echo '' ; \
	    cd $$D && $(MAKE) install || exit 1 ; cd .. ; \
	done
	@echo ''
	@echo 'If this is a first-time installation, a minimal active file and'
	@echo 'history database have been installed.  Do not forget to update'
	@echo 'your cron entries and configure INN.  See INSTALL for more'
	@echo 'information.'
	@echo ''

directories:
	@chmod +x support/install-sh
	for D in $(INSTDIRS) ; do \
	    support/install-sh $(OWNER) -m 0755 -d $(D)$$D ; \
	done
	support/install-sh $(OWNER) -m 0750 -d $(D)$(PATHRUN)

update: 
	@chmod +x support/install-sh
	@for D in $(UPDATEDIRS) ; do \
	    echo '' ; \
	    cd $$D && $(MAKE) install || exit 1 ; cd .. ; \
	done
	$(PATHBIN)/innupgrade $(PATHETC)

##  Install a certificate for TLS/SSL support.
cert:
	$(SSLBIN)/openssl req -new -x509 -nodes \
	    -out $(PATHLIB)/cert.pem -days 366 \
	    -keyout $(PATHLIB)/key.pem
	chown $(NEWSUSER) $(PATHLIB)/cert.pem
	chgrp $(NEWSGROUP) $(PATHLIB)/cert.pem
	chmod 640 $(PATHLIB)/cert.pem
	chown $(NEWSUSER) $(PATHLIB)/key.pem
	chgrp $(NEWSGROUP) $(PATHLIB)/key.pem
	chmod 600 $(PATHLIB)/key.pem


##  Cleanup targets.  clean deletes all compilation results but leaves the
##  configure results.  distclean or clobber removes everything not part of
##  the distribution tarball.  maintclean removes some additional files
##  created as part of the release process.
clean:
	@for D in $(CLEANDIRS) ; do \
	    echo '' ; \
	    cd $$D && $(MAKE) clean || exit 1 ; cd .. ; \
	done

clobber realclean distclean:
	@for D in $(CLEANDIRS) ; do \
	    echo '' ; \
	    cd $$D && $(MAKE) $(FLAGS) clobber && cd .. ; \
	done
	@echo ''
	rm -f LIST.* Makefile.global TAGS tags config.cache config.log
	rm -f config.status libtool support/fixscript

maintclean: distclean
	rm -rf $(TARDIR)
	rm -f CHANGES ChangeLog inn*.tar.gz


##  Other generic targets.
depend tags ctags profiled:
	@for D in $(ALLDIRS) ; do \
	    echo '' ; \
	    cd $$D && $(MAKE) $@ || exit 1 ; cd .. ; \
	done

TAGS etags:
	etags */*.c */*.h */*/*.c */*/*.h


##  Run the test suite.
check test tests:
	cd tests && $(MAKE) test


##  For maintainers, build the entire source base with warnings enabled.
warnings:
	$(MAKE) COPT="$(WARNINGS) $(COPT)" all


##  Make a release.  We create a release by recreating the directory
##  structure and then copying over all files listed in the MANIFEST.  If it
##  isn't in the MANIFEST, it doesn't go into the release.  We also update
##  the version information in Makefile.global.in to remove the prerelease
##  designation and update all timestamps to the date the release is made.
release: ChangeLog
	rm -rf $(TARDIR)
	rm -f inn*.tar.gz
	mkdir $(TARDIR)
	for d in `sed $(DISTDIRS) MANIFEST` ; do mkdir -p $$d ; done
	for f in `sed $(DISTFILES) MANIFEST` ; do \
	    cp $$f $(TARDIR)/$$f || exit 1 ; \
	done
	sed 's/= prerelease/=/' < Makefile.global.in \
	    > $(TARDIR)/Makefile.global.in
	cp ChangeLog $(TARDIR)
	find $(TARDIR) -type f -print | xargs touch -t `date +%m%d%H%M.%S`
	tar cf $(TARFILE) $(TARDIR)
	$(GZIP) -9 $(TARFILE)

##  Generate the ChangeLog using support/mkchangelog.  This should only be
##  run by a maintainer since it depends on cvs log working and also
##  requires cvs2cl be available somewhere.
ChangeLog:
	$(PERL) support/mkchangelog


##  Check the MANIFEST against the files present in the current tree,
##  building a list with find and running diff between the lists.
check-manifest:
	sed -e 1,2d -e 's/ .*//' MANIFEST > LIST.manifest
	$(PERL) support/mkmanifest > LIST.real
	diff -u LIST.manifest LIST.real


##  Make a snapshot.  This is like making a release, except that we don't do
##  the ChangeLog thing and we don't change the version number.  We also
##  assume that SNAPSHOT has been set to the appropriate current branch.
snapshot:
	rm -rf $(SNAPDIR)
	rm -f inn*.tar.gz
	mkdir $(SNAPDIR)
	set -e ; for d in `sed $(SNAPDIRS) MANIFEST` ; do mkdir -p $$d ; done
	set -e ; for f in `sed $(DISTFILES) MANIFEST` ; do \
	    cp $$f $(SNAPDIR)/$$f ; \
	done
	cp README.snapshot $(SNAPDIR)/
	sed 's/= prerelease/= $(SNAPDATE) snapshot/' \
	    Makefile.global.in > $(SNAPDIR)/Makefile.global.in
	find $(SNAPDIR) -type f -print | xargs touch -t `date +%m%d%H%M.%S`
	tar cf $(SNAPDIR).tar $(SNAPDIR)
	$(GZIP) -9 $(SNAPDIR).tar


syntax highlighted by Code2HTML, v. 0.9.1