#
# Written by Tony Finch <dot@dotat.at> <fanf2@cam.ac.uk>
# at the University of Cambridge Computing Service.
# You may do anything with this, at your own risk.
#
# $Cambridge: users/fanf2/selog/Makefile,v 1.43 2008/07/30 14:43:45 fanf2 Exp $
#

.POSIX:

# The ELF shared object targets require that CFLAGS is set so that
# the default .c.o double-suffix rule builds position-independent
# code (though this slightly pessimizes the static librares).
# The default settings below assume the compiler is gcc and
# therefore pass the -fpic option.

CFLAGS=-O -pipe -std=gnu99 -fpic ${EXTRAFLAGS}
LDFLAGS=-shared -fpic
SOFLAG=-Wl,-soname,

DEVCFLAGS=${CFLAGS} -I../lua/src -g -pedantic -Werror -Wall -Wextra	\
	-Wbad-function-cast -Wcast-align -Wcast-qual -Winline		\
	-Wmissing-declarations -Wmissing-prototypes -Wnested-externs	\
	-Wold-style-definition -Wpointer-arith -Wredundant-decls	\
	-Wshadow -Wstrict-prototypes -Wwrite-strings

PREFIX=/usr/local
BINDIR=${PREFIX}/bin
LIBDIR=${PREFIX}/lib
MANDIR=${PREFIX}/man
LUADIR=${PREFIX}/lib/lua/5.1

DOCSRC=	selog-cmd.man selog-lua.man selog-prog.man selog-user.man

DOCS=	${DOCSRC:.man=.txt} ${DOCSRC:.man=.html} \
	${DOCSRC:.man=.ps}  ${DOCSRC:.man=.pdf} \
	selog.${MAN_CMD} selog.${MAN_LIB} selog.${MAN_MISC}

MAN_CMD=1
MAN_LIB=3
MAN_MISC=7
MAN_SED=sed "s/@cmd@/${MAN_CMD}/;s/@lib@/${MAN_LIB}/;s/@misc@/${MAN_MISC}/"

.SUFFIXES: .o .c .man .txt .html .ps .pdf

# utility targets

intro: all

clean:
	rm -f selog *.a *.o *.so *.so.1
	rm -f Test/[a-z]* test-harness test-fuzzer

realclean: clean
	rm -rf ${DOCS} Web/selog-snap*

all: static elf selog

dev: docs
	${MAKE} CFLAGS="${DEVCFLAGS}" all lua-dev testers

# install

install:
	./install.sh 0755 ${BINDIR} selog
	./install.sh 0755 ${LIBDIR} lib*.so.1
	./install.sh 0755 ${LIBDIR} lib*.so
	./install.sh 0644 ${LIBDIR} lib*.a
	./install.sh 0644 ${MANDIR}/man${MAN_CMD} selog.${MAN_CMD}
	./install.sh 0644 ${MANDIR}/man${MAN_LIB} selog.${MAN_LIB}
	./install.sh 0644 ${MANDIR}/man${MAN_MISC} selog.${MAN_MISC}

# releases

release: Web/selog-8.7.30.tar.gz \
         Web/selog-8.4.10.tar.gz \
         Web/selog-8.4.9.tar.gz \
         Web/selog-snap.tar.gz

upload: realclean release
	scp -rp Web/* fanf@chiark.greenend.org.uk:public-html/prog/selog

Web/selog-8.7.30.tar.gz:
	./release.sh "2008-07-30 23:00:00" 8.7.30

Web/selog-8.4.10.tar.gz:
	./release.sh "2008-04-10 23:00:00" 8.4.10

Web/selog-8.4.9.tar.gz:
	./release.sh "2008-04-09 23:00:00" 8.4.9

Web/selog-snap.tar.gz:
	./release.sh now snap

# testing

test: testers
	@sh test-script

testers: test-harness test-fuzzer

test-harness: test-harness.c libselog.a libselog_err.a
	${CC} ${DEVCFLAGS} -o test-harness test-harness.c libselog.a libselog_err.a

test-fuzzer: test-fuzzer.c
	${CC} ${DEVCFLAGS} -o test-fuzzer test-fuzzer.c

fuzz: test-fuzzer
	for i in `jot 50`; do \
		echo '../test-harness "@stderr;'"`./test-fuzzer`"'"'; \
	done >fuzz

# preformatted documentation

docs: ${DOCS}

selog.${MAN_CMD}: selog-cmd.man
	${MAN_SED} <selog-cmd.man >$@

selog.${MAN_LIB}: selog-prog.man
	${MAN_SED} <selog-prog.man >$@

selog.${MAN_MISC}: selog-user.man
	${MAN_SED} <selog-user.man >$@

selog-prog.txt selog-prog.html selog-prog.ps selog-prog.pdf: selog-prog.man
selog-user.txt selog-user.html selog-user.ps selog-user.pdf: selog-user.man
selog-lua.txt  selog-lua.html  selog-lua.ps  selog-lua.pdf:  selog-lua.man

.man.txt:
	${MAN_SED} $< | groff -t -man -Tascii | col -bx >$@

.man.html:
	${MAN_SED} $< | rman -Sb -f html -r '' | \
	sed 's/squo;/dquo;/g;s/rdquo;s/rsquo;s/g' >$@

.man.ps:
	${MAN_SED} $< | groff -t -man -Tps -P-pa4 -dpaper=a4 >$@

.ps.pdf:
	ps2pdf $< $@

# command-line tool

selog: selog.c selog.h static elf
	${CC} ${CFLAGS} -o selog selog.c -L. -lselog

# traditional static libraries

static: libselog.a libselog_err.a libselog_syslog.a

libselog.a: selog_api.o selog_unix.o
	$(AR) $(ARFLAGS) libselog.a selog_api.o selog_unix.o

libselog_err.a: selog_err.o
	$(AR) $(ARFLAGS) libselog_err.a selog_err.o

libselog_syslog.a: selog_syslog.o
	$(AR) $(ARFLAGS) libselog_syslog.a selog_syslog.o

# ELF shared objects

elf: libselog.so libselog_err.so libselog_syslog.so

libselog.so: libselog.so.1
	ln -sf libselog.so.1 libselog.so

libselog_err.so: libselog_err.so.1
	ln -sf libselog_err.so.1 libselog_err.so

libselog_syslog.so: libselog_syslog.so.1
	ln -sf libselog_syslog.so.1 libselog_syslog.so

libselog.so.1: selog_api.o selog_unix.o
	${CC} ${LDFLAGS} ${SOFLAG}$@ -o $@ selog_api.o selog_unix.o ${LIBS}

libselog_err.so.1: selog_err.o libselog.so
	${CC} ${LDFLAGS} ${SOFLAG}$@ -o $@ selog_err.o -L. -lselog

libselog_syslog.so.1: selog_syslog.o libselog.so
	${CC} ${LDFLAGS} ${SOFLAG}$@ -o $@ selog_syslog.o -L. -lselog

# lua is optional so is separate from the rest

lua: luaselog.so

lua-dev: lua
	ln -sf luaselog.so selog.so

lua-install: lua-elf
	cp luaselog.so ${LUADIR}/selog.so

luaselog.so: selog_lua.o libselog.so
	${CC} ${LDFLAGS} -o $@ selog_lua.o -L. -lselog

# dependencies

selog_api.o:    selog_api.c    selog.h
selog_err.o:    selog_err.c    selog.h
selog_lua.o:    selog_lua.c    selog.h
selog_syslog.o: selog_syslog.c selog.h
selog_unix.o:   selog_unix.c   selog.h

# EOF
