xref: /freebsd/share/mk/bsd.man.mk (revision 9f0f30bc1f5f08d25243952bad3fdc6e13a75c2a)
1#
2# The include file <bsd.man.mk> handles installing manual pages and
3# their links.
4#
5#
6# +++ variables +++
7#
8# DESTDIR	Change the tree where the man pages gets installed. [not set]
9#
10# MANDIR	Base path for manual installation. [${SHAREDIR}/man/man]
11#
12# MANOWN	Manual owner. [${SHAREOWN}]
13#
14# MANGRP	Manual group. [${SHAREGRP}]
15#
16# MANMODE	Manual mode. [${NOBINMODE}]
17#
18# MANSUBDIR	Subdirectory under the manual page section, i.e. "/i386"
19#		or "/tahoe" for machine specific manual pages.
20#
21# MAN		The manual pages to be installed. For sections see
22#		variable ${SECTIONS}
23#
24# MCOMPRESS_CMD	Program to compress man pages. Output is to
25#		stdout. [${COMPRESS_CMD}]
26#
27# MLINKS	List of manual page links (using a suffix). The
28#		linked-to file must come first, the linked file
29#		second, and there may be multiple pairs. The files
30#		are hard-linked.
31#
32# NO_MLINKS	If you do not want install manual page links. [not set]
33#
34# MANFILTER	command to pipe the raw man page through before compressing
35#		or installing.  Can be used to do sed substitution.
36#
37# MANBUILDCAT	create preformatted manual pages in addition to normal
38#		pages. [not set]
39#
40# MANDOC_CMD	command and flags to create preformatted pages
41#
42# MANGROUPS	A list of groups, each of which should be a variable containing
43# 		a list of manual pages in that group.  By default one group is
44# 		defined called "MAN".
45#
46# 		For each group, group-specific options may be set:
47# 		<group>OWN, <group>GRP, <group>MODE and <group>PACKAGE.
48#
49# +++ targets +++
50#
51#	maninstall:
52#		Install the manual pages and their links.
53#
54
55.if !target(__<bsd.init.mk>__)
56.error bsd.man.mk cannot be included directly.
57.endif
58
59MANGROUPS?=	MAN
60
61# Backwards compatibility.
62MINSTALL?=	${MANINSTALL}
63
64CATDIR=		${MANDIR:H:S/$/\/cat/}
65CATEXT=		.cat
66MANDOC_CMD?=	mandoc -Tascii
67
68MCOMPRESS_CMD?=	${COMPRESS_CMD}
69MCOMPRESS_EXT?=	${COMPRESS_EXT}
70
71SECTIONS=	1 2 3 4 5 6 7 8 9
72.SUFFIXES:	${SECTIONS:S/^/./g}
73
74# Backwards compatibility.
75.if !defined(MAN)
76.for __sect in ${SECTIONS}
77MANGROUPS+=	MAN${__sect}
78.endfor
79.endif
80
81# Following the conventions of MANGROUPS, manpage links should be defined
82# as ${group}LINKS, which means the default groups' links would be called
83# MANLINKS.  However it's actually called MLINKS, so for compatibility,
84# use ${MLINKS} as the default group's links if it's set.
85.if defined(MLINKS)
86MANLINKS=	${MLINKS}
87.endif
88
89maninstall: realmaninstall manlinksinstall .PHONY
90# Make sure all manpages are installed before we try to link any.
91.ORDER: realmaninstall manlinksinstall
92realmaninstall: .PHONY
93manlinksinstall: .PHONY
94
95all-man:
96
97.for __group in ${MANGROUPS}
98
99realmaninstall: realmaninstall-${__group}
100manlinksinstall: manlinksinstall-${__group}
101
102${__group}OWN?=		${MANOWN}
103${__group}GRP?=		${MANGRP}
104${__group}MODE?=	${MANMODE}
105
106# Tag processing is only done for NO_ROOT installs.
107.if defined(NO_ROOT)
108
109.if !defined(${__group}TAGS) || ! ${${__group}TAGS:Mpackage=*}
110.if ${MK_MANSPLITPKG} == "no"
111${__group}TAGS+=	package=${${__group}PACKAGE:U${PACKAGE:Uutilities}}
112.else
113${__group}TAGS+=	package=${${__group}PACKAGE:U${PACKAGE:Uutilities}}-man
114.endif
115.endif
116
117${__group}TAG_ARGS=	-T ${${__group}TAGS:[*]:S/ /,/g}
118.endif	# defined(NO_ROOT)
119
120${__group}INSTALL?=	${INSTALL} ${${__group}TAG_ARGS} \
121	-o ${${__group}OWN} -g ${${__group}GRP} -m ${${__group}MODE}
122
123.if ${MK_MANCOMPRESS} == "no"
124
125# Make special arrangements to filter to a temporary file at build time
126# for MK_MANCOMPRESS == no.
127.if defined(MANFILTER)
128FILTEXTENSION=		.filt
129.else
130FILTEXTENSION=
131.endif
132
133ZEXT=
134
135.if defined(MANFILTER)
136.if defined(${__group}) && !empty(${__group})
137CLEANFILES+=	${${__group}:T:S/$/${FILTEXTENSION}/g}
138CLEANFILES+=	${${__group}:T:S/$/${CATEXT}${FILTEXTENSION}/g}
139.for __page in ${${__group}}
140.for __target in ${__page:T:S/$/${FILTEXTENSION}/g}
141all-man: ${__target}
142${__target}: ${__page}
143	${MANFILTER} < ${.ALLSRC} > ${.TARGET}
144.endfor
145.if defined(MANBUILDCAT) && !empty(MANBUILDCAT)
146.for __target in ${__page:T:S/$/${CATEXT}${FILTEXTENSION}/g}
147all-man: ${__target}
148${__target}: ${__page}
149	${MANFILTER} < ${.ALLSRC} | ${MANDOC_CMD} > ${.TARGET}
150.endfor
151.endif
152.endfor
153.endif	# !empty(${__group})
154.else	# !defined(MANFILTER)
155.if defined(${__group}) && !empty(${__group})
156CLEANFILES+=	${${__group}:T:S/$/${CATEXT}/g}
157.if defined(MANBUILDCAT) && !empty(MANBUILDCAT)
158.for __page in ${${__group}}
159.for __target in ${__page:T:S/$/${CATEXT}/g}
160all-man: ${__target}
161${__target}: ${__page}
162	${MANDOC_CMD} ${.ALLSRC} > ${.TARGET}
163.endfor
164.endfor
165.else
166all-man: ${${__group}}
167.endif
168.endif
169.endif	# defined(MANFILTER)
170
171.else	# ${MK_MANCOMPRESS} == "yes"
172
173ZEXT=		${MCOMPRESS_EXT}
174
175.if defined(${__group}) && !empty(${__group})
176CLEANFILES+=	${${__group}:T:S/$/${MCOMPRESS_EXT}/g}
177CLEANFILES+=	${${__group}:T:S/$/${CATEXT}${MCOMPRESS_EXT}/g}
178.for __page in ${${__group}}
179.for __target in ${__page:T:S/$/${MCOMPRESS_EXT}/}
180all-man: ${__target}
181${__target}: ${__page}
182.if defined(MANFILTER)
183	${MANFILTER} < ${.ALLSRC} | ${MCOMPRESS_CMD} > ${.TARGET}
184.else
185	${MCOMPRESS_CMD} ${.ALLSRC} > ${.TARGET}
186.endif
187.endfor
188.if defined(MANBUILDCAT) && !empty(MANBUILDCAT)
189.for __target in ${__page:T:S/$/${CATEXT}${MCOMPRESS_EXT}/}
190all-man: ${__target}
191${__target}: ${__page}
192.if defined(MANFILTER)
193	${MANFILTER} < ${.ALLSRC} | ${MANDOC_CMD} | ${MCOMPRESS_CMD} > ${.TARGET}
194.else
195	${MANDOC_CMD} ${.ALLSRC} | ${MCOMPRESS_CMD} > ${.TARGET}
196.endif
197.endfor
198.endif
199.endfor
200.endif
201
202.endif	# ${MK_MANCOMPRESS} == "no"
203
204_MANLINKS=
205.if !defined(NO_MLINKS) && defined(${__group}LINKS) && !empty(${__group}LINKS)
206.for _oname _osect _dname _dsect in ${${__group}LINKS:C/\.([^.]*)$/.\1 \1/}
207_MANLINKS+=	${MANDIR}${_osect}${MANSUBDIR}/${_oname} \
208		${MANDIR}${_dsect}${MANSUBDIR}/${_dname}
209.if defined(MANBUILDCAT) && !empty(MANBUILDCAT)
210_MANLINKS+=	${CATDIR}${_osect}${MANSUBDIR}/${_oname} \
211		${CATDIR}${_dsect}${MANSUBDIR}/${_dname}
212.endif
213.endfor
214.endif
215
216.if defined(${__group}) && !empty(${__group})
217.if ${MK_STAGING_MAN} == "yes"
218STAGE_TARGETS+= stage_files.${__group}
219_mansets.${__group}:= ${${__group}:E:O:u:M*[1-9]:@s@man$s@}
220STAGE_SETS+= ${_mansets.${__group}}
221.for _page in ${${__group}}
222stage_files.${__group}.man${_page:T:E}: ${_page}
223.if target(${_page}${MCOMPRESS_EXT})
224stage_files.${__group}.man${_page:T:E}: ${_page}${MCOMPRESS_EXT}
225.endif
226STAGE_DIR.${__group}.man${_page:T:E}?= ${STAGE_OBJTOP}${MANDIR}${_page:T:E}${MANSUBDIR}
227.endfor
228.if !defined(NO_MLINKS) && !empty(${__group}LINKS)
229STAGE_SETS+= mlinks.${__group}
230STAGE_TARGETS+= stage_links.${__group}
231STAGE_LINKS.mlinks.${__group}:= ${${__group}LINKS:M*.[1-9]:@f@${f:S,^,${MANDIR}${f:E}${MANSUBDIR}/,}@}
232stage_links.mlinks.${__group}: ${_mansets.${__group}:@s@stage_files.${__group}.$s@}
233.endif
234.endif
235.endif
236
237realmaninstall-${__group}:
238.if defined(${__group}) && !empty(${__group})
239realmaninstall-${__group}: ${${__group}}
240.if ${MK_MANCOMPRESS} == "no"
241.if defined(MANFILTER)
242.for __page in ${${__group}}
243	${${__group}INSTALL} ${__page:T:S/$/${FILTEXTENSION}/g} \
244		${DESTDIR}${MANDIR}${__page:E}${MANSUBDIR}/${__page}
245.if defined(MANBUILDCAT) && !empty(MANBUILDCAT)
246	${${__group}INSTALL} ${__page:T:S/$/${CATEXT}${FILTEXTENSION}/g} \
247		${DESTDIR}${CATDIR}${__page:E}${MANSUBDIR}/${__page}
248.endif
249.endfor
250.else	# !defined(MANFILTER)
251	@set ${.ALLSRC:C/\.([^.]*)$/.\1 \1/}; \
252	while : ; do \
253		case $$# in \
254			0) break;; \
255			1) echo "warn: missing extension: $$1"; break;; \
256		esac; \
257		page=$$1; shift; sect=$$1; shift; \
258		d=${DESTDIR}${MANDIR}$${sect}${MANSUBDIR}; \
259		${ECHO} ${${__group}INSTALL} $${page} $${d}; \
260		${${__group}INSTALL} $${page} $${d}; \
261	done
262.if defined(MANBUILDCAT) && !empty(MANBUILDCAT)
263.for __page in ${${__group}}
264	${${__group}INSTALL} ${__page:T:S/$/${CATEXT}/} \
265		${DESTDIR}${CATDIR}${__page:E}${MANSUBDIR}/${__page:T}
266.endfor
267.endif
268.endif	# defined(MANFILTER)
269.else	# ${MK_MANCOMPRESS} == "yes"
270.for __page in ${${__group}}
271	${${__group}INSTALL} ${__page:T:S/$/${MCOMPRESS_EXT}/g} \
272		${DESTDIR}${MANDIR}${__page:E}${MANSUBDIR}/
273.if defined(MANBUILDCAT) && !empty(MANBUILDCAT)
274	${${__group}INSTALL} ${__page:T:S/$/${CATEXT}${MCOMPRESS_EXT}/g} \
275		${DESTDIR}${CATDIR}${__page:E}${MANSUBDIR}/${__page:T:S/$/${MCOMPRESS_EXT}/}
276.endif
277.endfor
278.endif	# ${MK_MANCOMPRESS} == "no"
279.endif
280
281manlinksinstall-${__group}:
282.for l t in ${_MANLINKS}
283# On MacOS, assume case folding FS, and don't install links from foo.x to FOO.x.
284.if ${.MAKE.OS} != "Darwin" || ${l:tu} != ${t:tu}
285	${INSTALL_MANLINK} ${${__group}TAG_ARGS} ${DESTDIR}${l}${ZEXT} ${DESTDIR}${t}${ZEXT}
286.endif
287.endfor
288
289manlint:
290.if defined(${__group}) && !empty(${__group})
291.for __page in ${${__group}}
292manlint: ${__page}lint
293${__page}lint: ${__page}
294.if defined(MANFILTER)
295	${MANFILTER} < ${.ALLSRC} | ${MANDOC_CMD} -Tlint
296.else
297	${MANDOC_CMD} -Tlint ${.ALLSRC}
298.endif
299.endfor
300.endif
301
302.endfor	# __group in ${MANGROUPS}
303