Boost logo

Boost-Commit :

From: jurko.gospodnetic_at_[hidden]
Date: 2008-01-05 15:02:27


Author: jurko
Date: 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
New Revision: 42494
URL: http://svn.boost.org/trac/boost/changeset/42494

Log:
Minor stylistic changes such as: comment typo corrections, wrapping lines to 80 characters, indentations, removing trailing spaces, etc.
Text files modified:
   trunk/tools/build/v2/build-system.jam | 181 +++----
   trunk/tools/build/v2/build/alias.jam | 52 +-
   trunk/tools/build/v2/build/feature.jam | 869 ++++++++++++++++++------------------
   trunk/tools/build/v2/build/generators.jam | 344 +++++++-------
   trunk/tools/build/v2/build/project.jam | 657 ++++++++++++++-------------
   trunk/tools/build/v2/build/property-set.jam | 296 +++++------
   trunk/tools/build/v2/build/property.jam | 412 ++++++++---------
   trunk/tools/build/v2/build/targets.jam | 515 ++++++++++-----------
   trunk/tools/build/v2/build/type.jam | 47 +
   trunk/tools/build/v2/tools/builtin.jam | 939 +++++++++++++++++++--------------------
   trunk/tools/build/v2/tools/cast.jam | 54 +-
   trunk/tools/build/v2/tools/common.jam | 455 +++++++++---------
   trunk/tools/build/v2/tools/generate.jam | 74 +-
   trunk/tools/build/v2/tools/gettext.jam | 87 +-
   trunk/tools/build/v2/tools/msvc.jam | 314 ++++++------
   trunk/tools/build/v2/tools/notfile.jam | 46 +
   trunk/tools/build/v2/tools/python.jam | 58 +-
   trunk/tools/build/v2/tools/testing.jam | 419 +++++++++--------
   trunk/tools/build/v2/util/indirect.jam | 65 +-
   trunk/tools/jam/src/build.bat | 2
   20 files changed, 2890 insertions(+), 2996 deletions(-)

Modified: trunk/tools/build/v2/build-system.jam
==============================================================================
--- trunk/tools/build/v2/build-system.jam (original)
+++ trunk/tools/build/v2/build-system.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,8 +1,8 @@
-# Copyright 2003, 2005, 2007 Dave Abrahams
-# Copyright 2006, 2007 Rene Rivera
-# Copyright 2003, 2004, 2005, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2003, 2005, 2007 Dave Abrahams
+# Copyright 2006, 2007 Rene Rivera
+# Copyright 2003, 2004, 2005, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
 # This file is part of Boost.Build version 2. You can think of it as
 # forming the main() routine. It is invoked by the bootstrapping code
@@ -64,42 +64,42 @@
 {
     if $(debug-config)
     {
- ECHO "notice: loading test-config.jam from"
+ ECHO "notice: loading test-config.jam from"
           [ NORMALIZE_PATH $(test-config[1]) ] ;
         ECHO "notice: user-config.jam and site-config.jam will be ignored" ;
- }
-
- module test-config
+ }
+
+ module test-config
     {
         import toolset : using : using ;
     }
- import test-config ;
+ import test-config ;
 }
 
 local ignore-config ;
-if $(test-config) || --ignore-config in [ modules.peek : ARGV ]
-{
+if $(test-config) || --ignore-config in [ modules.peek : ARGV ]
+{
     ignore-config = true ;
 }
 
 local user-path = [ os.home-directories ] [ os.environ BOOST_BUILD_PATH ] ;
-
+
 # Unless ignore-config is set, load the configuration file in
 # $(path)/$(basename).jam
 local rule load-config ( basename : path + )
-{
- if ! $(ignore-config)
+{
+ if ! $(ignore-config)
     {
         if $(debug-config)
         {
             ECHO notice: searching \"$(path)\" for \"$(basename).jam\" ;
             local where = [ GLOB $(path) : $(basename).jam ] ;
             if $(where)
- {
+ {
                 ECHO notice: loading $(basename).jam from
                   [ NORMALIZE_PATH $(where[1]) ] ;
- }
- }
+ }
+ }
 
         modules.load $(basename) : : $(path) ;
         project.load-used-projects $(basename) ;
@@ -109,17 +109,17 @@
 #
 # Load site-config.
 #
-module site-config
+module site-config
 {
     import project : initialize ;
- initialize site-config ;
+ initialize site-config ;
 }
 
-local site-path = /etc $(user-path) ;
+local site-path = /etc $(user-path) ;
 
 if [ os.name ] in NT CYGWIN
-{
- site-path = [ modules.peek : SystemRoot ] $(user-path) ;
+{
+ site-path = [ modules.peek : SystemRoot ] $(user-path) ;
 }
 
 load-config site-config : $(site-path) ;
@@ -127,30 +127,28 @@
 #
 # Load user-config.
 #
-module user-config
+module user-config
 {
     import project : initialize ;
- initialize user-config ;
+ initialize user-config ;
 }
 
 local user-config-path = [ MATCH ^--user-config=(.*) : $(argv) ] ;
-
 user-config-path ?= [ os.environ BOOST_BUILD_USER_CONFIG ] ;
 
 if $(user-config-path)
 {
     if $(debug-config)
     {
- ECHO "Loading explicitly specifier user configuration file:" ;
+ ECHO "Loading explicitly specified user configuration file:" ;
         ECHO " $(user-config-path)" ;
     }
-
-
+
     modules.load user-config : $(user-config-path:BS) : $(user-config-path:D) ;
     project.load-used-projects user-config ;
 }
 else
-{
+{
     load-config user-config : $(user-path) ;
 }
 
@@ -164,7 +162,7 @@
 
 # if the user specified --toolset=..., we need to add toolset=... to
 # the build request
-local extra-build-request ;
+local extra-build-request ;
 
 if ! $(ignore-config)
 {
@@ -178,8 +176,8 @@
 
         if $(debug-config)
         {
- ECHO notice: [cmdline-cfg] Detected command-line request for
- $(toolset-version): toolset= \"$(toolset)\" "version= \""$(version)\" ;
+ ECHO notice: [cmdline-cfg] Detected command-line request for
+ $(toolset-version): toolset= \"$(toolset)\" "version= \""$(version)\" ;
         }
 
         local known ;
@@ -190,8 +188,8 @@
             known = true ;
         }
 
- if $(known) && $(version)
- && ! [ feature.is-subvalue toolset : $(toolset) : version : $(version) ]
+ if $(known) && $(version)
+ && ! [ feature.is-subvalue toolset : $(toolset) : version : $(version) ]
         {
             known = ;
         }
@@ -200,8 +198,8 @@
         {
             if $(debug-config)
             {
- ECHO notice: [cmdline-cfg] toolset $(toolset-version)
- not previously configured; configuring now ;
+ ECHO notice: [cmdline-cfg] toolset $(toolset-version)
+ not previously configured; configuring now ;
             }
             toolset.using $(toolset) : $(version) ;
         }
@@ -216,7 +214,7 @@
         # make sure we get an appropriate property into the build request in
         # case the user used the "--toolset=..." form
         if ! $(t) in $(argv)
- && ! $(t) in $(feature-toolsets)
+ && ! $(t) in $(feature-toolsets)
         {
             if $(debug-config)
             {
@@ -226,14 +224,13 @@
         }
     }
 }
-
+
 if USER_MODULE in [ RULENAMES ]
 {
     USER_MODULE site-config user-config ;
 }
 
 
-
 if --version in [ modules.peek : ARGV ]
 {
     version.print ;
@@ -241,23 +238,22 @@
 }
 
 
-
-# We always load project in "." so that 'use-project' directives has
-# any chance of been seen. Otherwise, we won't be able to refer to
-# subprojects using target ids.
+# We always load project in "." so that 'use-project' directives has any chance
+# of been seen. Otherwise, we won't be able to refer to subprojects using target
+# ids.
 if [ project.find "." : "." ]
-{
+{
     current-project = [ project.target [ project.load "." ] ] ;
-}
+}
 
-if ! [ feature.values <toolset> ]
+if ! [ feature.values <toolset> ]
 {
     local default-toolset = gcc ;
     if [ os.name ] = NT
     {
         default-toolset = msvc ;
     }
-
+
     ECHO "warning: No toolsets are configured." ;
     ECHO "warning: Configuring default toolset" \"$(default-toolset)\". ;
     ECHO "warning: If the default is wrong, you may not be able to build C++ programs." ;
@@ -265,30 +261,28 @@
     ECHO "warning: For more configuration options, please consult" ;
     ECHO "warning: http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html" ;
 
-
     if ! $(ignore-config)
     {
         toolset.using $(default-toolset) ;
     }
 }
 
-build-request = [
- build-request.from-command-line [
- modules.peek : ARGV
- ] $(extra-build-request)
+build-request = [
+ build-request.from-command-line [ modules.peek : ARGV ]
+ $(extra-build-request)
 ] ;
 
 properties = [ $(build-request).get-at 2 ] ;
 
-if $(properties)
-{
+if $(properties)
+{
     expanded = [ build-request.expand-no-defaults $(properties) ] ;
     local xexpanded ;
     for local e in $(expanded)
     {
         xexpanded += [ property-set.create [ feature.split $(e) ] ] ;
     }
- expanded = $(xexpanded) ;
+ expanded = $(xexpanded) ;
 }
 else
 {
@@ -321,8 +315,8 @@
 # that code without project-targets instance.
 rule find-target ( target-id )
 {
- local split = [ MATCH (.*)//(.*) : $(target-id) ] ;
-
+ local split = [ MATCH (.*)//(.*) : $(target-id) ] ;
+
     local pm ;
     if $(split)
     {
@@ -332,27 +326,27 @@
     {
         pm = [ project.find $(target-id) : "." ] ;
     }
-
- local result ;
+
+ local result ;
     if $(pm)
     {
         result = [ project.target $(pm) ] ;
     }
-
+
     if $(split)
     {
         result = [ $(result).find $(split[2]) ] ;
     }
-
+
     return $(result) ;
 }
 
 
 
-if ! $(current-project)
+if ! $(current-project)
 {
     if ! $(target-ids)
- {
+ {
         ECHO "error: no Jamfile in current directory found, and no target references specified." ;
         EXIT ;
     }
@@ -364,7 +358,7 @@
     if $(id) = clean
     {
         clean = true ;
- }
+ }
     else
     {
         local t ;
@@ -376,7 +370,7 @@
         {
             t = [ find-target $(id) ] ;
         }
-
+
         if ! $(t)
         {
             ECHO "notice: could not find main target " $(id) ;
@@ -386,13 +380,13 @@
         else
         {
             targets += $(t) ;
- }
- }
+ }
+ }
 }
 
 if ! $(targets)
 {
- targets += [ project.target [ project.module-name "." ] ] ;
+ targets += [ project.target [ project.module-name "." ] ] ;
 }
 
 virtual-targets = ;
@@ -410,18 +404,17 @@
 {
     .command-line-free-features = [ property-set.create [ $(p).free ] ] ;
     for local t in $(targets)
- {
+ {
         local g = [ $(t).generate $(p) ] ;
         if ! [ class.is-a $(t) : project-target ]
         {
             results-of-main-targets += $(g[2-]) ;
- }
+ }
         virtual-targets += $(g[2-]) ;
- }
+ }
 }
 
-# The cleaning is tricky. Say, if
-# user says:
+# The cleaning is tricky. Say, if user says:
 #
 # bjam --clean foo
 #
@@ -434,22 +427,22 @@
 local projects-to-clean ;
 local targets-to-clean ;
 if $(clean) || $(clean-all)
-{
+{
     for local t in $(targets)
     {
         if [ class.is-a $(t) : project-target ]
         {
             projects-to-clean += [ $(t).project-module ] ;
- }
+ }
     }
-
+
     local subvariants ;
     for local t in $(results-of-main-targets)
     {
         # Don't include roots or sources.
         targets-to-clean += [ virtual-target.traverse $(t) ] ;
     }
- targets-to-clean = [ sequence.unique $(targets-to-clean) ] ;
+ targets-to-clean = [ sequence.unique $(targets-to-clean) ] ;
 }
 
 # Returns 'true' if 'project' is a child of 'current-project',
@@ -461,22 +454,22 @@
     {
         local r = false ;
         if $(project) in $(projects-to-clean)
- {
+ {
             r = true ;
         }
- else
+ else
         {
             local parent = [ project.attribute $(project) parent-module ] ;
             if $(parent) && $(parent) != user-config
             {
                 r = [ is-child $(parent) ] ;
- }
- }
-
+ }
+ }
+
         .is-child.$(project) = $(r) ;
     }
-
- return $(.is-child.$(project)) ;
+
+ return $(.is-child.$(project)) ;
 }
 
 
@@ -500,7 +493,7 @@
         local project-path = [ $(project).get location ] ;
         return $(project-path)//$(name) ;
     }
-
+
     # Generate an XML file containing build statistics for each
     # constituent
     rule out-xml ( xml-file : constituents * )
@@ -559,7 +552,7 @@
                     "$(nl) <jam-target><![CDATA[$(jam-target)]]></jam-target>"
                     "$(nl) </target>"
                     ;
- }
+ }
         }
         .contents on $(xml-file) +=
             "$(nl) </targets>"
@@ -589,7 +582,7 @@
     # Nothing to do here; the *real* actions happen in
     # out-xml.generate-action
     actions quietly out-xml.generate { }
-
+
     # Define the out-xml file target, which depends on all the targets
     # so that it runs the collection after the targets have run.
     out-xml $(.out-xml) : $(actual-targets) ;
@@ -607,7 +600,7 @@
         .contents on $(xml-file) +=
             "$(nl) <action status=\"$(status)\" start=\"$(start)\" end=\"$(end)\" user=\"$(user)\" system=\"$(system)\">"
             ;
-
+
         # If we have an action object we can print out more detailed info.
         local action = [ on $(target) return $(.action) ] ;
         if $(action)
@@ -615,12 +608,12 @@
             local action-name = [ $(action).action-name ] ;
             local action-sources = [ $(action).sources ] ;
             local action-props = [ $(action).properties ] ;
-
+
             # The qualified name of the action which we created the target.
             .contents on $(xml-file) +=
                 "$(nl) <name><![CDATA[$(action-name)]]></name>"
                 ;
-
+
             # The sources that made up the target.
             .contents on $(xml-file) +=
                 "$(nl) <sources>"
@@ -635,7 +628,7 @@
             .contents on $(xml-file) +=
                 "$(nl) </sources>"
                 ;
-
+
             # The properties that define the conditions under which the
             # target was built.
             .contents on $(xml-file) +=
@@ -652,7 +645,7 @@
                 "$(nl) </properties>"
                 ;
         }
-
+
         local locate = [ on $(target) return $(LOCATE) ] ;
         locate ?= "" ;
         .contents on $(xml-file) +=
@@ -683,7 +676,7 @@
     UPDATE $(bjam-targets:G=e) $(.out-xml) ;
 }
 else if $(cleanall)
-{
+{
     UPDATE clean-all ;
 }
 else if $(clean)

Modified: trunk/tools/build/v2/build/alias.jam
==============================================================================
--- trunk/tools/build/v2/build/alias.jam (original)
+++ trunk/tools/build/v2/build/alias.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,69 +1,69 @@
-# Copyright 2003, 2004, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2003, 2004, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
-# This module defines the 'alias' rule and associated class.
+# This module defines the 'alias' rule and the associated target class.
 #
-# Alias is just a main target which returns its source targets without any
-# processing. For example::
+# Alias is just a main target which returns its source targets without any
+# processing. For example:
 #
 # alias bin : hello test_hello ;
 # alias lib : helpers xml_parser ;
 #
-# Another important use of 'alias' is to conveniently group source files::
+# Another important use of 'alias' is to conveniently group source files:
 #
 # alias platform-src : win.cpp : <os>NT ;
 # alias platform-src : linux.cpp : <os>LINUX ;
 # exe main : main.cpp platform-src ;
-#
+#
 # Lastly, it's possible to create local alias for some target, with different
 # properties::
 #
 # alias big_lib : : @/external_project/big_lib/<link>static ;
 #
 
-import targets ;
+
 import "class" : new ;
-import errors : error ;
 import project ;
 import property-set ;
+import targets ;
+
 
-class alias-target-class : basic-target
+class alias-target-class : basic-target
 {
- rule __init__ ( name : project : sources * : requirements *
+ rule __init__ ( name : project : sources * : requirements *
         : default-build * : usage-requirements * )
     {
- basic-target.__init__ $(name) : $(project) : $(sources) : $(requirements)
- : $(default-build) : $(usage-requirements) ;
+ basic-target.__init__ $(name) : $(project) : $(sources) : $(requirements)
+ : $(default-build) : $(usage-requirements) ;
     }
-
+
     rule construct ( name : source-targets * : property-set )
     {
         return [ property-set.empty ] $(source-targets) ;
- }
-
- rule compute-usage-requirements ( subvariant )
+ }
+
+ rule compute-usage-requirements ( subvariant )
     {
         local base = [ basic-target.compute-usage-requirements $(subvariant) ] ;
         # Add source's usage requirement. If we don't do this, "alias" does not
         # look like 100% alias.
         return [ $(base).add [ $(subvariant).sources-usage-requirements ] ] ;
     }
-
 }
 
 # Declares the 'alias' target. It will build sources, and return them unaltered.
 rule alias ( name : sources * : requirements * : default-build * : usage-requirements * )
 {
     local project = [ project.current ] ;
-
+
     targets.main-target-alternative
- [ new alias-target-class $(name) : $(project)
- : [ targets.main-target-sources $(sources) : $(name) : no-renaming ]
- : [ targets.main-target-requirements $(requirements) : $(project) ]
- : [ targets.main-target-default-build $(default-build) : $(project) ]
- : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
- ] ;
+ [ new alias-target-class $(name) : $(project)
+ : [ targets.main-target-sources $(sources) : $(name) : no-renaming ]
+ : [ targets.main-target-requirements $(requirements) : $(project) ]
+ : [ targets.main-target-default-build $(default-build) : $(project) ]
+ : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
+ ] ;
 }
 
 IMPORT $(__name__) : alias : : alias ;

Modified: trunk/tools/build/v2/build/feature.jam
==============================================================================
--- trunk/tools/build/v2/build/feature.jam (original)
+++ trunk/tools/build/v2/build/feature.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,52 +1,53 @@
-# Copyright 2001, 2002, 2003 Dave Abrahams
-# Copyright 2002, 2006 Rene Rivera
-# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2001, 2002, 2003 Dave Abrahams
+# Copyright 2002, 2006 Rene Rivera
+# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
+import assert : * ;
 import "class" : * ;
-
-import errors : error lol->list ;
-import sequence ;
+import errors : lol->list ;
+import indirect ;
+import modules ;
 import regex ;
+import sequence ;
 import set ;
 import utility ;
-import modules indirect ;
-import assert : * ;
+
 
 local rule setup ( )
 {
     .all-attributes =
-
- implicit
- executed
- composite
- optional
- symmetric
- free
- incidental
- path
- dependency
- propagated
- link-incompatible
- subfeature
- order-sensitive
- ;
+ implicit
+ executed
+ composite
+ optional
+ symmetric
+ free
+ incidental
+ path
+ dependency
+ propagated
+ link-incompatible
+ subfeature
+ order-sensitive
+ ;
 
     .all-features = ;
- .all-subfeatures = ; # non-subfeatures
- .all-top-features = ; # non-subfeatures
+ .all-subfeatures = ;
+ .all-top-features = ; # non-subfeatures
     .all-implicit-values = ;
 }
 setup ;
 
-# prepare a fresh space to test in by moving all global variable
-# settings into the given temporary module and erasing them here.
+
+# Prepare a fresh space to test in by moving all global variable settings into
+# the given temporary module and erasing them here.
 rule prepare-test ( temp-module )
 {
     DELETE_MODULE $(temp-module) ;
-
- # transfer globals to temp-module
+
+ # Transfer globals to temp-module.
     for local v in [ VARNAMES feature ]
     {
         if [ MATCH (\\.) : $(v) ]
@@ -58,11 +59,12 @@
     setup ;
 }
 
-# clear out all global variables and recover all variables from the
-# given temporary module
+
+# Clear out all global variables and recover all variables from the given
+# temporary module.
 rule finish-test ( temp-module )
 {
- # clear globals
+ # Clear globals.
     for local v in [ VARNAMES feature ]
     {
         if [ MATCH (\\.) : $(v) ]
@@ -70,7 +72,7 @@
             $(v) = ;
         }
     }
-
+
     for local v in [ VARNAMES $(temp-module) ]
     {
         $(v) = [ modules.peek $(temp-module) : $(v) ] ;
@@ -79,33 +81,31 @@
 }
 
 
-# Transform features by bracketing any elements which aren't already
-# bracketed by "<>"
+# Transform features by bracketing any elements which aren't already bracketed
+# by "<>".
 local rule grist ( features * )
 {
     local empty = "" ;
- local r = $(empty:G=$(features)) ;
- return $(r) ;
+ return $(empty:G=$(features)) ;
 }
 
-empty = "" ;
 
-# declare a new feature with the given name, values, and attributes.
-rule feature (
- name # feature name
- : values * # the allowable values - may be extended later with feature.extend
- : attributes * # The feature's attributes (e.g. implicit, free, propagated...)
+# Declare a new feature with the given name, values, and attributes.
+rule feature (
+ name # Feature name.
+ : values * # Allowable values - may be extended later using feature.extend.
+ : attributes * # Feature attributes (e.g. implicit, free, propagated...).
 )
 {
     name = [ grist $(name) ] ;
 
     local error ;
 
- # if there are any unknown attributes...
+ # Check for any unknown attributes.
     if ! ( $(attributes) in $(.all-attributes) )
     {
         error = unknown attributes:
- [ set.difference $(attributes) : $(.all-attributes) ] ;
+ [ set.difference $(attributes) : $(.all-attributes) ] ;
     }
     else if $(name) in $(.all-features)
     {
@@ -116,16 +116,15 @@
         error = free features cannot also be implicit ;
     }
     else if free in $(attributes) && propagated in $(attributes)
- {
+ {
         error = free features cannot be propagated ;
- }
-
+ }
 
     if $(error)
     {
- error $(error)
- : "in" feature declaration:
- : feature [ lol->list $(1) : $(2) : $(3) ] ;
+ errors.error $(error)
+ : "in" feature declaration:
+ : feature [ lol->list $(1) : $(2) : $(3) ] ;
     }
 
     $(name).values ?= ;
@@ -142,24 +141,24 @@
     {
         .all-top-features += $(name) ;
     }
- extend $(name) : $(values) ;
+ extend $(name) : $(values) ;
 }
 
-# set default value of the given feature, overriding any previous
-# default.
+
+# Sets the default value of the given feature, overriding any previous default.
 rule set-default ( feature : value )
 {
     local f = [ grist $(feature) ] ;
- if ! $(value) in $($(f).values)
+ if ! $(value) in $($(f).values)
     {
- errors.error "The specified default value, '$(value)' is invalid"
+ errors.error "The specified default value, '$(value)' is invalid"
           : "allowed values are: " $($(f).values) ;
- }
+ }
     $(f).default = $(value) ;
 }
 
 
-# return the default property values for the given features.
+# Returns the default property values for the given features.
 rule defaults ( features * )
 {
     local result ;
@@ -178,7 +177,8 @@
     return $(result) ;
 }
 
-# returns true iff all elements of names are valid features.
+
+# Returns true iff all 'names' elements are valid features.
 rule valid ( names + )
 {
     if $(names) in $(.all-features)
@@ -187,31 +187,33 @@
     }
 }
 
-# return the attibutes of the given feature
+
+# Returns the attibutes of the given feature.
 rule attributes ( feature )
 {
     return $($(:E=:G=$(feature)).attributes) ;
 }
 
-# return the values of the given feature
+
+# Returns the values of the given feature.
 rule values ( feature )
 {
     return $($(:E=:G=$(feature)).values) ;
 }
 
-# returns true iff 'value-string' is a value-string of an implicit feature
+
+# Returns true iff 'value-string' is a value-string of an implicit feature.
 rule is-implicit-value ( value-string )
 {
     local v = [ regex.split $(value-string) - ] ;
     local failed ;
- if ! $(v[1]) in $(.all-implicit-values)
+ if ! $(v[1]) in $(.all-implicit-values)
     {
         failed = true ;
     }
- else
+ else
     {
         local feature = $($(v[1]).implicit-feature) ;
-
         for local subvalue in $(v[2-])
         {
             if ! [ find-implied-subfeature $(feature) $(subvalue) : $(v[1]) ]
@@ -220,82 +222,87 @@
             }
         }
     }
-
- if ! $(failed)
+
+ if ! $(failed)
     {
         return true ;
     }
 }
 
-# return the implicit feature associated with the given implicit value.
+
+# Returns the implicit feature associated with the given implicit value.
 rule implied-feature ( implicit-value )
 {
     local components = [ regex.split $(implicit-value) "-" ] ;
-
+
     local feature = $($(components[1]).implicit-feature) ;
     if ! $(feature)
     {
- error \"$(implicit-value)\" is not a value of an implicit feature ;
- feature = "" ; # keep testing happy; it expects a result.
+ errors.error \"$(implicit-value)\" is not a value of an implicit feature ;
+ feature = "" ; # Keep testing happy; it expects a result.
     }
     return $(feature) ;
 }
 
+
 local rule find-implied-subfeature ( feature subvalue : value-string ? )
 {
- # feature should be of the form <feature-name>
+ # Feature should be of the form <feature-name>.
     if $(feature) != $(feature:G)
     {
- error invalid feature $(feature) ;
+ errors.error invalid feature $(feature) ;
     }
 
     return $($(feature)$(value-string:E="")<>$(subvalue).subfeature) ;
 }
 
-# Given a feature and a value of one of its subfeatures, find the name
-# of the subfeature. If value-string is supplied, looks for implied
-# subfeatures that are specific to that value of feature
-rule implied-subfeature (
- feature # The main feature name
- subvalue # The value of one of its subfeatures
- : value-string ? # The value of the main feature
+
+# Given a feature and a value of one of its subfeatures, find the name of the
+# subfeature. If value-string is supplied, looks for implied subfeatures that
+# are specific to that value of feature
+rule implied-subfeature (
+ feature # The main feature name.
+ subvalue # The value of one of its subfeatures.
+ : value-string ? # The value of the main feature.
 )
 {
     local subfeature = [ find-implied-subfeature $(feature) $(subvalue)
- : $(value-string) ] ;
-
+ : $(value-string) ] ;
     if ! $(subfeature)
     {
         value-string ?= "" ;
- error \"$(subvalue)\" is not a known subfeature value of
- $(feature)$(value-string) ;
+ errors.error \"$(subvalue)\" is not a known subfeature value of
+ $(feature)$(value-string) ;
     }
-
     return $(subfeature) ;
 }
 
-# generate an error if the feature is unknown
+
+# Generate an error if the feature is unknown.
 local rule validate-feature ( feature )
 {
     if ! $(feature) in $(.all-features)
     {
- error unknown feature \"$(feature)\" ;
+ errors.error unknown feature \"$(feature)\" ;
     }
 }
 
-# Given a feature and value, or just a value corresponding to an
-# implicit feature, returns a property set consisting of all component
-# subfeatures and their values. For example:
+
+# Given a feature and its value or just a value corresponding to an implicit
+# feature, returns a property set consisting of all component subfeatures and
+# their values. For example all the following calls:
+#
+# expand-subfeatures-aux <toolset>gcc-2.95.2-linux-x86
+# expand-subfeatures-aux gcc-2.95.2-linux-x86
 #
-# expand-subfeatures <toolset>gcc-2.95.2-linux-x86
-# -> <toolset>gcc <toolset-version>2.95.2 <toolset-os>linux <toolset-cpu>x86
+# return:
 #
-# equivalent to:
-# expand-subfeatures gcc-2.95.2-linux-x86
-local rule expand-subfeatures-aux (
- feature ? # The name of the feature, or empty if value corresponds to an implicit property
- : value # The value of the feature.
- : dont-validate ? # If set, no validation of value string will be done
+# <toolset>gcc <toolset-version>2.95.2 <toolset-os>linux <toolset-cpu>x86
+local rule expand-subfeatures-aux (
+ feature ? # Feature name or empty if value corresponds to an
+ # implicit property.
+ : value # Feature value.
+ : dont-validate ? # If set, no value string validation will be done.
 )
 {
     if $(feature)
@@ -312,31 +319,31 @@
         validate-feature $(feature) ;
     }
     if ! $(dont-validate)
- {
+ {
         validate-value-string $(feature) $(value) ;
     }
-
+
     local components = [ regex.split $(value) "-" ] ;
-
- # get the top-level feature's value
+
+ # Get the top-level feature's value.
     local value = $(components[1]:G=) ;
 
     local result = $(components[1]:G=$(feature)) ;
-
+
     local subvalues = $(components[2-]) ;
     while $(subvalues)
     {
- local subvalue = $(subvalues[1]) ; # pop the head off of subvalues
+ local subvalue = $(subvalues[1]) ; # Pop the head off of subvalues.
         subvalues = $(subvalues[2-]) ;
-
+
         local subfeature = [ find-implied-subfeature $(feature) $(subvalue) : $(value) ] ;
-
- # If no subfeature was found, reconstitute the value string and use that
+
+ # If no subfeature was found reconstitute the value string and use that.
         if ! $(subfeature)
         {
             result = $(components:J=-) ;
             result = $(result:G=$(feature)) ;
- subvalues = ; # stop looping
+ subvalues = ; # Stop looping.
         }
         else
         {
@@ -344,25 +351,27 @@
             result += $(subvalue:G=$(f)-$(subfeature)) ;
         }
     }
-
+
     return $(result) ;
 }
 
-# Make all elements of properties corresponding to implicit features
-# explicit, and express all subfeature values as separate properties
-# in their own right. For example, the property
+
+# Make all elements of properties corresponding to implicit features explicit,
+# and express all subfeature values as separate properties in their own right.
+# For example, all of the following properties
 #
 # gcc-2.95.2-linux-x86
+# <toolset>gcc-2.95.2-linux-x86
 #
 # might expand to
 #
 # <toolset>gcc <toolset-version>2.95.2 <toolset-os>linux <toolset-cpu>x86
 #
-rule expand-subfeatures (
- properties * # property set with elements of the form
- # <feature>value-string or just value-string in the
- # case of implicit features.
- : dont-validate ?
+rule expand-subfeatures (
+ properties * # Property set with elements of the form
+ # <feature>value-string or just value-string in the case
+ # of implicit features.
+ : dont-validate ?
 )
 {
     local result ;
@@ -370,17 +379,18 @@
     {
         # Don't expand subfeatures in subfeatures
         if ! [ MATCH "(:)" : $(p:G) ]
- {
+ {
             result += [ expand-subfeatures-aux $(p:G) : $(p:G=) : $(dont-validate) ] ;
         }
         else
         {
             result += $(p) ;
- }
+ }
     }
     return $(result) ;
 }
 
+
 # Helper for extend, below. Handles the feature case.
 local rule extend-feature ( feature : values * )
 {
@@ -392,7 +402,7 @@
         {
             if $($(v).implicit-feature)
             {
- error $(v) is already associated with the \"$($(v).implicit-feature)\" feature ;
+ errors.error $(v) is already associated with the \"$($(v).implicit-feature)\" feature ;
             }
             $(v).implicit-feature = $(feature) ;
         }
@@ -404,20 +414,21 @@
         # This is the first value specified for this feature,
         # take it as default value
         $(feature).default = $(values[1]) ;
- }
+ }
     $(feature).values += $(values) ;
 }
 
+
 # Checks that value-string is a valid value-string for the given feature.
 rule validate-value-string ( feature value-string )
-{
- if ! (
- free in $($(feature).attributes)
- || ( $(value-string) in $(feature).values )
+{
+ if ! (
+ free in $($(feature).attributes)
+ || ( $(value-string) in $(feature).values )
     )
     {
         local values = $(value-string) ;
-
+
         if $($(feature).subfeatures)
         {
             values = [ regex.split $(value-string) - ] ;
@@ -425,38 +436,33 @@
 
         if ! ( $(values[1]) in $($(feature).values) ) &&
 
- # An empty value is allowed for optional features
- ( $(values[1]) || ! ( optional in $($(feature).attributes) ) )
+ # An empty value is allowed for optional features.
+ ( $(values[1]) || ! ( optional in $($(feature).attributes) ) )
         {
- error \"$(values[1])\" is not a known value of feature $(feature)
- : legal values: \"$($(feature).values)\" ;
+ errors.error \"$(values[1])\" is not a known value of feature $(feature)
+ : legal values: \"$($(feature).values)\" ;
         }
 
         for local v in $(values[2-])
         {
- # this will validate any subfeature values in value-string
+ # This will validate any subfeature values in value-string.
             implied-subfeature $(feature) $(v) : $(values[1]) ;
         }
     }
 }
 
+
 # A helper that computes:
-# * the name(s) of the module-local variable(s) used to record the
-# correspondence between subvalue(s) and a subfeature
-#
-# * the value of that variable when such a subfeature/subvalue has
-# been defined
-#
-# Returns a list consisting of the latter followed by the former
-local rule subvalue-var (
- feature # Main feature name
-
- value-string ? # If supplied, specifies a specific value of the
- # main feature for which the subfeature values
- # are valid
-
- : subfeature # The name of the subfeature
- : subvalues * # The subfeature values
+# * name(s) of module-local variable(s) used to record the correspondence
+# between subvalue(s) and a subfeature
+# * value of that variable when such a subfeature/subvalue has been defined and
+# returns a list consisting of the latter followed by the former.
+local rule subvalue-var (
+ feature # Main feature name.
+ value-string ? # If supplied, specifies a specific value of the main
+ # feature for which the subfeature values are valid.
+ : subfeature # Subfeature name.
+ : subvalues * # Subfeature values.
 )
 {
     feature = [ grist $(feature) ] ;
@@ -472,68 +478,68 @@
     $(feature)$(value-string:E="")<>$(subvalues).subfeature ;
 }
 
-# Extends the given subfeature with the subvalues. If the optional
-# value-string is provided, the subvalues are only valid for the given
-# value of the feature. Thus, you could say that
-# <target-platform>mingw is specifc to <toolset>gcc-2.95.2 as follows:
+
+# Extends the given subfeature with the subvalues. If the optional value-string
+# is provided, the subvalues are only valid for the given value of the feature.
+# Thus, you could say that <target-platform>mingw is specific to
+# <toolset>gcc-2.95.2 as follows:
 #
 # extend-subfeature toolset gcc-2.95.2 : target-platform : mingw ;
 #
-rule extend-subfeature (
- feature # The feature whose subfeature is being extended
-
- value-string ? # If supplied, specifies a specific value of the
- # main feature for which the new subfeature values
- # are valid
-
- : subfeature # The name of the subfeature
- : subvalues * # The additional values of the subfeature being defined.
+rule extend-subfeature (
+ feature # The feature whose subfeature is being extended.
+
+ value-string ? # If supplied, specifies a specific value of the main
+ # feature for which the new subfeature values are valid.
+
+ : subfeature # Subfeature name.
+ : subvalues * # Additional subfeature values.
 )
 {
- local subfeature-vars = [
- subvalue-var $(feature) $(value-string) : $(subfeature) : $(subvalues) ] ;
-
+ local subfeature-vars = [ subvalue-var $(feature) $(value-string)
+ : $(subfeature) : $(subvalues) ] ;
+
     local f = [ utility.ungrist [ grist $(feature) ] ] ;
     extend $(f)-$(subfeature-vars[1]) : $(subvalues) ;
-
- # provide a way to get from the given feature or property and
- # subfeature value to the subfeature name.
+
+ # Provide a way to get from the given feature or property and subfeature
+ # value to the subfeature name.
     $(subfeature-vars[2-]) = $(subfeature-vars[1]) ;
 }
 
-# Returns true iff the subvalues are valid for the feature. When the
-# optional value-string is provided, returns true iff the subvalues
-# are valid for the given value of the feature.
+
+# Returns true iff the subvalues are valid for the feature. When the optional
+# value-string is provided, returns true iff the subvalues are valid for the
+# given value of the feature.
 rule is-subvalue ( feature : value-string ? : subfeature : subvalue )
 {
- local subfeature-vars = [
- subvalue-var $(feature) $(value-string) : $(subfeature) : $(subvalue) ] ;
-
- if $($(subfeature-vars[2])) = $(subfeature-vars[1])
+ local subfeature-vars = [ subvalue-var $(feature) $(value-string)
+ : $(subfeature) : $(subvalue) ] ;
+
+ if $($(subfeature-vars[2])) = $(subfeature-vars[1])
     {
         return true ;
     }
 }
 
+
 # Can be called three ways:
 #
 # 1. extend feature : values *
 # 2. extend <feature> subfeature : values *
 # 3. extend <feature>value-string subfeature : values *
 #
-# * Form 1 adds the given values to the given feature
-# * Forms 2 and 3 add subfeature values to the given feature
-# * Form 3 adds the subfeature values as specific to the given
-# property value-string.
+# * Form 1 adds the given values to the given feature.
+# * Forms 2 and 3 add subfeature values to the given feature.
+# * Form 3 adds the subfeature values as specific to the given property
+# value-string.
 #
 rule extend ( feature-or-property subfeature ? : values * )
 {
- local
- feature # If a property was specified this is its feature
- value-string # E.G., the gcc-2.95-2 part of <toolset>gcc-2.95.2
- ;
+ local feature ; # If a property was specified this is its feature.
+ local value-string ; # E.g., the gcc-2.95-2 part of <toolset>gcc-2.95.2.
 
- # if a property was specified
+ # If a property was specified.
     if $(feature-or-property:G) && $(feature-or-property:G=)
     {
         # Extract the feature and value-string, if any.
@@ -545,140 +551,145 @@
         feature = [ grist $(feature-or-property) ] ;
     }
 
- # Dispatch to the appropriate handler
+ # Dispatch to the appropriate handler.
     if $(subfeature)
     {
- extend-subfeature $(feature) $(value-string)
- : $(subfeature) : $(values) ;
+ extend-subfeature $(feature) $(value-string) : $(subfeature)
+ : $(values) ;
     }
     else
     {
         # If no subfeature was specified, we didn't expect to see a
- # value-string
+ # value-string.
         if $(value-string)
         {
- error can only be specify a property as the first argument
- when extending a subfeature
- : usage:
- : " extend" feature ":" values...
- : " | extend" <feature>value-string subfeature ":" values...
- ;
+ errors.error can only specify a property as the first argument when
+ extending a subfeature
+ : usage:
+ : " extend" feature ":" values...
+ : " | extend" <feature>value-string subfeature ":" values...
+ ;
         }
 
         extend-feature $(feature) : $(values) ;
     }
 }
 
+
 local rule get-subfeature-name ( subfeature value-string ? )
 {
     local prefix = $(value-string): ;
     return $(prefix:E="")$(subfeature) ;
 }
 
-# Declares a subfeature
-rule subfeature (
- feature # Root feature that is not a subfeature
- value-string ? # A value-string specifying which feature or
- # subfeature values this subfeature is specific to,
- # if any
-
- : subfeature # The name of the subfeature being declared
- : subvalues * # The allowed values of this subfeature
- : attributes * # The attributes of the subfeature
+
+# Declares a subfeature.
+rule subfeature (
+ feature # Root feature that is not a subfeature.
+ value-string ? # A value-string specifying which feature or subfeature
+ # values this subfeature is specific to, if any.
+ : subfeature # The name of the subfeature being declared.
+ : subvalues * # The allowed values of this subfeature.
+ : attributes * # The attributes of the subfeature.
 )
 {
     feature = [ grist $(feature) ] ;
     validate-feature $(feature) ;
-
- # Add grist to the subfeature name if a value-string was supplied
+
+ # Add grist to the subfeature name if a value-string was supplied.
     local subfeature-name = [ get-subfeature-name $(subfeature) $(value-string) ] ;
-
+
     if $(subfeature-name) in $($(feature).subfeatures)
     {
- error \"$(subfeature)\" already declared as a subfeature of \"$(feature)\"
- "specific to "$(value-string) ;
+ errors.error \"$(subfeature)\" already declared as a subfeature of \"$(feature)\"
+ "specific to "$(value-string) ;
     }
     $(feature).subfeatures += $(subfeature-name) ;
-
- # First declare the subfeature as a feature in its own right
+
+ # First declare the subfeature as a feature in its own right.
     local f = [ utility.ungrist $(feature) ] ;
     feature $(f)-$(subfeature-name) : $(subvalues) : $(attributes) subfeature ;
-
+
     # Now make sure the subfeature values are known.
     extend-subfeature $(feature) $(value-string) : $(subfeature) : $(subvalues) ;
 }
 
-# Set the components of the given composite property
+
+# Set components of the given composite property.
 rule compose ( composite-property : component-properties * )
 {
     local feature = $(composite-property:G) ;
     if ! ( composite in [ attributes $(feature) ] )
     {
- error "$(feature)" is not a composite feature ;
+ errors.error "$(feature)" is not a composite feature ;
     }
 
     $(composite-property).components ?= ;
     if $($(composite-property).components)
     {
- error components of "$(composite-property)" already set:
- $($(composite-property).components) ;
+ errors.error components of "$(composite-property)" already set:
+ $($(composite-property).components) ;
     }
 
     if $(composite-property) in $(component-properties)
     {
- error composite property "$(composite-property)" cannot have itself as a component ;
+ errors.error composite property "$(composite-property)" cannot have itself as a component ;
     }
     $(composite-property).components = $(component-properties) ;
 }
 
+
 local rule expand-composite ( property )
 {
     return $(property)
- [ sequence.transform expand-composite : $($(property).components) ] ;
+ [ sequence.transform expand-composite : $($(property).components) ] ;
 }
 
-# return all values of the given feature specified by the given property set.
+
+# Return all values of the given feature specified by the given property set.
 rule get-values ( feature : properties * )
 {
     local result ;
-
- feature = $(:E=:G=$(feature)) ; # add <> if necessary.
+
+ feature = $(:E=:G=$(feature)) ; # Add <> if necessary.
     for local p in $(properties)
     {
         if $(p:G) = $(feature)
         {
- #~ Use MATCH instead if :G= to get the value, in order to preserve
- #~ the value intact instead of having bjam treat it as a decompossible
- #~ path.
+ # Use MATCH instead of :G= to get the value, in order to preserve
+ # the value intact instead of having bjam treat it as a decomposable
+ # path.
             result += [ MATCH ">(.*)" : $(p) ] ;
         }
     }
     return $(result) ;
 }
 
+
 rule free-features ( )
 {
     return $(free.features) ;
 }
 
-# Expand all composite properties in the set so that all components
-# are explicitly expressed.
+
+# Expand all composite properties in the set so that all components are
+# explicitly expressed.
 rule expand-composites ( properties * )
 {
     local explicit-features = $(properties:G) ;
-
     local result ;
- # now expand composite features
+
+ # Now expand composite features.
     for local p in $(properties)
     {
         local expanded = [ expand-composite $(p) ] ;
-
+
         for local x in $(expanded)
         {
             if ! $(x) in $(result)
             {
                 local f = $(x:G) ;
-
+
                 if $(f) in $(free.features)
                 {
                     result += $(x) ;
@@ -689,21 +700,21 @@
                     {
                         if $(f) in $(result:G)
                         {
- error expansions of composite features result in conflicting
- values for $(f)
- : values: [ get-values $(f) : $(result) ] $(x:G=)
- : one contributing composite property was $(p) ;
+ errors.error expansions of composite features result
+ in conflicting values for $(f)
+ : values: [ get-values $(f) : $(result) ] $(x:G=)
+ : one contributing composite property was $(p) ;
                         }
                         else
                         {
                             result += $(x) ;
                         }
                     }
- }
+ }
                 else if $(f) in $(result:G)
                 {
- error explicitly-specified values of non-free feature
- $(f) conflict :
+ errors.error explicitly-specified values of non-free feature
+ $(f) conflict :
                         "existing values:" [ get-values $(f) : $(properties) ] :
                         "value from expanding " $(p) ":" $(x:G=) ;
                 }
@@ -711,15 +722,16 @@
                 {
                     result += $(x) ;
                 }
- }
+ }
         }
     }
     return $(result) ;
 }
 
-# Return true iff f is an ordinary subfeature of the parent-property's
-# feature, or if f is a subfeature fo the parent-property's feature
-# specific to the parent-property's value
+
+# Return true iff f is an ordinary subfeature of the parent-property's feature,
+# or if f is a subfeature of the parent-property's feature specific to the
+# parent-property's value.
 local rule is-subfeature-of ( parent-property f )
 {
     if subfeature in $($(f).attributes)
@@ -727,9 +739,8 @@
         local specific-subfeature = [ MATCH <(.*):(.*)> : $(f) ] ;
         if $(specific-subfeature)
         {
- # The feature has the form
- # <topfeature-topvalue:subfeature>,
- # e.g. <toolset-msvc:version>
+ # The feature has the form <topfeature-topvalue:subfeature>, e.g.
+ # <toolset-msvc:version>.
             local feature-value = [ split-top-feature $(specific-subfeature[1]) ] ;
             if <$(feature-value[1])>$(feature-value[2]) = $(parent-property)
             {
@@ -738,10 +749,9 @@
         }
         else
         {
- # The feature has the form <topfeature-subfeature>,
- # e.g. <toolset-version>
+ # The feature has the form <topfeature-subfeature>, e.g.
+ # <toolset-version>
             local top-sub = [ split-top-feature [ utility.ungrist $(f) ] ] ;
-
             if $(top-sub[2]) && <$(top-sub[1])> = $(parent-property:G)
             {
                 return true ;
@@ -750,46 +760,47 @@
     }
 }
 
-# as above, for subproperties
+
+# As for is-subfeature-of but for subproperties.
 local rule is-subproperty-of ( parent-property p )
 {
     return [ is-subfeature-of $(parent-property) $(p:G) ] ;
 }
 
-# Given a property, return the subset of features consisting of all
-# ordinary subfeatures of the property's feature, and all specific
-# subfeatures of the property's feature which are conditional on the
-# property's value.
+
+# Given a property, return the subset of features consisting of all ordinary
+# subfeatures of the property's feature, and all specific subfeatures of the
+# property's feature which are conditional on the property's value.
 local rule select-subfeatures ( parent-property : features * )
 {
     return [ sequence.filter is-subfeature-of $(parent-property) : $(features) ] ;
 }
-
-# as above, for subproperties
+
+
+# As for select-subfeatures but for subproperties.
 local rule select-subproperties ( parent-property : properties * )
 {
     return [ sequence.filter is-subproperty-of $(parent-property) : $(properties) ] ;
 }
 
-# Given a property set which may consist of composite and implicit
-# properties and combined subfeature values, returns an expanded,
-# normalized property set with all implicit features expressed
-# explicitly, all subfeature values individually expressed, and all
-# components of composite properties expanded. Non-free features
-# directly expressed in the input properties cause any values of
-# those features due to composite feature expansion to be dropped. If
-# two values of a given non-free feature are directly expressed in the
-# input, an error is issued.
+
+# Given a property set which may consist of composite and implicit properties
+# and combined subfeature values, returns an expanded, normalized property set
+# with all implicit features expressed explicitly, all subfeature values
+# individually expressed, and all components of composite properties expanded.
+# Non-free features directly expressed in the input properties cause any values
+# of those features due to composite feature expansion to be dropped. If two
+# values of a given non-free feature are directly expressed in the input, an
+# error is issued.
 rule expand ( properties * )
 {
     local expanded = [ expand-subfeatures $(properties) ] ;
-
     return [ expand-composites $(expanded) ] ;
 }
 
 
-# Helper rule for minimize, below - return true iff property's feature
-# is present in the contents of the variable named by feature-set-var.
+# Helper rule for minimize. Returns true iff property's feature is present in
+# the contents of the variable named by feature-set-var.
 local rule in-features ( feature-set-var property )
 {
     if $(property:G) in $($(feature-set-var))
@@ -798,9 +809,9 @@
     }
 }
 
-# Helper for minimize, below - returns the list with
-# the same properties, but where all subfeatures
-# are in the end of the list
+
+# Helper rule for minimize. Returns the list with the same properties, but with
+# all subfeatures moved to the end of the list.
 local rule move-subfeatures-to-the-end ( properties * )
 {
     local x1 ;
@@ -814,53 +825,53 @@
         else
         {
             x1 += $(p) ;
- }
+ }
     }
- return $(x1) $(x2) ;
+ return $(x1) $(x2) ;
 }
 
 
-# Given an expanded property set, eliminate all redundancy: properties
-# which are elements of other (composite) properties in the set will
-# be eliminated. Non-symmetric properties equal to default values will be
-# eliminated, unless the override a value from some composite property.
-# Implicit properties will be expressed without feature
-# grist, and sub-property values will be expressed as elements joined
-# to the corresponding main property.
+# Given an expanded property set, eliminate all redundancy: properties that are
+# elements of other (composite) properties in the set will be eliminated.
+# Non-symmetric properties equal to default values will be eliminated unless
+# they override a value from some composite property. Implicit properties will
+# be expressed without feature grist, and sub-property values will be expressed
+# as elements joined to the corresponding main property.
 rule minimize ( properties * )
 {
     # Precondition checking
     local implicits = [ set.intersection $(p:G=) : $(p:G) ] ;
     if $(implicits)
     {
- error minimize requires an expanded property set, but \"$(implicits[1])\"
- appears to be the value of an un-expanded implicit feature ;
+ errors.error minimize requires an expanded property set, but
+ \"$(implicits[1])\" appears to be the value of an un-expanded
+ implicit feature ;
     }
-
- # remove properties implied by composite features
+
+ # Remove properties implied by composite features.
     local components = $($(properties).components) ;
     local x = [ set.difference $(properties) : $(components) ] ;
-
- # handle subfeatures and implicit features
- x = [ move-subfeatures-to-the-end $(x) ] ;
+
+ # Handle subfeatures and implicit features.
+ x = [ move-subfeatures-to-the-end $(x) ] ;
     local result ;
     while $(x)
     {
         local p fullp = $(x[1]) ;
         local f = $(p:G) ;
         local v = $(p:G=) ;
-
- # eliminate features in implicit properties.
+
+ # Eliminate features in implicit properties.
         if implicit in [ attributes $(f) ]
         {
             p = $(v) ;
         }
 
- # locate all subproperties of $(x[1]) in the property set
+ # Locate all subproperties of $(x[1]) in the property set.
         local subproperties = [ select-subproperties $(fullp) : $(x) ] ;
         if $(subproperties)
         {
- # reconstitute the joined property name
+ # Reconstitute the joined property name.
             local sorted = [ sequence.insertion-sort $(subproperties) ] ;
             result += $(p)-$(sorted:G="":J=-) ;
 
@@ -868,16 +879,16 @@
         }
         else
         {
- # eliminate properties whose value is equal to feature's
- # default and which are not symmetric and which do not
- # contradict values implied by composite properties.
-
- # since all component properties of composites in the set
- # have been eliminated, any remaining property whose
- # feature is the same as a component of a composite in the
- # set must have a non-redundant value.
+ # Eliminate properties whose value is equal to feature's default,
+ # which are not symmetric and which do not contradict values implied
+ # by composite properties.
+
+ # Since all component properties of composites in the set have been
+ # eliminated, any remaining property whose feature is the same as a
+ # component of a composite in the set must have a non-redundant
+ # value.
             if $(fullp) != [ defaults $(f) ]
- || symmetric in [ attributes $(f) ]
+ || symmetric in [ attributes $(f) ]
                 || $(fullp:G) in $(components:G)
             {
                 result += $(p) ;
@@ -889,33 +900,33 @@
     return $(result) ;
 }
 
+
 # Combine all subproperties into their parent properties
 #
-# Requires: for every subproperty, there is a parent property. All
-# features are explicitly expressed.
+# Requires: for every subproperty, there is a parent property. All features are
+# explicitly expressed.
 #
-# This rule probably shouldn't be needed, but
-# build-request.expand-no-defaults is being abused for unintended
-# purposes and it needs help
+# This rule probably shouldn't be needed, but build-request.expand-no-defaults
+# is being abused for unintended purposes and it needs help.
 rule compress-subproperties ( properties * )
 {
- local all-subs matched-subs result ;
-
+ local all-subs ;
+ local matched-subs ;
+ local result ;
+
     for local p in $(properties)
     {
         if ! $(p:G)
         {
- assert.nonempty-variable p:G ; # expecting fully-gristed properties
+ # Expecting fully-gristed properties.
+ assert.nonempty-variable p:G ;
         }
-
-
+
         if ! subfeature in $($(p:G).attributes)
         {
- local subs = [
- sequence.insertion-sort
- [ sequence.filter is-subproperty-of $(p) : $(properties) ]
- ] ;
-
+ local subs = [ sequence.insertion-sort
+ [ sequence.filter is-subproperty-of $(p) : $(properties) ] ] ;
+
             matched-subs += $(subs) ;
 
             local subvalues = -$(subs:G=:J=-) ;
@@ -930,17 +941,16 @@
     assert.result true : set.equal $(all-subs) : $(matched-subs) ;
     return $(result) ;
 }
-
-# given an ungristed string, finds the longest prefix which is a
-# top-level feature name followed by a dash, and return a pair
-# consisting of the parts before and after that dash. More
-# interesting than a simple split because feature names can contain
-# dashes.
+
+
+# Given an ungristed string, finds the longest prefix which is a top-level
+# feature name followed by a dash, and return a pair consisting of the parts
+# before and after that dash. More interesting than a simple split because
+# feature names may contain dashes.
 local rule split-top-feature ( feature-plus )
 {
     local e = [ regex.split $(feature-plus) - ] ;
     local f = $(e[1]) ;
-
     local v ;
     while $(e)
     {
@@ -953,22 +963,24 @@
     }
     return $(v) ;
 }
-
-# Given a set of properties, add default values for features not
-# represented in the set.
-# Note: if there's there's ordinary feature F1 and composite feature
-# F2, which includes some value for F1, and both feature have default values,
-# then the default value of F1 will be added, not the value in F2. This might
-# not be right idea: consider
+
+
+# Given a set of properties, add default values for features not represented in
+# the set.
+#
+# Note: if there's an ordinary feature F1 and a composite feature F2 which
+# includes some value for F1 and both feature have default values then the
+# default value of F1 will be added (as opposed to the value in F2). This might
+# not be the right idea, e.g. consider:
 #
 # feature variant : debug ... ;
 # <variant>debug : .... <runtime-debugging>on
 # feature <runtime-debugging> : off on ;
-#
+#
 # Here, when adding default for an empty property set, we'll get
 #
 # <variant>debug <runtime_debugging>off
-#
+#
 # and that's kind of strange.
 rule add-defaults ( properties * )
 {
@@ -976,22 +988,23 @@
     {
         if $(v) in $(properties)
         {
- error add-defaults requires explicitly specified features,
- but \"$(v)\" appears to be the value of an un-expanded implicit feature ;
+ errors.error add-defaults requires explicitly specified features,
+ but \"$(v)\" appears to be the value of an un-expanded implicit
+ feature ;
         }
     }
     # We don't add default for elements with ":" inside. This catches:
     # 1. Conditional properties --- we don't want <variant>debug:<define>DEBUG
     # to be takes as specified value for <variant>
- # 2. Free properties with ":" in values. We don't care, since free properties
- # don't have defaults.
+ # 2. Free properties with ":" in values. We don't care, since free
+ # properties don't have defaults.
     local xproperties = [ MATCH "^([^:]+)$" : $(properties) ] ;
     local missing-top = [ set.difference $(.all-top-features) : $(xproperties:G) ] ;
     local more = [ defaults $(missing-top) ] ;
     properties += $(more) ;
     xproperties += $(more) ;
-
- # Add defaults for subfeatures of features which are present
+
+ # Add defaults for subfeatures of features which are present.
     for local p in $(xproperties)
     {
         local s = $($(p:G).subfeatures) ;
@@ -999,19 +1012,20 @@
         local missing-subs = [ set.difference <$(f)-$(s)> : $(properties:G) ] ;
         properties += [ defaults [ select-subfeatures $(p) : $(missing-subs) ] ] ;
     }
-
+
     return $(properties) ;
 }
 
+
 # Given a property-set of the form
 # v1/v2/...vN-1/<fN>vN/<fN+1>vN+1/...<fM>vM
 #
 # Returns
 # v1 v2 ... vN-1 <fN>vN <fN+1>vN+1 ... <fM>vM
 #
-# Note that vN...vM may contain slashes. This is resilient to the
-# substitution of backslashes for slashes, since Jam, unbidden,
-# sometimes swaps slash direction on NT.
+# Note that vN...vM may contain slashes. This needs to be resilient to the
+# substitution of backslashes for slashes, since Jam, unbidden, sometimes swaps
+# slash direction on NT.
 rule split ( property-set )
 {
     local pieces = [ regex.split $(property-set) [\\/] ] ;
@@ -1032,18 +1046,19 @@
     return $(result) ;
 }
 
-# tests of module feature
+
+# Tests of module feature.
 local rule __test__ ( )
 {
- # use a fresh copy of the feature module
+ # Use a fresh copy of the feature module.
     prepare-test feature-test-temp ;
 
- # These are local rules and so must be explicitly reimported into
- # the testing module
- import feature : extend-feature validate-feature select-subfeatures ;
-
- import errors : try catch ;
     import assert ;
+ import errors : try catch ;
+
+ # These are local rules and so must be explicitly reimported into the
+ # testing module.
+ import feature : extend-feature validate-feature select-subfeatures ;
 
     feature toolset : gcc : implicit ;
     feature define : : free ;
@@ -1063,84 +1078,74 @@
     {
         compose <variant>profile : <variant>profile ;
     }
- catch composite property <variant>profile cannot have itself as a component ;
+ catch composite property <variant>profile cannot have itself as a component ;
 
     extend-feature toolset : msvc metrowerks ;
- subfeature toolset gcc : version : 2.95.2 2.95.3 2.95.4
- 3.0 3.0.1 3.0.2 ;
-
+ subfeature toolset gcc : version : 2.95.2 2.95.3 2.95.4 3.0 3.0.1 3.0.2 ;
+
     assert.true is-subvalue toolset : gcc : version : 2.95.3 ;
     assert.false is-subvalue toolset : gcc : version : 1.1 ;
 
     assert.false is-subvalue toolset : msvc : version : 2.95.3 ;
     assert.false is-subvalue toolset : : version : yabba ;
-
+
     feature yabba ;
     subfeature yabba : version : dabba ;
     assert.true is-subvalue yabba : : version : dabba ;
-
-
+
     subfeature toolset gcc : platform : linux cygwin : optional ;
-
+
     assert.result <toolset-gcc:version>
- : select-subfeatures <toolset>gcc
- : <toolset-gcc:version>
- <toolset-msvc:version>
- <toolset-version>
- <stdlib>
- ;
-
+ : select-subfeatures <toolset>gcc
+ : <toolset-gcc:version>
+ <toolset-msvc:version>
+ <toolset-version>
+ <stdlib> ;
+
     subfeature stdlib : version : 3 4 : optional ;
 
     assert.result <stdlib-version>
- : select-subfeatures <stdlib>native
- : <toolset-gcc:version>
- <toolset-msvc:version>
- <toolset-version>
- <stdlib-version>
- ;
-
+ : select-subfeatures <stdlib>native
+ : <toolset-gcc:version>
+ <toolset-msvc:version>
+ <toolset-version>
+ <stdlib-version> ;
+
     assert.result <toolset>gcc <toolset-gcc:version>3.0.1
- : expand-subfeatures <toolset>gcc-3.0.1 ;
-
+ : expand-subfeatures <toolset>gcc-3.0.1 ;
+
     assert.result <toolset>gcc <toolset-gcc:version>3.0.1 <toolset-gcc:platform>linux
- : expand-subfeatures <toolset>gcc-3.0.1-linux ;
+ : expand-subfeatures <toolset>gcc-3.0.1-linux ;
 
-
     assert.result <toolset>gcc <toolset-gcc:version>3.0.1
- : expand <toolset>gcc <toolset-gcc:version>3.0.1 ;
-
+ : expand <toolset>gcc <toolset-gcc:version>3.0.1 ;
+
     assert.result <define>foo=x-y
- : expand-subfeatures <define>foo=x-y ;
+ : expand-subfeatures <define>foo=x-y ;
 
     assert.result <toolset>gcc <toolset-gcc:version>3.0.1
- : expand-subfeatures gcc-3.0.1 ;
-
+ : expand-subfeatures gcc-3.0.1 ;
+
     assert.result a c e
- : get-values <x> : <x>a <y>b <x>c <y>d <x>e ;
+ : get-values <x> : <x>a <y>b <x>c <y>d <x>e ;
 
     assert.result <toolset>gcc <toolset-gcc:version>3.0.1
- <variant>debug <define>_DEBUG <optimization>on
- : expand gcc-3.0.1 debug <optimization>on
- ;
-
+ <variant>debug <define>_DEBUG <optimization>on
+ : expand gcc-3.0.1 debug <optimization>on ;
+
     assert.result <variant>debug <define>_DEBUG <optimization>on
- : expand debug <optimization>on
- ;
+ : expand debug <optimization>on ;
 
- assert.result <optimization>on <variant>debug <define>_DEBUG
- : expand <optimization>on debug
- ;
+ assert.result <optimization>on <variant>debug <define>_DEBUG
+ : expand <optimization>on debug ;
 
     assert.result <runtime-link>dynamic <optimization>on
- : defaults <runtime-link> <define> <optimization>
- ;
-
- # make sure defaults is resilient to missing grist.
+ : defaults <runtime-link> <define> <optimization> ;
+
+ # Make sure defaults is resilient to missing grist.
     assert.result <runtime-link>dynamic <optimization>on
- : defaults runtime-link define optimization
- ;
-
+ : defaults runtime-link define optimization ;
+
     feature dummy : dummy1 dummy2 ;
     subfeature dummy : subdummy : x y z : optional ;
 
@@ -1150,68 +1155,54 @@
 
     assert.result optional : attributes <fu> ;
     assert.result optional : attributes fu ;
-
- assert.result <runtime-link>static <define>foobar <optimization>on <toolset>gcc:<define>FOO
- <toolset>gcc <variant>debug <stdlib>native <dummy>dummy1 <toolset-gcc:version>2.95.2
-
- : add-defaults <runtime-link>static <define>foobar
- <optimization>on <toolset>gcc:<define>FOO
- ;
-
- assert.result <runtime-link>static <define>foobar <optimization>on <toolset>gcc:<define>FOO
- <fu>fu1 <toolset>gcc <variant>debug <stdlib>native <dummy>dummy1 <fu-subfu2>q
- <toolset-gcc:version>2.95.2
-
- : add-defaults <runtime-link>static <define>foobar
- <optimization>on <toolset>gcc:<define>FOO <fu>fu1
- ;
-
+
+ assert.result <runtime-link>static <define>foobar <optimization>on
+ <toolset>gcc:<define>FOO <toolset>gcc <variant>debug <stdlib>native
+ <dummy>dummy1 <toolset-gcc:version>2.95.2
+ : add-defaults <runtime-link>static <define>foobar <optimization>on
+ <toolset>gcc:<define>FOO ;
+
+ assert.result <runtime-link>static <define>foobar <optimization>on
+ <toolset>gcc:<define>FOO <fu>fu1 <toolset>gcc <variant>debug
+ <stdlib>native <dummy>dummy1 <fu-subfu2>q <toolset-gcc:version>2.95.2
+ : add-defaults <runtime-link>static <define>foobar <optimization>on
+ <toolset>gcc:<define>FOO <fu>fu1 ;
+
     set-default <runtime-link> : static ;
- assert.result <runtime-link>static
- : defaults <runtime-link>
- ;
-
+ assert.result <runtime-link>static : defaults <runtime-link> ;
+
     assert.result gcc-3.0.1 debug <optimization>on
- : minimize [ expand gcc-3.0.1 debug <optimization>on <stdlib>native ]
- ;
+ : minimize [ expand gcc-3.0.1 debug <optimization>on <stdlib>native ] ;
 
     assert.result gcc-3.0.1 debug <runtime-link>dynamic
- : minimize [ expand gcc-3.0.1 debug <optimization>off <runtime-link>dynamic ]
- ;
+ : minimize
+ [ expand gcc-3.0.1 debug <optimization>off <runtime-link>dynamic ] ;
 
     assert.result gcc-3.0.1 debug
- : minimize [ expand gcc-3.0.1 debug <optimization>off ]
- ;
+ : minimize [ expand gcc-3.0.1 debug <optimization>off ] ;
 
     assert.result debug <optimization>on
- : minimize [ expand debug <optimization>on ]
- ;
+ : minimize [ expand debug <optimization>on ] ;
 
     assert.result gcc-3.0
- : minimize <toolset>gcc <toolset-gcc:version>3.0
- ;
+ : minimize <toolset>gcc <toolset-gcc:version>3.0 ;
 
     assert.result gcc-3.0
- : minimize <toolset-gcc:version>3.0 <toolset>gcc
- ;
+ : minimize <toolset-gcc:version>3.0 <toolset>gcc ;
 
     assert.result <x>y/z <a>b/c <d>e/f
- : split <x>y/z/<a>b/c/<d>e/f
- ;
+ : split <x>y/z/<a>b/c/<d>e/f ;
 
     assert.result <x>y/z <a>b/c <d>e/f
- : split <x>y\\z\\<a>b\\c\\<d>e\\f
- ;
+ : split <x>y\\z\\<a>b\\c\\<d>e\\f ;
 
     assert.result a b c <d>e/f/g <h>i/j/k
- : split a/b/c/<d>e/f/g/<h>i/j/k
- ;
+ : split a/b/c/<d>e/f/g/<h>i/j/k ;
 
     assert.result a b c <d>e/f/g <h>i/j/k
- : split a\\b\\c\\<d>e\\f\\g\\<h>i\\j\\k
- ;
+ : split a\\b\\c\\<d>e\\f\\g\\<h>i\\j\\k ;
 
- # test error checking
+ # Test error checking.
 
     try ;
     {
@@ -1269,16 +1260,14 @@
     {
         implied-subfeature <toolset> 3.0.1 ;
     }
- catch \"3.0.1\" is not a known subfeature value of
- <toolset> ;
+ catch \"3.0.1\" is not a known subfeature value of <toolset> ;
 
     try ;
     {
         implied-subfeature <toolset> not-a-version : gcc ;
     }
- catch \"not-a-version\" is not a known subfeature value of
- <toolset>gcc ;
+ catch \"not-a-version\" is not a known subfeature value of <toolset>gcc ;
 
- # leave a clean copy of the features module behind
+ # Leave a clean copy of the features module behind.
     finish-test feature-test-temp ;
 }

Modified: trunk/tools/build/v2/build/generators.jam
==============================================================================
--- trunk/tools/build/v2/build/generators.jam (original)
+++ trunk/tools/build/v2/build/generators.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -10,55 +10,60 @@
 # sources to targets.
 #
 # The main entry point to this module is generators.construct rule. It is given
-# a list of source targets, desired target type and a set of properties.
-# It starts by selecting 'viable generators', which have any chances of
-# producing the desired target type with the required properties. Generators
-# are ranked and a set of most specific ones is selected.
+# a list of source targets, desired target type and a set of properties. It
+# starts by selecting 'viable generators', which have any chances of producing
+# the desired target type with the required properties. Generators are ranked
+# and a set of the most specific ones is selected.
 #
 # The most specific generators have their 'run' methods called, with the
-# properties and list of sources. Each one selects target which can be directly
-# consumed, and tries to convert the remaining ones to the types it can
-# consume. This is done by recursively calling 'construct' with all consumable
-# types.
+# properties and list of sources. Each one selects a target which can be
+# directly consumed, and tries to convert the remaining ones to the types it
+# can consume. This is done by recursively calling 'construct' with all
+# consumable types.
 #
 # If the generator has collected all the targets it needs, it creates targets
 # corresponding to result, and returns it. When all generators have been run,
-# results of one of them are selected and returned as result.
+# results of one of them are selected and returned as a result.
 #
-# It's quite possible that 'construct' returns more targets that it was asked for.
-# For example, it was asked to target type EXE, but the only found generators produces
-# both EXE and TDS (file with debug) information. The extra target will be returned.
+# It's quite possible that 'construct' returns more targets that it was asked
+# for. For example, it was asked to target type EXE, but the only found
+# generators produces both EXE and TDS (file with debug) information. The extra
+# target will be returned.
 #
-# Likewise, when generator tries to convert sources to consumable types, it can get
-# more targets that it was asked for. The question is what to do with extra targets.
-# Boost.Build attempts to convert them to requested types, and attempts as early as
-# possible. Specifically, this is done after invoking each generator. (Later I'll
-# document the rationale for trying extra target conversion at that point).
+# Likewise, when generator tries to convert sources to consumable types, it can
+# get more targets that it was asked for. The question is what to do with extra
+# targets. Boost.Build attempts to convert them to requested types, and
+# attempts that as early as possible. Specifically, this is done after invoking
+# each generator. (Later I'll document the rationale for trying extra target
+# conversion at that point).
 #
-# That early conversion is not always desirable. Suppose a generator got a source of
-# type Y and must consume one target of type X_1 and one target of type X_2.
-# When converting Y to X_1 extra target of type Y_2 is created. We should not try to
-# convert it to type X_1, because if we do so, the generator will get two targets
-# of type X_1, and will be at loss as to which one to use. Because of that, the
-# 'construct' rule has a parameter, telling if multiple targets can be returned. If
-# the parameter is false, conversion of extra targets is not performed.
+# That early conversion is not always desirable. Suppose a generator got a
+# source of type Y and must consume one target of type X_1 and one target of
+# type X_2. When converting Y to X_1 extra target of type Y_2 is created. We
+# should not try to convert it to type X_1, because if we do so, the generator
+# will get two targets of type X_1, and will be at loss as to which one to use.
+# Because of that, the 'construct' rule has a parameter, telling if multiple
+# targets can be returned. If the parameter is false, conversion of extra
+# targets is not performed.
 
 import "class" : new ;
-import container ;
-import utility : str equal ;
-import set sequence ;
-import assert ;
-import virtual-target ;
+import errors ;
 import property-set ;
+import sequence ;
+import set ;
+import utility ;
+import virtual-target ;
+
 
 if "--debug-generators" in [ modules.peek : ARGV ]
 {
     .debug = true ;
 }
 
-# Outputs a debug message if generators debugging is on.
-# Each element of 'message' is checked to see if it's class instance.
-# If so, instead of the value, the result of 'str' call is output.
+
+# Outputs a debug message if generators debugging is on. Each element of
+# 'message' is checked to see if it's class instance. If so, instead of the
+# value, the result of 'str' call is output.
 local rule generators.dout ( message * )
 {
     if $(.debug)
@@ -73,16 +78,19 @@
     return $(.indent:J="") ;
 }
 
+
 local rule increase-indent ( )
 {
     .indent += " " ;
 }
 
+
 local rule decrease-indent ( )
 {
     .indent = $(.indent[2-]) ;
 }
 
+
 # Takes a vector of 'virtual-target' instances and makes a normalized
 # representation, which is the same for given set of targets,
 # regardless of their order.
@@ -92,17 +100,15 @@
     $(targets).set $(v[1]) [ sequence.insertion-sort $(v[2-]) : utility.less ] ;
 }
 
+
 # Creates a generator
 class generator
 {
- import generators ;
- import assert ;
     import generators : indent increase-indent decrease-indent generators.dout ;
- import generators ;
     import set ;
- import utility : equal ;
+ import utility ;
     import feature ;
- import errors : error ;
+ import errors ;
     import sequence ;
     import type ;
     import virtual-target ;
@@ -312,14 +318,12 @@
         if $(self.composing)
         {
             convert-multiple-sources-to-consumable-types $(project)
- : $(property-set) : $(sources) : consumed bypassed ;
+ : $(property-set) : $(sources) : consumed bypassed ;
         }
         else
         {
- convert-to-consumable-types $(project) $(name) :
- $(property-set) : $(sources)
- :
- : consumed bypassed ;
+ convert-to-consumable-types $(project) $(name) : $(property-set)
+ : $(sources) : : consumed bypassed ;
         }
 
         local result ;
@@ -329,10 +333,9 @@
                      : $(property-set) ] ;
         }
 
-
         if $(result)
         {
- generators.dout [ indent ] " SUCCESS: " $(result) ;
+ generators.dout [ indent ] " SUCCESS: " $(result) ;
         }
         else
         {
@@ -342,8 +345,7 @@
         return $(result) ;
     }
 
- # Constructs the dependency graph that will be returned by this
- # generator
+ # Constructs the dependency graph to be returned by this generator.
     rule construct-result (
         consumed + # Already prepared list of consumable targets
                    # If generator requires several source files will contain
@@ -351,7 +353,7 @@
                    # Otherwise, might contain several targets with the type of
                    # $(self.source-types[1])
         : project name ?
- : property-set # Properties to be used for all actions create here
+ : property-set # Properties to be used for all actions create here.
     )
     {
         local result ;
@@ -374,8 +376,7 @@
         return $(result) ;
     }
 
- # Determine the name of the produced target from the
- # names of the sources.
+ # Determine the name of the produced target from the names of the sources.
     rule determine-output-name ( sources + )
     {
         # The simple case if when a name
@@ -394,7 +395,7 @@
             local n2 = [ utility.basename [ $(s).name ] ] ;
             if $(n2) != $(name)
             {
- error "$(self.id): source targets have different names: cannot determine target name" ;
+ errors.error "$(self.id): source targets have different names: cannot determine target name" ;
             }
         }
 
@@ -404,22 +405,22 @@
         return $(name) ;
     }
 
- # Constructs targets that are created after consuming 'sources'.
- # The result will be the list of virtual-target, which the same length
- # as 'target-types' attribute and with corresponding types.
+ # Constructs targets that are created after consuming 'sources'. The result
+ # will be the list of virtual-target, which has the same length as the
+ # 'target-types' attribute and with corresponding types.
     #
- # When 'name' is empty, all source targets must have the same value of
- # the 'name' attribute, which will be used instead of the 'name' argument.
+ # When 'name' is empty, all source targets must have the same value of the
+ # 'name' attribute, which will be used instead of the 'name' argument.
     #
     # The value of 'name' attribute for each generated target will be equal to
     # the 'name' parameter if there's no name pattern for this type. Otherwise,
- # the '%' symbol in the name pattern will be replaced with the 'name' parameter
- # to obtain the 'name' attribute.
+ # the '%' symbol in the name pattern will be replaced with the 'name'
+ # parameter to obtain the 'name' attribute.
     #
- # For example, if targets types are T1 and T2(with name pattern "%_x"), suffixes
- # for T1 and T2 are .t1 and t2, and source if foo.z, then created files would
- # be "foo.t1" and "foo_x.t2". The 'name' attribute actually determined the
- # basename of a file.
+ # For example, if targets types are T1 and T2(with name pattern "%_x"),
+ # suffixes for T1 and T2 are .t1 and t2, and source if foo.z, then created
+ # files would be "foo.t1" and "foo_x.t2". The 'name' attribute actually
+ # determines the basename of a file.
     #
     # Note that this pattern mechanism has nothing to do with implicit patterns
     # in make. It's a way to produce target which name is different for name of
@@ -458,12 +459,11 @@
     # used when generator is run.
     rule convert-to-consumable-types ( project name ? :
         property-set : sources +
- : only-one ? # convert 'source' to only one of source types
- # if there's more that one possibility, report an
- # error
- : consumed-var # name of variable which recieves all targets which
+ : only-one ? # Convert 'source' to only one of the source types. If
+ # there's more that one possibility, report an error.
+ : consumed-var # Name of the variable which recieves all targets which
                        # can be consumed.
- bypassed-var # name variable which recieves all targets which
+ bypassed-var # Name of the variable which recieves all targets which
                        # cannot be consumed
     )
     {
@@ -600,11 +600,11 @@
     }
 }
 
-import errors : error ;
 
 .generators = ;
 
-# Registers new generator instance 'g'.
+
+# Registers a new generator instance 'g'.
 rule register ( g )
 {
     .generators += $(g) ;
@@ -642,64 +642,61 @@
     .generators-for-toolset.$(base) += $(g) ;
 }
 
-# Creates new instance of the 'generator' class and registers it.
-# Retursn the creates instance.
-# Rationale: the instance is returned so that it's possible to first register
-# a generator and then call 'run' method on that generator, bypassing all
-# generator selection.
+
+# Creates new instance of the 'generator' class and registers it. Returns the
+# created instance. Rationale: the instance is returned so that it's possible to
+# first register a generator and then call the 'run' method on that generator,
+# bypassing all generator selection.
 rule register-standard ( id : source-types * : target-types + : requirements * )
 {
     local g = [ new generator $(id) : $(source-types) : $(target-types)
- : $(requirements) ] ;
+ : $(requirements) ] ;
     register $(g) ;
     return $(g) ;
 }
 
-# Creates new instance of the 'composing-generator' class and
-# registers it.
+
+# Creates new instance of the 'composing-generator' class and registers it.
 rule register-composing ( id : source-types * : target-types + : requirements * )
 {
- local g = [ new generator $(id) true : $(source-types)
- : $(target-types) : $(requirements) ] ;
+ local g = [ new generator $(id) true : $(source-types) : $(target-types)
+ : $(requirements) ] ;
     register $(g) ;
     return $(g) ;
 }
 
-# Returns all generators which belong to 'toolset', i.e. which
-# ids are $(toolset).<something>
+
+# Returns all generators which belong to 'toolset', i.e. whose ids are
+# '$(toolset).<something>'.
 rule generators-for-toolset ( toolset )
 {
     return $(.generators-for-toolset.$(toolset)) ;
 }
 
-# Make generator 'overrider-id' be preferred to
-# 'overridee-id'. If, when searching for generators
-# that could produce a target of certain type,
-# both those generators are amoung viable generators,
-# the overridden generator is immediately discarded.
+
+# Make generator 'overrider-id' be preferred to 'overridee-id'. If, when
+# searching for generators that could produce a target of a certain type, both
+# those generators are amoung viable generators, the overridden generator is
+# immediately discarded.
 #
-# The overridden generators are discarded immediately
-# after computing the list of viable generators, before
-# running any of them.
+# The overridden generators are discarded immediately after computing the list
+# of viable generators, before running any of them.
 rule override ( overrider-id : overridee-id )
 {
     .override.$(overrider-id) += $(overridee-id) ;
 }
 
 
-
-
-# Set if results of the current generators search are going to be cached
-# This means no futher attempts to cache generators search should be
-# made.
+# Set if results of the current generators search are going to be cached. This
+# means no futher attempts to cache generators search should be made.
 .caching = ;
 
-# Returns a list of source type which can possibly be converted
-# to 'target-type' by some chain of generator invocation.
+# Returns a list of source type which can possibly be converted to 'target-type'
+# by some chain of generator invocation.
 #
-# More formally, takes all generators for 'target-type' and
-# returns union of source types for those generators and result
-# of calling itself recusrively on source types.
+# More formally, takes all generators for 'target-type' and returns union of
+# source types for those generators and result of calling itself recirsively on
+# source types.
 local rule viable-source-types-real ( target-type )
 {
     local generators ;
@@ -707,7 +704,7 @@
     local t = [ type.all-bases $(target-type) ] ;
 
     local result ;
- # 't' is the list of types which are not yet processed
+ # 't' is the list of types which have not yet been processed.
     while $(t)
     {
         # Find all generators for current type.
@@ -715,8 +712,6 @@
         local generators = $(.generators.$(t[1])) ;
         t = $(t[2-]) ;
 
-
-
         while $(generators)
         {
             local g = $(generators[1]) ;
@@ -752,11 +747,10 @@
         }
     }
 
- result = [ sequence.unique $(result) ] ;
-
- return $(result) ;
+ return [ sequence.unique $(result) ] ;
 }
 
+
 # Helper rule, caches the result of 'viable-source-types-real'.
 rule viable-source-types ( target-type )
 {
@@ -777,19 +771,19 @@
     }
 }
 
-# Returns the list of source types, which, when passed to 'run'
-# method of 'generator', has some change of being eventually used
-# (probably after conversion by other generators)
+
+# Returns the list of source types, which, when passed to 'run' method of
+# 'generator', has some change of being eventually used (probably after
+# conversion by other generators).
 rule viable-source-types-for-generator-real ( generator )
 {
     local source-types = [ $(generator).source-types ] ;
     if ! $(source-types)
     {
- # If generator does not specify any source types,
- # it might be special generator like builtin.lib-generator
- # which just relays to other generators. Return '*' to
- # indicate that any source type is possibly OK, since we don't
- # know for sure.
+ # If generator does not specify any source types, it might be special
+ # generator like builtin.lib-generator which just relays to other
+ # generators. Return '*' to indicate that any source type is possibly
+ # OK, since we don't know for sure.
         return * ;
     }
     else
@@ -809,7 +803,8 @@
     }
 }
 
-# Helper rule, caches the result of 'viable-source-types-for-genrator'.
+
+# Helper rule, caches the result of 'viable-source-types-for-generator'.
 local rule viable-source-types-for-generator ( generator )
 {
     local key = .vstg.$(generator) ;
@@ -830,16 +825,12 @@
 }
 
 
-
-# Returns usage requirements + list of created targets
-local rule try-one-generator-really ( project name ? : generator :
- target-type : property-set : sources * )
+# Returns usage requirements + list of created targets.
+local rule try-one-generator-really ( project name ? : generator : target-type
+ : property-set : sources * )
 {
     local targets =
- [ $(generator).run $(project) $(name)
- : $(property-set)
- : $(sources)
- ] ;
+ [ $(generator).run $(project) $(name) : $(property-set) : $(sources) ] ;
 
     local usage-requirements ;
     local success ;
@@ -874,11 +865,11 @@
     }
 }
 
-# Checks if generator invocation can be pruned, because it's guaranteed
-# to fail. If so, quickly returns empty list. Otherwise, calls
-# try-one-generator-really.
-local rule try-one-generator ( project name ? : generator :
- target-type : property-set : sources * )
+
+# Checks if generator invocation can be pruned, because it's guaranteed to fail.
+# If so, quickly returns empty list. Otherwise, calls try-one-generator-really.
+local rule try-one-generator ( project name ? : generator : target-type
+ : property-set : sources * )
 {
     local source-types ;
     for local s in $(sources)
@@ -903,8 +894,9 @@
     }
 }
 
-rule construct-types ( project name ? : target-types + :
- property-set : sources + )
+
+rule construct-types ( project name ? : target-types + : property-set
+ : sources + )
 {
     local result ;
     local matched-types ;
@@ -920,14 +912,12 @@
             matched-types += $(t) ;
         }
     }
- # TODO: have to introduce parameter controlling if
- # several types can be matches and add appropriate
- # checks
-
- # TODO: need to review the documentation for
- # 'construct' to see if it should return $(source) even
- # if nothing can be done with it. Currents docs seem to
- # imply that, contrary to the behaviour.
+ # TODO: have to introduce parameter controlling if several types can be
+ # matched and add appropriate checks.
+
+ # TODO: need to review the documentation for 'construct' to see if it should
+ # return $(source) even if nothing can be done with it. Currents docs seem
+ # to imply that, contrary to the behaviour.
     if $(result)
     {
         return $(usage-requirements) $(result) ;
@@ -938,8 +928,8 @@
     }
 }
 
-# Ensures all 'targets' have types. If this is not so, exists with
-# error.
+
+# Ensures all 'targets' have types. If this is not so, exists with error.
 local rule ensure-type ( targets * )
 {
     for local t in $(targets)
@@ -951,16 +941,17 @@
     }
 }
 
+
 # Returns generators which can be used to construct target of specified type
 # with specified properties. Uses the following algorithm:
-# - iterates over requested target-type and all it's bases (in the order returned bt
-# type.all-bases.
-# - for each type find all generators that generate that type and which requirements
-# are satisfied by properties.
+# - iterates over requested target-type and all its bases (in the order returned
+# by type.all-bases.
+# - for each type find all generators that generate that type and whose
+# requirements are satisfied by properties.
 # - if the set of generators is not empty, returns that set.
 #
 # Note: this algorithm explicitly ignores generators for base classes if there's
-# at least one generator for requested target-type.
+# at least one generator for the requested target-type.
 local rule find-viable-generators-aux ( target-type : property-set )
 {
     # Select generators that can create the required target type.
@@ -970,16 +961,15 @@
     import type ;
     local t = [ type.all-bases $(target-type) ] ;
 
- generators.dout [ indent ] find-viable-generators target-type= $(target-type)
- property-set= [ $(property-set).as-path ]
- ;
+ generators.dout [ indent ] find-viable-generators target-type= $(target-type)
+ property-set= [ $(property-set).as-path ] ;
 
- # Get the lit of generators for the requested type.
- # If no generator is registered, try base type, and so on.
+ # Get the list of generators for the requested type. If no generator is
+ # registered, try base type, and so on.
     local generators ;
     while $(t[1])
     {
- generators.dout [ indent ] "trying type" $(t[1]) ;
+ generators.dout [ indent ] "trying type" $(t[1]) ;
         if $(.generators.$(t[1]))
         {
             generators.dout [ indent ] "there are generators for this type" ;
@@ -987,18 +977,19 @@
 
             if $(t[1]) != $(target-type)
             {
- # We're here, when no generators for target-type are found,
- # but there are some generators for a base type.
- # We'll try to use them, but they will produce targets of
- # base type, not of 'target-type'. So, we clone the generators
- # and modify the list of target types.
+ # We're here, when no generators for target-type are found, but
+ # there are some generators for a base type. We'll try to use
+ # them, but they will produce targets of base type, not of
+ # 'target-type'. So, we clone the generators and modify the list
+ # of target types.
                 local generators2 ;
                 for local g in $(generators)
                 {
- # generators.register adds generator to the list of generators
- # for toolsets, which is a bit strange, but should work.
- # That list is only used when inheriting toolset, which
- # should have being done before generators are run.
+ # generators.register adds a generator to the list of
+ # generators for toolsets, which is a bit strange, but
+ # should work. That list is only used when inheriting a
+ # toolset, which should have been done before running
+ # generators.
                     generators2 += [
                       $(g).clone-and-change-target-type $(t[1]) : $(target-type) ] ;
                     generators.register $(generators2[-1]) ;
@@ -1010,7 +1001,6 @@
         t = $(t[2-]) ;
     }
 
-
     for local g in $(generators)
     {
         generators.dout [ indent ] "trying generator" [ $(g).id ] "(" [ $(g).source-types ] -> [ $(g).target-types ] ")" ;
@@ -1026,6 +1016,7 @@
     return $(viable-generators) ;
 }
 
+
 rule find-viable-generators ( target-type : property-set )
 {
     local key = $(target-type).$(property-set) ;
@@ -1085,17 +1076,19 @@
     return $(result) ;
 }
 
+
 .construct-stack = ;
 
-# Attempts to construct target by finding viable generators, running them
-# and selecting the dependency graph
+
+# Attempts to construct a target by finding viable generators, running them and
+# selecting the dependency graph.
 local rule construct-really (
    project name ? : target-type : property-set : sources * )
 {
     viable-generators = [ find-viable-generators $(target-type) : $(property-set) ] ;
 
     generators.dout [ indent ] "*** " [ sequence.length $(viable-generators) ]
- " viable generators" ;
+ " viable generators" ;
 
     local result ;
     local generators-that-succeeded ;
@@ -1146,17 +1139,14 @@
 }
 
 
-# Attempts to create target of 'target-type' with 'properties'
-# from 'sources'. The 'sources' are treated as a collection of
-# *possible* ingridients -- i.e. it is not required to consume
-# them all. If 'multiple' is true, the rule is allowed to return
-# several targets of 'target-type'.
-#
+# Attempts to create a target of 'target-type' with 'properties' from 'sources'.
+# The 'sources' are treated as a collection of *possible* ingridients -- i.e. it
+# is not required to consume them all. If 'multiple' is true, the rule is
+# allowed to return several targets of 'target-type'.
 #
-# Returns a list of target. When this invocation is first instance of
+# Returns a list of targets. When this invocation is first instance of
 # 'construct' in stack, returns only targets of requested 'target-type',
-# otherwise, returns also unused sources and additionally generated
-# targets.
+# otherwise, returns also unused sources and additionally generated targets.
 rule construct ( project name ? : target-type : property-set * : sources * )
 {
     if (.construct-stack)
@@ -1179,7 +1169,6 @@
         generators.dout [ indent ] " properties:" [ $(property-set).raw ] ;
     }
 
-
     local result = [ construct-really $(project) $(name)
       : $(target-type) : $(property-set) : $(sources) ] ;
 
@@ -1190,11 +1179,12 @@
     return $(result) ;
 }
 
-# Given 'result', obtained from some generator or
-# generators.construct, adds 'raw-properties' as usage requirements
-# to it. If result already contains usage requirements -- that is
-# the first element of result of an instance of the property-set class,
-# the existing usage requirements and 'raw-properties' are combined.
+
+# Given 'result', obtained from some generator or generators.construct, adds
+# 'raw-properties' as usage requirements to it. If result already contains usage
+# requirements -- that is the first element of result of an instance of the
+# property-set class, the existing usage requirements and 'raw-properties' are
+# combined.
 rule add-usage-requirements ( result * : raw-properties * )
 {
     if $(result)

Modified: trunk/tools/build/v2/build/project.jam
==============================================================================
--- trunk/tools/build/v2/build/project.jam (original)
+++ trunk/tools/build/v2/build/project.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,12 +1,12 @@
-# Copyright 2002, 2003 Dave Abrahams
-# Copyright 2002, 2005, 2006 Rene Rivera
-# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2002, 2003 Dave Abrahams
+# Copyright 2002, 2005, 2006 Rene Rivera
+# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
 # Implements project representation and loading.
-# Each project is represented by
-# - a module where all the Jamfile content live.
+# Each project is represented by
+# - a module where all the Jamfile content live.
 # - an instance of 'project-attributes' class.
 # (given module name, can be obtained by 'attributes' rule)
 # - an instance of 'project-target' class (from targets.jam)
@@ -21,7 +21,7 @@
 # its own attributes, via 'project' rule, which will be combined with already
 # set attributes.
 #
-# The 'project' rule can also declare project id, which will be associated with
+# The 'project' rule can also declare project id, which will be associated with
 # the project module.
 #
 # There can also be 'standalone' projects. They are created by calling
@@ -43,25 +43,25 @@
 import property-set ;
 import sequence ;
 
-#
-# Loads jamfile at the given location. After loading, project global
-# file and jamfile needed by the loaded one will be loaded recursively.
-# If the jamfile at that location is loaded already, does nothing.
-# Returns the project module for the Jamfile.
+
+# Loads the jamfile at the given location. After loading, project global file
+# and jamfiles needed by the requested one will be loaded recursively. If the
+# jamfile at that location is loaded already, does nothing. Returns the project
+# module for the Jamfile.
 #
 rule load ( jamfile-location )
-{
+{
     if --debug-loading in [ modules.peek : ARGV ]
     {
         ECHO "Loading Jamfile at" '$(jamfile-location)' ;
- }
-
- local module-name = [ module-name $(jamfile-location) ] ;
+ }
+
+ local module-name = [ module-name $(jamfile-location) ] ;
     # If Jamfile is already loaded, don't try again.
     if ! $(module-name) in $(.jamfile-modules)
- {
+ {
         load-jamfile $(jamfile-location) ;
-
+
         # We want to make sure that child project are loaded only after parent
         # projects. In particular, because parent projects define attributes
         # which are inherited by children, and we don't want children to be
@@ -69,11 +69,11 @@
         #
         # While "build-project" and "use-project" can potentially refer to child
         # projects from parent projects, we don't immediately loading child
- # projects when seing those attributes. Instead, we record the minimal
+ # projects when seeing those attributes. Instead, we record the minimal
         # information that will be used only later.
         load-used-projects $(module-name) ;
- }
- return $(module-name) ;
+ }
+ return $(module-name) ;
 }
 
 rule load-used-projects ( module-name )
@@ -85,39 +85,41 @@
     {
         local id = $(used[1]) ;
         local where = $(used[2]) ;
-
- project.use $(id) : [ path.root
+
+ project.use $(id) : [ path.root
             [ path.make $(where) ] $(location) ] ;
         used = $(used[3-]) ;
- }
+ }
 }
 
 
-# Note the use of character groups, as opposed to listing
-# 'Jamroot' and 'jamroot'. With the latter, we'd get duplicate
-# matches on windows and would have to eliminate duplicates.
+# Note the use of character groups, as opposed to listing 'Jamroot' and
+# 'jamroot'. With the latter, we'd get duplicate matches on Windows and would
+# have to eliminate duplicates.
 JAMROOT ?= [ modules.peek : JAMROOT ] ;
 JAMROOT ?= project-root.jam [Jj]amroot [Jj]amroot.jam ;
 
+
 # Loads parent of Jamfile at 'location'. Issues an error if nothing is found.
 rule load-parent ( location )
 {
- local found = [ path.glob-in-parents $(location) :
+ local found = [ path.glob-in-parents $(location) :
       $(JAMROOT) $(JAMFILE) ] ;
-
+
     if ! $(found)
     {
         ECHO "error: Could not find parent for project at '$(location)'" ;
         ECHO "error: Did not find Jamfile or project-root.jam in any parent directory." ;
         EXIT ;
     }
-
- return [ load $(found[1]:D) ] ;
+
+ return [ load $(found[1]:D) ] ;
 }
 
-# Makes the specified 'module' act as if it were a regularly loaded Jamfile
-# at 'location'. If Jamfile is already located for that location, it's an
-# error.
+
+# Makes the specified 'module' act as if it were a regularly loaded Jamfile at
+# 'location'. Reports an error if a Jamfile has already been loaded for that
+# location.
 rule act-as-jamfile ( module : location )
 {
     if [ module-name $(location) ] in $(.jamfile-modules)
@@ -125,83 +127,83 @@
         errors.error "Jamfile was already loaded for '$(location)'" ;
     }
     # Set up non-default mapping from location to module.
- .module.$(location) = $(module) ;
-
- # Add the location to the list of project locations
- # so that we don't try to load Jamfile in future
+ .module.$(location) = $(module) ;
+
+ # Add the location to the list of project locations so that we don't try to
+ # reload the same Jamfile in the future.
     .jamfile-modules += [ module-name $(location) ] ;
-
+
     initialize $(module) : $(location) ;
 }
 
 
-# Given 'name' which can be project-id or plain directory name,
-# return project module corresponding to that id or directory.
-# Returns nothing of project is not found.
+# Returns the project module corresponding to the given project-id or plain
+# directory name. Returns nothing if such a project can not be found.
 rule find ( name : current-location )
 {
     local project-module ;
-
+
     # Try interpreting name as project id.
     if [ path.is-rooted $(name) ]
- {
- project-module = $($(name).jamfile-module) ;
- }
-
+ {
+ project-module = $($(name).jamfile-module) ;
+ }
+
     if ! $(project-module)
- {
- local location = [ path.root
+ {
+ local location = [ path.root
             [ path.make $(name) ] $(current-location) ] ;
- # If no project is registered for the given location, try to
- # load it. First see if we have Jamfile. If not we might have project
- # root, willing to act as Jamfile. In that case, project-root
+
+ # If no project is registered for the given location, try to load it.
+ # First see if we have a Jamfile. If not, then see if we might have a
+ # project root willing to act as a Jamfile. In that case, project root
         # must be placed in the directory referred by id.
-
+
         project-module = [ module-name $(location) ] ;
- if ! $(project-module) in $(.jamfile-modules)
+ if ! $(project-module) in $(.jamfile-modules)
         {
             if [ path.glob $(location) : $(JAMROOT) $(JAMFILE) ]
             {
- project-module = [ load $(location) ] ;
- }
+ project-module = [ load $(location) ] ;
+ }
             else
             {
                 project-module = ;
             }
- }
+ }
     }
-
+
     return $(project-module) ;
 }
 
-#
-# Returns the name of module corresponding to 'jamfile-location'.
-# If no module corresponds to location yet, associates default
-# module name with that location.
+
+# Returns the name of the module corresponding to 'jamfile-location'. If no
+# module corresponds to that location yet, associates the default module name
+# with that location.
 #
 rule module-name ( jamfile-location )
 {
     if ! $(.module.$(jamfile-location))
     {
- # Root the path, so that locations are always umbiguious.
- # Without this, we can't decide if '../../exe/program1' and '.'
- # are the same paths, or not.
+ # Root the path, so that locations are always unambiguous. Without this,
+ # we can't decide if '../../exe/program1' and '.' are the same paths.
         jamfile-location = [ path.root $(jamfile-location) [ path.pwd ] ] ;
- .module.$(jamfile-location) = Jamfile<$(jamfile-location)> ;
+ .module.$(jamfile-location) = Jamfile<$(jamfile-location)> ;
     }
     return $(.module.$(jamfile-location)) ;
 }
 
-# Default patterns to search for the Jamfiles to use for build
-# declarations.
+
+# Default patterns to search for the Jamfiles to use for build declarations.
 #
 JAMFILE = [ modules.peek : JAMFILE ] ;
 JAMFILE ?= [Bb]uild.jam [Jj]amfile.v2 [Jj]amfile [Jj]amfile.jam ;
 
-# Find the Jamfile at the given location. This returns the exact names of
-# all the Jamfiles in the given directory. The optional parent-root argument
-# causes this to search not the given directory but the ones above it up
-# to the directory given in it.
+
+# Find the Jamfile at the given location. This returns the exact names of all
+# the Jamfiles in the given directory. The optional parent-root argument causes
+# this to search not the given directory but the ones above it up to the
+# directory given in it.
 #
 rule find-jamfile (
     dir # The directory(s) to look for a Jamfile.
@@ -215,27 +217,26 @@
     if $(parent-root)
     {
         if ! $(.parent-jamfile.$(dir))
- {
- .parent-jamfile.$(dir) =
- [ path.glob-in-parents $(dir) : $(JAMFILE) ] ;
- }
- jamfile-glob = $(.parent-jamfile.$(dir)) ;
+ {
+ .parent-jamfile.$(dir) =
+ [ path.glob-in-parents $(dir) : $(JAMFILE) ] ;
+ }
+ jamfile-glob = $(.parent-jamfile.$(dir)) ;
     }
     else
     {
         if ! $(.jamfile.$(dir))
- {
- .jamfile.$(dir) = [ path.glob $(dir) : $(JAMFILE) ] ;
- }
+ {
+ .jamfile.$(dir) = [ path.glob $(dir) : $(JAMFILE) ] ;
+ }
         jamfile-glob = $(.jamfile.$(dir)) ;
-
+
     }
-
+
     local jamfile-to-load = $(jamfile-glob) ;
- # Multiple Jamfiles found in the same place. Warn about this.
- # And ensure we use only one of them.
- # As a temporary convenience measure, if there's Jamfile.v2 amount
- # found files, suppress the warning and use it.
+ # Multiple Jamfiles found in the same place. Warn about this and ensure we
+ # use only one of them. As a temporary convenience measure, if there's
+ # Jamfile.v2 among found files, suppress the warning and use it.
     #
     if $(jamfile-to-load[2-])
     {
@@ -244,24 +245,24 @@
         if $(v2-jamfiles) && ! $(v2-jamfiles[2])
         {
             jamfile-to-load = $(v2-jamfiles) ;
- }
+ }
         else
- {
- ECHO
- "warning: Found multiple Jamfiles at '"$(dir)"'!"
- "Loading the first one: '" [ path.basename $(jamfile-to-load[1]) ] "'." ;
+ {
+ local jamfile = [ path.basename $(jamfile-to-load[1]) ] ;
+ ECHO "warning: Found multiple Jamfiles at '"$(dir)"'!"
+ "Loading the first one: '$(jamfile)'." ;
         }
-
+
         jamfile-to-load = $(jamfile-to-load[1]) ;
- }
-
+ }
+
     # Could not find it, error.
     #
     if ! $(no-errors) && ! $(jamfile-to-load)
     {
         errors.error
             "Unable to load Jamfile." :
- "Could not find a Jamfile in directory '$(dir)'". :
+ "Could not find a Jamfile in directory '$(dir)'". :
             "Attempted to find it with pattern '"$(JAMFILE:J=" ")"'." :
             "Please consult the documentation at 'http://www.boost.org'." ;
     }
@@ -269,10 +270,11 @@
     return $(jamfile-to-load) ;
 }
 
-# Load a Jamfile at the given directory. Returns nothing.
-# Will attempt to load the file as indicated by the JAMFILE patterns.
-# Effect of calling this rule twice with the same 'dir' is underfined.
 
+# Load a Jamfile at the given directory. Returns nothing. Will attempt to load
+# the file as indicated by the JAMFILE patterns. Effect of calling this rule
+# twice with the same 'dir' is undefined.
+#
 local rule load-jamfile (
     dir # The directory of the project Jamfile.
     )
@@ -287,68 +289,68 @@
 
     # The module of the jamfile.
     #
- local jamfile-module = [ module-name [ path.parent $(jamfile-to-load) ] ] ;
+ local jamfile-module = [ module-name [ path.parent $(jamfile-to-load) ] ] ;
 
     # Initialize the jamfile module before loading.
- #
- initialize $(jamfile-module) : [ path.parent $(jamfile-to-load) ]
+ #
+ initialize $(jamfile-module) : [ path.parent $(jamfile-to-load) ]
       : $(jamfile-to-load:BS) ;
 
     local saved-project = $(.current-project) ;
- # Now load the Jamfile in it's own context.
- # Initialization might have load parent Jamfiles, which might have
- # loaded the current Jamfile with use-project. Do a final check to make
- # sure it's not loaded already.
+ # Now load the Jamfile in it's own context. Initialization might have loaded
+ # parent Jamfiles, which might have loaded the current Jamfile with
+ # use-project. Do a final check to make sure it's not loaded already.
     if ! $(jamfile-module) in $(.jamfile-modules)
- {
- .jamfile-modules += $(jamfile-module) ;
+ {
+ .jamfile-modules += $(jamfile-module) ;
         mark-as-user $(jamfile-module) ;
- modules.load $(jamfile-module) : [ path.native $(jamfile-to-load) ] : . ;
+ modules.load $(jamfile-module) : [ path.native $(jamfile-to-load) ] : . ;
         if [ MATCH ($(JAMROOT)) : $(jamfile-to-load:BS) ]
         {
             jamfile = [ find-jamfile $(dir) : no-errors ] ;
             if $(jamfile)
- {
+ {
                 load-aux $(jamfile-module) : [ path.native $(jamfile) ] ;
- }
- }
+ }
+ }
     }
- # Now do some checks
+ # Now do some checks.
     if $(.current-project) != $(saved-project)
     {
         errors.error "The value of the .current-project variable"
           : "has magically changed after loading a Jamfile."
           : "This means some of the targets might be defined in the wrong project."
- : "after loading " $(jamfile-module)
- : "expected value " $(saved-project)
- : "actual value " $(.current-project)
+ : "after loading" $(jamfile-module)
+ : "expected value" $(saved-project)
+ : "actual value" $(.current-project)
           ;
     }
 
     if $(.global-build-dir)
- {
- local id = [ attribute $(jamfile-module) id ] ;
+ {
+ local id = [ attribute $(jamfile-module) id ] ;
         local project-root = [ attribute $(jamfile-module) project-root ] ;
- local location = [ attribute $(jamfile-module) location ] ;
+ local location = [ attribute $(jamfile-module) location ] ;
 
         if $(location) && $(project-root) = $(dir)
         {
- # This is Jamroot
+ # This is Jamroot.
             if ! $(id)
             {
                 ECHO "warning: the --build-dir option was specified" ;
                 ECHO "warning: but Jamroot at '$(dir)'" ;
                 ECHO "warning: specified no project id" ;
                 ECHO "warning: the --build-dir option will be ignored" ;
- }
- }
- }
+ }
+ }
+ }
 }
 
+
 rule mark-as-user ( module-name )
 {
     if USER_MODULE in [ RULENAMES ]
- {
+ {
         USER_MODULE $(module-name) ;
     }
 }
@@ -357,30 +359,31 @@
 rule load-aux ( module-name : file )
 {
     mark-as-user $(module-name) ;
-
+
     module $(module-name)
     {
         include $(2) ;
         local rules = [ RULENAMES $(1) ] ;
         IMPORT $(1) : $(rules) : $(1) : $(1).$(rules) ;
- }
+ }
 }
 
+
 .global-build-dir = [ MATCH --build-dir=(.*) : [ modules.peek : ARGV ] ] ;
 if $(.global-build-dir)
-{
- # If the option is specified several times, take the last value.
+{
+ # If the option is specified several times, take the last value.
     .global-build-dir = [ path.make $(.global-build-dir[-1]) ] ;
 }
 
 
-# Initialize the module for a project.
+# Initialize the module for a project.
 #
 rule initialize (
- module-name # The name of the project module.
- : location ? # The location (directory) of the project to initialize.
- # If not specified, stanalone project will be initialized.
- : basename ?
+ module-name # The name of the project module.
+ : location ? # The location (directory) of the project to initialize.
+ # If not specified, a standalone project will be initialized.
+ : basename ?
     )
 {
     if --debug-loading in [ modules.peek : ARGV ]
@@ -392,73 +395,72 @@
     # prebuilt targets. If so, we need to give more sensible "location", so that
     # source paths are correct.
     location ?= "" ;
- # Create the module for the Jamfile first.
+ # Create the module for the Jamfile first.
     module $(module-name)
- {
- }
- $(module-name).attributes = [ new project-attributes $(location)
- $(module-name) ] ;
+ {
+ }
+ $(module-name).attributes = [ new project-attributes $(location)
+ $(module-name) ] ;
     local attributes = $($(module-name).attributes) ;
-
+
     if $(location)
- {
- $(attributes).set source-location : [ path.make $(location) ] : exact ;
+ {
+ $(attributes).set source-location : [ path.make $(location) ] : exact ;
     }
     else
     {
- $(attributes).set source-location : "" : exact ;
+ $(attributes).set source-location : "" : exact ;
     }
-
- $(attributes).set requirements : [ property-set.empty ] : exact ;
- $(attributes).set usage-requirements : [ property-set.empty ] : exact ;
+
+ $(attributes).set requirements : [ property-set.empty ] : exact ;
+ $(attributes).set usage-requirements : [ property-set.empty ] : exact ;
 
     # Import rules common to all project modules from project-rules module,
     # defined at the end of this file.
     modules.clone-rules project-rules $(module-name) ;
-
+
     local jamroot ;
 
     local parent-module ;
     if $(module-name) = site-config
     {
         # No parent.
- }
+ }
     else if $(module-name) = user-config
     {
         parent-module = site-config ;
     }
- else
+ else
     {
- # We search for parent/project-root only if jamfile was specified
- # --- i.e
+ # We search for parent/project-root only if jamfile was specified, i.e.
         # if the project is not standalone.
- if $(location) && ! [ MATCH ($(JAMROOT)) : $(basename) ]
+ if $(location) && ! [ MATCH ($(JAMROOT)) : $(basename) ]
         {
             parent-module = [ load-parent $(location) ] ;
- }
+ }
         else
         {
- # It's either jamroot, or standalone project.
- # If it's jamroot, inherit from user-config.
+ # It's either jamroot, or standalone project. If it's jamroot,
+ # inherit from user-config.
             if $(location)
             {
- parent-module = user-config ;
+ parent-module = user-config ;
                 jamroot = true ;
- }
- }
+ }
+ }
     }
-
+
     if $(parent-module)
- {
+ {
         inherit-attributes $(module-name) : $(parent-module) ;
         $(attributes).set parent-module : $(parent-module) : exact ;
     }
-
+
     if $(jamroot)
- {
+ {
         $(attributes).set project-root : $(location) : exact ;
     }
-
+
     local parent ;
     if $(parent-module)
     {
@@ -467,70 +469,72 @@
 
     if ! $(.target.$(module-name))
     {
- .target.$(module-name) = [ new project-target $(module-name)
- : $(module-name) $(parent)
+ .target.$(module-name) = [ new project-target $(module-name)
+ : $(module-name) $(parent)
             : [ attribute $(module-name) requirements ] ] ;
-
+
         if --debug-loading in [ modules.peek : ARGV ]
         {
- ECHO "Assigned project target" $(.target.$(module-name))
- "to '$(module-name)'" ;
+ ECHO "Assigned project target" $(.target.$(module-name))
+ "to '$(module-name)'" ;
         }
- }
-
+ }
+
     .current-project = [ target $(module-name) ] ;
 }
 
+
 # Make 'project-module' inherit attributes of project root and parent module.
 rule inherit-attributes ( project-module : parent-module )
 {
- local attributes = $($(project-module).attributes) ;
+ local attributes = $($(project-module).attributes) ;
     local pattributes = [ attributes $(parent-module) ] ;
     # Parent module might be locationless user-config.
     if [ modules.binding $(parent-module) ]
- {
- $(attributes).set parent : [ path.parent
+ {
+ $(attributes).set parent : [ path.parent
             [ path.make [ modules.binding $(parent-module) ] ] ] ;
- }
+ }
     local v = [ $(pattributes).get project-root ] ;
     $(attributes).set project-root : $(v) : exact ;
- $(attributes).set default-build
- : [ $(pattributes).get default-build ] ;
+ $(attributes).set default-build
+ : [ $(pattributes).get default-build ] ;
     $(attributes).set requirements
- : [ $(pattributes).get requirements ] : exact ;
+ : [ $(pattributes).get requirements ] : exact ;
     $(attributes).set usage-requirements
- : [ $(pattributes).get usage-requirements ] : exact ;
-
+ : [ $(pattributes).get usage-requirements ] : exact ;
+
     local parent-build-dir = [ $(pattributes).get build-dir ] ;
     if $(parent-build-dir)
- {
- # Have to compute relative path from parent dir to our dir
- # Convert both paths to absolute, since we cannot
- # find relative path from ".." to "."
-
+ {
+ # Have to compute relative path from parent dir to our dir. Convert both
+ # paths to absolute, since we cannot find relative path from ".." to
+ # ".".
+
         local location = [ attribute $(project-module) location ] ;
         local parent-location = [ attribute $(parent-module) location ] ;
-
+
         local pwd = [ path.pwd ] ;
         local parent-dir = [ path.root $(parent-location) $(pwd) ] ;
         local our-dir = [ path.root $(location) $(pwd) ] ;
- $(attributes).set build-dir : [ path.join $(parent-build-dir)
- [ path.relative $(our-dir) $(parent-dir) ] ] : exact ;
- }
+ $(attributes).set build-dir : [ path.join $(parent-build-dir)
+ [ path.relative $(our-dir) $(parent-dir) ] ] : exact ;
+ }
 }
 
 
-# Associate the given id with the given project module
+# Associate the given id with the given project module.
 rule register-id ( id : module )
 {
     $(id).jamfile-module = $(module) ;
 }
 
+
 # Class keeping all the attributes of a project.
 #
 # The standard attributes are "id", "location", "project-root", "parent"
 # "requirements", "default-build", "source-location" and "projects-to-build".
-class project-attributes
+class project-attributes
 {
     import property ;
     import property-set ;
@@ -539,28 +543,28 @@
     import print ;
     import sequence ;
     import project ;
-
+
     rule __init__ ( location project-module )
- {
+ {
         self.location = $(location) ;
         self.project-module = $(project-module) ;
     }
-
- # Set the named attribute from the specification given by the user.
- # The value actually set may be different.
- rule set ( attribute : specification *
- : exact ? # Sets value from 'specification' without any processing
- )
+
+ # Set the named attribute from the specification given by the user. The
+ # value actually set may be different.
+ rule set ( attribute : specification *
+ : exact ? # Sets value from 'specification' without any processing.
+ )
     {
         if $(exact)
         {
             self.$(attribute) = $(specification) ;
         }
- else if $(attribute) = "requirements"
+ else if $(attribute) = "requirements"
         {
             local result = [ property-set.refine-from-user-input
                 $(self.requirements) : $(specification)
- : $(self.project-module) : $(self.location) ] ;
+ : $(self.project-module) : $(self.location) ] ;
 
             if $(result[1]) = "@error"
             {
@@ -583,28 +587,28 @@
                 split ?= nothing $(p) ;
                 unconditional += $(split[2]) ;
             }
-
+
             local non-free = [ property.remove free : $(unconditional) ] ;
             if $(non-free)
             {
                 errors.error "usage-requirements" $(specification) "have non-free properties" $(non-free) ;
- }
+ }
             local t = [ property.translate-paths $(specification)
                                       : $(self.location) ] ;
             if $(self.usage-requirements)
             {
- self.usage-requirements = [ property-set.create
+ self.usage-requirements = [ property-set.create
                     [ $(self.usage-requirements).raw ] $(t) ] ;
             }
- else
+ else
             {
                 self.usage-requirements = [ property-set.create $(t) ] ;
- }
- }
+ }
+ }
         else if $(attribute) = "default-build"
         {
             self.default-build = [ property.make $(specification) ] ;
- }
+ }
         else if $(attribute) = "source-location"
         {
             self.source-location = ;
@@ -613,17 +617,17 @@
                 self.source-location += [ path.root
                     [ path.make $(src-path) ] $(self.location) ] ;
             }
- }
+ }
         else if $(attribute) = "build-dir"
         {
- self.build-dir = [ path.root
+ self.build-dir = [ path.root
                 [ path.make $(specification) ] $(self.location) ] ;
- }
- else if ! $(attribute) in "id" "default-build" "location" "source-location"
- "parent" "projects-to-build" "project-root"
+ }
+ else if ! $(attribute) in "id" "default-build" "location"
+ "source-location" "parent" "projects-to-build" "project-root"
         {
- errors.error "Invalid project attribute '$(attribute)' specified "
- "for project at '$(self.location)'" ;
+ errors.error "Invalid project attribute '$(attribute)' specified"
+ "for project at '$(self.location)'" ;
         }
         else
         {
@@ -648,27 +652,29 @@
         print.list-item "Requirements:" [ $(self.requirements).raw ] ;
         print.list-item "Default build:" $(self.default-build) ;
         print.list-item "Source location:" $(self.source-location) ;
- print.list-item "Projects to build:"
- [ sequence.insertion-sort $(self.projects-to-build) ] ;
+ print.list-item "Projects to build:"
+ [ sequence.insertion-sort $(self.projects-to-build) ] ;
         print.list-end ;
     }
-
 }
 
-# Returns the project which is currently being loaded
+
+# Returns the project which is currently being loaded.
 rule current ( )
 {
     return $(.current-project) ;
 }
 
-# Temporary changes the current project to 'project'. Should
-# be followed by 'pop-current'.
+
+# Temporarily changes the current project to 'project'. Should be followed by
+# 'pop-current'.
 rule push-current ( project )
 {
     .saved-current-project += $(.current-project) ;
     .current-project = $(project) ;
 }
 
+
 rule pop-current ( )
 {
     .current-project = $(.saved-current-project[-1]) ;
@@ -676,68 +682,71 @@
 }
 
 
-
 # Returns the project-attribute instance for the specified jamfile module.
 rule attributes ( project )
 {
     return $($(project).attributes) ;
 }
 
+
 # Returns the value of the specified attribute in the specified jamfile module.
 rule attribute ( project attribute )
 {
- return [ $($(project).attributes).get $(attribute) ] ;
+ return [ $($(project).attributes).get $(attribute) ] ;
 }
 
+
 # Returns the project target corresponding to the 'project-module'.
 rule target ( project-module )
 {
     if ! $(.target.$(project-module))
     {
- .target.$(project-module) = [ new project-target $(project-module)
- : $(project-module)
- : [ attribute $(project-module) requirements ] ] ;
+ .target.$(project-module) = [ new project-target $(project-module)
+ : $(project-module)
+ : [ attribute $(project-module) requirements ] ] ;
     }
- return $(.target.$(project-module)) ;
+ return $(.target.$(project-module)) ;
 }
 
+
 # Use/load a project.
 rule use ( id : location )
 {
     local saved-project = $(.current-project) ;
     local project-module = [ project.load $(location) ] ;
     local declared-id = [ project.attribute $(project-module) id ] ;
-
+
     if ! $(declared-id) || $(declared-id) != $(id)
     {
         # The project at 'location' either have no id or
         # that id is not equal to the 'id' parameter.
- if $($(id).jamfile-module)
- && $($(id).jamfile-module) != $(project-module)
+ if $($(id).jamfile-module)
+ && $($(id).jamfile-module) != $(project-module)
         {
- errors.user-error
- "Attempt to redeclare already existing project id '$(id)'" ;
- }
+ errors.user-error
+ "Attempt to redeclare already existing project id '$(id)'" ;
+ }
         $(id).jamfile-module = $(project-module) ;
     }
     .current-project = $(saved-project) ;
 }
 
-# Defines a Boost.Build extension project. Such extensions usually
-# contain library targets and features that can be used by many people.
-# Even though extensions are really projects, they can be initialize as
-# a module would be with the "using" (project.project-rules.using)
-# mechanism.
+
+# Defines a Boost.Build extension project. Such extensions usually contain
+# library targets and features that can be used by many people. Even though
+# extensions are really projects, they can be initialized as a module would be
+# with the "using" (project.project-rules.using) mechanism.
+#
 rule extension ( id : options * : * )
 {
     # The caller is a standalone module for the extension.
     local mod = [ CALLER_MODULE ] ;
-
+
     # We need to do the rest within the extension module.
     module $(mod)
     {
         import path ;
-
+
         # Find the root project.
         local root-project = [ project.current ] ;
         root-project = [ $(root-project).project-module ] ;
@@ -747,163 +756,162 @@
         {
             root-project = [ project.attribute $(root-project) parent-module ] ;
         }
-
- # Create the project data, and bring in the project rules
- # into the module.
+
+ # Create the project data, and bring in the project rules into the
+ # module.
         project.initialize $(__name__) :
             [ path.join [ project.attribute $(root-project) location ] ext $(1:L) ] ;
-
- # Create the project itself, i.e. the attributes.
- # All extensions are created in the "/ext" project space.
+
+ # Create the project itself, i.e. the attributes. All extensions are
+ # created in the "/ext" project space.
         project /ext/$(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
         local attributes = [ project.attributes $(__name__) ] ;
-
+
         # Inherit from the root project of whomever is defining us.
         project.inherit-attributes $(__name__) : $(root-project) ;
         $(attributes).set parent-module : $(root-project) : exact ;
     }
 }
 
+
 rule glob-internal ( project : wildcards + : excludes * : rule-name )
 {
     local location = [ $(project).get source-location ] ;
-
+
     local result ;
- local paths = [ path.$(rule-name) $(location)
- : [ sequence.transform path.make : $(wildcards) ]
+ local paths = [ path.$(rule-name) $(location)
+ : [ sequence.transform path.make : $(wildcards) ]
         : [ sequence.transform path.make : $(excludes) ] ] ;
     if $(wildcards:D) || $(rule-name) != glob
     {
- # The paths we've found are relative to current directory,
- # but the names specified in sources list are assumed to
- # be relative to source directory of the corresponding
- # prject. So, just make the name absolute.
+ # The paths we've found are relative to the current directory, but the
+ # names specified in the sources list are assumed to be relative to the
+ # source directory of the corresponding project. So, just make the names
+ # absolute.
         for local p in $(paths)
         {
             result += [ path.root $(p) [ path.pwd ] ] ;
- }
+ }
     }
- else
+ else
     {
- # There were not directory in wildcard, so the files are all
- # in the source directory of the project. Just drop the
- # directory, instead of making paths absolute.
+ # There were no wildcards in the directory path, so the files are all in
+ # the source directory of the project. Just drop the directory, instead
+ # of making paths absolute.
         result = $(paths:D="") ;
     }
-
- return $(result) ;
+
+ return $(result) ;
 }
 
 
-# This module defines rules common to all projects
+# This module defines rules common to all projects.
 module project-rules
-{
+{
     rule using ( toolset-module : * )
     {
         import toolset ;
         import modules ;
         import project ;
-
- # The module referred by 'using' can be placed in
- # the same directory as Jamfile, and the user
- # will expect the module to be found even though
- # the directory is not in BOOST_BUILD_PATH.
- # So temporary change the search path.
+
+ # Temporarily change the search path so the module referred to by
+ # 'using' can be placed in the same directory as Jamfile. User will
+ # expect the module to be found even though the directory is not in
+ # BOOST_BUILD_PATH.
         local x = [ modules.peek : BOOST_BUILD_PATH ] ;
         local caller = [ modules.binding $(__name__) ] ;
         modules.poke : BOOST_BUILD_PATH : $(caller:D) $(x) ;
         toolset.using $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
         modules.poke : BOOST_BUILD_PATH : $(x) ;
-
- # The above might have clobbered .current-project
- # Restore the the right value.
- modules.poke project : .current-project
- : [ project.target $(__name__) ] ;
+
+ # The above might have clobbered .current-project. Restore the correct
+ # value.
+ modules.poke project : .current-project
+ : [ project.target $(__name__) ] ;
     }
-
+
     import modules ;
-
+
     rule import ( * : * : * )
     {
         modules.import project ;
-
+
         local caller = [ CALLER_MODULE ] ;
         local saved = [ modules.peek project : .current-project ] ;
         module $(caller)
         {
             modules.import $(1) : $(2) : $(3) ;
         }
- modules.poke project : .current-project : $(saved) ;
+ modules.poke project : .current-project : $(saved) ;
     }
 
-
     rule project ( id ? : options * : * )
     {
- import project ;
- import path ;
         import errors ;
-
+ import path ;
+ import project ;
+
         local attributes = [ project.attributes $(__name__) ] ;
- if $(id)
+ if $(id)
         {
            id = [ path.root $(id) / ] ;
            project.register-id $(id) : $(__name__) ;
            $(attributes).set id : $(id) ;
         }
-
+
         local explicit-build-dir ;
-
+
         for n in 2 3 4 5 6 7 8 9
         {
             local option = $($(n)) ;
- if $(option)
+ if $(option)
             {
                 $(attributes).set $(option[1]) : $(option[2-]) ;
             }
             if $(option[1]) = "build-dir"
             {
                 explicit-build-dir = [ path.make $(option[2-]) ] ;
- }
+ }
         }
-
+
         # If '--build-dir' is specified, change the build dir for the project.
- local global-build-dir =
- [ modules.peek project : .global-build-dir ] ;
-
+ local global-build-dir =
+ [ modules.peek project : .global-build-dir ] ;
+
         if $(global-build-dir)
- {
+ {
             local location = [ $(attributes).get location ] ;
             # Project with an empty location is a 'standalone' project such as
- # user-config or qt. It has no build dir.
- # If we try to set build dir for user-config, we'll then
- # try to inherit it, with either weird or wrong consequences.
+ # user-config or qt. It has no build dir. If we try to set build dir
+ # for user-config, we'll then try to inherit it, with either weird
+ # or wrong consequences.
             if $(location) && $(location) = [ $(attributes).get project-root ]
             {
                 # This is Jamroot.
                 if $(id)
- {
- if $(explicit-build-dir)
+ {
+ if $(explicit-build-dir)
                       && [ path.is-rooted $(explicit-build-dir) ]
                     {
- errors.user-error "Absolute directory specified via 'build-dir' project attribute"
- : "Don't know how to combine that with the --build-dir option."
- ;
+ errors.user-error "Absolute directory specified via 'build-dir' project attribute"
+ : "Don't know how to combine that with the --build-dir option."
+ ;
                     }
                     # Strip the leading slash from id.
- local rid = [ MATCH /(.*) : $(id) ] ;
- local p = [ path.join
+ local rid = [ MATCH /(.*) : $(id) ] ;
+ local p = [ path.join
                         $(global-build-dir) $(rid) $(explicit-build-dir) ] ;
 
                     $(attributes).set build-dir : $(p) : exact ;
- }
- }
- else
+ }
+ }
+ else
             {
                 # Not Jamroot
                 if $(explicit-build-dir)
                 {
                     errors.user-error "When --build-dir is specified, the 'build-dir' project"
- : "attribute is allowed only for top-level 'project' invocations" ;
+ : "attribute is allowed only for top-level 'project' invocations" ;
                 }
             }
         }
@@ -920,13 +928,12 @@
     {
         import project ;
         local p = [ project.target $(__name__) ] ;
- $(p).add-constant $(name) : $(value) ;
+ $(p).add-constant $(name) : $(value) ;
     }
-
- # Declare and set a project global constant, whose value is a path. The
- # path is adjusted to be relative to the invocation directory. The given
- # value path is taken to be either absolute, or relative to this project
- # root.
+
+ # Declare and set a project global constant, whose value is a path. The path
+ # is adjusted to be relative to the invocation directory. The given value
+ # path is taken to be either absolute, or relative to this project root.
     rule path-constant (
         name # Variable name of the constant.
         : value + # Value of the constant.
@@ -937,7 +944,6 @@
         $(p).add-constant $(name) : $(value) : path ;
     }
 
-
     rule use-project ( id : where )
     {
         # See comment in 'load' for explanation.
@@ -952,43 +958,42 @@
         local now = [ $(attributes).get projects-to-build ] ;
         $(attributes).set projects-to-build : $(now) $(dir) ;
     }
-
+
     rule explicit ( target-names * )
     {
         import project ;
- # If 'explicit' is used in a helper rule defined in Jamroot,
- # and inherited by children, then most of the time
- # we want 'explicit' to operate on the Jamfile where
- # the helper rule is invoked.
+ # If 'explicit' is used in a helper rule defined in Jamroot and
+ # inherited by children, then most of the time we want 'explicit' to
+ # operate on the Jamfile where the helper rule is invoked.
         local t = [ project.current ] ;
         for local n in $(target-names)
- {
+ {
             $(t).mark-target-as-explicit $(n) ;
- }
- }
-
+ }
+ }
+
     rule glob ( wildcards + : excludes * )
     {
         import project ;
- return [ project.glob-internal [ project.current ]
+ return [ project.glob-internal [ project.current ]
           : $(wildcards) : $(excludes) : glob ] ;
     }
 
     rule glob-tree ( wildcards + : excludes * )
     {
         import project ;
-
+
         if $(wildcards:D) || $(excludes:D)
         {
             errors.user-error "The patterns to 'glob-tree' may not include directory" ;
         }
- return [ project.glob-internal [ project.current ]
+ return [ project.glob-internal [ project.current ]
           : $(wildcards) : $(excludes) : glob-tree ] ;
     }
 
- # Calculates conditional requirements for multiple requirements
- # at once. This is a shorthand to be reduce duplication and to
- # keep an inline declarative syntax. For example:
+ # Calculates conditional requirements for multiple requirements at once.
+ # This is a shorthand to reduce duplication and to keep an inline
+ # declarative syntax. For example:
     #
     # lib x : x.cpp : [ conditional <toolset>gcc <variant>debug :
     # <define>DEBUG_EXCEPTION <define>DEBUG_TRACE ] ;

Modified: trunk/tools/build/v2/build/property-set.jam
==============================================================================
--- trunk/tools/build/v2/build/property-set.jam (original)
+++ trunk/tools/build/v2/build/property-set.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,7 +1,7 @@
-# Copyright 2003 Dave Abrahams
-# Copyright 2003, 2004, 2005, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2003 Dave Abrahams
+# Copyright 2003, 2004, 2005, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
 import "class" : new ;
 import feature ;
@@ -10,46 +10,45 @@
 import set ;
 
 # Class for storing a set of properties.
-# - there's 1<->1 correspondence between identity and value. No
-# two instances of the class are equal. To maintain this property,
-# the 'property-set.create' rule should be used to create new instances.
-# Instances are immutable.
-#
-# - each property is classified with regard to it's effect on build
-# results. Incidental properties have no effect on build results, from
-# Boost.Build point of view. Others are either free, or non-free, which we
-# call 'base'. Each property belong to exactly one of those categories and
-# it's possible to get list of properties in each category.
+# - there's 1<->1 correspondence between identity and value. No two instances of
+# the class are equal. To maintain this property, the 'property-set.create'
+# rule should be used to create new instances. Instances are immutable.
 #
-# In addition, it's possible to get list of properties with specific
+# - each property is classified with regard to it's effect on build results.
+# Incidental properties have no effect on build results, from Boost.Build's
+# point of view. Others are either free, or non-free, which we call 'base'.
+# Each property belongs to exactly one of those categories and it's possible
+# to get list of properties in each category.
+#
+# In addition, it's possible to get a list of properties with a specific
 # attribute.
 #
 # - several operations, like and refine and as-path are provided. They all use
 # caching whenever possible.
 #
-class property-set
+class property-set
 {
+ import errors ;
     import feature ;
- import property-set ;
+ import path ;
     import property ;
+ import property-set ;
     import set ;
- import path ;
- import errors ;
-
+
     rule __init__ ( raw-properties * )
- {
+ {
         self.raw = $(raw-properties) ;
-
+
         for local p in $(raw-properties)
         {
             if ! $(p:G)
             {
- errors.error "Invalid property: '$(p)'" ;
+ errors.error "Invalid property: '$(p)'" ;
             }
-
- local att = [ feature.attributes $(p:G) ] ;
- # A feature can be both incidental and free,
- # in which case we add it to incidental.
+
+ local att = [ feature.attributes $(p:G) ] ;
+ # A feature can be both incidental and free, in which case we add it
+ # to incidental.
             if incidental in $(att)
             {
                 self.incidental += $(p) ;
@@ -58,11 +57,11 @@
             {
                 self.free += $(p) ;
             }
- else
+ else
             {
                 self.base += $(p) ;
             }
-
+
             if dependency in $(att)
             {
                 self.dependency += $(p) ;
@@ -71,8 +70,8 @@
             {
                 self.non-dependency += $(p) ;
             }
-
- if [ MATCH (:) : $(p:G=) ]
+
+ if [ MATCH (:) : $(p:G=) ]
             {
                 self.conditional += $(p) ;
             }
@@ -80,80 +79,76 @@
             {
                 self.non-conditional += $(p) ;
             }
-
-
+
             if propagated in $(att)
             {
                 self.propagated += $(p) ;
- }
+ }
             if link-incompatible in $(att)
             {
                 self.link-incompatible += $(p) ;
- }
+ }
         }
-
     }
-
-
- # Returns Jam list of stored properties
+
+ # Returns Jam list of stored properties.
     rule raw ( )
     {
         return $(self.raw) ;
     }
-
+
     rule str ( )
     {
         return "[" $(self.raw) "]" ;
     }
-
- # Returns properties that are neither incidental nor free
+
+ # Returns properties that are neither incidental nor free.
     rule base ( )
     {
         return $(self.base) ;
     }
-
-
- # Returns free properties which are not dependency properties
+
+ # Returns free properties which are not dependency properties.
     rule free ( )
     {
         return $(self.free) ;
     }
-
- # Returns dependency properties
+
+ # Returns dependency properties.
     rule dependency ( )
     {
         return $(self.dependency) ;
     }
-
+
     rule non-dependency ( )
     {
         return $(self.non-dependency) ;
     }
-
+
     rule conditional ( )
     {
         return $(self.conditional) ;
     }
-
+
     rule non-conditional ( )
     {
         return $(self.non-conditional) ;
     }
-
- # Returns incidental properties
+
+ # Returns incidental properties.
     rule incidental ( )
     {
         return $(self.incidental) ;
     }
-
+
     rule refine ( ps )
     {
         if ! $(self.refined.$(ps))
         {
- local r = [ property.refine $(self.raw) : [ $(ps).raw ] ] ;
+ local r = [ property.refine $(self.raw) : [ $(ps).raw ] ] ;
             if $(r[1]) != "@error"
             {
- self.refined.$(ps) = [ property-set.create $(r) ] ;
+ self.refined.$(ps) = [ property-set.create $(r) ] ;
             }
             else
             {
@@ -162,7 +157,7 @@
         }
         return $(self.refined.$(ps)) ;
     }
-
+
     rule expand ( )
     {
         if ! $(self.expanded)
@@ -171,8 +166,7 @@
         }
         return $(self.expanded) ;
     }
-
-
+
     rule expand-composites ( )
     {
         if ! $(self.composites)
@@ -182,18 +176,18 @@
         }
         return $(self.composites) ;
     }
-
+
     rule evaluate-conditionals ( context ? )
     {
         context ?= $(__name__) ;
         if ! $(self.evaluated.$(context))
         {
- self.evaluated.$(context) = [ property-set.create
+ self.evaluated.$(context) = [ property-set.create
                 [ property.evaluate-conditionals-in-context $(self.raw) : [ $(context).raw ] ] ] ;
         }
- return $(self.evaluated.$(context)) ;
+ return $(self.evaluated.$(context)) ;
     }
-
+
     rule propagated ( )
     {
         if ! $(self.propagated-ps)
@@ -201,19 +195,18 @@
             self.propagated-ps = [ property-set.create $(self.propagated) ] ;
         }
         return $(self.propagated-ps) ;
- }
-
+ }
+
     rule link-incompatible ( )
     {
         if ! $(self.link-incompatible-ps)
         {
- self.link-incompatible-ps =
+ self.link-incompatible-ps =
               [ property-set.create $(self.link-incompatible) ] ;
         }
         return $(self.link-incompatible-ps) ;
     }
-
-
+
     rule run-actions ( )
     {
         if ! $(self.run)
@@ -222,37 +215,34 @@
         }
         return $(self.run) ;
     }
-
+
     rule add-defaults ( )
     {
         if ! $(self.defaults)
         {
- self.defaults = [ property-set.create
+ self.defaults = [ property-set.create
                 [ feature.add-defaults $(self.raw) ] ] ;
         }
         return $(self.defaults) ;
     }
-
-
+
     rule as-path ( )
     {
         if ! $(self.as-path)
         {
             self.as-path = [ property.as-path $(self.base) ] ;
- }
+ }
         return $(self.as-path) ;
- }
-
- # Computes the target path that should be used for
- # target with these properties.
+ }
+
+ # Computes the path to be used for a target with the given properties.
     # Returns a list of
     # - the computed path
- # - if the path is relative to build directory, a value of
- # 'true'.
+ # - if the path is relative to the build directory, a value of 'true'.
     rule target-path ( )
     {
         if ! $(self.target-path)
- {
+ {
             # The <location> feature can be used to explicitly
             # change the location of generated targetsv
             local l = [ get <location> ] ;
@@ -262,62 +252,61 @@
             }
             else
             {
- local p = [ as-path ] ;
+ local p = [ as-path ] ;
                 # Really, an ugly hack. Boost regression test system requires
                 # specific target paths, and it seems that changing it to handle
- # other directory layout is really hard. For that reason,
- # we teach V2 to do the things regression system requires.
- # The value o '<location-prefix>' is predended to the path.
- local prefix = [ get <location-prefix> ] ;
+ # other directory layout is really hard. For that reason, we
+ # teach V2 to do the things regression system requires. The
+ # value of '<location-prefix>' is prepended to the path.
+ local prefix = [ get <location-prefix> ] ;
                 if $(prefix)
                 {
                     self.target-path = [ path.join $(prefix) $(p) ] ;
- }
+ }
                 else
                 {
                     self.target-path = $(p) ;
- }
+ }
                 if ! $(self.target-path)
                 {
                     self.target-path = . ;
- }
+ }
                 # The path is relative to build dir.
                 self.target-path += true ;
- }
- }
+ }
+ }
         return $(self.target-path) ;
     }
-
-
+
     rule add ( ps )
     {
- if ! $(self.added.$(ps))
+ if ! $(self.added.$(ps))
         {
             self.added.$(ps) = [ property-set.create $(self.raw) [ $(ps).raw ] ] ;
         }
         return $(self.added.$(ps)) ;
- }
-
+ }
+
     rule add-raw ( properties * )
     {
         return [ add [ property-set.create $(properties) ] ] ;
- }
-
+ }
+
     rule link-incompatible-with ( ps )
     {
         if ! $(.li.$(ps))
         {
             local li1 = [ $(__name__).link-incompatible ] ;
- local li2 = [ $(ps).link-incompatible ] ;
- if [ set.equal $(li1) : $(li2) ]
+ local li2 = [ $(ps).link-incompatible ] ;
+ if [ set.equal $(li1) : $(li2) ]
             {
                 .li.$(ps) = false ;
             }
             else
             {
                 .li.$(ps) = true ;
- }
- }
+ }
+ }
         if $(.li.$(ps)) = true
         {
             return true ;
@@ -325,85 +314,79 @@
         else
         {
             return ;
- }
+ }
     }
-
 
-
     # Returns all values of 'feature'.
     rule get ( feature )
     {
         if ! $(self.map-built)
         {
- # For each feature, create member var and assign all
- # values to it. Since all regular member vars start with
- # 'self', there will be no conflicts between names.
+ # For each feature, create a member var and assign all values to it.
+ # Since all regular member vars start with 'self', there will be no
+ # conflicts between names.
             self.map-built = true ;
             for local v in $(self.raw)
             {
                 $(v:G) += $(v:G=) ;
- }
+ }
         }
-
         return $($(feature)) ;
     }
-
 }
 
-# Creates new 'property-set' instance for the given raw properties,
-# or returns an already existing ones.
+
+# Creates a new 'property-set' instance for the given raw properties or returns
+# an already existing ones.
 rule create ( raw-properties * )
 {
- raw-properties = [ sequence.unique
+ raw-properties = [ sequence.unique
         [ sequence.insertion-sort $(raw-properties) ] ] ;
-
+
     local key = $(raw-properties:J=-:E=) ;
-
- if ! $(.ps.$(key))
+
+ if ! $(.ps.$(key))
     {
         .ps.$(key) = [ new property-set $(raw-properties) ] ;
     }
- return $(.ps.$(key)) ;
+ return $(.ps.$(key)) ;
 }
 NATIVE_RULE property-set : create ;
 
-# Creates new 'property-set' instances after checking
-# that all properties are valid and converting incidental
-# properties into gristed form.
+
+# Creates a new 'property-set' instance after checking that all properties are
+# valid and converting incidental properties into gristed form.
 rule create-with-validation ( raw-properties * )
 {
     property.validate $(raw-properties) ;
-
     return [ create [ property.make $(raw-properties) ] ] ;
 }
 
-# Creates a property-set from the input given by the user, in the
-# context of 'jamfile-module' at 'location'
+
+# Creates a property-set from the input given by the user, in the context of
+# 'jamfile-module' at 'location'.
 rule create-from-user-input ( raw-properties * : jamfile-module location )
 {
     local specification = [ property.translate-paths $(raw-properties)
- : $(location) ] ;
+ : $(location) ] ;
     specification = [ property.translate-indirect $(specification)
- : $(jamfile-module) ] ;
- specification =
- [ property.expand-subfeatures-in-conditions $(specification) ] ;
- specification = [ property.make $(specification) ] ;
- result = [ property-set.create $(specification) ] ;
- return $(result) ;
+ : $(jamfile-module) ] ;
+ specification =
+ [ property.expand-subfeatures-in-conditions $(specification) ] ;
+ specification = [ property.make $(specification) ] ;
+ return [ property-set.create $(specification) ] ;
 }
 
-# Refines requirements with requirements provided by the user.
-# Specially handles "-<property>value" syntax in specification
-# to remove given requirements.
-# - parent-requirements -- property-set object with requirements
-# to refine
-# - specification -- string list of requirements provided by the use
-# - project-module -- the module to which context indirect features
-# will be bound.
-# - location -- the path to which path features are relative.
-#
+
+# Refines requirements with requirements provided by the user. Specially handles
+# "-<property>value" syntax in specification to remove given requirements.
+# - parent-requirements -- property-set object with requirements to refine.
+# - specification -- string list of requirements provided by the user.
+# - project-module -- module to which context indirect features will be
+# bound.
+# - location -- path to which path features are relative.
 #
-rule refine-from-user-input ( parent-requirements : specification *
+rule refine-from-user-input ( parent-requirements : specification *
     : project-module : location )
 {
     if ! $(specification)
@@ -414,7 +397,7 @@
     {
         local add-requirements ;
         local remove-requirements ;
-
+
         for local r in $(specification)
         {
             local m = [ MATCH "^-(.*)" : $(r) ] ;
@@ -427,38 +410,35 @@
                 add-requirements += $(r) ;
             }
         }
-
+
         if $(remove-requirements)
         {
- # Need to create property set, so that path features
- # and indirect features are translated just like they
- # are in project requirements.
- local ps = [ property-set.create-from-user-input
+ # Need to create a property set, so that path features and indirect
+ # features are translated just like they are in project
+ # requirements.
+ local ps = [ property-set.create-from-user-input
                 $(remove-requirements) : $(project-module) $(location) ] ;
-
- parent-requirements = [ property-set.create
- [ set.difference [ $(parent-requirements).raw ]
- : [ $(ps).raw ] ] ] ;
+
+ parent-requirements = [ property-set.create
+ [ set.difference [ $(parent-requirements).raw ]
+ : [ $(ps).raw ] ] ] ;
             specification = $(add-requirements) ;
         }
 
- local requirements = [ property-set.create-from-user-input
+ local requirements = [ property-set.create-from-user-input
             $(specification) : $(project-module) $(location) ] ;
-
- requirements = [ $(parent-requirements).refine $(requirements) ] ;
- return $(requirements) ;
+
+ return [ $(parent-requirements).refine $(requirements) ] ;
     }
 }
 
 
-
-# Returns property-set with empty set of properties.
+# Returns a property-set with an empty set of properties.
 rule empty ( )
 {
     if ! $(.empty)
     {
- .empty = [ create ] ;
+ .empty = [ create ] ;
     }
-
     return $(.empty) ;
 }

Modified: trunk/tools/build/v2/build/property.jam
==============================================================================
--- trunk/tools/build/v2/build/property.jam (original)
+++ trunk/tools/build/v2/build/property.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,52 +1,50 @@
-# Copyright 2001, 2002, 2003 Dave Abrahams
-# Copyright 2006 Rene Rivera
-# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-
-import utility : ungrist ;
-import sequence : unique ;
-import errors : error ;
+# Copyright 2001, 2002, 2003 Dave Abrahams
+# Copyright 2006 Rene Rivera
+# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+import errors ;
 import feature ;
+import indirect ;
+import path ;
 import regex ;
 import string ;
 import sequence ;
 import set ;
-import path ;
-import assert ;
-import indirect ;
+import utility ;
 
-# Refines 'properties' by overriding any non-free properties
-# for which a different value is specified in 'requirements'.
-# Conditional requirements are just added without modification.
-# Returns the resulting list of properties.
+
+# Refines 'properties' by overriding any non-free and non-conditional properties
+# for which a different value is specified in 'requirements'. Returns the
+# resulting list of properties.
 rule refine ( properties * : requirements * )
 {
     local result ;
     local error ;
-
- # All the elements of requirements should be present in the result
- # Record them so that we can handle 'properties'.
+
+ # All the 'requirements' elements should be present in the result. Record
+ # them so that we can handle 'properties'.
     for local r in $(requirements)
     {
         # Don't consider conditional requirements.
         if ! [ MATCH (:) : $(r:G=) ]
- {
- # Note: cannot use local here, so take an ugly name
+ {
+ # Note: cannot use a local variable here, so use an ugly name.
             __require__$(r:G) = $(r:G=) ;
- }
+ }
     }
 
     for local p in $(properties)
- {
- # No processing for free properties
+ {
         if [ MATCH (:) : $(p:G=) ]
         {
- # Skip conditional properties
+ # Do not modify conditional properties.
             result += $(p) ;
- }
+ }
         else if free in [ feature.attributes $(p:G) ]
         {
+ # Do not modify free properties.
             result += $(p) ;
         }
         else
@@ -54,8 +52,7 @@
             local required-value = $(__require__$(p:G)) ;
             if $(required-value)
             {
- local value = $(p:G=) ;
- if $(value) != $(required-value)
+ if $(p:G=) != $(required-value)
                 {
                     result += $(p:G)$(required-value) ;
                 }
@@ -71,23 +68,24 @@
         }
     }
 
- # Unset our ugly map.
+ # Unset our ugly map.
     for local r in $(requirements)
     {
- __require__$(r:G) = ;
+ __require__$(r:G) = ;
     }
-
+
     if $(error)
     {
         return $(error) ;
     }
     else
     {
- return [ unique $(result) $(requirements) ] ;
+ return [ sequence.unique $(result) $(requirements) ] ;
     }
 }
 
-# Removes all conditional properties which conditions are not met. For those
+
+# Removes all conditional properties whose conditions are not met. For those
 # with met conditions, removes the condition. Properties in conditions are
 # looked up in 'context'.
 rule evaluate-conditionals-in-context ( properties * : context * )
@@ -103,31 +101,32 @@
         else
         {
             base += $(p) ;
- }
+ }
     }
 
     local result = $(base) ;
     for local p in $(conditionals)
     {
- # Separate condition and property
+ # Separate condition and property.
         local s = [ MATCH (.*):(<.*) : $(p) ] ;
- # Split condition into individual properties
+ # Split condition into individual properties.
         local c = [ regex.split $(s[1]) "," ] ;
- # Evaluate condition
+ # Evaluate condition.
         if $(c) in $(context)
         {
             result += $(s[2]) ;
- }
+ }
     }
- return $(result) ;
+ return $(result) ;
 }
 
+
 rule expand-subfeatures-in-conditions ( properties * )
 {
     local result ;
     for local p in $(properties)
     {
- local s = [ MATCH (.*):(<.*) : $(p) ] ;
+ local s = [ MATCH (.*):(<.*) : $(p) ] ;
         if ! $(s)
         {
             result += $(p) ;
@@ -135,20 +134,20 @@
         else
         {
             local condition = $(s[1]) ;
- # Condition might include several elements
+ local value = $(s[2]) ;
+ # Condition might include several elements.
             condition = [ regex.split $(condition) "," ] ;
- local value = $(s[2]) ;
             local e ;
             for local c in $(condition)
- {
- # It common that condition includes a toolset which
- # was never defined, or mentiones subfeatures which
- # were never defined. In that case, validation will
- # only produce an spirious error, so prevent
- # validation by passing 'true' as second parameter.
+ {
+ # It is common for a condition to include a toolset or
+ # subfeatures that have not been defined. In that case we want
+ # the condition to simply 'never be satisfied' and validation
+ # would only produce a spurious error so we prevent it by
+ # passing 'true' as the second parameter.
                 e += [ feature.expand-subfeatures $(c) : true ] ;
             }
-
+
             if $(e) = $(condition)
             {
                 result += $(p) ;
@@ -157,17 +156,15 @@
             {
                 local individual-subfeatures = [ set.difference $(e) : $(condition) ] ;
                 result += $(individual-subfeatures:J=,):$(value) ;
- }
- }
- }
+ }
+ }
+ }
     return $(result) ;
 }
 
 
-
-# Helper for as-path, below. Orders properties with the implicit ones
-# first, and within the two sections in alphabetical order of feature
-# name.
+# Helper for as-path, below. Orders properties with the implicit ones first, and
+# within the two sections in alphabetical order of feature name.
 local rule path-order ( x y )
 {
     if $(y:G) && ! $(x:G)
@@ -185,7 +182,7 @@
             x = [ feature.expand-subfeatures $(x) ] ;
             y = [ feature.expand-subfeatures $(y) ] ;
         }
-
+
         if $(x[1]) < $(y[1])
         {
             return true ;
@@ -193,6 +190,7 @@
     }
 }
 
+
 local rule abbreviate-dashed ( string )
 {
     local r ;
@@ -203,11 +201,13 @@
     return $(r:J=-) ;
 }
 
+
 local rule identity ( string )
 {
     return $(string) ;
 }
 
+
 if --abbreviate-paths in [ modules.peek : ARGV ]
 {
     .abbrev = abbreviate-dashed ;
@@ -217,37 +217,38 @@
     .abbrev = identity ;
 }
 
-# Returns a path which represents the given expanded property set.
+
+# Returns a path representing the given expanded property set.
 rule as-path ( properties * )
 {
     local entry = .result.$(properties:J=-) ;
-
+
     if ! $($(entry))
     {
         # trim redundancy
         properties = [ feature.minimize $(properties) ] ;
-
+
         # sort according to path-order
         properties = [ sequence.insertion-sort $(properties) : path-order ] ;
-
+
         local components ;
         for local p in $(properties)
         {
             if $(p:G)
             {
- local f = [ ungrist $(p:G) ] ;
+ local f = [ utility.ungrist $(p:G) ] ;
                 p = $(f)-$(p:G=) ;
             }
-
             components += [ $(.abbrev) $(p) ] ;
         }
-
+
         $(entry) = $(components:J=/) ;
- }
-
+ }
+
     return $($(entry)) ;
 }
 
+
 # Exit with error if property is not valid.
 local rule validate1 ( property )
 {
@@ -259,17 +260,19 @@
 
         if ! [ feature.valid $(feature) ]
         {
- feature = [ ungrist $(property:G) ] ; # Ungrist for better error messages
+ # Ungrist for better error messages.
+ feature = [ utility.ungrist $(property:G) ] ;
             msg = "unknown feature '$(feature)'" ;
         }
- else if $(value) && ! free in [ feature.attributes $(feature) ]
+ else if $(value) && ! free in [ feature.attributes $(feature) ]
         {
             feature.validate-value-string $(feature) $(value) ;
- }
+ }
         else if ! ( $(value) || ( optional in [ feature.attributes $(feature) ] ) )
         {
- feature = [ ungrist $(property:G) ] ; # Ungrist for better error messages
- msg = "No value specified for feature '$(feature)'" ;
+ # Ungrist for better error messages.
+ feature = [ utility.ungrist $(property:G) ] ;
+ msg = "No value specified for feature '$(feature)'" ;
         }
     }
     else
@@ -277,12 +280,13 @@
         local feature = [ feature.implied-feature $(property) ] ;
         feature.validate-value-string $(feature) $(property) ;
     }
- if $(msg)
+ if $(msg)
     {
- error "Invalid property "'$(property:J=" ")'": "$(msg:J=" "). ;
+ errors.error "Invalid property "'$(property:J=" ")'": "$(msg:J=" "). ;
     }
 }
 
+
 rule validate ( properties * )
 {
     for local p in $(properties)
@@ -291,6 +295,7 @@
     }
 }
 
+
 rule validate-property-sets ( property-sets * )
 {
     for local s in $(property-sets)
@@ -299,12 +304,13 @@
     }
 }
 
-# Makes a property set from 'specification', converting implicit values into
-# full properties.
+
+# Expands any implicit property values in the given property 'specification' so
+# they explicitly state their feature.
 rule make ( specification * )
 {
     local result ;
- for local e in $(specification)
+ for local e in $(specification)
     {
         if $(e:G)
         {
@@ -313,18 +319,19 @@
         else if [ feature.is-implicit-value $(e) ]
         {
             local feature = [ feature.implied-feature $(e) ] ;
- result += $(feature)$(e) ;
+ result += $(feature)$(e) ;
         }
         else
         {
- error "'$(e)' is not a valid for property specification" ;
+ errors.error "'$(e)' is not a valid property specification" ;
         }
     }
     return $(result) ;
 }
 
-# Returns a property sets which include all the elements in 'properties' that
-# do not have attributes listed in 'attributes'.
+
+# Returns a property set containing all the elements in 'properties' that do not
+# have their attributes listed in 'attributes'.
 rule remove ( attributes + : properties * )
 {
     local result ;
@@ -338,8 +345,9 @@
     return $(result) ;
 }
 
-# Returns a property set which include all properties in 'properties' that have
-# any of 'attributes'.
+
+# Returns a property set containig all the elements in 'properties' that have
+# their attributes listed in 'attributes'.
 rule take ( attributes + : properties * )
 {
     local result ;
@@ -353,15 +361,16 @@
     return $(result) ;
 }
 
-# Selects properties which correspond to any of the given features.
+
+# Selects properties corresponding to any of the given features.
 rule select ( features * : properties * )
 {
     local result ;
-
- # add any missing angle brackets
+
+ # Add any missing angle brackets.
     local empty = "" ;
     features = $(empty:G=$(features)) ;
-
+
     for local p in $(properties)
     {
         if $(p:G) in $(features)
@@ -372,17 +381,17 @@
     return $(result) ;
 }
 
-# Returns a modified version of properties with all values of the
-# given feature replaced by the given value.
-# If 'value' is empty the feature will be removed
+
+# Returns a modified version of properties with all values of the given feature
+# replaced by the given value. If 'value' is empty the feature will be removed.
 rule change ( properties * : feature value ? )
 {
- local result ;
+ local result ;
     for local p in $(properties)
     {
         if $(p:G) = $(feature)
         {
- result += $(value:G=$(feature)) ;
+ result += $(value:G=$(feature)) ;
         }
         else
         {
@@ -392,61 +401,61 @@
     return $(result) ;
 }
 
-# If 'property' is conditional property, returns
-# condition and the property, e.g
-# <variant>debug,<toolset>gcc:<inlining>full will become
-# <variant>debug,<toolset>gcc <inlining>full.
-# Otherwise, returns empty string.
+
+# If 'property' is a conditional property, returns the condition and the
+# property. E.g. <variant>debug,<toolset>gcc:<inlining>full will become
+# <variant>debug,<toolset>gcc <inlining>full. Otherwise, returns an empty
+# string.
 rule split-conditional ( property )
 {
     local m = [ MATCH "(.+):<(.+)" : $(property) ] ;
     if $(m)
     {
         return $(m[1]) <$(m[2]) ;
- }
+ }
 }
 
 
-# Interpret all path properties in 'properties' as relative to 'path'
-# The property values are assumed to be in system-specific form, and
-# will be translated into normalized form.
+# Interpret all path properties in 'properties' as relative to 'path'. The
+# property values are assumed to be in system-specific form, and will be
+# translated into normalized form.
 rule translate-paths ( properties * : path )
 {
     local result ;
     for local p in $(properties)
     {
         local split = [ split-conditional $(p) ] ;
- local condition = "" ;
+ local condition = "" ;
         if $(split)
         {
             condition = $(split[1]): ;
             p = $(split[2]) ;
         }
-
- if path in [ feature.attributes $(p:G) ]
+
+ if path in [ feature.attributes $(p:G) ]
         {
             local values = [ regex.split $(p:TG=) "&&" ] ;
             local t ;
             for local v in $(values)
             {
- t += [ path.root [ path.make $(v) ] $(path) ] ;
+ t += [ path.root [ path.make $(v) ] $(path) ] ;
             }
- t = $(t:J="&&") ;
+ t = $(t:J="&&") ;
             result += $(condition)$(t:TG=$(p:G)) ;
         }
         else
         {
             result += $(condition)$(p) ;
- }
+ }
     }
     return $(result) ;
 }
 
-# Assumes that all feature values that start with '@' are
-# names of rules, used in 'context-module'. Such rules
-# can be either local to the module or global. Converts such
-# values into 'indirect-rule' format (see indirect.jam), so
-# that they can be called from other modules.
+
+# Assumes that all feature values that start with '@' are names of rules, used
+# in 'context-module'. Such rules can be either local to the module or global.
+# Converts such values into 'indirect-rule' format (see indirect.jam), so they
+# can be called from other modules.
 rule translate-indirect ( specification * : context-module )
 {
     local result ;
@@ -458,23 +467,21 @@
             local v ;
             if [ MATCH "^([^%]*)%([^%]+)$" : $(m) ]
             {
- # Rule is already in indirect format
+ # Rule is already in indirect format.
                 v = $(m) ;
             }
             else
             {
                 if ! [ MATCH ".*([.]).*" : $(m) ]
                 {
- # This is unqualified rule name. The user might want
- # to set flags on this rule name, and toolset.flag
- # auto-qualifies the rule name. Need to do the same
- # here so set flag setting work.
- # We can arrange for toolset.flag to *not* auto-qualify
- # the argument, but then two rules defined in two Jamfiles
- # will conflict.
+ # This is an unqualified rule name. The user might want to
+ # set flags on this rule name and toolset.flag
+ # auto-qualifies it. Need to do the same here so flag
+ # setting works. We can arrange for toolset.flag to *not*
+ # auto-qualify the argument but then two rules defined in
+ # two Jamfiles would conflict.
                     m = $(context-module).$(m) ;
                 }
-
                 v = [ indirect.make $(m) : $(context-module) ] ;
             }
 
@@ -484,25 +491,24 @@
         else
         {
             result += $(p) ;
- }
+ }
     }
- return $(result) ;
+ return $(result) ;
 }
 
 
-# Class which maintains a property set -> string
-# mapping
+# Class which maintains a property set -> string mapping.
 class property-map
 {
+ import errors ;
     import numbers ;
     import sequence ;
- import errors : error ;
-
+
     rule __init__ ( )
- {
+ {
         self.next-flag = 1 ;
     }
-
+
     # Associate 'value' with 'properties'
     rule insert ( properties + : value )
     {
@@ -513,18 +519,16 @@
         self.next-flag = [ numbers.increment $(self.next-flag) ] ;
     }
 
- # Return the value associated with 'properties'
- # or any subset of it. If more than one
- # subset has value assigned to it, return the
- # value for the longest subset, if it's unique.
+ # Returns the value associated with 'properties' or any subset of it. If
+ # more than one subset has a value assigned to it, returns the value for the
+ # longest subset, if it's unique.
     rule find ( properties + )
     {
         return [ find-replace $(properties) ] ;
     }
-
- # Find the value associated with 'properties'.
- # If 'value' parameter is given, replaces the found value
- # Returns the value that were stored originally.
+
+ # Returns the value associated with 'properties'. If 'value' parameter is
+ # given, replaces the found value.
     rule find-replace ( properties + : value ? )
     {
         # First find all matches
@@ -535,106 +539,95 @@
             if $(self.properties.$(i)) in $(properties)
             {
                 matches += $(i) ;
- match-ranks += [ sequence.length
- $(self.properties.$(i)) ] ;
+ match-ranks += [ sequence.length $(self.properties.$(i)) ] ;
             }
         }
- local best = [ sequence.select-highest-ranked
- $(matches) : $(match-ranks) ] ;
+ local best = [ sequence.select-highest-ranked $(matches)
+ : $(match-ranks) ] ;
         if $(best[2])
         {
- error "Ambiguous key" ;
- }
+ errors.error "Ambiguous key" ;
+ }
         local original = $(self.value.$(best)) ;
         if $(value)
         {
             self.value.$(best) = $(value) ;
- }
+ }
         return $(original) ;
- }
+ }
 }
 
+
 local rule __test__ ( )
 {
+ import assert ;
+ import "class" : new ;
     import errors : try catch ;
     import feature ;
- import feature : feature subfeature compose ;
-
- # local rules must be explicitly re-imported
+
+ # Local rules must be explicitly re-imported.
     import property : path-order abbreviate-dashed ;
-
+
     feature.prepare-test property-test-temp ;
 
- feature toolset : gcc : implicit symmetric ;
- subfeature toolset gcc : version : 2.95.2 2.95.3 2.95.4
- 3.0 3.0.1 3.0.2 : optional ;
- feature define : : free ;
- feature runtime-link : dynamic static : symmetric link-incompatible ;
- feature optimization : on off ;
- feature variant : debug release : implicit composite symmetric ;
- feature rtti : on off : link-incompatible ;
+ feature.feature toolset : gcc : implicit symmetric ;
+ feature.subfeature toolset gcc : version : 2.95.2 2.95.3 2.95.4 3.0 3.0.1
+ 3.0.2 : optional ;
+ feature.feature define : : free ;
+ feature.feature runtime-link : dynamic static : symmetric link-incompatible ;
+ feature.feature optimization : on off ;
+ feature.feature variant : debug release : implicit composite symmetric ;
+ feature.feature rtti : on off : link-incompatible ;
 
- compose <variant>debug : <define>_DEBUG <optimization>off ;
- compose <variant>release : <define>NDEBUG <optimization>on ;
+ feature.compose <variant>debug : <define>_DEBUG <optimization>off ;
+ feature.compose <variant>release : <define>NDEBUG <optimization>on ;
 
- import assert ;
- import "class" : new ;
-
     validate <toolset>gcc <toolset>gcc-3.0.1 : $(test-space) ;
-
+
     assert.true path-order $(test-space) debug <define>foo ;
     assert.false path-order $(test-space) <define>foo debug ;
     assert.true path-order $(test-space) gcc debug ;
     assert.false path-order $(test-space) debug gcc ;
     assert.true path-order $(test-space) <optimization>on <rtti>on ;
     assert.false path-order $(test-space) <rtti>on <optimization>on ;
-
+
     assert.result-equal <toolset>gcc <rtti>off <define>FOO
         : refine <toolset>gcc <rtti>off
         : <define>FOO
- : $(test-space)
- ;
+ : $(test-space) ;
 
     assert.result-equal <toolset>gcc <optimization>on
         : refine <toolset>gcc <optimization>off
         : <optimization>on
- : $(test-space)
- ;
+ : $(test-space) ;
 
     assert.result-equal <toolset>gcc <rtti>off
- : refine <toolset>gcc : <rtti>off : $(test-space)
- ;
+ : refine <toolset>gcc : <rtti>off : $(test-space) ;
 
     assert.result-equal <toolset>gcc <rtti>off <rtti>off:<define>FOO
- : refine <toolset>gcc : <rtti>off <rtti>off:<define>FOO
- : $(test-space)
- ;
-
- assert.result-equal <toolset>gcc:<define>foo <toolset>gcc:<define>bar
- : refine <toolset>gcc:<define>foo : <toolset>gcc:<define>bar
- : $(test-space)
- ;
+ : refine <toolset>gcc : <rtti>off <rtti>off:<define>FOO
+ : $(test-space) ;
+
+ assert.result-equal <toolset>gcc:<define>foo <toolset>gcc:<define>bar
+ : refine <toolset>gcc:<define>foo : <toolset>gcc:<define>bar
+ : $(test-space) ;
 
     assert.result <define>MY_RELEASE
- : evaluate-conditionals-in-context
+ : evaluate-conditionals-in-context
           <variant>release,<rtti>off:<define>MY_RELEASE
- : <toolset>gcc <variant>release <rtti>off
-
- ;
+ : <toolset>gcc <variant>release <rtti>off ;
 
     assert.result debug
- : as-path <optimization>off <variant>debug
- : $(test-space)
- ;
+ : as-path <optimization>off <variant>debug
+ : $(test-space) ;
 
     assert.result gcc/debug/rtti-off
- : as-path <toolset>gcc <optimization>off <rtti>off <variant>debug
- : $(test-space)
- ;
+ : as-path <toolset>gcc <optimization>off <rtti>off <variant>debug
+ : $(test-space) ;
 
     assert.result optmz-off : abbreviate-dashed optimization-off ;
     assert.result rntm-lnk-sttc : abbreviate-dashed runtime-link-static ;
-
+
     try ;
         validate <feature>value : $(test-space) ;
     catch "Invalid property '<feature>value': unknown feature 'feature'." ;
@@ -642,7 +635,7 @@
     try ;
         validate <rtti>default : $(test-space) ;
     catch \"default\" is not a known value of feature <rtti> ;
-
+
     validate <define>WHATEVER : $(test-space) ;
 
     try ;
@@ -652,21 +645,20 @@
     try ;
         validate value : $(test-space) ;
     catch "value" is not a value of an implicit feature ;
-
 
- assert.result-equal <rtti>on
+ assert.result-equal <rtti>on
         : remove free implicit : <toolset>gcc <define>foo <rtti>on : $(test-space) ;
 
- assert.result-equal <include>a
+ assert.result-equal <include>a
         : select include : <include>a <toolset>gcc ;
 
- assert.result-equal <include>a
+ assert.result-equal <include>a
         : select include bar : <include>a <toolset>gcc ;
 
     assert.result-equal <include>a <toolset>gcc
         : select include <bar> <toolset> : <include>a <toolset>gcc ;
-
- assert.result-equal <toolset>kylix <include>a
+
+ assert.result-equal <toolset>kylix <include>a
         : change <toolset>gcc <include>a : <toolset> kylix ;
 
     pm = [ new property-map ] ;
@@ -674,31 +666,23 @@
     $(pm).insert <toolset>gcc <os>NT : obj ;
     $(pm).insert <toolset>gcc <os>CYGWIN : obj ;
 
- assert.equal o
- : [ $(pm).find <toolset>gcc ] ;
+ assert.equal o : [ $(pm).find <toolset>gcc ] ;
 
- assert.equal obj
- : [ $(pm).find <toolset>gcc <os>NT ] ;
+ assert.equal obj : [ $(pm).find <toolset>gcc <os>NT ] ;
 
     try ;
         $(pm).find <toolset>gcc <os>NT <os>CYGWIN ;
     catch "Ambiguous key" ;
 
- # Test ordinary properties
- assert.result
- : split-conditional <toolset>gcc
- ;
-
- # Test properties with ":"
- assert.result
- : split-conditional <define>FOO=A::B
- ;
-
- # Test conditional feature
+ # Test ordinary properties.
+ assert.result : split-conditional <toolset>gcc ;
+
+ # Test properties with ":".
+ assert.result : split-conditional <define>FOO=A::B ;
+
+ # Test conditional feature.
     assert.result-equal <toolset>gcc,<toolset-gcc:version>3.0 <define>FOO
- : split-conditional <toolset>gcc,<toolset-gcc:version>3.0:<define>FOO
- ;
-
+ : split-conditional <toolset>gcc,<toolset-gcc:version>3.0:<define>FOO ;
+
     feature.finish-test property-test-temp ;
 }
-

Modified: trunk/tools/build/v2/build/targets.jam
==============================================================================
--- trunk/tools/build/v2/build/targets.jam (original)
+++ trunk/tools/build/v2/build/targets.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -5,30 +5,29 @@
 # (See accompanying file LICENSE_1_0.txt or copy at
 # http://www.boost.org/LICENSE_1_0.txt)
 
-
-# Supports 'abstract' targets, which are targets explicitly defined in Jamfile.
+# Supports 'abstract' targets, which are targets explicitly defined in a
+# Jamfile.
 #
 # Abstract targets are represented by classes derived from 'abstract-target'
 # class. The first abstract target is 'project-target', which is created for
 # each Jamfile, and can be obtained by the 'target' rule in the Jamfile's
 # module (see project.jam).
 #
-# Project targets keep a list of 'main-target' instances.
-# A main target is what the user explicitly defines in a Jamfile. It is
-# possible to have several definitions for a main target, for example to have
-# different lists of sources for different platforms. So, main targets
-# keep a list of alternatives.
+# Project targets keep a list of 'main-target' instances. A main target is
+# what the user explicitly defines in a Jamfile. It is possible to have
+# several definitions for a main target, for example to have different lists
+# of sources for different platforms. So, main targets keep a list of
+# alternatives.
 #
 # Each alternative is an instance of 'abstract-target'. When a main target
-# subvariant is defined by some rule, that rule will decide what class to
-# use, create an instance of that class and add it to the list of alternatives
-# for the main target.
+# subvariant is defined by some rule, that rule will decide what class to use,
+# create an instance of that class and add it to the list of alternatives for
+# the main target.
 #
-# Rules supplied by the build system will use only targets derived
-# from 'basic-target' class, which will provide some default behaviour.
-# There will be different classes derived from it such as 'make-target',
-# created by the 'make' rule, and 'typed-target', created by rules such as
-# 'exe' and 'lib'.
+# Rules supplied by the build system will use only targets derived from
+# 'basic-target' class, which will provide some default behaviour. There will
+# be different classes derived from it such as 'make-target', created by the
+# 'make' rule, and 'typed-target', created by rules such as 'exe' and 'lib'.
 
 #
 # +------------------------+
@@ -147,6 +146,7 @@
     }
 }
 
+
 if --debug-building in [ modules.peek : ARGV ]
 {
     modules.poke : .debug-building : true ;
@@ -171,17 +171,16 @@
 }
 
 
-# Project target class (derived from 'abstract-target')
+# Project target class (derived from 'abstract-target').
 #
-# This class these responsibilities:
-# - maintaining a list of main targets in this project and building them
+# This class has the following responsibilities:
+# - Maintaining a list of main targets in this project and building them.
 #
 # Main targets are constructed in two stages:
-# - When Jamfile is read, a number of calls to 'add-alternative' is made.
-# At that time, alternatives can also be renamed to account for inline
-# targets.
-# - The first time 'main-target' or 'has-main-target' rule is called,
-# all alternatives are enumerated an main targets are created.
+# - When Jamfile is read, a number of calls to 'add-alternative' is made. At
+# that time, alternatives can also be renamed to account for inline targets.
+# - The first time 'main-target' or 'has-main-target' rule is called, all
+# alternatives are enumerated and main targets are created.
 class project-target : abstract-target
 {
     import project ;
@@ -210,8 +209,8 @@
         }
     }
 
- # This is needed only by the 'make' rule. Need to find the
- # way to make 'make' work without this method.
+ # This is needed only by the 'make' rule. Need to find the way to make
+ # 'make' work without this method.
     rule project-module ( )
     {
         return $(self.project-module) ;
@@ -260,8 +259,8 @@
         return $(usage-requirements) [ sequence.unique $(targets) ] ;
     }
 
- # Computes and returns a list of abstract-target instances which
- # must be built when this project is built.
+ # Computes and returns a list of abstract-target instances which must be
+ # built when this project is built.
     rule targets-to-build ( )
     {
         local result ;
@@ -305,7 +304,7 @@
         if $(self.built-main-targets)
         {
             errors.error "add-alternative called when main targets are already created."
- : "in project" [ full-name ] ;
+ : "in project" [ full-name ] ;
         }
         self.alternatives += $(target-instance) ;
     }
@@ -350,8 +349,8 @@
         local extra-error-message ;
         if $(project-part)
         {
- # There's explicit project part in id. Looks up the
- # project and pass the request to it.
+ # There's explicit project part in id. Looks up the project and
+ # passes the request to it.
             local pm = [ project.find $(project-part) : $(current-location) ] ;
             if $(pm)
             {
@@ -365,8 +364,8 @@
         }
         else
         {
- # Interpret target-name as name of main target
- # Need to do this before checking for file. Consider this:
+ # Interpret target-name as name of main target. Need to do this
+ # before checking for file. Consider this:
             #
             # exe test : test.cpp ;
             # install s : test : <location>. ;
@@ -381,8 +380,8 @@
 
                 if ! [ $(result).exists ]
                 {
- # File actually does not exist.
- # Reset 'target' so that an error is issued.
+ # File actually does not exist. Reset 'target' so that an
+ # error is issued.
                     result = ;
                 }
             }
@@ -454,9 +453,9 @@
 
     # Accessor, add a constant.
     rule add-constant (
- name # Variable name of the constant.
- : value + # Value of the constant.
- : type ? # Optional type of value.
+ name # Variable name of the constant.
+ : value + # Value of the constant.
+ : type ? # Optional type of value.
         )
     {
         switch $(type)
@@ -466,9 +465,9 @@
               for local v in $(value)
               {
                 v = [ path.root [ path.make $(v) ] $(self.location) ] ;
- # Now make the value absolute path
+ # Now make the value absolute path.
                 v = [ path.root $(v) [ path.pwd ] ] ;
- # Constants should be in platform-native form
+ # Constants should be in platform-native form.
                 v = [ path.native $(v) ] ;
                 r += $(v) ;
               }
@@ -479,7 +478,7 @@
             self.constants += $(name) ;
         }
         self.constant.$(name) = $(value) ;
- # Inject the constant in the scope of project-root module
+ # Inject the constant in the scope of project-root module.
         modules.poke $(self.project-module) : $(name) : $(value) ;
     }
 
@@ -493,11 +492,11 @@
               : [ modules.peek $(parent) : self.constant.$(c) ] ;
         }
 
- # Import rules from parent
+ # Import rules from parent.
         local this-module = [ project-module ] ;
         local parent-module = [ $(parent).project-module ] ;
- # Don't import rules which comes from 'project-rules', they
- # must be imported localized.
+ # Don't import rules coming from 'project-rules' as they must be
+ # imported localized.
         local user-rules = [ set.difference
             [ RULENAMES $(parent-module) ] :
             [ RULENAMES project-rules ] ] ;
@@ -532,16 +531,16 @@
 }
 
 
-# A named top-level target in Jamfile
+# A named top-level target in Jamfile.
 class main-target : abstract-target
 {
- import errors ;
     import assert ;
- import sequence ;
- import print ;
     import build-request ;
+ import errors ;
     import feature ;
+ import print ;
     import property-set ;
+ import sequence ;
     import targets : start-building end-building ;
 
     rule __init__ ( name : project )
@@ -567,20 +566,18 @@
         self.alternatives += $(target) ;
     }
 
- # Returns the best viable alternative for this property-set
- # See the documentation for selection rules.
+ # Returns the best viable alternative for this property-set. See the
+ # documentation for selection rules.
     local rule select-alternatives ( property-set debug ? )
     {
- # When selecting alternatives we have to consider defaults,
- # for example:
+ # When selecting alternatives we have to consider defaults, for example:
         # lib l : l.cpp : <variant>debug ;
         # lib l : l_opt.cpp : <variant>release ;
         # won't work unless we add default value <variant>debug.
         property-set = [ $(p).add-defaults ] ;
 
- # The algorithm: we keep the current best viable alternative.
- # When we've got new best viable alternative, we compare it
- # with the current one.
+ # The algorithm: we keep the current best viable alternative. When we've
+ # got a new best viable alternative, we compare it with the current one.
 
         local best ;
         local best-properties ;
@@ -635,11 +632,10 @@
         }
     }
 
-
     rule apply-default-build ( property-set )
     {
- # 1. First, see what properties from default-build
- # are already present in property-set.
+ # 1. First, see what properties from default-build are already present
+ # in property-set.
 
         local raw = [ $(property-set).raw ] ;
         local specified-features = $(raw:G) ;
@@ -653,18 +649,17 @@
             }
         }
 
- # 2. If there's any defaults to be applied, form the new
- # build request. Pass it throw 'expand-no-defaults', since
- # default-build might contain "release debug", which will
- # result in two property-sets.
+ # 2. If there are any defaults to be applied, form a new build request.
+ # Pass it through to 'expand-no-defaults' since default-build might
+ # contain "release debug" resulting in two property-sets.
         local result ;
         if $(defaults-to-apply)
         {
             properties = [
               build-request.expand-no-defaults
 
- # We have to compress subproperties here to prevent
- # property lists like:
+ # We have to compress subproperties here to prevent property
+ # lists like:
                 #
                 # <toolset>msvc <toolset-msvc:version>7.1 <threading>multi
                 #
@@ -673,10 +668,9 @@
                 # <toolset-msvc:version>7.1/<threading>multi
                 # <toolset>msvc/<toolset-msvc:version>7.1/<threading>multi
                 #
- # due to cross-product property combination. That may
- # be an indication that
- # build-request.expand-no-defaults is the wrong rule
- # to use here.
+ # due to a cross-product property combination. That may be an
+ # indication that build-request.expand-no-defaults is the wrong
+ # rule to use here.
                 [ feature.compress-subproperties $(raw) ]
                   $(defaults-to-apply)
             ] ;
@@ -693,7 +687,6 @@
             {
                 result = [ property-set.empty ] ;
             }
-
         }
         else
         {
@@ -704,14 +697,14 @@
 
     # Select an alternative for this main target, by finding all alternatives
     # which requirements are satisfied by 'properties' and picking the one with
- # longest requirements set.
- # Returns the result of calling 'generate' on that alternative.
+ # longest requirements set. Returns the result of calling 'generate' on that
+ # alternative.
     rule generate ( property-set )
     {
         start-building $(__name__) ;
 
- # We want composite properties in build request act as if
- # all the properties it expands too are explicitly specified.
+ # We want composite properties in build request act as if all the
+ # properties it expands too are explicitly specified.
         property-set = [ $(property-set).expand ] ;
 
         local all-property-sets = [ apply-default-build $(property-set) ] ;
@@ -730,11 +723,10 @@
         return $(usage-requirements) [ sequence.unique $(result) ] ;
     }
 
- # Generates the main target with the given property set
- # and returns a list which first element is property-set object
- # containing usage-requirements of generated target and with
- # generated virtual target in other elements. It's possible
- # that no targets are generated.
+ # Generates the main target with the given property set and returns a list
+ # which first element is property-set object containing usage-requirements
+ # of generated target and with generated virtual target in other elements.
+ # It's possible that no targets are generated.
     local rule generate-really ( property-set )
     {
         local best-alternatives = [ select-alternatives $(property-set) ] ;
@@ -746,10 +738,8 @@
         }
         else
         {
- local result = [ $(best-alternatives).generate $(property-set) ] ;
-
- # Now return virtual targets for the only alternative
- return $(result) ;
+ # Now return virtual targets for the only alternative.
+ return [ $(best-alternatives).generate $(property-set) ] ;
         }
     }
 
@@ -760,13 +750,13 @@
         {
             $(a).rename $(new-name) ;
         }
-
     }
 }
 
-# Abstract target which refers to a source file.
-# This is artificial creature; it's usefull so that sources to
-# a target can be represented as list of abstract target instances.
+
+# Abstract target which refers to a source file. This is an artificial entity
+# allowing sources to a target to be represented using a list of abstract target
+# instances.
 class file-reference : abstract-target
 {
     import virtual-target ;
@@ -787,20 +777,19 @@
                                          : $(self.project) ] ;
     }
 
- # Returns true if the referred file really exists;
+ # Returns true if the referred file really exists.
     rule exists ( )
     {
         location ;
         return $(self.file-path) ;
     }
 
- # Returns the location of target. Needed by 'testing.jam'
+ # Returns the location of target. Needed by 'testing.jam'.
     rule location ( )
     {
         if ! $(self.file-location)
         {
             local source-location = [ $(self.project).get source-location ] ;
-
             for local src-dir in $(source-location)
             {
                 if ! $(self.file-location)
@@ -818,9 +807,10 @@
     }
 }
 
-# Given a target-reference, made in context of 'project',
-# returns the abstract-target instance that is referred to, as well
-# as properties explicitly specified for this reference.
+
+# Given a target-reference, made in context of 'project', returns the
+# abstract-target instance that is referred to, as well as properties explicitly
+# specified for this reference.
 rule resolve-reference ( target-reference : project )
 {
     # Separate target name from properties override
@@ -840,44 +830,42 @@
 }
 
 
-
-# Attempts to generate the target given by target reference, which
-# can refer both to a main target or to a file.
-# Returns a list consisting of
+# Attempts to generate the target given by target reference, which can refer
+# both to a main target or to a file. Returns a list consisting of
 # - usage requirements
 # - generated virtual targets, if any
-rule generate-from-reference
- ( target-reference # Target reference
- : project # Project where the reference is made
- : property-set # Properties of the main target that
- # makes the reference
- )
+rule generate-from-reference (
+ target-reference # Target reference.
+ : project # Project where the reference is made.
+ : property-set # Properties of the main target that makes the reference.
+)
 {
     local r = [ resolve-reference $(target-reference) : $(project) ] ;
     local target = $(r[1]) ;
     local sproperties = $(r[2]) ;
 
- # Take properties which should be propagated and refine them
- # with source-specific requirements.
+ # Take properties which should be propagated and refine them with
+ # source-specific requirements.
     local propagated = [ $(property-set).propagated ] ;
     local rproperties = [ $(propagated).refine $(sproperties) ] ;
     if $(rproperties[1]) = "@error"
     {
         errors.error
- "When building" [ full-name ] " with properties " $(properties) :
+ "When building" [ full-name ] " with properties " $(properties) :
             "Invalid properties specified for " $(source) ":"
- $(rproperties[2-]) ;
+ $(rproperties[2-]) ;
     }
     return [ $(target).generate $(rproperties) ] ;
 }
 
-# Given build request and requirements, return properties common to dependency
+
+# Given a build request and requirements, return properties common to dependency
 # build request and target build properties.
 rule common-properties ( build-request requirements )
 {
- # For optimization, we add free requirements directly,
- # without using complex algorithsm.
- # This gives the complex algorithm better chance of caching results.
+ # For optimization, we add free requirements directly, without using a
+ # complex algorithm. This gives the complex algorithm better chance of
+ # caching results.
     local free = [ $(requirements).free ] ;
     local non-free = [ property-set.create
         [ $(requirements).base ] [ $(requirements).incidental ] ] ;
@@ -890,24 +878,24 @@
     result = [ $($(key)).add-raw $(free) ] ;
 }
 
+
 # Given 'context' -- a set of already present properties, and 'requirements',
-# decide which extra properties should be applied to 'context'.
-# For conditional requirements, this means evaluating condition. For
-# indirect conditional requirements, this means calling a rule. Ordinary
-# requirements are always applied.
-#
-# Handles situation where evaluating one conditional requirements affects
-# condition of another conditional requirements, for example:
+# decide which extra properties should be applied to 'context'. For conditional
+# requirements, this means evaluating condition. For indirect conditional
+# requirements, this means calling a rule. Ordinary requirements are always
+# applied.
 #
+# Handles the situation where evaluating one conditional requirement affects
+# conditions of another conditional requirements, such as:
 # <toolset>gcc:<variant>release <variant>release:<define>RELEASE
 #
-# If 'what' is 'refined' returns context refined with new requirements.
-# If 'what' is 'added' returns just the requirements that must be applied.
+# If 'what' is 'refined' returns context refined with new requirements. If
+# 'what' is 'added' returns just the requirements to be applied.
 rule evaluate-requirements ( requirements : context : what )
 {
- # Apply non-conditional requirements.
- # It's possible that further conditional requirement change a value set by
- # non-conditional requirements. For example:
+ # Apply non-conditional requirements. It's possible that further conditional
+ # requirement change a value set by non-conditional requirements. For
+ # example:
     #
     # exe a : a.cpp : <threading>single <toolset>foo:<threading>multi ;
     #
@@ -923,17 +911,16 @@
     raw = [ property.refine $(raw) : $(unconditional) ] ;
 
     # We've collected properties that surely must be present in common
- # properties. We now try to figure out what other properties
- # should be added in order to satisfy rules (4)-(6) from the docs.
+ # properties. We now try to figure out what other properties should be added
+ # in order to satisfy rules (4)-(6) from the docs.
 
     local conditionals = [ $(requirements).conditional ] ;
- # The 'count' variable has one element for each conditional feature
- # and for each occurence of '<indirect-conditional>' feature.
- # It's used as a loop counter: for each iteration of the loop
- # before we remove one element and the property set should
- # stabilize before we've done. It's supposed to #conditionals iterations
- # should be enough for properties to propagate along conditions in any
- # direction.
+ # The 'count' variable has one element for each conditional feature and for
+ # each occurence of '<indirect-conditional>' feature. It's used as a loop
+ # counter: for each iteration of the loop before we remove one element and
+ # the property set should stabilize before we're done. It's assumed that
+ # #conditionals iterations should be enough for properties to propagate
+ # along conditions in any direction.
     local count = $(conditionals)
                   [ $(requirements).get <conditional> ]
                   and-once-more ;
@@ -943,19 +930,18 @@
     local current = $(raw) ;
 
     # It's assumed that ordinary conditional requirements can't add
- # <indirect-conditional> properties, and that rules referred
- # by <indirect-conditional> properties can't add new
- # <indirect-conditional> properties. So the list of indirect conditionals
- # does not change.
+ # <indirect-conditional> properties, and that rules referred by
+ # <indirect-conditional> properties can't add new <indirect-conditional>
+ # properties. So the list of indirect conditionals does not change.
     local indirect = [ $(requirements).get <conditional> ] ;
     indirect = [ MATCH @(.*) : $(indirect) ] ;
 
     local ok ;
     while $(count)
     {
- # Evaluate conditionals in context of current properties
+ # Evaluate conditionals in context of current properties.
         local e = [ property.evaluate-conditionals-in-context $(conditionals)
- : $(current) ] ;
+ : $(current) ] ;
 
         # Evaluate indirect conditionals.
         for local i in $(indirect)
@@ -971,10 +957,9 @@
         }
         else
         {
- # Oops, results of evaluation of conditionals has changed.
- # Also 'current' contains leftover from previous evaluation.
- # Recompute 'current' using initial properties and conditional
- # requirements.
+ # Oops, results of evaluation of conditionals has changed. Also
+ # 'current' contains leftover from previous evaluation. Recompute
+ # 'current' using initial properties and conditional requirements.
             added-requirements = $(e) ;
             current = [ property.refine $(raw) : [ feature.expand $(e) ] ] ;
         }
@@ -985,7 +970,6 @@
         errors.error "Can't evaluate conditional properties " $(conditionals) ;
     }
 
-
     if $(what) = added
     {
         return [ property-set.create $(unconditional) $(added-requirements) ] ;
@@ -1003,43 +987,42 @@
 
 rule common-properties2 ( build-request requirements )
 {
- # This guarantees that default properties are present
- # in result, unless they are overrided by some requirement.
- # FIXME: There is possibility that we've added <foo>bar, which is composite
- # and expands to <foo2>bar2, but default value of <foo2> is not bar2,
- # in which case it's not clear what to do.
+ # This guarantees that default properties are present in the result, unless
+ # they are overriden by some requirement. FIXME: There is possibility that
+ # we've added <foo>bar, which is composite and expands to <foo2>bar2, but
+ # default value of <foo2> is not bar2, in which case it's not clear what to
+ # do.
     #
     build-request = [ $(build-request).add-defaults ] ;
- # Featured added by 'add-default' can be composite and expand
- # to features without default values -- so they are not added yet.
- # It could be clearer/faster to expand only newly added properties
- # but that's not critical.
+ # Features added by 'add-default' can be composite and expand to features
+ # without default values -- so they are not added yet. It could be clearer/
+ # /faster to expand only newly added properties but that's not critical.
     build-request = [ $(build-request).expand ] ;
 
     return [ evaluate-requirements $(requirements)
       : $(build-request) : refined ] ;
 }
 
+
 # Implements the most standard way of constructing main target alternative from
 # sources. Allows sources to be either file or other main target and handles
 # generation of those dependency targets.
 class basic-target : abstract-target
 {
     import build-request ;
- import virtual-target ;
- import targets ;
- import property-set ;
- import set ;
- import sequence ;
- import errors ;
+ import build-system ;
     import "class" : new ;
- import property ;
+ import errors ;
     import feature ;
- import build-system ;
+ import property ;
+ import property-set ;
+ import sequence ;
+ import set ;
+ import targets ;
+ import virtual-target ;
 
- rule __init__ ( name : project
- : sources * : requirements * :
- default-build * : usage-requirements * )
+ rule __init__ ( name : project : sources * : requirements *
+ : default-build * : usage-requirements * )
     {
         abstract-target.__init__ $(name) : $(project) ;
 
@@ -1065,10 +1048,9 @@
         }
     }
 
- # Returns the list of abstract-targets which are used as sources.
- # The extra properties specified for sources are not represented.
- # The only user of this rule at the moment is the "--dump-tests"
- # feature of the test system.
+ # Returns the list of abstract-targets which are used as sources. The extra
+ # properties specified for sources are not represented. The only user for
+ # this rule at the moment is the "--dump-tests" feature of the test system.
     rule sources ( )
     {
         if ! $(self.source-targets) {
@@ -1091,18 +1073,18 @@
         return $(self.default-build) ;
     }
 
- # Returns the alternative condition for this alternative, if
- # the condition is satisfied by 'property-set'.
+ # Returns the alternative condition for this alternative, if the condition
+ # is satisfied by 'property-set'.
     rule match ( property-set debug ? )
     {
- # The condition is composed of all base non-conditional properties.
- # It's not clear if we should expand 'self.requirements' or not.
- # For one thing, it would be nice to be able to put
+ # The condition is composed of all base non-conditional properties. It's
+ # not clear if we should expand 'self.requirements' or not. For one
+ # thing, it would be nice to be able to put
         # <toolset>msvc-6.0
         # in requirements.
- # On the other hand, if we have <variant>release in condition it
- # does not make sense to require <optimization>full to be in
- # build request just to select this variant.
+ # On the other hand, if we have <variant>release in condition it does
+ # not make sense to require <optimization>full to be in build request
+ # just to select this variant.
         local bcondition = [ $(self.requirements).base ] ;
         local ccondition = [ $(self.requirements).conditional ] ;
         local condition = [ set.difference $(bcondition) : $(ccondition) ] ;
@@ -1129,12 +1111,11 @@
         }
     }
 
- # Takes a target reference, which might be either target id
- # or a dependency property, and generates that target using
- # 'property-set' as build request.
+ # Takes a target reference, which might be either target id or a dependency
+ # property, and generates that target using 'property-set' as build request.
     #
- # The results are added to to variable called 'result-var'.
- # Usage requirements are added variable called 'usage-requirements-var'.
+ # The results are added to the variable called 'result-var'. Usage
+ # requirements are added to the variable called 'usage-requirements-var'.
     rule generate-dependencies ( dependencies * : property-set
         : result-var usage-requirements-var )
     {
@@ -1144,7 +1125,7 @@
             local id = $(dependency:G=) ;
 
             local result =
- [ targets.generate-from-reference $(id) : $(self.project)
+ [ targets.generate-from-reference $(id) : $(self.project)
                 : $(property-set) ] ;
 
             $(result-var) += $(result[2-]:G=$(grist)) ;
@@ -1152,10 +1133,8 @@
         }
     }
 
-
- # Determines final build properties, generates sources,
- # and calls 'construct'. This method should not be
- # overridden.
+ # Determines final build properties, generates sources, and calls
+ # 'construct'. This method should not be overridden.
     rule generate ( property-set )
     {
         if [ modules.peek : .debug-building ]
@@ -1166,21 +1145,19 @@
             targets.increase-indent ;
             ECHO [ targets.indent ] "Build request: " [ $(property-set).raw ] ;
             local cf = [ build-system.command-line-free-features ] ;
- ECHO [ targets.indent ] "Command line free features: "
- [ $(cf).raw ] ;
+ ECHO [ targets.indent ] "Command line free features: " [ $(cf).raw ] ;
             ECHO [ targets.indent ] "Target requirements: " [ $(self.requirements).raw ] ;
         }
 
         if ! $(self.generated.$(property-set))
         {
- # Apply free features form the command line. If user
- # said
+ # Apply free features form the command line. If user said
             # define=FOO
- # he most likely want this define to be set for all compiles.
+ # he most likely wants this define to be set for all compiles.
             property-set = [ $(property-set).refine
- [ build-system.command-line-free-features ] ] ;
+ [ build-system.command-line-free-features ] ] ;
             local rproperties = [ targets.common-properties $(property-set)
- $(self.requirements) ] ;
+ $(self.requirements) ] ;
 
             if [ modules.peek : .debug-building ]
             {
@@ -1195,34 +1172,33 @@
                 local usage-requirements ;
 
                 generate-dependencies [ $(rproperties).dependency ]
- : $(rproperties)
- : properties usage-requirements ;
+ : $(rproperties)
+ : properties usage-requirements ;
 
                 generate-dependencies $(self.sources) : $(rproperties)
- : source-targets usage-requirements ;
+ : source-targets usage-requirements ;
 
                 if [ modules.peek : .debug-building ]
                 {
                     ECHO ;
                     ECHO [ targets.indent ]
- "Usage requirements for $(self.name) are " $(usage-requirements) ;
+ "Usage requirements for $(self.name) are " $(usage-requirements) ;
                 }
 
                 rproperties = [ property-set.create $(properties)
- $(usage-requirements) ] ;
+ $(usage-requirements) ] ;
                 usage-requirements = [ property-set.create $(usage-requirements) ] ;
 
                 if [ modules.peek : .debug-building ]
                 {
                     ECHO [ targets.indent ]
- "Build properties: " [ $(rproperties).raw ] ;
+ "Build properties: " [ $(rproperties).raw ] ;
                 }
 
                 local extra = [ $(rproperties).get <source> ] ;
                 source-targets += $(extra:G=) ;
- # We might get duplicate sources, for example if
- # we link to two library which have the same <library> in
- # usage requirements.
+ # We might get duplicate sources, for example if we link to two
+ # libraries having the same <library> usage requirement.
                 source-targets = [ sequence.unique $(source-targets) ] ;
 
                 local result =
@@ -1234,11 +1210,10 @@
                     local gur = $(result[1]) ;
                     result = $(result[2-]) ;
 
- local s = [ create-subvariant
- $(result) :
- [ virtual-target.recent-targets ]
- : $(property-set) : $(source-targets)
- : $(rproperties) : $(usage-requirements) ] ;
+ local s = [ create-subvariant $(result)
+ : [ virtual-target.recent-targets ]
+ : $(property-set) : $(source-targets)
+ : $(rproperties) : $(usage-requirements) ] ;
                     virtual-target.clear-recent-targets ;
 
                     local ur = [ compute-usage-requirements $(s) ] ;
@@ -1259,12 +1234,12 @@
                 if $(rproperties[1]) = "@error"
                 {
                     ECHO [ targets.indent ]
- "Skipping build of: " [ full-name ] " cannot compute common properties" ;
+ "Skipping build of: " [ full-name ] " cannot compute common properties" ;
                 }
                 else if [ $(rproperties).get <build> ] = no
                 {
                     ECHO [ targets.indent ]
- "Skipping build of: " [ full-name ] " <build>no in common properties" ;
+ "Skipping build of: " [ full-name ] " <build>no in common properties" ;
                 }
                 else
                 {
@@ -1290,19 +1265,16 @@
         return $(self.generated.$(property-set)) ;
     }
 
- # Given the set of generated targets, and refined build
- # properties, determines and sets appripriate usage requirements
- # on those targets.
+ # Given the set of generated targets, and refined build properties,
+ # determines and sets appripriate usage requirements on those targets.
     rule compute-usage-requirements ( subvariant )
     {
         local rproperties = [ $(subvariant).build-properties ] ;
         xusage-requirements = [ targets.evaluate-requirements
- $(self.usage-requirements)
- : $(rproperties)
- : added ] ;
+ $(self.usage-requirements) : $(rproperties) : added ] ;
 
- # We generate all dependency properties and add them,
- # as well as their usage requirements, to result.
+ # We generate all dependency properties and add them, as well as their
+ # usage requirements, to the result.
         local extra ;
         generate-dependencies [ $(xusage-requirements).dependency ] :
             $(rproperties) : extra extra ;
@@ -1310,11 +1282,11 @@
         local result = [ property-set.create
             [ $(xusage-requirements).non-dependency ] $(extra) ] ;
 
- # Propagate usage requirements we've got from sources, except
- # for the <pch-header> and <pch-file> features.
+ # Propagate usage requirements we've got from sources, except for the
+ # <pch-header> and <pch-file> features.
         #
- # That feature specifies which pch file to use, and should apply
- # only to direct dependents. Consider:
+ # That feature specifies which pch file to use, and should apply only to
+ # direct dependents. Consider:
         #
         # pch pch1 : ...
         # lib lib1 : ..... pch1 ;
@@ -1323,27 +1295,22 @@
         #
         # Here, lib2 should not get <pch-header> property from pch1.
         #
- # Essentially, when those two features are in usage requirements,
- # they are propagated only to direct dependents. We might need
- # a more general mechanism, but for now, only those two
- # features are special.
+ # Essentially, when those two features are in usage requirements, they
+ # are propagated only to direct dependents. We might need a more general
+ # mechanism, but for now, only those two features are special.
         local raw = [ $(subvariant).sources-usage-requirements ] ;
         raw = [ $(raw).raw ] ;
         raw = [ property.change $(raw) : <pch-header> ] ;
         raw = [ property.change $(raw) : <pch-file> ] ;
- result = [ $(result).add [ property-set.create $(raw) ] ] ;
-
- return $(result) ;
+ return [ $(result).add [ property-set.create $(raw) ] ] ;
     }
 
- # Creates a new subvariant-dg instances for 'targets'
- # - 'root-targets' the virtual targets will be returned to dependents
- # - 'all-targets' all virtual
- # targets created while building this main target
- # - 'build-request' is property-set instance with requested build properties
+ # Creates new subvariant instances for 'targets'.
+ # 'root-targets' - virtual targets to be returned to dependants
+ # 'all-targets' - virtual targets created while building this main target
+ # 'build-request' - property-set instance with requested build properties
     local rule create-subvariant ( root-targets *
- : all-targets * : build-request : sources * :
- rproperties
+ : all-targets * : build-request : sources * : rproperties
         : usage-requirements )
     {
         for local e in $(root-targets)
@@ -1351,10 +1318,10 @@
             $(e).root true ;
         }
 
- # Process all vtargets that will be created if this main target
+ # Process all virtual targets that will be created if this main target
         # is created.
         local s = [ new subvariant $(__name__) : $(build-request) : $(sources)
- : $(rproperties) : $(usage-requirements) : $(all-targets) ] ;
+ : $(rproperties) : $(usage-requirements) : $(all-targets) ] ;
         for local v in $(all-targets)
         {
             if ! [ $(v).creating-subvariant ]
@@ -1365,9 +1332,9 @@
         return $(s) ;
     }
 
- # Constructs the virtual targets for this abstract targets and
- # the dependecy graph. Returns the list of virtual targets.
- # Should be overrided in derived classes.
+ # Constructs virtual targets for this abstract target and the dependency
+ # graph. Returns the list of virtual targets. Should be overriden in derived
+ # classes.
     rule construct ( name : source-targets * : properties * )
     {
         errors.error "method should be defined in derived classes" ;
@@ -1379,11 +1346,11 @@
 {
     import generators ;
 
- rule __init__ ( name : project : type
- : sources * : requirements * : default-build * : usage-requirements * )
+ rule __init__ ( name : project : type : sources * : requirements *
+ : default-build * : usage-requirements * )
     {
- basic-target.__init__ $(name) : $(project)
- : $(sources) : $(requirements) : $(default-build) : $(usage-requirements) ;
+ basic-target.__init__ $(name) : $(project) : $(sources)
+ : $(requirements) : $(default-build) : $(usage-requirements) ;
 
         self.type = $(type) ;
     }
@@ -1404,8 +1371,8 @@
             ECHO "warn: Unable to construct" [ full-name ] ;
 
             # Are there any top-level generators for this type/property set.
- if ! [ generators.find-viable-generators
- $(self.type) : $(property-set) ]
+ if ! [ generators.find-viable-generators $(self.type)
+ : $(property-set) ]
             {
                 ECHO "error: no generators were found for type '$(self.type)'" ;
                 ECHO "error: and the requested properties" ;
@@ -1415,7 +1382,6 @@
                 EXIT ;
             }
         }
-
         return $(r) ;
     }
 }
@@ -1425,7 +1391,7 @@
 # 'sources'. If there are any objects in 'sources', they are treated as main
 # target instances, and the name of such targets are adjusted to be
 # '<name_of_this_target>__<name_of_source_target>'. Such renaming is disabled if
-# a non-empty value is passed for 'no-renaming' parameter.
+# a non-empty value is passed as the 'no-renaming' parameter.
 #
 rule main-target-sources ( sources * : main-target-name : no-renaming ? )
 {
@@ -1454,13 +1420,12 @@
 }
 
 
-# Returns the requirement to use when declaring a main target, which are
-# obtained by
-# - translating all specified property paths, and
-# - refining project requirements with the one specified for the target
+# Returns the requirements to use when declaring a main target, obtained by
+# translating all specified property paths and refining project requirements
+# with the ones specified for the target.
 rule main-target-requirements (
- specification * # Properties explicitly specified for a main target
- : project # Project where the main target is to be declared
+ specification * # Properties explicitly specified for the main target.
+ : project # Project where the main target is to be declared.
 )
 {
     specification += [ toolset.requirements ] ;
@@ -1468,7 +1433,6 @@
     local requirements = [ property-set.refine-from-user-input
         [ $(project).get requirements ] : $(specification) :
         [ $(project).project-module ] : [ $(project).get location ] ] ;
-
     if $(requirements[1]) = "@error"
     {
         errors.error "Conflicting requirements for target:" $(requirements) ;
@@ -1477,25 +1441,23 @@
 }
 
 
-# Returns the use requirement to use when declaring a main target, which are
-# obtained by
-# - translating all specified property paths, and
-# - adding project's usage requirements
+# Returns the usage requirements to use when declaring a main target, which are
+# obtained by translating all specified property paths and adding project's
+# usage requirements.
 rule main-target-usage-requirements (
- specification * # Use-properties explicitly specified for a main target
- : project # Project where the main target is to be declared
+ specification * # Use-properties explicitly specified for a main target.
+ : project # Project where the main target is to be declared.
 )
 {
- local loc = [ $(project).get location ] ;
     local project-usage-requirements = [ $(project).get usage-requirements ] ;
 
- # We don't use 'refine-from-user-input' because I'm not sure if:
- # - removing of parent's usage requirements makes sense
+ # We don't use 'refine-from-user-input' because:
+ # - I'm not sure if removing of parent's usage requirements makes sense
     # - refining of usage requirements is not needed, since usage requirements
     # are always free.
     local usage-requirements = [ property-set.create-from-user-input
         $(specification)
- : [ $(project).project-module ] [ $(project).get location ] ] ;
+ : [ $(project).project-module ] [ $(project).get location ] ] ;
 
     return [ $(project-usage-requirements).add $(usage-requirements) ] ;
 }
@@ -1505,9 +1467,9 @@
 # obtained by using the specified value if not empty and parent's default build
 # attribute otherwise.
 rule main-target-default-build (
- specification * # Default build explicitly specified for a main target
- : project # Project where the main target is to be declared
- )
+ specification * # Default build explicitly specified for a main target.
+ : project # Project where the main target is to be declared.
+)
 {
     local result ;
     if $(specification)
@@ -1522,8 +1484,7 @@
 }
 
 
-# Registers the specified target as a main target alternatives.
-# Returns 'target'.
+# Registers the specified target as a main target alternative and returns it.
 rule main-target-alternative ( target )
 {
     local ptarget = [ $(target).project ] ;
@@ -1535,17 +1496,15 @@
 # Creates a typed-target with the specified properties. The 'name', 'sources',
 # 'requirements', 'default-build' and 'usage-requirements' are assumed to be in
 # the form specified by the user in Jamfile corresponding to 'project'.
-rule create-typed-target ( type : project :
- name : sources * : requirements * : default-build *
- : usage-requirements * )
+rule create-typed-target ( type : project : name : sources * : requirements *
+ : default-build * : usage-requirements * )
 {
     return [
- targets.main-target-alternative
- [ new typed-target $(name) : $(project) : $(type)
- : [ targets.main-target-sources $(sources) : $(name) ]
- : [ targets.main-target-requirements $(requirements) : $(project) ]
- : [ targets.main-target-default-build $(default-build) : $(project) ]
- : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
- ] ] ;
-
+ targets.main-target-alternative
+ [ new typed-target $(name) : $(project) : $(type)
+ : [ targets.main-target-sources $(sources) : $(name) ]
+ : [ targets.main-target-requirements $(requirements) : $(project) ]
+ : [ targets.main-target-default-build $(default-build) : $(project) ]
+ : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
+ ] ] ;
 }

Modified: trunk/tools/build/v2/build/type.jam
==============================================================================
--- trunk/tools/build/v2/build/type.jam (original)
+++ trunk/tools/build/v2/build/type.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -6,16 +6,16 @@
 # Deals with target type declaration and defines target class which supports
 # typed targets.
 
-import feature ;
-import generators : * ;
 import "class" : new ;
 import errors ;
+import feature ;
+import generators : * ;
+import project ;
 import property ;
 import scanner ;
-import project ;
 
-# This creates a circular dependency
-# project-test1 -> project -> project-root -> builtin -> type -> targets -> project
+# The follwing import would create a circular dependency:
+# project -> project-root -> builtin -> type -> targets -> project
 # import targets ;
 
 # The feature is optional so it would never get added implicitly. It's used only
@@ -25,6 +25,7 @@
 feature.feature main-target-type : : optional incidental ;
 feature.feature base-target-type : : composite optional free ;
 
+
 # Registers a target type, possible derived from a 'base-type'. Providing a list
 # of 'suffixes' here is a shortcut for separately calling the register-suffixes
 # rule with the given suffixes and the set-generated-target-suffix rule with the
@@ -51,7 +52,7 @@
 
         if $(suffixes)-is-not-empty
         {
- # Specify mapping from suffixes to type
+ # Specify mapping from suffixes to type.
             register-suffixes $(suffixes) : $(type) ;
             # Generated targets of 'type' will use the first of 'suffixes'. This
             # may be overriden.
@@ -82,7 +83,7 @@
 # of that type.
 rule type-to-rule-name ( type )
 {
- # Lowercase everything. Convert underscores to dashes.ame.
+ # Lowercase everything. Convert underscores to dashes.
     import regex ;
     local n = [ regex.split $(type:L) "_" ] ;
     return $(n:J=-) ;
@@ -110,7 +111,7 @@
         else if $(.type.$(s)) != type
         {
             errors.error Attempting to specify multiple types for suffix \"$(s)\"
- : "Old type $(.type.$(s)), New type $(type)" ;
+ : "Old type $(.type.$(s)), New type $(type)" ;
         }
     }
 }
@@ -150,13 +151,15 @@
 # Returns a scanner instance appropriate to 'type' and 'properties'.
 rule get-scanner ( type : property-set )
 {
- if $(.scanner.$(type)) {
+ if $(.scanner.$(type))
+ {
         return [ scanner.get $(.scanner.$(type)) : $(property-set) ] ;
     }
 }
 
 
-# returns type and all of its bases in order of their distance from type.
+# Returns the given type and all of its base types in order of their distance
+# from type.
 rule all-bases ( type )
 {
     local result = $(type) ;
@@ -204,10 +207,10 @@
 }
 
 
-# Store suffixes for generated targets
+# Store suffixes for generated targets.
 .suffixes = [ new property-map ] ;
 
-# Store prefixes for generated targets (e.g. "lib" for library)
+# Store prefixes for generated targets (e.g. "lib" for library).
 .prefixes = [ new property-map ] ;
 
 
@@ -272,7 +275,7 @@
 }
 
 
-# Common rules for prefix/suffix provisioning follow
+# Common rules for prefix/suffix provisioning follow.
 
 local rule set-generated-target-ps ( ps : type : properties * : psval )
 {
@@ -359,22 +362,22 @@
 
 
 # Rule used to construct all main targets. Note that this rule gets imported
-# into the global namespace under different names and exactly what type of
-# target it is supposed to construct is read from the name of the rule actually
-# used to invoke it.
+# into the global namespace under different alias names and exactly what type of
+# target it is supposed to construct is read from the name of the alias rule
+# actually used to invoke it.
 rule main-target-rule ( name : sources * : requirements * : default-build *
- : usage-requirements * )
+ : usage-requirements * )
 {
- # First find the required target type, which is equal to the rule name used
- # to invoke us.
+ # First discover the required target type, which is equal to the rule name
+ # used to invoke us.
     local bt = [ BACKTRACE 1 ] ;
     local rulename = $(bt[4]) ;
 
     local project = [ project.current ] ;
 
- # This is a circular module dependency, so it must be imported here
+ # This is a circular module dependency so it must be imported here.
     import targets ;
     return [ targets.create-typed-target $(.main-target-type.$(rulename))
- : $(project) : $(name) : $(sources) : $(requirements)
- : $(default-build) : $(usage-requirements) ] ;
+ : $(project) : $(name) : $(sources) : $(requirements)
+ : $(default-build) : $(usage-requirements) ] ;
 }

Modified: trunk/tools/build/v2/tools/builtin.jam
==============================================================================
--- trunk/tools/build/v2/tools/builtin.jam (original)
+++ trunk/tools/build/v2/tools/builtin.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,45 +1,46 @@
-# Copyright 2002, 2003, 2004, 2005 Dave Abrahams
-# Copyright 2002, 2005, 2006, 2007 Rene Rivera
-# Copyright 2006 Juergen Hunold
-# Copyright 2005 Toon Knapen
-# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2002, 2003, 2004, 2005 Dave Abrahams
+# Copyright 2002, 2005, 2006, 2007 Rene Rivera
+# Copyright 2006 Juergen Hunold
+# Copyright 2005 Toon Knapen
+# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
 # Defines standard features and rules.
 
+import alias ;
 import "class" : new ;
-
 import feature : feature compose ;
 import toolset : flags ;
 import errors : error ;
-import type ;
-import scanner ;
+import generate ;
 import generators ;
-import regex ;
-import virtual-target ;
 import os ;
-import symlink ;
-import alias ;
-import property ;
 import print ;
-import utility ;
 import project ;
-import generate ;
+import property ;
+import regex ;
+import scanner ;
+import symlink ;
+import type ;
+import utility ;
+import virtual-target ;
+import types/register ;
+
+
+.os-names = amiga aix bsd cygwin darwin dos emx freebsd hpux linux netbsd
+ openbsd osf qnx qnxnto sgi solaris sun sunos svr4 sysv ultrix unix unixware
+ vms windows ;
+
 
-# This feature is used to determine which OS we're on.
-# In future, this may become <target-os> and <host-os>
-# The future is now...
+# Feature used to determine which OS we're on. New <target-os> and <host-os>
+# features should be used instead.
 local os = [ modules.peek : OS ] ;
-feature os : $(os) : propagated link-incompatible ;
+feature.feature os : $(os) : propagated link-incompatible ;
 
-.os-names = amiga aix bsd cygwin darwin dos emx freebsd hpux
- linux netbsd openbsd osf qnx qnxnto sgi solaris sun sunos
- svr4 sysv ultrix unix unixware vms windows ;
-
-# Translates from bjam current OS to the os tags used
-# in host-os and target-os. I.e. it returns the
-# running host-os.
+
+# Translates from bjam current OS to the os tags used in host-os and target-os,
+# i.e. returns the running host-os.
 local rule default-host-os ( )
 {
     local host-os ;
@@ -51,238 +52,230 @@
     {
         switch [ os.name ]
         {
- case NT : host-os = windows ;
- case AS400 : host-os = unix ;
- case MINGW : host-os = windows ;
- case BSDI : host-os = bsd ;
- case COHERENT : host-os = unix ;
- case DRAGONFLYBSD : host-os = bsd ;
- case IRIX : host-os = sgi ;
- case MACOSX : host-os = darwin ;
- case KFREEBSD : host-os = freebsd ;
- case LINUX : host-os = linux ;
- case * : host-os = unix ;
+ case NT : host-os = windows ;
+ case AS400 : host-os = unix ;
+ case MINGW : host-os = windows ;
+ case BSDI : host-os = bsd ;
+ case COHERENT : host-os = unix ;
+ case DRAGONFLYBSD : host-os = bsd ;
+ case IRIX : host-os = sgi ;
+ case MACOSX : host-os = darwin ;
+ case KFREEBSD : host-os = freebsd ;
+ case LINUX : host-os = linux ;
+ case * : host-os = unix ;
         }
     }
     return $(host-os:L) ;
 }
 
-# The two OS features define a known set of abstract OS
-# names. The host-os is the OS under which bjam is running.
-# Even though this should really be a fixed property we need
-# to list all the values to prevent unkown value errors.
-# Both set the default value to the current OS to account for
-# the default use case of building on the target OS.
-feature host-os : $(.os-names) ;
+
+# The two OS features define a known set of abstract OS names. The host-os is
+# the OS under which bjam is running. Even though this should really be a fixed
+# property we need to list all the values to prevent unknown value errors. Both
+# set the default value to the current OS to account for the default use case of
+# building on the target OS.
+feature.feature host-os : $(.os-names) ;
 feature.set-default host-os : [ default-host-os ] ;
 
-feature target-os
- : $(.os-names)
- : propagated link-incompatible ;
+feature.feature target-os : $(.os-names) : propagated link-incompatible ;
 feature.set-default target-os : [ default-host-os ] ;
 
 
-feature toolset : : implicit propagated symmetric ;
-
-feature stdlib : native : propagated composite ;
-
-feature link : shared static : propagated ;
-feature runtime-link : shared static : propagated ;
-feature runtime-debugging : on off : propagated ;
-
-
-feature optimization : off speed space : propagated ;
-feature profiling : off on : propagated ;
-feature inlining : off on full : propagated ;
-
-feature threading : single multi : propagated ;
-feature rtti : on off : propagated ;
-feature exception-handling : on off : propagated ;
-# Whether there is support for asynchronous EH (e.g. catching SEGVs)
-feature asynch-exceptions : off on : propagated ;
-# Whether all extern "C" functions are considered nothrow by default
-feature extern-c-nothrow : off on : propagated ;
-feature debug-symbols : on off : propagated ;
-feature define : : free ;
-feature undef : : free ;
-feature "include" : : free path ; #order-sensitive ;
-feature cflags : : free ;
-feature cxxflags : : free ;
-feature fflags : : free ;
-feature asmflags : : free ;
-feature linkflags : : free ;
-feature archiveflags : : free ;
-feature version : : free ;
-
-# Generic, i.e. non-lanugage specific, flags for tools.
-feature flags : : free ;
+feature.feature toolset : : implicit propagated symmetric ;
+feature.feature stdlib : native : propagated composite ;
+feature.feature link : shared static : propagated ;
+feature.feature runtime-link : shared static : propagated ;
+feature.feature runtime-debugging : on off : propagated ;
+feature.feature optimization : off speed space : propagated ;
+feature.feature profiling : off on : propagated ;
+feature.feature inlining : off on full : propagated ;
+feature.feature threading : single multi : propagated ;
+feature.feature rtti : on off : propagated ;
+feature.feature exception-handling : on off : propagated ;
+
+# Whether there is support for asynchronous EH (e.g. catching SEGVs).
+feature.feature asynch-exceptions : off on : propagated ;
+
+# Whether all extern "C" functions are considered nothrow by default.
+feature.feature extern-c-nothrow : off on : propagated ;
+
+feature.feature debug-symbols : on off : propagated ;
+feature.feature define : : free ;
+feature.feature undef : : free ;
+feature.feature "include" : : free path ; #order-sensitive ;
+feature.feature cflags : : free ;
+feature.feature cxxflags : : free ;
+feature.feature fflags : : free ;
+feature.feature asmflags : : free ;
+feature.feature linkflags : : free ;
+feature.feature archiveflags : : free ;
+feature.feature version : : free ;
 
+# Generic, i.e. non-language specific, flags for tools.
+feature.feature flags : : free ;
 feature.feature location-prefix : : free ;
 
 
-# The following features are incidental, since
-# in themself they have no effect on build products.
-# Not making them incidental will result in problems in corner
-# cases, for example:
-#
+# The following features are incidental since they have no effect on built
+# products. Not making them incidental will result in problems in corner cases,
+# e.g.:
+#
 # unit-test a : a.cpp : <use>b ;
 # lib b : a.cpp b ;
-#
-# Here, if <use> is not incidental, we'll decide we have two
-# targets for a.obj with different properties, and will complain.
 #
-# Note that making feature incidental does not mean it's ignored. It may
-# be ignored when creating the virtual target, but the rest of build process
-# will use them.
-feature use : : free dependency incidental ;
-feature dependency : : free dependency incidental ;
-feature implicit-dependency : : free dependency incidental ;
-
-feature warnings :
- on # enable default/"reasonable" warning level for the tool
- all # enable all possible warnings issued by the tool
- off # disable all warnings issued by the tool
+# Here, if <use> is not incidental, we'll decide we have two targets for a.obj
+# with different properties, and will complain.
+#
+# Note that making feature incidental does not mean it's ignored. It may be
+# ignored when creating the virtual target, but the rest of build process will
+# use them.
+feature.feature use : : free dependency incidental ;
+feature.feature dependency : : free dependency incidental ;
+feature.feature implicit-dependency : : free dependency incidental ;
+
+feature.feature warnings :
+ on # Enable default/"reasonable" warning level for the tool.
+ all # Enable all possible warnings issued by the tool.
+ off # Disable all warnings issued by the tool.
   : incidental propagated ;
 
-feature warnings-as-errors :
- off # do not fail the compilation if there are warnings
- on # fail the compilation if there are warnings
+feature.feature warnings-as-errors :
+ off # Do not fail the compilation if there are warnings.
+ on # Fail the compilation if there are warnings.
   : incidental propagated ;
 
-feature source : : free dependency incidental ;
-feature library : : free dependency incidental ;
-feature file : : free dependency incidental ;
-feature find-shared-library : : free ; #order-sensitive ;
-feature find-static-library : : free ; #order-sensitive ;
-feature library-path : : free path ; #order-sensitive ;
-# Internal feature.
-feature library-file : : free dependency ;
+feature.feature source : : free dependency incidental ;
+feature.feature library : : free dependency incidental ;
+feature.feature file : : free dependency incidental ;
+feature.feature find-shared-library : : free ; #order-sensitive ;
+feature.feature find-static-library : : free ; #order-sensitive ;
+feature.feature library-path : : free path ; #order-sensitive ;
 
-feature name : : free ;
-feature tag : : free ;
-feature search : : free path ; #order-sensitive ;
-feature location : : free path ;
+# Internal feature.
+feature.feature library-file : : free dependency ;
 
-feature dll-path : : free path ;
-feature hardcode-dll-paths : true false : incidental ;
+feature.feature name : : free ;
+feature.feature tag : : free ;
+feature.feature search : : free path ; #order-sensitive ;
+feature.feature location : : free path ;
+feature.feature dll-path : : free path ;
+feature.feature hardcode-dll-paths : true false : incidental ;
 
 
-# An internal feature that holds the paths of all dependency
-# dynamic libraries. On Windows, it's needed so that we can all
-# those paths to PATH when running applications.
-# On Linux, it's needed to add proper -rpath-link command line options.
-feature xdll-path : : free path ;
+# An internal feature that holds the paths of all dependency shared libraries.
+# On Windows, it's needed so that we can add all those paths to PATH when
+# running applications. On Linux, it's needed to add proper -rpath-link command
+# line options.
+feature.feature xdll-path : : free path ;
 
-#provides means to specify def-file for windows dlls.
-feature def-file : : free dependency ;
+# Provides means to specify def-file for windows DLLs.
+feature.feature def-file : : free dependency ;
 
-feature.feature suppress-import-lib : false true : incidental ;
+feature.feature suppress-import-lib : false true : incidental ;
 
-# This is internal feature which is used to store the name of
-# bjam action to call when building a target.
+# Internal feature used to store the name of a bjam action to call when building
+# a target.
 feature.feature action : : free ;
 
-# This feature is used to allow specific generators to run.
-# For example, QT tools can only be invoked when QT library
-# is used. In that case, <allow>qt will be in usage requirement
-# of the library.
-feature allow : : free ;
-
-# The addressing model to generate code for.
-# Currently a limited set only specifying the bit size of pointers.
-feature address-model : 16 32 64
- : propagated optional ;
+# This feature is used to allow specific generators to run. For example, QT
+# tools can only be invoked when QT library is used. In that case, <allow>qt
+# will be in usage requirement of the library.
+feature.feature allow : : free ;
+
+# The addressing model to generate code for. Currently a limited set only
+# specifying the bit size of pointers.
+feature.feature address-model : 16 32 64 : propagated optional ;
 
 # Type of CPU architecture to compile for.
-feature architecture :
+feature.feature architecture :
     # x86 and x86-64
     x86
+
     # ia64
     ia64
+
     # Sparc
     sparc
+
     # RS/6000 & PowerPC
     power
+
     # MIPS/SGI
     mips1 mips2 mips3 mips4 mips32 mips32r2 mips64
+
     # HP/PA-RISC
     parisc
- # Combined architectures for platforms/toolsets that support
- # building for multiple architectures at once. "combined"
- # would be the default multi-arch for the toolset.
- combined
- combined-x86-power
- #
+
+ # Combined architectures for platforms/toolsets that support building for
+ # multiple architectures at once. "combined" would be the default multi-arch
+ # for the toolset.
+ combined
+ combined-x86-power
+
     : propagated optional ;
 
 # The specific instruction set in an architecture to compile.
-feature instruction-set :
+feature.feature instruction-set :
     # x86 and x86-64
- i386 i486 i586 i686
- pentium pentium-mmx pentiumpro pentium2 pentium3 pentium3m pentium-m pentium4 pentium4m
- prescott nocona
- conroe conroe-xe conroe-l allendale mermon mermon-xe kentsfield kentsfield-xe
- penryn wolfdale yorksfield nehalem
- k6 k6-2 k6-3 athlon athlon-tbird athlon-4 athlon-xp athlon-mp
- k8 opteron athlon64 athlon-fx
- winchip-c6 winchip2
- c3 c3-2
+ i386 i486 i586 i686 pentium pentium-mmx pentiumpro pentium2 pentium3
+ pentium3m pentium-m pentium4 pentium4m prescott nocona conroe conroe-xe
+ conroe-l allendale mermon mermon-xe kentsfield kentsfield-xe penryn wolfdale
+ yorksfield nehalem k6 k6-2 k6-3 athlon athlon-tbird athlon-4 athlon-xp
+ athlon-mp k8 opteron athlon64 athlon-fx winchip-c6 winchip2 c3 c3-2
+
     # ia64
     itanium itanium1 merced itanium2 mckinley
+
     # Sparc
- v7 cypress v8 supersparc sparclite hypersparc sparclite86x
- f930 f934 sparclet tsc701 v9 ultrasparc ultrasparc3
+ v7 cypress v8 supersparc sparclite hypersparc sparclite86x f930 f934
+ sparclet tsc701 v9 ultrasparc ultrasparc3
+
     # RS/6000 & PowerPC
- 401 403 405 405fp 440 440fp 505
- 601 602 603 603e 604 604e 620 630 740 7400 7450 750
- 801 821 823 860 970 8540
- power-common ec603e g3 g4 g5
- power power2 power3 power4 power5 powerpc powerpc64
- rios rios1 rsc rios2 rs64a
+ 401 403 405 405fp 440 440fp 505 601 602 603 603e 604 604e 620 630 740 7400
+ 7450 750 801 821 823 860 970 8540 power-common ec603e g3 g4 g5 power power2
+ power3 power4 power5 powerpc powerpc64 rios rios1 rsc rios2 rs64a
+
     # MIPS
- 4kc 4kp 5kc 20kc m4k
- r2000 r3000 r3900 r4000 r4100 r4300 r4400 r4600 r4650 r6000 r8000
- rm7000 rm9000 orion sb1
- vr4100 vr4111 vr4120 vr4130 vr4300 vr5000 vr5400 vr5500
+ 4kc 4kp 5kc 20kc m4k r2000 r3000 r3900 r4000 r4100 r4300 r4400 r4600 r4650
+ r6000 r8000 rm7000 rm9000 orion sb1 vr4100 vr4111 vr4120 vr4130 vr4300
+ vr5000 vr5400 vr5500
+
     # HP/PA-RISC
     700 7100 7100lc 7200 7300 8000
- #
+
     : propagated optional ;
-
-
-# Used to select specific variant of C++ ABI is the compiler
-# supports several.
-feature c++abi : : propagated optional ;
-
-
-feature conditional : : incidental free ;
+
+# Used to select a specific variant of C++ ABI if the compiler supports several.
+feature.feature c++abi : : propagated optional ;
+
+feature.feature conditional : : incidental free ;
 
 # The value of 'no' prevents building of a target.
-feature build : yes no : optional ;
+feature.feature build : yes no : optional ;
 
 # Windows-specific features
 
-feature user-interface : console gui wince native auto ;
+feature.feature user-interface : console gui wince native auto ;
+
+feature.feature variant : : implicit composite propagated symmetric ;
 
-feature variant : : implicit composite propagated symmetric ;
 
 # Declares a new variant.
-# First determines explicit properties for this variant, by
-# refining parents' explicit properties with the passed explicit
-# properties. The result is remembered and will be used if
-# this variant is used as parent.
 #
-# Second, determines the full property set for this variant by
-# adding to the explicit properties default values for all properties
-# which neither present nor are symmetric.
+# First determines explicit properties for this variant, by refining parents'
+# explicit properties with the passed explicit properties. The result is
+# remembered and will be used if this variant is used as parent.
+#
+# Second, determines the full property set for this variant by adding to the
+# explicit properties default values for all missing non-symmetric properties.
 #
-# Lastly, makes appropriate value of 'variant' property expand
-# to the full property set.
-rule variant ( name # Name of the variant
- : parents-or-properties * # Specifies parent variants, if
- # 'explicit-properties' are given,
- # and explicit-properties otherwise.
- : explicit-properties * # Explicit properties.
+# Lastly, makes appropriate value of 'variant' property expand to the full
+# property set.
+rule variant ( name # Name of the variant
+ : parents-or-properties * # Specifies parent variants, if
+ # 'explicit-properties' are given, and
+ # explicit-properties or parents otherwise.
+ : explicit-properties * # Explicit properties.
     )
 {
     local parents ;
@@ -302,97 +295,102 @@
         parents = $(parents-or-properties) ;
     }
 
- # The problem is that we have to check for conflicts
- # between base variants.
+ # The problem is that we have to check for conflicts between base variants.
     if $(parents[2])
     {
- error "multiple base variants are not yet supported" ;
+ errors.error "multiple base variants are not yet supported" ;
     }
-
+
     local inherited ;
- # Add explicitly specified properties for parents
+ # Add explicitly specified properties for parents.
     for local p in $(parents)
     {
- # TODO: the check may be sticter
+ # TODO: This check may be made stricter.
         if ! [ feature.is-implicit-value $(p) ]
         {
- error "Invalid base varaint" $(p) ;
+ errors.error "Invalid base variant" $(p) ;
         }
-
+
         inherited += $(.explicit-properties.$(p)) ;
     }
     property.validate $(explicit-properties) ;
- explicit-properties = [ property.refine $(inherited) : $(explicit-properties) ] ;
-
- # Record explicitly specified properties for this variant
- # We do this after inheriting parents' properties, so that
- # they affect other variants, derived from this one.
+ explicit-properties = [ property.refine $(inherited)
+ : $(explicit-properties) ] ;
+
+ # Record explicitly specified properties for this variant. We do this after
+ # inheriting parents' properties so they affect other variants derived from
+ # this one.
     .explicit-properties.$(name) = $(explicit-properties) ;
-
+
     feature.extend variant : $(name) ;
- feature.compose <variant>$(name) : $(explicit-properties) ;
+ feature.compose <variant>$(name) : $(explicit-properties) ;
 }
 IMPORT $(__name__) : variant : : variant ;
 
-variant debug : <optimization>off <debug-symbols>on <inlining>off <runtime-debugging>on ;
-variant release : <optimization>speed <debug-symbols>off <inlining>full
+
+variant debug : <optimization>off <debug-symbols>on <inlining>off
+ <runtime-debugging>on ;
+variant release : <optimization>speed <debug-symbols>off <inlining>full
                   <runtime-debugging>off <define>NDEBUG ;
 variant profile : release : <profiling>on <debug-symbols>on ;
 
+
 class searched-lib-target : abstract-file-target
 {
- rule __init__ ( name
- : project
- : shared ?
+ rule __init__ ( name
+ : project
+ : shared ?
         : search *
         : action
     )
     {
- abstract-file-target.__init__ $(name) : SEARCHED_LIB : $(project)
+ abstract-file-target.__init__ $(name) : SEARCHED_LIB : $(project)
           : $(action) : ;
-
+
         self.shared = $(shared) ;
         self.search = $(search) ;
     }
-
+
     rule shared ( )
     {
         return $(self.shared) ;
     }
-
+
     rule search ( )
     {
         return $(self.search) ;
     }
-
+
     rule actualize-location ( target )
     {
         NOTFILE $(target) ;
- }
-
+ }
+
     rule path ( )
     {
     }
-}
+}
+
 
-import types/register ;
 import stage ;
 
 
-class c-scanner : scanner
+class c-scanner : scanner
 {
- import regex virtual-target path scanner ;
-
+ import path ;
+ import regex ;
+ import scanner ;
+ import virtual-target ;
+
     rule __init__ ( includes * )
     {
         scanner.__init__ ;
-
+
         for local i in $(includes)
- {
+ {
             self.includes += [ path.native $(i:G=) ] ;
         }
-
- }
+ }
 
     rule pattern ( )
     {
@@ -401,72 +399,70 @@
 
     rule process ( target : matches * : binding )
     {
- local angle = [ regex.transform $(matches) : "<(.*)>" ] ;
+ local angle = [ regex.transform $(matches) : "<(.*)>" ] ;
         local quoted = [ regex.transform $(matches) : "\"(.*)\"" ] ;
 
         # CONSIDER: the new scoping rule seem to defeat "on target" variables.
- local g = [ on $(target) return $(HDRGRIST) ] ;
+ local g = [ on $(target) return $(HDRGRIST) ] ;
         local b = [ NORMALIZE_PATH $(binding:D) ] ;
 
- # Attach binding of including file to included targets.
- # When target is directly created from virtual target
- # this extra information is unnecessary. But in other
- # cases, it allows to distinguish between two headers of the
- # same name included from different places.
- # We don't need this extra information for angle includes,
- # since they should not depend on including file (we can't
- # get literal "." in include path).
+ # Attach binding of including file to included targets. When a target is
+ # directly created from virtual target this extra information is
+ # unnecessary. But in other cases, it allows us to distinguish between
+ # two headers of the same name included from different places. We don't
+ # need this extra information for angle includes, since they should not
+ # depend on including file (we can't get literal "." in include path).
         local g2 = $(g)"#"$(b) ;
-
+
         angle = $(angle:G=$(g)) ;
         quoted = $(quoted:G=$(g2)) ;
-
+
         local all = $(angle) $(quoted) ;
 
         INCLUDES $(target) : $(all) ;
         NOCARE $(all) ;
         SEARCH on $(angle) = $(self.includes:G=) ;
         SEARCH on $(quoted) = $(b) $(self.includes:G=) ;
-
- # Just propagate current scanner to includes, in a hope
- # that includes do not change scanners.
+
+ # Just propagate the current scanner to includes in hope that includes
+ # do not change scanners.
         scanner.propagate $(__name__) : $(angle) $(quoted) : $(target) ;
-
+
         ISFILE $(angle) $(quoted) ;
- }
+ }
 }
 
-scanner.register c-scanner : include ;
 
-type.set-scanner CPP : c-scanner ;
+type.register H : h ;
+type.register HPP : hpp : H ;
+type.register C : c ;
 
+scanner.register c-scanner : include ;
 
-type.register H : h ;
-type.register HPP : hpp : H ;
-type.register C : c ;
+type.set-scanner CPP : c-scanner ;
+type.set-scanner C : c-scanner ;
 
-type.set-scanner C : c-scanner ;
 
-# The generator class for libraries (target type LIB). Depending on properties it will
-# request building of the approapriate specific type -- SHARED_LIB, STATIC_LIB or
-# SHARED_LIB.
+# The generator class for libraries (target type LIB). Depending on properties
+# it will request building of the appropriate specific library type --
+# -- SHARED_LIB, STATIC_LIB or SHARED_LIB.
 class lib-generator : generator
 {
     rule __init__ ( * : * )
     {
         generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
     }
-
+
     rule run ( project name ? : property-set : sources * )
     {
- # The lib generator is composing, and can be only invoked with
+ # The lib generator is composing, and can be only invoked with an
         # explicit name. This check is present in generator.run (and so in
- # builtin.linking-generator), but duplicate it here to avoid doing
- # extra work.
+ # builtin.linking-generator) but duplicated here to avoid doing extra
+ # work.
         if $(name)
- {
+ {
             local properties = [ $(property-set).raw ] ;
- # Determine the needed target type
+ # Determine the needed target type.
             local actual-type ;
                 # <source>files can be generated by <conditional>@rule feature
                 # in which case we don't consider it a SEARCHED_LIB type.
@@ -477,129 +473,129 @@
             }
             else if <file> in $(properties:G)
             {
- # The generator for
                 actual-type = LIB ;
- }
+ }
             else if <link>shared in $(properties)
             {
                 actual-type = SHARED_LIB ;
             }
- else
+ else
             {
                 actual-type = STATIC_LIB ;
             }
             property-set = [ $(property-set).add-raw <main-target-type>LIB ] ;
             # Construct the target.
- return [ generators.construct $(project) $(name) : $(actual-type)
- : $(property-set) : $(sources) ] ;
- }
- }
-
+ return [ generators.construct $(project) $(name) : $(actual-type)
+ : $(property-set) : $(sources) ] ;
+ }
+ }
+
     rule viable-source-types ( )
     {
         return * ;
- }
+ }
 }
 
+
 generators.register [ new lib-generator builtin.lib-generator : : LIB ] ;
 
+
 # The implementation of the 'lib' rule. Beyond standard syntax that rule allows
-# simplified:
-# lib a b c ;
-# so we need to write code to handle that syntax.
-rule lib ( names + : sources * : requirements * : default-build *
+# simplified: "lib a b c ;".
+rule lib ( names + : sources * : requirements * : default-build *
     : usage-requirements * )
 {
- local result ;
- local project = [ project.current ] ;
-
- # This is a circular module dependency, so it must be imported here
- import targets ;
-
     if $(names[2])
     {
         if <name> in $(requirements:G)
         {
             errors.user-error "When several names are given to the 'lib' rule" :
- "it's not allowed to specify the <name> feature. " ;
- }
+ "it's not allowed to specify the <name> feature." ;
+ }
         if $(sources)
         {
             errors.user-error "When several names are given to the 'lib' rule" :
- "it's not allowed to specify sources. " ;
- }
+ "it's not allowed to specify sources." ;
+ }
     }
-
+
+ # This is a circular module dependency so it must be imported here.
+ import targets ;
+
+ local project = [ project.current ] ;
+ local result ;
+
     for local name in $(names)
- {
+ {
         local r = $(requirements) ;
- # Support " lib a ; " and " lib a b c ; " syntaxes.
+ # Support " lib a ; " and " lib a b c ; " syntax.
         if ! $(sources) && ! <name> in $(requirements:G)
                         && ! <file> in $(requirements:G)
         {
             r += <name>$(name) ;
- }
+ }
         result += [ targets.main-target-alternative
- [ new typed-target $(name) : $(project) : LIB
- : [ targets.main-target-sources $(sources) : $(name) ]
- : [ targets.main-target-requirements $(r) : $(project) ]
- : [ targets.main-target-default-build $(default-build) : $(project) ]
- : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
- ] ] ;
- }
+ [ new typed-target $(name) : $(project) : LIB
+ : [ targets.main-target-sources $(sources) : $(name) ]
+ : [ targets.main-target-requirements $(r) : $(project) ]
+ : [ targets.main-target-default-build $(default-build) : $(project) ]
+ : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
+ ] ] ;
+ }
     return $(result) ;
 }
 IMPORT $(__name__) : lib : : lib ;
 
+
 class searched-lib-generator : generator
 {
     import property-set ;
-
+
     rule __init__ ( )
     {
- # The requirements cause the generators to be tried *only* when we're building
- # lib target and there's 'search' feature. This seems ugly --- all we want
- # is make sure searched-lib-generator is not invoced deep in transformation
- # search.
+ # The requirements cause the generators to be tried *only* when we're
+ # building a lib target with a 'search' feature. This seems ugly --- all
+ # we want is to make sure searched-lib-generator is not invoked deep
+ # inside transformation search to produce intermediate targets.
         generator.__init__ searched-lib-generator : : SEARCHED_LIB ;
     }
-
+
     rule run ( project name ? : property-set : sources * )
     {
         if $(name)
         {
- # If name is empty, it means we're called not from top-level.
- # In this case, we just fail immediately, because searched-lib-generator
- # cannot be used to produce intermediate targets.
-
- local properties = [ $(property-set).raw ] ;
+ # If 'name' is empty, it means we have not been called to build a
+ # top-level target. In this case, we just fail immediately, because
+ # searched-lib-generator cannot be used to produce intermediate
+ # targets.
+
+ local properties = [ $(property-set).raw ] ;
             local shared ;
             if <link>shared in $(properties)
             {
                 shared = true ;
- }
-
+ }
+
             local search = [ feature.get-values <search> : $(properties) ] ;
 
- a = [ new null-action $(property-set) ] ;
+ local a = [ new null-action $(property-set) ] ;
             local lib-name = [ feature.get-values <name> : $(properties) ] ;
             lib-name ?= $(name) ;
- local t = [ new searched-lib-target $(lib-name) : $(project) : $(shared)
- : $(search)
- : $(a)
- ] ;
+ local t = [ new searched-lib-target $(lib-name) : $(project)
+ : $(shared) : $(search) : $(a) ] ;
             # We return sources for a simple reason. If there's
- # lib png : z : <name>png ;
- # the 'z' target should be returned, so that apps linking to
- # 'png' will link to 'z', too.
+ # lib png : z : <name>png ;
+ # the 'z' target should be returned, so that apps linking to 'png'
+ # will link to 'z', too.
             return [ property-set.create <xdll-path>$(search) ]
                    [ virtual-target.register $(t) ] $(sources) ;
         }
- }
+ }
 }
 
 generators.register [ new searched-lib-generator ] ;
 
+
 class prebuilt-lib-generator : generator
 {
     rule __init__ ( * : * )
@@ -611,94 +607,95 @@
     {
         local f = [ $(property-set).get <file> ] ;
         return $(f) $(sources) ;
- }
+ }
 }
 
-generators.register
+generators.register
   [ new prebuilt-lib-generator builtin.prebuilt : : LIB : <file> ] ;
 
 generators.override builtin.prebuilt : builtin.lib-generator ;
 
-
-class compile-action : action
+
+class compile-action : action
 {
     import sequence ;
-
+
     rule __init__ ( targets * : sources * : action-name : properties * )
     {
         action.__init__ $(targets) : $(sources) : $(action-name) : $(properties) ;
     }
-
-
- # For all virtual targets for the same dependency graph as self,
- # i.e. which belong to the same main target, add their directories
- # to include path.
+
+ # For all virtual targets for the same dependency graph as self, i.e. which
+ # belong to the same main target, add their directories to the include path.
     rule adjust-properties ( property-set )
- {
+ {
         local s = [ $(self.targets[1]).creating-subvariant ] ;
- return [ $(property-set).add-raw
+ return [ $(property-set).add-raw
           [ $(s).implicit-includes "include" : H ] ] ;
- }
+ }
 }
 
-# Declare a special compiler generator.
-# The only thing it does is changing the type used to represent
-# 'action' in the constructed dependency graph to 'compile-action'.
-# That class in turn adds additional include paths to handle a case
-# when a source file includes headers which are generated themselfs.
+
+# Declare a special compiler generator. The only thing it does is changing the
+# type used to represent 'action' in the constructed dependency graph to
+# 'compile-action'. That class in turn adds additional include paths to handle
+# cases when a source file includes headers which are generated themselves.
 class C-compiling-generator : generator
 {
- rule __init__ ( id : source-types + : target-types + :
- requirements * : optional-properties * )
+ rule __init__ ( id : source-types + : target-types + : requirements *
+ : optional-properties * )
     {
         generator.__init__ $(id) : $(source-types) : $(target-types) :
- $(requirements) : $(optional-properties) ;
+ $(requirements) : $(optional-properties) ;
     }
-
+
     rule action-class ( )
     {
         return compile-action ;
     }
 }
 
-rule register-c-compiler ( id : source-types + : target-types + :
- requirements * : optional-properties * )
+
+rule register-c-compiler ( id : source-types + : target-types + : requirements *
+ : optional-properties * )
 {
- local g = [ new C-compiling-generator $(id) : $(source-types)
- : $(target-types) : $(requirements) : $(optional-properties) ] ;
- generators.register $(g) ;
+ generators.register [ new C-compiling-generator $(id) : $(source-types)
+ : $(target-types) : $(requirements) : $(optional-properties) ] ;
 }
 
-# FIXME: this is ugly, should find a better way (we'd want client code to
-# register all generators as "generator.some-rule", not with "some-module.some-rule".)
+# FIXME: this is ugly, should find a better way (we'd like client code to
+# register all generators as "generators.some-rule" instead of
+# "some-module.some-rule".)
 IMPORT $(__name__) : register-c-compiler : : generators.register-c-compiler ;
 
+
 # The generator class for handling EXE and SHARED_LIB creation.
 class linking-generator : generator
 {
- import property-set ;
- import type ;
     import path ;
     import project ;
-
- rule __init__ ( id
- composing ? : # Specify if generator is composing. The generator will be
- # composing if non-empty string is passed, or parameter is
- # not given. To make generator non-composing, pass empty
- # string ("")
- source-types + : target-types + :
+ import property-set ;
+ import type ;
+
+ rule __init__ ( id
+ composing ? : # The generator will be composing if a non-empty
+ # string is passed or the parameter is not given. To
+ # make the generator non-composing, pass an empty
+ # string ("").
+ source-types + :
+ target-types + :
         requirements * )
     {
         composing ?= true ;
- generator.__init__ $(id) $(composing) : $(source-types) : $(target-types) :
- $(requirements) ;
+ generator.__init__ $(id) $(composing) : $(source-types)
+ : $(target-types) : $(requirements) ;
     }
-
+
     rule run ( project name ? : property-set : sources + )
- {
- sources += [ $(property-set).get <library> ] ;
-
- # Add <library-path> properties for all searched libraries
+ {
+ sources += [ $(property-set).get <library> ] ;
+
+ # Add <library-path> properties for all searched libraries.
         local extra ;
         for local s in $(sources)
         {
@@ -708,62 +705,60 @@
                 extra += <library-path>$(search) ;
             }
         }
-
- # It's possible that sources include shared libraries that
- # did not came from 'lib' targets. For example, .so files
- # specified as sources.
- # In this case we have
- # - add extra dll-path properties
- # - propagate extra xdll-path properties so that application
- # linking to use will get xdll-path to those libraries.
+
+ # It's possible that sources include shared libraries that did not came
+ # from 'lib' targets, e.g. .so files specified as sources. In this case
+ # we have to add extra dll-path properties and propagate extra xdll-path
+ # properties so that application linking to use will get xdll-path to
+ # those libraries.
         local extra-xdll-paths ;
         for local s in $(sources)
         {
- if [ type.is-derived [ $(s).type ] SHARED_LIB ] && ! [ $(s).action ]
+ if [ type.is-derived [ $(s).type ] SHARED_LIB ] && ! [ $(s).action ]
             {
- # Unfortunately, we don't have a good way to find the path
- # to a file, so use this nasty approach.
+ # Unfortunately, we don't have a good way to find the path to a
+ # file, so use this nasty approach.
                 local p = [ $(s).project ] ;
                 local location = [ path.root [ $(s).name ]
- [ $(p).get source-location ] ] ;
+ [ $(p).get source-location ] ] ;
                 extra-xdll-paths += [ path.parent $(location) ] ;
- }
+ }
         }
-
- # Hardcode dll paths only when linking executables.
+
+ # Hardcode DLL paths only when linking executables.
         # Pros: don't need to relink libraries when installing.
- # Cons: "standalone" libraries (plugins, python extensions)
- # can't hardcode paths to dependent libraries.
+ # Cons: "standalone" libraries (plugins, python extensions) can't
+ # hardcode paths to dependent libraries.
         if [ $(property-set).get <hardcode-dll-paths> ] = true
- && [ type.is-derived $(self.target-types[1]) EXE ]
+ && [ type.is-derived $(self.target-types[1]) EXE ]
         {
             local xdll-path = [ $(property-set).get <xdll-path> ] ;
             extra += <dll-path>$(xdll-path) <dll-path>$(extra-xdll-paths) ;
         }
-
+
         if $(extra)
         {
             property-set = [ $(property-set).add-raw $(extra) ] ;
- }
-
+ }
+
         local result = [ generator.run $(project) $(name) : $(property-set)
- : $(sources) ] ;
-
+ : $(sources) ] ;
+
         local ur ;
         if $(result)
- {
- ur = [ extra-usage-requirements $(result) : $(property-set) ] ;
- ur = [ $(ur).add
- [ property-set.create <xdll-path>$(extra-xdll-paths) ] ] ;
- }
+ {
+ ur = [ extra-usage-requirements $(result) : $(property-set) ] ;
+ ur = [ $(ur).add
+ [ property-set.create <xdll-path>$(extra-xdll-paths) ] ] ;
+ }
         return $(ur) $(result) ;
     }
-
+
     rule extra-usage-requirements ( created-targets * : property-set )
- {
- local result = [ property-set.empty ] ;
+ {
+ local result = [ property-set.empty ] ;
         local extra ;
-
+
         # Add appropricate <xdll-path> usage requirements.
         local raw = [ $(property-set).raw ] ;
         if <link>shared in $(raw)
@@ -772,41 +767,40 @@
             local pwd = [ path.pwd ] ;
             for local t in $(created-targets)
             {
- if [ type.is-derived [ $(t).type ] SHARED_LIB ]
+ if [ type.is-derived [ $(t).type ] SHARED_LIB ]
                 {
                     paths += [ path.root [ path.make [ $(t).path ] ] $(pwd) ] ;
- }
- }
+ }
+ }
             extra += $(paths:G=<xdll-path>) ;
         }
-
+
         # We need to pass <xdll-path> features that we've got from sources,
- # because if shared library is built, exe which uses it must know paths
- # to other shared libraries this one depends on, to be able to find them
- # all at runtime.
-
- # Just pass all features in property-set, it's theorically possible
- # that we'll propagate <xdll-path> features explicitly specified by
- # the user, but then the user's to blaim for using internal feature.
+ # because if a shared library is built, exe using it needs to know paths
+ # to other shared libraries this one depends on in order to be able to
+ # find them all at runtime.
+
+ # Just pass all features in property-set, it's theorically possible that
+ # we'll propagate <xdll-path> features explicitly specified by the user,
+ # but then the user's to blaim for using an internal feature.
         local values = [ $(property-set).get <xdll-path> ] ;
         extra += $(values:G=<xdll-path>) ;
-
+
         if $(extra)
         {
             result = [ property-set.create $(extra) ] ;
         }
         return $(result) ;
     }
-
+
     rule generated-targets ( sources + : property-set : project name ? )
     {
- local sources2 ; # sources to pass to inherited rule
- local properties2 ; # properties to pass to inherited rule
- local libraries ; # sources which are libraries
-
- # Searched libraries are not passed as argument to linker
- # but via some option. So, we pass them to the action
- # via property.
+ local sources2 ; # Sources to pass to inherited rule.
+ local properties2 ; # Properties to pass to inherited rule.
+ local libraries ; # Library sources.
+
+ # Searched libraries are not passed as arguments to the linker but via
+ # some option. So, we pass them to the action using a property.
         properties2 = [ $(property-set).raw ] ;
         local fsa ;
         local fst ;
@@ -815,75 +809,73 @@
             if [ type.is-derived [ $(s).type ] SEARCHED_LIB ]
             {
                 local name = [ $(s).name ] ;
- if [ $(s).shared ]
- {
- fsa += $(name) ;
+ if [ $(s).shared ]
+ {
+ fsa += $(name) ;
                 }
                 else
                 {
                     fst += $(name) ;
- }
+ }
             }
             else
             {
                 sources2 += $(s) ;
             }
         }
- properties2 += <find-shared-library>$(fsa:J=&&)
+ properties2 += <find-shared-library>$(fsa:J=&&)
                        <find-static-library>$(fst:J=&&) ;
-
- local spawn = [ generator.generated-targets $(sources2)
- : [ property-set.create $(properties2) ] : $(project) $(name) ] ;
-
- return $(spawn) ;
- }
-}
-
-rule register-linker ( id composing ? : source-types + : target-types + :
- requirements * )
-{
- local g = [ new linking-generator $(id) $(composing) : $(source-types)
- : $(target-types) : $(requirements) ] ;
- generators.register $(g) ;
+
+ return [ generator.generated-targets $(sources2)
+ : [ property-set.create $(properties2) ] : $(project) $(name) ] ;
+ }
+}
+
+
+rule register-linker ( id composing ? : source-types + : target-types +
+ : requirements * )
+{
+ generators.register [ new linking-generator $(id) $(composing)
+ : $(source-types) : $(target-types) : $(requirements) ] ;
 }
 
+
 # The generator class for handling STATIC_LIB creation.
 class archive-generator : generator
 {
- import property-set ;
+ import property-set ;
 
- rule __init__ ( id composing ? : source-types + : target-types + :
- requirements * )
+ rule __init__ ( id composing ? : source-types + : target-types +
+ : requirements * )
     {
         composing ?= true ;
- generator.__init__ $(id) $(composing) : $(source-types) : $(target-types) :
- $(requirements) ;
+ generator.__init__ $(id) $(composing) : $(source-types)
+ : $(target-types) : $(requirements) ;
     }
-
+
     rule run ( project name ? : property-set : sources + )
- {
- sources += [ $(property-set).get <library> ] ;
-
+ {
+ sources += [ $(property-set).get <library> ] ;
+
         local result = [ generator.run $(project) $(name) : $(property-set)
- : $(sources) ] ;
-
- # For static linking, if we get a library in source, we can't
- # directly link to it. So, we need to cause our dependencies
- # to link to that library. There are two approaches:
+ : $(sources) ] ;
+
+ # For static linking, if we get a library in source, we can't directly
+ # link to it so we need to cause our dependencies to link to that
+ # library. There are two approaches:
         # - adding the library to the list of returned targets.
         # - using the <library> usage requirements.
         # The problem with the first is:
- #
+ #
         # lib a1 : : <file>liba1.a ;
         # lib a2 : a2.cpp a1 : <link>static ;
         # install dist : a2 ;
         #
- # here we'll try to install 'a1', even though it's not necessary in
- # the general case.
- # With the second approaches, even indirect dependents will link to
- # the library, but it should not cause any harm.
- # So, return all LIB sources together with created targets,
- # so that dependents link to them.
+ # here we'll try to install 'a1', even though it's not necessary in the
+ # general case. With the second approach, even indirect dependants will
+ # link to the library, but it should not cause any harm. So, return all
+ # LIB sources together with created targets, so that dependants link to
+ # them.
         local usage-requirements ;
         if [ $(property-set).get <link> ] = static
         {
@@ -892,41 +884,36 @@
                 if [ type.is-derived [ $(t).type ] LIB ]
                 {
                     usage-requirements += <library>$(t) ;
- }
- }
+ }
+ }
         }
-
+
         usage-requirements = [ property-set.create $(usage-requirements) ] ;
-
+
         return $(usage-requirements) $(result) ;
- }
+ }
 }
 
-rule register-archiver ( id composing ? : source-types + : target-types + :
- requirements * )
+
+rule register-archiver ( id composing ? : source-types + : target-types +
+ : requirements * )
 {
- local g = [ new archive-generator $(id) $(composing) : $(source-types)
- : $(target-types) : $(requirements) ] ;
- generators.register $(g) ;
+ generators.register [ new archive-generator $(id) $(composing)
+ : $(source-types) : $(target-types) : $(requirements) ] ;
 }
 
-# Generators that accepts everything, and produces nothing.
-# Usefull as general fallback for toolset-specific actions, like
-# PCH generation.
+
+# Generator that accepts everything and produces nothing. Useful as a general
+# fallback for toolset-specific actions like PCH generation.
 class dummy-generator : generator
 {
     import property-set ;
-
+
     rule run ( project name ? : property-set : sources + )
     {
         return [ property-set.empty ] ;
     }
 }
 
-
-
-IMPORT $(__name__) : register-linker register-archiver
- : : generators.register-linker generators.register-archiver ;
-
-
-
+IMPORT $(__name__) : register-linker register-archiver
+ : : generators.register-linker generators.register-archiver ;

Modified: trunk/tools/build/v2/tools/cast.jam
==============================================================================
--- trunk/tools/build/v2/tools/cast.jam (original)
+++ trunk/tools/build/v2/tools/cast.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -10,7 +10,7 @@
 # This is done with:
 #
 # exe main : main.cpp [ cast _ moccable-cpp : widget.cpp ] ;
-#
+#
 # Boost.Build will assing target type CPP to both main.cpp and widget.cpp.
 # Then, the cast rule will change target type of widget.cpp to
 # MOCCABLE-CPP, and Qt support will run MOC tool as part of build process.
@@ -22,22 +22,25 @@
 # cast, as defining new target type + generator for that type is somewhat
 # simpler then defining main target rule.
 
-import project type targets ;
 import "class" : new ;
 import errors ;
+import project ;
 import property-set ;
+import targets ;
+import type ;
+
 
 class cast-target-class : typed-target
 {
     import type ;
-
- rule __init__ ( name : project : type
- : sources * : requirements * : default-build * : usage-requirements * )
+
+ rule __init__ ( name : project : type : sources * : requirements *
+ : default-build * : usage-requirements * )
     {
- typed-target.__init__ $(name) : $(project) : $(type)
- : $(sources) : $(requirements) : $(default-build) : $(usage-requirements) ;
+ typed-target.__init__ $(name) : $(project) : $(type) : $(sources)
+ : $(requirements) : $(default-build) : $(usage-requirements) ;
     }
-
+
     rule construct ( name : source-targets * : property-set )
     {
         local result ;
@@ -47,43 +50,42 @@
             {
                 ECHO "error: source to the 'cast' rule is not a file!" ;
                 EXIT ;
- }
+ }
             if [ $(s).action ]
             {
                 ECHO "error: only non-derived target are allowed for 'cast'." ;
                 ECHO "error: when building " [ full-name ] ;
                 EXIT ;
- }
+ }
             local r = [ $(s).clone-with-different-type $(self.type) ] ;
             result += [ virtual-target.register $(r) ] ;
         }
-
         return [ property-set.empty ] $(result) ;
- }
-
+ }
 }
 
-rule cast ( name type : sources * : requirements * : default-build *
+
+rule cast ( name type : sources * : requirements * : default-build *
     : usage-requirements * )
 {
     local project = [ project.current ] ;
-
+
     local real-type = [ type.type-from-rule-name $(type) ] ;
     if ! $(real-type)
     {
- errors.user-error "No type corresponds to main target rule nam '$(type)'"
- : "Hint: try lowercase name" ;
+ errors.user-error "No type corresponds to main target rule name '$(type)'"
+ : "Hint: try lowercase name" ;
     }
-
-
- # This is a circular module dependency, so it must be imported here
+
+ # This is a circular module dependency so it must be imported here.
     import targets ;
     targets.main-target-alternative
- [ new cast-target-class $(name) : $(project) : $(real-type)
- : [ targets.main-target-sources $(sources) : $(name) ]
- : [ targets.main-target-requirements $(requirements) : $(project) ]
- : [ targets.main-target-default-build $(default-build) : $(project) ]
- : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
- ] ;
+ [ new cast-target-class $(name) : $(project) : $(real-type)
+ : [ targets.main-target-sources $(sources) : $(name) ]
+ : [ targets.main-target-requirements $(requirements) : $(project) ]
+ : [ targets.main-target-default-build $(default-build) : $(project) ]
+ : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
+ ] ;
 }
+
 IMPORT $(__name__) : cast : : cast ;

Modified: trunk/tools/build/v2/tools/common.jam
==============================================================================
--- trunk/tools/build/v2/tools/common.jam (original)
+++ trunk/tools/build/v2/tools/common.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,9 +1,9 @@
-# Copyright 2003, 2005 Dave Abrahams
-# Copyright 2005, 2006 Rene Rivera
-# Copyright 2005 Toon Knapen
-# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2003, 2005 Dave Abrahams
+# Copyright 2005, 2006 Rene Rivera
+# Copyright 2005 Toon Knapen
+# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
 # Provides actions common to all toolsets, for as making directoies and
 # removing files.
@@ -31,41 +31,43 @@
 
 # Configurations
 #
-# The following class helps to manage toolset configurations. Each configuration
-# has unique ID and one or more parameters. A typical example of unique ID is
-# a condition generated by 'common.check-init-parameters' rule. Other kinds of
-# ID can be used. Parameters may include any details about the configuration like
-# 'command', 'path', etc.
-#
-# A configuration may be in one of two states:
-#
-# - registered - a toolset configuration is registered (by autodetection code
-# for instance) but is not used. I.e. 'toolset.using' wasn't yet been called
-# for this configuration.
-# - used - once called 'toolset.using' marks the configuration as 'used'.
-#
-# The main difference between the states is that while a configuration is
-# 'registered' its options can be freely changed. This is useful in particular
-# for autodetection code - all detected configurations may be safely overwritten
-# by a user.
+# The following class helps to manage toolset configurations. Each configuration
+# has a unique ID and one or more parameters. A typical example of a unique ID
+# is a condition generated by 'common.check-init-parameters' rule. Other kinds
+# of IDs can be used. Parameters may include any details about the configuration
+# like 'command', 'path', etc.
+#
+# A toolset configuration may be in one of the following states:
+#
+# - registered
+# Configuration has been registered (e.g. by autodetection code) but has
+# not yet been marked as used, i.e. 'toolset.using' rule has not yet been
+# called for it.
+# - used
+# Once called 'toolset.using' rule marks the configuration as 'used'.
+#
+# The main difference between the states above is that while a configuration is
+# 'registered' its options can be freely changed. This is useful in particular
+# for autodetection code - all detected configurations may be safely overwritten
+# by user code.
 
 class configurations
 {
- import errors : error ;
+ import errors ;
 
     rule __init__ ( )
     {
     }
-
- # Registers a configuration.
+
+ # Registers a configuration.
     #
- # Returns 'true' if the configuration has been added and an empty value if
+ # Returns 'true' if the configuration has been added and an empty value if
     # it already exists. Reports an error if the configuration is 'used'.
     rule register ( id )
     {
- if $(id) in $(self.used)
+ if $(id) in $(self.used)
         {
- error "common: the configuration '$(id)' is in use" ;
+ errors.error "common: the configuration '$(id)' is in use" ;
         }
 
         local retval ;
@@ -74,28 +76,28 @@
         {
             self.all += $(id) ;
 
- # indicate that a new configuration has been added
+ # Indicate that a new configuration has been added.
             retval = true ;
         }
 
         return $(retval) ;
     }
 
- # Mark a configuration as 'used'.
+ # Mark a configuration as 'used'.
     #
- # Returns 'true' if the state of the configuration has been changed to
+ # Returns 'true' if the state of the configuration has been changed to
     # 'used' and an empty value if it the state wasn't changed. Reports an error
     # if the configuration isn't known.
     rule use ( id )
     {
         if ! $(id) in $(self.all)
         {
- error "common: the configuration '$(id)' is not known" ;
+ errors.error "common: the configuration '$(id)' is not known" ;
         }
 
         local retval ;
 
- if ! $(id) in $(self.used)
+ if ! $(id) in $(self.used)
         {
             self.used += $(id) ;
 
@@ -117,31 +119,30 @@
     {
         return $(self.used) ;
     }
-
+
     # Returns the value of a configuration parameter.
     rule get ( id : param )
     {
- return $(self.$(param).$(id)) ;
+ return $(self.$(param).$(id)) ;
     }
 
     # Sets the value of a configuration parameter.
     rule set ( id : param : value * )
     {
- self.$(param).$(id) = $(value) ;
+ self.$(param).$(id) = $(value) ;
     }
 }
 
 
-# The rule checks toolset parameters. Each trailing parameter
-# should be a pair of parameter name and parameter value.
-# The rule will check that each parameter either has value in
-# each invocation, or has no value in each invocation. Also,
-# the rule will check that the combination of all parameter values is
-# unique in all invocations.
+# The rule for checking toolset parameters. Trailing parameters should all be
+# parameter name/value pairs. The rule will check that each parameter either has
+# a value in each invocation or has no value in each invocation. Also, the rule
+# will check that the combination of all parameter values is unique in all
+# invocations.
 #
-# Each parameter name corresponds to subfeature. This rule will declare subfeature
-# the first time non-empty parameter value is passed, and will extend it with
-# all the values.
+# Each parameter name corresponds to a subfeature. This rule will declare
+# a subfeature the first time a non-empty parameter value is passed and will
+# extend it with all the values.
 #
 # The return value from this rule is a condition to be used for flags settings.
 rule check-init-parameters ( toolset : * )
@@ -152,8 +153,8 @@
     {
         local name = $($(index)[1]) ;
         local value = $($(index)[2]) ;
-
- if $(value)-is-specified
+
+ if $(value)-is-not-empty
         {
             condition = $(condition)-$(value) ;
             if $(.had-unspecified-value.$(toolset).$(name))
@@ -163,37 +164,36 @@
                 "no value was specified in earlier initialization" :
                 "an explicit value is specified now" ;
             }
- # The below logic is for intel compiler. It calls this rule
- # with 'intel-linux' and 'intel-win' as toolset, so we need to
- # get the base part of toolset name.
- # We can't pass 'intel' as toolset, because it that case it will
- # be impossible to register versionles intel-linux and
- # intel-win of specific version.
+ # The below logic is for intel compiler. It calls this rule with
+ # 'intel-linux' and 'intel-win' as toolset, so we need to get the
+ # base part of toolset name. We can't pass 'intel' as toolset
+ # because in that case it will be impossible to register versionless
+ # intel-linux and intel-win toolsets of a specific version.
             local t = $(toolset) ;
             local m = [ MATCH ([^-]*)- : $(toolset) ] ;
             if $(m)
             {
                 t = $(m[1]) ;
- }
- if ! $(.had-value.$(toolset).$(name))
+ }
+ if ! $(.had-value.$(toolset).$(name))
             {
                 if ! $(.declared-subfeature.$(t).$(name))
                 {
                     feature.subfeature toolset $(t) : $(name) : : propagated ;
                     .declared-subfeature.$(t).$(name) = true ;
- }
+ }
                 .had-value.$(toolset).$(name) = true ;
             }
             feature.extend-subfeature toolset $(t) : $(name) : $(value) ;
         }
         else
         {
- if $(.had-value.$(toolset).$(name))
+ if $(.had-value.$(toolset).$(name))
             {
- errors.user-error
+ errors.user-error
                 "$(toolset) initialization: parameter '$(name)' inconsistent" :
                 "an explicit value was specified in an earlier initialization" :
- "no value is specified now" ;
+ "no value is specified now" ;
             }
             .had-unspecified-value.$(toolset).$(name) = true ;
         }
@@ -201,23 +201,24 @@
     }
     if $(sig) in $(.all-signatures)
     {
- local message =
- "duplicate initialization of $(toolset) with the following parameters: " ;
+ local message =
+ "duplicate initialization of $(toolset) with the following parameters: " ;
         for local index in 2 3 4 5 6 7 8 9
         {
             local p = $($(index)) ;
             if $(p)
             {
                 message += "$(p[1]) = $(p[2]:E=<unspecified>)" ;
- }
+ }
         }
         message += "previous initialization at $(.init-loc.$(sig))" ;
- errors.user-error $(message[1]) : $(message[2]) : $(message[3]) : $(message[4])
- : $(message[5]) : $(message[6]) : $(message[7]) : $(message[8]) ;
- }
+ errors.user-error
+ $(message[1]) : $(message[2]) : $(message[3]) : $(message[4]) :
+ $(message[5]) : $(message[6]) : $(message[7]) : $(message[8]) ;
+ }
     .all-signatures += $(sig) ;
     .init-loc.$(sig) = [ errors.nearest-user-location ] ;
-
+
     if $(.show-configuration)
     {
         ECHO notice: $(condition) ;
@@ -225,18 +226,16 @@
     return $(condition) ;
 }
 
-# A helper rule to get the command to invoke some tool.
-# In 'user-provided-command' is not given, tries to find binary
-# named 'tool' in PATH and in the passed 'additional-path'. Otherwise,
-# verified that the first element of 'user-provided-command' is an
-# existing program.
-#
+
+# A helper rule to get the command to invoke some tool. If
+# 'user-provided-command' is not given, tries to find binary named 'tool' in
+# PATH and in the passed 'additional-path'. Otherwise, verifies that the first
+# element of 'user-provided-command' is an existing program.
 #
 # This rule returns the command to be used when invoking the tool. If we can't
-# find the tool, a warning is issued.
-# If 'path-last' is specified, PATH is checked after 'additional-paths' when
-# searching to 'tool'.
-rule get-invocation-command-nodefault (
+# find the tool, a warning is issued. If 'path-last' is specified, PATH is
+# checked after 'additional-paths' when searching for 'tool'.
+rule get-invocation-command-nodefault (
     toolset : tool : user-provided-command * : additional-paths * : path-last ? )
 {
     local command ;
@@ -251,7 +250,7 @@
     }
     else
     {
- command = [ common.check-tool $(user-provided-command) ] ;
+ command = [ common.check-tool $(user-provided-command) ] ;
         if ! $(command) && $(.debug-configuration)
         {
             ECHO "warning: toolset $(toolset) initialization: " ;
@@ -263,15 +262,15 @@
     return $(command) ;
 }
 
-# Same as get-invocation-command-nodefault, except that if no tool
-# if found, returns either the user-provided-command, if present,
-# or the 'tool' parameter.
-rule get-invocation-command (
+
+# Same as get-invocation-command-nodefault, except that if no tool is found,
+# returns either the user-provided-command, if present, or the 'tool' parameter.
+rule get-invocation-command (
     toolset : tool : user-provided-command * : additional-paths * : path-last ? )
 {
     local result = [ get-invocation-command-nodefault $(toolset) : $(tool)
- : $(user-provided-command) : $(additional-paths) : $(path-last) ] ;
-
+ : $(user-provided-command) : $(additional-paths) : $(path-last) ] ;
+
     if ! $(result)
     {
         if $(user-provided-command)
@@ -281,14 +280,14 @@
         else
         {
             result = $(tool) ;
- }
+ }
     }
- return $(result) ;
+ return $(result) ;
 }
-
-# Given an invocation command,
-# return the absolute path to the command. This works even if commnad
-# has not path element and is present in PATH.
+
+
+# Given an invocation command return the absolute path to the command. This
+# works even if command has no path element and was found on the PATH.
 rule get-absolute-tool-path ( command )
 {
     if $(command:D)
@@ -299,22 +298,20 @@
     {
         local m = [ GLOB [ modules.peek : PATH Path path ] : $(command) $(command).exe ] ;
         return $(m[1]:D) ;
- }
+ }
 }
 
 
-
 # Attempts to find tool (binary) named 'name' in PATH and in 'additional-paths'.
-# If found in PATH, returns 'name'.
-# If found in additional paths, returns absolute name. If the tool is found
-# in several directories, return all paths.
-# Otherwise, returns empty string.
-# If 'path-last' is specified, PATH is searched after 'additional-paths'.
+# If found in PATH, returns 'name' and if found in additional paths, returns
+# absolute name. If the tool is found in several directories, returns all paths.
+# Otherwise, returns an empty string. If 'path-last' is specified, PATH is
+# searched after 'additional-paths'.
 rule find-tool ( name : additional-paths * : path-last ? )
 {
     local path = [ path.programs-path ] ;
     local match = [ path.glob $(path) : $(name) $(name).exe ] ;
- local additional-match = [ path.glob $(additional-paths) : $(name) $(name).exe ] ;
+ local additional-match = [ path.glob $(additional-paths) : $(name) $(name).exe ] ;
 
     local result ;
     if $(path-last)
@@ -337,65 +334,65 @@
         }
     }
     if $(result)
- {
+ {
         return [ path.native $(result[1]) ] ;
- }
+ }
 }
 
-# Checks if 'command' can be found either in path
-# or is a full name to an existing file.
+
+# Checks if 'command' can be found either in path or is a full name to an
+# existing file.
 rule check-tool-aux ( command )
 {
     if $(command:D)
     {
         if [ path.exists $(command) ]
- # Both NT and Cygwin will run .exe files by their unqualified names
- || [ os.on-windows ] && [ path.exists $(command).exe ]
- # Only NT will run .bat files by their unqualified names
+ # Both NT and Cygwin will run .exe files by their unqualified names.
+ || [ os.on-windows ] && [ path.exists $(command).exe ]
+ # Only NT will run .bat files by their unqualified names.
             || [ os.name ] = NT && [ path.exists $(command).bat ]
         {
             return $(command) ;
- }
+ }
     }
     else
     {
         if [ GLOB [ modules.peek : PATH Path path ] : $(command) ]
         {
             return $(command) ;
- }
- }
+ }
+ }
 }
 
 
-# Checks that a tool can be invoked by 'command'.
-# If command is not an absolute path, checks if it can be found in 'path'.
-# If comand is absolute path, check that it exists. Returns 'command'
-# if ok and empty string otherwise.
+# Checks that a tool can be invoked by 'command'. If command is not an absolute
+# path, checks if it can be found in 'path'. If comand is an absolute path,
+# check that it exists. Returns 'command' if ok or empty string otherwise.
 rule check-tool ( xcommand + )
 {
- if [ check-tool-aux $(xcommand[1]) ]
- || [ check-tool-aux $(xcommand[-1]) ]
+ if [ check-tool-aux $(xcommand[1]) ] ||
+ [ check-tool-aux $(xcommand[-1]) ]
     {
         return $(xcommand) ;
     }
 }
 
-# Handle common options for toolset, specifically sets the following
-# flag variables:
+
+# Handle common options for toolset, specifically sets the following flag
+# variables:
 # - CONFIG_COMMAND to 'command'
-# - OPTIONS for compile.c to the value of <cflags> in options
-# - OPTIONS for compile.c++ to the value of <cxxflags> in options
-# - OPTIOns for compile to the value of <compileflags> in options
-# - OPTIONs for link to the value of <linkflags> in options
+# - OPTIONS for compile.c to the value of <cflags> in options
+# - OPTIONS for compile.c++ to the value of <cxxflags> in options
+# - OPTIOns for compile to the value of <compileflags> in options
+# - OPTIONs for link to the value of <linkflags> in options
 rule handle-options ( toolset : condition * : command * : options * )
 {
     if $(.debug-configuration)
     {
         ECHO "notice: will use '$(command)' for $(toolset), condition $(condition:E=(empty))" ;
     }
-
- # The last parameter ('true') says it's OK to set flags for another
- # module,
+
+ # The last parameter ('true') says it's OK to set flags for another module.
     toolset.flags $(toolset) CONFIG_COMMAND $(condition) : $(command) : unchecked ;
     toolset.flags $(toolset).compile OPTIONS $(condition) :
       [ feature.get-values <compileflags> : $(options) ] : unchecked ;
@@ -406,12 +403,11 @@
     toolset.flags $(toolset).compile.fortran OPTIONS $(condition) :
       [ feature.get-values <fflags> : $(options) ] : unchecked ;
     toolset.flags $(toolset).link OPTIONS $(condition) :
- [ feature.get-values <linkflags> : $(options) ] : unchecked ;
+ [ feature.get-values <linkflags> : $(options) ] : unchecked ;
 }
 
 
-# returns the location of the "program files" directory on a windows
-# platform
+# Returns the location of the "program files" directory on a windows platform.
 rule get-program-files-dir ( )
 {
     local ProgramFiles = [ modules.peek : ProgramFiles ] ;
@@ -426,12 +422,13 @@
     return $(ProgramFiles) ;
 }
 
+
 if [ os.name ] = NT
 {
     RM = del /f /q ;
     CP = copy ;
     IGNORE = "2>nul >nul & setlocal" ;
- LN ?= $(CP) ;
+ LN ?= $(CP) ;
 }
 else
 {
@@ -440,28 +437,29 @@
     LN = ln ;
 }
 
-nl = "
-" ;
 
-rule rm-command ( )
+rule rm-command ( )
 {
- return $(RM) ;
+ return $(RM) ;
 }
 
+
 rule copy-command ( )
 {
     return $(CP) ;
 }
 
 
-# Returns the command needed to set the environment variable on the
-# current platform. The variable setting persists through all
-# following commands and is visible in the environment seen by
-# subsequently executed commands. In other words, on Unix systems,
-# the variable is exported, which is consistent with the only possible
-# behavior on Windows systems.
+# Returns the command needed to set an environment variable on the current
+# platform. The variable setting persists through all following commands and is
+# visible in the environment seen by subsequently executed commands. In other
+# words, on Unix systems, the variable is exported, which is consistent with the
+# only possible behavior on Windows systems.
 rule variable-setting-command ( variable : value )
-{
+{
+ local nl = "
+" ;
+
     if [ os.name ] = NT
     {
         return "set $(variable)=$(value)$(nl)" ;
@@ -472,30 +470,28 @@
     }
 }
 
-# Returns a command that sets the named shell path variable to the
-# given NATIVE paths to on the current platform.
+
+# Returns a command to sets a named shell path variable to the given NATIVE
+# paths on the current platform.
 rule path-variable-setting-command ( variable : paths * )
-{
+{
     local sep = [ os.path-separator ] ;
     return [ variable-setting-command $(variable) : $(paths:J=$(sep)) ] ;
 }
 
-# Returns a command that prepends the given paths to the named path
-# variable on the current platform.
+
+# Returns a command that prepends the given paths to the named path variable on
+# the current platform.
 rule prepend-path-variable-command ( variable : paths * )
-{
- return [
- path-variable-setting-command $(variable)
- : $(paths) [ os.expand-variable $(variable) ]
- ] ;
+{
+ return [ path-variable-setting-command $(variable)
+ : $(paths) [ os.expand-variable $(variable) ] ] ;
 }
 
 
-# Return a command which can create a file. If 'r' is result of invocation,
-# then
-# r foobar
-# will create foobar with unspecified content. What happens if file already
-# exists is unspecified.
+# Return a command which can create a file. If 'r' is result of invocation, then
+# 'r foobar' will create foobar with unspecified content. What happens if file
+# already exists is unspecified.
 rule file-creation-command ( )
 {
     if [ modules.peek : NT ]
@@ -508,10 +504,10 @@
     }
 }
 
-
-# Returns a command that may be used for 'touching' files.
-# It is not a real 'touch' command on NT because it adds an empty line at
-# the end of file but it works with source files
+
+# Returns a command that may be used for 'touching' files. It is not a real
+# 'touch' command on NT because it adds an empty line at the end of file but it
+# works with source files.
 rule file-touch-command ( )
 {
     if [ os.name ] in NT
@@ -527,18 +523,14 @@
 
 rule MkDir
 {
- # If dir exists, don't update it
- # Do this even for $(DOT).
-
+ # If dir exists, don't update it. Do this even for $(DOT).
     NOUPDATE $(<) ;
 
     if $(<) != $(DOT) && ! $($(<)-mkdir)
     {
- local s ;
-
- # Cheesy gate to prevent multiple invocations on same dir
- # MkDir1 has the actions
- # Arrange for jam dirs
+ # Cheesy gate to prevent multiple invocations on same dir.
+ # MkDir1 has the actions.
+ # Arrange for jam dirs.
 
         $(<)-mkdir = true ;
         MkDir1 $(<) ;
@@ -547,7 +539,7 @@
         # Recursively make parent directories.
         # $(<:P) = $(<)'s parent, & we recurse until root
 
- s = $(<:P) ;
+ local s = $(<:P) ;
 
         if $(NT)
         {
@@ -557,7 +549,7 @@
                 case *:\\ : s = ;
             }
         }
-
+
         if $(s) && $(s) != $(<)
         {
             Depends $(<) : $(s) ;
@@ -570,18 +562,21 @@
     }
 }
 
+
 actions MkDir1
 {
     mkdir "$(<)"
 }
 
+
 actions piecemeal together existing Clean
 {
     $(RM) "$(>)"
 }
 
-rule copy
-{
+
+rule copy
+{
 }
 
 
@@ -590,28 +585,32 @@
     $(CP) "$(>)" "$(<)"
 }
 
+
 rule RmTemps
 {
 }
+
+
 actions quietly updated piecemeal together RmTemps
 {
     $(RM) "$(>)" $(IGNORE)
 }
 
+
 actions hard-link
 {
     $(RM) "$(<)" 2$(NULL_OUT) $(NULL_OUT)
- $(LN) "$(>)" "$(<)" $(NULL_OUT)
+ $(LN) "$(>)" "$(<)" $(NULL_OUT)
 }
 
 
 # Given a target, as given to a custom tag rule, returns a string formatted
 # according to the passed format. Format is a list of properties that is
-# represented in the result. For each element of format the corresponding
-# target information is obtained and added to the result string.
-# For all, but the literal, the format value is taken as the as string to
-# prepend to the output to join the item to the rest of the result. If not
-# given "-" is used as a joiner.
+# represented in the result. For each element of format the corresponding target
+# information is obtained and added to the result string. For all, but the
+# literal, the format value is taken as the as string to prepend to the output
+# to join the item to the rest of the result. If not given "-" is used as a
+# joiner.
 #
 # The format options can be:
 #
@@ -642,8 +641,8 @@
 # boost_thread-vc80-mt-gd-1_33.dll, or
 # boost_regex-vc80-gd-1_33.dll
 #
-# The returned name also has the target type specific prefix and suffix
-# which puts it in a ready form to use as the value from a custom tag rule.
+# The returned name also has the target type specific prefix and suffix which
+# puts it in a ready form to use as the value from a custom tag rule.
 #
 rule format-name ( format * : name : type ? : property-set )
 {
@@ -656,19 +655,19 @@
             {
                 case <base> :
                 result += $(name:B) ;
-
+
                 case <toolset> :
                 result += [ join-tag $(f:G=) :
                     [ toolset-tag $(name) : $(type) : $(property-set) ] ] ;
-
+
                 case <threading> :
                 result += [ join-tag $(f:G=) :
                     [ threading-tag $(name) : $(type) : $(property-set) ] ] ;
-
+
                 case <runtime> :
                 result += [ join-tag $(f:G=) :
                     [ runtime-tag $(name) : $(type) : $(property-set) ] ] ;
-
+
                 case <version:*> :
                 local key = [ MATCH <version:(.*)> : $(f:G) ] ;
                 local version = [ $(property-set).get <$(key)> ] ;
@@ -676,7 +675,7 @@
                 version = [ MATCH "^([^.]+)[.]([^.]+)[.]?([^.]*)"
                     : $(version) ] ;
                 result += [ join-tag $(f:G=) : $(version[1])_$(version[2]) ] ;
-
+
                 case <property:*> :
                 local key = [ MATCH <property:(.*)> : $(f:G) ] ;
                 local p = [ $(property-set).get [ MATCH <property:(.*)> : $(f:G) ] ] ;
@@ -684,7 +683,7 @@
                 {
                     result += [ join-tag $(f:G=) : $(p) ] ;
                 }
-
+
                 case * :
                 result += $(f:G=) ;
             }
@@ -695,16 +694,18 @@
     }
 }
 
+
 local rule join-tag ( joiner ? : tag ? )
 {
     if ! $(joinder) { joiner = - ; }
     return $(joiner)$(tag) ;
 }
 
+
 local rule toolset-tag ( name : type ? : property-set )
 {
     local tag = ;
-
+
     local properties = [ $(property-set).raw ] ;
     switch [ $(property-set).get <toolset> ]
     {
@@ -721,7 +722,7 @@
                 case * : tag += gcc ;
             }
         }
- case intel :
+ case intel :
         if [ $(property-set).get <toolset-intel:platform> ] = win
         {
             tag += iw ;
@@ -742,8 +743,7 @@
     }
     local version = [ MATCH "<toolset.*version>([0123456789]+)[.]([0123456789]*)"
         : $(properties) ] ;
- # For historical reasons, vc6.0 and vc7.0 use different
- # naming.
+ # For historical reasons, vc6.0 and vc7.0 use different naming.
     if $(tag) = vc
     {
         if $(version[1]) = 6
@@ -756,88 +756,87 @@
             version = 7 ;
         }
     }
- # On intel, version is not added, because it does not
- # matter and it's the version of vc used as backend
- # that matters. Ideally, we'd encode the backend
- # version but that will break compatibility with
- # V1.
+ # On intel, version is not added, because it does not matter and it's the
+ # version of vc used as backend that matters. Ideally, we'd encode the
+ # backend version but that would break compatibility with V1.
     if $(tag) = iw
     {
         version = ;
     }
-
- # On borland, version is not added for compatibility
- # with V1.
+
+ # On borland, version is not added for compatibility with V1.
     if $(tag) = bcb
     {
         version = ;
     }
-
+
     tag += $(version) ;
-
+
     return $(tag:J=) ;
 }
 
+
 local rule threading-tag ( name : type ? : property-set )
 {
     local tag = ;
     local properties = [ $(property-set).raw ] ;
     if <threading>multi in $(properties) { tag = mt ; }
-
+
     return $(tag:J=) ;
 }
 
+
 local rule runtime-tag ( name : type ? : property-set )
 {
     local tag = ;
-
+
     local properties = [ $(property-set).raw ] ;
     if <runtime-link>static in $(properties) { tag += s ; }
-
- # This is ugly thing. In V1, there's a code to automatically
- # detect which properties affect a target. So, if
- # <runtime-debugging> does not affect gcc toolset, the
- # tag rules won't even see <runtime-debugging>.
- # Similar functionality in V2 is not implemented yet, so we just
- # check for toolsets which are know to care about runtime debug
- if <toolset>msvc in $(properties)
- || <stdlib>stlport in $(properties)
+
+ # This is an ugly thing. In V1, there's a code to automatically detect which
+ # properties affect a target. So, if <runtime-debugging> does not affect gcc
+ # toolset, the tag rules won't even see <runtime-debugging>. Similar
+ # functionality in V2 is not implemented yet, so we just check for toolsets
+ # which are known to care about runtime debug.
+ if <toolset>msvc in $(properties) ||
+ <stdlib>stlport in $(properties)
     {
- if <runtime-debugging>on in $(properties) { tag += g ; }
+ if <runtime-debugging>on in $(properties) { tag += g ; }
     }
-
+
     if <python-debugging>on in $(properties) { tag += y ; }
     if <variant>debug in $(properties) { tag += d ; }
     if <stdlib>stlport in $(properties) { tag += p ; }
     if <stdlib-stlport:iostream>hostios in $(properties) { tag += n ; }
-
+
     return $(tag:J=) ;
 }
 
-rule __test__ ( ) {
 
+rule __test__ ( )
+{
     import assert ;
-
- local save-os = [ modules.peek os : name ] ;
-
- modules.poke os : .name : LINUX ;
-
+
     local nl = "
 " ;
-
+
+ local save-os = [ modules.peek os : name ] ;
+
+ modules.poke os : .name : LINUX ;
+
     assert.result "PATH=foo:bar:baz$(nl)export PATH$(nl)"
- : path-variable-setting-command PATH : foo bar baz ;
-
+ : path-variable-setting-command PATH : foo bar baz ;
+
     assert.result "PATH=foo:bar:$PATH$(nl)export PATH$(nl)"
- : prepend-path-variable-command PATH : foo bar ;
-
+ : prepend-path-variable-command PATH : foo bar ;
+
     modules.poke os : .name : NT ;
-
+
     assert.result "set PATH=foo;bar;baz$(nl)"
- : path-variable-setting-command PATH : foo bar baz ;
-
+ : path-variable-setting-command PATH : foo bar baz ;
+
     assert.result "set PATH=foo;bar;%PATH%$(nl)"
- : prepend-path-variable-command PATH : foo bar ;
+ : prepend-path-variable-command PATH : foo bar ;
 
- modules.poke os : .name : $(save-os) ;
-}
+ modules.poke os : .name : $(save-os) ;
+}

Modified: trunk/tools/build/v2/tools/generate.jam
==============================================================================
--- trunk/tools/build/v2/tools/generate.jam (original)
+++ trunk/tools/build/v2/tools/generate.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,6 +1,6 @@
-# Copyright 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
 # Declares main target 'generate' that can be used to produce targets
 # by calling a user-provides rule, that takes virtual target and produces
@@ -9,13 +9,13 @@
 import targets ;
 import "class" : new ;
 import property ;
-import errors : error ;
-import type : type ;
+import errors ;
 import regex ;
 import property-set ;
 import project ;
 import feature ;
 
+
 feature.feature generating-rule : : free ;
 
 
@@ -24,28 +24,28 @@
     import errors ;
     import indirect ;
     import virtual-target ;
-
+
     rule __init__ ( name : project : sources * : requirements *
         : default-build * : usage-requirements * )
- {
- basic-target.__init__ $(name) : $(project) : $(sources)
- : $(requirements) : $(default-build) : $(usage-requirements) ;
-
+ {
+ basic-target.__init__ $(name) : $(project) : $(sources)
+ : $(requirements) : $(default-build) : $(usage-requirements) ;
+
         local r = [ $(self.requirements).get <generating-rule> ] ;
         if ! $(r)
         {
- errors.user-error
- "The generate rule requires <generating-rule> property to be set" ;
- }
+ errors.user-error
+ "The generate rule requires <generating-rule> property to be set" ;
+ }
     }
-
+
     rule construct ( name : sources * : property-set )
     {
         local result ;
         local gr = [ $(property-set).get <generating-rule> ] ;
-
+
         # FIXME: this is copy-paste from virtual-target.jam. Must
- # have an utilty rule to call a rule like this.
+ # have n utilty rule to call a rule like this.
         local rule-name = [ MATCH ^@(.*) : $(gr) ] ;
         if $(rule-name)
         {
@@ -53,22 +53,21 @@
             {
                 errors.error "<tag>@rulename is present but is not the only <tag> feature" ;
             }
-
-
- result = [ indirect.call $(rule-name) $(self.project) $(name)
- : $(property-set) : $(sources) ] ;
-
+
+ result = [ indirect.call $(rule-name) $(self.project) $(name)
+ : $(property-set) : $(sources) ] ;
+
             if ! $(result)
             {
                 ECHO "warning: Unable to construct" [ full-name ] ;
- }
- }
-
+ }
+ }
+
         local ur ;
         local targets ;
 
         if $(result)
- {
+ {
             if [ class.is-a $(result[1]) : property-set ]
             {
                 ur = $(result[1]) ;
@@ -78,31 +77,30 @@
             {
                 ur = [ property-set.empty ] ;
                 targets = $(result) ;
- }
- }
+ }
+ }
         local rt ;
         for t in $(targets)
         {
             rt += [ virtual-target.register $(t) ] ;
         }
         return $(ur) $(rt) ;
- }
+ }
 }
 
-rule generate ( name : sources * : requirements * : default-build *
+
+rule generate ( name : sources * : requirements * : default-build *
     : usage-requirements * )
 {
     local project = [ project.current ] ;
-
+
     targets.main-target-alternative
- [ new generated-target-class $(name) : $(project)
- : [ targets.main-target-sources $(sources) : $(name) ]
- : [ targets.main-target-requirements $(requirements) : $(project) ]
- : [ targets.main-target-default-build $(default-build) : $(project) ]
- : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
- ] ;
+ [ new generated-target-class $(name) : $(project)
+ : [ targets.main-target-sources $(sources) : $(name) ]
+ : [ targets.main-target-requirements $(requirements) : $(project) ]
+ : [ targets.main-target-default-build $(default-build) : $(project) ]
+ : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
+ ] ;
 }
 
 IMPORT $(__name__) : generate : : generate ;
-
-

Modified: trunk/tools/build/v2/tools/gettext.jam
==============================================================================
--- trunk/tools/build/v2/tools/gettext.jam (original)
+++ trunk/tools/build/v2/tools/gettext.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,47 +1,47 @@
-# Copyright 2003, 2004, 2005, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2003, 2004, 2005, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
 # This module support GNU gettext internationalization utilities.
-#
+#
 # It provides two main target rules: 'gettext.catalog', used for
 # creating machine-readable catalogs from translations files, and
 # 'gettext.update', used for update translation files from modified
 # sources.
-#
+#
 # To add i18n support to your application you should follow these
 # steps.
-#
+#
 # - Decide on a file name which will contain translations and
 # what main target name will be used to update it. For example::
-#
+#
 # gettext.update update-russian : russian.po a.cpp my_app ;
-#
+#
 # - Create the initial translation file by running::
 #
 # bjam update-russian
 #
 # - Edit russian.po. For example, you might change fields like LastTranslator.
-#
+#
 # - Create a main target for final message catalog::
 #
 # gettext.catalog russian : russian.po ;
 #
-# The machine-readable catalog will be updated whenever you update
+# The machine-readable catalog will be updated whenever you update
 # "russian.po". The "russian.po" file will be updated only on explicit
 # request. When you're ready to update translations, you should
-#
+#
 # - Run::
-#
+#
 # bjam update-russian
 #
 # - Edit "russian.po" in appropriate editor.
-#
+#
 # The next bjam run will convert "russian.po" into machine-readable form.
 #
 # By default, translations are marked by 'i18n' call. The 'gettext.keyword'
 # feature can be used to alter this.
-
+
 
 import targets ;
 import property-set ;
@@ -59,7 +59,7 @@
 
 # Initializes the gettext module.
 rule init ( path ? # Path where all tools are located. If not specified,
- # they should be in PATH.
+ # they should be in PATH.
           )
 {
     if $(.initialized) && $(.path) != $(path)
@@ -68,9 +68,9 @@
     }
     .initialized = true ;
     if $(path)
- {
+ {
         .path = $(path)/ ;
- }
+ }
 }
 
 # Creates a main target 'name', which, when updated, will cause
@@ -80,36 +80,36 @@
 # of those main targets will be scanned, provided they are of
 # appropricate type. The 'gettext.types' feature can be used to
 # control the types.
-#
+#
 # The target will be updated only if explicitly requested on the
 # command line.
 rule update ( name : existing-translation sources + : requirements * )
 {
     local project = [ project.current ] ;
-
+
     targets.main-target-alternative
       [ new typed-target $(name) : $(project) : gettext.UPDATE :
         $(existing-translation) $(sources)
- : [ targets.main-target-requirements $(requirements) : $(project) ]
+ : [ targets.main-target-requirements $(requirements) : $(project) ]
       ] ;
     $(project).mark-target-as-explicit $(name) ;
 }
 
 
 # The human editable source, containing translation.
-type.register gettext.PO : po ;
+type.register gettext.PO : po ;
 # The machine readable message catalog.
 type.register gettext.catalog : mo ;
 # Intermediate type produce by extracting translations from
 # sources.
-type.register gettext.POT : pot ;
+type.register gettext.POT : pot ;
 # Pseudo type used to invoke update-translations generator
 type.register gettext.UPDATE ;
 
 # Identifies the keyword that should be used when scanning sources.
 # Default: i18n
 feature gettext.keyword : : free ;
-# Contains space-separated list of sources types which should be scanned.
+# Contains space-separated list of sources types which should be scanned.
 # Default: "C CPP"
 feature gettext.types : : free ;
 
@@ -119,7 +119,7 @@
 {
     import regex : split ;
     import property-set ;
-
+
     rule __init__ ( * : * )
     {
         generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
@@ -135,11 +135,11 @@
         local types = [ $(property-set).get <gettext.types> ] ;
         types ?= "C CPP" ;
         types = [ regex.split $(types) " " ] ;
-
+
         local keywords = [ $(property-set).get <gettext.keyword> ] ;
         property-set = [ property-set.create $(keywords:G=<gettext.keyword>) ] ;
 
- # First deterime the list of sources that must be scanned for
+ # First deterime the list of sources that must be scanned for
         # messages.
         local all-sources ;
         # CONSIDER: I'm not sure if the logic should be the same as for 'stage':
@@ -154,22 +154,22 @@
             if [ $(s).type ] in $(types)
             {
                 right-sources += $(s) ;
- }
+ }
         }
-
+
         local .constructed ;
         if $(right-sources)
- {
+ {
             # Create the POT file, which will contain list of messages extracted
             # from the sources.
- local extract =
+ local extract =
               [ new action $(right-sources) : gettext.extract : $(property-set) ] ;
- local new-messages = [ new file-target $(name) : gettext.POT
+ local new-messages = [ new file-target $(name) : gettext.POT
               : $(project) : $(extract) ] ;
-
+
             # Create a notfile target which will update the existing translation file
- # with new messages.
- local a = [ new action $(sources[1]) $(new-messages)
+ # with new messages.
+ local a = [ new action $(sources[1]) $(new-messages)
               : gettext.update-po-dispatch ] ;
             local r = [ new notfile-target $(name) : $(project) : $(a) ] ;
             .constructed = [ virtual-target.register $(r) ] ;
@@ -177,9 +177,9 @@
         else
         {
             errors.error "No source could be scanned by gettext tools" ;
- }
- return $(.constructed) ;
- }
+ }
+ return $(.constructed) ;
+ }
 }
 generators.register [ new update-translations-generator gettext.update : : gettext.UPDATE ] ;
 
@@ -199,11 +199,11 @@
 # first run), we need to copy the file created from sources.
 # In all other cases, we need to update the file.
 rule update-po-dispatch
-{
+{
     NOCARE $(>[1]) ;
     gettext.create-po $(<) : $(>) ;
     gettext.update-po $(<) : $(>) ;
- _ on $(<) = " " ;
+ _ on $(<) = " " ;
     ok on $(<) = "" ;
     EXISTING_PO on $(<) = $(>[1]) ;
 }
@@ -214,7 +214,7 @@
 # to have "missing" action modifier.
 actions quietly existing updated create-po bind EXISTING_PO
 {
- cp$(_)"$(>[1])"$(_)"$(EXISTING_PO)"$($(>[2]:E=ok))
+ cp$(_)"$(>[1])"$(_)"$(EXISTING_PO)"$($(>[2]:E=ok))
 }
 
 actions updated update-po bind EXISTING_PO
@@ -222,12 +222,9 @@
     $(.path)msgmerge$(_)-U$(_)"$(EXISTING_PO)"$(_)"$(>[1])"
 }
 
-actions gettext.compile
+actions gettext.compile
 {
- $(.path)msgfmt -o $(<) $(>)
+ $(.path)msgfmt -o $(<) $(>)
 }
 
 IMPORT $(__name__) : update : : gettext.update ;
-
-
-

Modified: trunk/tools/build/v2/tools/msvc.jam
==============================================================================
--- trunk/tools/build/v2/tools/msvc.jam (original)
+++ trunk/tools/build/v2/tools/msvc.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -51,15 +51,14 @@
 # Dynamic runtime comes only in MT flavour.
 toolset.add-requirements <toolset>msvc,<runtime-link>shared:<threading>multi ;
 
-
-RM = [ common.rm-command ] ;
+RM = [ common.rm-command ] ;
 nl = "
 " ;
 
 
-# Initialize the toolset for a specific version. As the result, path to
-# compiler and, possible, program names are set up, and will be used when
-# that version of compiler is requested. For example, you might have:
+# Initialize the toolset for a specific version. As the result, path to compiler
+# and, possible, program names are set up, and will be used when that version of
+# compiler is requested. For example, you might have:
 #
 # using msvc : 6.5 : cl.exe ;
 # using msvc : 7.0 : Y:/foo/bar/cl.exe ;
@@ -72,36 +71,36 @@
 # - all - all detected versions will be registered;
 # - default - this is an equivalent to an empty version.
 #
-# Depending on a supplied version, detected configurations and presence
-# 'cl.exe' in the path different results may be achieved. The following
-# table describes all possible cases:
+# Depending on a supplied version, detected configurations and presence 'cl.exe'
+# in the path different results may be achieved. The following table describes
+# all possible cases:
 #
 # Nothing "x.y"
 # Passed Nothing "x.y" detected, detected,
 # version detected detected cl.exe in path cl.exe in path
-#
+#
 # default Error Use "x.y" Create "default" Use "x.y"
 # all None Use all None Use all
 # x.y - Use "x.y" - Use "x.y"
 # a.b Error Error Create "a.b" Create "a.b"
-#
+#
 # "x.y" - refers to a detected version;
 # "a.b" - refers to an undetected version.
 #
 # Note: for free VC7.1 tools, we don't correctly find vcvars32.bar when user
 # explicitly provides a path.
-rule init (
+rule init (
     version ? # the msvc version which is being configured. When omitted
             # the tools invoked when no explicit version is given will be configured.
- : command *
+ : command *
     # the command to invoke the compiler. If not specified:
     # - if version is given, default location for that version will be searched
- #
- # - if version is not given, default locations for 7.1, 7.0 and 6.* will
- # be searched
- #
- # - if compiler is not found in default locations, PATH will be searched.
- : options *
+ #
+ # - if version is not given, default locations for 7.1, 7.0 and 6.* will
+ # be searched
+ #
+ # - if compiler is not found in default locations, PATH will be searched.
+ : options *
     # options can include <setup>, <compiler>, <assembler>, <linker> and <resource-compiler>
     #
     # <compiler-filter>
@@ -118,12 +117,9 @@
 }
 
 
-# 'configure' is a newer version of 'init'. The parameter 'command' is passed as
+# 'configure' is a newer version of 'init'. The parameter 'command' is passed as
 # a part of the 'options' list.
-rule configure (
- version ? :
- options *
- )
+rule configure ( version ? : options * )
 {
     switch $(version)
     {
@@ -149,27 +145,24 @@
 
 
 # Supported CPU architectures
-cpu-arch-i386 =
+cpu-arch-i386 =
     <architecture>/<address-model>
     <architecture>/<address-model>32
- <architecture>x86/<address-model>
+ <architecture>x86/<address-model>
     <architecture>x86/<address-model>32 ;
 
-cpu-arch-amd64 =
- <architecture>/<address-model>64
+cpu-arch-amd64 =
+ <architecture>/<address-model>64
     <architecture>x86/<address-model>64 ;
 
 cpu-arch-ia64 =
- <architecture>ia64/<address-model>
+ <architecture>ia64/<address-model>
     <architecture>ia64/<address-model>64 ;
 
 
-local rule configure-really (
- version ? :
- options *
- )
+local rule configure-really ( version ? : options * )
 {
- # If no version supplied use the default configuration. Note that condition
+ # If no version supplied use the default configuration. Note that condition
     # remains versionless.
     local v = $(version) ;
     if ! $(v)
@@ -179,7 +172,7 @@
         version = $(version[1]) ;
         v = $(version) ;
 
- # Note: 'version' can still be empty at this point if no versions were
+ # Note: 'version' can still be empty at this point if no versions were
         # detected.
         version ?= "default" ;
     }
@@ -194,7 +187,7 @@
     if $(version) in [ $(.versions).used ]
     {
         # Allow multiple 'toolset.usage' calls for the same configuration
- # if the identical sets of options are used
+ # if the identical sets of options are used
         if $(options) && ( $(options) != [ $(.versions).get $(version) : options ] )
         {
             error "msvc: the toolset version '$(version)' is configured already" ;
@@ -202,7 +195,7 @@
     }
     else
     {
- # Register a new configuration
+ # Register a new configuration
         $(.versions).register $(version) ;
 
         # Add user-supplied to auto-detected options
@@ -212,26 +205,23 @@
         $(.versions).use $(version) ;
 
         # Generate condition and save it
- local condition = [ common.check-init-parameters msvc :
- version $(v) ] ;
+ local condition = [ common.check-init-parameters msvc : version $(v) ] ;
 
         $(.versions).set $(version) : condition : $(condition) ;
 
-
         local command = [ get-values <command> : $(options) ] ;
 
- # If version is specified, we try to search first in default paths,
- # and only then in PATH.
+ # If version is specified, we try to search first in default paths, and
+ # only then in PATH.
         command = [ common.get-invocation-command msvc : cl.exe : $(command)
           : [ default-paths $(version) ] : $(version) ] ;
 
         common.handle-options msvc : $(condition) : $(command) : $(options) ;
-
 
- if ! $(version)
+ if ! $(version)
         {
- # Even if version is not explicitly specified, try to detect the version
- # from the path.
+ # Even if version is not explicitly specified, try to detect the
+ # version from the path.
             if [ MATCH "(Microsoft Visual Studio 9)" : $(command) ]
             {
                 version = 9.0 ;
@@ -239,7 +229,7 @@
             if [ MATCH "(Microsoft Visual Studio 8)" : $(command) ]
             {
                 version = 8.0 ;
- }
+ }
             else if [ MATCH "(NET 2003[\/\\]VC7)" : $(command) ]
             {
                 version = 7.1 ;
@@ -255,11 +245,10 @@
             else
             {
                 version = 6.0 ;
- }
+ }
         }
 
-
- # Generate and register setup command
+ # Generate and register setup command.
 
         local below-8.0 = [ MATCH ^([67]\\.) : $(version) ] ;
 
@@ -276,8 +265,8 @@
             parent = [ path.parent $(parent) ] ;
             parent = [ path.native $(parent) ] ;
 
- # setup will be used if the script name has been specified.
- # If setup is not specified, a default script will be used instead.
+ # setup will be used if the script name has been specified. If setup
+ # is not specified, a default script will be used instead.
             setup = [ get-values <setup> : $(options) ] ;
 
             if ! $(setup)
@@ -291,14 +280,14 @@
                     setup ?= vcvarsall.bat ;
                 }
 
- # The vccars32.bat is actually in "bin" directory.
- # (except for free VC7.1 tools)
+ # The vccars32.bat is actually in "bin" directory except for
+ # free VC7.1 tools.
                 setup = [ GLOB $(command) $(parent) : $(setup) ] ;
             }
 
             if $(setup)
             {
- # Note Cygwin to Windows translation
+ # Note Cygwin to Windows translation.
                 setup = "\""$(setup[1]:W)"\"" ;
 
                 if ! $(below-8.0)
@@ -309,16 +298,14 @@
                     # say about x86_IPF, that seem to be doc bug,
                     # and x86_ia64 is right one.
                     setup-option = x86 x86_amd64 x86_ia64 ;
-
- # When using 64-bit Windows, and targeting 64-bit,
- # it's possible to use native 64-bit compiler, which is
- # selected by the "amd64" parameter to vcvarsall.bat.
- # There are two variables we can use --
- # PROCESSOR_ARCHITECTURE and PROCESSOR_IDENTIFIER.
- # The first is 'x86' when running 32-bit windows,
- # no matter what processor is, and 'AMD64' on 64-bit
- # windows on x86 (either AMD64 or EM64T).
- # windows.
+
+ # When using 64-bit Windows, and targeting 64-bit, it's
+ # possible to use native 64-bit compiler, which is selected
+ # by the "amd64" parameter to vcvarsall.bat. There are two
+ # variables we can use -- PROCESSOR_ARCHITECTURE and
+ # PROCESSOR_IDENTIFIER. The first is 'x86' when running
+ # 32-bit windows, no matter what processor is, and 'AMD64'
+ # on 64-bit windows on x86 (either AMD64 or EM64T) windows.
                     if [ MATCH ^(AMD64) : [ os.environ PROCESSOR_ARCHITECTURE ] ]
                     {
                         setup-option = x86 amd64 x86_ia64 ;
@@ -341,7 +328,7 @@
         # Setup script is not required in some configurations
         command ?= "" ;
 
- # Get tool names (if any) and finish setup
+ # Get tool names (if any) and finish setup.
 
         compiler = [ get-values <compiler> : $(options) ] ;
         compiler ?= cl ;
@@ -362,7 +349,7 @@
         mc-compiler ?= mc ;
 
         manifest-tool = mt ;
-
+
         local cc-filter = [ get-values <compiler-filter> : $(options) ] ;
 
         for local i in 1 2 3
@@ -378,7 +365,7 @@
                     ECHO "msvc: condition: '$(cond)', "
                         "command: '$(command[$(i)])'" ;
                 }
-
+
                 flags msvc.compile .CC $(cond) : $(command[$(i)])$(compiler) /Zm800 -nologo ;
                 flags msvc.compile .RC $(cond) : $(command[$(i)])$(resource-compiler) ;
                 flags msvc.compile .ASM $(cond) : $(command[$(i)])$(assembler) ;
@@ -395,7 +382,7 @@
                 {
                     flags msvc.link .MT $(cond) : $(manifest-tool) -nologo ;
                 }
-
+
                 if $(cc-filter)
                 {
                     flags msvc .CC.FILTER $(cond) : "|" $(cc-filter) ;
@@ -411,37 +398,36 @@
 # Supported CPU types (only Itanium optimization options are supported from
 # VC++ 2005 on). See http://msdn2.microsoft.com/en-us/library/h66s5s0e(vs.90).aspx
 cpu-type-g5 = i586 pentium pentium-mmx ;
-cpu-type-g6 =
- i686 pentiumpro pentium2 pentium3 pentium3m pentium-m k6 k6-2 k6-3
+cpu-type-g6 =
+ i686 pentiumpro pentium2 pentium3 pentium3m pentium-m k6 k6-2 k6-3
     winchip-c6 winchip2 c3 c3-2 ;
 
-cpu-type-em64t = prescott nocona
+cpu-type-em64t = prescott nocona
     conroe conroe-xe conroe-l allendale mermon mermon-xe kentsfield kentsfield-xe
     penryn wolfdale yorksfield nehalem ;
 cpu-type-amd64 = k8 opteron athlon64 athlon-fx ;
 
-cpu-type-g7 =
- pentium4 pentium4m athlon athlon-tbird athlon-4 athlon-xp athlon-mp
+cpu-type-g7 =
+ pentium4 pentium4m athlon athlon-tbird athlon-4 athlon-xp athlon-mp
     $(cpu-type-em64t) $(cpu-type-amd64) ;
 
 cpu-type-itanium = itanium itanium1 merced ;
 cpu-type-itanium2 = itanium2 mckinley ;
 
-# Sets up flag definitions that are dependent on the version ot
-# compiler.
+
+# Sets up flag definitions dependent on the compiler version used.
 # - 'version' is the version of compiler in N.M format.
-# - 'condition' is the property set to be used as condition for flag
-# - 'toolset' is the toolset for which flag settings are to be defined
+# - 'condition' is the property set to be used as condition for flag.
+# - 'toolset' is the toolset for which flag settings are to be defined.
 # This makes the rule reusable for other msvc-option-compatible compilers.
 rule configure-version-specific ( toolset : version : condition )
 {
     toolset.push-checking-for-flags-module unchecked ;
- # Starting with versions 7.0, the msvc compiler have the /Zc:forScope
- # and /Zc:wchar_t options that improve C++ standard conformance, but
- # those options are off by default.
- # If we're sure that msvc version is at 7.*, add those options explicitly.
- # We can be sure either if user specified version 7.* explicitly,
- # or if the installation path contain 7.* (this is checked above).
+ # Starting with versions 7.0, the msvc compiler have the /Zc:forScope and
+ # /Zc:wchar_t options that improve C++ standard conformance, but those
+ # options are off by default. If we're sure that msvc version is at 7.*, add
+ # those options explicitly. We can be sure either if user specified version
+ # 7.* explicitly, or if the installation path contain 7.* (checked above).
     if ! [ MATCH ^(6\\.) : $(version) ]
     {
         flags $(toolset).compile CFLAGS $(condition) : /Zc:forScope /Zc:wchar_t ;
@@ -449,18 +435,18 @@
         # disable the function is deprecated warning
         # Some version of msvc have a bug, that cause deprecation
         # warning to be emitted even with /W0
- flags $(toolset).compile CFLAGS $(condition)/<warnings>off : /wd4996 ;
+ flags $(toolset).compile CFLAGS $(condition)/<warnings>off : /wd4996 ;
         # 64-bit compatibility warning
- flags $(toolset).compile CFLAGS $(condition)/<warnings>all : /Wp64 ;
+ flags $(toolset).compile CFLAGS $(condition)/<warnings>all : /Wp64 ;
     }
-
+
     #
     # Processor-specific optimization
     #
 
     if [ MATCH ^([67]) : $(version) ]
     {
- # 8.0 deprecates some of the options
+ # 8.0 deprecates some of the options.
         flags $(toolset).compile CFLAGS $(condition)/<optimization>speed $(condition)/<optimization>space : /Ogiy /Gs ;
         flags $(toolset).compile CFLAGS $(condition)/<optimization>speed : /Ot ;
         flags $(toolset).compile CFLAGS $(condition)/<optimization>space : /Os ;
@@ -471,23 +457,23 @@
         flags $(toolset).compile CFLAGS $(condition)/$(cpu-arch-i386)/<instruction-set>$(cpu-type-g5) : /G5 ;
         flags $(toolset).compile CFLAGS $(condition)/$(cpu-arch-i386)/<instruction-set>$(cpu-type-g6) : /G6 ;
         flags $(toolset).compile CFLAGS $(condition)/$(cpu-arch-i386)/<instruction-set>$(cpu-type-g7) : /G7 ;
-
- # Improve floating-point accuracy. Otherwise, some of C++ Boost's
- # "math" tests will fail.
+
+ # Improve floating-point accuracy. Otherwise, some of C++ Boost's "math"
+ # tests will fail.
         flags $(toolset).compile CFLAGS $(condition) : /Op ;
 
- # 7.1 and below have single-threaded static RTL
+ # 7.1 and below have single-threaded static RTL.
         flags $(toolset).compile CFLAGS $(condition)/<runtime-debugging>off/<runtime-link>static/<threading>single : /ML ;
         flags $(toolset).compile CFLAGS $(condition)/<runtime-debugging>on/<runtime-link>static/<threading>single : /MLd ;
     }
     else
     {
- # 8.0 and above adds some more options
+ # 8.0 and above adds some more options.
         flags $(toolset).compile CFLAGS $(condition)/$(cpu-arch-amd64)/<instruction-set> : /favor:blend ;
         flags $(toolset).compile CFLAGS $(condition)/$(cpu-arch-amd64)/<instruction-set>$(cpu-type-em64t) : /favor:EM64T ;
         flags $(toolset).compile CFLAGS $(condition)/$(cpu-arch-amd64)/<instruction-set>$(cpu-type-amd64) : /favor:AMD64 ;
 
- # 8.0 and above only has multi-threaded static RTL
+ # 8.0 and above only has multi-threaded static RTL.
         flags $(toolset).compile CFLAGS $(condition)/<runtime-debugging>off/<runtime-link>static/<threading>single : /MT ;
         flags $(toolset).compile CFLAGS $(condition)/<runtime-debugging>on/<runtime-link>static/<threading>single : /MTd ;
     }
@@ -495,11 +481,11 @@
 }
 
 
-# Returns the default installation path for the given version.
+# Returns the default installation path for the given version.
 local rule default-path ( version )
 {
- # Use auto-detected path if possible
- local path = [ get-values <command> :
+ # Use auto-detected path if possible
+ local path = [ get-values <command> :
         [ $(.versions).get $(version) : options ] ] ;
 
     if $(path)
@@ -532,12 +518,13 @@
     return $(path) ;
 }
 
-# Returns either the default installation path (if 'version' is not empty) or list of all
-# known default paths (if no version is given)
+
+# Returns either the default installation path (if 'version' is not empty) or
+# list of all known default paths (if no version is given)
 rule default-paths ( version ? )
 {
     local possible-paths ;
-
+
     if $(version)
     {
         possible-paths += [ default-path $(version) ] ;
@@ -554,14 +541,13 @@
 }
 
 
-# Declare generators
+# Declare generators.
 
-# is it possible to combine these?
-# make the generators non-composing, so that they don't convert each source
-# into separate rsp file.
+# Is it possible to combine these? Make the generators non-composing so that
+# they don't convert each source into a separate rsp file.
 generators.register-linker msvc.link : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : EXE : <toolset>msvc ;
 generators.register-linker msvc.link.dll : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB : <toolset>msvc ;
-
+
 generators.register-archiver msvc.archive : OBJ : STATIC_LIB : <toolset>msvc ;
 generators.register-c-compiler msvc.compile.c++ : CPP : OBJ : <toolset>msvc ;
 generators.register-c-compiler msvc.compile.c : C : OBJ : <toolset>msvc ;
@@ -586,7 +572,7 @@
     import property-set ;
 
     rule run-pch ( project name ? : property-set : sources * )
- {
+ {
         # searching header and source file in the sources
         local pch-header ;
         local pch-source ;
@@ -603,7 +589,7 @@
                 pch-source = $(s) ;
             }
         }
-
+
         if ! $(pch-header)
         {
             errors.user-error "can't build pch without pch-header" ;
@@ -638,7 +624,7 @@
         }
 
         return
- [
+ [
               property-set.create
                 <pch-header>$(pch-header)
                 <pch-file>$(pch-file)
@@ -648,18 +634,19 @@
     }
 }
 
-# Note: the 'H' source type will catch both '.h' header and '.hpp' header. The latter
-# have HPP type, but HPP type is derived from H. The type of compilation is determined
-# entirely by the destination type.
+
+# Note: the 'H' source type will catch both '.h' header and '.hpp' header. The
+# latter have HPP type, but HPP type is derived from H. The type of compilation
+# is determined entirely by the destination type.
 generators.register [ new msvc-pch-generator msvc.compile.c.pch : H : C_PCH OBJ : <pch>on <toolset>msvc ] ;
 generators.register [ new msvc-pch-generator msvc.compile.c++.pch : H : CPP_PCH OBJ : <pch>on <toolset>msvc ] ;
 
 generators.override msvc.compile.c.pch : pch.default-c-pch-generator ;
 generators.override msvc.compile.c++.pch : pch.default-cpp-pch-generator ;
 
-flags msvc.compile PCH_FILE <pch>on : <pch-file> ;
-flags msvc.compile PCH_SOURCE <pch>on : <pch-source> ;
-flags msvc.compile PCH_HEADER <pch>on : <pch-header> ;
+flags msvc.compile PCH_FILE <pch>on : <pch-file> ;
+flags msvc.compile PCH_SOURCE <pch>on : <pch-source> ;
+flags msvc.compile PCH_HEADER <pch>on : <pch-header> ;
 
 #
 # Declare flags and action for compilation
@@ -705,22 +692,26 @@
 flags msvc.compile UNDEFS <undef> ;
 flags msvc.compile INCLUDES <include> ;
 
+
 rule get-rspline ( target : lang-opt )
 {
     CC_RSPLINE on $(target) = [ on $(target) return $(lang-opt) -U$(UNDEFS) $(CFLAGS) $(C++FLAGS) $(OPTIONS) -c $(nl)-D$(DEFINES) $(nl)\"-I$(INCLUDES)\" ] ;
 }
 
+
 rule compile-c-c++ ( targets + : sources * )
 {
     DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_HEADER) ] ;
     DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_FILE) ] ;
 }
 
+
 actions compile-c-c++
 {
     $(.CC) @"@($(<[1]:W).rsp:E="$(>[1]:W)" -Fo"$(<[1]:W)" -Yu"$(>[3]:D=)" -Fp"$(>[2]:W)" $(CC_RSPLINE))" $(.CC.FILTER)
 }
 
+
 rule compile.c ( targets + : sources * : properties * )
 {
     C++FLAGS on $(targets[1]) = ;
@@ -728,19 +719,22 @@
     compile-c-c++ $(<) : $(>) [ on $(<) return $(PCH_FILE) ] [ on $(<) return $(PCH_HEADER) ] ;
 }
 
+
 rule compile.c++ ( targets + : sources * : properties * )
 {
     get-rspline $(targets) : -TP ;
     compile-c-c++ $(<) : $(>) [ on $(<) return $(PCH_FILE) ] [ on $(<) return $(PCH_HEADER) ] ;
 }
 
+
 actions compile-c-c++-pch-s
 {
     $(.CC) @"@($(<[1]:W).rsp:E="$(>[2]:W)" -Fo"$(<[2]:W)" -Yc"$(>[1]:D=)" -Yl"__bjam_pch_symbol_$(>[1]:D=)" -Fp"$(<[1]:W)" $(CC_RSPLINE))" $(.CC.FILTER)
 }
 
-# Needed only to avoid messing up Emacs syntax highlighting in
-# the messing N-quoted code below.
+
+# Needed only to avoid messing up Emacs syntax highlighting in the messy
+# N-quoted code below.
 quote = "\"" ;
 
 actions compile-c-c++-pch
@@ -748,6 +742,7 @@
     $(.CC) @"@($(<[1]:W).rsp:E="$(>[2]:W)" -Fo"$(<[2]:W)" -Yc"$(>[1]:D=)" -Yl"__bjam_pch_symbol_$(>[1]:D=)" -Fp"$(<[1]:W)" $(CC_RSPLINE))" "@($(<[1]:W).cpp:E=#include $(quote)$(>[1]:D=)$(quote))" $(.CC.FILTER)
 }
 
+
 rule compile.c.pch ( targets + : sources * : properties * )
 {
     C++FLAGS on $(targets[1]) = ;
@@ -755,47 +750,52 @@
     get-rspline $(targets[2]) : -TC ;
     local pch-source = [ on $(<) return $(PCH_SOURCE) ] ;
     if $(pch-source)
- {
+ {
         DEPENDS $(<) : $(pch-source) ;
         compile-c-c++-pch-s $(targets) : $(sources) $(pch-source) ;
     }
     else
     {
         compile-c-c++-pch $(targets) : $(sources) ;
- }
+ }
 }
 
+
 rule compile.c++.pch ( targets + : sources * : properties * )
 {
     get-rspline $(targets[1]) : -TP ;
     get-rspline $(targets[2]) : -TP ;
     local pch-source = [ on $(<) return $(PCH_SOURCE) ] ;
     if $(pch-source)
- {
+ {
         DEPENDS $(<) : $(pch-source) ;
         compile-c-c++-pch-s $(targets) : $(sources) $(pch-source) ;
     }
     else
     {
         compile-c-c++-pch $(targets) : $(sources) ;
- }
+ }
 }
 
+
 actions compile.rc
 {
     $(.RC) -l 0x409 -U$(UNDEFS) -D$(DEFINES) -I"$(INCLUDES)" -fo "$(<:W)" "$(>:W)"
 }
 
+
 # See midl.jam for details
 TOUCH_FILE = [ common.file-touch-command ] ;
 
+
 actions compile.idl
 {
     $(.IDL) /nologo @"@($(<[1]:W).rsp:E=$(nl)"$(>:W)" $(nl)-D$(DEFINES) $(nl)"-I$(INCLUDES)" $(nl)-U$(UNDEFS) $(nl)$(MIDLFLAGS) $(nl)/tlb "$(<[1]:W)" $(nl)/h "$(<[2]:W)" $(nl)/iid "$(<[3]:W)" $(nl)/proxy "$(<[4]:W)" $(nl)/dlldata "$(<[5]:W)")"
- $(TOUCH_FILE) "$(<[4]:W)"
- $(TOUCH_FILE) "$(<[5]:W)"
+ $(TOUCH_FILE) "$(<[4]:W)"
+ $(TOUCH_FILE) "$(<[5]:W)"
 }
 
+
 # Declare flags and action for the assembler
 
 flags msvc.compile.asm USER_ASMFLAGS <asmflags> : ;
@@ -813,12 +813,13 @@
     $(.ASM) -nologo -c -coff -Zp4 -Cp -Cx $(USER_ASMFLAGS) -Fo "$(<:W)" "$(>:W)"
 }
 
+
 # Declare flags and action for linking
-flags msvc.link PDB_LINKFLAG <debug-symbols>on/<debug-store>database : /PDB: ; # not used yet
+flags msvc.link PDB_LINKFLAG <debug-symbols>on/<debug-store>database : /PDB: ; # not used yet
 flags msvc.link LINKFLAGS <debug-symbols>on : /DEBUG ;
 flags msvc.link DEF_FILE <def-file> ;
-# The linker disables the default optimizations when using /DEBUG. Whe have
-# to enable them manually for release builds with debug symbols.
+# The linker disables the default optimizations when using /DEBUG. Whe have to
+# enable them manually for release builds with debug symbols.
 flags msvc LINKFLAGS <debug-symbols>on/<runtime-debugging>off : /OPT:REF,ICF ;
 
 flags msvc LINKFLAGS <user-interface>console : /subsystem:console ;
@@ -830,7 +831,6 @@
 flags msvc.link OPTIONS <linkflags> ;
 flags msvc.link LINKPATH <library-path> ;
 
-
 flags msvc.link FINDLIBS_ST <find-static-library> ;
 flags msvc.link FINDLIBS_SA <find-shared-library> ;
 flags msvc.link LIBRARY_OPTION <toolset>msvc : "" : unchecked ;
@@ -844,40 +844,38 @@
     DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ;
 }
 
-# Declare action for creating static libraries
-# If library exists, remove it before adding files. See
-# http://article.gmane.org/gmane.comp.lib.boost.build/4241
-# for rationale.
+# Declare action for creating static libraries. If library exists, remove it
+# before adding files. See
+# http://article.gmane.org/gmane.comp.lib.boost.build/4241 for rationale.
 if [ os.name ] in NT
-{
- # The 'DEL' command would issue a message to stdout
- # if the file does not exist, so need a check.
+{
+ # The 'DEL' command would issue a message to stdout if the file does not
+ # exist, so need a check.
     actions archive
- {
- if exist "$(<[1])" DEL "$(<[1])"
+ {
+ if exist "$(<[1])" DEL "$(<[1])"
         $(.LD) $(AROPTIONS) /out:"$(<[1])" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")"
     }
 }
 else
 {
     actions archive
- {
+ {
         $(RM) "$(<[1])"
         $(.LD) $(AROPTIONS) /out:"$(<[1])" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")"
     }
 }
-
-# incremental linking a DLL causes no end of problems: if the
-# actual exports don't change, the import .lib file is never
-# updated. Therefore, the .lib is always out-of-date and gets
-# rebuilt every time. I'm not sure that incremental linking is
-# such a great idea in general, but in this case I'm sure we
-# don't want it.
-
-# Windows Manifests is a new way to specify dependencies
-# on managed DotNet assemblies and Windows native DLLs. The
-# manifests are embedded as resources and are useful in
-# any PE targets (both DLL and EXE)
+
+
+# Incremental linking a DLL causes no end of problems: if the actual exports
+# don't change, the import .lib file is never updated. Therefore, the .lib is
+# always out-of-date and gets rebuilt every time. I'm not sure that incremental
+# linking is such a great idea in general, but in this case I'm sure we don't
+# want it.
+
+# Windows manifest is a new way to specify dependencies on managed DotNet
+# assemblies and Windows native DLLs. The manifests are embedded as resources
+# and are useful in any PE target (both DLL and EXE).
 
 if [ os.name ] in NT
 {
@@ -927,7 +925,7 @@
 
 #
 # Autodetection code
-# detects versions listed as '.known-versions' using registry, environment
+# detects versions listed as '.known-versions' using registry, environment
 # and checking default paths. Supports both native Windows and Cygwin.
 #
 
@@ -941,7 +939,7 @@
 .version-alias-7 = 7.0 ;
 .version-alias-8 = 8.0 ;
 .version-alias-9 = 9.0 ;
-
+
 # Name of the registry key that contains Visual C++ installation path
 # (relative to "HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft"
 .version-6.0-reg = "VisualStudio\\6.0\\Setup\\Microsoft Visual C++" ;
@@ -953,18 +951,18 @@
 .version-9.0express-reg = "VCExpress\\9.0\\Setup\\VC" ;
 
 # Visual C++ Toolkit 2003 do not store its installation path in the registry.
-# The environment variable 'VCToolkitInstallDir' and the default installation
+# The environment variable 'VCToolkitInstallDir' and the default installation
 # path will be checked instead.
 .version-7.1toolkit-path = "Microsoft Visual C++ Toolkit 2003" "bin" ;
 .version-7.1toolkit-env = VCToolkitInstallDir ;
 
-# Path to the folder containing "cl.exe" relative to the value of the corresponding
-# environment variable
+# Path to the folder containing "cl.exe" relative to the value of the
+# corresponding environment variable.
 .version-7.1toolkit-envpath = "bin" ;
 
 
-# Validates given path, registers found configuration and prints debug information
-# about it.
+# Validates given path, registers found configuration and prints debug
+# information about it.
 local rule register-configuration ( version : path ? )
 {
     if $(path)
@@ -986,8 +984,7 @@
 
 if [ os.name ] in NT CYGWIN
 {
- # Get installation paths from the registry
-
+ # Get installation paths from the registry.
     for local i in $(.known-versions)
     {
         if $(.version-$(i)-reg)
@@ -999,7 +996,7 @@
                 "HKEY_LOCAL_MACHINE\\SOFTWARE\\"$(x)"\\Microsoft\\"$(.version-$(i)-reg)
                 : "ProductDir" ] ;
             }
-
+
             if $(vc-path)
             {
                 vc-path = [ path.native [ path.join [ path.make-NT $(vc-path[1]) ] "bin" ] ] ;
@@ -1010,7 +1007,7 @@
 }
 
 
-# Check environment and default installation paths
+# Check environment and default installation paths.
 
 for local i in $(.known-versions)
 {
@@ -1019,4 +1016,3 @@
         register-configuration $(i) : [ default-path $(i) ] ;
     }
 }
-

Modified: trunk/tools/build/v2/tools/notfile.jam
==============================================================================
--- trunk/tools/build/v2/tools/notfile.jam (original)
+++ trunk/tools/build/v2/tools/notfile.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -4,47 +4,52 @@
 # License Version 1.0. (See accompanying file LICENSE_1_0.txt or
 # http://www.boost.org/LICENSE_1_0.txt)
 
+import "class" : new ;
 import generators ;
-import type ;
-import feature ;
 import project ;
 import targets ;
 import toolset ;
-import "class" : new ;
+import type ;
+
 
 type.register NOTFILE_MAIN ;
 
+
 class notfile-generator : generator
 {
     rule __init__ ( * : * )
     {
         generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
     }
-
+
     rule run ( project name ? : property-set : sources * : multiple ? )
     {
         local action ;
         local action-name = [ $(property-set).get <action> ] ;
-
+
         local m = [ MATCH ^@(.*) : $(action-name) ] ;
-
- if $(m)
+
+ if $(m)
         {
- action = [ new action $(sources) : $(m[1])
- : $(property-set) ] ;
+ action = [ new action $(sources) : $(m[1])
+ : $(property-set) ] ;
         }
         else
         {
- action = [ new action $(sources) : notfile.run
- : $(property-set) ] ;
- }
+ action = [ new action $(sources) : notfile.run
+ : $(property-set) ] ;
+ }
         return [ new notfile-target $(name) : $(project) : $(action) ] ;
- }
+ }
 }
 
+
 generators.register [ new notfile-generator notfile.main : : NOTFILE_MAIN ] ;
 
+
 toolset.flags notfile.run ACTION : <action> ;
+
+
 actions run
 {
     $(ACTION)
@@ -52,20 +57,17 @@
 
 
 rule notfile ( target-name : action + : sources * : requirements * : default-build * )
-{
+{
     local project = [ project.current ] ;
-
+
     requirements += <action>$(action) ;
 
-
- targets.main-target-alternative
+ targets.main-target-alternative
         [ new typed-target $(target-name) : $(project) : NOTFILE_MAIN
- : [ targets.main-target-sources $(sources) : $(target-name) ]
- : [ targets.main-target-requirements $(requirements) : $(project) ]
- : [ targets.main-target-default-build $(default-build) : $(project) ]
+ : [ targets.main-target-sources $(sources) : $(target-name) ]
+ : [ targets.main-target-requirements $(requirements) : $(project) ]
+ : [ targets.main-target-default-build $(default-build) : $(project) ]
         ] ;
 }
 
 IMPORT $(__name__) : notfile : : notfile ;
-
-

Modified: trunk/tools/build/v2/tools/python.jam
==============================================================================
--- trunk/tools/build/v2/tools/python.jam (original)
+++ trunk/tools/build/v2/tools/python.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -94,8 +94,8 @@
 #
 # using python 2.3 ;
 # using python 2.3 : /usr/local/bin/python ;
-#
-rule init ( version ? : cmd-or-prefix ? : includes * : libraries ?
+#
+rule init ( version ? : cmd-or-prefix ? : includes * : libraries ?
     : condition * : extension-suffix ? )
 {
     project.push-current $(.project) ;
@@ -108,7 +108,7 @@
             debug-message " user-specified "$(v): \"$($(v))\" ;
         }
     }
-
+
     configure $(version) : $(cmd-or-prefix) : $(includes) : $(libraries) : $(condition) : $(extension-suffix) ;
 
     project.pop-current ;
@@ -617,7 +617,7 @@
             # For example, on my installation, adding -ldl causes at
             # least one test to fail because the library can't be
             # found and removing it causes no failures.
-
+
             # Apparently, though, we need to add -lrt for gcc.
             return <toolset>gcc:<library>rt ;
 
@@ -664,7 +664,7 @@
 }
 
 # implementation of init
-local rule configure (
+local rule configure (
   version ? : cmd-or-prefix ? : includes * : libraries ? : condition * : extension-suffix ? )
 {
     local prefix ;
@@ -675,13 +675,13 @@
     local target-os = [ feature.get-values target-os : $(condition) ] ;
     target-os ?= [ feature.defaults target-os ] ;
     target-os = $(target-os:G=) ;
-
- if $(target-os) = windows && <python-debugging>on in $(condition)
+
+ if $(target-os) = windows && <python-debugging>on in $(condition)
     {
         extension-suffix ?= _d ;
     }
     extension-suffix ?= "" ;
-
+
     # Normalize and dissect any version number
     local major-minor ;
     if $(version)
@@ -715,7 +715,7 @@
     # Values to use in case we can't really find anything in the system.
     local fallback-cmd = $(cmds-to-try[1]) ;
     local fallback-version ;
-
+
     # Anything left to find or check?
     if ! ( $(interpreter-cmd) && $(includes) && $(libraries) )
     {
@@ -734,7 +734,7 @@
             case windows : platform = win32 ;
             case cygwin : platform = cygwin ;
         }
-
+
         while $(cmds-to-try)
         {
             # pop top command
@@ -780,7 +780,7 @@
             }
         }
     }
-
+
     # Anything left to compute?
     if $(includes) && $(libraries)
     {
@@ -858,13 +858,13 @@
     }
 
     local dll-path = $(libraries) ;
-
+
     # Make sure that we can find the Python DLL on windows
     if $(target-os) = windows && $(exec-prefix)
     {
         dll-path += $(exec-prefix) ;
     }
-
+
     #
     # prepare usage requirements
     #
@@ -884,9 +884,9 @@
         }
     }
 
- # Register the right suffix for extensions
+ # Register the right suffix for extensions.
     register-extension-suffix $(extension-suffix) : $(target-requirements) ;
-
+
     #
     # Declare the "python" target. This should really be called
     # python_for_embedding
@@ -911,7 +911,7 @@
         # (http://article.gmane.org/gmane.comp.python.general/544986). The
         # evil here, aside from the workaround necessitated by
         # Python's bug, is that:
- #
+ #
         # a. we're guessing the location of the python standard
         # library from the location of pythonXX.lib
         #
@@ -924,7 +924,7 @@
             set-PYTHONPATH =
               [ common.prepend-path-variable-command PYTHONPATH : $(libraries:D)/Lib ] ;
         }
-
+
         alias python
           :
           : $(target-requirements)
@@ -933,8 +933,8 @@
             # the system libs is a mystery, but if we don't do it, on
             # cygwin, -lpythonX.Y never appears in the command line
             # (although it does on linux).
- : $(usage-requirements)
- <testing.launcher>$(set-PYTHONPATH)
+ : $(usage-requirements)
+ <testing.launcher>$(set-PYTHONPATH)
               <library-path>$(libraries) <dll-path>$(dll-path) <library>python.lib
           ;
     }
@@ -987,12 +987,12 @@
 local rule register-extension-suffix ( root : condition * )
 {
     local suffix ;
-
+
     switch [ feature.get-values target-os : $(condition) ]
     {
       case windows : suffix = pyd ;
       case cygwin : suffix = dll ;
- case hpux :
+ case hpux :
       {
           if [ feature.get-values python : $(condition) ] in 1.5 1.6 2.0 2.1 2.2 2.3 2.4
           {
@@ -1005,7 +1005,7 @@
       }
       case * : suffix = so ;
     }
-
+
     type.set-generated-target-suffix PYTHON_EXTENSION : $(condition) : <$(root).$(suffix)> ;
 }
 
@@ -1023,23 +1023,23 @@
 
     local project = [ project.current ] ;
 
-
     targets.main-target-alternative
- [ new typed-target $(name) : $(project) : PYTHON_EXTENSION
- : [ targets.main-target-sources $(sources) : $(name) ]
- : [ targets.main-target-requirements $(requirements) : $(project) ]
- : [ targets.main-target-default-build $(default-build) : $(project) ]
- ] ;
+ [ new typed-target $(name) : $(project) : PYTHON_EXTENSION
+ : [ targets.main-target-sources $(sources) : $(name) ]
+ : [ targets.main-target-requirements $(requirements) : $(project) ]
+ : [ targets.main-target-default-build $(default-build) : $(project) ]
+ ] ;
 }
 
 IMPORT python : python-extension : : python-extension ;
 
+
 # Support for testing
 type.register PY : py ;
 type.register RUN_PYD_OUTPUT ;
-#type.set-generated-target-suffix RUN_PYD : : run ;
 type.register RUN_PYD : : TEST ;
 
+
 class python-test-generator : generator
 {
     import set ;

Modified: trunk/tools/build/v2/tools/testing.jam
==============================================================================
--- trunk/tools/build/v2/tools/testing.jam (original)
+++ trunk/tools/build/v2/tools/testing.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,36 +1,36 @@
-# Copyright 2005 Dave Abrahams
-# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2005 Dave Abrahams
+# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
-# This module implements regression testing framework. It declares a number of
-# main target rules, which perform some action, and if the results are ok,
+# This module implements regression testing framework. It declares a number of
+# main target rules which perform some action and, if the results are ok,
 # creates an output file.
-#
+#
 # The exact list of rules is:
-# 'compile' -- creates .test file if compilation of sources was successfull
-# 'compile-fail' -- creates .test file if compilation of sources failed
+# 'compile' -- creates .test file if compilation of sources was
+# successful.
+# 'compile-fail' -- creates .test file if compilation of sources failed.
 # 'run' -- creates .test file is running of executable produced from
-# sources was successfull. Also leaves behing .output file
+# sources was successful. Also leaves behind .output file
 # with the output from program run.
 # 'run-fail' -- same as above, but .test file is created if running fails.
 #
-# In all cases, presense of .test file is an incication that
-# the test passed. For more convenient reporting, you might want to use C++ Boost
-# regression testing utilities, see
-# http://www.boost.org/more/regression.html
+# In all cases, presence of .test file is an indication that the test passed.
+# For more convenient reporting, you might want to use C++ Boost regression
+# testing utilities, see http://www.boost.org/more/regression.html
 #
-# For historical reason, a 'unit-test' rule is available which
-# has the same syntax as 'exe' and behaves just like 'run'.
+# For historical reason, a 'unit-test' rule is available which has the same
+# syntax as 'exe' and behaves just like 'run'.
 
 # Things to do:
 # - Teach compiler_status handle Jamfile.v2.
 # Notes:
-# - <no-warn> is not implemented, since in Como-specific, and it's not clear how
-# to implement it
-# - std::locale-support is not impelemted (it's used in one test).
+# - <no-warn> is not implemented, since in Como-specific, and it's not clear
+# how to implement it
+# - std::locale-support is not implemented (it's used in one test).
+
 
-
 import targets ;
 import "class" : new ;
 import property ;
@@ -48,77 +48,83 @@
 import sequence ;
 import errors ;
 
-rule init ( ) { }
 
-# The feature which controls the name of program used to
-# lanch test programs.
-feature.feature testing.launcher : : optional free ;
-feature.feature test-info : : free incidental ;
-feature.feature testing.arg : : free incidental ;
+rule init ( )
+{
+}
+
+
+# Feature controling the command used to lanch test programs.
+feature.feature testing.launcher : : free optional ;
+
+feature.feature test-info : : free incidental ;
+feature.feature testing.arg : : free incidental ;
 feature.feature testing.input-file : : free dependency ;
 
+
 # Register target types.
-type.register TEST : test ;
-type.register COMPILE : : TEST ;
-type.register COMPILE_FAIL : : TEST ;
-type.register RUN_OUTPUT : run ;
-type.register RUN : : TEST ;
-type.register RUN_FAIL : : TEST ;
-type.register LINK_FAIL : : TEST ;
-type.register LINK : : TEST ;
-type.register UNIT_TEST : passed : TEST ;
-
-# Declare the rules which create main targets.
-# While the 'type' module already creates rules with the same names for us,
-# we need extra convenience: default name of main target, so write
-# our own versions.
-
-# Helper rule. Create a test target, using basename of first source if no
-# target name is explicitly passed. Remembers the created target in
-# a global variable.
+type.register TEST : test ;
+type.register COMPILE : : TEST ;
+type.register COMPILE_FAIL : : TEST ;
+type.register RUN_OUTPUT : run ;
+type.register RUN : : TEST ;
+type.register RUN_FAIL : : TEST ;
+type.register LINK_FAIL : : TEST ;
+type.register LINK : : TEST ;
+type.register UNIT_TEST : passed : TEST ;
+
+
+# Declare the rules which create main targets. While the 'type' module already
+# creates rules with the same names for us, we need extra convenience: default
+# name of main target, so write our own versions.
+
+# Helper rule. Create a test target, using basename of first source if no target
+# name is explicitly passed. Remembers the created target in a global variable.
 rule make-test ( target-type : sources + : requirements * : target-name ? )
 {
     target-name ?= $(sources[1]:D=:S=) ;
 
     local project = [ project.current ] ;
- # The <location-prefix> forces the build system for generate paths in the form
- # $build_dir/array1.test/gcc/debug
- # This is necessary to allow post-processing tools to work.
- local t =
- [ targets.create-typed-target
+ # The <location-prefix> forces the build system for generate paths in the
+ # form '$build_dir/array1.test/gcc/debug'. This is necessary to allow
+ # post-processing tools to work.
+ local t =
+ [ targets.create-typed-target
           [ type.type-from-rule-name $(target-type) ] : $(project)
- : $(target-name) : $(sources)
+ : $(target-name) : $(sources)
             : $(requirements) <location-prefix>$(target-name).test ] ;
-
- # Remember the test (for --dump-tests).
- # A good way would be to collect all given a project.
- # This has some technical problems: e.g. we can't call this dump from
- # Jamfile since projects referred by 'build-project' are not available until
- # whole Jamfile is loaded.
+
+ # Remember the test (for --dump-tests). A good way would be to collect all
+ # given a project. This has some technical problems: e.g. we can't call this
+ # dump from Jamfile since projects referred by 'build-project' are not
+ # available until the whole Jamfile is loaded.
     .all-tests += $(t) ;
- return $(t) ;
+ return $(t) ;
 }
 
-# Note: passing more that one cpp file here is know to
-# fail. Passing a cpp file and a library target works.
+
+# Note: passing more that one cpp file here is known to fail. Passing a cpp file
+# and a library target works.
 rule compile ( sources + : requirements * : target-name ? )
-{
+{
     return [ make-test compile : $(sources) : $(requirements) : $(target-name) ] ;
 }
 
+
 rule compile-fail ( sources + : requirements * : target-name ? )
-{
+{
     return [ make-test compile-fail : $(sources) : $(requirements) : $(target-name) ] ;
 }
 
+
 rule link ( sources + : requirements * : target-name ? )
-{
+{
     return [ make-test link : $(sources) : $(requirements) : $(target-name) ] ;
 }
 
 
 rule link-fail ( sources + : requirements * : target-name ? )
-{
+{
     return [ make-test link-fail : $(sources) : $(requirements) : $(target-name) ] ;
 }
 
@@ -127,56 +133,55 @@
 {
     if $(input-files[2])
     {
- # Check that sorting made when creating property-set instance
- # won't change the ordering.
+ # Check that sorting made when creating property-set instance won't
+ # change the ordering.
         if [ sequence.insertion-sort $(input-files) ] != $(input-files)
         {
             errors.user-error "Names of input files must be sorted alphabetically"
- : "due to internal limitations" ;
- }
+ : "due to internal limitations" ;
+ }
     }
     return <testing.input-file>$(input-files) ;
 }
 
 
-rule run ( sources + : args * : input-files * : requirements * : target-name ?
+rule run ( sources + : args * : input-files * : requirements * : target-name ?
     : default-build * )
-{
+{
     requirements += <testing.arg>$(args:J=" ") ;
     requirements += [ handle-input-files $(input-files) ] ;
     return [ make-test run : $(sources) : $(requirements) : $(target-name) ] ;
 }
 
-rule run-fail ( sources + : args * : input-files * : requirements * : target-name ?
- : default-build * )
-{
- requirements += <testing.arg>$(args:J=" ") ;
+
+rule run-fail ( sources + : args * : input-files * : requirements *
+ : target-name ? : default-build * )
+{
+ requirements += <testing.arg>$(args:J=" ") ;
     requirements += [ handle-input-files $(input-files) ] ;
     return [ make-test run-fail : $(sources) : $(requirements) : $(target-name) ] ;
 }
 
-
-# Use 'test-suite' as synonym for 'alias', for backward compatibility.
+# Use 'test-suite' as a synonym for 'alias', for backward compatibility.
 IMPORT : alias : : test-suite ;
 
 
-
-# For all main target in 'project-module',
-# which are typed target with type derived from 'TEST',
-# produce some interesting information.
+# For all main targets in 'project-module', which are typed targets with type
+# derived from 'TEST', produce some interesting information.
 rule dump-tests # ( project-module )
 {
     for local t in $(.all-tests)
     {
         dump-test $(t) ;
- }
+ }
 }
 
-# Given a project location, compute the name of Boost library
+
+# Given a project location in normalized form (slashes are forward), compute the
+# name of the Boost library.
 local rule get-library-name ( path )
 {
     # Path is in normalized form, so all slashes are forward.
-
     local match1 = [ MATCH /libs/(.*)/(test|example) : $(path) ] ;
     local match2 = [ MATCH /libs/(.*)$ : $(path) ] ;
     local match3 = [ MATCH (/status$) : $(path) ] ;
@@ -184,19 +189,20 @@
     if $(match1) { return $(match1[0]) ; }
     else if $(match2) { return $(match2[0]) ; }
     else if $(match3) { return "" ; }
- else if --dump-tests in [ modules.peek : ARGV ]
- {
- # The 'run' rule and others might be used outside
- # boost. In that case, just return the path,
- # since the 'library name' makes no sense.
+ else if --dump-tests in [ modules.peek : ARGV ]
+ {
+ # The 'run' rule and others might be used outside boost. In that case,
+ # just return the path, since the 'library name' makes no sense.
         return $(path) ;
     }
 }
 
+
 # Was an XML dump requested?
 .out-xml = [ MATCH --out-xml=(.*) : [ modules.peek : ARGV ] ] ;
 
-# Take a target (instance of 'basic-target') and prints
+
+# Takes a target (instance of 'basic-target') and prints
 # - its type
 # - its name
 # - comments specified via the <test-info> property
@@ -206,44 +212,44 @@
     local type = [ $(target).type ] ;
     local name = [ $(target).name ] ;
     local project = [ $(target).project ] ;
-
+
     local project-root = [ $(project).get project-root ] ;
- local library = [ get-library-name
+ local library = [ get-library-name
         [ path.root [ $(project).get location ] [ path.pwd ] ] ] ;
     if $(library)
     {
         name = $(library)/$(name) ;
     }
-
+
     local sources = [ $(target).sources ] ;
     local source-files ;
     for local s in $(sources)
     {
- if [ class.is-a $(s) : file-reference ]
+ if [ class.is-a $(s) : file-reference ]
         {
- local location =
- [ path.root
+ local location =
+ [ path.root
                   [ path.root [ $(s).name ] [ $(s).location ] ]
- [ path.pwd ] ] ;
-
- source-files +=
- [ path.relative
+ [ path.pwd ] ] ;
+
+ source-files +=
+ [ path.relative
                   $(location)
                   [ path.root $(project-root) [ path.pwd ] ] ] ;
- }
+ }
     }
-
+
     local r = [ $(target).requirements ] ;
- # Extract values of the <test-info> feature
+ # Extract values of the <test-info> feature.
     local test-info = [ $(r).get <test-info> ] ;
-
- # If the user requested XML output on the command-line, add the
- # test info to that XML file rather than dumping them to stdout.
+
+ # If the user requested XML output on the command-line, add the test info to
+ # that XML file rather than dumping them to stdout.
     if $(.out-xml)
     {
         local nl = "
 " ;
- .contents on $(.out-xml) +=
+ .contents on $(.out-xml) +=
             "$(nl) <test type=\"$(type)\" name=\"$(name)\">"
             "$(nl) <info><![CDATA[$(test-info)]]></info>"
             "$(nl) <source><![CDATA[$(source-files)]]></source>"
@@ -252,123 +258,123 @@
     }
     else
     {
- # Format them into a single string of quoted strings
+ # Format them into a single string of quoted strings.
         test-info = \"$(test-info:J=\"\ \")\" ;
-
- ECHO boost-test($(type)) \"$(name)\"
- [$(test-info)]
- ":" \"$(source-files)\"
- ;
+
+ ECHO boost-test($(type)) \"$(name)\"
+ [$(test-info)]
+ ":" \"$(source-files)\" ;
     }
 }
 
-# Register generators. Depending on target type, either
-# 'expect-success' or 'expect-failure' rule will be used.
-generators.register-standard testing.expect-success : OBJ : COMPILE ;
-generators.register-standard testing.expect-failure : OBJ : COMPILE_FAIL ;
-generators.register-standard testing.expect-success : RUN_OUTPUT : RUN ;
-generators.register-standard testing.expect-failure : RUN_OUTPUT : RUN_FAIL ;
-generators.register-standard testing.expect-failure : EXE : LINK_FAIL ;
-generators.register-standard testing.expect-success : EXE : LINK ;
+
+# Register generators. Depending on target type, either 'expect-success' or
+# 'expect-failure' rule will be used.
+generators.register-standard testing.expect-success : OBJ : COMPILE ;
+generators.register-standard testing.expect-failure : OBJ : COMPILE_FAIL ;
+generators.register-standard testing.expect-success : RUN_OUTPUT : RUN ;
+generators.register-standard testing.expect-failure : RUN_OUTPUT : RUN_FAIL ;
+generators.register-standard testing.expect-failure : EXE : LINK_FAIL ;
+generators.register-standard testing.expect-success : EXE : LINK ;
 
 # Generator which runs an EXE and captures output.
 generators.register-standard testing.capture-output : EXE : RUN_OUTPUT ;
 
-# Generator which creates target if sources runs successfully.
-# Differers from RUN in that run output is not captured.
-# The reason why it exists is that the 'run' rule is much better for
-# automated testing, but is not user-friendly. See
+# Generator which creates a target if sources runs successfully. Differs from
+# RUN in that run output is not captured. The reason why it exists is that the
+# 'run' rule is much better for automated testing, but is not user-friendly. See
 # http://article.gmane.org/gmane.comp.lib.boost.build/6353/
 generators.register-standard testing.unit-test : EXE : UNIT_TEST ;
 
 
 # The action rules called by generators.
 
-# Causes the 'target' to exist after bjam invocation if and only if all the
+# Causes the 'target' to exist after bjam invocation if and only if all the
 # dependencies were successfully built.
 rule expect-success ( target : dependency + : requirements * )
 {
- **passed** $(target) : $(sources) ;
+ **passed** $(target) : $(sources) ;
 }
 
-# Causes the 'target' to exist after bjam invocation if and only if all some
-# of the dependencies were not successfully built.
+# Causes the 'target' to exist after bjam invocation if and only if all some of
+# the dependencies were not successfully built.
 rule expect-failure ( target : dependency + : properties * )
 {
     local grist = [ MATCH ^<(.*)> : $(dependency:G) ] ;
     local marker = $(dependency:G=$(grist)*fail) ;
     (failed-as-expected) $(marker) ;
- FAIL_EXPECTED $(dependency) ;
+ FAIL_EXPECTED $(dependency) ;
     LOCATE on $(marker) = [ on $(dependency) return $(LOCATE) ] ;
     RMOLD $(marker) ;
     DEPENDS $(marker) : $(dependency) ;
-
     DEPENDS $(target) : $(marker) ;
     **passed** $(target) : $(marker) ;
 }
 
-# The rule/action combination used to report successfull passing
-# of a test.
+
+# The rule/action combination used to report successfull passing of a test.
 rule **passed**
 {
- # Dump all the tests, if needed.
- # We do it here, since dump should happen after all Jamfiles are read,
- # and there's no such place currently defined (but should).
- if ! $(.dumped-tests) && --dump-tests in [ modules.peek : ARGV ]
+ # Dump all the tests, if needed. We do it here, since dump should happen
+ # only after all Jamfiles have been read, and there's no such place
+ # currently defined (but there should be).
+ if ! $(.dumped-tests) && --dump-tests in [ modules.peek : ARGV ]
     {
         .dumped-tests = true ;
         dump-tests ;
     }
-
- # Force deletion of the target, in case any dependencies failed
- # to build.
+
+ # Force deletion of the target, in case any dependencies failed to build.
     RMOLD $(<) ;
 }
 
+
 actions **passed**
 {
     echo passed > $(<)
 }
 
+
 actions (failed-as-expected)
 {
     echo failed as expected > $(<)
 }
 
+
 rule run-path-setup ( target : source : properties * )
 {
- # For testing, we need to make sure that all dynamic libraries needed by
- # the test are found. So, we collect all paths from dependency libraries
- # (via xdll-path property) and add whatever explicit dll-path user has
- # specified. The resulting paths are added to environment on each test
- # invocation.
+ # For testing, we need to make sure that all dynamic libraries needed by the
+ # test are found. So, we collect all paths from dependency libraries (via
+ # xdll-path property) and add whatever explicit dll-path user has specified.
+ # The resulting paths are added to the environment on each test invocation.
     local dll-paths = [ feature.get-values <dll-path> : $(properties) ] ;
     dll-paths += [ feature.get-values <xdll-path> : $(properties) ] ;
     dll-paths += [ on $(source) return $(RUN_PATH) ] ;
     dll-paths = [ sequence.unique $(dll-paths) ] ;
     if $(dll-paths)
- {
+ {
         dll-paths = [ sequence.transform path.native : $(dll-paths) ] ;
-
- PATH_SETUP on $(target) =
- [ common.prepend-path-variable-command
- [ os.shared-library-path-variable ] : $(dll-paths) ] ;
- }
+ PATH_SETUP on $(target) = [ common.prepend-path-variable-command
+ [ os.shared-library-path-variable ] : $(dll-paths) ] ;
+ }
 }
 
+
 local argv = [ modules.peek : ARGV ] ;
 if --preserve-test-targets in $(argv)
 {
     preserve-test-targets = true ;
 }
 
+
 toolset.flags testing.capture-output ARGS <testing.arg> ;
 toolset.flags testing.capture-output INPUT_FILES <testing.input-file> ;
 toolset.flags testing.capture-output LAUNCHER <testing.launcher> ;
 
-# Runs executable 'sources' and stores stdout in file 'target'.
-# If --preserve-test-targets command line option, removes the executable.
-# The 'target-to-remove' parameter controls what should be removed:
+
+# Runs executable 'sources' and stores stdout in file 'target'. Unless
+# --preserve-test-targets command line option has been specified, removes the
+# executable. The 'target-to-remove' parameter controls what should be removed:
 # - if 'none', does not remove anything, ever
 # - if empty, removes 'source'
 # - if non-empty and not 'none', contains a list of sources to remove.
@@ -376,19 +382,20 @@
 {
     output-file on $(target) = $(target:S=.output) ;
     LOCATE on $(target:S=.output) = [ on $(target) return $(LOCATE) ] ;
-
+
     # The INCLUDES kill a warning about independent target...
     INCLUDES $(target) : $(target:S=.output) ;
- # but it also puts .output into dependency graph, so we must tell jam
- # it's OK if it cannot find the target or updating rule.
- NOCARE $(target:S=.output) ;
-
+ # but it also puts .output into dependency graph, so we must tell jam it's
+ # OK if it cannot find the target or updating rule.
+ NOCARE $(target:S=.output) ;
+
     # This has two-fold effect. First it adds input files to the dependendency
     # graph, preventing a warning. Second, it causes input files to be bound
- # before target is created. Therefore, they are bound using SEARCH setting
- # on them and not LOCATE setting of $(target), as in other case (due to jam bug).
+ # before target is created. Therefore, they are bound using SEARCH setting
+ # on them and not LOCATE setting of $(target), as in other case (due to jam
+ # bug).
     DEPENDS $(target) : [ on $(target) return $(INPUT_FILES) ] ;
-
+
     if $(targets-to-remove) = none
     {
         targets-to-remove = ;
@@ -397,23 +404,19 @@
     {
         targets-to-remove = $(source) ;
     }
-
+
     run-path-setup $(target) : $(source) : $(properties) ;
-
+
     if ! $(preserve-test-targets)
     {
         TEMPORARY $(targets-to-remove) ;
- # Set a second action on target that will
- # be executed after capture output action.
- # The 'RmTemps' rule has the 'ignore' modifier
- # so it's always considered succeeded.
- # This is needed for 'run-fail' test. For that
- # test the target will be marked with FAIL_EXPECTED,
- # and without 'ingore' successfull execution
- # will be negated and be reported as failure.
- # With 'ignore' we don't detect a case where
- # removing files, but it's not likely to
- # happen.
+ # Set a second action on target that will be executed after capture
+ # output action. The 'RmTemps' rule has the 'ignore' modifier so it's
+ # always considered succeeded. This is needed for 'run-fail' test. For
+ # that test the target will be marked with FAIL_EXPECTED, and without
+ # 'ignore' successful execution will be negated and be reported as
+ # failure. With 'ignore' we don't detect a case where removing files
+ # fails, but it's not likely to happen.
         RmTemps $(target) : $(targets-to-remove) ;
     }
 }
@@ -421,34 +424,32 @@
 
 if [ os.name ] = NT
 {
- STATUS = %status% ;
- SET_STATUS = "set status=%ERRORLEVEL%" ;
+ STATUS = %status% ;
+ SET_STATUS = "set status=%ERRORLEVEL%" ;
     RUN_OUTPUT_NL = "echo." ;
- STATUS_0 = "%status% EQU 0 (" ;
- STATUS_NOT_0 = "%status% NEQ 0 (" ;
- VERBOSE = "%verbose% EQU 1 (" ;
- ENDIF = ")" ;
- SHELL_SET = "set " ;
-
- CATENATE = type ;
- CP = copy ;
+ STATUS_0 = "%status% EQU 0 (" ;
+ STATUS_NOT_0 = "%status% NEQ 0 (" ;
+ VERBOSE = "%verbose% EQU 1 (" ;
+ ENDIF = ")" ;
+ SHELL_SET = "set " ;
+ CATENATE = type ;
+ CP = copy ;
 }
 else
 {
- STATUS = "$status" ;
- SET_STATUS = "status=$?" ;
+ STATUS = "$status" ;
+ SET_STATUS = "status=$?" ;
     RUN_OUTPUT_NL = "echo" ;
- STATUS_0 = "test $status -eq 0 ; then" ;
- STATUS_NOT_0 = "test $status -ne 0 ; then" ;
- VERBOSE = "test $verbose -eq 1 ; then" ;
- ENDIF = "fi" ;
- SHELL_SET = "" ;
-
- CATENATE = cat ;
- CP = cp ;
+ STATUS_0 = "test $status -eq 0 ; then" ;
+ STATUS_NOT_0 = "test $status -ne 0 ; then" ;
+ VERBOSE = "test $verbose -eq 1 ; then" ;
+ ENDIF = "fi" ;
+ SHELL_SET = "" ;
+ CATENATE = cat ;
+ CP = cp ;
 }
 
-if --verbose-test in [ modules.peek : ARGV ]
+if --verbose-test in [ modules.peek : ARGV ]
 {
     VERBOSE_TEST = 1 ;
 }
@@ -460,10 +461,11 @@
 
 RM = [ common.rm-command ] ;
 
+
 actions capture-output bind INPUT_FILES output-file
 {
     $(PATH_SETUP)
- $(LAUNCHER) "$(>)" $(ARGS) "$(INPUT_FILES)" > "$(output-file)" 2>&1
+ $(LAUNCHER) "$(>)" $(ARGS) "$(INPUT_FILES)" > "$(output-file)" 2>&1
     $(SET_STATUS)
     $(RUN_OUTPUT_NL) >> "$(output-file)"
     echo EXIT STATUS: $(STATUS) >> "$(output-file)"
@@ -478,15 +480,17 @@
         echo ====== BEGIN OUTPUT ======
         $(CATENATE) "$(output-file)"
         echo ====== END OUTPUT ======
- $(ENDIF)
- exit $(STATUS)
+ $(ENDIF)
+ exit $(STATUS)
 }
 
+
 actions quietly updated ignore piecemeal together RmTemps
 {
     $(RM) "$(>)"
 }
 
+
 MAKE_FILE = [ common.file-creation-command ] ;
 
 toolset.flags testing.unit-test LAUNCHER <testing.launcher> ;
@@ -496,19 +500,21 @@
     run-path-setup $(target) : $(source) : $(properties) ;
 }
 
-actions unit-test
+
+actions unit-test
 {
     $(PATH_SETUP)
     $(LAUNCHER) $(>) $(ARGS) && $(MAKE_FILE) $(<)
 }
 
-IMPORT $(__name__) : compile compile-fail run run-fail link link-fail
- : : compile compile-fail run run-fail link link-fail ;
+IMPORT $(__name__) : compile compile-fail run run-fail link link-fail
+ : : compile compile-fail run run-fail link link-fail ;
 
 
 type.register TIME : time ;
 generators.register-standard testing.time : : TIME ;
 
+
 rule record-time ( target : source : start end user system )
 {
     local src-string = [$(source:G=:J=",")"] " ;
@@ -517,21 +523,24 @@
 }
 
 IMPORT testing : record-time : : testing.record-time ;
+
+
 rule time ( target : source : properties * )
 {
- # Set up rule for recording timing information
+ # Set up rule for recording timing information.
     __TIMING_RULE__ on $(source) = testing.record-time $(target) ;
-
- # Make sure that the source is rebuilt any time we need to
- # retrieve that information
+
+ # Make sure that the source is rebuilt any time we need to retrieve that
+ # information.
     REBUILDS $(target) : $(source) ;
 }
 
+
 actions time
 {
     echo user: $(USER_TIME)
     echo system: $(SYSTEM_TIME)
-
+
     echo user: $(USER_TIME)" seconds" > $(<)
     echo system: $(SYSTEM_TIME)" seconds" > $(<)
 }

Modified: trunk/tools/build/v2/util/indirect.jam
==============================================================================
--- trunk/tools/build/v2/util/indirect.jam (original)
+++ trunk/tools/build/v2/util/indirect.jam 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -1,14 +1,16 @@
-# Copyright 2003 Dave Abrahams
-# Copyright 2003 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2003 Dave Abrahams
+# Copyright 2003 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
 import modules ;
 import numbers ;
 
-# The pattern that indirect rules must match: module$rule
+
+# The pattern that indirect rules must match: module%rule
 .pattern = ^([^%]*)%([^%]+)$ ;
-
+
+
 #
 # Type checking rules.
 #
@@ -16,14 +18,15 @@
 {
     if ! [ MATCH $(.pattern) : $(x) ]
     {
- return "expected a string of the form module$rule, but got \""$(x)"\" for argument" ;
+ return "expected a string of the form module%rule, but got \""$(x)"\" for argument" ;
     }
 }
 
-# make an indirect rule which calls the given rule; if context is
-# supplied it is expected to be the module in which to invoke the rule
-# by the 'call' rule below. Otherwise, the rule will be invoked in
-# the module of this rule's caller.
+
+# Make an indirect rule which calls the given rule. If context is supplied it is
+# expected to be the module in which to invoke the rule by the 'call' rule
+# below. Otherwise, the rule will be invoked in the module of this rule's
+# caller.
 rule make ( rulename bound-args * : context ? )
 {
     context ?= [ CALLER_MODULE ] ;
@@ -31,12 +34,12 @@
     return $(context)%$(rulename) $(bound-args) ;
 }
 
-# make an indirect rule which calls the given rule. rulename may be a
-# qualified rule; if so it is returned unchanged. Otherwise, if
-# frames is not supplied, the result will be invoked (by 'call',
-# below) in the module of the caller. Otherwise, frames > 1
-# specifies additional call frames to back up in order to find the
-# module context.
+
+# Make an indirect rule which calls the given rule. 'rulename' may be a
+# qualified rule; if so it is returned unchanged. Otherwise, if frames is not
+# supplied, the result will be invoked (by 'call', below) in the module of the
+# caller. Otherwise, frames > 1 specifies additional call frames to back up in
+# order to find the module context.
 rule make-qualified ( rulename bound-args * : frames ? )
 {
     if [ MATCH $(.pattern) : $(rulename) ]
@@ -46,17 +49,16 @@
     else
     {
         frames ?= 1 ;
- # Take the first dot-separated element as module name.
- # This disallows module names with dots, but allows rule names
- # with dots.
+ # Take the first dot-separated element as module name. This disallows
+ # module names with dots, but allows rule names with dots.
         local module-context = [ MATCH ^([^.]*)\\..* : $(rulename) ] ;
         module-context ?= [ CALLER_MODULE $(frames) ] ;
         return [ make $(rulename) $(bound-args) : $(module-context) ] ;
     }
 }
 
-# return the module name in which the given indirect rule will be
-# invoked.
+
+# Returns the module name in which the given indirect rule will be invoked.
 rule get-module ( [indirect-rule] x )
 {
     local m = [ MATCH $(.pattern) : $(x) ] ;
@@ -67,37 +69,36 @@
     return $(m[1]) ;
 }
 
-# return the rulename that will be called when x is invoked
+
+# Returns the rulename that will be called when x is invoked.
 rule get-rule ( [indirect-rule] x )
 {
     local m = [ MATCH $(.pattern) : $(x) ] ;
     return $(m[2]) ;
 }
 
+
 # Invoke the given indirect-rule.
 rule call ( [indirect-rule] r args * : * )
 {
- return [
- modules.call-in [ get-module $(r) ]
- : [ get-rule $(r) ] $(args) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9)
- ] ;
+ return [ modules.call-in [ get-module $(r) ] : [ get-rule $(r) ] $(args)
+ : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ] ;
 }
 
+
 rule __test__
 {
     import assert ;
-
+
     rule foo-barr! ( x )
     {
         assert.equal $(x) : x ;
     }
-
+
     assert.equal [ get-rule [ make foo-barr! ] ] : foo-barr! ;
     assert.equal [ get-module [ make foo-barr! ] ] : [ CALLER_MODULE ] ;
-
+
     call [ make foo-barr! ] x ;
     call [ make foo-barr! x ] ;
-
-
     call [ make foo-barr! : [ CALLER_MODULE ] ] x ;
 }

Modified: trunk/tools/jam/src/build.bat
==============================================================================
--- trunk/tools/jam/src/build.bat (original)
+++ trunk/tools/jam/src/build.bat 2008-01-05 15:02:24 EST (Sat, 05 Jan 2008)
@@ -40,7 +40,7 @@
 
 
 :Test_Option
-REM Tests wether the given string is in the form of an option: "--*"
+REM Tests whether the given string is in the form of an option: "--*"
 setlocal & endlocal
 setlocal
 set test=%1


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk