3 ### Build script for TeX packages
5 ### (c) 2020 Mark Wooding
8 ###----- Licensing notice ---------------------------------------------------
11 ###--------------------------------------------------------------------------
26 clean::; rm -f $(CLEANFILES)
29 realclean:: clean; rm -f $(REALCLEANFILES)
32 distdir:: recreate-distdir
35 ###--------------------------------------------------------------------------
36 ### Project identification.
38 VERSION := $(shell ./auto-version)
39 DISTFILES += auto-version
41 distdir:: recreate-distdir
42 $(v_at)echo "$(VERSION)" >$(distdir)/RELEASE
44 ###--------------------------------------------------------------------------
52 ###--------------------------------------------------------------------------
53 ### Installation directories.
55 ## Determine a sensible TeX base directory.
58 for d in $(prefix)/share/texmf $(prefix)/lib/texmf $(prefix)/texmf; do \
59 if [ -d $$d ]; then echo $$d; exit 0; fi; \
63 ifeq ($(texmfdir),/invalid/)
64 $(error "Failed to choose a TeX installation directory.")
67 INSTALLDIRS += pkglatex
68 pkglatexdir = $(texmfdir)/tex/latex/$(PACKAGE)
71 pkgdocdir = $(texmfdir)/doc/latex/$(PACKAGE)
73 ###--------------------------------------------------------------------------
74 ### Preliminary definitions.
76 .SECONDEXPANSION: # sorry
84 v_tag = $(call v_tag_$V,$1,$2)
85 v_tag_0 = @printf " %-8s %s\n" "$1" "$2";
90 v_quiet = $(v_quiet_$V)
93 ## Runes for building rules.
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))
101 ## LaTeX configuration.
102 LATEX_INITCMDS = \errorcontextlines=\maxdimen
104 ###--------------------------------------------------------------------------
105 ### Project specific definitions.
108 DISTFILES += Project.mk
110 ###--------------------------------------------------------------------------
111 ### Parse the `docstrip' installation files.
113 parse-names = $(shell \
114 sed -n '/^\\mdwgen/,$$ s:^.*\\$1 *{\([^}]*\)}.*$$:\1:p' $2 | sort -u)
117 $1_DTX := $$(call parse-names,from,$1)
118 $1_OUT := $$(call parse-names,mdwf,$1)
120 $(foreach i,$(INS), $(eval $(call parse-insfile,$i)))
122 DTX += $(sort $(foreach i,$(INS), $($i_DTX)))
123 OUT += $(sort $(foreach i,$(INS), $($i_OUT)))
125 ###--------------------------------------------------------------------------
126 ### Extract output files from the `doc' files.
129 $(foreach i,$(INS), $(eval $(call output-targets,$$(TEX),TEX,$i,$($i_DTX))))
132 DISTFILES += $(sort $(DTX) $(EXTRA))
133 CLEANFILES += $(addsuffix .log,$(basename $(INS)))
135 REALCLEANFILES += $(OUT)
137 ###--------------------------------------------------------------------------
138 ### Build the documentation.
140 ## The main rune for running LaTeX.
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.
147 rm -rf t.$@/ && mkdir t.$@/ && cd t.$@/ && \
148 TEXINPUTS=..:$$TEXINPUTS && export TEXINPUTS && \
149 $1 "\def\indexing{n} \nonstopmode $(LATEX_INITCMDS) \input $<" $(v_null) && \
150 $1 "\def\indexing{y} \nonstopmode $(LATEX_INITCMDS) \input $<" $(v_null) && \
151 makeindex $(v_quiet) -s gind.ist $*.idx $(v_null) && \
152 $1 "\def\indexing{n} \nonstopmode $(LATEX_INITCMDS) \input $<" $(v_null) && \
153 mv $@ $*.log ../ && cd ../ && rm -rf t.$@/
158 ## Good old-fashioned DVI.
159 DVI = $(addsuffix .dvi,$(basename $(DTX)))
160 pkgdoc_FILES += $(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))
167 REALCLEANFILES += $(DVI)
169 ## Build PostScript from the DVI.
170 PS = $(addsuffix .ps,$(basename $(DTX)))
171 pkgdoc_FILES += $(PS)
174 $(call v_tag,DVIPS,$@)$(DVIPS) $(v_quiet) -o $@ $<
176 REALCLEANFILES += $(PS)
178 ## Build PDF using PDFTeX.
179 PDF = $(addsuffix .pdf,$(basename $(DTX)))
180 pkgdoc_FILES += $(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))
187 REALCLEANFILES += $(PDF)
189 ###--------------------------------------------------------------------------
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)
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))
205 ###--------------------------------------------------------------------------
208 DISTFILES += COPYING $(wildcard README)
209 DISTFILES += Makefile
211 DISTFILES += debian/control debian/rules
212 DISTFILES += debian/copyright debian/changelog
213 DISTFILES += debian/compat
215 distdir = $(PACKAGE)-$(VERSION)
216 tarball = $(distdir).tar.gz
218 distdir:: recreate-distdir $(DISTFILES)
220 for i in $(DISTFILES); do \
221 case $$i in */*) mkdir -p $(distdir)/$${i%/*} ;; esac; \
222 ln $$i $(distdir)/$$i; \
226 $(call v_tag,TAR,$(tarball))tar chzf $(tarball) $(distdir)
227 $(v_at)rm -rf $(distdir)/
229 CLEANFILES += $(tarball)
230 clean::; rm -rf $(distdir)/
233 $(v_at)rm -rf $(distdir)/
234 $(v_at)mkdir $(distdir)
235 .PHONY: recreate-distdir
239 mkdir _distcheck/ && cd _distcheck/ && \
240 tar xzf ../$(tarball) && cd $(distdir)/ && \
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 && \
249 find _distcheck/_install/ _distcheck/_root ! -type d | \
250 diff -u - /dev/null && \
253 clean::; rm -rf _distcheck/
255 ###----- That's all, folks --------------------------------------------------