Changeset 63913


Ignore:
Timestamp:
Jul 12, 2010, 7:37:43 AM (8 years ago)
Author:
Vladimir Prus
Message:

Merge from trunk

Location:
branches/release/tools/build/v2
Files:
18 edited
8 copied

Legend:

Unmodified
Added
Removed
  • branches/release/tools/build/v2

  • branches/release/tools/build/v2/build-system.jam

    r61419 r63913  
    922922                [ modules.peek build-system : .out-xml ] ;
    923923        }
     924       
     925        IMPORT
     926            build-system :
     927            out-xml.collect
     928            out-xml.generate-action
     929            : :
     930            build-system.out-xml.collect
     931            build-system.out-xml.generate-action
     932            ;
    924933    }
    925934
     
    9991008    }
    10001009}
    1001 
  • branches/release/tools/build/v2/contrib/boost.jam

    r47443 r63913  
    6060import common ;
    6161import option ;
     62import numbers ;
    6263
    6364.boost.auto_config = [ property-set.create <layout>system ] ;
     
    115116# of the boost library. If the 'version' parameter is omitted either
    116117# the configured default (first in config files) is used or an auto
    117 # configuration will be attemted.
     118# configuration will be attempted.
    118119#
    119120rule use-project
     
    191192
    192193    project boost
    193         : usage-requirements <include>$(inc)
     194        : usage-requirements <include>$(inc) <define>BOOST_ALL_NO_LIB
    194195        : requirements <tag>@tag_std <search>$(lib)
    195196        ;
    196197
    197198    alias headers ;
     199    lib date_time        : : : :
     200        <link>shared:<define>BOOST_DATE_TIME_DYN_LINK ;
     201    lib filesystem       : : : :
     202        <link>shared:<define>BOOST_FILE_SYSTEM_DYN_LINK ;
     203    lib graph            : : : :
     204        <link>shared:<define>BOOST_GRAPH_DYN_LINK ;
     205    lib graph_parallel   : : : :
     206        <link>shared:<define>BOOST_GRAPH_DYN_LINK ;
     207    lib iostreams        : : : :
     208        <link>shared:<define>BOOST_IOSTREAMS_DYN_LINK ;
     209    lib math_tr1         : : : :
     210        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
     211    lib math_tr1f         : : : :
     212        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
     213    lib math_tr1l        : : : :
     214        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
     215    lib math_c99         : : : :
     216        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
     217    lib math_c99f         : : : :
     218        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
     219    lib math_c99l        : : : :
     220        <link>shared:<define>BOOST_MATH_TR1_DYN_LINK ;
     221    lib mpi              : : : :
     222        <link>shared:<define>BOOST_MPI_DYN_LINK  ;   
    198223    lib program_options  : : : :
    199224        <link>shared:<define>BOOST_PROGRAM_OPTIONS_DYN_LINK ;
     225    lib python           : : : :
     226        <link>shared:<define>BOOST_PYTHON_DYN_LINK ;
     227    lib random           : : : :
     228        <link>shared:<define>BOOST_RANDOM_DYN_LINK ;
     229    lib regex            : : : :
     230        <link>shared:<define>BOOST_REGEX_DYN_LINK  ;
     231    lib serialization    : : : :
     232        <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK ;
     233    lib wserialization   : : : :
     234        <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK ;
     235    lib signals          : : : :
     236        <link>shared:<define>BOOST_SIGNALS_DYN_LINK  ;
     237    lib system           : : : :
     238        <link>shared:<define>BOOST_SYSTEM_DYN_LINK  ;
     239    lib unit_test_framework : : : :
     240        <link>shared:<define>BOOST_TEST_DYN_LINK  ;
     241    lib prg_exec_monitor : : : :
     242        <link>shared:<define>BOOST_TEST_DYN_LINK ;
     243    lib test_exec_monitor : : : :
     244        <link>shared:<define>BOOST_TEST_DYN_LINK ;
    200245    lib thread           : : : :
    201246        <link>shared:<define>BOOST_THREAD_DYN_DLL  ;
    202     lib iostreams        : : : :
    203         <link>shared:<define>BOOST_IOSTREAMS_DYN_LINK ;
    204247    lib wave             : : : :
    205248        <link>shared:<define>BOOST_WAVE_DYN_LINK  ;
    206     lib python           : : : :
    207         <link>shared:<define>BOOST_PYTHON_DYN_LINK ;
    208     lib serialization    : : : :
    209         <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK ;
    210     lib graph            : : : :
    211         <link>shared:<define>BOOST_GRAPH_DYN_LINK ;
    212     lib date_time        : : : :
    213         <link>shared:<define>BOOST_DATE_TIME_DYN_LINK ;
    214     lib test             : : : :
    215         <link>shared:<define>BOOST_TEST_DYN_LINK  ;
    216     lib regex            : : : :
    217         <link>shared:<define>BOOST_REGEX_DYN_LINK  ;
    218     lib filesystem       : : : :
    219         <link>shared:<define>BOOST_FILE_SYSTEM_DYN_LINK ;
    220     lib signals          : : : :
    221         <link>shared:<define>BOOST_SIGNALS_DYN_LINK  ;
    222     lib function_types ;
    223     lib mpi              : : : :
    224         <link>shared:<define>BOOST_MPI_DYN_LINK  ;
    225     lib system           : : : :
    226         <link>shared:<define>BOOST_SYSTEM_DYN_LINK  ;
    227249}
    228250
     
    245267        name = lib$(name) ;
    246268    }
    247     if $(.layout) = versioned
    248     {
    249         version = $(.version_tag) ;
    250         toolset = <toolset> ;
    251     }
    252 
     269
     270    local result ;
     271    if $(.layout) = system
     272    {
     273        local version = [ MATCH ^([0-9]+)_([0-9]+) : $(.version_tag) ] ;
     274        if $(version[1]) = "1" && [ numbers.less $(version[2]) 39 ]
     275        {
     276            result = [ tag_tagged $(name) : $(type) : $(property-set) ] ;
     277        }
     278        else
     279        {
     280            result = [ tag_system $(name) : $(type) : $(property-set) ] ;
     281        }
     282    }
     283    else if $(.layout) = tagged
     284    {
     285        result = [ tag_tagged $(name) : $(type) : $(property-set) ] ;
     286    }
     287    else if $(.layout) = versioned
     288    {
     289        result = [ tag_versioned $(name) : $(type) : $(property-set) ] ;
     290    }
     291    else
     292    {
     293        errors.error "Missing layout" ;
     294    }
     295
     296    return $(result) ;
     297}
     298
     299rule tag_system ( name : type ? : property-set )
     300{
    253301    return [ common.format-name
    254         <base> $(toolset) <threading> <runtime> -$(version) -$(.build_id)
    255         : $(name) : $(type) : $(property-set) ] ;
    256 }
     302             <base>
     303             -$(.build_id)
     304             : $(name) : $(type) : $(property-set) ] ;
     305}
     306
     307rule tag_tagged ( name : type ? : property-set )
     308{
     309    return [ common.format-name
     310             <base> <threading> <runtime>
     311             -$(.build_id)
     312             : $(name) : $(type) : $(property-set) ] ;
     313}
     314
     315rule tag_versioned ( name : type ? : property-set )
     316{
     317    return [ common.format-name
     318             <base> <toolset> <threading> <runtime> -$(.version_tag)
     319             -$(.build_id)
     320             : $(name) : $(type) : $(property-set) ] ;
     321}
  • branches/release/tools/build/v2/doc/src/standalone.xml

    r57186 r63913  
    55<book xmlns:xi="http://www.w3.org/2001/XInclude"
    66      id="bbv2" last-revision="$Date$">
     7  <bookinfo>
     8    <copyright>
     9      <year>2006</year>
     10      <year>2007</year>
     11      <year>2008</year>
     12      <year>2009</year>
     13      <holder>Vladimir Prus</holder>
     14    </copyright>
     15
     16    <legalnotice>
     17      <para>Distributed under the Boost Software License, Version 1.0.
     18      (See accompanying file <filename>LICENSE_1_0.txt</filename> or copy at
     19      <ulink
     20      url="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</ulink>)
     21      </para>
     22    </legalnotice> 
     23  </bookinfo>
    724
    825  <title>Boost.Build V2 User Manual</title>
  • branches/release/tools/build/v2/doc/src/userman.xml

    r57186 r63913  
    55<part xmlns:xi="http://www.w3.org/2001/XInclude"
    66      id="bbv2" last-revision="$Date$">
     7  <partinfo>
     8    <copyright>
     9      <year>2006</year>
     10      <year>2007</year>
     11      <year>2008</year>
     12      <year>2009</year>
     13      <holder>Vladimir Prus</holder>
     14    </copyright>
     15
     16    <legalnotice>
     17      <para>Distributed under the Boost Software License, Version 1.0.
     18      (See accompanying file <filename>LICENSE_1_0.txt</filename> or copy at
     19      <ulink
     20      url="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</ulink>)
     21      </para>
     22    </legalnotice> 
     23  </partinfo>
    724
    825  <title>Boost.Build V2 User Manual</title>
  • branches/release/tools/build/v2/test/BoostBuild.py

    r61419 r63913  
    131131    def _failed(self, status=0):
    132132        if self.status is None:
    133             return None
    134         if os.WIFSIGNALED(status):
    135133            return None
    136134        return _status(self) != status
     
    459457            annotation("failure", '"%s" returned %d%s'
    460458                % (kw['program'], _status(self), expect))
    461 
    462             annotation("reason", "error returned by bjam")
     459           
     460            annotation("reason", "unexpected status returned by bjam")
    463461            self.fail_test(1)
    464462
  • branches/release/tools/build/v2/test/gcc_runtime.py

    r49353 r63913  
    2424""")
    2525
    26 t.run_build_system("runtime-link=static", status=1)
     26t.run_build_system("runtime-link=static")
    2727t.fail_test(string.find(t.stdout(),
    2828    "On gcc, DLL can't be build with '<runtime-link>static'") == -1)
  • branches/release/tools/build/v2/test/test_all.py

    r54978 r63913  
    202202          "using",
    203203          "wrapper",
    204           "wrong_project"
     204          "wrong_project",
     205          "exit_status",
    205206          ]
    206207
  • branches/release/tools/build/v2/tools

    • Property svn:mergeinfo deleted
  • branches/release/tools/build/v2/tools/boostbook-config.jam

    r49353 r63913  
    44
    55# Automatic configuration for BoostBook tools. To use, just import this module.
     6#
     7# This module is deprecated.
     8#   using boostbook ;
     9# with no arguments now suffices.
    610
    7 import os ;
    811import toolset : using ;
    912
    10 local docbook_xsl-path = [ modules.peek : DOCBOOK_XSL_DIR ] ;
    11 local docbook_dtd-path = [ modules.peek : DOCBOOK_DTD_DIR ] ;
    12 local boostbook-path = [ modules.peek : BOOSTBOOK_DIR ] ;
    13 if [ os.name ] = NT
    14 {
    15     # If installed by the Boost installer.
    16     local boost-dir = ;
    17     for local R in snapshot cvs 1.33.0
    18     {
    19         boost-dir += [ W32_GETREG
    20             "HKEY_LOCAL_MACHINE\\SOFTWARE\\Boost.org\\$(R)"
    21             : "InstallRoot" ] ;
    22     }
    23     # Plausible locations.
    24     local root = [ PWD ] ;
    25     while $(root) != $(root:D) { root = $(root:D) ; }
    26     docbook_xsl-path ?= [ GLOB "$(boost-dir)\\share" "$(root)Boost\\share" : docbook-xsl* ] ;
    27     docbook_dtd-path ?= [ GLOB "$(boost-dir)\\share" "$(root)Boost\\share" : docbook-xml* ] ;
    28     boostbook-path ?= [ GLOB "$(boost-dir)\\share" "$(root)Boost\\share" : boostbook* ] ;
    29    
    30     docbook_xsl-path = $(docbook_xsl-path[1]) ;
    31     docbook_dtd-path = $(docbook_dtd-path[1]) ;
    32     boostbook-path = $(boostbook-path[1]) ;
    33 }
    34 else
    35 {
    36     # Plausible locations.
    37     docbook_xsl-path ?= [ GLOB "/usr/local/share" "/usr/share" "/opt/share" : docbook-xsl* ] ;
    38     docbook_dtd-path ?= [ GLOB "/usr/local/share" "/usr/share" "/opt/share" : docbook-xml* ] ;
    39     boostbook-path ?= [ GLOB "/usr/local/share" "/usr/share" "/opt/share" : boostbook* ] ;
    40     # Ubuntu Linux
    41     docbook_xsl-path ?= [ GLOB "/usr/share/xml/docbook/stylesheet" : nwalsh ] ;
    42     docbook_dtd-path ?= [ GLOB "/usr/share/xml/docbook/schema/dtd" : 4.3 4.2 ] ;
    43    
    44     docbook_xsl-path = $(docbook_xsl-path[1]) ;
    45     docbook_dtd-path = $(docbook_dtd-path[1]) ;
    46     boostbook-path = $(boostbook-path[1]) ;
    47 }
    48 if $(docbook_xsl-path) && $(docbook_dtd-path)
    49 {
    50     if --debug-configuration in [ modules.peek : ARGV ]
    51     {
    52         ECHO "notice:" using boostbook ":" $(docbook_xsl-path) ":" $(docbook_dtd-path) ":" $(boostbook-path) ;
    53     }
    54     using boostbook : $(docbook_xsl-path) : $(docbook_dtd-path) : $(boostbook-path) ;
    55 }
     13using boostbook ;
  • branches/release/tools/build/v2/tools/boostbook.jam

    r54971 r63913  
    2323import sequence ;
    2424import make ;
     25import os ;
    2526import type ;
    2627import modules path project ;
     
    5758# Initialize BoostBook support. The parameters are:
    5859#   docbook-xsl-dir: The DocBook XSL stylesheet directory. If not provided,
    59 #     we use DOCBOOK_XSL_DIR from the environment (if available). Otherwise,
    60 #     we let the XML processor load the stylesheets remotely.
     60#     we use DOCBOOK_XSL_DIR from the environment (if available) or look in
     61#     standard locations. Otherwise, we let the XML processor load the
     62#     stylesheets remotely.
    6163#
    6264#   docbook-dtd-dir: The DocBook DTD directory. If not provided, we use
    63 #     DOCBOOK_DTD_DIR From the environment (if available). Otherwise, we let
    64 #     the XML processor load the DTD remotely.
     65#     DOCBOOK_DTD_DIR From the environment (if available) or look in
     66#     standard locations.  Otherwise, we let the XML processor load the
     67#     DTD remotely.
    6568#
    6669#   boost-book-dir: The BoostBook directory with the DTD and XSL subdirs.
     
    6972{
    7073
    71   docbook-xsl-dir ?= [ modules.peek : DOCBOOK_XSL_DIR ] ;
    72 
    73   docbook-dtd-dir ?= [ modules.peek : DOCBOOK_DTD_DIR ] ;
    74 
    7574  if ! $(.initialized)
    7675  {
    7776    .initialized = true ;
    78     if $(docbook-xsl-dir)
    79     {
    80       .docbook-xsl-dir = [ path.make $(docbook-xsl-dir) ] ;
    81     }
    82     if $(docbook-dtd-dir)
    83     {
    84       .docbook-dtd-dir = [ path.make $(docbook-dtd-dir) ] ;
    85     }
    86    
    87     local boost-root =  [ modules.peek : BOOST_ROOT ] ;
    88     if $(boost-root)
    89     {
    90         boost-root = [ path.make $(boost-root) ] ;
    91     }   
    92     local boost-build-root = [ build-system.location ] ;
    93     local search-dirs = $(boostbook-dir) [ path.join $(boost-root) tools boostbook ]
    94                         $(boost-build-root)/../../boostbook ;
    95    
    96    
    97     if --debug-configuration in [ modules.peek : ARGV ]
    98     {
    99         ECHO "notice: Boost.Book: searching XSLS/DTD in" ;
    100         ECHO "notice:" [ sequence.transform path.native : $(search-dirs) ] ;
    101     }   
    102     local boostbook-xsl-dir ;
    103     for local dir in $(search-dirs) {
    104         boostbook-xsl-dir += [ path.glob $(dir) : xsl ] ;
    105     }
    106     local boostbook-dtd-dir ;
    107     for local dir in $(search-dirs) {
    108         boostbook-dtd-dir += [ path.glob $(dir) : dtd ] ;
    109     }
    110     .boostbook-xsl-dir = $(boostbook-xsl-dir[1]) ;
    111     .boostbook-dtd-dir = $(boostbook-dtd-dir[1]) ;
    112    
    113    
    114     if ! $(.boostbook-xsl-dir) || ! $(.boostbook-dtd-dir)
    115     {
    116         errors.warning
    117           "couldn't find BoostBook xsl or dtd directories;"
    118         : please set \"BOOST_ROOT\" variable to the root directory of
    119         your boost installation.  Searched in:
    120           : $(search-dirs:J="
    121 ") ;
    122     }   
    123    
     77   
     78    find-tools $(docbook-xsl-dir) : $(docbook-dtd-dir) : $(boostbook-dir) ;
     79
    12480    # Register generators only if we've were called via "using boostbook ; "
    12581    generators.register-standard boostbook.dtdxml-to-boostbook : DTDXML : XML ;
     
    13894}
    13995
     96rule find-boost-in-registry ( keys * )
     97{
     98  local boost-root = ;
     99  for local R in $(keys)
     100  {
     101    local installed-boost = [ W32_GETREG
     102      "HKEY_LOCAL_MACHINE\\SOFTWARE\\$(R)"
     103      : "InstallRoot" ] ;
     104    if $(installed-boost)
     105    {
     106      boost-root += [ path.make $(installed-boost) ] ;
     107    }
     108  }
     109  return $(boost-root) ;
     110}
     111
     112rule find-tools ( docbook-xsl-dir ? : docbook-dtd-dir ? : boostbook-dir ? )
     113{
     114  docbook-xsl-dir ?= [ modules.peek : DOCBOOK_XSL_DIR ] ;
     115  docbook-dtd-dir ?= [ modules.peek : DOCBOOK_DTD_DIR ] ;
     116  boostbook-dir ?= [ modules.peek : BOOSTBOOK_DIR ] ;
     117
     118  # Look for the boostbook stylesheets relative to BOOST_ROOT
     119  # and Boost.Build.
     120  local boost-build-root = [ path.make [ build-system.location ] ] ;
     121  local boostbook-search-dirs = [ path.join $(boost-build-root) .. .. ] ;
     122
     123  local boost-root =  [ modules.peek : BOOST_ROOT ] ;
     124  if $(boost-root)
     125  {
     126    boostbook-search-dirs += [ path.join [ path.make $(boost-root) ] tools ] ;
     127  }
     128  boostbook-dir ?= [ path.glob $(boostbook-search-dirs) : boostbook* ] ;
     129
     130  # Try to find the tools in platform specific locations
     131  if [ os.name ] = NT
     132  {
     133    # If installed by the Boost installer.
     134    local boost-root = ;
     135
     136    local boost-installer-versions = snapshot cvs 1.33.0 ;
     137    local boost-consulting-installer-versions = 1.33.1 1.34.0 1.34.1 ;
     138    local boostpro-installer-versions =
     139        1.35.0 1.36.0 1.37.0 1.38.0 1.39.0 1.40.0 1.41.0 1.42.0
     140        1.43.0 1.44.0 1.45.0 1.46.0 1.47.0 1.48.0 1.49.0 1.50.0 ;
     141
     142    local old-installer-root = [ find-boost-in-registry Boost.org\\$(boost-installer-versions) ] ;
     143
     144    # Make sure that the most recent version is searched for first
     145    boost-root += [ sequence.reverse
     146      [ find-boost-in-registry
     147        Boost-Consulting.com\\$(boost-consulting-installer-versions)
     148        boostpro.com\\$(boostpro-installer-versions) ] ] ;
     149
     150    # Plausible locations.
     151    local root = [ PWD ] ;
     152    while $(root) != $(root:D) { root = $(root:D) ; }
     153    root = [ path.make $(root) ] ;
     154    local search-dirs = ;
     155    local docbook-search-dirs = ;
     156    for local p in $(boost-root) {
     157      search-dirs += [ path.join $(p) tools ] ;
     158    }
     159    for local p in $(old-installer-root)
     160    {
     161      search-dirs += [ path.join $(p) share ] ;
     162      docbook-search-dirs += [ path.join $(p) share ] ;
     163    }
     164    search-dirs += [ path.join $(root) Boost tools ] ;
     165    search-dirs += [ path.join $(root) Boost share ] ;
     166    docbook-search-dirs += [ path.join $(root) Boost share ] ;
     167
     168    docbook-xsl-dir ?= [ path.glob $(docbook-search-dirs) : docbook-xsl* ] ;
     169    docbook-dtd-dir ?= [ path.glob $(docbook-search-dirs) : docbook-xml* ] ;
     170    boostbook-dir ?= [ path.glob $(search-dirs) : boostbook* ] ;
     171  }
     172  else
     173  {
     174    # Plausible locations.
     175
     176    local share = /usr/local/share /usr/share /opt/share /opt/local/share ;
     177    local dtd-versions = 4.2 ;
     178
     179    docbook-xsl-dir ?= [ path.glob $(share) : docbook-xsl* ] ;
     180    docbook-xsl-dir ?= [ path.glob $(share)/sgml/docbook : xsl-stylesheets ] ;
     181    docbook-xsl-dir ?= [ path.glob $(share)/xsl : docbook* ] ;
     182
     183    docbook-dtd-dir ?= [ path.glob $(share) : docbook-xml* ] ;
     184    docbook-dtd-dir ?= [ path.glob $(share)/sgml/docbook : xml-dtd-$(dtd-versions)* ] ;
     185    docbook-dtd-dir ?= [ path.glob $(share)/xml/docbook : $(dtd-versions) ] ;
     186
     187    boostbook-dir ?= [ path.glob $(share) : boostbook* ] ;
     188
     189    # Ubuntu Linux
     190    docbook-xsl-dir ?= [ path.glob /usr/share/xml/docbook/stylesheet : nwalsh ] ;
     191    docbook-dtd-dir ?= [ path.glob /usr/share/xml/docbook/schema/dtd : $(dtd-versions) ] ;
     192  }
     193
     194  if $(docbook-xsl-dir)
     195  {
     196    .docbook-xsl-dir = [ path.make $(docbook-xsl-dir[1]) ] ;
     197  }
     198  if $(docbook-dtd-dir)
     199  {
     200    .docbook-dtd-dir = [ path.make $(docbook-dtd-dir[1]) ] ;
     201  }
     202
     203  if --debug-configuration in [ modules.peek : ARGV ]
     204  {
     205    ECHO "notice: Boost.Book: searching XSL/DTD in" ;
     206    ECHO "notice:" [ sequence.transform path.native : $(boostbook-dir) ] ;
     207  }   
     208  local boostbook-xsl-dir ;
     209  for local dir in $(boostbook-dir) {
     210    boostbook-xsl-dir += [ path.glob $(dir) : xsl ] ;
     211  }
     212  local boostbook-dtd-dir ;
     213  for local dir in $(boostbook-dir) {
     214    boostbook-dtd-dir += [ path.glob $(dir) : dtd ] ;
     215  }
     216  .boostbook-xsl-dir = $(boostbook-xsl-dir[1]) ;
     217  .boostbook-dtd-dir = $(boostbook-dtd-dir[1]) ;
     218
     219  if --debug-configuration in [ modules.peek : ARGV ]
     220  {
     221    if $(.docbook-xsl-dir)
     222    {
     223      ECHO "notice: Boost.Book: found docbook XSL stylesheets in:" [ path.native $(.docbook-xsl-dir) ] ;
     224    }
     225    if $(.docbook-dtd-dir)
     226    {
     227      ECHO "notice: Boost.Book: found docbook DTD in:" [ path.native $(.docbook-dtd-dir) ] ;
     228    }
     229    if $(.boostbook-xsl-dir)
     230    {
     231      ECHO "notice: Boost.Book: found boostbook XSL stylesheets in:" [ path.native $(.boostbook-xsl-dir) ] ;
     232    }
     233    if $(.boostbook-dtd-dir)
     234    {
     235      ECHO "notice: Boost.Book: found boostbook DTD in:" [ path.native $(.boostbook-dtd-dir) ] ;
     236    }
     237  }
     238
     239  if ! $(.boostbook-xsl-dir) || ! $(.boostbook-dtd-dir)
     240  {
     241    errors.warning
     242      "couldn't find BoostBook xsl or dtd directories;"
     243      : please set \"BOOST_ROOT\" variable to the root directory of
     244      your boost installation.  Searched in:
     245      : $(boostbook-dir:J="
     246") ;
     247  }   
     248}
     249
    140250rule xsl-dir
    141251{
     
    204314  local stylesheet = [ path.native $(.boostbook-xsl-dir)/fo.xsl ] ;
    205315  xslt $(target) : $(source) $(stylesheet) : $(properties) ;
     316}
     317
     318rule format-catalog-path ( path )
     319{
     320    local result = $(path) ;
     321    if [ xsltproc.is-cygwin ]
     322    {
     323        if [ os.name ] = NT
     324        {
     325            drive = [ MATCH ^/(.):(.*)$ : $(path) ] ;
     326            result = /cygdrive/$(drive[1])$(drive[2]) ;
     327        }
     328    }
     329    else
     330    {
     331        if [ os.name ] = CYGWIN
     332        {
     333            local native-path = [ path.native $(path) ] ;
     334            result = [ path.make $(native-path:W) ] ;
     335        }
     336    }
     337    return [ regex.replace $(result) " " "%20" ] ;
    206338}
    207339
     
    214346  if $(boostbook-dtd-dir)
    215347  {     
    216     boostbook-dtd-dir = [ regex.replace $(boostbook-dtd-dir) " " "%20" ] ;
     348    boostbook-dtd-dir = [ format-catalog-path $(boostbook-dtd-dir) ] ;
    217349  }
    218350   
     
    239371  else
    240372  {
    241     docbook-xsl-dir = [ regex.replace $(docbook-xsl-dir) " " "%20" ] ;     
     373    docbook-xsl-dir = [ format-catalog-path $(docbook-xsl-dir) ] ;     
    242374    print.text "  <rewriteURI uriStartString=\"http://docbook.sourceforge.net/release/xsl/current/\" rewritePrefix=\"file://$(docbook-xsl-dir)/\"/>" ;
    243375  }
     
    256388  else
    257389  {
    258     docbook-dtd-dir = [ regex.replace $(docbook-dtd-dir) " " "%20" ] ;     
     390    docbook-dtd-dir = [ format-catalog-path $(docbook-dtd-dir) ] ;     
    259391    print.text "  <rewriteURI uriStartString=\"http://www.oasis-open.org/docbook/xml/4.2/\" rewritePrefix=\"file://$(docbook-dtd-dir)/\"/>" ;
    260392  }
  • branches/release/tools/build/v2/tools/como-win.jam

    r47443 r63913  
    111111}
    112112
    113 actions updated together piecemeal archive
     113actions archive
    114114{
    115     $(CONFIG_COMMAND) --no_version --no_prelink_verbose --prelink_object "$(>)"
    116     lib $(ARFLAGS) /nologo /out:"$(<:S=.lib)" "$(>)"
     115    $(CONFIG_COMMAND) --no_version --no_prelink_verbose --prelink_object @"@($(<[1]:W).rsp:E=$(nl)"$(>)")"
     116    lib $(ARFLAGS) /nologo /out:"$(<:S=.lib)" @"@($(<[1]:W).rsp:E=$(nl)"$(>)")"
    117117}
  • branches/release/tools/build/v2/tools/darwin.jam

    r59728 r63913  
    44# Copyright 2005-2007 Mat Marcus
    55# Copyright 2005-2007 Adobe Systems Incorporated
    6 # Copyright 2007-2009 Rene Rivera
     6# Copyright 2007-2010 Rene Rivera
    77# Distributed under the Boost Software License, Version 1.0.
    88# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
     
    3030## The minimal MacOSX version to target.
    3131feature macosx-version-min : : propagated optional ;
     32
     33## A dependency, that is forced to be included in the link.
     34feature force-load : : free dependency incidental ;
    3235
    3336#############################################################################
     
    263266            {
    264267                flags darwin.compile OPTIONS <macosx-version-min>$(version-feature)
    265                     : -miphoneos-version-min=$(version[2-]:J=.) ;
     268                    : -mmacosx-version-min=$(version[2-]:J=.) ;
    266269                flags darwin.link OPTIONS <macosx-version-min>$(version-feature)
    267                     : -miphoneos-version-min=$(version[2-]:J=.) ;
     270                    : -mmacosx-version-min=$(version[2-]:J=.) ;
    268271            }
    269272        }
     
    485488flags darwin.link FRAMEWORK <framework> ;
    486489
     490#
     491flags darwin.link FORCE_LOAD <force-load> ;
     492
    487493# This is flag is useful for debugging the link step
    488494# uncomment to see what libtool is doing under the hood
     
    512518rule link ( targets * : sources * : properties * )
    513519{
     520    DEPENDS $(targets) : [ on $(targets) return $(FORCE_LOAD) ] ;
    514521    setup-address-model $(targets) : $(sources) : $(properties) ;
    515522    prepare-framework-path $(<) ;
     
    520527#    http://svn.boost.org/trac/boost/ticket/2347
    521528# So we pass -S -x.
    522 actions link bind LIBRARIES
    523 {
    524     "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=:S=) $(OPTIONS) $(USER_OPTIONS)
     529actions link bind LIBRARIES FORCE_LOAD
     530{
     531    "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -o "$(<)" "$(>)" -Wl,-force_load$(_)"$(FORCE_LOAD)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=:S=) $(OPTIONS) $(USER_OPTIONS)
    525532    $(NEED_STRIP)"$(.STRIP)" $(NEED_STRIP)-S $(NEED_STRIP)-x $(NEED_STRIP)"$(<)"
    526533}
  • branches/release/tools/build/v2/tools/doxygen.jam

    r59728 r63913  
    3838import modules ;
    3939import project ;
     40import utility ;
    4041
    4142
     
    6465# Location for images when generating XML
    6566feature.feature doxygen:xml-imagedir : : free ;
     67
     68# Indicates whether the entire directory should be deleted
     69feature.feature doxygen.rmdir : off on : optional incidental ;
    6670
    6771# Doxygen configuration input file.
     
    139143        {
    140144            ECHO "notice:" using doxygen ":" $(.doxygen) ;
     145        }
     146
     147        if [ .is-cygwin ]
     148        {
     149            .is-cygwin = true ;
    141150        }
    142151
     
    171180}
    172181
     182rule .is-cygwin ( )
     183{
     184    if [ os.on-windows ]
     185    {
     186        local file = [ path.make [ modules.binding $(__name__) ] ] ;
     187        local dir = [ path.native
     188                      [ path.join [ path.parent $(file) ] doxygen ] ] ;
     189        local command =
     190         "cd \"$(dir)\" && \"$(.doxygen)\" windows-paths-check.doxyfile 2>&1" ;
     191        result = [ SHELL $(command) ] ;
     192        if [ MATCH "(Parsing file /)" : $(result) ]
     193        {
     194            return true ;
     195        }
     196    }
     197}
    173198
    174199# Runs Doxygen on the given Doxygen configuration file (the source) to generate
     
    193218
    194219
     220rule translate-path ( path )
     221{
     222    if [ os.on-windows ]
     223    {
     224        if [ os.name ] = CYGWIN
     225        {
     226            if $(.is-cygwin)
     227            {
     228                return $(path) ;
     229            }
     230            else
     231            {
     232                return $(path:W) ;
     233            }
     234        }
     235        else
     236        {
     237            if $(.is-cygwin)
     238            {
     239                match = [ MATCH ^(.):(.*) : $(path) ] ;
     240                if $(match)
     241                {
     242                    return /cygdrive/$(match[1])$(match[2]:T) ;
     243                }
     244                else
     245                {
     246                    return $(path:T) ;
     247                }
     248            }
     249            else
     250            {
     251                return $(path) ;
     252            }
     253        }
     254    }
     255    else
     256    {
     257        return $(path) ;
     258    }
     259}
     260
     261
    195262# Generates a doxygen configuration file (doxyfile) given a set of C++ sources
    196263# and a property list that may contain <doxygen:param> features.
     
    206273    {
    207274        local namevalue = [ regex.match ([^=]*)=(.*) : $(param) ] ;
    208         text += "$(namevalue[1]) = $(namevalue[2])" ;
    209275        if $(namevalue[1]) = OUTPUT_DIRECTORY
    210276        {
    211             output-dir = "$(namevalue[2])" ;
     277            output-dir = [ translate-path
     278                           [ utility.unquote $(namevalue[2]) ] ] ;
     279            text += "OUTPUT_DIRECTORY = \"$(output-dir)\"" ;
     280        }
     281        else
     282        {
     283            text += "$(namevalue[1]) = $(namevalue[2])" ;
    212284        }
    213285    }
     
    215287    if ! $(output-dir)
    216288    {
    217         output-dir = [ on $(target) return $(LOCATE) ] ;
     289        output-dir = [ translate-path [ on $(target) return $(LOCATE) ] ] ;
    218290        text += "OUTPUT_DIRECTORY = \"$(output-dir)\"" ;
    219291    }
    220292
    221     local headers = \"$(sources:G=)\" ;
     293    local headers = ;
     294    for local header in $(sources:G=)
     295    {
     296        header = [ translate-path $(header) ] ;
     297        headers += \"$(header)\" ;
     298    }
    222299
    223300    # Doxygen generates LaTex by default. So disable it unconditionally, or at
     
    235312rule run ( target : source : properties * )
    236313{
     314    if <doxygen.rmdir>on in $(properties)
     315    {
     316        local output-dir =
     317            [ path.make
     318                [ MATCH <doxygen:param>OUTPUT_DIRECTORY=\"?([^\"]*) :
     319                  $(properties) ] ] ;
     320        local html-dir =
     321            [ path.make
     322                [ MATCH <doxygen:param>HTML_OUTPUT=(.*) :
     323                  $(properties) ] ] ;
     324        if $(output-dir) && $(html-dir) &&
     325            [ path.glob $(output-dir) : $(html-dir) ]
     326        {
     327            HTMLDIR on $(target) =
     328                [ path.native [ path.join $(output-dir) $(html-dir) ] ] ;
     329            rm-htmldir $(target) ;
     330        }
     331    }
    237332    doxygen-action $(target) : $(source) ;
    238333    NAME on $(target) = $(.doxygen) ;
     
    246341}
    247342
     343if [ os.name ] = NT
     344{
     345    RMDIR = rmdir /s /q ;
     346}
     347else
     348{
     349    RMDIR = rm -rf ;
     350}
     351
     352actions quietly rm-htmldir
     353{
     354    $(RMDIR) $(HTMLDIR)
     355}
    248356
    249357# The rules below require Boost.Book stylesheets, so we need some code to check
     
    356464                        [ feature.get-values <doxygen:xml-imagedir> :
    357465                          $(requirements) ] ] ;
     466
     467    local location = [ on $(target) return $(LOCATE) ] ;
     468
     469    local pdf-location =
     470        [ path.native
     471            [ path.join
     472                [ path.make $(location) ]
     473                [ path.make $(directory) ] ] ] ;
     474    local html-location =
     475        [ path.native
     476            [ path.join
     477                .
     478                html
     479                [ path.make $(directory) ] ] ] ;
     480
     481    common.MkDir $(pdf-location) ;
     482    common.MkDir $(html-location) ;
     483
     484    DEPENDS $(target) : $(pdf-location) $(html-location) ;
     485
    358486    if [ os.name ] = NT
    359487    {
    360488        CP on $(target) = copy /y ;
    361         MKDIR on $(target) = mkdir ;
    362489        FROM on $(target) = \\*.png ;
    363490        TOHTML on $(target) = .\\html\\$(directory) ;
     
    367494    {
    368495        CP on $(target) = cp ;
    369         MKDIR on $(target) = mkdir -p ;
    370496        FROM on $(target) = /*.png ;
    371497        TOHTML on $(target) = ./html/$(directory) ;
     
    376502actions copy-latex-pngs
    377503{
    378     $(MKDIR) $(TOHTML)
    379     $(MKDIR) $(<:D)$(TOPDF)
    380504    $(CP) $(>:S=)$(FROM) $(TOHTML)
    381505    $(CP) $(>:S=)$(FROM) $(<:D)$(TOPDF)
     
    521645                : $(target:S=.tag)
    522646                : [ targets.main-target-requirements $(requirements)
     647                    <doxygen:param>"OUTPUT_DIRECTORY=\"$(output-dir-native)\""
     648                    <doxygen:param>HTML_OUTPUT=$(target:B)
    523649                    : $(project) ]
    524650                : [ targets.main-target-default-build $(default-build) : $(project) ]
     
    550676            doxygen $(target).doxygen-xml-images.html : $(sources)
    551677                : $(requirements)
     678                  <doxygen.rmdir>on
    552679                  <doxygen:param>QUIET=YES
    553680                  <doxygen:param>WARNINGS=NO
  • branches/release/tools/build/v2/tools/mpi.jam

    r59728 r63913  
    337337      link_flags = [ SHELL "$(command) -link_info" ] ;
    338338    }
     339    # Sun HPC and Ibm POE
     340    else if [ SHELL "$(command) -v 2>/dev/null" ]
     341    {
     342      compile_flags = [ SHELL "$(command) -c -v -xtarget=native64 2>/dev/null" ] ;
     343
     344      local back = [ MATCH "--------------------(.*)" : $(compile_flags) ] ;
     345      if $(back)
     346      {
     347        # Sun HPC
     348        if $(.debug-configuration)
     349        {
     350          ECHO "Found Sun MPI wrapper compiler: $(command)" ;
     351        }
     352
     353        compile_flags = [ MATCH "(.*)--------------------" : $(back) ] ;
     354        compile_flags = [ MATCH "(.*)-v" :  $(compile_flags) ] ;
     355        link_flags = [ SHELL "$(command) -v -xtarget=native64 2>/dev/null" ] ;
     356        link_flags = [ MATCH "--------------------(.*)" : $(link_flags) ] ;
     357        link_flags = [ MATCH "(.*)--------------------" : $(link_flags) ] ;
     358
     359        # strip out -v from compile options
     360        local front = [ MATCH "(.*)-v" :  $(link_flags) ] ;
     361        local back = [ MATCH "-v(.*)" :  $(link_flags) ] ;
     362        link_flags = "$(front) $(back)" ;
     363        front = [ MATCH "(.*)-xtarget=native64" :  $(link_flags) ] ;
     364        back = [ MATCH "-xtarget=native64(.*)" :  $(link_flags) ] ;
     365        link_flags = "$(front) $(back)" ;
     366      }
     367      else
     368      {
     369        # Ibm POE
     370        if $(.debug-configuration)
     371        {
     372          ECHO "Found IBM MPI wrapper compiler: $(command)" ;
     373        }
     374
     375        #
     376        compile_flags = [ SHELL "$(command) -c -v 2>/dev/null" ] ;
     377        compile_flags = [ MATCH "(.*)exec: export.*" : $(compile_flags) ] ;
     378        local front = [ MATCH "(.*)-v" :  $(compile_flags) ] ;
     379        local back = [ MATCH "-v(.*)" :  $(compile_flags) ] ;
     380        compile_flags = "$(front) $(back)" ;
     381        front = [ MATCH "(.*)-c" :  $(compile_flags) ] ;
     382        back = [ MATCH "-c(.*)" :  $(compile_flags) ] ;
     383        compile_flags = "$(front) $(back)" ;
     384        link_flags = $(compile_flags) ;
     385
     386        # get location of mpif.h from mpxlf
     387        local f_flags = [ SHELL "mpxlf -v 2>/dev/null" ] ;
     388        f_flags = [ MATCH "(.*)exec: export.*" : $(f_flags) ] ;
     389        front = [ MATCH "(.*)-v" :  $(f_flags) ] ;
     390        back = [ MATCH "-v(.*)" :  $(f_flags) ] ;
     391        f_flags = "$(front) $(back)" ;
     392        f_flags = [ MATCH "xlf_r(.*)" : $(f_flags) ] ;
     393        f_flags = [ MATCH "-F:mpxlf_r(.*)" : $(f_flags) ] ;
     394        compile_flags = [ strip-eol $(compile_flags) ] ;
     395        compile_flags = "$(compile_flags) $(f_flags)" ;
     396      }
     397    }
    339398
    340399    if $(result) || $(compile_flags) && $(link_flags)
     
    494553    num_processes = $(num_processes:G=) ;
    495554
     555    # serialize the MPI tests to avoid overloading systems
     556    JAM_SEMAPHORE on $(target) = <s>mpi-run-semaphore ;
     557
    496558    # We launch MPI processes using the "mpirun" equivalent specified by the user.
    497559    LAUNCHER on $(target) = 
  • branches/release/tools/build/v2/tools/testing.jam

    r52376 r63913  
    206206{
    207207    # Path is in normalized form, so all slashes are forward.
    208     local match1 = [ MATCH /libs/(.*)/(test|example) : $(path) ] ;
    209     local match2 = [ MATCH /libs/(.*)$ : $(path) ] ;
     208    local match1 = [ MATCH /(tools|libs)/(.*)/(test|example) : $(path) ] ;
     209    local match2 = [ MATCH /(tools|libs)/(.*)$ : $(path) ] ;
    210210    local match3 = [ MATCH (/status$) : $(path) ] ;
    211211
    212     if $(match1) { return $(match1[0]) ; }
    213     else if $(match2) { return $(match2[0]) ; }
     212    if $(match1) { return $(match1[2]) ; }
     213    else if $(match2) { return $(match2[2]) ; }
    214214    else if $(match3) { return "" ; }
    215215    else if --dump-tests in [ modules.peek : ARGV ]
  • branches/release/tools/build/v2/tools/xsltproc.jam

    r47443 r63913  
    1414import sequence ;
    1515import common ;
     16import os ;
     17import modules ;
     18import path ;
    1619
    1720feature.feature xsl:param : : free ;
     
    3235    if ! $(.initialized)
    3336    {
    34         $(.initialized) = true ;
     37        .initialized = true ;
    3538        .xsltproc = $(xsltproc) ;
     39        .is-cygwin = [ .is-cygwin $(xsltproc:E=xsltproc) ] ;
    3640    }
    3741}
    3842
     43# Returns a non-empty string if a cygwin xsltproc binary was specified.
     44rule is-cygwin ( )
     45{
     46    if ! $(.initialized)
     47    {
     48        init ;
     49    }
     50    return $(.is-cygwin) ;
     51}
     52
     53rule .is-cygwin ( xsltproc )
     54{
     55    if [ os.on-windows ]
     56    {
     57        local file = [ path.make [ modules.binding $(__name__) ] ] ;
     58        local dir = [ path.native
     59                      [ path.join [ path.parent $(file) ] xsltproc ] ] ;
     60        if [ os.name ] = CYGWIN
     61        {
     62            dir = $(dir:W) ;
     63        }
     64        local command =
     65            "\"$(xsltproc)\" \"$(dir)\\test.xsl\" \"$(dir)\\test.xml\" 2>&1" ;
     66        local status = [ SHELL $(command) : no-output : exit-status ] ;
     67        if $(status[2]) != "0"
     68        {
     69            return true ;
     70        }
     71    }
     72}
    3973
    4074rule compute-xslt-flags ( target : properties * )
     
    73107    for local dir in $(implicit-target-directories)
    74108    {
    75         flags += --path \"$(dir)\" ;
     109        flags += --path \"$(dir:T)\" ;
    76110    }
    77111
     
    88122    for local catalog in [ feature.get-values <catalog> : $(properties) ]
    89123    {
    90         CATALOG = [ common.variable-setting-command XML_CATALOG_FILES : $(catalog) ] ;
     124        CATALOG = [ common.variable-setting-command XML_CATALOG_FILES : $(catalog:T) ] ;
     125    }
     126
     127    if [ os.on-windows ] && ! [ is-cygwin ]
     128    {
     129        action = $(action).windows ;
    91130    }
    92131
     
    106145}
    107146
     147actions xslt-xsltproc.windows
     148{
     149    $(CATALOG) "$(NAME:E=xsltproc)" $(FLAGS) --xinclude -o "$(<)" "$(STYLESHEET:W)" "$(>:W)"
     150}
     151
    108152
    109153actions xslt-xsltproc bind STYLESHEET
    110154{
    111     $(CATALOG) "$(NAME:E=xsltproc)" $(FLAGS) --xinclude -o "$(<)" "$(STYLESHEET)" "$(>)"
     155    $(CATALOG) "$(NAME:E=xsltproc)" $(FLAGS) --xinclude -o "$(<)" "$(STYLESHEET:T)" "$(>:T)"
     156}
     157
     158
     159actions xslt-xsltproc-dir.windows bind STYLESHEET
     160{
     161    $(CATALOG) "$(NAME:E=xsltproc)" $(FLAGS) --xinclude -o "$(<:D)/" "$(STYLESHEET:W)" "$(>:W)"
    112162}
    113163
     
    115165actions xslt-xsltproc-dir bind STYLESHEET
    116166{
    117     $(CATALOG) "$(NAME:E=xsltproc)" $(FLAGS) --xinclude -o "$(<:D)/" "$(STYLESHEET)" "$(>)"
     167    $(CATALOG) "$(NAME:E=xsltproc)" $(FLAGS) --xinclude -o "$(<:D)/" "$(STYLESHEET:T)" "$(>:T)"
    118168}
  • branches/release/tools/build/v2/util/print.jam

    r50575 r63913  
    1313import string ;
    1414import regex ;
     15import "class" ;
     16import scanner ;
     17import path ;
    1518
    1619# The current output target. Defaults to console.
     
    342345       
    343346        text-action $(output-target) ;
     347
     348        if $(overwrite) && $(output-target) != console
     349        {
     350            check-for-update $(output-target) ;
     351        }
    344352    }
    345353    $(output-target).text-$(prefix-body-suffix) += $(strings) ;
     
    395403
    396404
     405rule get-scanner ( )
     406{
     407    if ! $(.scanner)
     408    {
     409        .scanner = [ class.new print-scanner ] ;
     410    }
     411    return $(.scanner) ;
     412}
     413
     414
     415# The following code to update print targets when their contents
     416# change is a horrible hack.  It basically creates a target which
     417# binds to this file (print.jam) and installs a scanner on it
     418# which reads the target and compares its contents to the new
     419# contents that we're writing.
     420#
     421rule check-for-update ( target )
     422{
     423    local scanner = [ get-scanner ] ;
     424    local file = [ path.native [ modules.binding $(__name__) ] ] ;
     425    local g = [ MATCH <(.*)> : $(target:G) ] ;
     426    local dependency-target = $(__file__:G=$(g)-$(target:G=)-$(scanner)) ;
     427    DEPENDS $(target) : $(dependency-target) ;
     428    SEARCH on $(dependency-target) = $(file:D) ;
     429    ISFILE $(dependency-target) ;
     430    NOUPDATE $(dependency-target) ;
     431    base on $(dependency-target) = $(target) ;
     432    scanner.install $(scanner) : $(dependency-target) none ;
     433    return $(dependency-target) ;
     434}
     435
     436
     437class print-scanner : scanner
     438{
     439    import path ;
     440    import os ;
     441
     442    rule pattern ( )
     443    {
     444        return "(One match...)" ;
     445    }
     446
     447    rule process ( target : matches * : binding )
     448    {
     449        local base = [ on $(target) return $(base) ] ;
     450        local nl = [ on $(base) return $(nl) ] ;
     451        local text-content = [ on $(base) return $(text-content) ] ;
     452        local dir = [ path.make [ on $(base) return $(LOCATE) ] ] ;
     453        local file = [ path.native [ path.join $(dir) $(base:G=) ] ] ;
     454        local actual-content ;
     455        if [ os.name ] = NT
     456        {
     457            actual-content = [ SHELL "type \"$(file)\" 2>nul" ] ;
     458        }
     459        else
     460        {
     461            actual-content = [ SHELL "cat \"$(file)\" 2>/dev/null" ] ;
     462        }
     463        if $(text-content:J=$(nl)) != $(actual-content)
     464        {
     465            ALWAYS $(base) ;
     466        }
     467    }
     468}
     469
     470
    397471rule __test__ ( )
    398472{
Note: See TracChangeset for help on using the changeset viewer.