bsd.man.mk revision 1.104 1 # $NetBSD: bsd.man.mk,v 1.104 2010/06/01 23:29:10 joerg Exp $
2 # @(#)bsd.man.mk 8.1 (Berkeley) 6/8/93
3
4 .include <bsd.init.mk>
5
6 ##### Basic targets
7 .PHONY: catinstall maninstall catpages manpages catlinks manlinks
8 .PHONY: htmlinstall htmlpages htmllinks
9 .PHONY: lintmanpages
10 realinstall: ${MANINSTALL}
11
12 ##### Default values
13 .if ${USETOOLS} == "yes"
14 TMACDEPDIR?= ${TOOLDIR}/share/groff/tmac
15 .else
16 TMACDEPDIR?= /usr/share/tmac
17 .endif
18
19 HTMLDIR?= ${DESTDIR}${MANDIR}
20 CATDEPS?= ${TMACDEPDIR}/andoc.tmac \
21 ${TMACDEPDIR}/doc.tmac \
22 ${TMACDEPDIR}/mdoc/doc-common \
23 ${TMACDEPDIR}/mdoc/doc-ditroff \
24 ${TMACDEPDIR}/mdoc/doc-nroff \
25 ${TMACDEPDIR}/mdoc/doc-syms
26 HTMLDEPS?= ${TMACDEPDIR}/doc2html.tmac
27 MANTARGET?= cat
28
29 MAN?=
30 MLINKS?=
31 _MNUMBERS= 1 2 3 4 5 6 7 8 9
32 .SUFFIXES: ${_MNUMBERS:@N@.$N@}
33
34 .if ${MKMANZ} == "no"
35 MANCOMPRESS?=
36 MANSUFFIX?=
37 .else
38 MANCOMPRESS?= gzip -ncf
39 MANSUFFIX?= .gz
40 .endif
41
42 # make MANCOMPRESS a filter, so it can be inserted on an as-needed basis
43 .if !empty(MANCOMPRESS)
44 MANCOMPRESS:= | ${MANCOMPRESS}
45 .endif
46
47 __installpage: .USE
48 @cmp -s ${.ALLSRC} ${.TARGET} > /dev/null 2>&1 || \
49 (${_MKSHMSG_INSTALL} ${.TARGET}; \
50 ${_MKSHECHO} "${INSTALL_FILE} -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} \
51 ${.ALLSRC} ${.TARGET}" && \
52 ${INSTALL_FILE} -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} \
53 ${.ALLSRC} ${.TARGET})
54
55 # XXX consider including bsd.links.mk and using __linkinstall instead
56 __linkinstallpage: .USE
57 ${_MKSHMSG_INSTALL} ${.TARGET}; \
58 ${_MKSHECHO} "${INSTALL_LINK} -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} \
59 ${.ALLSRC} ${.TARGET}" && \
60 ${INSTALL_LINK} -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} \
61 ${.ALLSRC} ${.TARGET}
62
63 ##### Build and install rules (source form pages)
64
65 .if ${MKMAN} != "no"
66 maninstall: manpages manlinks
67 manpages:: # ensure target exists
68 MANPAGES= ${MAN:C/.$/&${MANSUFFIX}/}
69
70 realall: ${MANPAGES}
71 .if !empty(MANSUFFIX)
72 .NOPATH: ${MANPAGES}
73 .SUFFIXES: ${_MNUMBERS:@N@.$N${MANSUFFIX}@}
74
75 ${_MNUMBERS:@N@.$N.$N${MANSUFFIX}@}: # build rule
76 ${_MKTARGET_FORMAT}
77 cat ${.IMPSRC} ${MANCOMPRESS} > ${.TARGET}.tmp && mv ${.TARGET}.tmp ${.TARGET}
78 .endif # !empty(MANSUFFIX)
79
80 .for F in ${MANPAGES:S/${MANSUFFIX}$//:O:u}
81 _F:= ${DESTDIR}${MANDIR}/man${F:T:E}${MANSUBDIR}/${F}${MANSUFFIX}
82
83 .if ${MKUPDATE} == "no"
84 ${_F}! ${F}${MANSUFFIX} __installpage # install rule
85 .if !defined(BUILD) && !make(all) && !make(${F})
86 ${_F}! .MADE # no build at install
87 .endif
88 .else
89 ${_F}: ${F}${MANSUFFIX} __installpage # install rule
90 .if !defined(BUILD) && !make(all) && !make(${F})
91 ${_F}: .MADE # no build at install
92 .endif
93 .endif
94
95 manpages:: ${_F}
96 .PRECIOUS: ${_F} # keep if install fails
97 .endfor
98
99 manlinks:: # link install
100
101 .for _src _dst in ${MLINKS}
102 _l:=${DESTDIR}${MANDIR}/man${_src:T:E}${MANSUBDIR}/${_src}${MANSUFFIX}
103 _t:=${DESTDIR}${MANDIR}/man${_dst:T:E}${MANSUBDIR}/${_dst}${MANSUFFIX}
104
105 # Handle case conflicts carefully, when _dst occurs
106 # more than once after case flattening
107 .if ${MKUPDATE} == "no" || ${MLINKS:tl:M${_dst:tl:Q}:[\#]} > 1
108 ${_t}! ${_l} __linkinstallpage
109 .else
110 ${_t}: ${_l} __linkinstallpage
111 .endif
112
113 manlinks:: ${_t}
114 .PRECIOUS: ${_t}
115 .endfor
116 .endif # ${MKMAN} != "no"
117
118 ##### Build and install rules (plaintext pages)
119
120 .if (${MKCATPAGES} != "no") && (${MKMAN} != "no")
121 catinstall: catpages catlinks
122 catpages:: # ensure target exists
123 CATPAGES= ${MAN:C/\.([1-9])$/.cat\1${MANSUFFIX}/}
124
125 realall: ${CATPAGES}
126 .NOPATH: ${CATPAGES}
127 .SUFFIXES: ${_MNUMBERS:@N@.cat$N${MANSUFFIX}@}
128 .MADE: ${CATDEPS}
129
130 ${_MNUMBERS:@N@.$N.cat$N${MANSUFFIX}@}: ${CATDEPS} # build rule
131 ${_MKTARGET_FORMAT}
132 .if defined(USETBL)
133 ${TOOL_TBL} ${.IMPSRC} | ${TOOL_ROFF_ASCII} -mandoc ${MANCOMPRESS} \
134 > ${.TARGET}.tmp && mv ${.TARGET}.tmp ${.TARGET}
135 .elif ${MKMANDOC} == yes && !defined(NOMANDOC)
136 if test ""${NOMANDOC.${.IMPSRC:T}:tl:Q} != "yes"; then \
137 ${TOOL_MANDOC_ASCII} ${.IMPSRC} ${MANCOMPRESS} \
138 > ${.TARGET}.tmp && mv ${.TARGET}.tmp ${.TARGET}; \
139 else \
140 ${TOOL_ROFF_ASCII} -mandoc ${.IMPSRC} ${MANCOMPRESS} \
141 > ${.TARGET}.tmp && mv ${.TARGET}.tmp ${.TARGET}; \
142 fi
143 .else
144 ${TOOL_ROFF_ASCII} -mandoc ${.IMPSRC} ${MANCOMPRESS} \
145 > ${.TARGET}.tmp && mv ${.TARGET}.tmp ${.TARGET}
146 .endif
147
148 .for F in ${CATPAGES:S/${MANSUFFIX}$//:O:u}
149 _F:= ${DESTDIR}${MANDIR}/${F:T:E}${MANSUBDIR}/${F:R}.0${MANSUFFIX}
150
151 .if ${MKUPDATE} == "no"
152 ${_F}! ${F}${MANSUFFIX} __installpage # install rule
153 .if !defined(BUILD) && !make(all) && !make(${F})
154 ${_F}! .MADE # no build at install
155 .endif
156 .else
157 ${_F}: ${F}${MANSUFFIX} __installpage # install rule
158 .if !defined(BUILD) && !make(all) && !make(${F})
159 ${_F}: .MADE # no build at install
160 .endif
161 .endif
162
163 catpages:: ${_F}
164 .PRECIOUS: ${_F} # keep if install fails
165 .endfor
166
167 catlinks:: # link install
168
169 .for _src _dst in ${MLINKS}
170 _l:=${DESTDIR}${MANDIR}/cat${_src:T:E}${MANSUBDIR}/${_src:R}.0${MANSUFFIX}
171 _t:=${DESTDIR}${MANDIR}/cat${_dst:T:E}${MANSUBDIR}/${_dst:R}.0${MANSUFFIX}
172
173 # Handle case conflicts carefully, when _dst occurs
174 # more than once after case flattening
175 .if ${MKUPDATE} == "no" || ${MLINKS:tl:M${_dst:tl:Q}:[\#]} > 1
176 ${_t}! ${_l} __linkinstallpage
177 .else
178 ${_t}: ${_l} __linkinstallpage
179 .endif
180
181 catlinks:: ${_t}
182 .PRECIOUS: ${_t}
183 .endfor
184 .endif # (${MKCATPAGES} != "no") && (${MKMAN} != "no")
185
186 ##### Build and install rules (HTML pages)
187
188 .if (${MKHTML} != "no") && (${MKMAN} != "no") # {
189 htmlinstall: htmlpages htmllinks
190 htmlpages:: # ensure target exists
191 HTMLPAGES= ${MAN:C/\.([1-9])$/.html\1/}
192
193 realall: ${HTMLPAGES}
194 .NOPATH: ${HTMLPAGES}
195 .SUFFIXES: ${_MNUMBERS:@N@.html$N@}
196 .MADE: ${HTMLDEPS}
197
198 ${_MNUMBERS:@N@.$N.html$N@}: ${HTMLDEPS} # build rule
199 ${_MKTARGET_FORMAT}
200 ${TOOL_MANDOC_HTML} ${.IMPSRC} > ${.TARGET}.tmp && \
201 mv ${.TARGET}.tmp ${.TARGET}
202
203 .for F in ${HTMLPAGES:O:u}
204 # construct installed path
205 _F:= ${HTMLDIR}/${F:T:E}${MANSUBDIR}/${F:R:S-/index$-/x&-}.html
206
207 .if ${MKUPDATE} == "no"
208 ${_F}! ${F} __installpage # install rule
209 .if !defined(BUILD) && !make(all) && !make(${F})
210 ${_F}! .MADE # no build at install
211 .endif
212 .else
213 ${_F}: ${F} __installpage # install rule
214 .if !defined(BUILD) && !make(all) && !make(${F})
215 ${_F}: .MADE # no build at install
216 .endif
217 .endif
218
219 htmlpages:: ${_F}
220 .PRECIOUS: ${_F} # keep if install fails
221 .endfor
222
223 htmllinks:: # link install
224
225 .for _src _dst in ${MLINKS}
226 _l:=${HTMLDIR}/html${_src:T:E}${MANSUBDIR}/${_src:R:S-/index$-/x&-}.html
227 _t:=${HTMLDIR}/html${_dst:T:E}${MANSUBDIR}/${_dst:R:S-/index$-/x&-}.html
228
229 # Handle case conflicts carefully, when _dst occurs
230 # more than once after case flattening
231 .if ${MKUPDATE} == "no" || ${MLINKS:tl:M${_dst:tl:Q}:[\#]} > 1
232 ${_t}! ${_l} __linkinstallpage
233 .else
234 ${_t}: ${_l} __linkinstallpage
235 .endif
236
237 htmllinks:: ${_t}
238 .PRECIOUS: ${_t}
239 .endfor
240
241 .endif # }
242
243 ##### Clean rules
244 .undef _F
245
246 cleandir: cleanman
247 .if !empty(CLEANFILES)
248 rm -f ${CLEANFILES}
249 .endif
250
251 cleanman: .PHONY
252 .if !empty(MAN) && (${MKMAN} != "no")
253 .if (${MKCATPAGES} != "no")
254 rm -f ${CATPAGES}
255 .endif
256 .if !empty(MANSUFFIX)
257 rm -f ${MANPAGES} ${CATPAGES:S/${MANSUFFIX}$//}
258 .endif
259 .if ${MKHTML} != "no"
260 rm -f ${HTMLPAGES}
261 .endif
262 .endif
263 # (XXX ${CATPAGES:S...} cleans up old .catN files where .catN.gz now used)
264
265 .if !empty(MANPAGES)
266 lintmanpages: ${MANPAGES}
267 ${TOOL_MANDOC_LINT} -Tlint -fstrict -Wall ${.ALLSRC}
268 .endif
269
270 ##### Pull in related .mk logic
271 .include <bsd.obj.mk>
272 .include <bsd.files.mk>
273 .include <bsd.sys.mk>
274
275 ${TARGETS} catinstall maninstall htmlinstall: # ensure existence
276