mirror of
https://github.com/boostorg/build.git
synced 2026-02-16 13:22:11 +00:00
The used 'CALLER_MODULE' to determine the project where the main target is to be declared, which did not work if the rule is called from another module. Thanks to Zbynek Winkler for the bug report. * build/project.jam (current): New rule * test/wrapper.py: New test * other files: Use 'project.current'. [SVN r22569]
412 lines
13 KiB
Plaintext
412 lines
13 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 project ;
|
|
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 ;
|
|
|
|
|
|
# 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 = [ modules.peek : BOOST_ROOT ] ;
|
|
if $(boost-root)
|
|
{
|
|
boost-root = [ path.make $(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 ;
|
|
|
|
if --debug-configuration in [ modules.peek : ARGV ]
|
|
{
|
|
ECHO "notice: Boost.Book: searching XSLS/DTD in" ;
|
|
ECHO "notice:" [ sequence.transform path.native : $(search-dirs) ] ;
|
|
}
|
|
local boostbook-xsl-dir ;
|
|
for local dir in $(search-dirs) {
|
|
boostbook-xsl-dir += [ path.glob $(dir) : xsl ] ;
|
|
}
|
|
local boostbook-dtd-dir ;
|
|
for local dir in $(search-dirs) {
|
|
boostbook-dtd-dir += [ path.glob $(dir) : 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)/ ;
|
|
|
|
# Register generators only if we've were called via "using boostbook ; "
|
|
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 ;
|
|
|
|
# The same about Jamfile main target rules.
|
|
IMPORT $(__name__) : boostbook : : boostbook ;
|
|
}
|
|
}
|
|
|
|
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 = [ project.current ] ;
|
|
|
|
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) ]
|
|
] ;
|
|
}
|
|
|
|
#############################################################################
|
|
# 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)
|
|
;
|
|
}
|