⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boostbook.jam

📁 C++的一个好库。。。现在很流行
💻 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 project ;
import property-set ;
import regex ;
import scanner ;
import sequence ;
import make ;
import type ;
import modules path project ;
import build-system ;

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 ;
type.register BOOSTBOOK : boostbook : XML ;
type.register DOCBOOK : docbook : XML ; 
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 ;
# Artificial target type, used to require invocation of top-level
# BoostBook generator.
type.register BOOSTBOOK_MAIN ;


# 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.
#
#   boost-book-dir: The BoostBook directory with the DTD and XSL subdirs.
#
rule init ( docbook-xsl-dir ? : docbook-dtd-dir ? : boostbook-dir ? )
{

  docbook-xsl-dir ?= [ modules.peek : DOCBOOK_XSL_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 = [ build-system.location ] ;
    local search-dirs = $(boostbook-dir) [ 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 ] ;
    }
    if $(boostbook-xsl-dir)
    {        
        .boostbook-xsl-dir = [ path.make $(boostbook-xsl-dir[1]) ] ;
    }
    if $(boostbook-dtd-dir)
    {        
        .boostbook-dtd-dir = [ path.make $(boostbook-dtd-dir[1]) ] ;
    }
    
    
    if ! $(.boostbook-xsl-dir) || ! $(.boostbook-dtd-dir)
    {
        errors.warning
          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) ;
}

rule generate-xml-catalog ( target : sources * : properties * )
{
  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 $(target) ;
  print.text $(text) : true ;          
}

class boostbook-generator : generator
{
    import feature ;
    import virtual-target ;
    import generators ;
      
    
    rule __init__ ( * : * )
    {
        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
    }
    
    rule run ( project name ? : property-set : sources * : multiple ? )
    {
        # Generate the catalog
        local catalog = [ new file-target catalog 
                            : XML 
                            : $(project)
                            : [ new action 
                                  : boostbook.generate-xml-catalog 
                                  : $(property-set) ] ] ;

        #  catalog = [ virtual-target.register $(catalog) ] ;
       
        # Add the catalog to the property set
        local catalog-path = [ $(catalog).path ] ;
        catalog-path = "$(catalog-path)/" ;
        local catalog-file = $(catalog-path:G=<catalog>:B=catalog:S=.xml) ;
        property-set = [ $(property-set).add-raw $(catalog-file) ] ;

        # local targets = $(catalog) ;

        local type = none ;
        local manifest ; 
        local format = [ $(property-set).get <format> ] ;
        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)
        {
            # Create DOCBOOK file from BOOSTBOOK sources.
            local base-target = [ generators.construct $(project) 
              : DOCBOOK : $(property-set) : $(sources) ] ;
            base-target = $(base-target[2]) ;
            $(base-target).depends $(catalog) ;
            
            # Generate HTML/PDF/PS from DOCBOOK.
            local target = [ generators.construct $(project) $(manifest)
              : $(type) : $(property-set) : $(base-target) ] ;
            $(target[2]).set-path $(format) ;
            $(target[2]).depends $(catalog) ;            

            targets += $(target[2]) ;
        }
        else {
            local target = [ generators.construct $(project)
              : $(type) : $(property-set) : $(sources) ] ;
            
            if ! $(target)
            {
                errors.error "Cannot build documentation type '$(format)'" ;
            }
            else 
            {
                $(target[2]).depends $(catalog) ;
                targets += $(target[2]) ;
            }
        }
        
        return $(targets) ;
    }
}

generators.register [ new boostbook-generator boostbook.main : : BOOSTBOOK_MAIN ] ;

rule boostbook ( target-name : sources * : requirements * : default-build * )
{ 
  local project = [ project.current ] ;
    
  targets.main-target-alternative 
    [ new typed-target $(target-name) : $(project) : BOOSTBOOK_MAIN
        : [ 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) 
                 ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -