bsd.doc.mk revision 1.69 1 # $NetBSD: bsd.doc.mk,v 1.69 2025/04/11 19:15:42 rillig Exp $
2 # @(#)bsd.doc.mk 8.1 (Berkeley) 8/14/93
3
4 .include <bsd.init.mk>
5
6 # The makefile should set these:
7 # SECTION one of usd, smm, or psd (lower-case)
8 # ARTICLE name of this document
9 # SRCS roff source files
10 # DEPSRCS additional roff source files implicitly included
11 # MACROS name(s) of roff macro packages, including the -m
12 # ROFF_PIC set to "yes" to use pic(1)
13 # ROFF_EQN set to "yes" to use eqn(1)
14 # ROFF_TBL set to "yes" to use tbl(1)
15 # ROFF_REFER set to "yes" to use refer(1)
16 # EXTRAHTMLFILES additional files emitted as part of HTML build
17 #
18 # PAGES unknown (XXX)
19 # EXTRA extra files to install (XXX)
20 #
21 # If there are multiple docs to be generated, set these:
22 # SUBARTICLES= name1 name2 ...
23 # SRCS.name1= roff source files
24 # SRCS.name2= more roff source files
25 # SRCS. : = :
26 # DEPSRCS.name1= additional included roff source files
27 # DEPSRCS.name2= more additional included roff source files
28 # DEPSRCS. : = :
29 #
30 # I'm hoping that MACROS and ROFF_* can be uniform across all
31 # subarticles.
32
33
34 # Old bsd.doc.mk files tend to invoke tbl and other preprocessors
35 # directly; they should be changed to set ROFF_* instead.
36 #
37 # Also they set e.g. DIR=usd/72.mydocument; this should be changed
38 # to SECTION=usd and ARTICLE=mydocument. The article numbers are
39 # no longer present in the file system and do not need to be known
40 # at build time.
41 #
42
43 # 20130908 dholland: Make sure all makefiles have been converted to the
44 # new scheme.
45 .if !defined(SECTION)
46 .error SECTION must be defined
47 .endif
48 .if target(paper.ps)
49 .error target(paper.ps) is defined -- this is not allowed
50 .endif
51
52 # 20130908 dholland: right now we cannot generate pdf from roff sources,
53 # so build compressed postscript instead. XXX. (and: yech)
54 TOOL_ROFF_PDF?=false "No roff pdf support"
55 PRINTABLE=ps.gz
56 #PRINTABLE=ps
57 #PRINTABLE=pdf
58
59 # If there aren't subarticles, we generate one doc that has the same
60 # name as the top-level article.
61 SUBARTICLES?=${ARTICLE}
62 SRCS.${ARTICLE}?=${SRCS}
63 DEPSRCS.${ARTICLE}?=${DEPSRCS}
64
65 ##### Build
66
67 .for SA in ${SUBARTICLES}
68 .if ${MKDOC} != "no"
69 realall: ${SA}.txt
70 realall: ${SA}.${PRINTABLE}
71 .if ${MKHTML} != "no" && ${MKGROFFHTMLDOC} != "no"
72 realall: ${SA}.html
73 .endif
74 .endif
75 .endfor # SUBARTICLES
76
77 .if defined(ROFF_PIC) && ${ROFF_PIC} != "no"
78 ROFFFLAGS+=-p
79 .endif
80 .if defined(ROFF_EQN) && ${ROFF_EQN} != "no"
81 ROFFFLAGS+=-e
82 .endif
83 .if defined(ROFF_TBL) && ${ROFF_TBL} != "no"
84 ROFFFLAGS+=-t
85 .endif
86 .if defined(ROFF_REFER) && ${ROFF_REFER} != "no"
87 ROFFFLAGS+=-R
88 .endif
89 ROFFFLAGS+=-I${.CURDIR}
90
91 .for SA in ${SUBARTICLES}
92
93 #
94 # Find the sources.
95 #
96 # We can't use .IMPSRC in the rules because they aren't suffix rules
97 # (they could be for some docs, but not others) and we can't use
98 # .ALLSRC because that includes DEPSRCS.
99 #
100 # As far as I know, the only ways to get the path discovered via .PATH
101 # are those two magic variables or the P modifier.
102 #
103 # For some reason the P modifier finds the path to a variable name,
104 # not the path to a word in a variable.
105 #
106
107 .for S in ${SRCS.${SA}}
108 SRCS2.${SA}+=${${S}:P}
109 .endfor
110 .for S in ${DEPSRCS.${SA}}
111 DEPSRCS2.${SA}+=${${S}:P}
112 .endfor
113
114 #
115 # Note: we use TOOL_ROFF_DOCASCII because TOOL_ROFF_ASCII invokes
116 # the nroff wrapper instead of groff directly, and that doesn't
117 # understand -I.
118 #
119 # We use TOOL_ROFF_DOCHTML because TOOL_ROFF_HTML uses -mdoc2html,
120 # which is great if it works but doesn't work with at least some of
121 # the non-mdoc docs. (e.g. the curses one) TOOL_ROFF_DOCHTML uses
122 # groff -Thtml, which produces fairly blah output but works with these
123 # docs. It might end up being necessary to choose one or the other on
124 # a per-document basis... sigh.
125 #
126
127 ${SA}.txt: ${SRCS2.${SA}} ${DEPSRCS2.${SA}}
128 ${_MKTARGET_FORMAT}
129 ${TOOL_ROFF_DOCASCII} ${ROFFFLAGS} ${MACROS} ${PAGES} ${SRCS2.${SA}} \
130 > ${.TARGET}
131
132 ${SA}.ps: ${SRCS2.${SA}} ${DEPSRCS2.${SA}}
133 ${_MKTARGET_FORMAT}
134 ${TOOL_ROFF_PS} ${ROFFFLAGS} ${MACROS} ${PAGES} ${SRCS2.${SA}} \
135 | ${TOOL_SED} -e '/^%%CreationDate:/d' \
136 > ${.TARGET}
137
138 ${SA}.pdf: ${SRCS2.${SA}} ${DEPSRCS2.${SA}}
139 ${_MKTARGET_FORMAT}
140 ${TOOL_ROFF_PDF} ${ROFFFLAGS} ${MACROS} ${PAGES} ${SRCS2.${SA}} \
141 > ${.TARGET}
142
143 ${SA}.html: ${SRCS2.${SA}} ${DEPSRCS2.${SA}}
144 ${_MKTARGET_FORMAT}
145 ${TOOL_ROFF_DOCHTML} ${ROFFFLAGS} ${MACROS} ${PAGES} ${SRCS2.${SA}} \
146 -P -I -P ${SA} \
147 > ${.TARGET}
148
149 ${SA}.ps.gz: ${SA}.ps
150 ${TOOL_GZIP} -9 -c -n ${.ALLSRC} > ${.TARGET}
151
152 .endfor # SUBARTICLES
153
154 ##### Install
155
156 DOCINST:=
157 .for SA in ${SUBARTICLES}
158 DOCINST+=${SA}.txt ${SA}.${PRINTABLE}
159 .if ${MKHTML} != "no" && ${MKGROFFHTMLDOC} != "no"
160 DOCINST+=${SA}.html
161 .endif
162 .endfor
163 .if ${MKHTML} != "no" && ${MKGROFFHTMLDOC} != "no"
164 DOCINST+=${EXTRAHTMLFILES}
165 .endif
166
167 .if ${MKDOC} != "no"
168 docinstall:
169 .for D in ${DOCINST}
170 ${_MKTARGET_INSTALL}
171 ${INSTALL_FILE} -o ${DOCOWN} -g ${DOCGRP} -m ${DOCMODE} ${D} \
172 ${DESTDIR}${DOCDIR}/${SECTION}/${ARTICLE}/${D}
173 .endfor
174 .else
175 docinstall: ;
176 .endif
177
178 .PHONY: docinstall
179 realinstall: docinstall
180
181 ##### Clean
182
183 cleandoc:
184 .for SA in ${SUBARTICLES}
185 rm -f ${SA}.txt ${SA}.ps ${SA}.ps.gz ${SA}.html
186 .endfor
187 rm -f ${EXTRAHTMLFILES} [eE]rrs mklog ${CLEANFILES}
188
189 .PHONY: cleandoc
190 clean: cleandoc
191
192 ##### Extra custom rules
193
194 .if !target(print)
195 print: ;
196 .PHONY: print
197 .for SA in ${SUBARTICLES}
198 print: print.${SA}
199 .PHONY: print.${SA}
200 print.${SA}: ${SA}.ps
201 lpr ${PRINTER:D-P${PRINTER}} ${.ALLSRC}
202 .endfor
203 .endif
204
205 spell: ;
206 .PHONY: spell
207 .for SA in ${SUBARTICLES}
208 spell: spell.${SA}
209 .PHONY: spell.${SA}
210 spell.${SA}: ${SRCS2.${SA}} ${DEPSRCS2.${SA}}
211 spell ${SRCS2.${SA}} | sort | comm -23 - spell.ok > paper.spell
212 .endfor
213
214 ##### Pull in related .mk logic
215
216 .include <bsd.obj.mk>
217 .include <bsd.sys.mk>
218
219 ${TARGETS}: # ensure existence
220