# $Source$ # $Author: xmldoc $ # $Date: 2008-03-03 01:20:29 -0800 (Mon, 03 Mar 2008) $ # $Revision: 7787 $ # vim: number # # ----------------------------------------------------------------- # ** Makefile.DocBook -- generate output from DocBook sources ** # ----------------------------------------------------------------- # # This file is part of the DocBook Project XSL Stylesheet # distribution. # # See http://docbook.sourceforge.net/release/xsl/current/ # for copyright and other information. # DOCBOOK_OUTPUT_FORMATS is the default set of targets (output # formats) that get built when you type "make" without any targets # explicitly specified. To generate a different set of output # formats, change the value of DOCBOOK_OUTPUT_FORMATS here or set # it in your environment; for example: # # set DOCBOOK_OUTPUT_FORMATS="html pdf"; export DOCBOOK_OUTPUT_FORMATS # # Of course by explicitly specifying particular targets when you # invoke "make", you can always override generation of the default # set of targets; for example: # # make html txt # # That would generate just HTML (unchunked) and plain-text output. # DOCBOOK_OUTPUT_FORMATS ?= xml man man-pdf chunk txt pdf # If you want XHTML output instead of HTML, set HTML_OR_XHTML to # 'xhtml' or just specify 'xhtml" in DOCBOOK_OUTPUT_FORMATS. ifeq ($(findstring xhtml,$(DOCBOOK_OUTPUT_FORMATS)),) HTML_OR_XHTML ?= html else HTML_OR_XHTML ?= xhtml endif # if your source is in asciidoc instead of DocBook, set # ASCII_OR_DOCBOOK to "ascii" ASCII_OR_DOCBOOK ?= docbook # ----------------------------------------------------------------- # *** TOOLS and other DEPENDENCIES *** # ----------------------------------------------------------------- # we use rmdir(1) to remove dirs we create for chunked HTML output RMDIR = rmdir # "-p" causes empty parent dirs to be deleted as well RMDIR_FLAGS = --ignore-fail-on-non-empty -p # possible values for PDF_MAKER are: # dblatex|fop|xep|xmlroff|passivetex PDF_MAKER = dblatex # possible values for TXT_MAKER are: # links|lynx|w3m|w3mmee TXT_MAKER = links TXT_MAKER_FLAGS = -dump # xsl XSLT = xsltproc XSLT_FLAGS = --xinclude # http://dblatex.sourceforge.net/ DBLATEX = dblatex DBLATEX_FLAGS = -b pdftex FOP = fop FOP_FLAGS = XEP = xep XEP_FLAGS = # http://xmlroff.sourceforge.net/ XMLROFF = xmlroff XMLROFF_FLAGS = PDFTEX = pdftex PDFTEX_FLAGS = # used by PassiveTeX PDFXMLTEX = pdfxmltex # http://docbook2x.sourceforge.net/ DB2X_XSLTPROC = db2x_xsltproc DB2X_XSLTPROC_FLAGS = DB2X_TEXIXML = db2x_texixml DB2X_TEXIXML_FLAGS = # we call the man(1) command to generate "foo.N.pdf" and # "foo.N.txt" output (see "man-pdf" & "man-txt" targets) MAN = man MAN_FLAGS = # The "ps2pdf" command is part of GhostSript (gs) distro. # It is just a wrapper script around gs that does this: # # gs -dCompatibilityLevel=1.2 -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \ # "-sOutputFile=$outfile" -dCompatibilityLevel=1.2 -c .setpdfwrite -f "$infile" # # Where, for example: $outfile = foo.pdf and $infile = foo.1 PS2PDF = ps2pdf PS2PDF_FLAGS = # asciidoc is used to generate DocBook XML from asciidoc source ASCIIDOC=asciidoc ASCIIDOCFLAGS= # asciidoc source seems to have DOS line endings, so we use # DOS2UNIX to be able to grep them correctly DOS2UNIX=dos2unix DOS2UNIXFLAGS= # The "col" command is needed for stripping backspaces and # underscores from man(1) output to get pure plain-text COL = col COL_FLAGS = # The "expand" command is needed for expanding tabs from files # generated from "man foo.1 | col -b" output # output to get pure plain-text EXPAND = expand EXPAND_FLAGS = # value of DOCBOOK_XSL should either be the canonical # (docbook.sourceforge.net) URL for the DocBook Project XSL # stylesheets OR it can be a local system path DOCBOOK_XSL = http://docbook.sourceforge.net/release/xsl/current # ----------------------------------------------------------------- # names of some DIRECTORIES and FILES we need # ----------------------------------------------------------------- # We create a tmp directory once per make invocation; it's needed # for holding a temporary copy of the custom DBLaTeX stylesheet # (because dblatex currently can't read a stylesheet from stdin) TMP ?= /tmp TMPNUM := $(shell echo $$$$) DOCBOOK_TMP := $(TMP)/docbook-make-$(TMPNUM) # MAN_MANIFEST_EXT is file extension added to individual manifest # files MAN_MANIFEST_EXT = manifest_man # HTML_MANIFEST_EXT is file extension added to HTML manifest files HTML_MANIFEST_EXT = manifest_html # BASEDIR_SUFFIX is a what you need to set if you want a suffix # added to the end of each "base.dir" we create while generating # chunked HTML output #BASEDIR_SUFFIX = -html #BASEDIR_SUFFIX = _html BASEDIR_SUFFIX = # ----------------------------------------------------------------- # assorted OPTIONS # ----------------------------------------------------------------- # HTML_STYLESHEET -> $html.stylesheet stylesheet param # http://docbook.sourceforge.net/snapshots/xsl/doc/html/html.stylesheet.html HTML_STYLESHEET = style.css # HTML_IMAGES -> $admon.graphics.path # http://docbook.sourceforge.net/snapshots/xsl/doc/html/admon.graphics.path.html HTML_IMAGES = images/ # HTML_IMAGES_EXT -> $admon.graphics.extension # http://docbook.sourceforge.net/snapshots/xsl/doc/html/admon.graphics.extension.html HTML_IMAGES_EXT = .png # use these to set params on the command-line # format is, e.g., HTML_PARAMS="--stringparam variablelist.as.table 1..." FO_PARAMS = HTML_PARAMS = MAN_PARAMS = # DBX_PARAMS is for dblatex(1); format uses "-p": # DBX_PARAMS="-p doc.publisher.show 1 -p term.breakline 1... DBX_PARAMS= # What file extension do you use for DocBook source files? DOCBOOK_FILE_EXTENSION = .xml # ----------------------------------------------------------------- # make(1) functions for building file lists # ----------------------------------------------------------------- # # the values of the following are used for determing what needs # to be built and/or cleaned up ifeq ($(ASCII_OR_DOCBOOK),docbook) SOURCE_FILES_DBK = $(wildcard *$(DOCBOOK_FILE_EXTENSION)) else SOURCE_FILES_DBK = $(foreach base,$(basename $(wildcard *.txt)),$(base)$(DOCBOOK_FILE_EXTENSION)) endif FILES_FO = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).fo) FILES_TXT = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).out.txt) FILES_PDF = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).pdf) FILES_LOG = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).log) FILES_OUT = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).out) FILES_AUX = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).aux) FILES_HTML = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).html) FILES_INFO = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).info) DIRS_CHUNK = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base)$(BASEDIR_SUFFIX)) LISTS_HTML = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).$(HTML_MANIFEST_EXT)) LISTS_MAN = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).$(MAN_MANIFEST_EXT)) FILES_CHNK = $(shell for manifest in $(LISTS_HTML); do if [ -f "$$manifest" ]; then cat $$manifest; fi done) FILES_MAN = $(shell for manifest in $(LISTS_MAN); do if [ -f "$$manifest" ]; then cat $$manifest; fi done) FILES_MANP = $(foreach base,$(FILES_MAN),$(base).man.pdf) FILES_MANT = $(foreach base,$(FILES_MAN),$(base).out.txt) DIRS_MAN = $(shell for file in $(FILES_MAN); do dirname $$file; done | uniq) # ----------------------------------------------------------------- # ** stylesheet for testing whether a file has a refentry # ----------------------------------------------------------------- REFENTRY_CHECK := \ \ \ \ true \ \ \ # ----------------------------------------------------------------- # ** Stylesheet Customization Layers ** # ----------------------------------------------------------------- # # for DBLaTeX DBX_CUSTOM := \ 0 \ 1 \ 0 \ 1 \ 1 \ left \ 1 \ \ docbook \ all \ "" \ WIDELABEL \ 0 \ [htbp] \ 0 \ 1 \ \ twoside \ , \ 1 \ Synopsis \ \ ansi \ 1 \ 0 \ java \ 0 \ # for FO output FO_CUSTOM := \ \ 1 \ A4 \ \ false \ 1 \ left \ 1 \ 0 \ 1 \ 1 \ 1 \ 1 \ 1 \ 1 \ \ blue \ \ \ \#E0E0E0 \ 4pt \ 4pt \ 4pt \ 4pt \ \ \ \ \ pt \ \ \ \ \ \ pt \ \ \ \ \ \ pt \ \ \ \ \ \ pt \ \ \ \ \ \ pt \ \ \ \ wrap \ \ \ \ \ pt \ \ \ # for single-file (X)HTML outpout HTML_CUSTOM := \ \ local.l10n.xml \ \ 1 \ 0 \ \ 0 \ $(HTML_STYLESHEET) \ 0 \ 1 \ # for chunked (X)HTML output CHNK_CUSTOM := \ \ 0 \ 1 \ 0 \ $(HTML_STYLESHEET) \ 1 \ $(HTML_IMAGES) \ $(HTML_IMAGES_EXT) \ \ 1 \ 1 \ yes \ 1 \ # for man-page output MAN_CUSTOM := \ \ \ \ man/ \ \ # ----------------------------------------------------------------- # ** TARGETS START HERE ** # ----------------------------------------------------------------- # prevents make from deleting, e.g. foo.1, after making foo.1.pdf # and foo.1.txt from it. .PRECIOUS: %.1 %.2 %.3 %.4 %.5 %.6 %.7 %.8 %.9 docbook: $(DOCBOOK_OUTPUT_FORMATS) xml: $(SOURCE_FILES_DBK) man: $(LISTS_MAN) # we can generate PDFs from man pages man-pdf: man $(MAKE) $(FILES_MANP) # we can generate plain text from man pages man-txt: man $(MAKE) $(FILES_MANT) html: $(FILES_HTML) chunk: $(LISTS_HTML) txt: $(FILES_TXT) pdf: $(FILES_PDF) info: $(FILES_INFO) # use the "debug" target to echo variables, etc., to # test/troubleshoot changes you make to this makefile debug: echo $(wildcard *$(DOCBOOK_FILE_EXTENSION)) echo $(ASCII_OR_DOCBOOK) echo $(SOURCE_FILES_DBK) # ----------------------------------------------------------------- # pattern rule to make DocBook refentry from asciidoc source # ----------------------------------------------------------------- %.1$(DOCBOOK_FILE_EXTENSION): %.1.txt $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $< %.2$(DOCBOOK_FILE_EXTENSION): %.2.txt $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $< %.3$(DOCBOOK_FILE_EXTENSION): %.3.txt $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $< %.4$(DOCBOOK_FILE_EXTENSION): %.4.txt $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $< %.5$(DOCBOOK_FILE_EXTENSION): %.5.txt $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $< %.6$(DOCBOOK_FILE_EXTENSION): %.6.txt $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $< %.7$(DOCBOOK_FILE_EXTENSION): %.7.txt $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $< %.8$(DOCBOOK_FILE_EXTENSION): %.8.txt $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $< %.9$(DOCBOOK_FILE_EXTENSION): %.9.txt $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $< # ----------------------------------------------------------------- # pattern rule to make DocBook article from asciidoc source # ----------------------------------------------------------------- %$(DOCBOOK_FILE_EXTENSION): %.txt export LINECOUNT1=$$(cat $< | $(DOS2UNIX) $(DOS2UNIXFLAGS) | egrep "^=+$$" | wc -l); \ export LINECOUNT2=$$(cat $< | $(DOS2UNIX) $(DOS2UNIXFLAGS) | egrep "^= $$" | wc -l); \ if [[ $$LINECOUNT1 > 1 || $$LINECOUNT2 > 1 ]]; then \ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d book -b docbook $<; \ else \ $(ASCIIDOC) $(ASCIIDOCFLAGS) -b docbook $<; \ fi # ----------------------------------------------------------------- # pattern rule for making (X)HTML and plain-text output # ----------------------------------------------------------------- %.html: %$(DOCBOOK_FILE_EXTENSION) @echo '$(HTML_CUSTOM)' | $(XSLT) $(XSLT_FLAGS) $(HTML_PARAMS) - $< > $@ %.out.txt: %.html $(TXT_MAKER) $(TXT_MAKER_FLAGS) ./$< \ | sed "s/^\(\s\+[0-9]\+\. \)file:\/\/.\+$$/\\1(local)/g" \ | egrep -v '^ file:///.+$$' \ > $@ # if DOCBOOK_OUTPUT_FORMATS does not contain "html", then we need # to remove the "intermediate" HTML files we used for generating # plain-text output ifeq ($(findstring html,$(DOCBOOK_OUTPUT_FORMATS)),) $(RM) $< endif # ----------------------------------------------------------------- # pattern rule for making chunked (X)HTML pages # ----------------------------------------------------------------- %.$(HTML_MANIFEST_EXT): %$(DOCBOOK_FILE_EXTENSION) @echo '$(CHNK_CUSTOM)' | $(XSLT) $(XSLT_FLAGS) $(HTML_PARAMS) \ --stringparam manifest $@ \ --stringparam base.dir $(basename $@)$(BASEDIR_SUFFIX)/ \ - $< # ----------------------------------------------------------------- # pattern rules for making FO and PDF stuff # ----------------------------------------------------------------- %.fo: %$(DOCBOOK_FILE_EXTENSION) @echo '$(FO_CUSTOM)' \ | $(XSLT) $(XSLT_FLAGS) $(FO_PARAMS) - $< > $@ ifeq ($(PDF_MAKER),dblatex) %.pdf: %$(DOCBOOK_FILE_EXTENSION) mkdir -p $(DOCBOOK_TMP) echo '$(DBX_CUSTOM)' > $(DOCBOOK_TMP)/dblatex.xsl -$(DBLATEX) $(DBLATEX_FLAGS)\ -p $(DOCBOOK_TMP)/dblatex.xsl \ -o $@ \ $< $(RM) -r $(DOCBOOK_TMP) endif %.pdf: %.fo ifeq ($(PDF_MAKER),) $(error No PDF_MAKER specified. Cannot make pdf) else ifeq ($(PDF_MAKER),xep) $(XEP) $(XEP_FLAGS) $< $@ else ifeq ($(PDF_MAKER),fop) $(FOP) $(FOP_FLAGS) $< $@ else ifeq ($(PDF_MAKER),xmlroff) $(XMLROFF) $(XMLROFF_FLAGS) $< -o $@ else ifeq ($(PDF_MAKER),passivetex) $(PDFTEX) $(PDFTEX_FLAGS) &$(PDFXMLTEX) $< @if [ `egrep Rerun $(basename $@).log | wc -l` -gt 0 ]; then \ $(PDFTEX) $(PDFTEX_FLAGS) &$(PDFXMLTEX) $< ; \ fi @if [ `egrep Rerun $(basename $@).log | wc -l` -gt 0 ]; then \ $(PDFTEX) $(PDFTEX_FLAGS) &$(PDFXMLTEX) $< ; \ fi $(RM) $(basename $@).log $(RM) $(basename $@).aux $(RM) $(basename $@).out else $(error I do not know how to make a PDF using "$(PDF_MAKER)") endif endif endif endif endif # ----------------------------------------------------------------- # pattern rules for making TeXinfo stuff # ----------------------------------------------------------------- %.txml: %$(DOCBOOK_FILE_EXTENSION) $(DB2X_XSLTPROC) $(DB2X_XSLTPROC_FLAGS) -s texi -o $@ $< %.texi: %.txml $(DB2X_TEXIXML) $(DB2X_TEXIXML_FLAGS) $< # the following is actually a built-in rule, but it's redefined # here just for the sake of clarity %.info: %.texi $(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@ # ----------------------------------------------------------------- # pattern rule for making man pages # ----------------------------------------------------------------- %.$(MAN_MANIFEST_EXT): %$(DOCBOOK_FILE_EXTENSION) @if [ "$(strip $(shell echo '$(REFENTRY_CHECK)' | $(XSLT) $(XSLT_FLAGS) - $<))" != "true" ]; then \ touch $@; \ else \ echo '$(MAN_CUSTOM)' \ | $(XSLT) $(XSLT_FLAGS) $(MAN_PARAMS) \ --stringparam man.output.manifest.filename $@ \ - $<; \ fi # ----------------------------------------------------------------- # pattern rule for enabling direct "make foo.1" to work # ----------------------------------------------------------------- %.1 %.2 %.3 %.4 %.5 %.6 %.7: %.xml $(MAKE) $(basename $<).$(MAN_MANIFEST_EXT) # ----------------------------------------------------------------- # pattern rules for making Postscript/PDF output from man pages # ----------------------------------------------------------------- %.1.man.ps: %.1 $(MAN) -l $(MAN_FLAGS) -Tps $< > $@ %.2.man.ps: %.2 $(MAN) -l $(MAN_FLAGS) -Tps $< > $@ %.3.man.ps: %.3 $(MAN) -l $(MAN_FLAGS) -Tps $< > $@ %.4.man.ps: %.4 $(MAN) -l $(MAN_FLAGS) -Tps $< > $@ %.5.man.ps: %.5 $(MAN) -l $(MAN_FLAGS) -Tps $< > $@ %.6.man.ps: %.6 $(MAN) -l $(MAN_FLAGS) -Tps $< > $@ %.7.man.ps: %.7 $(MAN) -l $(MAN_FLAGS) -Tps $< > $@ %.8.man.ps: %.8 $(MAN) -l $(MAN_FLAGS) -Tps $< > $@ %.9.man.ps: %.9 $(MAN) -l $(MAN_FLAGS) -Tps $< > $@ # ----------------------------------------------------------------- # pattern rule for converting Postscript to PDF # ----------------------------------------------------------------- %.pdf: %.ps $(PS2PDF) $(PS2PDF_FLAGS) $< # ----------------------------------------------------------------- # pattern rules for making plain-text output from man pages # ----------------------------------------------------------------- %.1.out.txt: %.1 $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@ %.2.out.txt: %.2 $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@ %.3.out.txt: %.3 $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@ %.4.out.txt: %.4 $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@ %.5.out.txt: %.5 $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@ %.6.out.txt: %.6 $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@ %.7.out.txt: %.7 $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@ %.8.out.txt: %.8 $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@ %.9.out.txt: %.9 $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@ # ----------------------------------------------------------------- # target(s) for cleaning up the mess # ----------------------------------------------------------------- clean: ifneq ($(FILES_TXT),) $(RM) $(FILES_TXT) endif ifneq ($(FILES_PDF),) $(RM) $(FILES_PDF) endif ifneq ($(FILES_FO),) $(RM) $(FILES_FO) endif ifneq ($(FILES_LOG),) $(RM) $(FILES_LOG) endif ifneq ($(FILES_OUT),) $(RM) $(FILES_OUT) endif ifneq ($(FILES_AUX),) $(RM) $(FILES_AUX) endif ifneq ($(FILES_HTML),) $(RM) $(FILES_HTML) endif ifneq ($(FILES_CHNK),) $(RM) $(FILES_CHNK) endif ifneq ($(FILES_MAN),) $(RM) $(FILES_MAN) endif ifneq ($(FILES_MANT),) $(RM) $(FILES_MANT) endif ifneq ($(FILES_MANP),) $(RM) $(FILES_MANP) endif ifneq ($(FILES_INFO),) $(RM) $(FILES_INFO) endif ifneq ($(DIRS_CHUNK),) for dir in $(DIRS_CHUNK); do \ if [ -d "$$dir" ]; then \ $(RMDIR) $(RMDIR_FLAGS) $$dir; \ fi \ done endif ifneq ($(DIRS_MAN),) ifneq ($(DIRS_MAN),.) for dir in $(DIRS_MAN); do \ if [ -d "$$dir" ]; then \ $(RMDIR) $(RMDIR_FLAGS) $$dir; \ fi \ done endif endif ifneq ($(LISTS_MAN),) $(RM) $(LISTS_MAN) endif ifneq ($(LISTS_HTML),) $(RM) $(LISTS_HTML) endif ifneq ($(ASCII_OR_DOCBOOK),docbook) $(RM) -i $(SOURCE_FILES_DBK) endif