1 # $NetBSD: bsd.man.mk,v 1.122 2020/11/10 21:47:49 kamil 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 # If our install destination is case-preserving, but case-insensitive 13 # then we do filesystem comparisons in lower case to make sure that 14 # we always refresh the target when needed. In general we don't 15 # want to do this, otherwise things like _exit.2 -> _Exit.2 get 16 # installed on each build even when they don't need to. Note that 17 # the CASE_INSENSITIVE_DEST macro is currently not defined anywhere, 18 # and the expansion does not really work because of make(1). 19 .if defined(CASE_INSENSITIVE_DEST) 20 _FLATTEN?=tl: 21 .endif 22 23 ##### Default values 24 .if ${USETOOLS} == "yes" 25 TMACDEPDIR?= ${TOOLDIR}/share/groff/tmac 26 .else 27 TMACDEPDIR?= /usr/share/tmac 28 .endif 29 30 HTMLDIR?= ${DESTDIR}${MANDIR} 31 .if ${MKMANDOC} == yes && !defined(NOMANDOC) 32 CATDEPS?= 33 .else 34 CATDEPS?= ${TMACDEPDIR}/andoc.tmac \ 35 ${TMACDEPDIR}/doc.tmac \ 36 ${TMACDEPDIR}/mdoc/doc-common \ 37 ${TMACDEPDIR}/mdoc/doc-ditroff \ 38 ${TMACDEPDIR}/mdoc/doc-nroff \ 39 ${TMACDEPDIR}/mdoc/doc-syms 40 .endif 41 MANTARGET?= cat 42 43 MAN?= 44 MLINKS?= 45 _MSECTIONS= 1 2 3 4 5 6 7 8 9 46 _MSECTIONS+= 3lua 9lua 47 _MSECTIONREGEX= ${_MSECTIONS:ts|} # e.g. 1|2|3|... 48 .SUFFIXES: ${_MSECTIONS:@N@.$N@} 49 50 .if ${MKMANZ} == "no" 51 MANCOMPRESS?= 52 MANSUFFIX?= 53 .else 54 MANCOMPRESS?= ${TOOL_GZIP_N} -cf 55 MANSUFFIX?= .gz 56 .endif 57 58 # make MANCOMPRESS a filter, so it can be inserted on an as-needed basis 59 .if !empty(MANCOMPRESS) 60 MANCOMPRESS:= | ${MANCOMPRESS} 61 .endif 62 63 __installpage: .USE 64 @cmp -s ${.ALLSRC} ${.TARGET} > /dev/null 2>&1 || \ 65 (${_MKSHMSG_INSTALL} ${.TARGET}; \ 66 ${_MKSHECHO} "${INSTALL_FILE} -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} \ 67 ${.ALLSRC} ${.TARGET}" && \ 68 ${INSTALL_FILE} -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} \ 69 ${.ALLSRC} ${.TARGET}) 70 71 # XXX consider including bsd.links.mk and using __linkinstall instead 72 __linkinstallpage: .USE 73 ${_MKSHMSG_INSTALL} ${.TARGET}; \ 74 ${_MKSHECHO} "${INSTALL_LINK} -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} \ 75 ${.ALLSRC} ${.TARGET}" && \ 76 ${INSTALL_LINK} -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} \ 77 ${.ALLSRC} ${.TARGET} 78 79 ##### Build and install rules (source form pages) 80 81 .if ${MKMAN} != "no" 82 maninstall: manpages manlinks 83 manpages:: # ensure target exists 84 MANPAGES= ${MAN:C/.$/&${MANSUFFIX}/} 85 86 realall: ${MANPAGES} 87 .if !empty(MANSUFFIX) 88 .NOPATH: ${MANPAGES} 89 .SUFFIXES: ${_MSECTIONS:@N@.$N${MANSUFFIX}@} 90 91 ${_MSECTIONS:@N@.$N.$N${MANSUFFIX}@}: # build rule 92 ${_MKTARGET_FORMAT} 93 cat ${.IMPSRC} ${MANCOMPRESS} > ${.TARGET}.tmp && ${MV} ${.TARGET}.tmp ${.TARGET} 94 .endif # !empty(MANSUFFIX) 95 96 .for F in ${MANPAGES:S/${MANSUFFIX}$//:O:u} 97 _F:= ${DESTDIR}${MANDIR}/man${F:T:E}${MANSUBDIR}/${F}${MANSUFFIX} 98 99 .if ${MKUPDATE} == "no" 100 ${_F}! ${F}${MANSUFFIX} __installpage # install rule 101 .if !defined(BUILD) && !make(all) && !make(${F}) 102 ${_F}! .MADE # no build at install 103 .endif 104 .else 105 ${_F}: ${F}${MANSUFFIX} __installpage # install rule 106 .if !defined(BUILD) && !make(all) && !make(${F}) 107 ${_F}: .MADE # no build at install 108 .endif 109 .endif 110 111 manpages:: ${_F} 112 .PRECIOUS: ${_F} # keep if install fails 113 .endfor 114 115 manlinks:: # link install 116 117 .for _src _dst in ${MLINKS} 118 _l:=${DESTDIR}${MANDIR}/man${_src:T:E}${MANSUBDIR}/${_src}${MANSUFFIX} 119 _t:=${DESTDIR}${MANDIR}/man${_dst:T:E}${MANSUBDIR}/${_dst}${MANSUFFIX} 120 121 # Handle case conflicts carefully, when _dst occurs 122 # more than once after case flattening 123 .if ${MKUPDATE} == "no" || ${MLINKS:${_FLATTEN}M${_dst:${_FLATTEN}Q}:[\#]} > 1 124 ${_t}! ${_l} __linkinstallpage 125 .else 126 ${_t}: ${_l} __linkinstallpage 127 .endif 128 129 manlinks:: ${_t} 130 .PRECIOUS: ${_t} 131 .endfor 132 .endif # ${MKMAN} != "no" 133 134 ##### Build and install rules (plaintext pages) 135 136 .if (${MKCATPAGES} != "no") && (${MKMAN} != "no") 137 catinstall: catpages catlinks 138 catpages:: # ensure target exists 139 CATPAGES= ${MAN:C/\.(${_MSECTIONREGEX})\$/.cat\1${MANSUFFIX}/} 140 141 realall: ${CATPAGES} 142 .NOPATH: ${CATPAGES} 143 .SUFFIXES: ${_MSECTIONS:@N@.cat$N${MANSUFFIX}@} 144 .MADE: ${CATDEPS} 145 146 ${_MSECTIONS:@N@.$N.cat$N${MANSUFFIX}@}: ${CATDEPS} # build rule 147 ${_MKTARGET_FORMAT} 148 .if ${MKMANDOC} == yes && !defined(NOMANDOC) 149 if test ""${NOMANDOC.${.IMPSRC:T}:tl:Q} != "yes"; then \ 150 ${TOOL_MANDOC_ASCII} ${.IMPSRC} ${MANCOMPRESS} \ 151 > ${.TARGET}.tmp && ${MV} ${.TARGET}.tmp ${.TARGET}; \ 152 else \ 153 ${TOOL_ROFF_ASCII} -mandoc ${.IMPSRC} ${MANCOMPRESS} \ 154 > ${.TARGET}.tmp && ${MV} ${.TARGET}.tmp ${.TARGET}; \ 155 fi 156 .elif defined(USETBL) 157 ${TOOL_TBL} ${.IMPSRC} | ${TOOL_ROFF_ASCII} -mandoc ${MANCOMPRESS} \ 158 > ${.TARGET}.tmp && ${MV} ${.TARGET}.tmp ${.TARGET} 159 .else 160 ${TOOL_ROFF_ASCII} -mandoc ${.IMPSRC} ${MANCOMPRESS} \ 161 > ${.TARGET}.tmp && ${MV} ${.TARGET}.tmp ${.TARGET} 162 .endif 163 164 .for F in ${CATPAGES:S/${MANSUFFIX}$//:O:u} 165 _F:= ${DESTDIR}${MANDIR}/${F:T:E}${MANSUBDIR}/${F:R}.0${MANSUFFIX} 166 167 .if ${MKUPDATE} == "no" 168 ${_F}! ${F}${MANSUFFIX} __installpage # install rule 169 .if !defined(BUILD) && !make(all) && !make(${F}) 170 ${_F}! .MADE # no build at install 171 .endif 172 .else 173 ${_F}: ${F}${MANSUFFIX} __installpage # install rule 174 .if !defined(BUILD) && !make(all) && !make(${F}) 175 ${_F}: .MADE # no build at install 176 .endif 177 .endif 178 179 catpages:: ${_F} 180 .PRECIOUS: ${_F} # keep if install fails 181 .endfor 182 183 catlinks:: # link install 184 185 .for _src _dst in ${MLINKS} 186 _l:=${DESTDIR}${MANDIR}/cat${_src:T:E}${MANSUBDIR}/${_src:R}.0${MANSUFFIX} 187 _t:=${DESTDIR}${MANDIR}/cat${_dst:T:E}${MANSUBDIR}/${_dst:R}.0${MANSUFFIX} 188 189 # Handle case conflicts carefully, when _dst occurs 190 # more than once after case flattening 191 .if ${MKUPDATE} == "no" || ${MLINKS:${_FLATTEN}M${_dst:${_FLATTEN}Q}:[\#]} > 1 192 ${_t}! ${_l} __linkinstallpage 193 .else 194 ${_t}: ${_l} __linkinstallpage 195 .endif 196 197 catlinks:: ${_t} 198 .PRECIOUS: ${_t} 199 .endfor 200 .endif # (${MKCATPAGES} != "no") && (${MKMAN} != "no") 201 202 ##### Build and install rules (HTML pages) 203 204 .if (${MKHTML} != "no") && (${MKMAN} != "no") # { 205 htmlinstall: htmlpages htmllinks 206 htmlpages:: # ensure target exists 207 HTMLPAGES= ${MAN:C/\.(${_MSECTIONREGEX})\$/.html\1/} 208 209 HTMLLINKS= ${MANSUBDIR:?../:}../html%S/%N.html 210 HTMLSTYLE= ${MANSUBDIR:?../:}../style.css 211 212 realall: ${HTMLPAGES} 213 .NOPATH: ${HTMLPAGES} 214 .SUFFIXES: ${_MSECTIONS:@N@.html$N@} 215 216 ${_MSECTIONS:@N@.$N.html$N@}: # build rule 217 ${_MKTARGET_FORMAT} 218 .if ${MKMANDOC} == yes && !defined(NOMANDOC) 219 if test ""${NOMANDOC.${.IMPSRC:T}:tl:Q} != "yes"; then \ 220 ${TOOL_MANDOC_HTML} -Oman=${HTMLLINKS},style=${HTMLSTYLE} \ 221 ${.IMPSRC} > ${.TARGET}.tmp && \ 222 ${MV} ${.TARGET}.tmp ${.TARGET}; \ 223 else \ 224 ${TOOL_ROFF_HTML} ${.IMPSRC} ${MANCOMPRESS} \ 225 > ${.TARGET}.tmp && ${MV} ${.TARGET}.tmp ${.TARGET}; \ 226 fi 227 .elif defined(USETBL) 228 ${TOOL_TBL} ${.IMPSRC} | ${TOOL_ROFF_HTML} ${MANCOMPRESS} \ 229 > ${.TARGET}.tmp && ${MV} ${.TARGET}.tmp ${.TARGET} 230 .else 231 ${TOOL_ROFF_HTML} ${.IMPSRC} ${MANCOMPRESS} \ 232 > ${.TARGET}.tmp && ${MV} ${.TARGET}.tmp ${.TARGET} 233 .endif 234 235 .for F in ${HTMLPAGES:O:u} 236 # construct installed path 237 _F:= ${HTMLDIR}/${F:T:E}${MANSUBDIR}/${F:R:S-/index$-/x&-}.html 238 239 .if ${MKUPDATE} == "no" 240 ${_F}! ${F} __installpage # install rule 241 .if !defined(BUILD) && !make(all) && !make(${F}) 242 ${_F}! .MADE # no build at install 243 .endif 244 .else 245 ${_F}: ${F} __installpage # install rule 246 .if !defined(BUILD) && !make(all) && !make(${F}) 247 ${_F}: .MADE # no build at install 248 .endif 249 .endif 250 251 htmlpages:: ${_F} 252 .PRECIOUS: ${_F} # keep if install fails 253 .endfor 254 255 htmllinks:: # link install 256 257 .for _src _dst in ${MLINKS} 258 _l:=${HTMLDIR}/html${_src:T:E}${MANSUBDIR}/${_src:R:S-/index$-/x&-}.html 259 _t:=${HTMLDIR}/html${_dst:T:E}${MANSUBDIR}/${_dst:R:S-/index$-/x&-}.html 260 261 # Handle case conflicts carefully, when _dst occurs 262 # more than once after case flattening 263 .if ${MKUPDATE} == "no" || ${MLINKS:${_FLATTEN}M${_dst:${_FLATTEN}Q}:[\#]} > 1 264 ${_t}! ${_l} __linkinstallpage 265 .else 266 ${_t}: ${_l} __linkinstallpage 267 .endif 268 269 htmllinks:: ${_t} 270 .PRECIOUS: ${_t} 271 .endfor 272 273 .endif # } 274 275 ##### Clean rules 276 .undef _F 277 278 .if !empty(MAN) && (${MKMAN} != "no") 279 .if (${MKCATPAGES} != "no") 280 CLEANDIRFILES+= ${CATPAGES} 281 .endif 282 .if !empty(MANSUFFIX) 283 CLEANDIRFILES+= ${MANPAGES} ${CATPAGES:S/${MANSUFFIX}$//} 284 .endif 285 .if ${MKHTML} != "no" 286 CLEANDIRFILES+= ${HTMLPAGES} 287 .endif 288 .endif 289 # (XXX ${CATPAGES:S...} cleans up old .catN files where .catN.gz now used) 290 291 .if !empty(MANPAGES) 292 lintmanpages: ${MANPAGES} 293 ${TOOL_MANDOC_LINT} -Tlint -fstrict -Wall,stop ${.ALLSRC} 294 .endif 295 296 ##### describe 297 describe: 298 .for _M in ${MANPAGES} 299 @echo $$(basename ${_M}) - \ 300 $$(${TOOL_SED} < ${${_M}:P} -n -e '/^\.Nd /{;s/^....//;p;}') 301 .endfor 302 303 304 ##### Pull in related .mk logic 305 .include <bsd.obj.mk> 306 .include <bsd.files.mk> 307 .include <bsd.sys.mk> 308 .include <bsd.clean.mk> 309 310 ${TARGETS} catinstall maninstall htmlinstall: # ensure existence 311