2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-16 13:22:11 +00:00
Files
build/v2/tools/boostbook.jam
Vladimir Prus 7d48ebd981 Pass boundname of target to header scanning rule. This change was stealed
from Matt Armstrong's version of jam. Getting boundname this way is faster
than the way we used to have.

* jam_src/headers.c: The change itself.

* v2/build/scanner.jam
  (hdrrule): Accept third argument.

* v2/build/virtual-target.jam
  (binding, remember-binding): Remove.

* v2/tools/builtin.jam
  (c-scanner.process): Accept and use third argument.

* v2/tools/boostbook.jam: Likewise.


[SVN r21203]
2003-12-10 10:00:20 +00:00

394 lines
12 KiB
Plaintext

# 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)
;
}