# bsd.web.mk # $NetBSD: web.site.mk,v 1.44 2005/10/15 13:58:55 rillig Exp $ # FreeBSD: www/share/mk/web.site.mk,v 1.43 2002/08/07 03:17:10 trhodes Exp # # Build and install a web site. # # Basic targets: # # all (default) -- performs batch mode processing necessary # install -- Installs everything # clean -- remove anything generated by processing # # # include default settings and /etc/mk.conf first # .include "web.prefs.mk" # # include all Makefile.inc files on the way from ${.CURDIR} to ${WEB_PREFIX} # .for _d_ in ${_HTDOCS_SUBDIRS} . if exists(${.CURDIR}/${_d_}/Makefile.inc) . include "${.CURDIR}/${_d_}/Makefile.inc" . endif .endfor LOCALBASE?= /usr/pkg PREFIX?= ${LOCALBASE} WEBDIR?= ${.CURDIR:T} CGIDIR?= ${.CURDIR:T} DESTDIR?= ${HOME}/public_html WEBOWN?= ${USER} WEBGRP?= www WEBMODE?= 664 CGIOWN?= ${USER} CGIGRP?= www CGIMODE?= 775 CP?= /bin/cp CVS?= /usr/bin/cvs ECHO?= echo GREP?= /usr/bin/grep SETENV?= /usr/bin/env LN?= /bin/ln MKDIR?= /bin/mkdir MV?= /bin/mv PERL?= ${PREFIX}/bin/perl RM?= /bin/rm SED?= /usr/bin/sed SH?= /bin/sh SORT?= /usr/bin/sort TOUCH?= /usr/bin/touch HTML2TXT?= ${PREFIX}/bin/lynx HTML2TXTOPTS?= -force_html -dump -nolist ${HTML2TXTFLAGS} ISPELL?= ispell ISPELLOPTS?= -l -p ${WEB_PREFIX}/en/share/dict/words ${ISPELLFLAGS} # Handle old .LIST files. .if exists(${WEB_PREFIX}/${DOCLANG}/list2html.pl) LIST2HTML?= ${PERL} ${WEB_PREFIX}/${DOCLANG}/list2html.pl .else LIST2HTML?= ${PERL} ${WEB_PREFIX}/list2html.pl .endif LIST2HTMLOPTS?= -q .if defined(LISTCOLLECTION) LIST2HTMLOPTS+= -c ${LISTCOLLECTION} .endif # --- # .xml -> .html rendering rule # # The following variables are available: # # XMLDOCS: (ex. XMLDOCS= doc1 doc2 doc3) # Target document identifier, which is usually the same as the # base part of the filenames. {XSLT,XML,TARGET}. described below # can be specified in a short form like the following: # "docid:stylesheet:xml:target". # # TARGET.: (ex. TARGET.doc1= doc1.html) # The target filename. This is optional and .html is defined # by default. # # XSLT.: (ex. XSLT.doc1= doc1.xsl) # Filename of the XSLT stylesheet. This is optional and .xsl is # defined by default. The following keywords are interpreted specially: # # `docbook' - Norm Walsh's DocBook stylesheet # `docbook-website' - Norm Walsh's Website stylesheet # `xsl' - .xsl # # XSLT.DEFAULT: # The default filename or keyword of XSLT stylesheet. # When XSLT. and one in the quadruplet are not specified, # this value is used. # # XML.: (ex. XML.doc1= doc1.xml data.xml) # Filename of the XML document. This is optional and /dev/null is # defined by default. # # SRCS.: (ex. SRCS.doc1= includes.xsl) # Depencencies. # # PARAMS.: (ex. PARAMS.doc1= --params "foo" "'textproc/foo'") # Parameters passed to xsltproc(1). # # XSLTPROCOPTS.: (ex. XSLTPROCOPTS.doc1= --nonet) # Parameters passed to xsltproc(1). # XSLTPROC_ENV+= SGML_CATALOG_FILES= XSLTPROC_ENV+= XML_CATALOG_FILES="${XML_CATALOG_FILES}" XSLTPROCOPTS= ${XSLTPROC_ARGS} XSLTPROCOPTS+= --xinclude XSLTPROCOPTS+= --stringparam LOCALBASE ${LOCALBASE} XSLTPROCOPTS+= --stringparam WEB_PREFIX ${WEB_PREFIX} .if defined(XML_CATALOG_FILES) && !empty(XML_CATALOG_FILES) XSLTPROCOPTS+= --nonet --catalogs .endif XSLTPROC= env ${XSLTPROC_ENV} ${PREFIX}/bin/xsltproc XMLLINT= env ${XSLTPROC_ENV} ${PREFIX}/bin/xmllint XSLT.DEFAULT?= docbook-website .for D in ${XMLDOCS} # parse "docid:xslt:xml:target". __ID= ${D:C,:.*$,,} # use temporary variable because "make" in NetBSD 1.6.x cannot evaluate # the modifier of a .for-variable in a conditional) _tmpD=${D:M*\:*} .if !empty(_tmpD) XSLT.${__ID}= ${D:C,^[^:]*,,:M*\:*:C,^:,,:C,:.*$,,} XML.${__ID}= ${D:C,^[^:]*,,:M*\:*:C,^:,,:C,^[^:]*,,:M*\:*:C,^:,,:C,:.*$,,} TARGET.${__ID}= ${D:C,^[^:]*,,:M*\:*:C,^:,,:C,^[^:]*,,:M*\:*:C,^:,,:C,^[^:]*,,:M*\:*:C,^:,,:C,:.*$,,} .endif # Use default value if parameter not specified. # XXX: use .for twice to completely resolve variable reference. # ${_ID} cannot be used from outside of this .for loop. .for _ID in ${__ID} .if !defined(XSLT.${_ID}) || empty(XSLT.${_ID}) XSLT.${_ID}= ${XSLT.DEFAULT} .endif .if !defined(XML.${_ID}) || empty(XML.${_ID}) XML.${_ID}= ${_ID}.xml .endif .if !defined(TARGET.${_ID}) || empty(TARGET.${_ID}) TARGET.${_ID}= ${_ID}.html .endif XSLTPROCOPTS.${_ID}?= ${XSLTPROCOPTS} GENDOCS+= ${TARGET.${_ID}} CLEANFILES+= ${TARGET.${_ID}} .if ${XSLT.${_ID}} == docbook XSLT.${_ID}= http://www.NetBSD.org/XML/htdocs/lang/share/xsl/netbsd.xsl DEPENDS.${_ID}+= ${WEB_PREFIX}/share/xsl/netbsd.xsl .elif ${XSLT.${_ID}} == docbook-website XSLT.${_ID}= http://www.NetBSD.org/XML/htdocs/lang/share/xsl/netbsd-webpage-${DOCLANG}.xsl DEPENDS.${_ID}+= ${AUTOLAYOUTFILE} DEPENDS.${_ID}+= ${WEB_PREFIX}/share/xsl/webpage.xsl XSLTPROCOPTS.${_ID}+= --stringparam autolayout-file ${AUTOLAYOUTFILE} .elif ${XSLT.${_ID}} == xsl XSLT.${_ID}= ${_ID}.xsl DEPENDS.${_ID}+= ${XSLT.${_ID}} .elif ${XSLT.${_ID}:Mhttp\://*} != "" DEPENDS.${_ID}+= ${XSLT.${_ID}} .else DEPENDS.${_ID}+= ${XSLT.${_ID}} .endif DEPENDS.${_ID}+= ${WEB_PREFIX}/share/xsl/global.xsl DEPENDS.${_ID}+= ${WEB_PREFIX}/share/xsl/portpage.xsl .for S in ${SRCS.${_ID}} DEPENDS.${_ID}+= ${S} .endfor ${TARGET.${_ID}}: ${XML_INCLUDES} ${XML.${_ID}} ${DEPENDS.${_ID}} @${ECHO} "[xsltproc] ${XML.${_ID}} -> ${.TARGET}" .if defined(DEBUG) ( ulimit -d 800000 && ${XSLTPROC} ${XSLTPROCOPTS.${_ID}} \ -o ${.TARGET} ${PARAMS.${_ID}} \ ${XSLT.${_ID}} ${XML.${_ID}} ) .else @( ulimit -d 800000 && ${XSLTPROC} ${XSLTPROCOPTS.${_ID}} \ -o ${.TARGET} ${PARAMS.${_ID}} \ ${XSLT.${_ID}} ${XML.${_ID}} ) .endif #. if !defined(NO_TIDY) # -${TIDY} ${TIDYOPTS} ${.TARGET} #. endif .endfor .endfor XML_CATALOG_FILES= file://${WEB_PREFIX}/${DOCLANG}/share/xml/catalog.xml \ file://${WEB_PREFIX}/share/xml/catalog.xml \ file://${WEB_PREFIX}/share/xml/catalog-common.xml .if defined(PKG_SYSCONFDIR.xmlcatmgr) XML_CATALOG_FILES+= file://${PKG_SYSCONFDIR.xmlcatmgr}/xml/catalog .elif defined(PKG_SYSCONFBASE) XML_CATALOG_FILES+= file://${PKG_SYSCONFBASE}/xml/catalog .else XML_CATALOG_FILES+= file://${LOCALBASE}/etc/xml/catalog .endif # for docbook-website DTD AUTOLAYOUTFILE?=${WEB_PREFIX}/autolayout.xml LAYOUTFILE?= ${WEB_PREFIX}/layout.xml # backward compatibility XSLFILE?= ${WEB_PREFIX}/share/xsl/netbsd-webpage-${DOCLANG}.xsl XMLDEPS+= ${AUTOLAYOUTFILE} XMLDEPS+= ${XSLFILE} XMLDEPS+= ${WEB_PREFIX}/share/xsl/webpage.xsl XMLDEPS+= ${WEB_PREFIX}/share/xsl/global.xsl # # Install dirs derived from the above. # DOCINSTALLDIR= ${DESTDIR}${WEBBASE}/${WEBDIR} CGIINSTALLDIR= ${DESTDIR}${WEBBASE}/${CGIDIR} # # The orphan list contains sources specified in DOCS that there # is no transform rule for. We start out with all of them, and # each rule below removes the ones it knows about. If any are # left over at the end, the user is warned about them. # ORPHANS:= ${DOCS} COPY= -C ################################################################## # Transformation rules ### # file.xml --> file.html # # Generate HTML from Docbook Website XML .SUFFIXES: .xml .html .txt GENDOCS+= ${DOCS:M*.html:S/.html$/.txt/g} GENDOCS+= ${DOCS:M*.xml:S/.xml$/.html/g} ORPHANS:= ${ORPHANS:N*.xml} .xml.html: ${XMLDEPS} @${ECHO} "[xsltproc] ${.IMPSRC} -> ${.TARGET}" @(ulimit -d 800000 && ${XSLTPROC} ${XSLTPROCOPTS} --stringparam autolayout-file ${AUTOLAYOUTFILE} -o ${.TARGET} ${XSLFILE} ${.IMPSRC}) .html.txt: @${ECHO} "[html2txt] ${.IMPSRC} -> ${.TARGET}" @${HTML2TXT} ${HTML2TXTOPTS} ${.IMPSRC} > ${.TARGET} ### # file.list --> file.html # # Generate HTML from old LIST format files .SUFFIXES: .data .list .html GENDOCS+= ${LISTDOCS:M*.html:S/.html$/.txt/g} GENDOCS+= ${LISTDOCS:M*.list:S/.list$/.html/g} ORPHANS:= ${ORPHANS:N*.list} .list.html: @${ECHO} "[list2html] ${.IMPSRC} -> ${.TARGET}" @${LIST2HTML} ${LIST2HTMLOPTS} ${.IMPSRC} ${.TARGET} ################################################################## # Targets # # If no target is specified, .MAIN is made # .MAIN: all # # Build most everything # all: pre-all ${COOKIE} orphans ${GENDOCS} ${DATA} ${LOCAL} ${CGI} _PROGSUBDIR # # Make sure autolayout.xml is up-to-date first # pre-all: ${AUTOLAYOUTFILE} ${WEB_PREFIX}/gallery/sites.xml .if defined(AUTOLAYOUTDIR) autolayout.xml: ${AUTOLAYOUTFILE} ${LAYOUTFILE} .endif ${AUTOLAYOUTFILE}: ${LAYOUTFILE} .if defined(AUTOLAYOUTDIR) @(cd gallery && ${MAKE} sites.xml) @${ECHO} "[xsltproc] layout.xml -> autolayout.xml" @${XSLTPROC} --nonet -o ${.TARGET}.tmp \ ${WEB_PREFIX}/share/xsl/autolayout.xsl \ ${LAYOUTFILE} @${XMLLINT} --xinclude --nonet --noent --nsclean --noxincludenode \ ${.TARGET}.tmp \ | ${GREP} -v '!ENTITY' > ${.TARGET} \ || (${RM} -f ${.TARGET}.tmp && false) .if !defined(DEBUG) @${RM} -f ${.TARGET}.tmp .endif CLEANFILES+= ${AUTOLAYOUTFILE} ${AUTOLAYOUTFILE}.tmp .else @${ECHO} "htdocs/layout.xml has changed - rebuilding htdocs/autolayout.xml..." @(cd ${WEB_PREFIX} && ${MAKE} autolayout.xml) .endif spellcheck: .for _entry in ${GENDOCS} @echo "Spellcheck ${_entry}" @${HTML2TXT} ${HTML2TXTOPTS} ${.CURDIR}/${_entry} | ${ISPELL} ${ISPELLOPTS} .endfor # # Warn about anything in DOCS that has no translation # .if !empty(ORPHANS) orphans: @${ECHO} "Warning! I don't know what to do with: ${ORPHANS}" .else orphans: .endif # # Clean things up # .if !target(clean) clean: _PROGSUBDIR .if defined(DIRS_TO_CLEAN) && !empty(DIRS_TO_CLEAN) .for dir in ${DIRS_TO_CLEAN} cd ${.CURDIR}/${dir}; ${MAKE} clean .endfor .endif ${RM} -f Errs errs mklog ${GENDOCS} ${LOCAL} ${CLEANFILES} .endif # # Really clean things up # .if !target(cleandir) cleandir: clean _PROGSUBDIR ${RM} -f ${.CURDIR}/tags .depend cd ${.CURDIR}; ${RM} -rf obj .endif # # Install targets: before, real, and after. # .if !target(install) .if !target(beforeinstall) beforeinstall: .endif .if !target(afterinstall) afterinstall: .endif INSTALL_WEB?= \ ${INSTALL} ${COPY} ${INSTALLFLAGS} -o ${WEBOWN} -g ${WEBGRP} -m ${WEBMODE} INSTALL_CGI?= \ ${INSTALL} ${COPY} ${INSTALLFLAGS} -o ${CGIOWN} -g ${CGIGRP} -m ${CGIMODE} _ALLINSTALL+= ${GENDOCS} ${DATA} ${LOCAL} realinstall: ${COOKIE} ${_ALLINSTALL} ${CGI} _PROGSUBDIR .if !empty(_ALLINSTALL) @${MKDIR} -p ${DOCINSTALLDIR} .for entry in ${_ALLINSTALL} .if exists(${.CURDIR}/${entry}) ${INSTALL_WEB} ${.CURDIR}/${entry} ${DOCINSTALLDIR} .else ${INSTALL_WEB} ${entry} ${DOCINSTALLDIR} .endif .endfor .if defined(INDEXLINK) && !empty(INDEXLINK) cd ${DOCINSTALLDIR}; ${LN} -fs ${INDEXLINK} index.html .endif .endif .if defined(CGI) && !empty(CGI) @${MKDIR} -p ${CGIINSTALLDIR} .for entry in ${CGI} ${INSTALL_CGI} ${.CURDIR}/${entry} ${CGIINSTALLDIR} .endfor .endif .if defined(DOCSUBDIR) && !empty(DOCSUBDIR) .for entry in ${DOCSUBDIR} @${MKDIR} -p ${DOCINSTALLDIR}/${entry} .endfor .endif # Set up install dependencies so they happen in the correct order. install: afterinstall afterinstall: realinstall2 realinstall: beforeinstall realinstall2: realinstall .endif # # This recursively calls make in subdirectories. # #SUBDIR+=${DOCSUBDIR} _PROGSUBDIR: .USE .if defined(SUBDIR) && !empty(SUBDIR) .for entry in ${SUBDIR} @${ECHO} "===> ${DIRPRFX}${entry}" @cd ${.CURDIR}/${entry}; \ ${MAKE} ${.TARGET:S/realinstall/install/:S/.depend/depend/} \ DIRPRFX=${DIRPRFX}${entry}/ .endfor .endif .if defined(DOCSUBDIR) && !empty(DOCSUBDIR) .for entry in ${DOCSUBDIR} @${ECHO} "===> ${DIRPRFX}${entry}" @if [ \( "${WEBDIR}" = "data" -a "${entry}" = "handbook" \) -o "${entry}" = "docproj-primer" ]; then \ cd ${.CURDIR}/${entry}; \ ${MAKE} ${.TARGET:S/realinstall/install/:S/.depend/depend/} \ DIRPRFX=${DIRPRFX}${entry}/ ${PARAMS} \ FORMATS="txt html html-split"; \ elif [ "${WEBDIR}" = "data/ja" -a "${entry}" = "handbook" ]; then \ cd ${.CURDIR}/${entry}; \ ${MAKE} ${.TARGET:S/realinstall/install/:S/.depend/depend/} \ DIRPRFX=${DIRPRFX}${entry}/ ${PARAMS} \ FORMATS="html html-split"; \ else \ cd ${.CURDIR}/${entry}; \ ${MAKE} ${.TARGET:S/realinstall/install/:S/.depend/depend/} \ DIRPRFX=${DIRPRFX}${entry}/ ${PARAMS}; \ fi .endfor .endif # # cruft for generating linuxdoc stuff # .if defined (DOCSUBDIR) && !empty(DOCSUBDIR) FORMATS?= "html ps latin1 ascii" PARAMS= DESTDIR=${DESTDIR} DOCDIR=${WEBBASE}/${WEBDIR} PARAMS+= DOCOWN=${WEBOWN} DOCGRP=${WEBGRP} PARAMS+= FORMATS=${FORMATS} COPY="${COPY}" PARAMS+= SGMLOPTS="${SGMLOPTS}" .endif .include # THE END