# =========================================================================
# File: Makefile
#
# Copyright (c) 2004 and onwards, Twenty First Century Communications, Inc.
# <josh.glover@tfcci.com>
#
# LICENCE:
#
#   This file is distributed under the terms of the BSD License, v2. See
#   the COPYING file, which should have been distributed with this file,
#   for details. If you did not receive the COPYING file, see:
#
#   http://www.jmglov.net/open-source/licences/bsd.html
#
# DESCRIPTION:
#
#   Makefile for dclog.
#
# USAGE:
#
#   See the 'usage' target, below.
#
# EXAMPLES:
#
#   make install
#
# TODO:
#
#   - Add doc target that supports LXR, and Doxygen or NaturalDocs
#   - Update to support OSDT
#   - Nothing, this code is perfect
#  
# DEPENDENCIES:
#
#   GNU tar (for 'dist' target)
#   Make (tested with GNU Make)
#
# MODIFICATIONS:
#
#   Josh Glover <josh.glover@tfcci.com> (2004/07/08): Initial revision
# =========================================================================

# Obey standard Autotools installation directories
DESTDIR        =
PREFIX         = /usr/local
EPREFIX        = ${PREFIX}
BINDIR         = ${EPREFIX}/bin
SBINDIR        = ${EPREFIX}/sbin
LIBEXECDIR     = ${EPREFIX}/libexec
DATADIR        = ${PREFIX}/share
SYSCONFDIR     = ${PREFIX}/etc
SHAREDSTATEDIR = ${PREFIX}/com
LOCALSTATEDIR  = ${PREFIX}/var
LIBDIR         = ${EPREFIX}/lib
INCLUDEDIR     = ${PREFIX}/include
OLDINCLUDEDIR  = /usr/include
INFODIR        = ${PREFIX}/info
MANDIR         = ${PREFIX}/man

BIN_FILES  = test-dclog
H_FILES    = dclog.h
MISC_FILES = Doxyfile.orig lxr.conf test-dclog.log* valgrind-log_*
SO_FILES   = libdclog.so

CC     = gcc
CFLAGS = -Wall -I. -D_REENTRANT

# Doxygen config
DOXY_DOXYGEN          = `which doxygen`
DOXY_PROJECT_NAME     = dclog
DOXY_OUTPUT_DIRECTORY = docs
DOXY_OPTIMIZE_OUTPUT  = FOR_C
DOXY_EXTRACT_ALL      = YES
DOXY_RECURSIVE        = YES
DOXY_GENERATE_LATEX   = NO
DOXY_SERVER           = www.jmglov.net
DOXY_DIR              = /var/www/localhost/htdocs/opensource/${DOXY_PROJECT_NAME}/doc/api/

# LXR config
LXR_SERVER       = www.jmglov.net
LXR_HTDOCS       = /var/www/localhost/htdocs
LXR_DIR          = lxr
LXR_NAME         = dclog
LXR_PATH         = ${LXR_HTDOCS}/${LXR_DIR}/${LXR_NAME}
LXR_BINDIR       = ../bin
LXR_HTMLDIR      = .
LXR_LIBDIR       = ../lib
LXR_SOURCEROOT   = ./src
LXR_SRCROOTNAME  = dclog
LXR_INCPREFIX    = ./include
LXR_DBDIR        = ./db
LXR_GLIMPSEBIN   = glimpse
LXR_GLIMPSEINDEX = ${LXR_GLIMPSEBIN}index
LXR_GENXREF      = genxref
LXR_BASEURL      = http://${LXR_SERVER}/${LXR_DIR}/${LXR_NAME}/

# Path to valgrind binary
VALGRIND_BIN  = `which valgrind`
VALGRIND_OPTS = -v --leak-check=yes --leak-resolution=high --show-reachable=yes

# webapp-config config
WEBAPP_CONFIG = webapp-config

## Version
VERSION = `cat VERSION`

usage:
	@ echo 'Usage: make <target>'
	@ echo
	@ echo '  where valid <target>s are:'
	@ echo
	@ echo '    all      build'
	@ echo '    dist     build distribution tarball'
	@ echo '    ebuild   create Gentoo ebuild script'
	@ echo '    install  install into ${PREFIX}'
	@ echo '    usage    display this message'

## Build everything
all: ${SO_FILES} test

## Clean up temporary files
clean:
	- rm ${BIN_FILES} ${SO_FILES} ${MISC_FILES}

## Build with debugging symbols
debug:
	${MAKE} all "CFLAGS=${CFLAGS} -g"

## Build distribution tarball
dist:
	@ echo test -d /tmp/dclog-${VERSION} \&\& rm -rf /tmp/dclog-${VERSION}
	@ - test -d /tmp/dclog-${VERSION} && rm -rf /tmp/dclog-${VERSION}
	@ echo mkdir /tmp/dclog-${VERSION}
	@ mkdir /tmp/dclog-${VERSION}
	@ echo cp -r . /tmp/dclog-${VERSION}/
	@ cp -r . /tmp/dclog-${VERSION}/
	@ mv /tmp/dclog-${VERSION}/dclog.ebuild \
	  /tmp/dclog-${VERSION}/dclog-${VERSION}.ebuild
	@ echo tar -cjf dclog-${VERSION}.tbz2 -C /tmp \
	--exclude CVS --exclude \*.tbz2 --exclude .\* dclog-${VERSION}
	@ tar -cjf dclog-${VERSION}.tbz2 -C /tmp \
	--exclude CVS --exclude \*.tbz2 --exclude .\* dclog-${VERSION}
	@ echo rm -rf  /tmp/dclog-${VERSION}
	@ rm -rf  /tmp/dclog-${VERSION}

## Generate documentation
doc: clean
	@ if test -x "${DOXY_DOXYGEN}"; then ${MAKE} doc_doxygen; else true; fi
	@ if test -n "${LXR_SERVER}"; then ${MAKE} doc_lxr; else true; fi

## Generate API documentation with Doxygen and push it out to a webserver
doc_doxygen: Doxyfile
	@ echo doxygen
	@ doxygen >/dev/null 2>&1
	- ssh  ${DOXY_SERVER} mkdir -p ${DOXY_DIR}
	rsync -av -e ssh --delete --exclude CVS ${DOXY_OUTPUT_DIRECTORY}/html/ \
	  ${DOXY_SERVER}:${DOXY_DIR}/
	ssh  ${DOXY_SERVER} chmod -R 755 ${DOXY_DIR}

## Generate Doxygen's config file
Doxyfile:
	${DOXY_DOXYGEN} -g >/dev/null 2>&1
	cp Doxyfile Doxyfile.orig
	sed \
	  -e 's/^\(PROJECT_NAME \+\)=.\+$$/\1= ${DOXY_PROJECT_NAME}/' \
	  -e 's/^\(OUTPUT_DIRECTORY \+\)=.\+$$/\1= ${DOXY_OUTPUT_DIRECTORY}/' \
	  -e 's/^\(OPTIMIZE_OUTPUT_${DOXY_OPTIMIZE_OUTPUT} \+\)=.\+$$/\1= YES/' \
	  -e 's/^\(EXTRACT_ALL \+\)=.\+$$/\1= ${DOXY_EXTRACT_ALL}/' \
	  -e 's/^\(RECURSIVE \+\)=.\+$$/\1= ${DOXY_RECURSIVE}/' \
	  -e 's/^\(GENERATE_LATEX \+\)=.\+$$/\1= ${DOXY_GENERATE_LATEX}/' \
	  Doxyfile.orig >Doxyfile
	rm Doxyfile.orig

## Generate browsable source with LXR
doc_lxr: lxr.conf
	@ if ! ssh ${LXR_SERVER} test -d ${LXR_PATH}; then \
	  if ssh ${LXR_SERVER} type -a ${WEBAPP_CONFIG}; then \
	    echo "Please run 'webapp-config -I -d ${LXR_PATH} lxr 0.3.1'"; \
	    echo "as root, then re-run 'make doc' or 'make doc_lxr'"; \
	    exit 1; \
	  else \
	    echo ssh ${LXR_SERVER} mkdir ${LXR_PATH}; \
	    ssh ${LXR_SERVER} mkdir ${LXR_PATH} || exit $$?; \
	    ssh ${LXR_SERVER} 'cd ${LXR_PATH} && for i in ${LXR_BINDIR}/* ${LXR_LIBDIR}; do echo ln -s $$i; done'; \
	    ssh ${LXR_SERVER} 'cd ${LXR_PATH} && for i in ${LXR_BINDIR}/* ${LXR_LIBDIR}; do echo ln -s $$i; ln -s $$i || exit $$?; done' || exit $$?; \
	  fi; \
	fi
	@ - for i in ${LXR_SOURCEROOT} ${LXR_INCPREFIX} ${LXR_DBDIR}; do \
	  echo ssh ${LXR_SERVER} mkdir ${LXR_PATH}/$$i; \
	  ssh ${LXR_SERVER} mkdir ${LXR_PATH}/$$i; \
	done
	scp lxr.conf ${LXR_SERVER}:${LXR_PATH}/ || exit $$?
	rsync -av -e ssh --delete --exclude CVS ./ ${LXR_SERVER}:${LXR_PATH}/${LXR_SOURCEROOT}/ || exit $$?
	ssh ${LXR_SERVER} 'cd ${LXR_PATH}/${LXR_DBDIR} && ${LXR_GENXREF} ../${LXR_SOURCEROOT} && chmod 755 *' || exit $$?
	- ssh ${LXR_SERVER} ${LXR_GLIMPSEINDEX} -H ${LXR_PATH}/${LXR_DBDIR} ${LXR_PATH}/${LXR_SOURECROOT}
	ssh ${LXR_SERVER} chmod -R 755 ${LXR_PATH} || exit $$?

## Write LXR config file
lxr.conf:
	@ echo '# Define the base url for the LXR files.' >lxr.conf
	@ echo "baseurl: ${LXR_BASEURL}" >>lxr.conf
	@ echo >>lxr.conf
	@ echo '# These are the templates for the HTML heading, directory ' >>lxr.conf
	@ echo '# listing and footer, respectively.' >>lxr.conf
	@ echo "htmlhead: ${LXR_HTMLDIR}/template-head" >>lxr.conf
	@ echo "htmltail: ${LXR_HTMLDIR}/template-tail" >>lxr.conf
	@ echo "htmldir:  ${LXR_HTMLDIR}/template-dir" >>lxr.conf
	@ echo >>lxr.conf
	@ echo '# The source is here.' >>lxr.conf
	@ echo "sourceroot:  ${LXR_SOURCEROOT}" >>lxr.conf
	@ echo "srcrootname: ${LXR_SRCROOTNAME}" >>lxr.conf
	@ echo >>lxr.conf
	@ echo '# "#include <foo.h>" is mapped to this directory' >>lxr.conf
	@ echo '#  (in the LXR source tree)' >>lxr.conf
	@ echo "incprefix: ${LXR_INCPREFIX}" >>lxr.conf
	@ echo >>lxr.conf
	@ echo '# The database files go here.' >>lxr.conf
	@ echo "dbdir: ${LXR_DBDIR}" >>lxr.conf
	@ echo >>lxr.conf
	@ echo '# Glimpse can be found here.' >>lxr.conf
	@ if test -n "${LXR_GLIMPSEBIN}"; then \
	  echo "glimpsebin: ${LXR_GLIMPSEBIN}" >>lxr.conf; \
	else \
	  echo "#glimpsebin: ${LXR_GLIMPSEBIN}" >>lxr.conf; \
	fi

## Install library
install:
	@ for i in "${INCLUDEDIR}" "${LIBDIR}"; do \
	  test -d ${DESTDIR}$$i; \
	  if test $$? -ne 0; then \
	    echo mkdir -p ${DESTDIR}$$i; \
	    mkdir -p ${DESTDIR}$$i; \
	  fi; \
	done
	@ for i in ${H_FILES}; do \
	  test -f ${DESTDIR}${INCLUDEDIR}/$$i; \
	  if test $$? -ne 0; then \
	    echo cp $$i ${DESTDIR}${INCLUDEDIR}/; \
	    cp $$i ${DESTDIR}${INCLUDEDIR}/; \
	    echo chmod 755 ${DESTDIR}${INCLUDEDIR}/$$i; \
	    chmod 755 ${DESTDIR}${INCLUDEDIR}/$$i; \
	  fi; \
	done
	@ for i in ${SO_FILES}; do \
	  echo cp $$i ${DESTDIR}${LIBDIR}/; \
	  cp $$i ${DESTDIR}${LIBDIR}/; \
	  echo chmod 755 ${DESTDIR}${LIBDIR}/$$i; \
	  chmod 755 ${DESTDIR}${LIBDIR}/$$i; \
	done

## Build test programs
test:
	${MAKE} test-dclog "CFLAGS=${CFLAGS} -g"

## Use valgrind on the test program
valgrind: test
	@ if ! test -x ${VALGRIND_BIN}; then \
	  echo 1>&2; \
	  echo '${VALGRIND_BIN} does not exist or is not executable!' 1>&2; \
	  echo 'Try setting the VALGRIND_BIN macro:' 1>&2; \
	  echo 'make valgrind VALGRIND_BIN=/usr/local/bin/valgrind' 1>&2; \
	  echo 1>&2; \
	  exit 1; \
	fi
	${VALGRIND_BIN} ${VALGRIND_OPTS} --logfile=valgrind-log_test-dclog ./test-dclog

## Build shared object library
libdclog.so: dclog.c dclog.h
	${CC} ${CFLAGS} -shared -fPIC -o libdclog.so dclog.c

## Build test program
test-dclog: dclog.c dclog.h test-dclog.c
	${CC} ${CFLAGS} -o test-dclog test-dclog.c dclog.c
