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 | ||
101 | ###-------------------------------------------------------------------------- | |
102 | ### Project specific definitions. | |
103 | ||
104 | include Project.mk | |
105 | DISTFILES += Project.mk | |
106 | ||
107 | ###-------------------------------------------------------------------------- | |
108 | ### Parse the `docstrip' installation files. | |
109 | ||
110 | parse-names = $(shell \ | |
111 | sed -n '/^\\mdwgen/,$$ s:^.*\\$1 *{\([^}]*\)}.*$$:\1:p' $2 | sort -u) | |
112 | ||
113 | define parse-insfile | |
114 | $1_DTX := $$(call parse-names,from,$1) | |
115 | $1_OUT := $$(call parse-names,mdwf,$1) | |
116 | endef | |
117 | $(foreach i,$(INS), $(eval $(call parse-insfile,$i))) | |
118 | ||
119 | DTX += $(sort $(foreach i,$(INS), $($i_DTX))) | |
120 | OUT += $(sort $(foreach i,$(INS), $($i_OUT))) | |
121 | ||
122 | ###-------------------------------------------------------------------------- | |
123 | ### Extract output files from the `doc' files. | |
124 | ||
125 | all:: $(OUT) | |
126 | $(foreach i,$(INS), $(eval $(call output-targets,$$(TEX),TEX,$i,$($i_DTX)))) | |
127 | ||
128 | DISTFILES += $(INS) | |
129 | DISTFILES += $(sort $(DTX) $(EXTRA)) | |
130 | CLEANFILES += $(addsuffix .log,$(basename $(INS))) | |
131 | DISTFILES += $(OUT) | |
132 | REALCLEANFILES += $(OUT) | |
133 | ||
134 | ###-------------------------------------------------------------------------- | |
135 | ### Build the documentation. | |
136 | ||
137 | ## The main rune for running LaTeX. | |
138 | ## | |
139 | ## We run LaTeX in a subdirectory to prevent the temporary files (e.g., the | |
140 | ## `.aux' files) from interfering with each other. The `\jobname' isn't | |
141 | ## enough, because we might be building DVI and PDF versions of the same | |
142 | ## document at the same time. | |
143 | run-latex = \ | |
144 | rm -rf t.$@/ && mkdir t.$@/ && cd t.$@/ && \ | |
145 | TEXINPUTS=..:$$TEXINPUTS && export TEXINPUTS && \ | |
146 | $1 "\def\indexing{n} \nonstopmode \input $<" $(v_null) && \ | |
147 | $1 "\def\indexing{y} \nonstopmode \input $<" $(v_null) && \ | |
148 | makeindex $(v_quiet) -s gind.ist $*.idx $(v_null) && \ | |
149 | $1 "\def\indexing{n} \nonstopmode \input $<" $(v_null) && \ | |
150 | mv $@ ../ && cd ../ && rm -rf t.$@/ | |
151 | clean::; rm -rf t.*/ | |
152 | ||
153 | ## Good old-fashioned DVI. | |
154 | DVI = $(addsuffix .dvi,$(basename $(DTX))) | |
155 | pkgdoc_FILES += $(DVI) | |
156 | all:: $(DVI) | |
157 | %.dvi: %.dtx $(OUT) $(EXTRA) | |
158 | $(call v_tag,DVILATEX,$@)$(call run-latex,$(DVILATEX)) | |
159 | %.dvi: %.tex $(OUT) $(EXTRA) | |
160 | $(call v_tag,DVILATEX,$@)$(call run-latex,$(DVILATEX)) | |
161 | DISTFILES += $(DVI) | |
162 | REALCLEANFILES += $(DVI) | |
163 | ||
164 | ## Build PostScript from the DVI. | |
165 | PS = $(addsuffix .ps,$(basename $(DTX))) | |
166 | pkgdoc_FILES += $(PS) | |
167 | all:: $(PS) | |
168 | %.ps: %.dvi | |
169 | $(call v_tag,DVIPS,$@)$(DVIPS) $(v_quiet) -o $@ $< | |
170 | DISTFILES += $(PS) | |
171 | REALCLEANFILES += $(PS) | |
172 | ||
173 | ## Build PDF using PDFTeX. | |
174 | PDF = $(addsuffix .pdf,$(basename $(DTX))) | |
175 | pkgdoc_FILES += $(PDF) | |
176 | all:: $(PDF) | |
177 | %.pdf: %.dtx $(OUT) $(EXTRA) | |
178 | $(call v_tag,PDFLATEX,$@)$(call run-latex,$(PDFLATEX)) | |
179 | %.pdf: %.tex $(OUT) $(EXTRA) | |
180 | $(call v_tag,PDFLATEX,$@)$(call run-latex,$(PDFLATEX)) | |
181 | DISTFILES += $(PDF) | |
182 | REALCLEANFILES += $(PDF) | |
183 | ||
184 | ###-------------------------------------------------------------------------- | |
185 | ### Installation. | |
186 | ||
187 | install-targets = $(foreach d,$(INSTALLDIRS), install/$d) | |
188 | install:: $(install-targets) | |
189 | $(install-targets): install/%: $$($$*_FILES) | |
190 | $(v_at)mkdir -p $(DESTDIR)$($*dir) | |
191 | $(call v_tag,INSTALL,$($*dir))install -m$(or $($*_FILEMODE),644) \ | |
192 | $($*_FILES) $(DESTDIR)$($*dir) | |
193 | ||
194 | uninstall-targets = $(foreach d,$(INSTALLDIRS), uninstall/$d) | |
195 | uninstall:: $(uninstall-targets) | |
196 | $(uninstall-targets): uninstall/%: $$($$*_FILES) | |
197 | $(call v_tag,UNINSTALL,$($*dir))rm -f \ | |
198 | $(addprefix $(DESTDIR)$($*dir)/,$($*_FILES)) | |
199 | ||
200 | ###-------------------------------------------------------------------------- | |
201 | ### Distribution. | |
202 | ||
203 | DISTFILES += COPYING $(wildcard README) | |
204 | DISTFILES += Makefile | |
205 | ||
206 | DISTFILES += debian/control debian/rules | |
207 | DISTFILES += debian/copyright debian/changelog | |
208 | DISTFILES += debian/compat | |
209 | ||
210 | distdir = $(PACKAGE)-$(VERSION) | |
211 | tarball = $(distdir).tar.gz | |
212 | ||
213 | distdir:: recreate-distdir $(DISTFILES) | |
214 | $(v_at)set -e; \ | |
215 | for i in $(DISTFILES); do \ | |
216 | case $$i in */*) mkdir -p $(distdir)/$${i%/*} ;; esac; \ | |
217 | ln $$i $(distdir)/$$i; \ | |
218 | done | |
219 | ||
220 | dist: distdir | |
221 | $(call v_tag,TAR,$(tarball))tar chzf $(tarball) $(distdir) | |
222 | $(v_at)rm -rf $(distdir)/ | |
223 | .PHONY: dist | |
224 | CLEANFILES += $(tarball) | |
225 | clean::; rm -rf $(distdir)/ | |
226 | ||
227 | recreate-distdir: | |
228 | $(v_at)rm -rf $(distdir)/ | |
229 | $(v_at)mkdir $(distdir) | |
230 | .PHONY: recreate-distdir | |
231 | ||
232 | distcheck: dist | |
233 | rm -rf _distcheck/ | |
234 | mkdir _distcheck/ && cd _distcheck/ && \ | |
235 | tar xzf ../$(tarball) && cd $(distdir)/ && \ | |
236 | $(MAKE) check && \ | |
237 | $(MAKE) install texmfdir=../_install && \ | |
238 | $(MAKE) realclean && \ | |
239 | $(MAKE) install texmfdir=../_install && \ | |
240 | $(MAKE) uninstall texmfdir=../_install && \ | |
241 | $(MAKE) install DESTDIR=../_root && \ | |
242 | $(MAKE) uninstall DESTDIR=../_root && \ | |
243 | cd ../../ && \ | |
244 | find _distcheck/_install/ _distcheck/_root ! -type d | \ | |
245 | diff -u - /dev/null && \ | |
246 | rm -rf _distcheck | |
247 | .PHONY: distcheck | |
248 | clean::; rm -rf _distcheck/ | |
249 | ||
250 | ###----- That's all, folks -------------------------------------------------- |