Commit | Line | Data |
---|---|---|
5598cad4 MW |
1 | ### -*-makefile-*- |
2 | ### | |
3 | ### Build script for TeX packages | |
4 | ### | |
5 | ### (c) 2020 Mark Wooding | |
6 | ### | |
7 | ||
8 | ###----- Licensing notice --------------------------------------------------- | |
9 | ### | |
10 | ||
11 | ###-------------------------------------------------------------------------- | |
12 | ### Extension points. | |
13 | ||
14 | all:: | |
15 | .PHONY: all | |
16 | ||
17 | install:: | |
18 | .PHONY: install | |
19 | ||
20 | uninstall:: | |
21 | .PHONY: uninstall | |
22 | ||
23 | check:: | |
24 | .PHONY: check | |
25 | ||
26 | clean::; rm -f $(CLEANFILES) | |
27 | .PHONY: clean | |
28 | ||
29 | realclean:: clean; rm -f $(REALCLEANFILES) | |
30 | .PHONY: clean | |
31 | ||
32 | distdir:: recreate-distdir | |
33 | .PHONY: distdir | |
34 | ||
35 | ###-------------------------------------------------------------------------- | |
36 | ### Project identification. | |
37 | ||
38 | VERSION := $(shell ./auto-version) | |
39 | DISTFILES += auto-version | |
40 | ||
41 | distdir:: recreate-distdir | |
42 | $(v_at)echo "$(VERSION)" >$(distdir)/RELEASE | |
43 | ||
44 | ###-------------------------------------------------------------------------- | |
45 | ### Tools. | |
46 | ||
47 | TEX = tex | |
48 | DVILATEX = latex | |
49 | PDFLATEX = pdflatex | |
50 | DVIPS = dvips | |
51 | ||
52 | ###-------------------------------------------------------------------------- | |
53 | ### Installation directories. | |
54 | ||
55 | ## Determine a sensible TeX base directory. | |
56 | prefix = /usr/local | |
57 | texmfdir := $(shell \ | |
58 | for d in $(prefix)/share/texmf $(prefix)/lib/texmf $(prefix)/texmf; do \ | |
59 | if [ -d $$d ]; then echo $$d; exit 0; fi; \ | |
60 | done; \ | |
61 | echo /invalid/) | |
62 | ||
63 | ifeq ($(texmfdir),/invalid/) | |
64 | $(error "Failed to choose a TeX installation directory.") | |
65 | endif | |
66 | ||
67 | INSTALLDIRS += pkglatex | |
68 | pkglatexdir = $(texmfdir)/tex/latex/$(PACKAGE) | |
69 | ||
70 | INSTALLDIRS += pkgdoc | |
71 | pkgdocdir = $(texmfdir)/doc/latex/$(PACKAGE) | |
72 | ||
73 | ###-------------------------------------------------------------------------- | |
74 | ### Preliminary definitions. | |
75 | ||
76 | .SECONDEXPANSION: # sorry | |
77 | ||
78 | ## Silent-rules. | |
79 | V = 0 | |
80 | ||
81 | v_at = $(v_at_$V) | |
82 | v_at_0 = @ | |
83 | ||
84 | v_tag = $(call v_tag_$V,$1,$2) | |
85 | v_tag_0 = @printf " %-8s %s\n" "$1" "$2"; | |
86 | ||
87 | v_null = $(v_null_$V) | |
88 | v_null_0 = >/dev/null | |
89 | ||
90 | v_quiet = $(v_quiet_$V) | |
91 | v_quiet_0 = -q | |
92 | ||
93 | ## Runes for building rules. | |
94 | define output-targets | |
95 | $$(firstword $$($3_OUT)): $3 $4 | |
96 | $$(call v_tag,$2,$$<)$1 $$< $$(v_null) | |
97 | $$(wordlist 2,$$(words $$($3_OUT)),$$($3_OUT)): \ | |
98 | $$(firstword $$($3_OUT)) | |
99 | endef | |
100 | ||
9cb5c64c MW |
101 | ## LaTeX configuration. |
102 | LATEX_INITCMDS = \errorcontextlines=\maxdimen | |
103 | ||
5598cad4 MW |
104 | ###-------------------------------------------------------------------------- |
105 | ### Project specific definitions. | |
106 | ||
107 | include Project.mk | |
108 | DISTFILES += Project.mk | |
109 | ||
110 | ###-------------------------------------------------------------------------- | |
111 | ### Parse the `docstrip' installation files. | |
112 | ||
113 | parse-names = $(shell \ | |
114 | sed -n '/^\\mdwgen/,$$ s:^.*\\$1 *{\([^}]*\)}.*$$:\1:p' $2 | sort -u) | |
115 | ||
116 | define parse-insfile | |
117 | $1_DTX := $$(call parse-names,from,$1) | |
118 | $1_OUT := $$(call parse-names,mdwf,$1) | |
119 | endef | |
120 | $(foreach i,$(INS), $(eval $(call parse-insfile,$i))) | |
121 | ||
122 | DTX += $(sort $(foreach i,$(INS), $($i_DTX))) | |
123 | OUT += $(sort $(foreach i,$(INS), $($i_OUT))) | |
124 | ||
125 | ###-------------------------------------------------------------------------- | |
126 | ### Extract output files from the `doc' files. | |
127 | ||
128 | all:: $(OUT) | |
129 | $(foreach i,$(INS), $(eval $(call output-targets,$$(TEX),TEX,$i,$($i_DTX)))) | |
130 | ||
131 | DISTFILES += $(INS) | |
132 | DISTFILES += $(sort $(DTX) $(EXTRA)) | |
133 | CLEANFILES += $(addsuffix .log,$(basename $(INS))) | |
134 | DISTFILES += $(OUT) | |
135 | REALCLEANFILES += $(OUT) | |
136 | ||
137 | ###-------------------------------------------------------------------------- | |
138 | ### Build the documentation. | |
139 | ||
140 | ## The main rune for running LaTeX. | |
141 | ## | |
142 | ## We run LaTeX in a subdirectory to prevent the temporary files (e.g., the | |
143 | ## `.aux' files) from interfering with each other. The `\jobname' isn't | |
144 | ## enough, because we might be building DVI and PDF versions of the same | |
145 | ## document at the same time. | |
54b70d06 MW |
146 | define run-latex |
147 | rm -rf t.$@/ && mkdir t.$@/ && cd t.$@/ && \ | |
148 | TEXINPUTS=..:$$TEXINPUTS && export TEXINPUTS && \ | |
9cb5c64c MW |
149 | $1 "\def\indexing{n} \nonstopmode $(LATEX_INITCMDS) \input $<" $(v_null) && \ |
150 | $1 "\def\indexing{y} \nonstopmode $(LATEX_INITCMDS) \input $<" $(v_null) && \ | |
54b70d06 | 151 | makeindex $(v_quiet) -s gind.ist $*.idx $(v_null) && \ |
9cb5c64c | 152 | $1 "\def\indexing{n} \nonstopmode $(LATEX_INITCMDS) \input $<" $(v_null) && \ |
54b70d06 MW |
153 | mv $@ $*.log ../ && cd ../ && rm -rf t.$@/ |
154 | endef | |
3f40da71 | 155 | CLEANFILES += *.log |
5598cad4 MW |
156 | clean::; rm -rf t.*/ |
157 | ||
158 | ## Good old-fashioned DVI. | |
159 | DVI = $(addsuffix .dvi,$(basename $(DTX))) | |
160 | pkgdoc_FILES += $(DVI) | |
161 | all:: $(DVI) | |
162 | %.dvi: %.dtx $(OUT) $(EXTRA) | |
163 | $(call v_tag,DVILATEX,$@)$(call run-latex,$(DVILATEX)) | |
164 | %.dvi: %.tex $(OUT) $(EXTRA) | |
165 | $(call v_tag,DVILATEX,$@)$(call run-latex,$(DVILATEX)) | |
166 | DISTFILES += $(DVI) | |
167 | REALCLEANFILES += $(DVI) | |
168 | ||
169 | ## Build PostScript from the DVI. | |
170 | PS = $(addsuffix .ps,$(basename $(DTX))) | |
171 | pkgdoc_FILES += $(PS) | |
172 | all:: $(PS) | |
173 | %.ps: %.dvi | |
174 | $(call v_tag,DVIPS,$@)$(DVIPS) $(v_quiet) -o $@ $< | |
175 | DISTFILES += $(PS) | |
176 | REALCLEANFILES += $(PS) | |
177 | ||
178 | ## Build PDF using PDFTeX. | |
179 | PDF = $(addsuffix .pdf,$(basename $(DTX))) | |
180 | pkgdoc_FILES += $(PDF) | |
181 | all:: $(PDF) | |
182 | %.pdf: %.dtx $(OUT) $(EXTRA) | |
183 | $(call v_tag,PDFLATEX,$@)$(call run-latex,$(PDFLATEX)) | |
184 | %.pdf: %.tex $(OUT) $(EXTRA) | |
185 | $(call v_tag,PDFLATEX,$@)$(call run-latex,$(PDFLATEX)) | |
186 | DISTFILES += $(PDF) | |
187 | REALCLEANFILES += $(PDF) | |
188 | ||
189 | ###-------------------------------------------------------------------------- | |
190 | ### Installation. | |
191 | ||
192 | install-targets = $(foreach d,$(INSTALLDIRS), install/$d) | |
193 | install:: $(install-targets) | |
194 | $(install-targets): install/%: $$($$*_FILES) | |
195 | $(v_at)mkdir -p $(DESTDIR)$($*dir) | |
196 | $(call v_tag,INSTALL,$($*dir))install -m$(or $($*_FILEMODE),644) \ | |
197 | $($*_FILES) $(DESTDIR)$($*dir) | |
198 | ||
199 | uninstall-targets = $(foreach d,$(INSTALLDIRS), uninstall/$d) | |
200 | uninstall:: $(uninstall-targets) | |
201 | $(uninstall-targets): uninstall/%: $$($$*_FILES) | |
202 | $(call v_tag,UNINSTALL,$($*dir))rm -f \ | |
203 | $(addprefix $(DESTDIR)$($*dir)/,$($*_FILES)) | |
204 | ||
205 | ###-------------------------------------------------------------------------- | |
206 | ### Distribution. | |
207 | ||
208 | DISTFILES += COPYING $(wildcard README) | |
209 | DISTFILES += Makefile | |
210 | ||
211 | DISTFILES += debian/control debian/rules | |
212 | DISTFILES += debian/copyright debian/changelog | |
213 | DISTFILES += debian/compat | |
214 | ||
215 | distdir = $(PACKAGE)-$(VERSION) | |
216 | tarball = $(distdir).tar.gz | |
217 | ||
218 | distdir:: recreate-distdir $(DISTFILES) | |
219 | $(v_at)set -e; \ | |
220 | for i in $(DISTFILES); do \ | |
221 | case $$i in */*) mkdir -p $(distdir)/$${i%/*} ;; esac; \ | |
222 | ln $$i $(distdir)/$$i; \ | |
223 | done | |
224 | ||
225 | dist: distdir | |
226 | $(call v_tag,TAR,$(tarball))tar chzf $(tarball) $(distdir) | |
227 | $(v_at)rm -rf $(distdir)/ | |
228 | .PHONY: dist | |
229 | CLEANFILES += $(tarball) | |
230 | clean::; rm -rf $(distdir)/ | |
231 | ||
232 | recreate-distdir: | |
233 | $(v_at)rm -rf $(distdir)/ | |
234 | $(v_at)mkdir $(distdir) | |
235 | .PHONY: recreate-distdir | |
236 | ||
237 | distcheck: dist | |
238 | rm -rf _distcheck/ | |
239 | mkdir _distcheck/ && cd _distcheck/ && \ | |
240 | tar xzf ../$(tarball) && cd $(distdir)/ && \ | |
241 | $(MAKE) check && \ | |
242 | $(MAKE) install texmfdir=../_install && \ | |
243 | $(MAKE) realclean && \ | |
244 | $(MAKE) install texmfdir=../_install && \ | |
245 | $(MAKE) uninstall texmfdir=../_install && \ | |
246 | $(MAKE) install DESTDIR=../_root && \ | |
247 | $(MAKE) uninstall DESTDIR=../_root && \ | |
248 | cd ../../ && \ | |
249 | find _distcheck/_install/ _distcheck/_root ! -type d | \ | |
250 | diff -u - /dev/null && \ | |
251 | rm -rf _distcheck | |
252 | .PHONY: distcheck | |
253 | clean::; rm -rf _distcheck/ | |
254 | ||
255 | ###----- That's all, folks -------------------------------------------------- |