#
# $Id$
#
# This Makefile uses GNU Make syntax.
# The distribution tarball should already include the files generated
# here so there's usually no need to use it.
#
distdir:=.
srcdir=src
# Since 1.13.3 the man pages are combined into a single input
# The XHTML output contains both man pages as a side effect, while the groff
# and PDF output are separate for each man page. TeX output was removed from
# this makefile.
DEFAULT=$(addprefix $(distdir)/,vcs.1 vcs.conf.5 \
$(addprefix vcs.man,.html .pdf) \
$(addprefix vcs.conf.man,.pdf) \
)
EXTRA=$(addprefix $(distdir)/,vcs.man2html.html vcs.conf.man2html.html)
ALL=$(DEFAULT) $(EXTRA)
ifeq ($(shell uname),FreeBSD)
DOCBOOK_XSL:=/usr/local/share/xsl/docbook
endif
DOCBOOK_XSL?=/usr/share/xml/docbook/stylesheet/docbook-xsl
# Common part of command to convert docbook to man
DOCBOOK_TO_COMMON=xsltproc -nonet \
--xinclude \
-param man.charmap.use.subset "0" \
-param make.year.ranges "1" \
-param make.single.year.ranges "1"
# NOT: For manpages the output can be a directory, whereas for XHTML it can not
DOCBOOK_TO_MAN=$(DOCBOOK_TO_COMMON) -o $(distdir)/ $(DOCBOOK_XSL)/manpages/docbook.xsl
DOCBOOK_TO_XHTML=$(DOCBOOK_TO_COMMON) $(DOCBOOK_XSL)/xhtml/docbook.xsl
default: $(DEFAULT)
extra: $(EXTRA)
all: $(ALL)
env:
@echo --- Values of Makefile variables: ---
@echo DEFAULT: $(DEFAULT)
@echo EXTRA: $(EXTRA)
@echo ALL: $(ALL)
@echo INTERMEDIATE: $(INTERMEDIATE)
@echo DOCBOOK_XSL: $(DOCBOOK_XSL)
@echo DOCBOOK_TO_MAN: $$ $(DOCBOOK_TO_MAN)
@echo DOCBOOK_TO_XHTML: $$ $(DOCBOOK_TO_XHTML)
@echo distdir: $(distdir)
@echo srcdir: $(srcdir)
@echo -------------------------------------
clean:
$(RM) $(ALL) $(INTERMEDIATE)
# These are both generated at once
$(distdir)/vcs.1 $(distdir)/vcs.conf.5: $(srcdir)/vcs.man.xml
#xmlto -o `dirname $@`/ man $<
$(DOCBOOK_TO_MAN) "$<"
# man2html produces output closer to man and better formatted but
# easily broken while xsltproc produces cleaner, more robust, and
# cross-referenced output
# Note with both manpages combined the output is combined too
$(distdir)/vcs.man.html: $(srcdir)/vcs.man.xml
$(DOCBOOK_TO_XHTML) "$<" > "$@" || ( $(RM) "$@" && false )
@# sed post processing:
@# add CSS link
@# obfuscate mailto: links
@# obfuscate emails
@# replace groff-escaped dots ("\[char46]")
sed -i \
-e 's!!!' \
-e 's/mailto:\([[:alnum:]]*\)@\([[:alnum:]]*\)\.\([[:alpha:]]*\)/mailto:\1%40\2%2E\3/' \
-e 's/\([[:alnum:]]*\)@\([[:alnum:]]*\)\.\([[:alpha:]]*\)/\1\@\2\.\3/' \
-e 's/\\\[char46\]/./g' \
"$@"
@# man2html includes the last revision date, which xsltproc does not, it
@# seems useful to me, so I'm injecting it here
sed -i \
-e 's!!$(shell grep 'Last revision' $< | head -1 \
| sed -e 's!.*!!' \
-e 's!.*$$!!')!' \
"$@"
#####
##### RULES SHARING RECIPES
##### See http://stackoverflow.com/questions/11441084/makefile-with-multiples-rules-sharing-same-recipe
#####
# 1/2: Pre-requisites
$(distdir)/vcs.conf.man.pdf: $(distdir)/vcs.conf.5.pdf
$(distdir)/vcs.man.pdf: $(distdir)/vcs.1.pdf
$(distdir)/vcs.man2html.html: $(distdir)/vcs.1
$(distdir)/vcs.conf.man2html.html: $(distdir)/vcs.conf.5
# 2/2: Common recipe
$(distdir)/vcs.conf.man.pdf $(distdir)/vcs.man.pdf:
mv $< $@
#####
##### / END OF RULES SHARING RECIPES
#####
$(distdir)/vcs.man2html.html $(distdir)/vcs.conf.man2html.html:
@# The first two lines of man2html are HTTP headers
@# The manpage is preprocessed to replace groff-escaped dots (\[char46])
sed -e 's/\\\[char46\]/\\./g' "$<" | man2html -r | sed 1,2d > "$@"
# jade and docbook-to-man conversions don't appear to agree on what's the
# correct structure, to avoid this here I use doclifter to convert back from
# man to DocBook, which generates a less semantically-rich but easier to
# process DocBook file
$(distdir)/vcs.%.pdf: vcs.%
doclifter < $< > temp.xml || ( $(RM) temp.xml && false )
db2pdf temp.xml || ( $(RM) temp.xml && false )
-$(RM) temp.xml
mv temp.pdf $@
# Check all XML files for validity
lint:
# XML check
find . -type f -name '*.xml' -print0 | \
xargs -0 xmllint -nonet --xinclude -noout --valid
# XHTML check
# Use `$(MAKE) xhtml' before running `$(MAKE) $@' to
# actually validate XHTML
find . -type f -name '*.html' -exec bash -c "echo '[ {} ]' && tidy -utf8 -eq '{}'" \;
xhtml: $(filter %.html, $(DEFAULT))
.PHONY: all default extra env clean lint xhtml