📄 boostbook.jam
字号:
# Copyright (C) 2003 Doug Gregor. Permission to copy, use, modify,
# sell and distribute this software is granted provided this
# copyright notice appears in all copies. This software is provided
# "as is" without express or implied warranty, and with no claim as
# to its suitability for any purpose.
# This module defines rules to handle generation of documentation
# from BoostBook sources.
import "class" : new ;
import common ;
import errors ;
import targets ;
import feature ;
import generators ;
import print ;
import property ;
import property-set ;
import regex ;
import scanner ;
import sequence ;
import make ;
import type ;
import modules path project ;
import xsltproc : xslt xslt-dir ;
feature.feature format : html onehtml man pdf ps docbook fo tests
: incidental implicit composite ;
type.register DTDXML : dtdxml ;
type.register XML : xml : : main ;
type.register BOOSTBOOK : boostbook : XML ;
type.register DOCBOOK : docbook : XML ;
type.register HTML : html ;
type.register FO : fo : XML ;
type.register PDF : pdf ;
type.register PS : ps ;
type.register XSLT : xsl : XML ;
type.register HTMLDIR ;
type.register MANPAGES ;
type.register TESTS : tests ;
generators.register-standard boostbook.dtdxml-to-boostbook : DTDXML : XML ;
generators.register-standard boostbook.boostbook-to-docbook : XML : DOCBOOK ;
generators.register-standard boostbook.boostbook-to-tests : XML : TESTS ;
generators.register-standard boostbook.docbook-to-onehtml : DOCBOOK : HTML ;
generators.register-standard boostbook.docbook-to-htmldir : DOCBOOK : HTMLDIR ;
generators.register-standard boostbook.docbook-to-manpages : DOCBOOK : MANPAGES ;
generators.register-standard boostbook.docbook-to-fo : DOCBOOK : FO ;
# Initialize BoostBook support. The parameters are:
# docbook-xsl-dir: The DocBook XSL stylesheet directory. If not provided,
# we use DOCBOOK_XSL_DIR from the environment (if available). Otherwise,
# we let the XML processor load the stylesheets remotely.
#
# docbook-dtd-dir: The DocBook DTD directory. If not provided, we use
# DOCBOOK_DTD_DIR From the environment (if available). Otherwise, we let
# the XML processor load the DTD remotely.
rule init ( docbook-xsl-dir ? : docbook-dtd-dir ? )
{
if ! $(docbook-xsl-dir)
{
docbook-xsl-dir = [ modules.peek : DOCBOOK_XSL_DIR ] ;
}
if ! $(docbook-dtd-dir)
{
docbook-dtd-dir = [ modules.peek : DOCBOOK_DTD_DIR ] ;
}
if ! $(.initialized)
{
$(.initialized) = true ;
if $(docbook-xsl-dir)
{
.docbook-xsl-dir = [ path.make $(docbook-xsl-dir) ] ;
}
if $(docbook-dtd-dir)
{
.docbook-dtd-dir = [ path.make $(docbook-dtd-dir) ] ;
}
local boost-root = [ path.make [ modules.peek : BOOST_ROOT ] ] ;
local boost-build-root = [
sequence.transform path.make : [ modules.peek : BOOST_BUILD_PATH ]
] ;
local search-dirs = [ path.join $(boost-root) tools boostbook ]
$(boost-build-root)/../boostbook ;
local native-search-dirs = [
sequence.transform path.native : $(search-dirs)
] ;
local boostbook-xsl-dir = [ GLOB $(native-search-dirs) : xsl ] ;
local boostbook-dtd-dir = [ GLOB $(native-search-dirs) : dtd ] ;
.boostbook-xsl-dir = [ path.make $(boostbook-xsl-dir[1]) ] ;
.boostbook-dtd-dir = [ path.make $(boostbook-dtd-dir[1]) ] ;
if ! $(.boostbook-xsl-dir) || ! $(.boostbook-dtd-dir)
{
errors.error
couldn't find BoostBook xsl or dtd directories;
: please set \"BOOST_ROOT\" variable to the root directory of
your boost installation. Searched in:
: $(search-dirs:J="
") ;
}
# Add trailing slash since some other code
# uses :B modifier to add last element, and fails
# without trailing slash. The code really should be fixed,
# but not now.
.boostbook-xsl-dir = $(.boostbook-xsl-dir)/ ;
.boostbook-dtd-dir = $(.boostbook-dtd-dir)/ ;
}
}
rule xsl-dir
{
return $(.boostbook-xsl-dir) ;
}
rule dtd-dir
{
return $(.boostbook-dtd-dir) ;
}
rule docbook-xsl-dir
{
return $(.docbook-xsl-dir) ;
}
rule docbook-dtd-dir
{
return $(.docbook-dtd-dir) ;
}
rule dtdxml-to-boostbook ( target : source : properties * )
{
xslt $(target) : $(source) "$(.boostbook-xsl-dir)/dtd/dtd2boostbook.xsl"
: $(properties) ;
}
rule boostbook-to-docbook ( target : source : properties * )
{
local native-path = [ path.native $(.boostbook-xsl-dir) ] ;
local stylesheet = $(native-path:B=docbook:S=.xsl) ;
xslt $(target) : $(source) $(stylesheet) : $(properties) ;
}
rule docbook-to-onehtml ( target : source : properties * )
{
local native-path = [ path.native $(.boostbook-xsl-dir) ] ;
local stylesheet = $(native-path:B=html-single:S=.xsl) ;
xslt $(target) : $(source) $(stylesheet) : $(properties) ;
}
rule docbook-to-htmldir ( target : source : properties * )
{
local native-path = [ path.native $(.boostbook-xsl-dir) ] ;
local stylesheet = $(native-path:B=html:S=.xsl) ;
xslt-dir $(target) : $(source) $(stylesheet) : $(properties) : html ;
}
rule docbook-to-manpages ( target : source : properties * )
{
local native-path = [ path.native $(.boostbook-xsl-dir) ] ;
local stylesheet = $(native-path:B=manpages:S=.xsl) ;
xslt-dir $(target) : $(source) $(stylesheet) : $(properties) : man ;
}
rule docbook-to-fo ( target : source : properties * )
{
local native-path = [ path.native $(.boostbook-xsl-dir) ] ;
local stylesheet = $(native-path:B=fo:S=.xsl) ;
xslt $(target) : $(source) $(stylesheet) : $(properties) ;
}
class xml-catalog-action : action
{
import boostbook ;
import print ;
rule __init__ ( target : property-set ? : catalog-entries * )
{
action.__init__ $(target) : : generate-xml-catalog : $(property-set) ;
}
rule actualize ( )
{
if ! $(self.actualized)
{
self.actualized = true ;
local actual = [ $(self.targets[1]).actualize ] ;
local text = "<?xml version=\"1.0\"?>" ;
text += "<!DOCTYPE catalog " ;
text += " PUBLIC \"-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN\"" ;
text += " \"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd\">" ;
text += "<catalog xmlns=\"urn:oasis:names:tc:entity:xmlns:xml:catalog\">" ;
# BoostBook DTD catalog entry
local boostbook-dtd-dir = [ boostbook.dtd-dir ] ;
text += " <rewriteURI uriStartString=\"http://www.boost.org/tools/boostbook/dtd/\" rewritePrefix=\"file://$(boostbook-dtd-dir)/\"/>" ;
local docbook-xsl-dir = [ boostbook.docbook-xsl-dir ] ;
if ! $(docbook-xsl-dir)
{
ECHO "BoostBook warning: no DocBook XSL directory specified." ;
ECHO " If you have the DocBook XSL stylesheets installed, please " ;
ECHO " set DOCBOOK_XSL_DIR to the stylesheet directory on either " ;
ECHO " the command line (via -sDOCBOOK_XSL_DIR=...) or in a " ;
ECHO " Boost.Jam configuration file. The DocBook XSL stylesheets " ;
ECHO " are available here: http://docbook.sourceforge.net/ " ;
ECHO " Stylesheets will be downloaded on-the-fly (very slow!) " ;
}
else
{
text += " <rewriteURI uriStartString=\"http://docbook.sourceforge.net/release/xsl/current/\" rewritePrefix=\"file://$(docbook-xsl-dir)/\"/>" ;
}
local docbook-dtd-dir = [ boostbook.docbook-dtd-dir ] ;
if ! $(docbook-dtd-dir)
{
ECHO "BoostBook warning: no DocBook DTD directory specified." ;
ECHO " If you have the DocBook DTD installed, please set " ;
ECHO " DOCBOOK_DTD_DIR to the DTD directory on either " ;
ECHO " the command line (via -sDOCBOOK_DTD_DIR=...) or in a " ;
ECHO " Boost.Jam configuration file. The DocBook DTD is available " ;
ECHO " here: http://www.oasis-open.org/docbook/xml/4.2/index.shtml" ;
ECHO " The DTD will be downloaded on-the-fly (very slow!) " ;
}
else
{
text += " <rewriteURI uriStartString=\"http://www.oasis-open.org/docbook/xml/4.2/\" rewritePrefix=\"file://$(docbook-dtd-dir)/\"/>" ;
}
text += "</catalog>" ;
print.output $(actual) ;
print.text $(text) : true ;
}
}
}
class boostbook-target-class : basic-target
{
import feature ;
import virtual-target ;
import generators ;
rule __init__ ( name : project : sources * : requirements *
: default-build * : catalog-entries * )
{
basic-target.__init__ $(name) : $(project) : $(sources) : $(requirements)
: $(default-build) ;
self.catalog-entries = $(catalog-entries) ;
}
rule construct ( source-targets * : property-set )
{
local path = [ project.attribute $(self.project) location ] ;
local catalog = [ new file-target catalog : XML : $(self.project) ] ;
$(catalog).action [ new xml-catalog-action $(catalog) : $(property-set)
: $(self.catalog-entries) ] ;
$(catalog).set-path $(path) ;
catalog = [ virtual-target.register $(catalog) ] ;
local properties = [ $(property-set).raw ] ;
local format = [ feature.get-values <format> : $(properties) ] ;
local targets = $(catalog) ;
local type = none ;
local manifest ;
switch $(format)
{
case html :
{
type = HTMLDIR ;
manifest = HTML.manifest ;
}
case onehtml : type = HTML ;
case man :
{
type = MANPAGES ;
manifest = man.manifest ;
}
case docbook : type = DOCBOOK ;
case fo : type = FO ;
case pdf : type = PDF ;
case ps : type = PS ;
case tests : type = TESTS ;
}
if $(manifest)
{
local base-target = [ generators.construct $(self.project)
: DOCBOOK : $(property-set) : $(source-targets) ] ;
$(base-target).depends $(catalog) ;
local target = [ generators.construct $(self.project) $(manifest)
: $(type) : $(property-set) : $(base-target) ] ;
$(target).set-path $(format) ;
targets += $(target) ;
}
else {
local target = [ generators.construct $(self.project)
: $(type) : $(property-set) : $(source-targets) ] ;
if ! $(target)
{
errors.error "Cannot build documentation type '$(format)'" ;
}
else
{
$(target).depends $(catalog) ;
targets += $(target) ;
}
}
return $(targets) ;
}
}
rule boostbook ( target-name : sources * : requirements * : default-build * )
{
local project = [ CALLER_MODULE ] ;
targets.main-target-alternative
[ new boostbook-target-class $(target-name) : $(project)
: [ targets.main-target-sources $(sources) : $(target-name) ]
: [ targets.main-target-requirements $(requirements) : $(project) ]
: [ targets.main-target-default-build $(default-build) : $(project) ]
] ;
}
IMPORT $(__name__) : boostbook : : boostbook ;
#############################################################################
# Dependency scanners
#############################################################################
# XInclude scanner. Mostly stolen from c-scanner :)
# Note that this assumes an "xi" prefix for XIncludes. This isn't always the
# case for XML documents, but we'll assume it's true for anything we encounter.
class xinclude-scanner : scanner
{
import virtual-target ;
import path ;
import scanner ;
rule __init__ ( includes * )
{
scanner.__init__ ;
self.includes = $(includes) ;
}
rule pattern ( )
{
return "xi:include[ ]*href=\"([^\"]*)\"" ;
}
rule process ( target : matches * : binding )
{
local target_path = [ NORMALIZE_PATH $(binding:D) ] ;
NOCARE $(matches) ;
INCLUDES $(target) : $(matches) ;
SEARCH on $(matches) = $(target_path) $(self.includes:G=) ;
scanner.propagate $(__name__) : $(matches) : $(target) ;
}
}
scanner.register xinclude-scanner : xsl:path ;
type.set-scanner XML : xinclude-scanner ;
#############################################################################
# Testsuite handling
#############################################################################
rule boostbook-to-tests ( target : source : properties * )
{
local boost_root = [ modules.peek : BOOST_ROOT ] ;
local native-path =
[ path.native [ path.join $(.boostbook-xsl-dir) testing Jamfile ] ] ;
local stylesheet = $(native-path:S=.xsl) ;
xslt $(target) : $(source) $(stylesheet)
: $(properties) <xsl:param>boost.root=$(boost_root)
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -