### name: Makefile
### synopsis: Build `typog' style file, tools, and documentation
### author: Dr. Christoph L. Spiel
### GNU make version: 4.3
SHELL := /bin/sh
LATEX := /usr/bin/env max_print_line=2147483647 pdflatex
LATEX_FLAGS := -file-line-error -halt-on-error -interaction=nonstopmode
LATEX_RERUN_TRIGGER := '^Package rerunfilecheck Warning: File [^ ]* has changed'
LATEX_WARNING := '^LaTeX (|[A-Za-z0-9_]* )Warning:'
MAKEINDEX := makeindex
MAKEINDEX_FLAGS := -q
METAPOST := mpost
METAPOST_FLAGS := -file-line-error -interaction=nonstopmode -tex=latex
PODCHECKER := podchecker
PODCHECKER_FLAGS := -warnings
POD2MAN := pod2man
POD2MAN_FLAGS := $$(sed -ne 's,\\ProvidesPackage{typog}\[\([0-9][0-9]*/[0-9][0-9]*/[0-9][0-9]*\) *v\([^ ]*\) .*$$,--date=\1 --release=\2,p' < typog.sty)
POD2TEXI := pod2texi
POD2TEXI_FLAGS :=
GROFF := groff
## Codes of serif fonts that work for PDF output
## BM: URW Bookman L
## N: URW Century Schoolbook L
## P: URW Palladio L
## T: URW Nimbus Roman No9 L
GROFF_FLAGS := -Tpdf -dpaper=a4 -fP -man -wall
SPELLCHECK := aspell
SPELLCHECK_FLAGS := \
--add-tex-command='citenum p' --add-tex-command='code p' \
--add-tex-command='Cref p' --add-tex-command='cref p' \
--add-tex-command='cs p' \
--add-tex-command='DescribeEnv p' --add-tex-command='DescribeMacro p' \
--add-tex-command='marg p' --add-tex-command='meta p' \
--add-tex-command='oarg p' \
--lang=en_US --mode=tex
SOURCE_FILES := LICENSE Makefile typog.dtx typog.ins
.PHONY: all
all: sty pdf man
.PHONY: sty
sty: typog.sty
.PHONY: pdf
pdf: doc ex nomt
.PHONY: doc
doc: typog.pdf
.PHONY: ex
ex: typog-example.pdf
.PHONY: nomt
nomt: typog-nomt.pdf
.PHONY: man
man: typog-grep.1
.PHONY: cpio
cpio:
cd ..; \
echo $(addprefix typog/,$(SOURCE_FILES)) | \
cpio -o | \
gzip > "typog-$$(date +%Y-%m-%d).cpio.gz"
.PHONY: tar
tar:
cd ..; \
tar czf "typog-$$(date +%Y-%m-%d).tar.gz" $(addprefix typog/,$(SOURCE_FILES))
.PHONY: clean
clean:
$(RM) ./*.1 ./*.aux ./*.brf ./*.glg ./*.glo ./*.gls
$(RM) ./*.hd ./*.idx ./*.ilg ./*.ind ./*.loe ./*.lof ./*.log ./*.lot
$(RM) ./*.mps ./*.mpx ./*.out ./*.pdf ./*.toc
$(RM) mptextmp.* mpxerr.tex
$(RM) README README.html RELEASE-HOWTO RELEASE-HOWTO.html
.PHONY: mostlyclean
mostlyclean: clean
.PHONY: maintainer-clean
maintainer-clean: mostlyclean
$(RM) ./*.ist ./*.mp ./*.pl ./*.pod ./*.sed ./*.sty ./*.tex
.PHONY: tool-check
tool-check:
@printf '*** LATEX = "%s"\n' '$(LATEX)'
$(LATEX) --version
@printf '\n\n*** MAKEINDEX = "%s"\n' '$(MAKEINDEX)'
$(MAKEINDEX) < /dev/null
@printf '\n\n*** METAPOST = "%s"\n' '$(METAPOST)'
$(METAPOST) --version
@printf '\n*** POD2MAN = "%s"\n' '$(POD2MAN)'
$(POD2MAN) --help > /dev/null
@printf '\n\n*** POD2TEXI = "%s"\n' '$(POD2TEXI)'
$(POD2TEXI) --version
@printf '\n\nTool check passed.\n'
.PHONY: spell-check
spell-check:
@sed -e '\##d' \
-e '\##,\##d' < typog.dtx | \
sed -e 's/^ *%%*//' | \
sed -e 's/\\-//g' -e 's/|[^|]*|/ /g' | \
$(SPELLCHECK) $(SPELLCHECK_FLAGS) list | \
sort | uniq | fmt | sed -e 's/ / /g'
.PHONY: update-docs
update-docs: doc ex typog-grep.1.pdf
cp -f typog.pdf typog-example.pdf typog-grep.1 typog-grep.1.pdf docs
define HELP_SCREEN
Selected Phony Targets
----------------------
all: Make everything there is to make. This is the .DEFAULT_GOAL.
clean: Remove some products.
cpio: In the parent directory create a cpio(1) archive of the
project source files whose name is time-stamped.
doc: Build "typog.pdf" the Typog documentation.
ex: Build "typog-example.pdf" an example and test file for Typog.
maintainer-clean: Remove every product file that can be rebuilt even
if uncommon tools are necessary.
mostlyclean: Remove some more products than clean:.
pdf: Build doc: and gauge:.
sty: Only extract "typog.sty" from "typog.dtx". This
operation requires LaTeX (-> $(LATEX)) and nothing else.
tar: In the parent directory create a tar(1) file of the project
source files whose name is time-stamped.
tool-check: Check whether some of the required tools to build the
project are available.
Selected Implicit Rules
-----------------------
%.pdf: %.dtx
Run LaTeX or pdfLaTeX (-> $(LATEX)) on dtx source until a
fix-point is reached.
%.pdf: %.tex
Run LaTeX or pdfLaTeX (-> $(LATEX)) on tex file until a
fix-point is reached.
%.1: %.pod
Create a manual page from plain old documentation format.
Requires podchecker (-> $(PODCHECKER)) and pod2man
(-> $(POD2MAN)).
%.1.pdf: %.1
Convert a manual page into a pdf file. Requires groff
(-> $(GROFF)).
Some Explicit Rules
-------------------
README.html:
Convert "README.md" to html. Requires markdown(1).
README: Convert "README.html" to plain text. Requires w3m(1).
endef
.PHONY: help
help:
$(info $(HELP_SCREEN))
.PRECIOUS: %.mps
define MAKE_INDEX_AND_GLOSSARY
sed -e '/@/d' -e 's/{\\ttfamily /{\\ttfamily\\hskip0pt\\relax /' < $*.idx > ,$*.idx; \
mv ,$*.idx $*.idx; \
$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s typog.ist -t $*.ilg -o $*.ind $*.idx; \
$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s gglo.ist -t $*.glg -o $*.gls $*.glo
endef
define GREP_LATEX_WARNINGS
test -e $*.log && grep -E $(LATEX_WARNING) $*.log | uniq
endef
%.pdf: %.dtx
$(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.gls ./$*.glo ./$*.lot ./$*.toc
$(LATEX) $(LATEX_FLAGS) -draftmode $<
$(MAKE_INDEX_AND_GLOSSARY)
$(LATEX) $(LATEX_FLAGS) $<
$(MAKE_INDEX_AND_GLOSSARY)
while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \
do \
$(LATEX) $(LATEX_FLAGS) $<; \
$(MAKE_INDEX_AND_GLOSSARY); \
done
$(GREP_LATEX_WARNINGS)
%.pdf: %.tex
$(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.lot ./$*.toc
$(LATEX) $(LATEX_FLAGS) -draftmode $<
$(LATEX) $(LATEX_FLAGS) $<
while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \
do \
$(LATEX) $(LATEX_FLAGS) $<; \
done
$(GREP_LATEX_WARNINGS)
%-1.mps %-2.mps %-3.mps %-4.mps: %.mp
$(METAPOST) -s 'outputtemplate="%j-%c.mps"' $(METAPOST_FLAGS) $<
%.1: %.pod
$(PODCHECKER) $(PODCHECKER_FLAGS) $<
$(POD2MAN) $(POD2MAN_FLAGS) $< $@
%.1.pdf: %.1
$(GROFF) $(GROFF_FLAGS) ./$< > $@
%.tex: %.pod | teximan2latex.sed
$(POD2TEXI) $(POD2TEXI_FLAGS) ./$< | sed -f teximan2latex.sed > $@
%.html: %.md
markdown $< > $@
%: %.html
w3m -cols 79 $< > $@
crooked-paragraphs.mp slant-angle.mp smooth-parshapes.mp title.mp \
teximan2latex.sed \
typog-grep.pl typog-grep typog-grep.pod \
typog.sty typog.ist typog-example.tex typog-nomt.tex: \
typog.ins typog.dtx
$(LATEX) $(LATEX_FLAGS) $<
chmod 755 typog-grep.pl
ln -sf typog-grep.pl typog-grep
crooked-paragraphs-1.mps crooked-paragraphs-2.mps \
crooked-paragraphs-3.mps crooked-paragraphs-4.mps: crooked-paragraphs.mp
smooth-parshapes-1.mps smooth-parshapes-2.mps smooth-parshapes-3.mps: smooth-parshapes.mp
slant-angle-1.mps: slant-angle.mp
title-1.mps: title.mp
typog.pdf: typog.dtx \
crooked-paragraphs-1.mps crooked-paragraphs-2.mps \
crooked-paragraphs-3.mps crooked-paragraphs-4.mps \
slant-angle-1.mps title-1.mps \
smooth-parshapes-1.mps smooth-parshapes-2.mps smooth-parshapes-3.mps \
typog-grep.tex \
| typog.sty