[pkg-boost-commits] r14016 - in boost-build/branches/upstream/current: . build debian doc doc/html doc/html/bbv2 doc/html/bbv2/advanced doc/html/bbv2/advanced/builtins doc/html/bbv2/arch doc/html/bbv2/extending doc/html/bbv2/faq doc/html/bbv2/recipies doc/html/bbv2/reference doc/html/bbv2/tutorial doc/html/images doc/html/jam doc/src example example/customization example/gettext example/hello example/libraries example/libraries/app example/libraries/util example/libraries/util/foo example/libraries/util/foo/include example/make example/python_modules example/qt example/qt/qt3 example/qt/qt3/hello example/qt/qt3/moccable-cpp example/qt/qt3/uic example/qt/qt4 example/qt/qt4/hello example/qt/qt4/moccable-cpp example/qt/qt4/uic jam_src jam_src/debian jam_src/modules kernel notes options test test/boostbook test/dependency-test test/dependency-test/src1 test/generators-test test/prebuilt/ext test/project-test3 test/project-test3/lib3 test/project-test4 test/railsys/libx test/railsys/program tools tools/types util

Domenico Andreoli cavok at alioth.debian.org
Thu Nov 9 10:53:36 CET 2006


Author: cavok
Date: 2006-11-09 10:53:31 +0100 (Thu, 09 Nov 2006)
New Revision: 14016

Added:
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/configuration.html
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/invocation.html
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/other-rules.html
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/projects.html
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/targets.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/envar.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/header-only-libraries.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/s05.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/s08.html
   boost-build/branches/upstream/current/doc/html/bbv2/jam.html
   boost-build/branches/upstream/current/doc/html/bbv2/tutorial/testing.html
   boost-build/branches/upstream/current/doc/html/images/next_disabled.png
   boost-build/branches/upstream/current/doc/html/images/prev_disabled.png
   boost-build/branches/upstream/current/doc/html/images/up_disabled.png
   boost-build/branches/upstream/current/doc/html/jam/
   boost-build/branches/upstream/current/doc/html/jam/building.html
   boost-build/branches/upstream/current/doc/html/jam/language.html
   boost-build/branches/upstream/current/doc/html/jam/miscellaneous.html
   boost-build/branches/upstream/current/doc/html/jam/usage.html
   boost-build/branches/upstream/current/doc/src/standalone.xml
   boost-build/branches/upstream/current/doc/userman.pdf
   boost-build/branches/upstream/current/example/hello/Jamroot
   boost-build/branches/upstream/current/example/libraries/Jamroot
   boost-build/branches/upstream/current/example/libraries/util/
   boost-build/branches/upstream/current/example/libraries/util/foo/
   boost-build/branches/upstream/current/example/libraries/util/foo/Jamfile
   boost-build/branches/upstream/current/example/libraries/util/foo/bar.cpp
   boost-build/branches/upstream/current/example/libraries/util/foo/include/
   boost-build/branches/upstream/current/example/libraries/util/foo/include/lib1.h
   boost-build/branches/upstream/current/example/make/
   boost-build/branches/upstream/current/example/make/Jamroot
   boost-build/branches/upstream/current/example/make/main.cpp.pro
   boost-build/branches/upstream/current/example/make/readme.txt
   boost-build/branches/upstream/current/example/python_modules/
   boost-build/branches/upstream/current/example/python_modules/Jamroot
   boost-build/branches/upstream/current/example/python_modules/python_helpers.jam
   boost-build/branches/upstream/current/example/python_modules/python_helpers.py
   boost-build/branches/upstream/current/example/python_modules/readme.txt
   boost-build/branches/upstream/current/example/qt/README.txt
   boost-build/branches/upstream/current/example/qt/qt3/
   boost-build/branches/upstream/current/example/qt/qt3/hello/
   boost-build/branches/upstream/current/example/qt/qt3/hello/Jamroot
   boost-build/branches/upstream/current/example/qt/qt3/hello/canvas.cpp
   boost-build/branches/upstream/current/example/qt/qt3/hello/canvas.h
   boost-build/branches/upstream/current/example/qt/qt3/hello/main.cpp
   boost-build/branches/upstream/current/example/qt/qt3/moccable-cpp/
   boost-build/branches/upstream/current/example/qt/qt3/moccable-cpp/Jamroot
   boost-build/branches/upstream/current/example/qt/qt3/moccable-cpp/main.cpp
   boost-build/branches/upstream/current/example/qt/qt3/uic/
   boost-build/branches/upstream/current/example/qt/qt3/uic/Jamroot
   boost-build/branches/upstream/current/example/qt/qt3/uic/hello_world_widget.ui
   boost-build/branches/upstream/current/example/qt/qt3/uic/main.cpp
   boost-build/branches/upstream/current/example/qt/qt4/
   boost-build/branches/upstream/current/example/qt/qt4/hello/
   boost-build/branches/upstream/current/example/qt/qt4/hello/Jamroot
   boost-build/branches/upstream/current/example/qt/qt4/hello/arrow.cpp
   boost-build/branches/upstream/current/example/qt/qt4/hello/arrow.h
   boost-build/branches/upstream/current/example/qt/qt4/hello/main.cpp
   boost-build/branches/upstream/current/example/qt/qt4/moccable-cpp/
   boost-build/branches/upstream/current/example/qt/qt4/moccable-cpp/Jamroot
   boost-build/branches/upstream/current/example/qt/qt4/moccable-cpp/main.cpp
   boost-build/branches/upstream/current/example/qt/qt4/uic/
   boost-build/branches/upstream/current/example/qt/qt4/uic/Jamroot
   boost-build/branches/upstream/current/example/qt/qt4/uic/hello_world_widget.ui
   boost-build/branches/upstream/current/example/qt/qt4/uic/main.cpp
   boost-build/branches/upstream/current/jam_src/debug.c
   boost-build/branches/upstream/current/jam_src/debug.h
   boost-build/branches/upstream/current/notes/
   boost-build/branches/upstream/current/notes/README.txt
   boost-build/branches/upstream/current/notes/build_dir_option.txt
   boost-build/branches/upstream/current/notes/relative_source_paths.txt
   boost-build/branches/upstream/current/test/.cvsignore
   boost-build/branches/upstream/current/test/abs_workdir.py
   boost-build/branches/upstream/current/test/boostbook.py
   boost-build/branches/upstream/current/test/boostbook/
   boost-build/branches/upstream/current/test/boostbook/Jamroot
   boost-build/branches/upstream/current/test/boostbook/a.hpp
   boost-build/branches/upstream/current/test/boostbook/docs.xml
   boost-build/branches/upstream/current/test/build_file.py
   boost-build/branches/upstream/current/test/build_no.py
   boost-build/branches/upstream/current/test/clean.py
   boost-build/branches/upstream/current/test/dependency-test/a_c.c
   boost-build/branches/upstream/current/test/disambiguation.py
   boost-build/branches/upstream/current/test/example_customization.py
   boost-build/branches/upstream/current/test/example_gettext.py
   boost-build/branches/upstream/current/test/example_libraries.py
   boost-build/branches/upstream/current/test/example_make.py
   boost-build/branches/upstream/current/test/example_qt4.py
   boost-build/branches/upstream/current/test/generators-test/c.tui
   boost-build/branches/upstream/current/test/implicit_dependency.py
   boost-build/branches/upstream/current/test/indirect_conditional.py
   boost-build/branches/upstream/current/test/lib_source_property.py
   boost-build/branches/upstream/current/test/load_order.py
   boost-build/branches/upstream/current/test/notfile.py
   boost-build/branches/upstream/current/test/out_of_tree.py
   boost-build/branches/upstream/current/test/project_root_rule.py
   boost-build/branches/upstream/current/test/rebuilds.py
   boost-build/branches/upstream/current/test/resolution.py
   boost-build/branches/upstream/current/test/source_locations.py
   boost-build/branches/upstream/current/test/timedata.py
   boost-build/branches/upstream/current/test/using.py
   boost-build/branches/upstream/current/test/wrong_project.py
   boost-build/branches/upstream/current/timestamp.txt
   boost-build/branches/upstream/current/tools/acc.jam
   boost-build/branches/upstream/current/tools/boostbook-config.jam
   boost-build/branches/upstream/current/tools/cast.jam
   boost-build/branches/upstream/current/tools/cw-config.jam
   boost-build/branches/upstream/current/tools/dmc.jam
   boost-build/branches/upstream/current/tools/docutils.jam
   boost-build/branches/upstream/current/tools/doxygen-config.jam
   boost-build/branches/upstream/current/tools/fortran.jam
   boost-build/branches/upstream/current/tools/gfortran.jam
   boost-build/branches/upstream/current/tools/hp_cxx.jam
   boost-build/branches/upstream/current/tools/hpfortran.jam
   boost-build/branches/upstream/current/tools/ifort.jam
   boost-build/branches/upstream/current/tools/mc.jam
   boost-build/branches/upstream/current/tools/midl.jam
   boost-build/branches/upstream/current/tools/msvc-config.jam
   boost-build/branches/upstream/current/tools/notfile.jam
   boost-build/branches/upstream/current/tools/package.jam
   boost-build/branches/upstream/current/tools/pch.jam
   boost-build/branches/upstream/current/tools/python-config.jam
   boost-build/branches/upstream/current/tools/python.jam
   boost-build/branches/upstream/current/tools/qcc.jam
   boost-build/branches/upstream/current/tools/qt3.jam
   boost-build/branches/upstream/current/tools/qt4.jam
   boost-build/branches/upstream/current/tools/quickbook-config.jam
   boost-build/branches/upstream/current/tools/quickbook.jam
   boost-build/branches/upstream/current/tools/types/
   boost-build/branches/upstream/current/tools/types/asm.jam
   boost-build/branches/upstream/current/tools/types/cpp.jam
   boost-build/branches/upstream/current/tools/types/exe.jam
   boost-build/branches/upstream/current/tools/types/html.jam
   boost-build/branches/upstream/current/tools/types/lib.jam
   boost-build/branches/upstream/current/tools/types/obj.jam
   boost-build/branches/upstream/current/tools/types/qt.jam
   boost-build/branches/upstream/current/tools/types/register.jam
   boost-build/branches/upstream/current/tools/types/rsp.jam
   boost-build/branches/upstream/current/tools/whale.jam
   boost-build/branches/upstream/current/tools/xlf.jam
   boost-build/branches/upstream/current/tools/xsltproc-config.jam
   boost-build/branches/upstream/current/util/option.jam
Removed:
   boost-build/branches/upstream/current/build/project-roots.jam
   boost-build/branches/upstream/current/doc/catalog.xml
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/jamfiles.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/s03.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/s06.html
   boost-build/branches/upstream/current/doc/html/bbv2/tutorial/depends.html
   boost-build/branches/upstream/current/doc/tracker.html
   boost-build/branches/upstream/current/example/hello/Jamfile
   boost-build/branches/upstream/current/example/hello/project-root.jam
   boost-build/branches/upstream/current/example/libraries/Jamfile
   boost-build/branches/upstream/current/example/libraries/lib1/
   boost-build/branches/upstream/current/example/libraries/project-root.jam
   boost-build/branches/upstream/current/example/qt-ui/
   boost-build/branches/upstream/current/example/qt/Jamfile
   boost-build/branches/upstream/current/example/qt/canvas.cpp
   boost-build/branches/upstream/current/example/qt/canvas.h
   boost-build/branches/upstream/current/example/qt/main.cpp
   boost-build/branches/upstream/current/example/qt/project-root.jam
   boost-build/branches/upstream/current/jam_src/Jam.html
   boost-build/branches/upstream/current/jam_src/Jambase.html
   boost-build/branches/upstream/current/jam_src/Jamfile.html
   boost-build/branches/upstream/current/jam_src/Porting
   boost-build/branches/upstream/current/jam_src/README
   boost-build/branches/upstream/current/jam_src/RELNOTES
   boost-build/branches/upstream/current/jam_src/index.html
   boost-build/branches/upstream/current/test/generators-test/c.ui
   boost-build/branches/upstream/current/test/project_root.py
Modified:
   boost-build/branches/upstream/current/build-system.jam
   boost-build/branches/upstream/current/build/alias.jam
   boost-build/branches/upstream/current/build/build-request.jam
   boost-build/branches/upstream/current/build/feature.jam
   boost-build/branches/upstream/current/build/generators.jam
   boost-build/branches/upstream/current/build/modifiers.jam
   boost-build/branches/upstream/current/build/project.jam
   boost-build/branches/upstream/current/build/property-set.jam
   boost-build/branches/upstream/current/build/property.jam
   boost-build/branches/upstream/current/build/scanner.jam
   boost-build/branches/upstream/current/build/targets.jam
   boost-build/branches/upstream/current/build/toolset.jam
   boost-build/branches/upstream/current/build/type.jam
   boost-build/branches/upstream/current/build/version.jam
   boost-build/branches/upstream/current/build/virtual-target.jam
   boost-build/branches/upstream/current/debian/rules
   boost-build/branches/upstream/current/doc/Jamfile.v2
   boost-build/branches/upstream/current/doc/html/HTML.manifest
   boost-build/branches/upstream/current/doc/html/bbv2/advanced.html
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/build_process.html
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/builtins/features.html
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/builtins/targets.html
   boost-build/branches/upstream/current/doc/html/bbv2/advanced/differences_to_v1.html
   boost-build/branches/upstream/current/doc/html/bbv2/arch.html
   boost-build/branches/upstream/current/doc/html/bbv2/arch/build.html
   boost-build/branches/upstream/current/doc/html/bbv2/arch/targets.html
   boost-build/branches/upstream/current/doc/html/bbv2/arch/tools.html
   boost-build/branches/upstream/current/doc/html/bbv2/extender.html
   boost-build/branches/upstream/current/doc/html/bbv2/extending/features.html
   boost-build/branches/upstream/current/doc/html/bbv2/extending/rules.html
   boost-build/branches/upstream/current/doc/html/bbv2/extending/targets.html
   boost-build/branches/upstream/current/doc/html/bbv2/extending/tools.html
   boost-build/branches/upstream/current/doc/html/bbv2/extending/toolset_modules.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/dll-path.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/external.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/s02.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/s04.html
   boost-build/branches/upstream/current/doc/html/bbv2/faq/s07.html
   boost-build/branches/upstream/current/doc/html/bbv2/howto.html
   boost-build/branches/upstream/current/doc/html/bbv2/installation.html
   boost-build/branches/upstream/current/doc/html/bbv2/recipies/site-config.html
   boost-build/branches/upstream/current/doc/html/bbv2/reference.html
   boost-build/branches/upstream/current/doc/html/bbv2/reference/buildprocess.html
   boost-build/branches/upstream/current/doc/html/bbv2/reference/definitions.html
   boost-build/branches/upstream/current/doc/html/bbv2/reference/generators.html
   boost-build/branches/upstream/current/doc/html/bbv2/reference/jamfiles.html
   boost-build/branches/upstream/current/doc/html/bbv2/tutorial.html
   boost-build/branches/upstream/current/doc/html/bbv2/tutorial/conditions.html
   boost-build/branches/upstream/current/doc/html/bbv2/tutorial/hierarchy.html
   boost-build/branches/upstream/current/doc/html/bbv2/tutorial/libs.html
   boost-build/branches/upstream/current/doc/html/bbv2/tutorial/linkage.html
   boost-build/branches/upstream/current/doc/html/bbv2/tutorial/prebuilt.html
   boost-build/branches/upstream/current/doc/html/bbv2/tutorial/properties.html
   boost-build/branches/upstream/current/doc/html/boostbook.css
   boost-build/branches/upstream/current/doc/html/images/caution.png
   boost-build/branches/upstream/current/doc/html/images/important.png
   boost-build/branches/upstream/current/doc/html/images/note.png
   boost-build/branches/upstream/current/doc/html/images/tip.png
   boost-build/branches/upstream/current/doc/html/images/warning.png
   boost-build/branches/upstream/current/doc/html/index.html
   boost-build/branches/upstream/current/doc/src/advanced.xml
   boost-build/branches/upstream/current/doc/src/architecture.xml
   boost-build/branches/upstream/current/doc/src/extending.xml
   boost-build/branches/upstream/current/doc/src/faq.xml
   boost-build/branches/upstream/current/doc/src/howto.xml
   boost-build/branches/upstream/current/doc/src/install.xml
   boost-build/branches/upstream/current/doc/src/reference.xml
   boost-build/branches/upstream/current/doc/src/tutorial.xml
   boost-build/branches/upstream/current/doc/src/userman.xml
   boost-build/branches/upstream/current/example/customization/inline_file.py
   boost-build/branches/upstream/current/example/gettext/Jamfile
   boost-build/branches/upstream/current/example/libraries/app/Jamfile
   boost-build/branches/upstream/current/hacking.txt
   boost-build/branches/upstream/current/index.html
   boost-build/branches/upstream/current/jam_src/Jambase
   boost-build/branches/upstream/current/jam_src/boost-jam.spec
   boost-build/branches/upstream/current/jam_src/build.bat
   boost-build/branches/upstream/current/jam_src/build.jam
   boost-build/branches/upstream/current/jam_src/build.sh
   boost-build/branches/upstream/current/jam_src/builtins.c
   boost-build/branches/upstream/current/jam_src/builtins.h
   boost-build/branches/upstream/current/jam_src/bump_version.py
   boost-build/branches/upstream/current/jam_src/command.c
   boost-build/branches/upstream/current/jam_src/compile.c
   boost-build/branches/upstream/current/jam_src/compile.h
   boost-build/branches/upstream/current/jam_src/debian/changelog
   boost-build/branches/upstream/current/jam_src/debian/copyright
   boost-build/branches/upstream/current/jam_src/debian/rules
   boost-build/branches/upstream/current/jam_src/execcmd.h
   boost-build/branches/upstream/current/jam_src/execnt.c
   boost-build/branches/upstream/current/jam_src/execunix.c
   boost-build/branches/upstream/current/jam_src/expand.c
   boost-build/branches/upstream/current/jam_src/filemac.c
   boost-build/branches/upstream/current/jam_src/filent.c
   boost-build/branches/upstream/current/jam_src/filesys.c
   boost-build/branches/upstream/current/jam_src/filesys.h
   boost-build/branches/upstream/current/jam_src/fileunix.c
   boost-build/branches/upstream/current/jam_src/frames.h
   boost-build/branches/upstream/current/jam_src/hash.c
   boost-build/branches/upstream/current/jam_src/hash.h
   boost-build/branches/upstream/current/jam_src/jam.c
   boost-build/branches/upstream/current/jam_src/jam.h
   boost-build/branches/upstream/current/jam_src/jambase.c
   boost-build/branches/upstream/current/jam_src/lists.c
   boost-build/branches/upstream/current/jam_src/make.c
   boost-build/branches/upstream/current/jam_src/make1.c
   boost-build/branches/upstream/current/jam_src/modules.c
   boost-build/branches/upstream/current/jam_src/modules.h
   boost-build/branches/upstream/current/jam_src/modules/order.c
   boost-build/branches/upstream/current/jam_src/modules/path.c
   boost-build/branches/upstream/current/jam_src/modules/property-set.c
   boost-build/branches/upstream/current/jam_src/modules/regex.c
   boost-build/branches/upstream/current/jam_src/modules/sequence.c
   boost-build/branches/upstream/current/jam_src/modules/set.c
   boost-build/branches/upstream/current/jam_src/native.c
   boost-build/branches/upstream/current/jam_src/native.h
   boost-build/branches/upstream/current/jam_src/newstr.c
   boost-build/branches/upstream/current/jam_src/option.c
   boost-build/branches/upstream/current/jam_src/parse.c
   boost-build/branches/upstream/current/jam_src/patchlevel.h
   boost-build/branches/upstream/current/jam_src/pathsys.h
   boost-build/branches/upstream/current/jam_src/pathunix.c
   boost-build/branches/upstream/current/jam_src/pwd.c
   boost-build/branches/upstream/current/jam_src/regexp.c
   boost-build/branches/upstream/current/jam_src/rules.c
   boost-build/branches/upstream/current/jam_src/rules.h
   boost-build/branches/upstream/current/jam_src/scan.c
   boost-build/branches/upstream/current/jam_src/strings.c
   boost-build/branches/upstream/current/jam_src/strings.h
   boost-build/branches/upstream/current/jam_src/timestamp.c
   boost-build/branches/upstream/current/jam_src/variable.c
   boost-build/branches/upstream/current/jam_src/variable.h
   boost-build/branches/upstream/current/jam_src/w32_getreg.c
   boost-build/branches/upstream/current/kernel/boost-build.jam
   boost-build/branches/upstream/current/kernel/bootstrap.jam
   boost-build/branches/upstream/current/kernel/class.jam
   boost-build/branches/upstream/current/kernel/errors.jam
   boost-build/branches/upstream/current/kernel/modules.jam
   boost-build/branches/upstream/current/options/help.jam
   boost-build/branches/upstream/current/test/BoostBuild.py
   boost-build/branches/upstream/current/test/TestCmd.py
   boost-build/branches/upstream/current/test/absolute_sources.py
   boost-build/branches/upstream/current/test/alias.py
   boost-build/branches/upstream/current/test/alternatives.py
   boost-build/branches/upstream/current/test/bad_dirname.py
   boost-build/branches/upstream/current/test/build_dir.py
   boost-build/branches/upstream/current/test/c_file.py
   boost-build/branches/upstream/current/test/chain.py
   boost-build/branches/upstream/current/test/composite.py
   boost-build/branches/upstream/current/test/conditionals.py
   boost-build/branches/upstream/current/test/conditionals2.py
   boost-build/branches/upstream/current/test/conditionals3.py
   boost-build/branches/upstream/current/test/core_d12.py
   boost-build/branches/upstream/current/test/core_delete_module.py
   boost-build/branches/upstream/current/test/core_dependencies.py
   boost-build/branches/upstream/current/test/core_import_module.py
   boost-build/branches/upstream/current/test/core_modifiers.py
   boost-build/branches/upstream/current/test/core_typecheck.py
   boost-build/branches/upstream/current/test/core_varnames.py
   boost-build/branches/upstream/current/test/custom_generator.py
   boost-build/branches/upstream/current/test/default_features.py
   boost-build/branches/upstream/current/test/dependency-test/Jamfile
   boost-build/branches/upstream/current/test/dependency-test/foo.jam
   boost-build/branches/upstream/current/test/dependency-test/src1/z.h
   boost-build/branches/upstream/current/test/dependency_property.py
   boost-build/branches/upstream/current/test/dependency_test.py
   boost-build/branches/upstream/current/test/direct_request_test.py
   boost-build/branches/upstream/current/test/dll_path.py
   boost-build/branches/upstream/current/test/double_loading.py
   boost-build/branches/upstream/current/test/duplicate.py
   boost-build/branches/upstream/current/test/expansion.py
   boost-build/branches/upstream/current/test/explicit.py
   boost-build/branches/upstream/current/test/gcc_runtime.py
   boost-build/branches/upstream/current/test/generators-test/Jamfile
   boost-build/branches/upstream/current/test/generators-test/extra.jam
   boost-build/branches/upstream/current/test/generators-test/lex.jam
   boost-build/branches/upstream/current/test/generators-test/project-root.jam
   boost-build/branches/upstream/current/test/generators_test.py
   boost-build/branches/upstream/current/test/glob.py
   boost-build/branches/upstream/current/test/inherit_toolset.py
   boost-build/branches/upstream/current/test/inline.py
   boost-build/branches/upstream/current/test/library_chain.py
   boost-build/branches/upstream/current/test/library_order.py
   boost-build/branches/upstream/current/test/library_property.py
   boost-build/branches/upstream/current/test/load_dir.py
   boost-build/branches/upstream/current/test/loop.py
   boost-build/branches/upstream/current/test/m1-01.py
   boost-build/branches/upstream/current/test/m1-02.py
   boost-build/branches/upstream/current/test/m1-03.py
   boost-build/branches/upstream/current/test/make_rule.py
   boost-build/branches/upstream/current/test/ndebug.py
   boost-build/branches/upstream/current/test/no_type.py
   boost-build/branches/upstream/current/test/ordered_properties.py
   boost-build/branches/upstream/current/test/path_features.py
   boost-build/branches/upstream/current/test/prebuilt.py
   boost-build/branches/upstream/current/test/prebuilt/ext/Jamfile2
   boost-build/branches/upstream/current/test/prebuilt/ext/Jamfile3
   boost-build/branches/upstream/current/test/print.py
   boost-build/branches/upstream/current/test/project-test3/lib3/Jamfile
   boost-build/branches/upstream/current/test/project-test3/project-root.jam
   boost-build/branches/upstream/current/test/project-test4/project-root.jam
   boost-build/branches/upstream/current/test/project_dependencies.py
   boost-build/branches/upstream/current/test/project_root_constants.py
   boost-build/branches/upstream/current/test/project_test3.py
   boost-build/branches/upstream/current/test/project_test4.py
   boost-build/branches/upstream/current/test/property_expansion.py
   boost-build/branches/upstream/current/test/railsys.py
   boost-build/branches/upstream/current/test/railsys/libx/project-root.jam
   boost-build/branches/upstream/current/test/railsys/program/Jamfile
   boost-build/branches/upstream/current/test/railsys/program/project-root.jam
   boost-build/branches/upstream/current/test/recursive.jam
   boost-build/branches/upstream/current/test/regression.py
   boost-build/branches/upstream/current/test/relative_sources.py
   boost-build/branches/upstream/current/test/searched_lib.py
   boost-build/branches/upstream/current/test/skipping.py
   boost-build/branches/upstream/current/test/stage.py
   boost-build/branches/upstream/current/test/standalone.py
   boost-build/branches/upstream/current/test/startup_v1.py
   boost-build/branches/upstream/current/test/suffix.py
   boost-build/branches/upstream/current/test/symlink.py
   boost-build/branches/upstream/current/test/tag.py
   boost-build/branches/upstream/current/test/template.py
   boost-build/branches/upstream/current/test/test-config-example.jam
   boost-build/branches/upstream/current/test/test.jam
   boost-build/branches/upstream/current/test/test1.py
   boost-build/branches/upstream/current/test/test2.py
   boost-build/branches/upstream/current/test/test_all.py
   boost-build/branches/upstream/current/test/test_system.html
   boost-build/branches/upstream/current/test/unit_test.py
   boost-build/branches/upstream/current/test/unit_tests.py
   boost-build/branches/upstream/current/test/unused.py
   boost-build/branches/upstream/current/test/use_requirements.py
   boost-build/branches/upstream/current/test/wrapper.py
   boost-build/branches/upstream/current/tools/boostbook.jam
   boost-build/branches/upstream/current/tools/borland.jam
   boost-build/branches/upstream/current/tools/builtin.jam
   boost-build/branches/upstream/current/tools/common.jam
   boost-build/branches/upstream/current/tools/como-linux.jam
   boost-build/branches/upstream/current/tools/como-win.jam
   boost-build/branches/upstream/current/tools/cw.jam
   boost-build/branches/upstream/current/tools/darwin.jam
   boost-build/branches/upstream/current/tools/doxygen.jam
   boost-build/branches/upstream/current/tools/fop.jam
   boost-build/branches/upstream/current/tools/gcc.jam
   boost-build/branches/upstream/current/tools/gettext.jam
   boost-build/branches/upstream/current/tools/intel-linux.jam
   boost-build/branches/upstream/current/tools/intel-win.jam
   boost-build/branches/upstream/current/tools/make.jam
   boost-build/branches/upstream/current/tools/msvc.jam
   boost-build/branches/upstream/current/tools/qt.jam
   boost-build/branches/upstream/current/tools/rc.jam
   boost-build/branches/upstream/current/tools/stage.jam
   boost-build/branches/upstream/current/tools/stlport.jam
   boost-build/branches/upstream/current/tools/sun.jam
   boost-build/branches/upstream/current/tools/symlink.jam
   boost-build/branches/upstream/current/tools/testing.jam
   boost-build/branches/upstream/current/tools/unix.jam
   boost-build/branches/upstream/current/tools/vacpp.jam
   boost-build/branches/upstream/current/tools/xsltproc.jam
   boost-build/branches/upstream/current/user-config.jam
   boost-build/branches/upstream/current/util/container.jam
   boost-build/branches/upstream/current/util/doc.jam
   boost-build/branches/upstream/current/util/indirect.jam
   boost-build/branches/upstream/current/util/os.jam
   boost-build/branches/upstream/current/util/path.jam
   boost-build/branches/upstream/current/util/print.jam
   boost-build/branches/upstream/current/util/regex.jam
   boost-build/branches/upstream/current/util/utility.jam
Log:
Load /tmp/tmp.LIwYT17438/boost-build-2.0-m11 into
boost-build/branches/upstream/current.


Modified: boost-build/branches/upstream/current/build/alias.jam
===================================================================
--- boost-build/branches/upstream/current/build/alias.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/alias.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -30,6 +30,7 @@
 import type : type ;
 import regex ;
 import project ;
+import property-set ;
 
 class alias-target-class : basic-target 
 {
@@ -40,17 +41,11 @@
           : $(default-build) : $(usage-requirements) ;
     }
         
-    rule construct ( source-targets * : property-set )
+    rule construct ( name : source-targets * : property-set )
     {
-        return $(source-targets) ;
+        return [ property-set.empty ] $(source-targets) ;
     }   
-    
-    # This check makes no sense for 'alias', so just
-    # disable it.
-    rule check-for-link-compatibility ( * : * )
-    {
-    }
-            
+                
     rule compute-usage-requirements ( subvariant ) 
     {
         local base = [ basic-target.compute-usage-requirements $(subvariant) ] ;

Modified: boost-build/branches/upstream/current/build/build-request.jam
===================================================================
--- boost-build/branches/upstream/current/build/build-request.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/build-request.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -125,10 +125,15 @@
     local properties ;
 
     command-line = $(command-line[2-]) ;
+    local skip-next = ;
     for local e in $(command-line)
     {
-        if ! [ MATCH "^(-).*" : $(e) ] 
+        if $(skip-next)
         {
+            skip-next = ;
+        }
+        else if ! [ MATCH "^(-).*" : $(e) ] 
+        {
             # Build request spec either has "=" in it, or completely
             # consists of implicit feature values.
             local fs = feature-space ;
@@ -142,6 +147,10 @@
                 targets += $(e) ;
             }
         }
+        else if [ MATCH "^(-[-ldjfsto])$" : $(e) ]
+        {
+            skip-next = true ;
+        }
     }
     return [ new vector [ new vector $(targets) ] [ new vector $(properties) ] ] ;
 }

Modified: boost-build/branches/upstream/current/build/feature.jam
===================================================================
--- boost-build/branches/upstream/current/build/feature.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/feature.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -188,10 +188,6 @@
 # return the attibutes of the given feature
 rule attributes ( feature )
 {
-    if ! [ valid $(feature) ]
-    {
-        error \"$(feature)\" is not a valid feature name ;
-    }
     return $($(feature).attributes) ;
 }
 
@@ -425,7 +421,10 @@
             values = [ regex.split $(value-string) - ] ;
         }
 
-        if ! ( $(values[1]) in $($(feature).values) )
+        if ! ( $(values[1]) in $($(feature).values) ) &&
+
+            # 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)\" ;
@@ -583,21 +582,13 @@
                 $($(composite-property).components) ;
     }
 
-    if $(composite-property) in $(components)
+    if $(composite-property) in $(component-properties)
     {
-        errror composite property "$(composite-property)" cannot have itself as a component ;
+        error composite property "$(composite-property)" cannot have itself as a component ;
     }
     $(composite-property).components = $(component-properties) ;
 }
 
-local rule has-attribute ( attribute property )
-{
-    if $(attribute) in [ attributes [ get-feature $(property) ] ]
-    {
-        return true ;
-    }
-}
-
 local rule expand-composite ( property )
 {
     return $(property)
@@ -667,7 +658,7 @@
                     error explicitly-specified values of non-free feature
                       $(f) conflict :
                         "existing values:" [ get-values $(f) : $(properties) ] :
-                        "value from expanding " $(p) ":" (x:G=) ;
+                        "value from expanding " $(p) ":" $(x:G=) ;
                 }
                 else
                 {
@@ -1011,13 +1002,20 @@
     feature define : : free ;
     feature runtime-link : dynamic static : symmetric ;
     feature optimization : on off ;
-    feature variant : debug release : implicit composite symmetric ;
+    feature variant : debug release profile : implicit composite symmetric ;
     feature stdlib : native stlport ;
     feature magic : : free ;
 
     compose <variant>debug : <define>_DEBUG <optimization>off ;
     compose <variant>release : <define>NDEBUG <optimization>on ;
 
+
+    try ;
+    {
+        compose <variant>profile : <variant>profile ;
+    }
+    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 ;

Modified: boost-build/branches/upstream/current/build/generators.jam
===================================================================
--- boost-build/branches/upstream/current/build/generators.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/generators.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -46,6 +46,7 @@
 import set sequence ;
 import assert ;
 import virtual-target ;
+import property-set ;
 
 if "--debug-generators" in [ modules.peek : ARGV ] 
 {    
@@ -84,7 +85,8 @@
 # regardless of their order.
 rule normalize-target-list ( targets )
 {
-    $(targets).sort ;                   
+    local v = [ $(targets).get ] ;
+    $(targets).set $(v[1]) [ sequence.insertion-sort $(v[2-]) : utility.less ] ;
 }
 
 # Creates a generator
@@ -93,6 +95,7 @@
     import generators ;
     import assert ;
     import generators : indent increase-indent decrease-indent generators.dout ;
+    import generators ;
     import set ;
     import utility : equal ;
     import feature ;
@@ -113,7 +116,8 @@
                   # Ordinary generators pass all sources together to
                   # recusrive generators.construct-types call.
     
-    : source-types *  # types that this generator can handle
+    : source-types *  # types that this generator can handle.  If
+                      # empty, the generator can consume anything.
     
     : target-types-and-names +   
       # types the generator will create and, optionally, names for
@@ -147,10 +151,7 @@
                                     
         # Note that 'transform' here, is the same as 'for_each'.
         sequence.transform type.validate : $(self.source-types) ;
-        if $(self.target-types) != *
-        {        
-            sequence.transform type.validate : $(self.target-types) ;
-        }
+        sequence.transform type.validate : $(self.target-types) ;
     }
                             
     ############## End of constructor #################
@@ -173,7 +174,7 @@
     {
         return $(self.target-types) ;
     }
-
+    
     # Returns the required properties for this generator. Properties
     # in returned set must be present in build properties if this 
     # generator is to be used. If result has grist-only element,
@@ -234,6 +235,33 @@
                ] ;
     }
     
+    # Creates another generator that is the same as $(self), except that
+    # if 'base' is in target types of $(self), 'type' will in target types
+    # of the new generator.
+    rule clone-and-change-target-type ( base : type )
+    {
+        local target-types ;
+        for local t in $(self.target-types-and-names)
+        {
+            local m = [ MATCH ([^\\(]*)(\\(.*\\))? : $(t) ] ;
+            if $(m) = $(base)
+            {
+                target-types += $(type)$(m[2]:E="") ;
+            }
+            else
+            {
+                target-types += $(t) ;
+            }                                        
+        }
+                
+        return [ new $(__class__) $(self.id) $(self.composing)
+                 : $(self.source-types)
+                 : $(target-types) 
+                 : $(self.requirements)
+               ] ;
+    }
+
+    
     # Tries to invoke this generator on the given sources. Returns a
     # list of generated targets (instances of 'virtual-target').
     rule run ( project  # Project for which the targets are generated
@@ -241,20 +269,9 @@
                         # all generated targets. See 'generated-targets' method.
                : property-set # Desired properties for generated targets.
                : sources +  # Source targets.
-               : multiple ? # Allows the rule to run generator several times and return
-                          # multiple targets of the same type. When this argument is not
-                          # given, 'run' will return the list of targets, which is equal
-                          # in size to the list of target types, and where type of
-                          # each target is the same as the corresponding element of
-                          # target type list. Non-empty value allows to return several
-                          # such target lists, joined together.
-             )
-    {
-        # multiple = true ; # The tests seem to tolerate this; will
-                          # remove the parameter altogether in the
-                          # next revision to see what I learn -- DWA 2003/5/6
-        
-        generators.dout [ indent ] "  generator" $(self.id) ;
+            )
+    {       
+        generators.dout [ indent ] "  ** generator" $(self.id) ;
         generators.dout [ indent ] "  multiple:" $(mutliple) ;
         generators.dout [ indent ] "  composing:" $(self.composing) ;        
         
@@ -262,12 +279,7 @@
         {
             errors.error "Unsupported source/source-type combination" ;
         }
-
-        if $(self.source-types[2])
-        {
-            multiple = ;
-        }
-        
+               
         # We don't run composing generators if no name is specified. The reason
         # is that composing generator combines several targets, which can have
         # different names, and it cannot decide which name to give for produced
@@ -280,14 +292,13 @@
         # (the OBJ -> STATIC_LIB generator is composing)
         if ! $(self.composing) || $(name)
         {            
-            run-really $(project) $(name) : $(property-set) : $(sources) : $(multiple) ;
+            run-really $(project) $(name) : $(property-set) : $(sources) ;
         }        
     }
     
     
-    rule run-really ( project name ? : property-set : sources + : multiple ? )
+    rule run-really ( project name ? : property-set : sources + )
     {
-                
         # Targets that this generator will consume directly.
         local consumed = ;
         # Targets that can't be consumed and will be returned as-is.
@@ -299,9 +310,9 @@
               : $(property-set) : $(sources) : consumed bypassed ;            
         }
         else
-        {            
+        {               
             convert-to-consumable-types $(project) $(name) : 
-              $(property-set) : $(sources) : $(multiple)
+              $(property-set) : $(sources) 
                 :
                 : consumed bypassed ;
         }
@@ -311,7 +322,6 @@
         {            
             result = [ construct-result $(consumed) : $(project) $(name) 
                      : $(property-set) ] ;
-            result += $(bypassed) ;
         }
                             
                 
@@ -343,7 +353,6 @@
         # If this is 1->1 transformation, apply it to all consumed targets in order.
         if ! $(self.source-types[2]) && ! $(self.composing)
         {
-            generators.dout [ indent ] "alt1" ;
             for local r in $(consumed)
             {                
                 result += [ generated-targets $(r) : $(property-set) : $(project) $(name) ] ; #(targets) ;
@@ -351,7 +360,6 @@
         }
         else
         {
-            generators.dout [ indent ] "alt2 : consumed is" $(consumed) ;
             if $(consumed) 
             {
                 result += [ generated-targets $(consumed) : $(property-set) 
@@ -385,11 +393,22 @@
     {
         if ! $(name)
         {
-            name = [ $(sources[1]).name ] ;            
-
+            # Determine the name of the produced target from the
+            # names of the sources. The simple case if when a name
+            # of source has single dot. Then, we take the part before
+            # dot. Several dots can be caused by:
+            # - Using source file like a.host.cpp
+            # - A type which suffix has a dot. Say, we can
+            #   type 'host_cpp' with extension 'host.cpp'.
+            # In the first case, we want to take the part till the last
+            # dot. In the second case -- no sure, but for now take
+            # the part till the last dot too.
+            name = [ utility.basename [ $(sources[1]).name ] ] ;
+                        
             for local s in $(sources[2])
             {
-                if [ $(s).name ] != $(name)
+                local n2 = [ utility.basename [ $(s).name ] ] ;
+                if $(n2) != $(name)
                 {
                     error "$(self.id): source targets have different names: cannot determine target name" ;
                 }
@@ -399,6 +418,11 @@
             name = $(name:D=) ;
         }
         
+        # Assign an action for each target
+        local action = [ action-class ] ;
+        local a = [ class.new $(action) $(sources) : $(self.id) : 
+                    $(property-set) ] ;
+                
         # Create generated target for each target type.
         local targets ;
         local pre = $(self.name-prefix) ;
@@ -409,17 +433,9 @@
             pre = $(pre[2-]) ;
             post = $(post[2-]) ;
             
-            targets += [ class.new file-target $(generated-name) : $(t) : $(project) ] ;
+            targets += [ class.new file-target $(generated-name) 
+              : $(t) : $(project) : $(a) ] ;
         }                 
-        # Assign an action for each target
-        local action = [ action-class ] ;
-        local a = [ class.new $(action) $(targets) : $(sources) : $(self.id) : 
-                    $(property-set) ] ;
-        for local t in $(targets)
-        {
-            $(t).action $(a) ;
-            $(t).set-intermediate true ;
-        }       
         
         return [ sequence.transform virtual-target.register : $(targets) ] ;
     }    
@@ -428,7 +444,7 @@
     # handle. The intention is to produce the set of targets can should be
     # used when generator is run.
     rule convert-to-consumable-types ( project name ? : 
-        property-set : sources + : multiple ? 
+        property-set : sources +  
         : only-one ? # convert 'source' to only one of source types
                      # if there's more that one possibility, report an
                      # error 
@@ -471,14 +487,15 @@
         if $(missing-types)
         {            
             local transformed = [ generators.construct-types $(project) $(name)
-              : $(missing-types) : $(multiple) : $(property-set) : $(sources) ] ;
+              : $(missing-types) : $(property-set) : $(sources) ] ;
                                 
             # Add targets of right type to 'consumed'. Add others to
             # 'bypassed'. The 'generators.construct' rule has done
             # its best to convert everything to the required type.
             # There's no need to rerun it on targets of different types.
                 
-            for local t in $(transformed)
+            # NOTE: ignoring usage requirements
+            for local t in $(transformed[2-])
             {
                 if [ $(t).type ] in $(missing-types)
                 {
@@ -518,40 +535,35 @@
     
     # Converts several files to consumable types.
     rule convert-multiple-sources-to-consumable-types
-      ( project : property-set : sources * : consumed-var bypassed-var : multiple ? )
+      ( project : property-set : sources * : consumed-var bypassed-var )
     {
-        multiple ?= * ;
         # We process each source one-by-one, trying to convert it to
         # a usable type.
-        local failed ;
-        while $(sources) && ! $(failed)
+        for local source in $(sources)
         {
             local _c ;
             local _b ;
             # TODO: need to check for failure on each source.
             convert-to-consumable-types $(project) : $(property-set)
-              : $(sources[1]) : $(multiple) : true : _c _b ;
+              : $(source) : true : _c _b ;
             if ! $(_c)
             {
-                generators.dout [ indent ] " failed to convert " [ $(sources[1]).str ] ;
-                # failed = true ;
+                generators.dout [ indent ] " failed to convert " $(source) ;
             }
             $(consumed-var) += $(_c) ;            
             $(bypassed-var) += $(_b) ;
-            sources = $(sources[2-]) ;
         }           
-        if $(failed)
-        {
-            $(consumed-var) = ;
-            $(bypassed-var) = ;
-        }        
     }
         
     rule consume-directly ( source : consumed-var : missing-types-var )
     {
         local real-source-type = [ $(source).type ] ;
-
-        for local st in $(self.source-types)
+        
+        # If there are no source types, we can consume anything
+        local source-types = $(self.source-types) ;
+        source-types ?= $(real-source-type) ;
+        
+        for local st in $(source-types)
         {
             # The 'source' if of right type already)
             if $(real-source-type) = $(st) || 
@@ -572,7 +584,7 @@
     rule action-class ( )
     {
         return "action" ;
-    }    
+    }        
 }
 
 import errors : error ;
@@ -584,7 +596,11 @@
 {
     .generators += $(g) ;
                    
-    for local t in [ $(g).target-types ] 
+    # A generator can produce several targets of the
+    # same type. We want unique occurence of that generator
+    # in .generators.$(t) in that case, otherwise, it will
+    # be tried twice and we'll get false ambiguity.
+    for local t in [ sequence.unique [ $(g).target-types ] ]
     {            
         .generators.$(t) += $(g) ;
     }    
@@ -618,7 +634,7 @@
 # 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.
-rule register-standard ( id : source-types + : target-types + : requirements * )
+rule register-standard ( id : source-types * : target-types + : requirements * )
 
 {
     local g = [ new generator $(id) : $(source-types) : $(target-types)
@@ -629,7 +645,7 @@
 
 # Creates new instance of the 'composing-generator' class and
 # registers it.
-rule register-composing ( id : source-types + : target-types + : requirements * )
+rule register-composing ( id : source-types * : target-types + : requirements * )
 {
     local g = [ new generator $(id) true : $(source-types) 
                 : $(target-types) : $(requirements) ] ;
@@ -657,103 +673,217 @@
 # made.
 .caching = ;
 
-# For all t in 'targets':
-# if [ $(t).type ] in $(target-types), add 't' to result
-# if [ $(t).type ] in base type for any of 'target-types', add 't' to result
-# otherwise, add 't' to extra.
-rule base-to-derived-type-conversion ( targets * : target-types +
-    : result-var extra-var )
+# 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.
+local rule viable-source-types-real ( target-type )
 {
-    for local t in $(targets) 
+    local generators ;
+
+    local t = [ type.all-bases $(target-type) ] ;
+    
+    local result ;
+    # 't' is the list of types which are not yet processed    
+    while $(t)
     {
-        if [ $(t).type ] in $(target-types)
+        # Find all generators for current type. 
+        # Unlike 'find-viable-generators' we don't care about property-set.
+        local generators = $(.generators.$(t[1])) ;
+        t = $(t[2-]) ;
+        
+
+        
+        while $(generators)
         {
-            $(result-var) += $(t) ;
-        }
-        else 
-        {
-            # We might have asked for a type 'D', but found only generator for
-            # a type 'B', where 'D' is derived from 'B'. In this case, the 
-            # generation succeeds, but we should change type of the generated target.
+            local g = $(generators[1]) ;
+            generators = $(generators[2-]) ;
             
-            local at = [ $(t).type ] ;
-            local found ;
-            for local tt in $(target-types)
+            if ! [ $(g).source-types ]
             {
-                if ! $(found) && [ type.is-derived $(tt) $(at) ] 
+                # Empty source types -- everything can be accepted
+                result = * ;
+                # This will terminate this loop.
+                generators = ;
+                # This will terminate outer loop.
+                t = ;
+            }
+              
+            for local source-type in [ $(g).source-types ] 
+            {
+                if ! $(source-type) in $(result) 
                 {
-                    $(t).set-type $(tt) ;
-                    $(result-var) += $(t) ;
-                    found = 1 ;
+                    # If generator accepts 'source-type' it
+                    # will happily accept any type derived from it
+                    local all = [ type.all-derived $(source-type) ] ;
+                    for local n in $(all)
+                    {
+                        if ! $(n) in $(result)
+                        {   
+                            t += $(n) ;
+                            result += $(n) ;
+                        }    
+                    }                    
                 }                
             }            
-            if ! $(found)
-            {
-                $(extra-var) += $(t) ;                
-            }            
         }        
-    }    
+    }          
+        
+    result = [ sequence.unique $(result) ] ;
+    
+    return $(result) ;                
 }
 
+# Helper rule, caches the result of 'viable-source-types-real'.
+rule viable-source-types ( target-type )
+{
+    local key = .vst.$(target-type) ;
+    if ! $($(key))
+    {
+        local v = [ viable-source-types-real $(target-type) ] ;
+        if ! $(v)
+        {
+            v = none ;
+        }
+        $(key) = $(v) ;
+    }
+    
+    if $($(key)) != none
+    {
+        return $($(key)) ;
+    }        
+}
 
+# 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.
+        return * ;
+    }
+    else
+    {            
+        local result ;
+        for local s in $(source-types)
+        {
+            result += [ type.all-derived $(s) ] 
+              [ generators.viable-source-types $(s) ] ;
+        }
+        result = [ sequence.unique $(result) ] ;        
+        if * in $(result)
+        {
+            result = * ;
+        }        
+        return $(result) ;
+    }        
+}    
 
-local rule try-one-generator ( project name ? : generator multiple ? : 
+# Helper rule, caches the result of 'viable-source-types-for-genrator'.
+local rule viable-source-types-for-generator ( generator )
+{
+    local key = .vstg.$(generator) ;
+    if ! $($(key))
+    {
+        local v = [ viable-source-types-for-generator-real $(generator) ] ;
+        if ! $(v)
+        {
+            v = none ;
+        }
+        $(key) = $(v) ;        
+    }
+    
+    if $($(key)) != none
+    {
+        return $($(key)) ;
+    }        
+}
+
+
+
+# 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)
-                       : $(multiple)
       ] ;
-
-    # Generated targets that are of required types
-    local result ;
-    # Generated target of other types.
-    local extra ;
-
-    base-to-derived-type-conversion $(targets) : $(target-type) 
-        : result extra ;
             
-    # Now try to convert extra targets 
-    # 'construct' will to its best to return only requested
-    # target types, so if we receive any extra from that call,
-    # we don't try to do anything about them.
-    local extra2 ;
-    if $(multiple) 
+    local usage-requirements ;
+    if $(targets) && [ class.is-a $(targets[1]) : property-set ]
     {
-        for local e in $(extra) 
-        {
-            local try2 = [ construct-types $(project) $(name) 
-                                         : $(target-type)
-                                         :
-                                         : $(property-set)
-                                         : $(e) ] ;
-    
-            result += $(try2) ;
-        }    
+        usage-requirements = $(targets[1]) ;
+        targets = $(targets[2-]) ;
     }
     else
     {
-        extra2 = $(extra) ;
+        usage-requirements = [ property-set.empty ] ;
     }
+    
     generators.dout [ indent ] "  generator" [ $(generator).id ] " spawned " ;
-    generators.dout [ indent ] " " $(result) -- $(extra2) ; 
-    return $(result) $(extra2) ;                     
+    generators.dout [ indent ] " " $(targets) ; 
+    if $(targets)
+    {
+        return $(usage-requirements) $(targets) ;
+    }    
 }
 
-rule construct-types ( project name ? : target-types + : multiple ? : 
+# 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)
+    {
+        source-types += [ $(s).type ] ;
+    }
+    local viable-source-types = 
+      [ viable-source-types-for-generator $(generator) ] ;
+    
+    if  $(source-types) && $(viable-source-types) != * && 
+      ! [ set.intersection $(source-types) : $(viable-source-types) ] 
+    {
+        local id = [ $(generator).id ] ;
+        generators.dout [ indent ] "  ** generator '$(id)' pruned" ;
+        #generators.dout [ indent ] "source-types" '$(source-types)' ;
+        #generators.dout [ indent ] "viable-source-types" '$(viable-source-types)' ;
+    }          
+    else {
+        return [ try-one-generator-really $(project) $(name)
+          : $(generator)
+            : $(target-type) : $(property-set) : $(sources) ] ;
+    }       
+}
+
+
+
+rule construct-types ( project name ? : target-types + :
     property-set : sources + )
 {
     local result ;
     local matched-types ; 
+    local usage-requirements = [ property-set.empty ] ;
     for local t in $(target-types)
     {
-        local r = [ construct $(project) $(name) : $(t) $(multiple) : $(property-set) :
+        local r = [ construct $(project) $(name) : $(t) : $(property-set) :
           $(sources) ] ;
         if $(r)
         {
-            result += $(r) ;
+            usage-requirements = [ $(usage-requirements).add $(r[1]) ] ;
+            result += $(r[2-]) ;
             matched-types += $(t) ;
         }
     }
@@ -767,11 +897,11 @@
     # imply that, contrary to the behaviour.
     if $(result)
     {
-        return $(result) ;
+        return $(usage-requirements) $(result) ;
     }
     else
     {
-        return $(sources) ;
+        return $(usage-requirements) $(sources) ;
     }
 }
 
@@ -787,7 +917,6 @@
         }        
     }    
 }
-
     
 # Returns generators which can be used to construct target of specified type
 # with specified properties. Uses the following algorithm:
@@ -799,43 +928,100 @@
 #
 # Note: this algorithm explicitly ignores generators for base classes if there's
 # at least one generator for requested target-type.
-local rule find-viable-generators ( target-type : property-set )
+local rule find-viable-generators-aux ( target-type : property-set )
 {
     # Select generators that can create the required target type.
     local viable-generators = ;
     local generator-rank = ;
 
     import type ;
-    # Try all-type generators first. Assume they have
-    # quite specific requirements.
-    local t = * [ type.all-bases $(target-type) ] ;
+    local t = [ type.all-bases $(target-type) ] ;
     
     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.
+    local generators ;
     while $(t[1])
     {
-        generators.dout  [ indent ] "trying type" $(t[1]) ;
-        for local g in $(.generators.$(t[1]))
+        generators.dout  [ indent ] "trying type" $(t[1]) ;    
+        if $(.generators.$(t[1]))
         {
-            generators.dout [ indent ] "trying generator" [ $(g).id ] "(" [ $(g).source-types ] -> [ $(g).target-types ] ")" ;
+            generators.dout [ indent ] "there are generators for this type" ;
+            generators = $(.generators.$(t[1])) ;
             
-            # Avoid trying the same generator twice on different levels.
-            if ! $(g) in $(.active-generators) 
-            {       
-                local m = [ $(g).match-rank $(property-set) ] ;
-                if $(m) 
+            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.
+                local generators2 ;
+                for local g in $(generators)
                 {
-                    generators.dout [ indent ] "  is viable" ;
-                    viable-generators += $(g) ;
-                    t = ;
-                }                                    
-            }            
-        }
-        t = $(t[2-]) ;
+                    # 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.
+                    generators2 += [ 
+                      $(g).clone-and-change-target-type $(t[1]) : $(target-type) ] ;
+                    generators.register $(generators2[-1]) ;
+                }                
+                generators = $(generators2) ;
+            }                        
+            t = ;
+        }        
+        t = $(t[2-]) ;            
     }
     
+    
+    for local g in $(generators)
+    {
+        generators.dout [ indent ] "trying generator" [ $(g).id ] "(" [ $(g).source-types ] -> [ $(g).target-types ] ")" ;
+            
+        local m = [ $(g).match-rank $(property-set) ] ;
+        if $(m) 
+        {
+            generators.dout [ indent ] "  is viable" ;
+            viable-generators += $(g) ;
+        }                                    
+    }
+                            
+    return $(viable-generators) ;
+}
+
+rule find-viable-generators ( target-type : property-set )
+{
+    local key = $(target-type).$(property-set) ;
+    local l = $(.fv.$(key)) ;
+    if ! $(l)
+    {
+        l = [ find-viable-generators-aux $(target-type) : $(property-set) ] ;
+        if ! $(l)
+        {
+            l = none ;
+        }        
+        .fv.$(key) = $(l) ;
+    }
+    
+    if $(l) = none
+    {
+        l = ;
+    }
+                    
+    local viable-generators ;
+    for local g in $(l)
+    {
+        # Avoid trying the same generator twice on different levels.        
+        if ! $(g) in $(.active-generators) 
+        {
+            viable-generators += $(g) ;
+        }        
+    }
+    
     # Generators which override 'all'.
     local all-overrides ;
     # Generators which are overriden
@@ -862,138 +1048,68 @@
             result += $(g) ;
         }        
     }
-                        
+        
     return $(result) ;
-}
-    
-# Given a vector of vectors, of of them represents results of running some 
-# generator, returns the 'best' result, it it exists. Otherwise, exit with
-# and error. Result is returned as plain jam list.
-local rule select-dependency-graph ( options )
-{
-    if [ $(options).size ] = 0
-    {
-        return ;
-    }
-    else if [ $(options).size ] = 1
-    {
-        return [ $(options).get-at 1 ] ;
-    }
-    else
-    {
-        # We have several alternatives and need to check if they
-        # are the same. 
+}    
         
-        for local r in [ $(options).get ] 
-        {
-            normalize-target-list $(r) ;
-            generators.dout $(r) ;
-        }
-        
-        # One note why we can compare object names directly,
-        # without using deep copy. All the targets here are
-        # produced by some generators, and generators should
-        # pass the targets they've returned via 'virtual-target.register'.
-        # So, two elements can only be equivalent, if they are just
-        # the same object.       
-        local f = [ $(options).at 1 ] ;
-        local mismatch ;
-        for local r in [ $(results).get ] 
-        {
-            if [ $(r).get ] != [ $(f).get ] 
-            {
-                mismatch = true ;
-            }
-        }
-
-        if ! $(mismatch)
-        {
-            return [ $(f).get ] ;
-        }
-        else 
-        {                        
-            error [ $(options).size ] "possible generations for "
-                   $(target-types) "Can't handle this now." ;
-        }            
-    }                        
-}
-    
 .construct-stack = ;
 
-# Attempt to construct the target by looking at transformation cache.
-local rule construct-with-caching (
-   project name ? : target-type multiple ? : property-set : sources * )
-{     
-    local result ;
-    # Caching is only possible when we're not computing cacheable transformation
-    # already, when there's only one source which has no action -- i.e. source file,
-    # and name of target is not specified.
-    if ! $(.caching) && ! $(sources[2]) && $(sources[1]) && ! $(name)      
-       && ! [ $(sources[1]).action ] 
-    {
-        local .caching = true ;
-        
-        local t = $(sources[1]) ;            
-                    
-        local signature = [ sequence.join [ $(t).type ] $(target-type) $(property-set) : - ] ;
-            
-        # Get a transformation template from cache or create it.
-        local cresult ;
-        if $(.transformation.cache.$(signature))
-        {
-            cresult = $(.transformation.cache.$(signature)) ;
-        }
-        else 
-        {                            
-            local ut = [ new file-target % : [ $(t).type ] : "no project" ] ;            
-            cresult = [ construct $(project) : $(target-type) $(multiple) 
-              : $(property-set) : $(ut) ] ;
-            .transformation.cache.$(signature) = $(cresult) ;                
-        }
-                                    
-        # Substitute the real source name in the transformation template.
-        if $(cresult)
-        {                
-            generators.dout [ indent ] "*** putting to cache?" ;
-            for local c in $(cresult)
-            {
-                generators.dout [ indent ] "*** cloning " $(c) ;                
-                local cc = [ virtual-target.clone-template $(c) : $(t) : $(project) ] ;
-                generators.dout [ indent ] "*** cloned" $(cc) --- $(cc) ;
-                result += $(cc) ;
-            }
-        }    
-    }
-    return $(result) ;
-}
-
 # Attempts to construct target by finding viable generators, running them
 # and selecting the dependency graph
-local rule construct-without-caching (
-   project name ? : target-type multiple ? : property-set : sources * )
+local rule construct-really (
+   project name ? : target-type : property-set : sources * )
 {
     viable-generators = [ find-viable-generators $(target-type) : $(property-set) ] ;
-                    
-    local results = [ new vector ] ;
-    
+                        
     generators.dout [ indent ] "*** " [ sequence.length $(viable-generators) ] 
       " viable generators" ;
     
+    local result ;
+    local generators-that-succeeded ;
     for local g in $(viable-generators)
     {
         # This variable will be restored on exit from this scope.
         local .active-generators = $(g) $(.active-generators) ;
         
-        local r = [ try-one-generator $(project) $(name) : $(g) $(multiple) : $(target-type) :
+        local r = [ try-one-generator $(project) $(name) : $(g) : $(target-type) :
           $(property-set) : $(sources) ] ;
         
         if $(r)
         {
-            $(results).push-back [ new vector $(r) ] ;
+            generators-that-succeeded += $(g) ;
+            if $(result)
+            {
+                ECHO "Error: ambiguity found when searching for best transformation" ;
+                ECHO "Trying to produce type '$(target-type)' from: " ;
+                for local s in $(sources)
+                {
+                    ECHO " - " [ $(s).str ] ;
+                }
+                ECHO "Generators that succeeded:" ;
+                for local g in $(generators-that-succeeded)
+                {
+                    ECHO " - " [ $(g).id ] ;
+                }
+                ECHO "First generator produced: " ;
+                for local t in $(result[2-])
+                {
+                    ECHO " - " [ $(t).str ] ;
+                }
+                ECHO "Second generator produced: " ;
+                for local t in $(r[2-])
+                {
+                    ECHO " - " [ $(t).str ] ;
+                }
+                EXIT ;
+            }
+            else
+            {
+                result = $(r) ;
+            }            
         }
     }
     
-    return [ select-dependency-graph $(results) ] ;
+    return $(result) ;
 }       
     
         
@@ -1012,91 +1128,38 @@
 # Does not return target which are not of 'allowed-type' or of type derived from
 # it. If 'allowed-type' is not specified, it's defaulted to 'target-type'.
 # See lib-target-class for use case of this.
-rule construct ( project name ? : target-type multiple ? : property-set * : sources * 
+rule construct ( project name ? : target-type : property-set * : sources * 
    : allowed-type * )
 {
-    allowed-type ?= $(target-type) ;
     if (.construct-stack)
     {
         ensure-type $(sources) ;
     }
-
-    # Intermediate targets are not passed to generators
-    # and just returned unmodified.
-    local intermediate ;
-    if ! $(.construct-stack)
-    {
-        local sources2 ;
-        for local s in $(sources)
-        {
-            if ! [ $(s).intermediate ] 
-            {
-                sources2 += $(s) ;
-            }
-            else
-            {
-                intermediate += $(s) ;
-            }            
-        }
-        sources = $(sources2) ;
-    }
         
     .construct-stack += 1 ;
 
     increase-indent ;
+
+    if $(.debug)
+    {        
+        generators.dout [ indent ] "*** construct" $(target-type) ;
     
-    local m ;
-    if $(multiple)
-    {
-        m = "(may return multiple targets)" ;
+        for local s in $(sources)
+        {
+            generators.dout [ indent ] "    from" $(s) ;
+        }
+        generators.dout [ indent ] "    properties:" [ $(property-set).raw ] ;        
     }
-    generators.dout [ indent ] "*** construct" $(target-type) $(m) ;
     
-    for local s in $(sources)
-    {
-        generators.dout [ indent ] "    from" $(s) ;
-    }
-    generators.dout [ indent ] "    properties:" [ $(property-set).raw ] ;        
                
-    local result = [ construct-with-caching $(project) $(name)  
-      : $(target-type) $(multiple) : $(property-set) : $(sources) ] ;
-    
-    if ! $(result)  {
-        result = [ construct-without-caching $(project) $(name)  
-      : $(target-type) $(multiple) : $(property-set) : $(sources) ] ;
-    }
+    local result = [ construct-really $(project) $(name)  
+      : $(target-type) : $(property-set) : $(sources) ] ;
                     
     decrease-indent ;
         
     .construct-stack = $(.construct-stack[2-]) ;
+                
     
-    if ! $(.construct-stack)
-    {
-        result += $(intermediate) ;
-    }
-    
-    # For all targets of 'allowed-type', reset the 'intermediate' attribute.
-    if ! $(.construct-stack) && $(allowed-type) != * # This is first invocation in stack
-    {
-        local result2 ;
-        for local t in $(result)
-        {
-            local type = [ $(t).type ] ; 
-            assert.nonempty-variable type ;
-            assert.nonempty-variable target-type ;
-            
-            # Return only targets of the requested type, unless 'return-all'
-            # is specified. If we don't do this, then all targets calling
-            # 'construct' will get unused target returned, which will break
-            # checking for unused sources a bit harder.
-            if $(type) = $(target-type) || [ type.is-derived $(type) $(allowed-type) ]
-            {
-                $(t).set-intermediate ;
-            }
-        }                
-    } 
-            
-    
     return $(result) ;        
 }
 

Modified: boost-build/branches/upstream/current/build/modifiers.jam
===================================================================
--- boost-build/branches/upstream/current/build/modifiers.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/modifiers.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -121,7 +121,6 @@
         local result = [ new file-target $(new-name) : $(new-type) : $(new-project) ] ;
         
         if [ $(target).dependencies ] { $(result).depends [ $(target).dependencies ] ; }
-        $(result).suffix [ $(target).suffix ] ;
         $(result).root [ $(target).root ] ;
         $(result).set-usage-requirements [ $(target).usage-requirements ] ;
         

Deleted: boost-build/branches/upstream/current/build/project-roots.jam
===================================================================
--- boost-build/branches/upstream/current/build/project-roots.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/project-roots.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,370 +0,0 @@
-# (C) Copyright Rene Rivera, 2002.
-#
-# See accompanying license for terms and conditions of use.
-#
-
-# Represents the projet-root of a collection of projects. This maintains
-# information about the root, and pointers to the project defined within
-# the root. Each project-root gets it's own module to put things into. For
-# instance declared constants which also get interned into each loaded project.
-
-import modules ;
-import path ;
-import "class" ;
-import set ;
-import regex ;
-
-# Load the project-root file for the given directory. The directory can
-# be either the project-root itself, or any subdirectory. Fails if it can't
-# find the project-root. We return the project-root module.
-#
-rule load (
-    dir # The directory to obtain the project-root for.
-    )
-{
-    local location = [ find-project-root $(dir) ] ;
-
-    # No project-root file found.
-    #
-    if ! $(location)
-    {
-        ECHO "Failed to find the project root for directory '$(dir)'." ;
-        ECHO "Did not find a project-root.jam file there or in any of its parent"
-            "directories." ;
-        EXIT "Please consult the documentation at 'http://www.boost.org'." ;
-    }
-    location = [ path.parent [ path.make $(location) ] ] ;
-
-    local module-name = project-root<$(location)> ;
-
-    local root ;
-    # Only bother with the rest if the project-root isn't loaded yet.
-    #
-    if ! [ modules.peek $(module-name) : .project-root ]
-    {
-        # Create the project-root, and remember it.
-        #
-        root = [ class.new project-root-object $(location) ] ;
-        modules.poke $(module-name) : .project-root : $(root) ;
-        .roots += $(root) ;
-        
-        # Let the project root initialize and load the contents.
-        #
-        $(root).initialize ;
-    }
-    else
-    {
-        root = [ modules.peek $(module-name) : .project-root ] ;
-    }
-    
-
-    # Return the module for the project.
-    #
-    return $(root) ;
-}
-
-# Finds the location of project root for a directory.
-# Returns the path to 'project-root.jam'.
-rule find-project-root ( dir )
-{
-    # Find the project-root.jam corresponding to this directory.
-    #
-    local location = [ path.glob $(dir) : project-root.jam ] ;
-    if ! $(location)
-    {
-        location = [ path.glob-in-parents $(dir) : project-root.jam ] ;
-    }
-    return $(location) ;
-}
-
-
-# Print out all the project-roots.
-#
-rule print ( )
-{
-    import sequence ;
-    import print ;
-    
-    local rule compare-project-roots ( r1 r2 )
-    {
-        if [ $(r1).get-module ] < [ $(r2).get-module ]
-        {
-            return true ;
-        }
-    }
-
-    print.section "Project Roots" ;
-    local roots = [ sequence.insertion-sort $(.roots) : compare-project-roots ] ;
-    for local root in $(roots)
-    {
-        $(root).print ;
-    }
-}
-
-# Class encapsulating settings for a single project root.
-#
-class project-root-object 
-{
-    import path ;
-    import set ;    
-    import sequence ;
-    import print ;
-    import project ;
-        
-    rule __init__ (
-      location # The root location.
-    )
-    {        
-        # The module name of the project-root.
-        self.module = project-root<$(location)> ;
-    
-        # The location of the project-root, as a path.
-        self.location = $(location) ;
-    
-        # The set of projects registered in this project-root.
-        self.projects = ;
-    
-        # The set of interned constants for this project-root.
-        self.constants = ;
-    }    
-    
-    # Accessor, the module of the project root.
-    rule get-module ( )
-    {
-        return $(self.module) ;
-    }
-    
-    # Accessor, the location of the porject root.
-    rule get-location ( )
-    {
-        return $(self.location) ;
-    }
-    
-    # Accessor, the project modules under this project root.
-    rule get-projects ( )
-    {
-        return $(self.projects) ;
-    }
-    
-    # Accessor, the constants to intern into the project root.
-    rule get-constants ( )
-    {
-        return $(self.constants) ;
-    }
-    
-    # Initialize the project root, also loads the project root file.
-    rule initialize ( )
-    {
-        # Give the new module all the rules from project-root-context
-        #
-        modules.clone-rules project-root-context $(self.module) ;
-
-        # Load it within a module specifically for the project root.
-        # The module system handles checking for multiple includes.
-        #
-        modules.load $(self.module)
-            : project-root.jam : [ path.native $(self.location) ] ;
-    }
-    
-    # Accessor, add a constant.
-    rule add-constant (
-        name # Variable name of the constant.
-        : value # Value of the constant.
-        : type ? # Optional type of value.
-        )
-    {
-        switch $(type)
-        {
-            case path :
-                value = [ path.root [ path.make $(value) ] $(self.location) ] ;
-                # Now make the value absolute path
-                value = [ path.root $(value) [ path.pwd ] ] ;
-                # Constants should be in platform-native form
-                value = [ path.native $(value) ] ;
-        }
-        if ! $(name) in $(self.constants)
-        {
-            self.constants += $(name) ;
-        }
-        self.constant.$(name) = $(value) ;
-        # Inject the constant in the scope of project-root module
-        modules.poke $(self.module) : $(name) : $(value) ;
-    }
-    
-    # Register a project under this project-root. This does any setup
-    # in the module of the project, including interning the project-root
-    # constants. Multiple calls on the same project are allowed and will
-    # not disturb the previous calls.
-    #
-    rule register-project (
-        project-module # The module of the project to register.
-        )
-    {
-        if ! $(project-module) in $(self.projects)
-        {
-            self.projects += $(project-module) ;
-            intern-constants $(project-module) ;
-            modules.clone-rules project-context $(project-module) ;
-            
-            # Import project-root rules declared by teh user into each project.
-            #
-            local user-rules = [ set.difference
-                [ RULENAMES $(self.module) ] :
-                [ RULENAMES project-root-context ] ] ;
-            IMPORT $(self.module) : $(user-rules) : $(project-module) : $(user-rules) ;
-        }
-    }
-    
-    # Intern the constants from this project-root into the calling context.
-    #
-    rule intern-constants (
-        context ? # The module to intern into the current module.
-        )
-    {
-        local intern-module = $(context) ;
-        intern-module ?= [ CALLER_MODULE ] ;
-        for local c in $(self.constants)
-        {
-            modules.poke $(intern-module) : $(c) : $(self.constant.$(c)) ;
-        }
-    }
-    
-    # Needed to get deterministic order of output, which makes testing simpler
-    local rule compare-projects ( p1 p2 )
-    {
-        local id1 = [ project.attribute $(p1) id ] ;
-        local id2 = [ project.attribute $(p2) id ] ;
-        if $(id1) < $(id2)
-        {
-            return true ;
-        }
-        else
-        {
-            if $(id1) = $(id2) && $(p1) < $(p2)
-            {
-                return true ;
-            }
-        }
-    }
-    
-    
-    # Print out info about this project root. Calls print on the
-    # individual projects in this project-root.
-    #
-    rule print ( )
-    {        
-        print.section "'"$(self.location)"'" Module for project-root is "'"$(self.module)"'" ;
-        if $(self.constants)
-        {
-            print.section Constants ;
-            print.list-start ;
-            local constants = [ sequence.insertion-sort $(self.constants) ] ;
-            for local c in $(constants)
-            {
-                print.list-item $(c) "=" $(self.constant.$(c)) ;
-            }
-            print.list-end ;
-        }
-        if $(self.projects)
-        {
-            print.section Projects ;
-            local projects = [ sequence.insertion-sort $(self.projects) : compare-projects ] ;
-            for local p in $(projects)
-            {
-                local attributes = [ project.attributes $(p) ] ;
-                $(attributes).print ;
-            }
-        }
-    }
-}
-
-# Rules callable by the user in the context of the project-root.jam of a project.
-#
-module project-root-context
-{
-    # Make toolset.using accessible in project-root.
-    import toolset : using ;
-    EXPORT project-root-context : using ;
-    
-    # Access to project root object and shortcut for it's methods. The
-    # optional argument is a shortcut to execute the given method on the
-    # object. This saves the hasle of creating local vars to call on the
-    # singleton.
-    #
-    rule project-root (
-        method ? # The optional method.
-        args * # The arguments.
-        : * # The rest.
-        )
-    {
-        if $(method)
-        {
-            return [ $(.project-root).$(method) $(args) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ] ;
-        }
-        else
-        {
-            return $(.project-root) ;
-        }
-    }
-            
-    # Declare and set a project global constant. Project global constants are
-    # normal variables but should not be changed. They are applied to each
-    # Jamfile that is loaded under it's corresponding project-root.
-    #
-    rule constant (
-        name # Variable name of the constant.
-        : value # Value of the constant.
-        )
-    {
-        project-root 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.
-    #
-    rule path-constant (
-        name # Variable name of the constant.
-        : value # Value of the constant.
-        )
-    {
-        project-root add-constant $(name) : $(value) : path ;
-    }
-    
-    # Load and use a project in this project root.
-    #
-    rule use-project (
-        id # The ID of the project.
-        : location # The location of the project.
-        )
-    {
-        import project ;
-        import path ;
-        project.use $(id) : [ path.root 
-            [ path.make $(location) ] [ project-root get-location ] ] ;
-    }
-}
-
-# Project root specific rules callable in the context of a project file. These
-# get imported into each project.
-#
-module project-context
-{
-    # Access to project root object and shortcut for it's methods. The
-    # optional argument is a shortcut to execute the given method on the
-    # object. This saves the hasle of creating local vars to call on the
-    # singleton.
-    #
-    rule project-root (
-        method ? # The optional method.
-        args * # The arguments.
-        : * # The rest.
-        )
-    {
-        import project ;
-        local attributes = [ project.attributes $(__name__) ] ;
-        local project-root = [ $(attributes).get project-root ] ;
-        return [ $(project-root).$(method) 
-          $(args) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ] ;
-    }
-}

Modified: boost-build/branches/upstream/current/build/project.jam
===================================================================
--- boost-build/branches/upstream/current/build/project.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/project.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -41,7 +41,6 @@
 import path ;
 import sequence ;
 import errors : error ;
-import project-roots ;
 
 import print ;
 import "class" : new ;
@@ -57,23 +56,70 @@
 #
 rule load ( jamfile-location )
 {   
-    # Load project root, first. It might decide to act as Jamfile.
-    project-roots.load $(jamfile-location) ;
-        
+    if --debug-loading in [ modules.peek : ARGV ]
+    {
+        ECHO "Loading Jamfile at" '$(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) ;
                 
-        for local p in [ attribute $(module-name) projects-to-build ]
-        {
-            load [ path.join $(jamfile-location) $(p) ] ;
-        }
+        # We want to make sure that child project are loaded only
+        # after parent projects. In particular, because parent projects
+        # define attributes whch are inherited by children, and we don't
+        # want children to be loaded before parents has defined everything.
+        #
+        # 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 information that will be used only later.
+        load-used-projects $(module-name) ;
     }                
     return $(module-name) ;        
 }
 
+rule load-used-projects ( module-name )
+{
+    local used = [ modules.peek $(module-name) : .used-projects ] ;
+    local location = [ attribute $(module-name) location ] ;
+    import project ;
+    while $(used)
+    {
+        local id = $(used[1]) ;
+        local where = $(used[2]) ;
+        
+        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.
+JAMROOT ?= [ 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) : 
+      $(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) ] ;    
+}
+
 # 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. 
@@ -109,7 +155,8 @@
                 
     if ! $(project-module)
     {            
-        local location = [ path.root $(name) $(current-location) ] ;
+        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
@@ -118,7 +165,7 @@
         project-module = [ module-name $(location) ] ;
         if ! $(project-module) in $(.jamfile-modules) 
         {
-            if [ find-jamfile $(location) ]
+            if [ path.glob $(location) : $(JAMROOT) $(JAMFILE) ]
             {
                 project-module = [ load $(location) ] ;            
             }        
@@ -154,16 +201,17 @@
 # declarations.
 #
 JAMFILE = [ modules.peek : JAMFILE ] ;
-JAMFILE ?= [Jj]amfile.v2 [Jj]amfile [Jj]amfile.jam ;
+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.
 #
-local rule find-jamfile (
+rule find-jamfile (
     dir # The directory(s) to look for a Jamfile.
     parent-root ? # Optional flag indicating to search for the parent Jamfile.
+    : no-errors ?
     )
 {
     # Glob for all the possible Jamfiles according to the match pattern.
@@ -174,7 +222,7 @@
         if ! $(.parent-jamfile.$(dir))
         {     
             .parent-jamfile.$(dir) = 
-              [ path.glob-in-parents $(dir) : $(JAMFILE) : $(parent-root) ] ;            
+              [ path.glob-in-parents $(dir) : $(JAMFILE)  ] ;            
         }        
         jamfile-glob = $(.parent-jamfile.$(dir)) ;                            
     }
@@ -187,33 +235,8 @@
         jamfile-glob = $(.jamfile.$(dir)) ;
         
     }
-
-    return $(jamfile-glob) ;
-}
-
-# 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.
-
-local rule load-jamfile (
-    dir # The directory of the project Jamfile.
-    )
-{
-    # See if the Jamfile is where it should be.
-    #
-    local jamfile-to-load = [ find-jamfile $(dir) ] ;
-
-    # Could not find it, error.
-    #
-    if ! $(jamfile-to-load)
-    {
-        errors.error
-            "Unable to load Jamfile." :
-            "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'." ;
-    }
-
+    
+    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
@@ -221,7 +244,7 @@
     #
     if $(jamfile-to-load[2-])
     {
-        local v2-jamfiles = [ MATCH (.*[Jj]amfile\\.v2) : $(jamfile-to-load) ] ;
+        local v2-jamfiles = [ MATCH (.*[Jj]amfile\\.v2)|(.*[Bb]uild\\.jam) : $(jamfile-to-load) ] ;
 
         if $(v2-jamfiles) && ! $(v2-jamfiles[2])
         {
@@ -230,41 +253,151 @@
         else
         {                    
             ECHO
-              "WARNING: Found multiple Jamfiles at this '"$(dir)"' location!"
+              "warning: Found multiple Jamfiles at '"$(dir)"'!"
                 "Loading the first one: '" [ path.basename $(jamfile-to-load[1]) ]  "'." ;
         }
                     
         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)'". : 
+            "Attempted to find it with pattern '"$(JAMFILE:J=" ")"'." :
+            "Please consult the documentation at 'http://www.boost.org'." ;
     }
+
+    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.
+
+local rule load-jamfile (
+    dir # The directory of the project Jamfile.
+    )
+{
+    # See if the Jamfile is where it should be.
+    #
+    local jamfile-to-load = [ path.glob $(dir) : $(JAMROOT) ] ;
+    if ! $(jamfile-to-load)
+    {
+        jamfile-to-load = [ find-jamfile $(dir) ] ;
+    }
     
+    
     # The module of the jamfile.
     #
     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.
     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) ] : . ;
+        if [ MATCH ($(JAMROOT)) : $(jamfile-to-load:BS) ]
+        {
+            jamfile = [ find-jamfile $(dir) : no-errors ] ;
+            if $(jamfile)
+            {                
+                load-aux $(jamfile-module) : [ path.native $(jamfile) ] ;
+            }            
+        }        
     }
-    .current-project = $(.current-project[2-]) ;
+    # 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 a the wrong project."
+          : "after loading " $(jamfile-module) 
+          : "expected value " $(saved-project)  
+          : "actual value " $(.current-project)
+          ;
+    }
+
+    if $(.global-build-dir)
+    {        
+        local id = [ attribute $(jamfile-module) id ] ;
+        local project-root  = [ attribute $(jamfile-module) project-root ] ;
+        local location = [ attribute $(jamfile-module) location ] ;
+    
+        if $(location) && $(project-root) = $(dir)
+        {
+            # 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) ;
+    }
+}
+
+
+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.    
+    .global-build-dir = [ path.make $(.global-build-dir[-1]) ] ;
+}
+
+
 # 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 ? 
     )
 {
+    if --debug-loading in [ modules.peek : ARGV ]
+    {
+        ECHO "Initializing project '$(module-name)'" ;
+    }
+
     # TODO: need to consider if standalone projects can do anything but defining
     # prebuilt targets. If so, we need to give more sensible "location", so that
     # source paths are correct.
@@ -273,7 +406,8 @@
     module $(module-name)
     {          
     }    
-    $(module-name).attributes = [ new project-attributes $(location) ] ;
+    $(module-name).attributes = [ new project-attributes $(location) 
+      $(module-name) ] ;
     local attributes = $($(module-name).attributes) ;
     
     if $(location)
@@ -291,68 +425,108 @@
     # 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 ;
 
-    # We search for parent/project-root only if jamfile was specified --- i.e
-    # if the project is not standalone.
-    if $(location)
-    {       
-        # Make sure we've loaded the project-root corresponding to this
-        # Jamfile.
-        #
-        local project-root-object = [ project-roots.load $(location) ] ;
-        local project-root = [ $(project-root-object).get-location ] ;
+    local parent-module ;
+    if $(module-name) = site-config
+    {
+        # No parent.
+    }    
+    else if $(module-name) = user-config
+    {
+        parent-module = site-config ;
+    }
+    else 
+    {
+        # We search for parent/project-root only if jamfile was specified 
+        # --- i.e
+        # if the project is not standalone.
+        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.
+            if $(location)
+            {
+                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)
+    {
+        parent = [ target $(parent-module) ] ;
+    }
+
+    if ! $(.target.$(module-name))
+    {
+        .target.$(module-name) = [ new project-target $(module-name)               
+          : $(module-name) $(parent)
+            : [ attribute $(module-name) requirements ] ] ;
         
-        $(attributes).set project-root : $(project-root-object) : exact ;
-
-        local parent = [ find-jamfile $(location) $(project-root) ] ;
-        local parent-module = ;
-        if $(parent)
+        if --debug-loading in [ modules.peek : ARGV ]
         {
-            parent-module = [ load [ path.parent $(parent[1]) ] ] ;
+            ECHO "Assigned project target" $(.target.$(module-name)) 
+              "to '$(module-name)'" ;
         }
-        
-        inherit-attributes $(module-name) : $(project-root-object) : $(parent-module) ;
     }    
     
-    .current-project = [ target $(module-name) ] $(.current-project) ;
+    .current-project = [ target $(module-name) ] ;
 }
 
 # Make 'project-module' inherit attributes of project root and parent module.
-rule inherit-attributes ( project-module : project-root : parent-module ? )
+rule inherit-attributes ( project-module : parent-module )
 {
-    # Register with the project root. This will inject project-root
-    # constants and do some other initialization.
-    $(project-root).register-project $(project-module) ;
-
-    if $(parent-module)
-    {
-        local attributes = $($(project-module).attributes) ;        
-        local pattributes = [ attributes $(parent-module) ] ;
+    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 
             [ path.make [ modules.binding $(parent-module) ] ] ] ;
-        $(attributes).set default-build 
-            : [ $(pattributes).get default-build ] ;
-        $(attributes).set requirements
-            : [ $(pattributes).get requirements ] : exact ;
-        $(attributes).set usage-requirements
-            : [ $(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 "."
-            
-            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 ;
-        }        
-    }            
+    }    
+    local v = [ $(pattributes).get project-root ] ;
+    $(attributes).set project-root : $(v) : exact ;
+    $(attributes).set default-build 
+      : [ $(pattributes).get default-build ] ;
+    $(attributes).set requirements
+      : [ $(pattributes).get requirements ] : exact ;
+    $(attributes).set usage-requirements
+      : [ $(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 "."
+        
+        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 ;
+    }        
 }
 
 
@@ -374,10 +548,12 @@
     import path ;
     import print ;
     import sequence ;
+    import project ;
         
-    rule __init__ ( location )
+    rule __init__ ( location project-module )
     {       
         self.location = $(location) ;
+        self.project-module = $(project-module) ;
     }
             
     # Set the named attribute from the specification given by the user.
@@ -392,12 +568,8 @@
         }
         else if $(attribute) = "requirements" 
         {
-            specification = [ property.translate-paths $(specification)
-                              : $(self.location) ] ;            
-            specification = 
-              [ property.expand-subfeatures-in-conditions $(specification) ] ;                
-            specification = [ property.make $(specification) ] ;            
-            result = [ property-set.create $(specification) ] ;            
+            local result = [ property-set.create-from-user-input
+                $(specification) : $(self.project-module) $(self.location) ] ;
             
             # If we have inherited properties, need to refine them with the
             # specified.
@@ -451,16 +623,21 @@
             self.default-build = [ property.make $(specification) ] ;
         }        
         else if $(attribute) = "source-location"
-        { 
-            self.source-location = [ path.root 
-                [ path.make $(specification) ] $(self.location) ] ;
+        {
+            self.source-location = ;
+            for local src-path in $(specification)
+            {
+                self.source-location += [ path.root
+                    [ path.make $(src-path) ] $(self.location) ] ;
+            }
         }            
         else if $(attribute) = "build-dir"
         {
-            self.build-dir = [ path.root $(specification) $(self.location) ] ;
+            self.build-dir = [ path.root 
+                [ path.make $(specification) ] $(self.location) ] ;
         }        
         else if ! $(attribute) in "id" "default-build" "location" "source-location"
-          "parent" "projects-to-build"
+          "parent" "projects-to-build" "project-root"
         {
             errors.error "Invalid project attribute '$(attribute)' specified "
                                "for project at '$(self.location)'" ;
@@ -498,9 +675,25 @@
 # Returns the project which is currently being loaded
 rule current ( )
 {
-    return $(.current-project[1]) ;
+    return $(.current-project) ;
 }
 
+# Temporary 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]) ;
+    .saved-current-project = $(.saved-current-project[1--2]) ;
+}
+
+
+
 # Returns the project-attribute instance for the specified jamfile module.
 rule attributes ( project )
 {
@@ -531,26 +724,70 @@
     local saved-project = $(.current-project) ;
     local project-module = [ project.load $(location) ] ;
     local declared-id = [ project.attribute $(project-module) id ] ;
-
-    if ! $(declared-id)
+       
+    if ! $(declared-id) || $(declared-id) != $(id)
     {
-        error "project loaded by 'use-project' has no project-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)
+        {
+            errors.user-error 
+              "Attempt to redeclare already existing project id" ;
+        }                  
+        $(id).jamfile-module = $(project-module) ;
     }
-    if $(declared-id) != $(id)
-    {
-        error project \"$(declared-id)\" at \"$(location)\" redeclared with id \"$(id)\". ;
-    }
     .current-project = $(saved-project) ;
 }
 
 # 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.
+        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__) ] ;
+    }
+    
+    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) ;        
+    }
+
+        
     rule project ( id ? : options * : * )
     {
         import project ;
         import path ;
-                
+        import errors ;
+                        
         local attributes = [ project.attributes $(__name__) ] ;
         if $(id) 
         {
@@ -558,7 +795,9 @@
            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)) ;
@@ -566,16 +805,85 @@
             {
                 $(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 ] ;
+        
+        if $(global-build-dir)
+        {                
+            if [ $(attributes).get location ]  = [ $(attributes).get project-root ]
+            {
+                # This is Jamroot.
+                if $(id)
+                {                    
+                    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." 
+                          ;                                          
+                    }
+                    # Strip the leading slash from id.
+                    local rid = [ MATCH /(.*) : $(id) ] ;                
+                    local p = [ path.join 
+                        $(global-build-dir) $(rid) $(explicit-build-dir) ] ;
+
+                    $(attributes).set build-dir : $(p) : exact ;
+                }                
+            }                
+            else 
+            {
+                # Not Jamroot
+                if $(explicit-build-dir)
+                {                    
+                    errors.user-error "When --build-dir is specified, the 'build-project'"
+                      : "attribute is allowed only for top-level 'project' invocations" ;                      
+                }                
+            }                
+        }
+        
+
     }
+    
+    # Declare and set a project global constant. Project global constants are
+    # normal variables but should not be changed. They are applied to every
+    # child Jamfile.
+    #
+    rule constant (
+        name # Variable name of the constant.
+        : value + # Value of the constant.
+        )
+    {
+        import project ;
+        local p = [ project.target $(__name__) ] ;
+        $(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.  
+    rule path-constant (
+        name # Variable name of the constant.
+        : value + # Value of the constant.
+        )
+    {
+        import project ;
+        local p = [ project.target $(__name__) ] ;
+        $(p).add-constant $(name) : $(value) : path ;
+    }
 
+
     rule use-project ( id : where )
     {
-        import project ;
-        import path ;
-        local attributes = [ project.attributes $(__name__) ] ;
-        project.use $(id) : [ path.root 
-            [ path.make $(where) ] [ $(attributes).get location ] ] ;
+        # See comment in 'load' for explanation.
+        .used-projects += $(id) $(where) ;
     }
 
     rule build-project ( dir )
@@ -590,7 +898,11 @@
     rule explicit ( target-names * )
     {
         import project ;
-        local t = [ project.target $(__name__) ] ;
+        # 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) ;
@@ -601,35 +913,35 @@
     {
         import path ;
         import project ;
+        import sequence ;
         
-        local location = [ project.attribute $(__name__) source-location ] ;
+        local current = [ project.current ] ;
+                
+        local location = [ $(current).get source-location ] ;
 
-        local all-paths ;
-        if ! $(wildcards:D)
+        local result ;
+        local paths = [ path.glob $(location) : 
+          [ sequence.transform path.make : $(wildcards) ] ] ;
+        if $(wildcards:D)
         {
-            # No directory in any wildcard -- the simplest case.
-            all-paths = [ path.glob $(location) : $(wildcards) ] ;
-            all-paths = $(all-paths:D="") ;
-        } 
-        else
-        {
-            for local w in $(wildcards)
+            # 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.
+            for local p in $(paths)
             {
-                local l = [ path.join $(location) $(w:D) ] ;
-                local paths = [ path.glob $(l) : $(w:D="") ] ;                
-                # 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.
-                for local p in $(paths)
-                {
-                    all-paths += [ path.root $(p) [ path.pwd ] ] ;
-                }                
-            }
-            
+                result += [ path.root $(p) [ path.pwd ] ] ;
+            }                
         }
+        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.
+            result = $(paths:D="") ;
+        }
 
-        return $(all-paths) ;                
+        return $(result) ;                
     }        
 }
 
@@ -637,8 +949,4 @@
 local rule __test__ ( )
 {
     import assert ;
-    assert.result foo/bar : remove-trailing-slash foo/bar/ ;
-    assert.result foo/bar : remove-trailing-slash foo/bar ;
-    assert.result foo : remove-trailing-slash foo/ ;
-    assert.result foo : remove-trailing-slash foo ;
 }

Modified: boost-build/branches/upstream/current/build/property-set.jam
===================================================================
--- boost-build/branches/upstream/current/build/property-set.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/property-set.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -32,6 +32,8 @@
     import property-set ;
     import property ;
     import set ;
+    import path ;
+    import errors ;
             
     rule __init__ ( raw-properties * )
     {        
@@ -39,6 +41,11 @@
         
         for local p in $(raw-properties)
         {
+            if ! $(p:G)
+            {
+                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.
@@ -230,6 +237,52 @@
         return $(self.as-path) ;
     }        
     
+    # Computes the target path that should be used for 
+    # target with these properties.
+    # Returns a list of
+    #   - the computed path
+    #   - if the path is relative to 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> ] ;
+            if $(l)
+            {
+                self.target-path = $(l) ;
+            }
+            else
+            {
+                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> ] ;            
+                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))        
@@ -274,7 +327,19 @@
     # Returns all values of 'feature'.
     rule get ( feature )
     {
-        return [ feature.get-values $(feature) : $(self.raw) ] ;
+        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.
+            self.map-built = true ;
+            for local v in $(self.raw)
+            {
+                $(v:G) += $(v:G=) ;
+            }            
+        }
+        
+        return $($(feature)) ;
     }
     
 }
@@ -306,7 +371,23 @@
     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'
+rule create-from-user-input ( raw-properties * : jamfile-module location )
+{
+    local specification = [ property.translate-paths $(raw-properties)
+      : $(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) ;
+}
 
+
+
 # Returns property-set with empty set of properties.
 rule empty ( )
 {

Modified: boost-build/branches/upstream/current/build/property.jam
===================================================================
--- boost-build/branches/upstream/current/build/property.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/property.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -12,6 +12,7 @@
 import set ;
 import path ;
 import assert ;
+import indirect ;
 
 # Refines 'properties' by overriding any non-free properties 
 # for which a different value is specified in 'requirements'. 
@@ -138,19 +139,12 @@
             local e ;
             for local c in $(condition)
             {           
-                if [ MATCH "^(<toolset>|<toolset->)" : $(c:G) ] ||
-                   [ MATCH "^(<os>)" : $(c:G) ]
-                {
-                    # 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 don't validate.
-                    e += [ feature.expand-subfeatures $(c) : true ] ;
-                }               
-                else
-                {
-                    e += [ feature.expand-subfeatures $(c) ] ;
-                }                
+                # 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.
+                e += [ feature.expand-subfeatures $(c) : true ] ;
             }
             
             if $(e) = $(condition)
@@ -248,7 +242,7 @@
         {
             feature.validate-value-string $(feature) $(value) ;
         } 
-        else if ! $(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)'" ; 
@@ -404,10 +398,6 @@
             condition = $(split[1]): ;
             p = $(split[2]) ;
         }
-
-        # need to do this here to get reasonable error messages for
-        # unrecognized implicit features.
-        validate $(p) ;   
         
         if path in [ feature.attributes $(p:G) ] 
         {
@@ -428,6 +418,44 @@
     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.
+rule translate-indirect ( specification * : context-module )
+{
+    local result ;
+    for local p in $(specification)
+    {
+        local m = [ MATCH ^@(.+) : $(p:G=) ] ;
+        if $(m)
+        {
+            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.
+                m = $(context-module).$(m) ;
+            }
+            
+            local v = [ indirect.make $(m) : $(context-module) ] ;
+            v = @$(v) ;
+            result += $(v:G=$(p:G)) ;
+        }
+        else
+        {
+            result += $(p) ;
+        }                                  
+    }
+    return $(result) ;    
+}
+
+
 # Class which maintains a property set -> string
 # mapping
 class property-map

Modified: boost-build/branches/upstream/current/build/scanner.jam
===================================================================
--- boost-build/branches/upstream/current/build/scanner.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/scanner.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -27,7 +27,7 @@
 #  way, instead of relying on just target type.
 
 import "class" : new ;
-import property virtual-target ;
+import property virtual-target property-set ;
 
 #  Base scanner class. 
 class scanner 
@@ -87,21 +87,25 @@
 
 # Returns an instance of previously registered scanner,
 # with the specified properties.
-rule get ( scanner-class : properties * ) 
+rule get ( scanner-class : property-set ) 
 {
     if ! $(scanner-class) in $(.registered)
     {
         error "attempt to get unregisted scanner" ;
     }
-    local r = [ property.select $(.relevant-properties.$(scanner-class)) :
-                $(properties) ] ;
+    
+    local r = $(.rv-cache.$(property-set)) ;
     if ! $(r)
     {
-        r = "" ;
-    }    
+        r = [ property-set.create 
+            [ property.select $(.relevant-properties.$(scanner-class)) :
+              [ $(property-set).raw ] ] ] ;        
+        .rv-cache.$(property-set) = $(r) ;
+    }
+        
     if ! $(scanner.$(scanner-class).$(r:J=-))
     {
-        scanner.$(scanner-class).$(r:J=-) = [ new $(scanner-class) $(r) ] ;
+        scanner.$(scanner-class).$(r:J=-) = [ new $(scanner-class) [ $(r).raw ] ] ;
     }
     return $(scanner.$(scanner-class).$(r:J=-)) ;    
 }

Modified: boost-build/branches/upstream/current/build/targets.jam
===================================================================
--- boost-build/branches/upstream/current/build/targets.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/targets.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -79,6 +79,7 @@
 import path ;
 import set ;
 import assert ;
+import indirect ;
 
 # Base class for all abstract targets.
 class abstract-target 
@@ -89,7 +90,6 @@
         : project-target      # the project target to which this one belongs
     )
     {        
-        assert.true class.is-a $(project-target) : project-target ;
         # Note: it might seem that we don't need either name or project at all.
         # However, there are places where we really need it. One example is error
         # messages which should name problematic targets. Another is setting correct
@@ -125,17 +125,17 @@
         return $(location)/$(self.name) ;
     }
         
-    # Takes properties in split form ("<feature1>foo <feature2>bar").
-    # Generates virtual targets for this abstract target, using the specified properties,
-    # unless a different value of some feature is required by the target. The properties
-    # on returned virtual targets should be link-compatible with the requested ones.
-    #
-    # On success, returns: 
-    # - a property-set with the usage requirements to be applied to dependents
-    # - a list of produced virtual targets, which may be empty.
-    #
-    # If 'properties' are empty, performs default build of this target, in a way specific
-    # to derived class.
+    # Takes a property set.  Generates virtual targets for this abstract
+    # target, using the specified properties, unless a different value of some
+    # feature is required by the target. 
+    # On
+    # success, returns: 
+    # - a property-set with the usage requirements to be
+    #   applied to dependents 
+    # - a list of produced virtual targets, which may be
+    #    empty.  
+    # If 'property-set' are empty, performs default build of this
+    # target, in a way specific to derived class.
     rule generate ( property-set )
     {
         errors.error "method should be defined in derived classes" ;
@@ -147,6 +147,27 @@
     }        
 }
 
+if --debug-building in [ modules.peek : ARGV ]            
+{
+    modules.poke : .debug-building : true ;
+}
+
+
+rule indent ( )
+{
+    return $(.indent:J="") ;
+}
+
+rule increase-indent ( )
+{
+    .indent += "    " ;
+}
+
+rule decrease-indent ( )
+{
+    .indent = $(.indent[2-]) ;
+}
+
 #  Project target class (derived from 'abstract-target')
 #
 #  This class these responsibilities:
@@ -170,13 +191,20 @@
     import "class" : new ;
     import errors ;
         
-    rule __init__ ( name : project-module : requirements * : default-build * )
+    rule __init__ ( name : project-module parent-project ?
+        : requirements * : default-build * )
     {    
         abstract-target.__init__ $(name) : $(__name__) ;
         
         self.project-module = $(project-module) ;
+        self.location = [ project.attribute $(project-module) location ] ;
         self.requirements = $(requirements) ;
         self.default-build = $(default-build) ;
+                        
+        if $(parent-project)
+        {            
+            inherit $(parent-project) ;
+        }        
     }
 
     # This is needed only by the 'make' rule. Need to find the
@@ -190,20 +218,42 @@
     {
         return [ project.attribute $(self.project-module) $(attribute) ] ;
     }
+
+    rule build-dir ( )
+    {
+        if ! $(self.build-dir)
+        {            
+            self.build-dir = [ get build-dir ] ;
+            if ! $(self.build-dir)
+            {
+                self.build-dir = [ path.join 
+                    [ $(self.project).get location ]
+                      bin
+                ] ;
+            }
+        }
+        return $(self.build-dir) ;
+    }        
     
-    
     # Generates all possible targets contained in this project.
     rule generate ( property-set * )
     {
+        if [ modules.peek : .debug-building ] 
+        {
+            ECHO [ targets.indent ] "building project" [ name ] " ('$(__name__)') with" [ $(property-set).raw ] ;
+            targets.increase-indent ;
+        }
+                
         local usage-requirements = [ property-set.empty ] ;
         local targets ;
-        
+                
         for local t in [ targets-to-build ] 
         {
             local g = [ $(t).generate $(property-set) ] ;
             usage-requirements = [ $(usage-requirements).add $(g[1]) ] ;
             targets += $(g[2-]) ;
         }
+        targets.decrease-indent ;
         return $(usage-requirements) [ sequence.unique $(targets) ] ;        
     }
         
@@ -231,8 +281,7 @@
         local self-location = [ get location ] ;
         for local pn in [ get projects-to-build ]
         {
-            local p = [ project.module-name [ path.join $(self-location) $(pn) ] ] ;
-            result += [ project.target $(p) ] ;
+            result += [ find $(pn) ] ;
         }
                         
         return $(result) ;
@@ -283,7 +332,107 @@
             return true ;
         } 
     }
+
+    # Find and return the target with the specified id, treated
+    # relative to self.
+    rule find-really ( id )
+    {
+        local result ;    
+        local project = $(self.project) ;
+        local current-location = [ get location ] ;
+        
+        local split = [ MATCH (.*)//(.*) : $(id) ] ;        
+        local project-part = $(split[1]) ;
+        local target-part = $(split[2]) ;
+
+        local extra-error-message ;
+        if $(project-part)
+        {
+            # There's explicit project part in id. Looks up the
+            # project and pass the request to it.
+            local pm = [ project.find $(project-part) : $(current-location) ] ;
+            if $(pm)
+            {
+                project-target = [ project.target $(pm) ] ;                
+                result = [ $(project-target).find $(target-part) : no-error ] ;
+            }                      
+            else
+            {
+                extra-error-message = "error: could not find project '$(project-part)'" ;
+            }            
+        }
+        else
+        {   
+            # 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>. ;
+            #
+            # After first build we'll have target 'test' in Jamfile and file
+            # 'test' on the disk. We need target to override the file.            
+            result = [ main-target $(id) ] ;            
+            
+            if ! $(result)
+            {
+                result = [ new file-reference [ path.make $(id) ] : $(project) ] ;
+ 
+                if ! [ $(result).exists ]
+                {
+                    # File actually does not exist.
+                    # Reset 'target' so that an error is issued.
+                    result = ;
+                }            
+            }
+                                         
+            # Interpret id as project-id
+            if ! $(result)
+            {                
+                local project-module = [ project.find $(id) : $(current-location) ] ;
+                if $(project-module)
+                {
+                    result = [ project.target $(project-module) ] ;
+                }                                
+            }            
+        }
+                
+        return $(result) ;
+    }
     
+    rule find ( id : no-error ? )
+    {
+        local v = $(.id.$(id)) ;
+        if ! $(v)
+        {
+            v = [ find-really $(id) ] ;
+            if ! $(v)
+            {
+                v = none ;
+            }
+            .id.$(id) = $(v) ;
+        }
+        
+        if $(v) != none
+        {
+            return $(v) ;
+        }        
+        else
+        {
+            if ! $(no-error)
+            {
+                local current-location = [ get location ] ;
+                ECHO "error: Unable to find file or target named" ;
+                ECHO "error:     '$(id)'" ;
+                ECHO "error: referred from project at" ;
+                ECHO "error:     '$(current-location)'" ;
+                ECHO $(extra-error-message) ;
+                EXIT ;
+            }            
+        }        
+    }
+    
+
+    
     rule build-main-targets ( )
     {
         self.built-main-targets = true ;
@@ -302,6 +451,73 @@
             $(target).add-alternative $(a) ;            
         }    
     }                            
+    
+    # Accessor, add a constant.
+    rule add-constant (
+        name # Variable name of the constant.
+        : value + # Value of the constant.
+        : type ? # Optional type of value.
+        )
+    {
+        switch $(type)
+        {
+            case path :
+              local r ;
+              for local v in $(value)
+              {                  
+                v = [ path.root [ path.make $(v) ] $(self.location) ] ;
+                # Now make the value absolute path
+                v = [ path.root $(v) [ path.pwd ] ] ;
+                # Constants should be in platform-native form
+                v = [ path.native $(v) ] ;
+                r += $(v) ;
+              }                  
+              value = $(r) ;
+        }
+        if ! $(name) in $(self.constants)
+        {
+            self.constants += $(name) ;
+        }
+        self.constant.$(name) = $(value) ;
+        # Inject the constant in the scope of project-root module
+        modules.poke $(self.project-module) : $(name) : $(value) ;
+    }
+    
+    rule inherit ( parent )
+    {
+        for local c in [ modules.peek $(parent) : self.constants ] 
+        {
+            # No need to pass the type. Path constants were converted to
+            # absolute paths already by parent.
+            add-constant $(c) 
+              : [ modules.peek $(parent) : self.constant.$(c) ] ;
+        }       
+
+        # 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.
+        local user-rules = [ set.difference 
+            [ RULENAMES $(parent-module) ] :
+            [ RULENAMES project-rules ] ] ;
+        IMPORT $(parent-module) : $(user-rules) : $(this-module) : $(user-rules) ;
+        EXPORT $(this-module) : $(user-rules) ;
+    }
+    
+    
+    # Intern the constants from this project into the specified module.
+    #
+    rule intern-constants (
+        target-module # The module to intern into.
+        )
+    {
+        for local c in $(self.constants)
+        {
+            modules.poke $(target-module) : $(c) : $(self.constant.$(c)) ;
+        }
+    }
+
 }
 
 
@@ -366,7 +582,7 @@
 
     # Returns the best viable alternative for this property-set
     # See the documentation for selection rules.
-    local rule select-alternatives ( property-set )
+    local rule select-alternatives ( property-set debug ? )
     {
         # When selecting alternatives we have to consider defaults,
         # for example:
@@ -389,7 +605,7 @@
             while $(worklist) && ! $(bad)
             {
                 local v = $(worklist[1]) ; 
-                local properties = [ $(v).match $(property-set) ] ;
+                local properties = [ $(v).match $(property-set) $(debug) ] ;              
                            
                 if $(properties) != no-match
                 {                                    
@@ -534,11 +750,8 @@
         local best-alternatives = [ select-alternatives $(property-set) ] ;
         if ! $(best-alternatives)
         {
-            errors.error
-                "failed to build" [ full-name ]
-                "with properties" [ $(property-set).raw ]
-                  "because no best-matching alternative could be found"
-                  ; 
+            ECHO "error: No best alternative for" [ full-name ] ;
+            select-alternatives $(property-set) debug ;
             return [ property-set.empty ] ;
         }
         else
@@ -578,24 +791,42 @@
     
     rule generate ( properties )
     {
-         return [ property-set.empty ] 
-                [ virtual-target.from-file $(self.name) : $(self.project) ] ;        
+        location ;
+        return [ property-set.empty ] 
+               [ virtual-target.from-file $(self.name)
+                                         : $(self.file-location)
+                                         : $(self.project) ] ;        
     }    
 
     # Returns true if the referred file really exists;
     rule exists ( )
     {
-        local location = [ path.root $(self.name)
-          [ $(self.project).get source-location ] ] ;        
-        return [ path.exists [ path.native $(location) ] ] ;
-    }    
-    
+        location ;
+        return $(self.file-path) ;
+    }
+           
     # Returns the location of target. Needed by 'testing.jam'
     rule location ( )
     {
-        return [ path.root $(self.name)
-          [ $(self.project).get source-location ] ] ;    
-    }    
+        if ! $(self.file-location)
+        {
+            local source-location = [ $(self.project).get source-location ] ;
+
+            for local src-dir in $(source-location)
+            {
+                if ! $(self.file-location)
+                {
+                    local location = [ path.root $(self.name) $(src-dir) ] ;
+                    if [ CHECK_IF_FILE [ path.native $(location) ] ]
+                    {
+                         self.file-location = $(src-dir) ;
+                         self.file-path = $(location) ;
+                    }
+                }
+            }
+        }
+        return $(self.file-location) ;
+    }
 }
 
 
@@ -605,90 +836,6 @@
 }
 
 
-rule find ( id : project )
-{
-    local current-location = [ $(project).get location ] ;
-    local target ;    
-    
-    local split = [ MATCH (.*)//(.*) : $(id) ] ;
-    
-    local project-part = $(split[1]) ;
-    local target-part = $(split[2]) ;
-    if ! $(split)
-    {
-        target-part = $(id) ;
-    }
-        
-    # Make a more convenient name
-    local have-project-reference = $(split) ;
-    
-    # The project used for finding main targets and for providing base directory
-    # for file paths.
-    local base-project ;
-    if $(project-part) 
-    {
-        local pm = [ project.find $(project-part) : $(current-location) ] ;
-        # If we can't find a project, it means project part is invalid.
-        # Don't assign any value to base-project, the below code will eventually
-        # return empty result.
-        if $(pm)
-        {                  
-            base-project = [ project.target $(pm) ] ;
-        }        
-    }
-    else
-    {
-        # No project part in id. Resolve references relatively to the referring
-        # project.
-        base-project = $(project) ;
-    }
-    
-    
-    # Interpret target-part as project-id
-    if ! $(have-project-reference)
-    {   
-        local project-module = [ project.find $(target-part) : $(current-location) ] ;
-        if $(project-module)
-        {
-            target = [ project.target $(project-module) ] ;
-        }        
-    }
-    
-    # Interpret target-name as name of main target
-    if ! $(target) && $(base-project)
-    {
-        if [ $(base-project).has-main-target $(target-part) ] 
-        {
-            target = [ $(base-project).main-target $(target-part) ] ;
-        }
-    }
-    
-    if ! $(target) && ! $(have-project-reference)
-    {
-        target = [ new file-reference [ path.make $(target-part) ] : $(project) ] ;        
-        if ! [ $(target).exists ]
-        {
-            # File actually does not exist.
-            # Reset 'target' so that an error is issued.
-            target = ;
-        }                
-    }
-        
-    if ! $(target)
-    {
-        ECHO "error: Unable to find file or target named" ;
-        ECHO "error:     '$(id)'" ;
-        ECHO "error: referred from project at" ;
-        ECHO "error:     '$(current-location)'" ;
-        EXIT ;
-        
-        
-        errors.error "Unable to resolve target-id $(id)" : 
-          "Reference was made from project at '$(current-location)'" ;
-    }        
-    return $(target) ;
-}
-
 # 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.
@@ -705,16 +852,8 @@
     }
 
     # Find the target
-    local target = 
-      [ find $(id) :  $(project) ] ;
+    local target = [ $(project).find $(id) ] ;
     
-    # Do a sanity check
-    if $(sproperties) && [ class.is-a $(target) : file-reference ] 
-    {
-        errors.error 
-          "error: target reference '$(target-reference)' contains properties," :
-          "error: but refers to a file" ;
-    }
     return $(target) [ property-set.create $(sproperties) ] ;
 }
 
@@ -788,27 +927,52 @@
     # Apply non-conditional requirements. 
     # There's a slight bug here: it's possible that conditional
     # requirement change a value set by non-conditional requirements. This
-    # should be error, but we don't detect it yet.
+    # should be error, but we don't detect it yet.   
+    
     local raw = [ $(build-request).raw ] ;
     raw = [ property.refine $(raw) : 
       [ feature.expand [ $(requirements).non-conditional ] ] ] ;
-    
+      
     # 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.        
     
     local conditionals = [ $(requirements).conditional ] ;
-    local count = $(conditionals) and-once-more ;
+    # 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.
+    local count = $(conditionals) 
+                  [ $(requirements).get <conditional> ]                    
+                  and-once-more ;
     local prev ;
     
     local current = $(raw) ;
     
+    # It's assumed that ordinary conditional requirements can't add
+    # <indirect-conditional> properties, and that rules refered
+    # 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
         local e = [ property.evaluate-conditionals-in-context $(conditionals) 
           : $(current) ] ;
+        
+        # Evaluate indirect conditionals.
+        for local i in $(indirect)
+        {
+            e += [ indirect.call $(i) $(current) ] ;
+        }
+                             
         if $(e) = $(prev)
         {                
             # If we got the same result, we've found final properties.
@@ -878,6 +1042,8 @@
     
     # Returns the list of abstract-targets which are used as sources.
     # The extra properties specified for sources are not represented.
+    # The only used of this rule at the moment is the "--dump-test"
+    # feature of the test system.
     rule sources ( )
     {
         if ! $(self.source-targets) {
@@ -902,7 +1068,7 @@
     
     # Returns the alternative condition for this alternative, if
     # the condition is satisfied by 'property-set'.
-    rule match ( 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.
@@ -915,36 +1081,28 @@
         local bcondition = [ $(self.requirements).base ] ;
         local ccondition = [ $(self.requirements).conditional ] ;
         local condition = [ set.difference $(bcondition) : $(ccondition) ] ;
+        if $(debug)
+        {
+            ECHO "    next alternative: required properties:" $(condition:E=(empty)) ;
+        }                
+        
         if $(condition) in [ $(property-set).raw ] 
         {
-            return $(condition) ;            
+            if $(debug)
+            {
+                ECHO "        matched" ;
+            }            
+            return $(condition) ;                        
         }
         else
         {
+            if $(debug)
+            {
+                ECHO "        not matched" ;
+            }            
             return no-match ;
         }        
     }
-
-    #
-    # Allows the user to tag the name of the target, according to properties.
-    #
-    rule tag-name ( name : property-set )
-    {
-        local properties = [ $(property-set).raw ] ;
-
-        local tagged-name = $(name) ;
-
-        if <tag> in $(properties:G)
-        {
-            local tags = [ $(property-set).get <tag> ] ;
-            for local tag in $(tags)
-            {
-                tagged-name = $(tagged-name)$(tag) ;
-            }
-        }
-
-        return $(tagged-name) ;
-    }
     
     # Takes a target reference, which might be either target id
     # or a dependency property, and generates that target using
@@ -963,7 +1121,6 @@
             local result = 
               [ targets.generate-from-reference $(id) : $(self.project) 
                 : $(property-set) ] ;
-            check-for-link-compatibility $(result[2-]) : $(property-set) ;
         
             $(result-var) += $(result[2-]:G=$(grist)) ;
             $(usage-requirements-var) += [ $(result[1]).raw ] ;
@@ -976,17 +1133,24 @@
     # overridden.
     rule generate ( property-set )
     {
-        if --debug-targets in [ modules.peek : ARGV ]
+        if [ modules.peek : .debug-building ] 
         {
-            ECHO "Building $(self.name) with" [ $(property-set).raw ] ;
+            ECHO [ targets.indent ] "Building target '$(self.name)'" ;
+            ECHO [ targets.indent ] "Build request: " [ $(property-set).raw ] ;
+            targets.increase-indent ;
         }
                 
         if ! $(self.generated.$(property-set)) 
         {           
             local rproperties = [ targets.common-properties $(property-set) 
-              $(self.requirements) ] ;            
+              $(self.requirements) ] ;           
+            
+            if [ modules.peek : .debug-building ] 
+            {
+                ECHO [ targets.indent ] "Common properties are" [ $(rproperties).raw ] ;
+            }
                         
-            if $(rproperties[1]) != "@error"                    
+            if $(rproperties[1]) != "@error" && [ $(rproperties).get <build> ] != no
             {
                 local source-targets ;
                 local properties = [ $(rproperties).non-dependency ] ;
@@ -999,9 +1163,10 @@
                 generate-dependencies $(self.sources) : $(rproperties)
                   : source-targets usage-requirements ;
                 
-                if --debug-targets in [ modules.peek : ARGV ]
+                if [ modules.peek : .debug-building ] 
                 {
-                    ECHO "Usage requirements for $(self.name) are $(usage-requirements)" ;
+                    ECHO [ targets.indent ] 
+                      "Usage requirements for $(self.name) are " $(usage-requirements) ;
                 }
 
                 rproperties = [ property-set.create $(properties) 
@@ -1014,29 +1179,54 @@
                 # we link to two library which have the same <library> in
                 # usage requirements.
                 source-targets = [ sequence.unique $(source-targets) ] ;
-                                                
-                local tagged-name = [ tag-name $(self.name) : $(rproperties) ] ;
-
-                local original-name = $(self.name) ;
-                self.name = $(tagged-name) ;
+                                                               
+                local result = 
+                  [ construct $(self.name) : 
+                    $(source-targets) : $(rproperties) ] ;
                 
-                local result = 
-                  [ construct $(source-targets) : $(rproperties) ] ;
+                local gur = $(result[1]) ;
+                result = $(result[2-]) ;
 
-                local s = [ create-subvariant $(result) : $(property-set) : $(source-targets)
+                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) ] ;
+                ur = [ $(ur).add $(gur) ] ;
                 $(s).set-usage-requirements $(ur) ;
+                if [ modules.peek : .debug-building ] 
+                {
+                    ECHO [ targets.indent ]
+                      "Usage requirements from $(self.name) are "
+                        [ $(ur).raw ] ;
+                }
+                
+                
                 self.generated.$(property-set) = $(ur) $(result) ;
-
-                self.name = $(original-name) ;
             } 
             else
             {
                 self.generated.$(property-set) = $(rproperties) ;
+                
+                if $(rproperties[1]) != "@error"
+                {
+                    ECHO "Skipping build of" [ full-name ] "-- <build>no in properties." ;
+                }
             }       
         }                
+        else
+        {
+            if [ modules.peek : .debug-building ] 
+            {
+                ECHO [ targets.indent ] "Already built" ;
+            }            
+        }
+        
+        
+        targets.decrease-indent ;
         return $(self.generated.$(property-set)) ;
     }
 
@@ -1058,23 +1248,49 @@
         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.
+        #
+        # That feature specifies which pch file to use, and should apply
+        # only to direct dependents. Consider:
+        #
+        #   pch pch1 : ...
+        #   lib lib1 : ..... pch1 ;
+        #   pch pch2 : 
+        #   lib lib2 : pch2 lib1 ;
+        #
+        # 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.
+        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) ;
     }
     
     # Creates a new subvariant-dg instances for 'targets'
-    local rule create-subvariant ( targets * : build-request : sources * :
+    # - '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
+    local rule create-subvariant ( root-targets * 
+        : all-targets * : build-request : sources * :
         rproperties 
         : usage-requirements )
     {
-        for local e in $(targets)                    
+        for local e in $(root-targets)                    
         {
             $(e).root true ;
         }                    
         
         # Process all vtargets that will be created if this main target
         # is created.
-        local all-targets = 
-          [ sequence.transform virtual-target.traverse : $(targets) ] ; 
         local s = [ new subvariant $(__name__) : $(build-request) : $(sources)
           : $(rproperties) : $(usage-requirements) : $(all-targets) ] ;
         for local v in $(all-targets)          
@@ -1086,41 +1302,11 @@
         }                        
         return $(s) ;
     }
-               
-    # Checks if 'targets' are link-compatible with 'build-request' and
-    # issues a warning if that's not the case.
-    local rule check-for-link-compatibility ( targets * : build-request )
-    {
-        local checked ;
-        for local t in $(targets)
-        {
-            local a = [ $(t).action ] ;
-            if $(a)
-            {
-                local p = [ $(a).properties ] ;
-                if ! $(p) in $(cheched)
-                {
-                    if [ $(p).link-incompatible-with $(build-request) ]
-                    {
-                        local s = [ $(t).creating-subvariant ] ;
-                        local other-mt = [ $(s).main-target ] ;
-                        ECHO "warning: targets produced from" [ $(other-mt).name ] 
-                            "are link incompatible" ;
-                        ECHO "warning: with main target" [ name ] ;
-                    }                    
-                }                
-                checked += $(p) ;
-            }            
-        }
         
-    }
-    
-    
-        
     # Constructs the virtual targets for this abstract targets and
     # the dependecy graph. Returns the list of virtual targets.
     # Should be overrided in derived classes.
-    rule construct ( source-targets * : properties * )
+    rule construct ( name : source-targets * : properties * )
     {
         errors.error "method should be defined in derived classes" ;
     }
@@ -1144,16 +1330,29 @@
         return $(self.type) ;
     }
             
-    rule construct ( source-targets * : property-set )
+    rule construct ( name : source-targets * : property-set )
     {
-        local r = [ generators.construct $(self.project) $(self.name) : $(self.type) 
+        local r = [ generators.construct $(self.project) $(name:S=) : $(self.type) 
           : [ property-set.create [ $(property-set).raw ] # [ feature.expand
               <main-target-type>$(self.type) ]
           # ]
             : $(source-targets) ] ;
         if ! $(r)
-        {
-            errors.error "unable to construct" [ full-name ] ;
+        {                        
+            ECHO "error: 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) ]
+            {
+                ECHO "error: no generators were found for type '$(self.type)'" ;
+                ECHO "error: and the requested properties" ;
+                ECHO "error: make sure you've configured the needed tools" ;
+                ECHO "See http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html" ;
+            }
+            
+            ECHO "To debug this problem, try the --debug-generators option." ;
+            EXIT ;
         }
         
         return $(r) ;
@@ -1171,13 +1370,8 @@
         if [ class.is-instance $(t) ]
         {
             local name = [ $(t).name ] ;
-            # NOTE: on windows, this won't work if 'main-target-name'
-            # if single letter. But other alternatives are even worse.
-            local new-name = $(main-target-name)..$(name) ;
+            local new-name = $(main-target-name)__$(name) ;
             $(t).rename $(new-name) ;
-            #local p = [ $(t).project ] ;            
-            #local pt = [ project.target $(p) ] ;
-            #$(pt).rename-main-target $(name) : $(new-name) ;
             result += $(new-name) ;
         }
         else
@@ -1199,10 +1393,10 @@
       )
 {
     local loc = [ $(project).get location ] ;
-    local requirements = [ property.translate-paths $(specification) : $(loc) ] ; 
-    local requirements = 
-      [ property.expand-subfeatures-in-conditions $(requirements) ] ;
-    local requirements = [ property-set.create $(requirements) ] ;
+    local jamfile-module = [ $(project).project-module ] ;
+    local requirements = [ property-set.create-from-user-input $(specification)
+      : $(jamfile-module) $(loc) ] ;
+    
     local project-requirements = [ $(project).get requirements ] ;
     requirements = [ $(project-requirements).refine $(requirements) ] ;    
     if $(requirements[1]) = "@error" 

Modified: boost-build/branches/upstream/current/build/toolset.jam
===================================================================
--- boost-build/branches/upstream/current/build/toolset.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/toolset.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -23,11 +23,7 @@
 rule using ( toolset-module : * )
 {
     import $(toolset-module) ;
-    if ! $(.$(toolset-module)-init-callled)
-    {        
-        $(toolset-module)-init-callled = true ;
-        $(toolset-module).init $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
-    }    
+    $(toolset-module).init $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
 }
 
 # Expands subfeatures in each property sets.
@@ -70,6 +66,16 @@
                               # "gcc". Subfeatures, like in "<toolset>gcc-3.2"
                               # are allowed. If left empty, the flag will
                               # always used.
+                              #
+                              # Propery sets may use value-less properties 
+                              # ('<a>'  vs. '<a>value') to match absent 
+                              # properties. This allows to separately match
+                              #
+                              #   <architecture>/<address-model>64
+                              #   <architecture>ia64/<address-model>
+                              #
+                              # Where both features are optional. Without this
+                              # syntax we'd be forced to define "default" value.
 
 
              values * :       # The value to add to variable. If <feature>
@@ -77,16 +83,35 @@
                               # will be added.
              unchecked ?      # If value 'unchecked' is passed, will not test
                               # that flags are set for the calling module.
+             : hack-hack ?    # For 
+                              #   flags rule OPTIONS <cxx-abi> : -model ansi
+                              # Treak <cxx-abi> as condition
+                              # FIXME: ugly hack.                      
           )
 {
-    local module_ = [ MATCH "([^.]*).*" : $(rule-or-module) ] ;
     local caller = [ CALLER_MODULE ] ;
-    if $(unchecked) != unchecked && $(module_) != $(caller)
+    if ! [ MATCH ".*([.]).*" : $(rule-or-module) ]
+       && [ MATCH "(Jamfile<.*)" : $(caller) ]
     {
-        errors.error "Module $(caller) attempted to set flags for module $(module_)" ;
+        # Unqualified rule name, used inside Jamfile.
+        # (most likely used with 'make' or 'notfile' rules.
+        # This prevents setting flags on entire Jamfile module
+        # (this will be considered as rule), but who cares?
+        # Probably, 'flags' rule should be split into 'flags' and
+        # 'flags-on-module'.
+        rule-or-module = $(caller).$(rule-or-module) ;
     }
+    else
+    {              
+        local module_ = [ MATCH "([^.]*).*" : $(rule-or-module) ] ;
+        if $(unchecked) != unchecked && $(module_) != $(caller)
+        {
+            errors.error "Module $(caller) attempted to set flags for module $(module_)" ;
+        }
+    }
     
-    if $(condition) && ! $(condition:G=)
+    
+    if $(condition) && ! $(condition:G=) && ! $(hack-hack)
     {
         # We have condition in the form '<feature>', that is, without
         # value. That's a previous syntax:
@@ -131,15 +156,44 @@
 
 # Returns the first element of 'property-sets' which is a subset of
 # 'properties', or an empty list if no such element exists.
-local rule find-property-subset ( property-sets * : properties * )
+rule find-property-subset ( property-sets * : properties * )
 {
+    # cut property values off
+    local prop-keys = $(properties:G) ;
+
     local result ;
     for local s in $(property-sets)
     {
         if ! $(result)
         {
-            if [ feature.split $(s) ] in $(properties)
+            # Handle value-less properties like '<architecture>' (compare with 
+            # '<architecture>x86').
+
+            local set = [ feature.split $(s) ] ;
+
+            # Find the set of features that
+            # - have no property specified in required property set 
+            # - are omitted in build property set
+            local default-props ;
+            for local i in $(set)
             {
+                # If $(i) is a value-less property it should match default 
+                # value of an optional property. See the first line in the 
+                # example below:
+                #
+                #  property set     properties     result
+                # <a> <b>foo      <b>foo           match
+                # <a> <b>foo      <a>foo <b>foo    no match
+                # <a>foo <b>foo   <b>foo           no match
+                # <a>foo <b>foo   <a>foo <b>foo    match
+                if ! ( $(i:G=) || ( $(i:G) in $(prop-keys) ) )
+                {
+                    default-props += $(i) ;
+                }
+            }
+
+            if $(set) in $(properties) $(default-props)
+            {
                 result = $(s) ;
             }
         }
@@ -194,45 +248,89 @@
     }
     else
     {
-        result += $(values) ;
+        result += $(value) ;
     }      
     return $(result) ;
 }
 
-
-rule set-target-variables ( rule-or-module targets + : properties * )
-{ 
+# Given a rule name and a property set, returns a list of interleaved
+# variables names and values which must be set on targets for that
+# rule/property-set combination. 
+rule set-target-variables-aux ( rule-or-module : property-set )
+{
+    local result ;
+    properties = [ $(property-set).raw ] ;
     for local f in $(.$(rule-or-module).flags) 
     {
         local variable = $(.$(rule-or-module).variable.$(f)) ;
         local condition = $(.$(rule-or-module).condition.$(f)) ;
         local values = $(.$(rule-or-module).values.$(f)) ;
-        local result ;
         
+        
         if ! $(condition) ||
           [ find-property-subset $(condition) : $(properties) ]
         {
-            result += [ handle-flag-value $(values) : $(properties) ] ;
+            local processed ;
+            for local v in $(values)
+            {                
+                # The value might be <feature-name> so needs special
+                # treatment.
+                processed += [ 
+                  handle-flag-value $(v) : $(properties) ] ;
+            }
+            for local r in $(processed)
+            {                        
+                result += $(variable) $(r) ;
+            }            
         }
-
-        # Without this test, the assignment below would create a
-        # target variable even if $(result) is empty.  That is
-        # undesirable because the empty target variable would mask
-        # module globals intended to be used as defaults.
-        if $(result)-is-nonempty
-        {
-            $(variable) on $(targets) += $(result) ;
-        }
     }
     
     # strip away last dot separated part and recurse.
     local next = [ MATCH ^(.+)\\.([^\\.])* : $(rule-or-module) ] ;
     if $(next)
     {
-        set-target-variables $(next) $(targets) : $(properties) ;        
-    }    
+        result += [
+          set-target-variables-aux $(next[1]) : $(property-set) ] ;        
+    }        
+    return $(result) ;    
 }
 
+
+rule set-target-variables ( rule-or-module targets + : property-set )
+{     
+    properties = [ $(property-set).raw ] ;
+    local key = $(rule-or-module).$(property-set) ;
+    local settings = $(.stv.$(key)) ;
+    if ! $(settings)
+    {
+        settings = [ 
+          set-target-variables-aux $(rule-or-module) : $(property-set) ] ;
+
+        if ! $(settings)
+        {
+            settings = none ;
+        }
+        .stv.$(key) = $(settings) ;
+    }
+    
+    if $(settings) != none
+    {
+        local var-name = ;
+        for local name-or-value in $(settings)
+        {
+            if $(var-name)
+            {
+                $(var-name) on $(targets) += $(name-or-value) ;
+                var-name = ;
+            }
+            else
+            {
+                var-name = $(name-or-value) ;
+            }
+        }
+    }
+}
+
 .toolsets += $(toolset) ;
 
 # Registers a new toolset
@@ -333,7 +431,7 @@
         local id = [ MATCH "[^.]*\.(.*)" : [ $(g).id ] ] ;
         rules += $(id) ;
     }    
-    IMPORT $(base) : $(rules) : $(toolset) : $(rules) : localized ;
+    IMPORT $(base) : $(rules) : $(toolset) : $(rules) ;
     # Import the rules to the global scope
     IMPORT $(toolset) : $(rules) : : $(toolset).$(rules) ;
 }
@@ -346,4 +444,10 @@
     local p = <b>0 <c>1 <d>2 <e>3 <f>4 ;
     assert.result <c>1/<d>2/<e>3 : find-property-subset <c>1/<d>2/<e>3 <a>0/<b>0/<c>1 <d>2/<e>5 <a>9 : $(p) ;
     assert.result : find-property-subset <a>0/<b>0/<c>9/<d>9/<e>5 <a>9 : $(p) ;
+
+    local p-set = <a>/<b> <a>0/<b> <a>/<b>1 <a>0/<b>1 ;
+    assert.result <a>/<b>   : find-property-subset $(p-set) :           ;
+    assert.result <a>0/<b>  : find-property-subset $(p-set) : <a>0      <c>2 ;
+    assert.result <a>/<b>1  : find-property-subset $(p-set) : <b>1      <c>2 ;
+    assert.result <a>0/<b>1 : find-property-subset $(p-set) : <a>0 <b>1 ;
 }

Modified: boost-build/branches/upstream/current/build/type.jam
===================================================================
--- boost-build/branches/upstream/current/build/type.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/type.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -28,18 +28,11 @@
 feature.feature base-target-type : : composite optional free ;
 # feature.feature main-target-type : : composite optional incidental ;
 
-# Store suffixes for generated targets
-.suffixes = [ new property-map ] ;
-
 # Registers a target type, possible derived from a 'base-type'. 
 # If 'suffixes' are provided, they given all the suffixes that mean a file is of 'type'.
 # Also, the first element gives the suffix to be used when constructing and object of
 # 'type'.
-# If 'main' is given, a rule with the same name as the target type
-# and signature
-#     rule target-type ( name : sources * : requirements * : default-build )
-# will be added to the global scope.
-rule register ( type : suffixes * : base-type ? : main ? ) 
+rule register ( type : suffixes * : base-type ? )
 {
     # Type names cannot contain hyphens, because when used as
     # feature-values they will be interpreted as composite features
@@ -57,6 +50,7 @@
     {
         .types += $(type) ;
         .bases.$(type) = $(base-type) ;
+        .derived.$(base-type) += $(type) ;        
 
         if $(suffixes)-not-empty
         {            
@@ -74,15 +68,16 @@
         feature.extend base-target-type : $(type) ;
 #        feature.compose <target-type>$(type) : <base-target-type>$(type) ;
         feature.compose <base-target-type>$(type) : <base-target-type>$(base-type) ;
-        
-        if $(main)
-        {
-            main-rule-name = [ type-to-rule-name $(type) ] ;            
-            .main-target-type.$(main-rule-name) = $(type) ;    
+
+        # We used to declare main target rule only when 'main' parameter
+        # is specified. However, it's hard to decide that a type *never*
+        # will need a main target rule and so from time to time we needed
+        # to make yet another type 'main'. So, now main target rule is defined
+        # for each type.
+        main-rule-name = [ type-to-rule-name $(type) ] ;            
+        .main-target-type.$(main-rule-name) = $(type) ;    
             
-            IMPORT $(__name__) : main-target-rule : : $(main-rule-name) ;
-#            feature.compose <main-target-type>$(type) : <base-target-type>$(type) ;
-        }        
+        IMPORT $(__name__) : main-target-rule : : $(main-rule-name) ;
     }
 }
 
@@ -155,10 +150,10 @@
 }
 
 # Returns a scanner instance appropriate to 'type' and 'properties'.
-rule get-scanner ( type : properties * )
+rule get-scanner ( type : property-set )
 {
     if $(.scanner.$(type)) {
-        return [ scanner.get $(.scanner.$(type)) : $(properties) ] ;
+        return [ scanner.get $(.scanner.$(type)) : $(property-set) ] ;
     }    
 }
 
@@ -174,6 +169,17 @@
     return $(result) ;
 }
 
+rule all-derived ( type )
+{
+    local result = $(type) ;
+    for local d in $(.derived.$(type))
+    {
+        result += [ all-derived $(d) ] ;
+    }
+    return $(result) ;      
+}
+
+
 # Returns true if 'type' has 'base' as its direct or
 # indirect base.
 rule is-derived ( type base )
@@ -199,6 +205,13 @@
 }
 
 
+# Store suffixes for generated targets
+.suffixes = [ new property-map ] ;
+
+# Store prefixes for generated targets (e.g. "lib" for library)
+.prefixes = [ new property-map ] ;
+
+
 # Sets a target suffix that should be used when generating target 
 # of 'type' with the specified properties. Can be called with
 # empty properties if no suffix for 'type' was specified yet.
@@ -212,36 +225,79 @@
 # no suffix should be used.
 rule set-generated-target-suffix ( type : properties * : suffix )
 {
-    properties = <target-type>$(type) $(properties) ;
-    $(.suffixes).insert $(properties) : $(suffix) ;
+    set-generated-target-ps  suffix : $(type) : $(properties) : $(suffix) ;
 }    
 
 # Change the suffix previously registered for this type/properties 
 # combination. If suffix is not yet specified, sets it.
 rule change-generated-target-suffix ( type : properties * : suffix )
 {        
+    change-generated-target-ps  suffix : $(type) : $(properties) : $(suffix) ;
+}
+
+rule generated-target-suffix ( type : property-set )
+{
+    return [ generated-target-ps  suffix : $(type) : $(property-set) ] ;
+}
+
+# Sets a target prefix that should be used when generating target 
+# of 'type' with the specified properties. Can be called with
+# empty properties if no prefix for 'type' was specified yet.
+#
+# The 'prefix' parameter can be empty string ("") to indicate that
+# no prefix should be used.
+#
+# Example usage is for library names that have to have a "lib"
+# prefix as in unix.
+rule set-generated-target-prefix ( type : properties * : prefix )
+{
+    set-generated-target-ps  prefix : $(type) : $(properties) : $(prefix) ;
+}    
+
+# Change the prefix previously registered for this type/properties 
+# combination. If prefix is not yet specified, sets it.
+rule change-generated-target-prefix ( type : properties * : prefix )
+{        
+    change-generated-target-ps  prefix : $(type) : $(properties) : $(prefix) ;
+}
+
+rule generated-target-prefix ( type : property-set )
+{
+    return [ generated-target-ps  prefix : $(type) : $(property-set) ] ;
+}
+
+# Common rules for prefix/suffix provisioning follow
+
+rule set-generated-target-ps ( ps : type : properties * : psval )
+{
+    properties = <target-type>$(type) $(properties) ;
+    $(.$(ps)es).insert $(properties) : $(psval) ;
+}    
+
+rule change-generated-target-ps ( ps : type : properties * : psval )
+{        
     properties = <target-type>$(type) $(properties) ;    
-    local prev = [ $(.suffixes).find-replace $(properties) : $(suffix) ] ;
+    local prev = [ $(.$(ps)es).find-replace $(properties) : $(psval) ] ;
     if ! $(prev)
     {
-        set-generated-target-suffix $(type) : $(properties) : $(suffix) ;
+        set-generated-target-ps $(ps) : $(type) : $(properties) : $(psval) ;
     }    
 }
 
-
-# Returns suffix that should be used when generating target of 'type',
-# with the specified properties. If not suffix were specified for
-# 'type', returns suffix for base type, if any.
-rule generated-target-suffix ( type : properties * )
+# Returns either prefix or suffix (as indicated by 'ps') that
+# should be used when generating target of 'type' with the specified properties.  
+# Parameter 'ps' can be either "prefix" or "suffix".  If no prefix/suffix is 
+# specified for 'type', returns prefix/suffix for base type, if any.
+rule generated-target-ps-real ( ps : type : properties * )
 {
     local result ;
     local found ;
     while $(type) && ! $(found)
     {
-        result = [ $(.suffixes).find <target-type>$(type) $(properties) ] ;
-        # If the suffix is explicitly set to empty string, we consider suffix
-        # to be found. If we did not compare with "", there would be no
-        # way for user to set empty suffix.
+        result = [ $(.$(ps)es).find <target-type>$(type) $(properties) ] ;
+        # If the prefix/suffix is explicitly set to empty string, 
+        # we consider prefix/suffix to be found. If we did not compare with "", 
+        # there would be no way for user to set empty prefix/suffix.
         if $(result)-is-not-empty
         {
             found = true ;
@@ -255,6 +311,29 @@
     return $(result) ;
 }
 
+
+rule generated-target-ps ( ps : type : property-set )
+{
+    local key = .$(ps).$(type).$(property-set) ;
+    local v = $($(key)) ;
+    if ! $(v)
+    {
+        v = [ generated-target-ps-real $(ps) : $(type)
+          : [ $(property-set).raw ] ] ;
+        if ! $(v)
+        {
+            v = none ;
+        }
+        $(key) = $(v) ;
+    }
+    
+    if $(v) != none
+    {
+        return $(v) ;
+    }        
+}
+
+
 # Returns file type given it's name. If there are several dots in filename,
 # tries each suffix. E.g. for name of "file.so.1.2" suffixes "2", "1", and 
 # "so"  will be tried.

Modified: boost-build/branches/upstream/current/build/version.jam
===================================================================
--- boost-build/branches/upstream/current/build/version.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/version.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -5,7 +5,7 @@
 
 rule boost-build ( )
 {
-    return "V2 (Milestone 10)" ;
+    return "V2 (Milestone 11)" ;
 }
 rule jam ( )
 {

Modified: boost-build/branches/upstream/current/build/virtual-target.jam
===================================================================
--- boost-build/branches/upstream/current/build/virtual-target.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build/virtual-target.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -9,7 +9,7 @@
 #  if particular target should be created at all.
 
 import "class" : new ;
-import path property-set utility sequence errors set ;
+import path property-set utility sequence errors set type os ;
 
 #                       +--------------------------+
 #                       | virtual-target           |
@@ -166,25 +166,11 @@
 # implementation
     rule actualize-no-scanner ( )
     {
-        local name = [ actual-name ] ;
-
-        # Do anything only on the first invocation
-        if ! $(self.made.$(name)) {
-            self.made.$(name) = true ;
-            
-            virtual-target.register-actual-name $(name) : $(__name__) ;            
-
-            for local i in $(self.dependencies) {
-                DEPENDS $(name) : [ $(i).actualize ] ;
-            }
-
-            actualize-location $(name) ;
-            actualize-action $(name) ;
-        }
-        return $(name) ;
-    }
-
-
+        # In fact, we just need to merge virtual-target with 
+        # abstract-virtual-target and the latter is the only class
+        # derived from the former. But that's for later.
+        errors.error "method should be defined in derived classes" ;        
+    }    
 }
 
 
@@ -201,35 +187,37 @@
 class abstract-file-target : virtual-target
 {
     import project regex sequence path type ;
+    import property-set ;
+    import indirect ;
     
-    rule __init__ ( name
-        : type ?  # Optional type for this target
-                  : project
+    rule __init__ ( 
+         name     # Name for this target
+        exact ?   # If non-empty, the name is exactly the name
+                  # created file should have. Otherwise, the '__init__'
+                  # method will add suffix obtained from 'type' by
+                  # calling 'type.generated-target-suffix'.
+        : type ?  # The type of this target.
+        : project
+        : action ?
     )
     {
         virtual-target.__init__ $(name) : $(project) ;
             
         self.type = $(type) ;
-        self.action = ;
+        self.action = $(action) ;
+        if $(action)
+        {         
+            $(action).add-targets $(__name__) ;
+
+            if $(self.type) && ! $(exact)              
+            {                
+                _adjust-name $(name) ;
+            }            
+        }        
     }
     
     rule type ( ) { return $(self.type) ; }
-    rule set-type ( type )
-    {
-        self.type = $(type) ;
-    }
 
-    # Sets the suffix. When generating target name, it will be used in preference to
-    # the suffix that is associated with 'type'
-    rule suffix ( suffix ? )
-    {
-        if $(suffix)
-        {
-            self.suffix = $(suffix) ;
-        }
-        return $(self.suffix) ;
-    }
-
     # Sets the path. When generating target name, it will override any path
     # computation from properties.
     rule set-path ( path )
@@ -239,16 +227,12 @@
 
     # If 'a' is supplied, sets action to 'a'.
     # Returns the action currently set.
-    rule action ( a ? )
+    rule action ( )
     {
-        if $(a)
-        {
-            self.action = $(a) ;
-        }
         return $(self.action) ;
     }
 
-    # Sets/gets the 'root' flag. Target is root is it directly correspods to some
+    # Sets/gets the 'root' flag. Target is root if it directly correspods to some
     # variant of a main target.
     rule root ( set ? )
     {
@@ -259,18 +243,6 @@
         return $(self.root) ;
     }
     
-    rule set-intermediate ( value ? )
-    {
-        self.intermediate = $(value) ;
-    }
-    
-    rule intermediate ( )      
-    {
-        return $(self.intermediate) ;
-    }
-    
-    
-
     # Gets or sets the subvariant which created this target. Subvariant
     # is set when target is brought into existance, and is never changed
     # after that. In particual, if target is shared by subvariant, only 
@@ -288,10 +260,10 @@
             }
             else
             {                
-                self.creatin-subvariant = $(s) ;
+                self.creating-subvariant = $(s) ;
             }            
         }
-        return $(self.creatin-subvariant) ;
+        return $(self.creating-subvariant) ;
     }
 
     rule actualize-action ( target )
@@ -360,8 +332,8 @@
         if ! $(self.actual-name)
         {            
             local grist = [ grist ] ;
-            
-            local basename = [ actual-basename ] ;
+
+            local basename = [ path.native $(self.name) ] ;
             self.actual-name = <$(grist)>$(basename) ;
             
         }
@@ -379,7 +351,7 @@
         local path = [ path ] ;
         if $(path)
         {
-            # The target will be generated to a know path. Just use the path
+            # The target will be generated to a known path. Just use the path
             # for identification, since path is as unique as it can get.
             return p$(path) ;            
         }
@@ -395,43 +367,118 @@
             {
                 local ps = [ $(self.action).properties ] ;     
                 local property-grist = [ $(ps).as-path ] ;
-                location-grist = $(location-grist)/$(property-grist) ;
+                # 'property-grist' can be empty when 'ps' is an empty
+                # property set.
+                if $(property-grist)
+                {                    
+                    location-grist = $(location-grist)/$(property-grist) ;
+                }                
             }            
                         
             return l$(location-grist) ;
         }                
-    }
+    }            
+
+    # Given the target name specified in constructor, returns the
+    # name which should be really used, by looking at the <tag> properties.
+    # The tag properties come in two flavour:
+    #   - <tag>value, 
+    #   - <tag>@rule-name
+    # In the first case, value is just added to name
+    # In the second case, the specified rule is called with specified name,
+    # target type and properties and should return the new name.
+    # If not <tag> property is specified, or the rule specified by
+    # <tag> returns nothing, returns the result of calling 
+    # virtual-target.add-suffix
+    rule _adjust-name ( specified-name )
+    {        
+        local ps ;
+        if $(self.action) 
+        {
+            ps = [ $(self.action).properties ] ;
+        }
+        else
+        {
+            ps = [ property-set.empty ] ;
+        }
         
-    # Helper to actual-name, above. Compute the 'basename' of the filename
-    # of the actual created file.
-    rule actual-basename ( )
-    {
-        local name = [ path.native $(self.name) ] ;
-        if $(self.suffix)
+        local tag = [ $(ps).get <tag> ] ;
+
+        if $(tag)
         {
-            name = $(name).$(self.suffix) ;
+            local rule-name = [ MATCH ^@(.*) : $(tag) ] ;
+            if $(rule-name)
+            {
+                if $(tag[2])
+                {
+                    errors.error "<tag>@rulename is present but is not the only <tag> feature" ;
+                }
+                
+                self.name = [ indirect.call $(rule-name) $(specified-name) :
+                  $(self.type) :  $(ps) ] ;
+            }
+            else
+            {
+                errors.error 
+                  "The value of the <tag> feature must be '@rule-nane'" ;
+            }
         }
-        else if $(self.type)
-        {
-            local properties ;
+        
+        # If there's no tag or the tag rule returned nothing.
+        if ! $(tag) || ! $(self.name)
+        {                            
+            self.name = [ virtual-target.add-prefix-and-suffix
+                $(specified-name) : $(self.type) : $(ps) ] ;
+        }    
+    }
+
+    rule actualize-no-scanner ( )
+    {
+        local name = [ actual-name ] ;
+
+        # Do anything only on the first invocation
+        if ! $(self.made.$(name)) {
+            self.made.$(name) = true ;
+            
             if $(self.action)
-            {
-                local ps = [ $(self.action).properties ] ;
-                properties = [ $(ps).raw ] ;
-            }                        
-            local suffix = [ type.generated-target-suffix $(self.type) :
-              $(properties) ] ;
-            if $(suffix)
             {                
-                name = $(name).$(suffix) ;
-            }            
+                # For non-derived target, we don't care if there
+                # are several virtual targets that refer to the same name.
+                # One case when this is unavoidable is when file name is
+                # main.cpp and two targets have types CPP (for compiling)
+                # and MOCCABLE_CPP (for convertion to H via Qt tools).
+                virtual-target.register-actual-name $(name) : $(__name__) ;
+            }
+                        
+            for local i in $(self.dependencies) {
+                DEPENDS $(name) : [ $(i).actualize ] ;
+            }
+
+            actualize-location $(name) ;
+            actualize-action $(name) ;
         }
-        return $(name) ;        
+        return $(name) ;
     }
     
+}
 
+# Appends the suffix appropriate to 'type/property-set' combination
+# to the specified name and returns the result.
+rule add-prefix-and-suffix ( specified-name : type ? : property-set )
+{
+    local suffix = [ type.generated-target-suffix $(type) : $(property-set) ] ;
+    suffix = .$(suffix) ;
+    
+    local prefix = [ type.generated-target-prefix $(type) : $(property-set) ] ;
+      
+    if  [ MATCH ^($(prefix)) : $(specified-name) ]
+    {
+        prefix = ;
+    }
+    return $(prefix:E="")$(specified-name)$(suffix:E="") ;
 }
 
+
 # File target with explicitly known location.
 #
 # The file path is determined as
@@ -450,16 +497,28 @@
 {
     import common ;    
     import errors ;
+    import "class" : new ;
     
     rule __init__ (
-      name
+      name exact ?
         : type ?  # Optional type for this target
         : project
+        : action ?
+        : path ?
     )
     {
-        abstract-file-target.__init__ $(name) : $(type) : $(project) ;   
+        abstract-file-target.__init__ $(name) $(exact) : $(type) : $(project) 
+          : $(action) ;   
+
+        self.path = $(path) ;
     }
-        
+    
+    rule clone-with-different-type ( new-type )
+    {
+        return [ new file-target $(self.name) exact : $(new-type)
+          : $(self.project) : $(self.action) : $(self.path) ] ;
+    }
+            
     rule actualize-location ( target )
     {
         if $(self.action)
@@ -471,12 +530,41 @@
             # Make sure the path exists.
             DEPENDS $(target) : $(path) ;
             common.MkDir $(path) ;
+
+            # It's possible that the target name includes a directory
+            # too, for example when installing headers. Create that
+            # directory.
+            if $(target:D)
+            {
+                local d = $(target:D) ;
+                d = $(d:R=$(path)) ;
+                DEPENDS $(target) : $(d) ;
+
+                common.MkDir $(d) ;
+            }            
+            
+            # For real file target, we create a fake target that
+            # depends on the real target. This allows to run
+            #
+            #    bjam hello.o
+            #
+            # without trying to guess the name of the real target.            
+            # Note the that target has no directory name, and a special
+            # grist <e>.
+            #
+            # First, that means that "bjam hello.o" will build all
+            # known hello.o targets.
+            # Second, the <e> grist makes sure this target won't be confused
+            # with other targets, for example, if we have subdir 'test'
+            # with target 'test' in it that includes 'test.o' file,
+            # then the target for directory will be just 'test' the target
+            # for test.o will be <ptest/bin/gcc/debug>test.o and the target
+            # we create below will be <e>test.o
+            DEPENDS $(target:G=e) : $(target) ;
         }
         else
         {
-            # This is a source file.
-            SEARCH on $(target) =
-              [ path.native [ $(self.project).get source-location ] ] ;
+            SEARCH on $(target) = [ path.native $(self.path) ] ;
         }        
     }
     
@@ -486,21 +574,18 @@
         if ! $(self.path)
         {
             if $(self.action)
-            {                
-                local build-dir = [ $(self.project).get build-dir ] ;
-                if ! $(build-dir)
-                {
-                    build-dir = [ path.join 
-                        [ $(self.project).get location ]
-                        bin
-                    ] ;
+            {       
+                local p = [ $(self.action).properties ] ;                
+                local path = [ $(p).target-path ] ;
+                
+                if $(path[2]) = true
+                {        
+                    # Indicates that the path is relative to
+                    # build dir.
+                    path = [ path.join [ $(self.project).build-dir ]
+                       $(path[1]) ] ;
                 }
-                
-                local path = [ path.join
-                    $(build-dir)
-                      [ $(self.action).path ]
-                ] ;
-                
+                                
                 # Store the computed path, so that it's not recomputed
                 # any more
                 self.path = [ path.native $(path) ] ;
@@ -513,11 +598,16 @@
 
 class notfile-target : abstract-file-target
 {
-    rule __init__ ( name : project )
+    rule __init__ ( name : project : action ? )
     {
-        abstract-file-target.__init__ $(name) : : $(project) ;
+        abstract-file-target.__init__ $(name) : : $(project) : $(action) ;
     }
     
+    # Returns nothing, to indicate that target path is not known.
+    rule path ( )
+    {
+        return ;
+    }
             
     rule actualize-location ( target )
     {
@@ -534,11 +624,10 @@
 # not establish dependency relationship, but should do everything else.
 class action 
 {
-    import type toolset property-set indirect class path ;
+    import type toolset property-set indirect class path assert errors ;
     
-    rule __init__ ( targets + : sources * : action-name + : property-set ? )
+    rule __init__ ( sources * : action-name + : property-set ? )
     {        
-        self.targets = $(targets) ;
         self.sources = $(sources) ;
     
         self.action-name = [ indirect.make-qualified $(action-name) ] ;
@@ -556,6 +645,11 @@
         self.properties = $(property-set) ;
     }        
     
+    rule add-targets ( targets * )
+    {
+        self.targets += $(targets) ;
+    }
+        
     rule targets ( )
     {
         return $(self.targets) ;
@@ -584,16 +678,15 @@
             self.actualized = true ;
 
             local ps = [ properties ] ;
-            local properties = [ adjust-properties [ $(ps).raw ] ] ;
+            local properties = [ adjust-properties $(ps) ] ;
 
-
             local actual-targets ;
             for local i in [ targets ]
             {
                 actual-targets += [ $(i).actualize ] ;
             }
 
-            actualize-sources [ sources ] ;
+            actualize-sources [ sources ] : $(properties) ;
 
             DEPENDS $(actual-targets) : $(self.actual-sources) $(self.dependency-only-sources) ;
 
@@ -604,19 +697,19 @@
                 : $(properties) ;
             
             indirect.call $(self.action-name) 
-              $(actual-targets) : $(self.actual-sources) : $(properties)
+              $(actual-targets) : $(self.actual-sources) : [ $(properties).raw ] 
                 ;
             
             # Since we set up creating action here, we also set up
             # action for cleaning up
-            common.Clean clean : $(actual-targets) ;
+            common.Clean clean-all : $(actual-targets) ;
         }
     }
 
     # Helper for 'actualize-sources'.
     # For each passed source, actualizes it with the appropriate scanner.
     # Returns the actualized virtual targets.
-    rule actualize-source-type ( sources * )
+    rule actualize-source-type ( sources * : property-set )
     {
         local result = ;
         for local i in $(sources)
@@ -625,7 +718,7 @@
             if [ $(i).type ]
             {
                 scanner =
-                  [ type.get-scanner [ $(i).type ] : $(properties) ] ;
+                  [ type.get-scanner [ $(i).type ] : $(property-set) ] ;
             }
             result += [ $(i).actualize $(scanner) ] ;
         }
@@ -641,44 +734,41 @@
     #
     # New values will be *appended* to the variables. They may be non-empty,
     # if caller wants it.
-    rule actualize-sources ( sources * )
+    rule actualize-sources ( sources * : property-set )
     {
         local dependencies = [ $(self.properties).get <dependency> ] ;
                 
-        self.dependency-only-sources += [ actualize-source-type $(dependencies) ] ;
-        self.actual-sources += [ actualize-source-type $(sources) ] ;
-    }
+        self.dependency-only-sources += [ 
+          actualize-source-type $(dependencies) : $(property-set) ] ;
+        self.actual-sources += [ 
+          actualize-source-type $(sources) : $(property-set) ] ;
 
-    rule path ( )
-    {
-        local p = [ $(self.properties).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 = [ $(self.properties).get <location-prefix> ] ;
-        if $(prefix)
+        # This is used to help bjam find dependencies in generated headers
+        # in other main targets.
+        # Say:
+        #
+        #   make a.h : ....... ;
+        #   exe hello : hello.cpp : <implicit-dependency>a.h ;
+        #
+        # However, for bjam to find the dependency the generated target must
+        # be actualized (i.e. have the jam target). In the above case,
+        # if we're building just hello ("bjam hello"), 'a.h' won't be
+        # actualized unless we do it here.
+        local implicit = [ $(self.properties).get <implicit-dependency> ] ;
+        for local i in $(implicit)
         {
-            p = [ path.join $(prefix) $(p) ] ;
+            $(i:G=).actualize ;
         }        
-        return $(p) ;
     }
 
     # Determined real properties when trying building with 'properties'.
     # This is last chance to fix properties, for example to adjust includes
     # to get generated headers correctly. Default implementation returns
     # its argument.
-    rule adjust-properties ( properties * )
+    rule adjust-properties ( property-set )
     {
-        return $(properties) ;
+        return $(property-set) ;
     }
-
-
-    rule set-targets ( targets * )
-    {
-        self.targets = $(targets) ;
-    }
 }
 
 # Action class which does nothing --- it produces the targets with
@@ -687,9 +777,9 @@
 # actions which create them.
 class null-action : action 
 {
-    rule __init__ ( targets + : property-set ? )
+    rule __init__ ( property-set ? )
     {
-        action.__init__ $(targets) : : .no-action : $(property-set) ;
+        action.__init__  : .no-action : $(property-set) ;
     }
         
     rule actualize ( )
@@ -706,42 +796,56 @@
     }
 }
 
+# Class which acts exactly like 'action', except that the sources
+# are not scanned for dependencies.
+class non-scanning-action : action 
+{
+    rule __init__ ( sources * : action-name + : property-set ? )
+    {        
+        action.__init__ $(sources) : $(action-name) : $(property-set) ;
+    }
+    rule actualize-source-type ( sources * : property-set )
+    {
+        local result ;
+        for local i in $(sources)
+        {
+            result += [ $(i).actualize ] ;
+        }        
+        return $(result) ;
+    }
+}
 
+
 # Creates a virtual target with approariate name and type from 'file'.
 # If a target with that name in that project was already created, returns that already
 # created target.
 # FIXME: more correct way would be to compute path to the file, based on name and source location
 # for the project, and use that path to determine if the target was already created.
 # TODO: passing project with all virtual targets starts to be annoying.
-rule from-file ( file : project )
+rule from-file ( file : file-loc : project )
 {
     import type ; # had to do this here to break a circular dependency
 
     # Check if we've created a target corresponding to this file.
-    local source-location = [ $(project).get source-location ] ;
-    local path = [ path.root [ path.root [ path.make $(file) ] $(source-location) ] 
-      [ path.pwd ] ] ;
-                
+    local path = [ path.root [ path.root $(file) $(file-loc) ]
+                             [ path.pwd ] ] ;
+
     if $(.files.$(path))
     {
         return $(.files.$(path)) ;
     }
     else
     {
-        local name = [ path.make $(file:S=) ] ;
+        local name = [ path.make $(file) ] ;
         local type = [ type.type $(file) ] ;
         local result ;
-        if ! $(type)
-        {
-            # warning "cannot determine type for file $(file)" ;
-            result = [ new file-target $(file) :  : $(project) ] ;
-        }
-        else
-        {
-            local v = [ new file-target $(name) : $(type) : $(project) ] ;
-            $(v).suffix [ MATCH ^.(.*)$ : $(file:S) ] ;
-            result = $(v) ;
-        }
+
+        result = [ new file-target $(file)
+                         : $(type)
+                         : $(project)
+                         : #action
+                         : $(file-loc) ] ;
+
         .files.$(path) = $(result) ;
         return $(result) ;
     }
@@ -754,7 +858,8 @@
 rule register ( target )
 {
     local signature = [ sequence.join
-        [ $(target).actual-name ] : - ] ;    
+       [ $(target).path ] [ $(target).name ] : - ] ;    
+
             
     local result ;
     for local t in $(.cache.$(signature))
@@ -791,10 +896,52 @@
         .cache.$(signature) += $(target) ;     
         result = $(target) ;
     }
+    
+    .recent-targets += $(result) ;
+    .all-targets += $(result) ;
 
     return $(result) ;
 }
 
+
+# Each target returned by 'register' is added to a list of
+# 'recent-target', returned by this function. So, this allows
+# us to find all targets created when building a given main
+# target, even if the target
+rule recent-targets ( )
+{
+    return $(.recent-targets) ;
+}
+
+rule clear-recent-targets ( )
+{
+    .recent-targets = ;
+}
+
+# Returns all virtual targets ever created
+rule all-targets ( )
+{
+    return $(.all-targets) ;
+}
+
+# Returns all targets from 'targets' with types
+# equal to 'type' or derived from it.
+rule select-by-type ( type : targets * )
+{
+    local result ;
+    for local t in $(targets)
+    {
+        if [ type.is-subtype [ $(t).type ] $(type) ]
+        {
+            result += $(t) ;
+        }         
+    }
+    
+    return $(result) ;    
+}
+
+
+
 rule register-actual-name ( actual-name : virtual-target )
 {
     if $(.actual.$(actual-name))
@@ -822,9 +969,9 @@
         }        
         errors.error "Duplicate name of actual target:" $(actual-name) 
           : "previous virtual target" [ $(.actual.$(actual-name)).str ] 
-          : "created from" [ $(cmt1).location ]
+          : "created from" [ $(cmt1).full-name ]
           : "another virtual target" [ $(virtual-target).str ]
-          : "created from" [ $(cmt2).location ]                
+          : "created from" [ $(cmt2).full-name ]                
           : "added properties: " $(properties-added) 
           : "removed properties: " $(properties-removed) ;
     }
@@ -881,13 +1028,18 @@
     {
         new-properties = [ $(action).properties ] ;
     }
-                    
+
+    local action-class = [ modules.peek $(action) : __class__ ] ;
+    local cloned-action = [ class.new $(action-class)  
+      [ $(action).sources ] : $(new-action-name) : $(new-properties) ] ;
+                        
     local cloned-targets ;
     for local target in [ $(action).targets ]
     {
         local n = [ $(target).name ] ;
-        local cloned-target = [ class.new file-target $(n:D=) : [ $(target).type ] 
-          : $(new-project) ] ;
+        # Don't modify the name of the produced targets.Strip the directory f
+        local cloned-target = [ class.new file-target $(n) exact : [ $(target).type ] 
+          : $(new-project) : $(cloned-action) ] ;
         local d = [ $(target).dependencies ] ;
         if $(d)
         {            
@@ -898,130 +1050,10 @@
         
         cloned-targets += $(cloned-target) ;
     }        
-        
-    local action-class = [ modules.peek $(action) : __class__ ] ;
-    
-    local cloned-action = [ class.new $(action-class) $(cloned-targets) : 
-      [ $(action).sources ] : $(new-action-name) : $(new-properties) ] ;
-    
-    for local cloned-target in $(cloned-targets)
-    {        
-        $(cloned-target).action $(cloned-action) ;
-    }
-    
-    
+                    
     return $(cloned-action) ;        
 }
 
-
-
-
-# Clones a dependency graph template, given one of its root,
-# and a new source target to instantinate the template with.
-#
-# If 'target's name is "%" and type is equal to 'new-source's
-# return 'new-source', otherwise created a new target:
-#  - if there "%" in target's name, its replaced with 'new-target's
-#  - project for new target is the same as for 'new-target'
-#  - other attributes are copied
-#
-# If 'dont-recurse' is not set, clones action, which results in
-# cloning of other targets, and, ultimately, cloning of the
-# entire dependency graph.
-#
-# The 'new-project' parameter tells what project should be assigned
-# for newly created non-source targets.
-rule clone-template ( target dont-recurse ? : new-source : new-project : dont-register ? )
-{
-    local name = [ $(new-source).name ] ;
-    local old-name = [ $(target).name ] ;
-    local new-name = $(old-name) ;
-    local m = [ MATCH (.*)(%)(.*) : $(old-name) ] ;
-    if $(m)
-    {
-        if [ $(target).action ]
-        {
-            new-name = [ sequence.join $(m[1]) $(name:D=) $(m[3]) ] ;
-        }
-        else
-        {
-            new-name = [ sequence.join $(m[1]) $(name) $(m[3]) ] ;
-        }
-    }
-
-    if $(old-name) = % && [ $(target).type ] = [ $(new-source).type ]
-    {
-        return $(new-source) ;
-    }
-    else
-    {
-        local cloned = [ new file-target $(new-name) : [ $(target).type ] :
-          $(new-project) ] ;
-        $(cloned).set-intermediate [ $(target).intermediate ] ;
-
-        if ! $(dont-recurse) && [ $(target).action ]
-        {
-            local cloned-action = [ clone-action-template
-                [ $(target).action ] $(target) $(cloned) : $(new-source) : $(new-project) ] ;
-
-            cloned-targets = $(cloned) ;
-            for t in [ $(cloned-action).targets ]
-            {
-                if $(t) != $(target)
-                {
-                    cloned-targets +=
-                      [ clone-template $(t) dont-recurse : $(new-source) : $(new-project) 
-                        # We don't want to pass new targets vis 'register' util we've
-                        # finished building them -- i.e. until we assign the action.
-                        # It might seem registering this not-yet ready target is
-                        # harmless, but in fact the 'register' logic expects than
-                        # registered target is never changed later.
-                        : dont-register ] ;
-                }
-            }
-            local cloned-targets2 ;
-            for local t in $(cloned-targets)
-            {
-                $(t).action $(cloned-action) ;
-
-                cloned-targets2 += [ register $(t) ] ;
-
-            }
-            
-            $(cloned-action).set-targets $(cloned-targets2) ;
-            cloned = $(cloned-targets2[1]) ;
-        }
-        else
-        {
-            if ! $(dont-register)
-            {                
-                cloned = [ register $(cloned) ] ;
-            }            
-        }
-        return $(cloned) ;
-    }
-}
-
-# Clones an action template: helper for clone-template above.
-local rule clone-action-template ( action from cloned-from : new-source : new-project )
-{
-    local targets ;
-    local sources ;
-
-    for local t in [ $(action).sources ]
-    {
-        sources += [ clone-template $(t) : $(new-source) : $(new-project) ] ;
-    }
-
-    local action-class = [ modules.peek $(action) : __class__ ] ;
-
-    local ps = [ $(action).properties ] ;
-    local cloned = [ new $(action-class) [ $(action).targets ] : $(sources)
-                     : [ $(action).action-name ] : $(ps) ] ;
-
-    return $(cloned) ;
-}
-
 class subvariant
 {
     import sequence ;    
@@ -1091,17 +1123,19 @@
     # Returns all targets referenced by this subvariant,
     # either directly or indirectly, and 
     # either as sources, or as dependency properties.
+    # Targets referred with dependency property are returned a properties,
+    # not targets.
     rule all-referenced-targets ( )
     {
         # Find directly referenced targets.
         local deps = [ $(self.build-properties).dependency ] ;
-        local all-targets = $(self.sources) $(deps:G=) ;
+        local all-targets = $(self.sources) $(deps) ;
         
         # Find other subvariants.
         local r ;
         for local t in $(all-targets)
         {            
-            r += [ $(t).creating-subvariant ] ;
+            r += [ $(t:G=).creating-subvariant ] ;
         }
         r = [ sequence.unique $(r) ] ;
         for local s in $(r) 

Modified: boost-build/branches/upstream/current/build-system.jam
===================================================================
--- boost-build/branches/upstream/current/build-system.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/build-system.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -20,7 +20,7 @@
 import property-set ;
 import build-request ;
 import errors : error ;
-import project-roots ;
+import virtual-target ;
 import "class" : new ;
 
 import builtin ;
@@ -29,61 +29,133 @@
 
 import version ;
 
+# Returns the location of the build system. The primary use case
+# is building Boost, where it's sometimes needed to get location
+# of other components (like BoostBook files), and it's convenient
+# to use location relatively to Boost.Build path.
+rule location ( )
+{
+    local r = [ modules.binding build-system ] ;
+    return $(r:P) ;
+}
+
+
 # Check if we can load 'test-config.jam'. If we can, load it and
 # ignore user configs.
-local test-config = [ GLOB [ modules.peek : BOOST_BUILD_PATH ] : test-config.jam ] ;
+
+local test-config = [ GLOB [ os.environ BOOST_BUILD_PATH ] : test-config.jam ] ;
 if $(test-config)
 {
+    if --debug-configuration in [ modules.peek : ARGV ]
+    {
+        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 
+    {
+        import toolset : using : using ;
+    }
     import test-config ;    
 }
 
-if ! $(test-config) && ! --ignore-config in [ modules.peek : ARGV ] 
+local ignore-config ;
+if $(test-config) || --ignore-config in [ modules.peek : ARGV ] 
 {    
-    module site-config 
-    {
-        import toolset : using ;
-    }
+    ignore-config = true ;
+}
 
-    module user-config 
-    {
-        import toolset : using ;
-    }
-
-    local user-path = [ modules.peek : HOME ] [ modules.peek : BOOST_BUILD_PATH ] ;
+local user-path = [ os.home-directories ] [ os.environ BOOST_BUILD_PATH ] ;
+    
+# Load site-config.
+module site-config 
+{
+    import project : initialize ;
+    initialize site-config ;        
+}
+    
+if ! $(ignore-config)
+{   
+    local path ; 
     if [ os.name ] in NT CYGWIN
     {    
-        modules.load site-config : : [ modules.peek : SystemRoot ] $(user-path) ;
-        modules.load user-config : : $(user-path) ;    
-    }    
+        path = [ modules.peek : SystemRoot ] $(user-path) ;   
+    }
     else
     {
-        modules.load site-config : : /etc $(user-path) ;
-        modules.load user-config : : $(user-path) ;    
+        path = /etc $(user-path) ;
     }
+    
+    
+    if --debug-configuration in [ modules.peek : ARGV ]
+    {
+        local where = [ GLOB $(path) : site-config.jam ] ;
+        if $(where)
+        {            
+            ECHO "notice: loading site-config.jam from" 
+              [ NORMALIZE_PATH $(where[1]) ] ;
+        }        
+    }        
+        
+    modules.load site-config : : $(path) ;
+    project.load-used-projects site-config ;
 }
 
 
+# Load user-config.
+module user-config 
+{
+    import project : initialize ;
+    initialize user-config ;        
+}
+
+if ! $(ignore-config)
+{    
+    if --debug-configuration in [ modules.peek : ARGV ]
+    {
+        local where = [ GLOB $(user-path) : user-config.jam ] ;
+        if $(where)
+        {
+            ECHO "notice: loading user-config.jam from" 
+              [ NORMALIZE_PATH $(where[1]) ] ;
+        }        
+    }    
+        
+    modules.load user-config : : $(user-path) ;    
+    project.load-used-projects user-config ;
+}    
+
+
+if USER_MODULE in [ RULENAMES ]
+{
+    USER_MODULE site-config user-config ;
+}
+
+
+
 if --version in [ modules.peek : ARGV ]
 {
     version.print ;
     EXIT ;
 }
 
+
+
 # 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.
-current-project = [ project.target [ project.load "." ] ] ;
+if [ project.find "." : "." ]
+{    
+    current-project = [ project.target [ project.load "." ] ] ;
+}    
 
-if [ MATCH (--dump-projects) : [ modules.peek : ARGV ] ]
-{
-    project-roots.print ;
-}
-
 if ! [ feature.values <toolset> ] 
 {
     ECHO "warning: no toolsets are configured." ;
     ECHO "warning: you won't be able to build C++ programs." ;
-    ECHO "warning: please consult the documentation." ;
+    ECHO "warning: please consult the documentation at" ;
+    ECHO "warning: http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html" ;
     ECHO ;
 }
 
@@ -103,30 +175,98 @@
     }
     expanded = $(xexpanded) ;    
 }
+else
+{
+    expanded = [ property-set.empty ] ;
+}
 
 
+
 local target-ids = [ $(build-request).get-at 1 ] ;
 local targets
 local clean ;
 
 
+if "--clean-all" in [ modules.peek : ARGV ]
+{
+    cleanall = true ;
+}
+
 if "--clean" in [ modules.peek : ARGV ]
 {
     clean = true ;
 }
 
+
+local bjam-targets ;
+
+# Given a target it, try to find and return corresponding target.
+# This is only invoked when there's no Jamfile in "."
+# This code somewhat duplicates code in project-target.find but we can't  reuse
+# that code without project-targets instance.
+rule find-target ( target-id )
+{
+    local split = [ MATCH (.*)//(.*) : $(target-id) ] ;        
+    
+    local pm ;
+    if $(split)
+    {
+        pm = [ project.find $(split[1]) : "." ] ;
+    }
+    else
+    {
+        pm = [ project.find $(target-id) : "." ] ;
+    }
+        
+    local result ;    
+    if $(pm)
+    {
+        result = [ project.target $(pm) ] ;
+    }
+        
+    if $(split)
+    {
+        result = [ $(result).find $(split[2]) ] ;
+    }
+    
+    return $(result) ;
+}
+
+
+
+if ! $(current-project) 
+{
+    if ! $(target-ids)
+    {        
+        ECHO "error: no Jamfile in current directory found, and no target references specified."  ;
+        EXIT ;
+    }
+}
+
+
 for local id in $(target-ids)
 {
     if $(id) = clean
     {
         clean = true ;
-    }
+    }    
     else
     {
-        local t = [ targets.find $(id) : $(current-project) ] ;
+        local t ;
+        if $(current-project)
+        {
+            t = [ $(current-project).find $(id) : no-error ] ;
+        }
+        else
+        {
+            t = [ find-target $(id) ] ;
+        }
+        
         if ! $(t)
         {
-            error target $(id) does not exist ;
+            ECHO "notice: could not find main target " $(id) ;
+            ECHO "notice: assuming it's a name of file to create " ;
+            bjam-targets += $(id) ;
         }
         else
         {
@@ -142,27 +282,90 @@
 
 virtual-targets = ;
 
-if $(expanded) 
-{        
-    for local p in $(expanded)
+# Virtual targets obtained when building main targets references on
+# the command line. When running
+#
+#   bjam --clean main_target
+#
+# we want to clean the files that belong only to that main target,
+# so we need to record which targets are produced.
+local results-of-main-targets ;
+
+for local p in $(expanded)
+{
+    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: 
+#
+#    bjam --clean foo
+#
+# where 'foo' is a directory, then we want to clean targets
+# which are in 'foo' or in any children Jamfiles, but not in any
+# unrelated Jamfiles. So, we collect the list of project under which
+# cleaning is allowed.
+#
+
+local projects-to-clean ;
+local targets-to-clean ;
+if $(clean) || $(clean-all)
+{    
+    for local t in $(targets)
     {
-        for local t in $(targets)
-        {   
-            local g = [ $(t).generate $(p) ] ;
-            virtual-targets += $(g[2-]) ;
-        }        
+        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) ] ;        
 }
-else
+
+# Returns 'true' if 'project' is a child of 'current-project',
+# possibly indirect, or is equal to 'project'.
+# Returns 'false' otherwise.
+rule is-child ( project )
 {
-    for local t in $(targets)
-    {        
-        local g = [ $(t).generate [ property-set.empty ] ] ;
-        virtual-targets += $(g[2-]) ;
-    }    
+    if ! $(.is-child.$(project))
+    {
+        local r = false ;
+        if $(project) in $(projects-to-clean)
+        {            
+            r = true ;
+        }
+        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)) ;    
 }
 
 
+
+
 actual-targets = ;
 for t in $(virtual-targets)
 {
@@ -171,10 +374,42 @@
 NOTFILE all ;
 DEPENDS all : $(actual-targets) ;
 
-if $(clean)
+if $(bjam-targets)
 {
+    UPDATE $(bjam-targets:G=e) ;        
+}
+else if $(cleanall)
+{    
+    UPDATE clean-all ;
+}
+else if $(clean)
+{
+    local to-clean ;
+    for local t in [ virtual-target.all-targets ]
+    {
+        local p = [ $(t).project ] ;
+
+        # Remove only derived targets.
+        if [ $(t).action ]
+        {                    
+            if $(t) in $(targets-to-clean)
+              || [ is-child [ $(p).project-module ] ] = true
+              {
+                  to-clean += $(t) ;
+              }        
+        }        
+    }
+    local to-clean-actual ;
+    for local t in $(to-clean)
+    {
+        to-clean-actual += [ $(t).actualize ] ;
+    }
+    common.Clean clean : $(to-clean-actual) ;
     UPDATE clean ;
+    
+    
 }
+
 else
 {
     UPDATE all ;


Property changes on: boost-build/branches/upstream/current/build-system.jam
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/debian/rules
===================================================================
--- boost-build/branches/upstream/current/debian/rules	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/debian/rules	2006-11-09 09:53:31 UTC (rev 14016)
@@ -26,7 +26,7 @@
 
 	(tar --exclude make --exclude CVS -cpf - example/* ) | ( cd `pwd`/debian/tmp/usr/share/doc/boost-build && tar xpf - )
 
-	sed 's/#  using gcc/using gcc/' user-config.jam > `pwd`/debian/tmp/etc/site-config.jam
+	sed 's/#  using gcc ;/using gcc ;/' user-config.jam > `pwd`/debian/tmp/etc/site-config.jam
 
 #	dh_install
 #	dh_installmenu


Property changes on: boost-build/branches/upstream/current/debian/rules
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/doc/Jamfile.v2
===================================================================
--- boost-build/branches/upstream/current/doc/Jamfile.v2	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/Jamfile.v2	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,13 +1,20 @@
 
+import quickbook
+    ;
+
 project tools/build/v2/doc 
     ;
 
-boostbook userman : src/userman.xml 
+boostbook userman : src/standalone.xml 
    : <xsl:param>toc.section.depth=1
      <xsl:param>doc.standalone=true 
      <xsl:param>nav.layout=none
+     <implicit-dependency>jam_docs
+     <dependency>jam_docs     
    ;
    
+xml jam_docs : ../../../jam/doc/bjam.qbk ;   
+   
 if ! $(BOOST_ROOT)
 {   
     BOOST_ROOT = [ modules.peek : BOOST_ROOT ] ;   

Deleted: boost-build/branches/upstream/current/doc/catalog.xml
===================================================================
--- boost-build/branches/upstream/current/doc/catalog.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/catalog.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE catalog 
-  PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
-  "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
-<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
-  <rewriteURI uriStartString="http://www.boost.org/tools/boostbook/dtd/" rewritePrefix="file:///home/ghost/Work/boost/tools/boostbook/dtd//"/>
-  <rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/current/" rewritePrefix="file:///home/ghost/build/docbook/xsl/"/>
-  <rewriteURI uriStartString="http://www.oasis-open.org/docbook/xml/4.2/" rewritePrefix="file:///home/ghost/build/docbook/dtd/"/>
-</catalog>

Modified: boost-build/branches/upstream/current/doc/html/HTML.manifest
===================================================================
--- boost-build/branches/upstream/current/doc/html/HTML.manifest	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/HTML.manifest	2006-11-09 09:53:31 UTC (rev 14016)
@@ -5,12 +5,16 @@
 bbv2/tutorial/properties.html
 bbv2/tutorial/hierarchy.html
 bbv2/tutorial/libs.html
-bbv2/tutorial/depends.html
+bbv2/tutorial/testing.html
 bbv2/tutorial/linkage.html
 bbv2/tutorial/conditions.html
 bbv2/tutorial/prebuilt.html
 bbv2/advanced.html
-bbv2/advanced/jamfiles.html
+bbv2/advanced/configuration.html
+bbv2/advanced/invocation.html
+bbv2/advanced/targets.html
+bbv2/advanced/projects.html
+bbv2/advanced/other-rules.html
 bbv2/advanced/build_process.html
 bbv2/advanced/builtins/targets.html
 bbv2/advanced/builtins/features.html
@@ -28,14 +32,21 @@
 bbv2/reference/generators.html
 bbv2/faq.html
 bbv2/faq/s02.html
-bbv2/faq/s03.html
+bbv2/faq/envar.html
 bbv2/faq/s04.html
+bbv2/faq/s05.html
 bbv2/faq/external.html
-bbv2/faq/s06.html
 bbv2/faq/s07.html
+bbv2/faq/s08.html
 bbv2/faq/dll-path.html
 bbv2/recipies/site-config.html
+bbv2/faq/header-only-libraries.html
 bbv2/arch.html
 bbv2/arch/build.html
 bbv2/arch/tools.html
 bbv2/arch/targets.html
+bbv2/jam.html
+jam/building.html
+jam/usage.html
+jam/language.html
+jam/miscellaneous.html

Modified: boost-build/branches/upstream/current/doc/html/bbv2/advanced/build_process.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/build_process.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/build_process.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,61 +1,61 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Build process</title>
+<title>The Build Process</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../advanced.html" title="Chapter 4. User documentation">
-<link rel="previous" href="jamfiles.html" title="Writing Jamfiles">
+<link rel="prev" href="other-rules.html" title="Jamfile Utility Rules">
 <link rel="next" href="builtins/targets.html" title="Builtin target types">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="jamfiles.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="builtins/targets.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="other-rules.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="builtins/targets.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.advanced.build_process"></a>Build process</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.build_process"></a>The Build Process</h2></div></div></div>
 <div class="toc"><dl>
-<dt><a href="build_process.html#id2536467">Build request</a></dt>
-<dt><a href="build_process.html#id2536509">Building a main target</a></dt>
-<dt><a href="build_process.html#id2536623">Building a project</a></dt>
+<dt><span class="section"><a href="build_process.html#id2574103">Build request</a></span></dt>
+<dt><span class="section"><a href="build_process.html#id2574148">Building a main target</a></span></dt>
+<dt><span class="section"><a href="build_process.html#id2574274">Building a project</a></span></dt>
 </dl></div>
 <p>When you've described your targets, you want Boost.Build to run the
-      right tools and create the needed targets. This section will describe
+      right tools and create the needed targets. 
+      
+      This section will describe
       two things: how you specify what to build, and how the main targets are
       actually constructed.
     </p>
 <p>The most important thing to note is that in Boost.Build, unlike
       other build tools, the targets you declare do not correspond to specific
-      files. What you declare in Jamfiles is more like "metatarget". Depending
-      on the properties that you specify on the command line, each
-      "metatarget" will produce a set of real targets corresponding to the
-      requested properties. It is quite possible that the same metatarget is
-      build several times with different properties, and will, of course,
-      produce different files.
+      files. What you declare in a Jamfile is more like a &#8220;metatarget.&#8221; 
+      
+      Depending on the properties you specify on the command line,
+      each metatarget will produce a set of real targets corresponding
+      to the requested properties. It is quite possible that the same
+      metatarget is built several times with different properties,
+      producing different files.
     </p>
-<div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
-<h3 class="title">Tip</h3>
-<p>
-        This means that for Boost.Build, you cannot directly obtain build
-        variant from Jamfile. There could be several variants requested by the
-        user, and each target can be build with different properties. 
-      </p>
-</div>
+<div class="tip"><table border="0" summary="Tip">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../images/tip.png"></td>
+<th align="left">Tip</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+        This means that for Boost.Build, you cannot directly obtain a build
+        variant from a Jamfile. There could be several variants requested by the
+        user, and each target can be built with different properties. 
+      </p></td></tr>
+</table></div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2536467"></a>Build request</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2574103"></a>Build request</h3></div></div></div>
 <p>
-        The command line specifies which targets to build and with what
+        The command line specifies which targets to build and with which
         properties. For example:
 </p>
 <pre class="programlisting">
@@ -72,31 +72,33 @@
 bjam app1 lib1//lib1 gcc debug optimization=full
 </pre>
 <p>
-        The complete syntax which has some additional shortcuts if described <a href="../reference.html#bbv2.reference.commandline" title="Command line">here</a>.
+        The complete syntax, which has some additional shortcuts, is
+        described in <a href="../reference.html#bbv2.reference.commandline" title="Command line">the section called &#8220;Command line&#8221;</a>.
       </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2536509"></a>Building a main target</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2574148"></a>Building a main target</h3></div></div></div>
 <p>When you request, directly or indirectly, a build of a main target
-        with specific requirements, the following steps are made. Some brief
-        explanation is provided, and more detailes are given in the <a href="../reference/buildprocess.html" title="Build process">reference</a>.
+        with specific requirements, the following steps are done. Some brief
+        explanation is provided, and more details are given in <a href="../reference/buildprocess.html" title="Build process">the section called &#8220;Build process&#8221;</a>.
         </p>
 <div class="orderedlist"><ol type="1">
 <li><p>Applying default build. If the default-build
-          property of a target specifies a value of a feature which is not
+          property of a target specifies a value of a feature that is not
           present in the build request, that value is added.</p></li>
 <li><p>Selecting the main target alternative to use. For
               each alternative we look how many properties are present both in
               alternative's requirements, and in build request. The
               alternative with large number of matching properties is selected.
             </p></li>
-<li><p>Determining "common" properties. The build request
+<li><p>Determining "common" properties. 
+          
+              The build request
               is <a href="../reference/definitions.html#bbv2.reference.variants.proprefine" title="Property refinement">refined</a>
-              with target's requirements. The conditional properties in
+              with target's requirements. 
+              
+              The conditional properties in
               requirements are handled as well. Finally, default values of
               features are added.
             </p></li>
@@ -108,61 +110,73 @@
               target reference, and pass the resulting properties as build
               request to the other target.              
             </p></li>
-<li><p>Adding the usage requirements produces when building
+<li><p>Adding the usage requirements produced when building
               dependencies to the "common" properties. When dependencies are
-              built in the previous step, they return both the set of created
+              built in the previous step, they return 
+              
+              both the set of created
               "real" targets, and usage requirements. The usage requirements
               are added to the common properties and the resulting property
               set will be used for building the current target.              
             </p></li>
 <li><p>Building the target using generators. To convert the
               sources to the desired type, Boost.Build uses "generators" ---
-              objects which correspond to tools like compilers and
-              linkers. Each generator declares what type of targets in can
+              objects that correspond to tools like compilers and
+              linkers. Each generator declares what type of targets it
+              
+              can
               produce and what type of sources it requires. Using this
               information, Boost.Build determines which generators must be run
               to produce a specific target from specific sources. When
               generators are run, they return the "real" targets.
             </p></li>
 <li><p>Computing the usage requirements to be returned. The
-          conditional properties in usage requirements are expanded and the
+          conditional properties in usage requirements are expanded 
+          
+          and the
           result is returned.</p></li>
 </ol></div>
+<p>        
+      </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2536623"></a>Building a project</h3></div></div>
-<div></div>
-</div>
-<p>Often, user request a build of a complete project, not just one
-        main target. In fact, invoking <b class="command">bjam</b> without
-        parameters builds the project defined in the current directory.</p>
-<p>When a project is build, the build request is passed without
-        modification to all main targets in that project. It's is possible to
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2574274"></a>Building a project</h3></div></div></div>
+<p>Often, a user builds a complete project, not just one main
+      target. In fact, invoking <span><strong class="command">bjam</strong></span> without
+      arguments
+      
+      builds the project defined in the current
+      directory.</p>
+<p>When a project is built, the build request is passed without
+        modification to all main targets in that project.
+        
+        It's is possible to
         prevent implicit building of a target in a project with the
-        <tt class="computeroutput">explicit</tt> rule:
+        <code class="computeroutput">explicit</code> rule:
 </p>
 <pre class="programlisting">
 explicit hello_test ;
 </pre>
 <p>
-        would cause the <tt class="computeroutput">hello_test</tt> target to be built only if
+        would cause the <code class="computeroutput">hello_test</code> target to be built only if
         explicitly requested by the user or by some other target.
       </p>
 <p>The Jamfile for a project can include a number of
-      <tt class="computeroutput">build-project</tt> rule calls, that specify additional projects
+      <code class="computeroutput">build-project</code> rule calls
+      
+      that specify additional projects
       to be built.
       </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="jamfiles.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="builtins/targets.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="other-rules.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="builtins/targets.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/advanced/builtins/features.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/builtins/features.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/builtins/features.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,111 +3,189 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Builtin features</title>
 <link rel="stylesheet" href="../../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../../advanced.html" title="Chapter 4. User documentation">
-<link rel="previous" href="targets.html" title="Builtin target types">
+<link rel="prev" href="targets.html" title="Builtin target types">
 <link rel="next" href="../differences_to_v1.html" title="Differences to Boost.Build V1">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="targets.html"><img src="../../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../../advanced.html"><img src="../../../images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../images/home.png" alt="Home"></a><a accesskey="n" href="../differences_to_v1.html"><img src="../../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.advanced.builtins.features"></a>Builtin features</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.builtins.features"></a>Builtin features</h2></div></div></div>
 <div class="variablelist"><dl>
-<dt><span class="term"><tt class="literal">variant</tt></span></dt>
+<dt><span class="term"><code class="literal">variant</code></span></dt>
 <dd>
 <p>
-            The feature which combines several low-level features in
-            order to make building most common variants simple.
+            A feature that combines several low-level features, making
+            it easy to request common build configurations.
           </p>
-<p><span class="bold"><b>Allowed values:</b></span><tt class="literal">debug</tt>, <tt class="literal">release</tt>,
-            <tt class="literal">profile</tt></p>
-<p>The value <tt class="literal">debug</tt> expands to</p>
+<p><span class="bold"><strong>Allowed values:</strong></span> <code class="literal">debug</code>, <code class="literal">release</code>,
+            <code class="literal">profile</code>.</p>
+<p>The value <code class="literal">debug</code> expands to</p>
 <pre class="programlisting">
-            &lt;optimization&gt;off &lt;debug-symbols&gt;on &lt;inlining&gt;off &lt;runtime-debugging&gt;on
-          </pre>
-<p>The value <tt class="literal">release</tt> expands to</p>
+&lt;optimization&gt;off &lt;debug-symbols&gt;on &lt;inlining&gt;off &lt;runtime-debugging&gt;on
+</pre>
+<p>The value <code class="literal">release</code> expands to</p>
 <pre class="programlisting">
-            &lt;optimization&gt;speed &lt;debug-symbols&gt;off &lt;inlining&gt;full &lt;runtime-debugging&gt;off
-          </pre>
-<p>The value <tt class="literal">profile</tt> expands to the same as
-            <tt class="literal">release</tt>, plus:</p>
+&lt;optimization&gt;speed &lt;debug-symbols&gt;off &lt;inlining&gt;full &lt;runtime-debugging&gt;off
+</pre>
+<p>The value <code class="literal">profile</code> expands to the same as
+          <code class="literal">release</code>, plus:</p>
 <pre class="programlisting">
-            &lt;profiling&gt;on &lt;debug-symbols&gt;on
-          </pre>
-<p><span class="bold"><b>Rationale:</b></span> Runtime debugging is on in debug build
-            to suit expectations of people used various IDEs. It's
-            assumed other folks don't have any specific expectation in
-            this point.</p>
+&lt;profiling&gt;on &lt;debug-symbols&gt;on
+</pre>
+<p>User can define his own build variants using the <code class="computeroutput">variant</code> rule from the <code class="computeroutput">common</code>
+          module.</p>
+<p><span class="bold"><strong>Notee:</strong></span> Runtime
+          debugging is on in debug builds to suit the expectations of
+          people used to various IDEs. 
+          
+          </p>
 </dd>
 <dt>
-<a name="bbv2.advanced.builtins.features.link"></a><span class="term"><tt class="literal">link</tt></span>
+<a name="bbv2.advanced.builtins.features.link"></a><span class="term"><code class="literal">link</code></span>
 </dt>
 <dd>
 <p>
-            Feature which controls how libraries are built.
+            A feature that controls how libraries are built.
           </p>
-<p><span class="bold"><b>Allowed values:</b></span><tt class="literal">shared</tt>,
-            <tt class="literal">static</tt></p>
+<p><span class="bold"><strong>Allowed values:</strong></span> <code class="literal">shared</code>,
+            <code class="literal">static</code></p>
 </dd>
-<dt><span class="term"><tt class="literal">source</tt></span></dt>
+<dt><span class="term"><code class="literal">source</code></span></dt>
 <dd>
-            Tthe &lt;source&gt;X feature has the same effect on building a target
-            as putting X in the list of sources. The feature
-            is sometimes more convenient: you can put &lt;source&gt;X in
-            the requirements for a project and it will be linked to all
-            executables.
+            The <code class="computeroutput">&lt;source&gt;X</code> feature has the same effect on 
+            building a target as putting X in the list of sources. 
+            It's useful when you want to add
+            the same source to all targets in the project 
+            (you can put &lt;source&gt; in requirements) or to conditionally
+            include a source (using conditional requirements, see <a href="../../tutorial/conditions.html" title="Conditions and alternatives">the section called &#8220;Conditions and alternatives&#8221;</a>)
+            See also the <code class="computeroutput">&lt;library&gt;</code> feature.
           </dd>
-<dt><span class="term"><tt class="literal">library</tt></span></dt>
+<dt><span class="term"><code class="literal">library</code></span></dt>
 <dd>
-            This feature is equivalent to the &lt;source&gt; feature, and exists
-            for backward compatibility reasons.
+            This feature is almost equivalent to the <code class="computeroutput">&lt;source&gt;</code> feature, 
+            except that it takes effect only for linking. When you want to 
+            link all targets in a Jamfile to certain library, the 
+            <code class="computeroutput">&lt;library&gt;</code> feature is preferred over 
+            <code class="computeroutput">&lt;source&gt;X</code> -- the latter will add the library to
+            all targets, even those that have nothing to do with libraries.
           </dd>
-<dt><span class="term"><tt class="literal">use</tt></span></dt>
+<dt><span class="term"><a name="bbv2.builtin.features.dependency"></a>
+          <code class="literal">dependency</code></span></dt>
 <dd>
-            Causes the target referenced by the value of this feature
-            to be constructed and adds it's usage requirements to build
-            properties. The constructed targets are not used in any other
-            way. The primary use case is when you use some library and want
-            it's usage requirements (such as include paths) to be applied,
-            but don't want to link to the library.
+            Introduces a dependency on the target named by the
+            value of this feature (so it will be brought
+            up-to-date whenever the target being declared is).
+            The dependency is not used in any other way. For example, in
+            application with plugins, the plugins are not used when linking
+            the application, 
+            application might have dependency on its plugins, even though 
+
+
+            , and
+            adds its usage requirements to the build properties 
+            of the target being declared.  
+
+ The primary use case is when you want
+            the usage requirements (such as <code class="computeroutput">#include</code> paths) of some
+            library to be applied, but don't want to link to it.
+            
           </dd>
-<dt><span class="term"><tt class="literal">dll-path</tt></span></dt>
+<dt><span class="term"><a name="bbv2.builtin.features.use"></a>
+          <code class="literal">use</code></span></dt>
 <dd>
-            Specify an additional path where shared libraries should be
-            searched where the executable or shared library is run. This
-            feature only affect Unix compilers. Plase see the <a href="../../faq/dll-path.html" title="Why are the dll-path and
+            Introduces a dependency on the target named by the
+            value of this feature (so it will be brought
+            up-to-date whenever the target being declared is), and
+            adds its usage requirements to the build properties 
+            
+            of the target being declared.  The dependency is not used
+            in any other way. The primary use case is when you want
+            the usage requirements (such as <code class="computeroutput">#include</code> paths) of some
+            library to be applied, but don't want to link to it.
+            
+          </dd>
+<dt><span class="term"><a name="bbv2.builtin.features.dll-path"></a>
+      <code class="literal">dll-path</code></span></dt>
+<dd>
+            Specify an additional directory where the system should
+            look for shared libraries when the executable or shared
+            library is run. This feature only affects Unix
+            compilers. Plase see <a href="../../faq/dll-path.html" title="Why are the dll-path and
     hardcode-dll-paths properties useful?
-    ">FAQ entry</a> for details.
+    ">the section called &#8220;Why are the <code class="computeroutput">dll-path</code> and
+    <code class="computeroutput">hardcode-dll-paths</code> properties useful?
+    &#8221;</a>
+            in <a href="../../faq.html" title="Chapter 7. Frequently Asked Questions">Chapter 7, <i>Frequently Asked Questions</i></a> for details.
           </dd>
-<dt><span class="term"><tt class="literal">hardcode-dll-paths</tt></span></dt>
+<dt><span class="term"><code class="literal">hardcode-dll-paths</code></span></dt>
 <dd>
 <p>
             Controls automatic generation of dll-path properties.
           </p>
-<p><span class="bold"><b>Allowed values:</b></span><tt class="literal">true</tt>, <tt class="literal">false</tt>.  This property
-            is specific to Unix systems. If an executable is build with
-            <tt class="computeroutput">&lt;hardcode-dll-paths&gt;true</tt>, the generated binary
+<p><span class="bold"><strong>Allowed values:</strong></span>
+            <code class="literal">true</code>, <code class="literal">false</code>.  This property
+            is specific to Unix systems. If an executable is built with
+            <code class="computeroutput">&lt;hardcode-dll-paths&gt;true</code>, the generated binary
             will contain the list of all the paths to the used shared
             libraries. As the result, the executable can be run without
-            changing system paths to shared libraries, or installing the
-            libraries to system paths. This is very convenient during
+            changing system paths to shared libraries or installing the
+            libraries to system paths. This 
+            
+            is very convenient during
             development. Plase see the <a href="../../faq/dll-path.html" title="Why are the dll-path and
     hardcode-dll-paths properties useful?
     ">FAQ entry</a> for details.
+            Note that on Mac OSX, the paths are unconditionally hardcoded by
+            the linker, and it's not possible to disable that behaviour.
           </p>
 </dd>
+<dt>
+<span class="term"><code class="literal">cflags</code>, </span><span class="term"><code class="literal">cxxflags</code>, </span><span class="term"><code class="literal">linkflags</code></span>
+</dt>
+<dd>
+            The value of those features is passed without modification to the
+            corresponding tools. For <code class="computeroutput">cflags</code> that's both the C and C++
+            compilers, for <code class="computeroutput">cxxflags</code> that's the C++ compiler and for
+            <code class="computeroutput">linkflags</code> that's the linker. The features are handy when
+            you're trying to do something special that cannot be achieved by
+            higher-level feature in Boost.Build.
+          </dd>
+<dt><span class="term"><code class="literal">warnings</code></span></dt>
+<dd>
+            The <code class="computeroutput">&lt;warnings&gt;</code> feature controls the warning level of compilers. It has the following values:
+            <div class="itemizedlist"><ul type="disc">
+<li><p><code class="computeroutput">off</code> - disables all warnings.</p></li>
+<li><p><code class="computeroutput">on</code> - enables default warning level for the tool.</p></li>
+<li><p><code class="computeroutput">all</code> - enables all warnings.</p></li>
+</ul></div>
+            Default value is <code class="computeroutput">all</code>.
+          </dd>
+<dt><span class="term"><code class="literal">warnings-as-errors</code></span></dt>
+<dd>
+            The <code class="computeroutput">&lt;warnings-as-errors&gt;</code> makes it possible to treat warnings as errors and abort
+            compilation on a warning. The value <code class="computeroutput">on</code> enables this behaviour. The default value is
+            <code class="computeroutput">off</code>.
+          </dd>
+<dt><span class="term"><code class="literal">build</code></span></dt>
+<dd>
+<p><span class="bold"><strong>Allowed values:</strong></span> <code class="literal">no</code></p>
+<p>
+            The <code class="computeroutput">build</code> feature is used to conditionally disable build of a target. If <code class="computeroutput">&lt;build&gt;no</code>
+            is in properties when building a target, build of that target is skipped. Combined with conditional requirements this
+            allows to skip building some target in configurations where the build is known to fail. 
+          </p>
+</dd>
 </dl></div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/advanced/builtins/targets.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/builtins/targets.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/builtins/targets.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,39 +3,38 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Builtin target types</title>
 <link rel="stylesheet" href="../../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../../advanced.html" title="Chapter 4. User documentation">
-<link rel="previous" href="../build_process.html" title="Build process">
+<link rel="prev" href="../build_process.html" title="The Build Process">
 <link rel="next" href="features.html" title="Builtin features">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="../build_process.html"><img src="../../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../../advanced.html"><img src="../../../images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../images/home.png" alt="Home"></a><a accesskey="n" href="features.html"><img src="../../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.advanced.builtins.targets"></a>Builtin target types</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.builtins.targets"></a>Builtin target types</h2></div></div></div>
 <div class="toc"><dl>
-<dt><a href="targets.html#id2536681">Programs</a></dt>
-<dt><a href="targets.html#id2536744">Libraries</a></dt>
-<dt><a href="targets.html#bbv2.builtins.alias">Alias</a></dt>
-<dt><a href="targets.html#bbv2.builtins.stage">Installing</a></dt>
-<dt><a href="targets.html#bbv2.builtins.testing">Testing</a></dt>
+<dt><span class="section"><a href="targets.html#id2574354">Programs</a></span></dt>
+<dt><span class="section"><a href="targets.html#id2574432">Libraries</a></span></dt>
+<dt><span class="section"><a href="targets.html#bbv2.builtins.alias">Alias</a></span></dt>
+<dt><span class="section"><a href="targets.html#bbv2.builtins.stage">Installing</a></span></dt>
+<dt><span class="section"><a href="targets.html#bbv2.builtins.testing">Testing</a></span></dt>
+<dt><span class="section"><a href="targets.html#bbv2.builtins.raw">Raw commands: 'make' and 'notfile'</a></span></dt>
 </dl></div>
+<p>This section describes main targets types that Boost.Build supports
+    of-of-the-box. Unless otherwise noted, all mentioned main target rules
+    have the common signature, described in <a href="../targets.html#bbv2.main-target-rule-syntax">???</a>.
+    </p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2536681"></a>Programs</h3></div></div>
-<div></div>
-</div>
-<p>Programs are created using the <tt class="computeroutput">exe</tt> rule, which
-        follows the <a href="../jamfiles.html#bbv2.main-target-rule-syntax">common
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2574354"></a>Programs</h3></div></div></div>
+<a class="indexterm" name="id2574360"></a><p>Programs are created using the <code class="computeroutput">exe</code> rule, which
+        follows the <a href="../targets.html#bbv2.main-target-rule-syntax">common
           syntax</a>. For example:
 </p>
 <pre class="programlisting">
@@ -46,45 +45,48 @@
 <p>
         This will create an executable file from the sources -- in this case,
         one C++ file, one library file present in the same directory, and
-        another library which is created by Boost.Build. Generally, sources
+        another library that is created by Boost.Build. Generally, sources
         can include C and C++ files, object files and libraries. Boost.Build
         will automatically try to convert targets of other types.
       </p>
-<div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
-<h3 class="title">Tip</h3>
-<p>         
+<div class="tip"><table border="0" summary="Tip">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../images/tip.png"></td>
+<th align="left">Tip</th>
+</tr>
+<tr><td align="left" valign="top"><p>         
           On Windows, if an application uses dynamic libraries, and both
           the application and the libraries are built by Boost.Build, its not
           possible to immediately run the application, because the
-          <tt class="literal">PATH</tt> environment variable should include the path
+          <code class="literal">PATH</code> environment variable should include the path
           to the libraries. It means you have to either add the paths
           manually, or place the application and the libraries to the same
           directory, for example using the <a href="targets.html#bbv2.builtins.stage" title="Installing">
             stage</a> rule.
-      </p>
+        </p></td></tr>
+</table></div>
 </div>
-</div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2536744"></a>Libraries</h3></div></div>
-<div></div>
-</div>
-<p>Libraries are created using the <tt class="computeroutput">lib</tt> rule, which
-        follows the <a href="../jamfiles.html#bbv2.main-target-rule-syntax">common
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2574432"></a>Libraries</h3></div></div></div>
+<p>Libraries are created using the <code class="computeroutput">lib</code> rule, which
+        follows the <a href="../targets.html#bbv2.main-target-rule-syntax">common
           syntax</a>. For example:
 </p>
 <pre class="programlisting">
 lib helpers : helpers.cpp : &lt;include&gt;boost : : &lt;include&gt;. ;
 </pre>
-<p>In the most common case, the <tt class="computeroutput">lib</tt> creates a library
+<p>
+      </p>
+<p>In the most common case, the <code class="computeroutput">lib</code> creates a library
         from the specified sources. Depending on the value of
         &lt;link&gt; feature the library will be either static or
         shared. There are two other cases. First is when the library is
         installed somewhere in compiler's search paths, and should be
-        searched by the compiler (typically, using the <tt class="option">-l</tt>
+        searched by the compiler (typically, using the <code class="option">-l</code>
         option). The second case is where the library is available as a 
         prebuilt file and the full path is known.          
+        
         </p>
 <p>
         The syntax for these case is given below:
@@ -94,19 +96,19 @@
 lib compress : : &lt;file&gt;/opt/libs/compress.a ;
 </pre>
 <p>
-        The <tt class="computeroutput">name</tt> property specifies the name which should be
-        passed to the <tt class="option">-l</tt> option, and the <tt class="computeroutput">file</tt>
-        property specifies the file location. The <tt class="computeroutput">search</tt> feature
-        specifies paths where the library should be searched. That feature can
-        be specified several time, or can be omitted -- in which case only
+        The <code class="computeroutput">name</code> property specifies the name that should be
+        passed to the <code class="option">-l</code> option, and the <code class="computeroutput">file</code>
+        property specifies the file location. The <code class="varname">search</code> feature
+        specifies paths in which to search for the library. That feature can
+        be specified several times, or it can be omitted, in which case only
         default compiler paths will be searched.
       </p>
-<p>The difference between using the <tt class="computeroutput">file</tt> feature as
-        opposed to the <tt class="computeroutput">name</tt> name feature together with the
-        <tt class="computeroutput">search</tt> feature is that <tt class="computeroutput">file</tt> is more
+<p>The difference between using the <code class="varname">file</code> feature as
+        opposed to the <code class="varname">name</code> feature together with the
+        <code class="varname">search</code> feature is that <code class="varname">file</code> is more
         precise. A specific file will be used. On the other hand, the
-        <tt class="computeroutput">search</tt> feature only adds a library path, and the
-        <tt class="computeroutput">name</tt> feature gives the basic name of the library. The
+        <code class="varname">search</code> feature only adds a library path, and the
+        <code class="varname">name</code> feature gives the basic name of the library. The
         search rules are specific to the linker. For example, given these
         definition:
 </p>
@@ -117,10 +119,11 @@
 lib b : : &lt;variant&gt;debug &lt;file&gt;/pool/debug/b.so ;
 </pre>
 <p>
-        It's possible to use release version of <tt class="computeroutput">a</tt> and debug
-        version of <tt class="computeroutput">b</tt>. Had we used the <tt class="computeroutput">name</tt> and
-        <tt class="computeroutput">search</tt> features, the linker would always pick either
+        It's possible to use release version of <code class="computeroutput">a</code> and debug
+        version of <code class="computeroutput">b</code>. Had we used the <code class="varname">name</code> and
+        <code class="varname">search</code> features, the linker would always pick either
         release or debug versions.
+        
       </p>
 <p>
         For convenience, the following syntax is allowed:
@@ -134,11 +137,13 @@
 </p>
 <pre class="programlisting">
 lib z : : &lt;name&gt;z ;            
-lib giu : : &lt;name&gt;gui ;            
+lib gui : : &lt;name&gt;gui ;            
 lib db : : &lt;name&gt;db ;            
 lib aux : : &lt;name&gt;aux ;            
 </pre>
-<p>When a library uses another library you should put that another
+<p>
+      </p>
+<p>When a library uses another library you should put that other
         library in the list of sources. This will do the right thing in all
         cases. For portability, you should specify library dependencies even
         for searched and prebuilt libraries, othewise, static linking on
@@ -148,35 +153,55 @@
 lib z ;
 lib png : z : &lt;name&gt;png ;
 </pre>
-<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
-<h3 class="title">Note</h3>
-<p>When a library (say, <tt class="computeroutput">a</tt>), which has another
-          library, (say, <tt class="computeroutput">b</tt>) is linked dynamically, the <tt class="computeroutput">b</tt>
-          library will be incorporated in <tt class="computeroutput">a</tt>. (If <tt class="computeroutput">b</tt>
-          is dynamic library as well, then <tt class="computeroutput">a</tt> will only refer to
-          it, and not include any extra code.) When the <tt class="computeroutput">a</tt>
+<p>
+        </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>When a library (say, <code class="computeroutput">a</code>), that has another
+          library, (say, <code class="computeroutput">b</code>) 
+          
+          is linked dynamically, the <code class="computeroutput">b</code>
+          library will be incorporated 
+          
+          in <code class="computeroutput">a</code>. (If <code class="computeroutput">b</code>
+          is dynamic library as well, then <code class="computeroutput">a</code> will only refer to
+          it, and not include any extra code.) 
+          
+          When the <code class="computeroutput">a</code>
           library is linked statically, Boost.Build will assure that all
-          executables which link to <tt class="computeroutput">a</tt> will also link to
-          <tt class="computeroutput">b</tt>.
-        </p>
-</div>
-<p>One feature of Boost.Build which is very important for libraries
-        is usage requirements. For example, if you write:
+          executables that link to <code class="computeroutput">a</code> will also link to
+          <code class="computeroutput">b</code>.
+        </p></td></tr>
+</table></div>
+<p>One feature of Boost.Build that is very important for libraries
+        is usage requirements. 
+        
+        For example, if you write:
 </p>
 <pre class="programlisting">
 lib helpers : helpers.cpp : : : &lt;include&gt;. ;
 </pre>
 <p>
-        then compiler include path for all targets which use
-        <tt class="computeroutput">helpers</tt> will contain the directory where the target is
-        defined.path to "helpers.cpp". So, the user need only to add
-        <tt class="computeroutput">helpers</tt> to the list of sources, and don't bother about
-        other requirements. This allows to greatly simplify Jamfiles.
+        then the compiler include path for all targets that use
+        <code class="computeroutput">helpers</code> will contain the directory 
+        
+        where the target is defined.path to "helpers.cpp". The user
+        only needs to add <code class="computeroutput">helpers</code> to the list of sources,
+        and needn't consider the requirements its use imposes on a
+        dependent target. This feature greatly simplifies Jamfiles.
+        
       </p>
-<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
-<h3 class="title">Note</h3>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top">
 <p>If you don't want shared libraries to include all libraries
-          which are specified in sources (especially statically linked ones),
+          that are specified in sources (especially statically linked ones),
           you'd need to use the following:
 </p>
 <pre class="programlisting">
@@ -184,132 +209,267 @@
 lib a : a.cpp : &lt;use&gt;b : : &lt;library&gt;b ;
 </pre>
 <p>
-          This specifies that <tt class="computeroutput">a</tt> uses <tt class="computeroutput">b</tt>, and causes
-          all executables which link to <tt class="computeroutput">a</tt> also link to
-          <tt class="computeroutput">b</tt>. In this case, even for shared linking, the
-          <tt class="computeroutput">a</tt> library won't even refer to <tt class="computeroutput">b</tt>.
+          This specifies that <code class="computeroutput">a</code> uses <code class="computeroutput">b</code>, and causes
+          all executables that link to <code class="computeroutput">a</code> also link to
+          <code class="computeroutput">b</code>. In this case, even for shared linking, the
+          <code class="computeroutput">a</code> library won't even refer to <code class="computeroutput">b</code>.
         </p>
+</td></tr>
+</table></div>
 </div>
-</div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.builtins.alias"></a>Alias</h3></div></div>
-<div></div>
-</div>
-<p>The <tt class="computeroutput">alias</tt> rule follows the <a href="../jamfiles.html#bbv2.main-target-rule-syntax">common syntax</a>. For
-        example:
-</p>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.builtins.alias"></a>Alias</h3></div></div></div>
+<p>
+        The <code class="computeroutput">alias</code> rule gives alternative name to
+        a group of targets. For example, to give the name
+        <code class="filename">core</code> to a group of three other targets with the
+        following code:
+        </p>
 <pre class="programlisting">
-alias core : im reader writer ;
-</pre>
+alias core : im reader writer ;</pre>
 <p>
-        will build the sources and return the generated source targets
-        without modification. 
+        Using <code class="filename">core</code> on the command line, or in the source list
+        of any other target is the same as explicitly using
+        <code class="filename">im</code>, <code class="filename">reader</code>, and
+        <code class="filename">writer</code>, but it is just more convenient.
+
       </p>
 <p>
-        The <tt class="computeroutput">alias</tt> rule is a convenience tool. If you often build
-        the same group of targets at the same time, you can define the alias
-        to save typing.        
-      </p>
-<p>
-        Another use of the <tt class="computeroutput">alias</tt> rule is to change build
+        Another use of the <code class="computeroutput">alias</code> rule is to change build
         properties. For example, if you always want static linking for a
         specific C++ Boost library, you can write the following:
 </p>
 <pre class="programlisting">
-alias boost_thread : /boost/thread//boost_thread : &lt;link&gt;static ;
+alias threads : /boost/thread//boost_thread : &lt;link&gt;static ;
 </pre>
 <p>
-        and use only the <tt class="computeroutput">boost_thread</tt> alias in your Jamfiles.
+        and use only the <code class="computeroutput">threads</code> alias in your Jamfiles.
+        
       </p>
 <p>
-        It is also allowed to specify usage requirements for the
-        <tt class="computeroutput">alias</tt> target. If you write the following:
+        You can also specify usage requirements for the
+        <code class="computeroutput">alias</code> target. If you write the following:
 </p>
 <pre class="programlisting">
 alias header_only_library : : : :  &lt;include&gt;/usr/include/header_only_library ; 
 </pre>
 <p>
-        then using <tt class="computeroutput">header_only_library</tt> in sources will only add an
+        then using <code class="computeroutput">header_only_library</code> in sources will only add an
         include path. Also note that when there are some sources, their usage
         requirements are propagated, too. For example:
 </p>
 <pre class="programlisting">
 lib lib : lib.cpp : : : &lt;include&gt;. ;
-alias lib_alias ;
+alias lib_alias ; 
 exe main : main.cpp lib_alias ;
 </pre>
 <p>
-        will compile <tt class="filename">main.cpp</tt> with the additional include.
+        will compile <code class="filename">main.cpp</code> with the additional include.
       </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.builtins.stage"></a>Installing</h3></div></div>
-<div></div>
-</div>
-<p>For installing the built target you should use the
-        <tt class="computeroutput">stage</tt> rule follows the <a href="../jamfiles.html#bbv2.main-target-rule-syntax">common syntax</a>. For
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.builtins.stage"></a>Installing</h3></div></div></div>
+<p>For installing a built target you should use the
+        <code class="computeroutput">install</code> rule, which follows the <a href="../targets.html#bbv2.main-target-rule-syntax">common syntax</a>. For
         example:
 </p>
 <pre class="programlisting">
-stage dist : hello helpers ;
+install dist : hello helpers ;
 </pre>
 <p>
-        will cause the targets <tt class="computeroutput">hello</tt> and <tt class="computeroutput">helpers</tt> to
-        be moved to the <tt class="filename">dist</tt> directory. The directory can
-        be changed with the <tt class="computeroutput">location</tt> property:
+        will cause the targets <code class="computeroutput">hello</code> and <code class="computeroutput">helpers</code> to
+        be moved to the <code class="filename">dist</code> directory, relative to
+        Jamfile's directory. The directory can
+        be changed with the <code class="computeroutput">location</code> property:
 </p>
 <pre class="programlisting">
-stage dist : hello helpers : &lt;location&gt;/usr/bin ;
+install dist : hello helpers : &lt;location&gt;/usr/bin ;
 </pre>
 <p>
+        While you can achieve the same effect by changing the target name to
+        <code class="filename">/usr/bin</code>, using the <code class="computeroutput">location</code>
+        property is better, because it allows you to use a mnemonic target
+        name.
+      </p>
+<p>The <code class="computeroutput">location</code> property is especially handy when the location
+        is not fixed, but depends on build variant or environment variables:
+</p>
+<pre class="programlisting">
+install dist : hello helpers : &lt;variant&gt;release:&lt;location&gt;dist/release
+                             &lt;variant&gt;debug:&lt;location&gt;dist/debug ;
+install dist2 : hello helpers : &lt;location&gt;$(DIST) ;
+</pre>
+<p> 
+        See also <a href="../../reference/definitions.html#bbv2.reference.variants.propcond" title="Conditional properties">conditional
+          properties</a> and <a href="../../faq/envar.html" title="
+      Accessing environment variables
+      ">environment variables</a>
+      </p>
+<p>
         Specifying the names of all libraries to install can be boring. The
-        <tt class="computeroutput">stage</tt> allows to specify only the top-level executable
+        <code class="computeroutput">install</code> allows you to specify only the top-level executable
         targets to install, and automatically install all dependencies:
 </p>
 <pre class="programlisting">
-stage dist : hello 
-           : &lt;traverse-dependencies&gt;on &lt;include-type&gt;EXE
-             &lt;include-type&gt;LIB
+install dist : hello 
+           : &lt;install-dependencies&gt;on &lt;install-type&gt;EXE
+             &lt;install-type&gt;LIB
            ;
 </pre>
 <p>
-        will find all targets that <tt class="computeroutput">hello</tt> depends on, and install
-        all of the which are either executables or libraries.
+        will find all targets that <code class="computeroutput">hello</code> depends on, and install
+        all of those which are either executables or libraries. More
+        specifically, for each target, other targets that were specified as
+        sources or as dependency properties, will be recursively found.  One
+        exception is that targets referred with the <a href="features.html#bbv2.builtin.features.use"><code class="computeroutput">use</code></a> feature
+        are not considered, because that feature is typically used to refer to
+        header-only libraries.
+        If the set of target types is specified, only targets of that type
+        will be installed, otherwise, all found target will be installed.
       </p>
+<p>The <a href="targets.html#bbv2.builtins.alias" title="Alias"><code class="computeroutput">alias</code></a>
+      rule can be used when targets must be installed into several
+      directories:
+</p>
+<pre class="programlisting">
+alias install : install-bin install-lib ;
+install install-bin : applications : /usr/bin ;
+install install-lib : helper : /usr/lib ;
+</pre>
+<p>
+    </p>
+<p>Because the <code class="computeroutput">install</code> rule just copies targets, most 
+    free features <sup>[<a name="id2575122" href="#ftn.id2575122">5</a>]</sup>
+    have no effect when used in requirements of the <code class="computeroutput">install</code> rule.
+    The only two which matter are  
+    <a href="features.html#bbv2.builtin.features.dependency">
+    <code class="varname">dependency</code></a> and, on Unix,
+    <a href="../../../"><code class="varname">dll-path</code></a>. 
+    </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+        (Unix specific). On Unix, executables built with Boost.Build typically
+        contain the list of paths to all used dynamic libraries. For
+        installing, this is not desired, so Boost.Build relinks the executable
+        with an empty list of paths. You can also specify additional paths for
+        installed executables with the <code class="varname">dll-path</code> feature.
+      </p></td></tr>
+</table></div>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.builtins.testing"></a>Testing</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.builtins.testing"></a>Testing</h3></div></div></div>
 <p>Boost.Build has convenient support for running unit tests. The
-        simplest way is the <tt class="computeroutput">unit-test</tt> rule, which follows the
-        <a href="../jamfiles.html#bbv2.main-target-rule-syntax">common syntax</a>. For
+        simplest way is the <code class="computeroutput">unit-test</code> rule, which follows the
+        <a href="../targets.html#bbv2.main-target-rule-syntax">common syntax</a>. For
         example:
 </p>
 <pre class="programlisting">
 unit-test helpers_test : helpers_test.cpp helpers ;
 </pre>
-<p>The <tt class="computeroutput">unit-test</tt> rule behaves like the
-        <tt class="computeroutput">exe</tt> rule, but after the executable is created it is
-        run. If the executable returns error, the build system will also
-        return error and will try running the executable on the next
+<p>
+      </p>
+<p>The <code class="computeroutput">unit-test</code> rule behaves like the
+        <code class="computeroutput">exe</code> rule, but after the executable is created it is
+        run. If the executable returns an error code, the build system will also
+        return an error and will try running the executable on the next
         invocation until it runs successfully. This behaviour ensures that you
         can't miss a unit test failure.
       </p>
-<p>There are rules for more elaborate testing: <tt class="computeroutput">compile</tt>,
-        <tt class="computeroutput">compile-fail</tt>, <tt class="computeroutput">run</tt> and
-        <tt class="computeroutput">run-fail</tt>. They are more suitable for automated testing, and
-        are not covered here yet.
+<p>By default, the executable is run directly. Sometimes, it's 
+      desirable to run the executable using some helper command. You should use the
+      <code class="literal">testing.launcher</code> property to specify the name of the
+      helper command. For example, if you write:
       </p>
+<pre class="programlisting">
+unit-test helpers_test 
+   : helpers_test.cpp helpers 
+   : <span class="bold"><strong>&lt;testing.launcher&gt;valgrind</strong></span>
+   ;  
+</pre>
+<p>The command used to run the executable will be:</p>
+<pre class="screen">
+<span class="bold"><strong>valgrind</strong></span> bin/$toolset/debug/helpers_test 
+</pre>
+<p>There are rules for more elaborate testing: <code class="computeroutput">compile</code>,
+        <code class="computeroutput">compile-fail</code>, <code class="computeroutput">run</code> and
+        <code class="computeroutput">run-fail</code>. They are more suitable for automated testing, and
+        are not covered here.
+      </p>
 </div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.builtins.raw"></a>Raw commands: 'make' and 'notfile'</h3></div></div></div>
+<p>Sometimes, the builtin target types are not enough, and you
+      want Boost.Build to just run specific commands. There are two main
+      target rules that make it possible: <code class="computeroutput">make</code>
+      and <code class="computeroutput">notfile</code>.
+      </p>
+<p>The <code class="computeroutput">make</code> rule is used when you want to
+      create one file from a number of sources using some specific command.
+      The <code class="computeroutput">notfile</code> is used to unconditionally run
+      a command. 
+      </p>
+<p>
+        Suppose you want to create file <code class="filename">file.out</code> from
+        file <code class="filename">file.in</code> by running command 
+        <span><strong class="command">in2out</strong></span>. Here's how you'd do this in Boost.Build:
+</p>
+<pre class="programlisting">
+actions in2out
+{
+    in2out $(&lt;) $(&gt;)
+}
+make file.out : file.in : @in2out ;
+</pre>
+<p>
+        If you run <span><strong class="command">bjam</strong></span> and <code class="filename">file.out</code> 
+        does not exist, Boost.Build will run the <span><strong class="command">in2out</strong></span>
+        command to create that file. For more details on specifying actions,
+        see <a href="../../advanced.html#bbv2.advanced.jam_language.actions">the section called &#8220;Boost.Jam language&#8221;</a>.
+      </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+          The <code class="computeroutput">make</code> rule is useful to express custom
+          transformation that are used just once or twice in your project. For
+          transformations that are used often, you are advised to declare
+          new generator, as described in <a href="../../extending/tools.html" title="Tools and generators">the section called &#8220;Tools and generators&#8221;</a>.
+        </p></td></tr>
+</table></div>
+<p>
+        It could be that you just want to run some command unconditionally,
+        and that command does not create any specific files. The, you can use
+        the <code class="computeroutput">notfile</code> rule. For example:
+</p>
+<pre class="programlisting">
+notfile echo_something : @echo ;
+actions echo
+{
+    echo "something"
+}
+</pre>
+<p>
+        The only difference from the <code class="computeroutput">make</code> rule is
+        that the name of the target is not considered a name of a file, so
+        Boost.Build will unconditionally run the action.
+      </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a name="ftn.id2575122" href="#id2575122">5</a>] </sup>see the definition of "free" in <a href="../../reference/definitions.html#bbv2.reference.features.attributes" title="Feature Attributes">the section called &#8220;Feature Attributes&#8221;</a>.</p></div>
+</div>
+</div>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Added: boost-build/branches/upstream/current/doc/html/bbv2/advanced/configuration.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/configuration.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/configuration.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,177 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Configuration</title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../advanced.html" title="Chapter 4. User documentation">
+<link rel="prev" href="../advanced.html" title="Chapter 4. User documentation">
+<link rel="next" href="invocation.html" title="Invocation">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../advanced.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="invocation.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.configuration"></a>Configuration</h2></div></div></div>
+<p>The Boost.Build configuration is specified in the file
+    <code class="filename">user-config.jam</code>. You can edit the one in the top-level
+    directory of Boost.Build installation or create a copy in your home directory
+    and edit that. (See <a href="../reference.html#bbv2.reference.init.config" title="Table 6.1. Search paths for configuration files">Table 6.1, &#8220;Search paths for configuration files&#8221;</a>  for the
+    exact search paths.) The primary function of that file is to declare which
+    compilers and other tools are available. The simplest syntax to configure
+    a tool is:
+
+</p>
+<pre class="programlisting">
+using <em class="replaceable"><code>tool-name</code></em> ;        
+</pre>
+<p>
+      The <code class="computeroutput">using</code> rule is given a name of tool, and will make that tool
+      available to Boost.Build. For example, <code class="computeroutput">using gcc ;</code> will make the gcc compiler
+      available.      
+    </p>
+<p>
+      Since nothing but a tool name is specified, Boost.Build will
+      pick some default settings.  For example, it will use the
+      <span><strong class="command">gcc</strong></span> executable found in the
+      <code class="envar">PATH</code>, or look in some known installation
+      locations. In most cases, this strategy works automatically. In
+      case you have several versions of a compiler, it's installed in
+      some unusual location, or you need to tweak its configuration,
+      you'll need to pass additional parameters to the
+      <code class="computeroutput">using</code> rule.  The parameters to
+      <code class="computeroutput">using</code> can be different for each
+      tool.  You can obtain specific documentation for any tool's
+      configuration parameters by invoking
+</p>
+<pre class="programlisting">
+bjam --help <em class="replaceable"><code>tool-name</code></em>.init         
+</pre>
+<p>
+    </p>
+<p>
+      That said, for all the compiler toolsets Boost.Build supports
+      out-of-the-box, the list of parameters to
+      <code class="computeroutput">using</code> is the same: <em class="parameter"><code>toolset-name</code></em>, <em class="parameter"><code>version</code></em>, <em class="parameter"><code>invocation-command</code></em>, and <em class="parameter"><code>options</code></em>.
+      
+    </p>
+<p>The <em class="parameter"><code>version</code></em>
+    parameter identifies the toolset version, in case you have
+    several installed. It can have any form you like, but
+    it's recommended that you use a numeric identifier like
+    <code class="literal">7.1</code>.
+    </p>
+<p>
+      The <em class="parameter"><code>invocation-command</code></em>
+      parameter is the command that must be executed to run the
+      compiler. This parameter can usually be omitted if the compiler
+      executable
+      </p>
+<div class="itemizedlist"><ul type="disc">
+<li><p>has its &#8220;usual
+      name&#8221; and is in the <code class="envar">PATH</code>,
+      or</p></li>
+<li><p>was installed in a standard
+      &#8220;installation directory&#8221;,
+      or</p></li>
+<li><p>can be found through a global mechanism like the
+      Windows registry.</p></li>
+</ul></div>
+<p>
+
+      For example:
+</p>
+<pre class="programlisting">
+using msvc : 7.1 ;
+using gcc ;
+</pre>
+<p>
+If the compiler can be found in the <code class="envar">PATH</code> but only by a
+nonstandard name, you can just supply that name:
+</p>
+<pre class="programlisting">
+using gcc : : g++-3.2 ;
+</pre>
+<p>
+Otherwise, it might be necessary to supply the complete path to the
+compiler executable:
+</p>
+<pre class="programlisting">
+using msvc : : "Z:/Programs/Microsoft Visual Studio/vc98/bin/cl" ;
+</pre>
+<p>
+Some Boost.Build toolsets will use that path to take additional
+actions required before invoking the compiler, such as calling
+vendor-supplied scripts to set up its required environment variables.
+When compiler executables for C and C++ are different, path to the C++
+compiler executable must be specified. The &#8220;invocation command&#8221;
+can be any command allowed by the operating system. For example:
+</p>
+<pre class="programlisting">
+using msvc : : echo Compiling &amp;&amp; foo/bar/baz/cl ;
+</pre>
+<p>
+will work.
+    </p>
+<p>To configure several versions of a toolset, simply invoke
+    the <code class="computeroutput">using</code> rule multiple times:
+</p>
+<pre class="programlisting">
+using gcc : 3.3 ;
+using gcc : 3.4 : g++-3.4 ;
+using gcc : 3.2 : g++-3.2 ;
+</pre>
+<p>
+        Note that in the first call to
+        <code class="computeroutput">using</code>, the compiler found in the
+        <code class="envar">PATH</code> will be used, and there's no need to
+        explicitly specify the command.
+    </p>
+<p>As shown above, both the <em class="parameter"><code>version</code></em> and <em class="parameter"><code>invocation-command</code></em> parameters are
+    optional, but there's an important restriction: if you configure
+    the same toolset more than once, you must pass the <em class="parameter"><code>version</code></em>
+    parameter every time. For example, the following is not allowed:
+</p>
+<pre class="programlisting">
+using gcc ;
+using gcc : 3.4 : g++-3.4 ;
+</pre>
+<p>
+      because the first <code class="computeroutput">using</code> call does
+      not specify a <em class="parameter"><code>version</code></em>.
+    </p>
+<p>The <em class="parameter"><code>options</code></em>
+    parameter is used to fine-tune the configuration. All of
+    Boost.Build's standard compiler toolsets accept properties of the
+    four builtin features <code class="varname">cflags</code>,
+    <code class="varname">cxxflags</code>, <code class="varname">compileflags</code> and
+    <code class="varname">linkflags</code> as <em class="parameter"><code>options</code></em> specifying flags that will be
+    always passed to the corresponding tools. Values of the
+    <code class="varname">cflags</code> feature are passed directly to the C
+    compiler, values of the <code class="varname">cxxflags</code> feature are
+    passed directly to the C++ compiler, and values of the
+    <code class="varname">compileflags</code> feature are passed to both. For
+    example, to configure a <span><strong class="command">gcc</strong></span> toolset so that it
+    always generates 64-bit code you could write:
+</p>
+<pre class="programlisting">
+using gcc : 3.4 : : &lt;compileflags&gt;-m64 &lt;linkflags&gt;-m64 ;
+</pre>
+<p>
+    </p>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../advanced.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="invocation.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/advanced/differences_to_v1.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/differences_to_v1.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/differences_to_v1.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,71 +3,63 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Differences to Boost.Build V1</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../advanced.html" title="Chapter 4. User documentation">
-<link rel="previous" href="builtins/features.html" title="Builtin features">
+<link rel="prev" href="builtins/features.html" title="Builtin features">
 <link rel="next" href="../extender.html" title="Chapter 5. Extender Manual">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="builtins/features.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../extender.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.advanced.differences_to_v1"></a>Differences to Boost.Build V1</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.differences_to_v1"></a>Differences to Boost.Build V1</h2></div></div></div>
 <div class="toc"><dl>
-<dt><a href="differences_to_v1.html#bbv2.advanced.differences_to_v1.configuration">Configuration</a></dt>
-<dt><a href="differences_to_v1.html#bbv2.advanced.differences_to_v1.jamfiles">Writing Jamfiles</a></dt>
-<dt><a href="differences_to_v1.html#bbv2.advanced.differences_to_v1.build_process">Build process</a></dt>
+<dt><span class="section"><a href="differences_to_v1.html#bbv2.advanced.differences_to_v1.configuration">Configuration</a></span></dt>
+<dt><span class="section"><a href="differences_to_v1.html#bbv2.advanced.differences_to_v1.jamfiles">Writing Jamfiles</a></span></dt>
+<dt><span class="section"><a href="differences_to_v1.html#bbv2.advanced.differences_to_v1.build_process">Build process</a></span></dt>
 </dl></div>
 <p>While Boost.Build V2 is based on the same ideas as Boost.Build V1,
     some of the syntax was changed, and some new important features were
     added. This chapter describes most of the changes.</p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.advanced.differences_to_v1.configuration"></a>Configuration</h3></div></div>
-<div></div>
-</div>
-<p>In V1, there were two methods to configure a toolset. One is to
-      set some environment variable, or use "-s" command line option to set
-      variable inside BJam. Another method was creating new toolset module,
-      which would set the variables and then invoke basic toolset. Neither
-      method is necessary now, the "using" rule provides a consistent way to
-      initialize toolset, including several versions. See <a href="../advanced.html#bbv2.advanced.configuration" title="Configuration">section on configuraton</a> for
-      details.
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.advanced.differences_to_v1.configuration"></a>Configuration</h3></div></div></div>
+<p>In V1, toolsets were configured by environment variables. If you
+      wanted to use two versions of the same toolset, you had to create a new
+      toolset module that would set the variables and then invoke the base
+      toolset. In V2, toolsets are configured by the
+      <code class="computeroutput">using</code>, and you can easily configure several
+      versions of a toolset. See <a href="configuration.html" title="Configuration">the section called &#8220;Configuration&#8221;</a> for details.
       </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.advanced.differences_to_v1.jamfiles"></a>Writing Jamfiles</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.advanced.differences_to_v1.jamfiles"></a>Writing Jamfiles</h3></div></div></div>
 <p>Probably one of the most important differences in V2 Jamfiles is
-      the project requirements. In V1, if several targets have the same
-      requirements (for example, common include path), it was necessary to
-      manually write that requirements, or use a helper rule. In V2, the
-      common properties can be specified with the "requirements" project
-      attribute, as documented <a href="jamfiles.html#bbv2.advanced.projects" title="Projects">here</a>.
+      the use of project requirements. In V1, if several targets had the same
+      requirements (for example, a common <code class="computeroutput">#include</code> path), it was necessary to
+      manually write the requirements or use a helper rule or template target. In V2, the
+      common properties can be specified with the <code class="computeroutput">requirements</code> project
+      attribute, as documented in <a href="projects.html" title="Projects">the section called &#8220;Projects&#8221;</a>.
       </p>
-<p>The <a href="../tutorial/libs.html" title="Libraries and Dependent Targets">usage requirements</a>
-      is also important mechanism to simplify Jamfile. If a library requires
-      all clients to use specific includes, or macros when compiling the
-      code which depends on the library, this information can be cleanly
+<p><a href="../tutorial/libs.html" title="Dependent Targets">Usage requirements</a>
+      also help to simplify Jamfiles. 
+      
+      If a library requires
+      all clients to use specific <code class="computeroutput">#include</code> paths or macros when compiling 
+      code that depends on the library, that information can be cleanly
       represented.</p>
-<p>The difference between "lib" and "dll" targets in V1 is completely
-      eliminated in V2. There's only one target -- "lib", which can create
-      either static or shared library depending on the value of the 
-        <a href="builtins/features.html#bbv2.advanced.builtins.features.link">&lt;link&gt;
-      feature</a>. If your target should be only build in one variant, you
-      can add &lt;link&gt;shared or &lt;link&gt;static to requirements.
+<p>The difference between <code class="computeroutput">lib</code> and <code class="computeroutput">dll</code> targets in V1 is completely
+      eliminated in V2. There's only one library target type, <code class="computeroutput">lib</code>, which can create
+      either static or shared libraries depending on the value of the 
+        <a href="builtins/features.html#bbv2.advanced.builtins.features.link"><code class="varname">&lt;link&gt;</code>
+      feature</a>. If your target should be only built in one way, you
+      can add <code class="computeroutput">&lt;link&gt;shared</code> or <code class="computeroutput">&lt;link&gt;static</code> to its requirements.
       </p>
 <p>The syntax for referring to other targets was changed a bit. While
       in V1 one would use:
@@ -83,17 +75,14 @@
 </pre>
 <p>
         Note that you don't need to specify the type of other target, but the
-        last element should be separated to double slash, to indicate that
-        you're referring to target "bar" in project "../foo", and not to
-        project "../foo/bar".
+        last element should be separated from the others by a double slash to indicate that
+        you're referring to target <code class="filename">bar</code> in project <code class="filename">../foo</code>, and not to
+        project <code class="filename">../foo/bar</code>.
         </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.advanced.differences_to_v1.build_process"></a>Build process</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.advanced.differences_to_v1.build_process"></a>Build process</h3></div></div></div>
 <p>The command line syntax in V2 is completely different. For example
 </p>
 <pre class="programlisting">
@@ -106,18 +95,18 @@
 bjam toolset=msvc variant=release some_target
 </pre>
 <p>
-        or, using shortcuts, just:
+        or, using implicit features, just:
 </p>
 <pre class="programlisting">
 bjam msvc release some_target
 </pre>
 <p>
-      See <a href="../reference.html#bbv2.reference.commandline" title="Command line">the reference</a> for
+      See <a href="../reference.html#bbv2.reference.commandline" title="Command line">the reference</a> for a
       complete description of the syntax.
       </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Added: boost-build/branches/upstream/current/doc/html/bbv2/advanced/invocation.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/invocation.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/invocation.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,116 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Invocation</title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../advanced.html" title="Chapter 4. User documentation">
+<link rel="prev" href="configuration.html" title="Configuration">
+<link rel="next" href="targets.html" title="Declaring targets">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="configuration.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="targets.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.invocation"></a>Invocation</h2></div></div></div>
+<p>This section describes how invoke Boost.Build from the command line</p>
+<p>To build all targets defined in Jamfile in the current directory with default properties, run:
+</p>
+<pre class="screen">
+bjam
+</pre>
+<p>To build specific targets, specify them on the command line:
+</p>
+<pre class="screen">
+bjam lib1 subproject//lib2 
+</pre>
+<p>
+      </p>
+<p>To request a certain value for some property, add <code class="literal">
+      <em class="replaceable"><code>property</code></em>=<em class="replaceable"><code>value</code></em></code> to the command line:
+</p>
+<pre class="screen">
+bjam toolset=gcc variant=debug optimization=space
+</pre>
+<p>
+       For often used features, like <code class="literal">toolset</code> and <code class="literal">variant</code> you can
+       omit the feature name, so the above can be written as:
+</p>
+<pre class="screen">
+bjam optimization=space
+</pre>
+<p>
+      </p>
+<p>Boost.Build recognizes the following command line options.</p>
+<div class="variablelist"><dl>
+<dt><span class="term"><code class="option">--clean</code></span></dt>
+<dd><p>Cleans all targets in the current directory and 
+            in any subprojects. Note that unlike the <code class="literal">clean</code> 
+            target in make, you can use <code class="literal">--clean</code>
+            together with target names to clean specific targets.</p></dd>
+<dt><span class="term"><code class="option">--clean-all</code></span></dt>
+<dd><p>Cleans all targets, 
+            no matter where they are defined. In particular, it will clean targets 
+            in parent Jamfiles, and targets defined under other project roots.
+            </p></dd>
+<dt><span class="term"><code class="option">--build-dir</code></span></dt>
+<dd>
+<p>Changes build directories for all project roots being built. When
+            this option is specified, all Jamroot files should declare project name.
+            The build directory for the project root will be computed by concatanating
+            the value of the <code class="option">--build-dir</code> option, the project name 
+            specified in Jamroot, and the build dir specified in Jamroot 
+            (or <code class="literal">bin</code>, if none is specified).
+            </p>
+<p>The option is primarily useful when building from read-only
+            media, when you can't modify Jamroot.
+            </p>
+</dd>
+<dt><span class="term"><code class="option">--version</code></span></dt>
+<dd><p>Prints information on Boost.Build and Boost.Jam
+                  versions.
+            </p></dd>
+<dt>
+<a name="bbv2.reference.init.options.help"></a><span class="term"><code class="option">--help</code></span>
+</dt>
+<dd><p>Invokes the online help system. This prints general
+                  information on how to use the help system with additional
+                  --help* options.
+            </p></dd>
+<dt><span class="term"><code class="option">--debug-configuration</code></span></dt>
+<dd><p>Produces debug information about loading of Boost.Build 
+            and toolset files.</p></dd>
+<dt><span class="term"><code class="option">--debug-building</code></span></dt>
+<dd><p>Prints what targets are being built and with what properties.
+            </p></dd>
+<dt><span class="term"><code class="option">--debug-generators</code></span></dt>
+<dd><p>Produces debug output from generator search process. 
+            Useful for debugging custom generators.
+            </p></dd>
+<dt><span class="term"><code class="option">--ignore-config</code></span></dt>
+<dd><p>Do not load <code class="literal">site-config.jam</code> and
+                  <code class="literal">user-config.jam</code> configuration files.
+            </p></dd>
+<dt><span class="term"><code class="option">--debug</code></span></dt>
+<dd><p>Enables internal checks.
+            </p></dd>
+</dl></div>
+<p>For complete specification of command line syntax, see 
+      <a href="../reference.html#bbv2.reference.init.args" title="Command line arguments">the section called &#8220;Command line arguments&#8221;</a>
+      </p>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="configuration.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="targets.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Deleted: boost-build/branches/upstream/current/doc/html/bbv2/advanced/jamfiles.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/jamfiles.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/jamfiles.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,428 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Writing Jamfiles</title>
-<link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="up" href="../advanced.html" title="Chapter 4. User documentation">
-<link rel="previous" href="../advanced.html" title="Chapter 4. User documentation">
-<link rel="next" href="build_process.html" title="Build process">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="../advanced.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="build_process.html"><img src="../../images/next.png" alt="Next"></a>
-</div>
-<div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.advanced.jamfiles"></a>Writing Jamfiles</h2></div></div>
-<div></div>
-</div>
-<div class="toc"><dl>
-<dt><a href="jamfiles.html#bbv2.advanced.overview">Overview</a></dt>
-<dt><a href="jamfiles.html#bbv2.advanced.targets">Main targets</a></dt>
-<dt><a href="jamfiles.html#bbv2.advanced.projects">Projects</a></dt>
-<dt><a href="jamfiles.html#bbv2.advanced.other-rules">Additional Jamfile rules</a></dt>
-<dt><a href="jamfiles.html#bbv2.advanced.project-root">Project root</a></dt>
-</dl></div>
-<div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.advanced.overview"></a>Overview</h3></div></div>
-<div></div>
-</div>
-<p>Jamfiles are the thing which is most important to the user,
-      bacause they declare the targets which should be build. Jamfiles are
-      also used for organizing targets -- each Jamfile is a separate project,
-      which can be build independently from the other projects.</p>
-<p>Jamfile mostly contain calls to Boost.Build functions, which do
-        all the work, specifically:
-        </p>
-<div class="itemizedlist"><ul type="disc">
-<li><p><a href="jamfiles.html#bbv2.advanced.targets" title="Main targets">declare main
-                targets</a></p></li>
-<li><p><a href="jamfiles.html#bbv2.advanced.projects" title="Projects">define
-            project properties</a></p></li>
-<li><p><a href="jamfiles.html#bbv2.advanced.other-rules" title="Additional Jamfile rules">do various other
-            things</a></p></li>
-</ul></div>
-<p>In addition to Jamfiles, Boost.Build has another user-editable
-        file, project-root.jam, which is mostly useful to declare constants
-        global to all the projects. It is described in more detail <a href="jamfiles.html#bbv2.advanced.project-root" title="Project root">below</a>.
-      </p>
-</div>
-<div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.advanced.targets"></a>Main targets</h3></div></div>
-<div></div>
-</div>
-<p><a name="bbv2.advanced.targets.main"></a><span class="emphasis"><em>Main target</em></span> is a user-defined named
-        entity which can be build, for example a named executable file.
-        Declaring a main target is usually done using one of <a href="builtins/targets.html" title="Builtin target types">main target functions</a>.
-        The user can also declare <a href="doc/extending.html#main_target_rules" target="_top">custom main target
-          function</a>.</p>
-<p>Most main targets rules in Boost.Build use similiar
-        syntax:</p>
-<a name="bbv2.main-target-rule-syntax"></a><pre class="programlisting">
-function-name main-target-name 
-    : sources 
-    : requirements 
-    : default-build 
-    : usage-requirements 
-    ;
-</pre>
-<div class="itemizedlist"><ul type="disc">
-<li>
-            "main-target-name" is the name used to request the target
-            on command line and to use it from other main targets. Main
-            target name may contain alphanumeric characters and symbols '-'
-            and '_';
-          </li>
-<li>
-            "sources" is the list of source files and other main
-            targets that must be combined. 
-          </li>
-<li>
-            "requirements" is the list of properties that must always
-            be present when this main target is built.
-          </li>
-<li>
-            "default-build" is the list of properties that will be used
-            unless some other value of the same feature is already
-            specified.
-          </li>
-<li>
-            "usage-requirements" is the list of properties that will be
-            propagated to all main targets that use this one, i.e. to all
-            dependents.
-          </li>
-</ul></div>
-<p>Note that the actual requirements, default-build and
-        usage-requirements attributes for a target are obtained by combining
-        the explicitly specified one with those specified for the project
-        where a target is declared.
-      </p>
-<p>          
-        Some main target rules have shorter list of parameters, and
-        you should consult their documentation for details.
-      </p>
-<p>The list of sources specifies what should be processed to get
-        the resulting targets. Most of the time, it's just a list of
-        files. Sometimes, you'd want to use all files with the same
-        extension as sources, in which case you can use the "glob"
-        rule. Here are two examples:
-</p>
-<pre class="programlisting">
-exe a : a.cpp ;
-exe b : [ glob *.cpp ] ;
-</pre>
-<p>
-        Unless you specify a files with absolute path, the name is
-        considered relative to the source directory -- which is typically
-        the same as directory when Jamfile is located, but can be changed as
-        described <a href="jamfiles.html#bbv2.advanced.projects.attributes.projectrule">here</a></p>
-<p>
-        The list of sources can also reference other main targets. The
-        targets in the same project can be referred by using the name, and
-        targets in other project need to specify directory or a symbolic
-        name of the other project. For example:
-</p>
-<pre class="programlisting">
-lib helper : helper.cpp ;
-exe a : a.cpp helper ;
-exe b : b.cpp ..//utils ;
-exe c : c.cpp /boost/program_options//program_opions ;
-</pre>
-<p>
-        The first exe uses the library defined in the same project. The
-        second one uses some target (most likely library) defined by Jamfile
-        one level higher. Finally, the third target uses some <a href="http://boost.org" target="_top">C++ Boost</a> library, using the
-        symbolic name to refer to it. More information about it can be found
-        in <a href="../tutorial/libs.html" title="Libraries and Dependent Targets">tutorial</a> and in 
-        <a href="../reference/definitions.html#bbv2.reference.ids" title="Target identifiers and references">target id reference</a>.          
-      </p>
-<p>Requirements are the properties that should always be present when
-        building a target. Typically, they are includes and defines:
-</p>
-<pre class="programlisting">
-exe hello : hello.cpp : &lt;include&gt;/opt/boost &lt;define&gt;MY_DEBUG ;
-</pre>
-<p>
-        In special circumstances, other properties can be used, for example if
-        a library does not work if it's shared, or a file can't be compiled
-        with optimization due to a compiler bug, one can use
-</p>
-<pre class="programlisting">
-lib util : util.cpp : &lt;link&gt;static ;
-obj main : main.cpp : &lt;optimization&gt;off ;
-</pre>
-<p>Sometimes, requirements are necessary only for a specific
-        compiler, or build variant. The 
-        <a href="../../">conditional
-        properties</a> can be used in that case:
-</p>
-<pre class="programlisting">
-lib util : util.cpp : &lt;toolset&gt;msvc:&lt;link&gt;static ;
-</pre>
-<p>
-        In means when whenever <tt class="computeroutput">&lt;toolset&gt;msvc</tt> property is
-        in build properties, the <tt class="computeroutput">&lt;link&gt;static</tt> property will
-        be included as well. The conditional requirements can be "chained":
-</p>
-<pre class="programlisting">
-lib util : util.cpp : &lt;toolset&gt;msvc:&lt;link&gt;static 
-                      &lt;link&gt;static:&lt;define&gt;STATIC_LINK ;
-</pre>
-<p>
-        will set of static link and the <tt class="computeroutput">STATIC_LINK</tt> define on the
-        <tt class="computeroutput">msvc</tt> toolset.
-      </p>
-<p>The default-build attribute is
-        a set of properties which should be used if build request does not
-        specify a value. For example:
-</p>
-<pre class="programlisting">
-exe hello : hello.cpp : : &lt;threading&gt;multi ;
-</pre>
-<p>
-        would build the target in multi-threaded mode, unless the user
-        explicitly requests single-threaded version. The difference between
-        requirements and default-build is that requirements cannot be
-        overriden in any way.
-      </p>
-<p>A target of the same name can be declared several times. In that
-        case is declaration is called an
-        <i class="firstterm">alternative</i>. When the target is build, one of
-        the alternatives will be selected and use. Alternatives need not be
-        defined by the same main target rule. The following is OK:
-</p>
-<pre class="programlisting">
-lib helpers : helpers.hpp ;
-alias helpers : helpers.lib : &lt;toolset&gt;msvc ;
-</pre>
-<p>Building of the same main target can differ greatly from
-        platform to platform. For example, you might have different list
-        of sources for different compilers, or different options for those
-        compilers. Two approaches to this are explained in the 
-        <a href="../tutorial/conditions.html" title="Conditions and alternatives">tutorial</a>.
-      </p>
-<p>Sometimes a main target is really needed only by some other main
-        target. For example, a rule that declares a test-suite uses a main
-        target that represent test, but those main targets are rarely needed
-        by themself.</p>
-<p>It is possible to declare target inline, i.e. the "sources"
-        parameter may include call to other main rules. For example:</p>
-<pre class="programlisting">
-exe hello : hello.cpp 
-    [ obj helpers : helpers.cpp : &lt;optimization&gt;off ] ;
-</pre>
-<p>
-        Will cause "helpers.cpp" to be always compiled without
-        optimization. It's possible to request main targets declared
-        inline, but since they are considered local, they are renamed to
-        "parent-main-target_name..main-target-name". In the example above,
-        to build only helpers, one should run "bjam hello..helpers".
-      </p>
-</div>
-<div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.advanced.projects"></a>Projects</h3></div></div>
-<div></div>
-</div>
-<p>As mentioned before, targets are grouped into project, and each
-        Jamfile is a separate project. Projects are useful because it allows
-        to group related targets together, define properties common to all
-        those targets, and assign a symbolic name to the project, allowing to
-        easily refer to the targets in the project. Two last goals are
-        accompished with the "project" rule.
-      </p>
-<p>The rule has this syntax
-</p>
-<pre class="programlisting">
-project id : &lt;attributes&gt; ;
-</pre>
-<p>
-        Here, attributes is a sequence of (attribute-name,
-        attribute-value) pairs. The list of attribute names along with its
-        handling is also shown in the table below. For example, it is
-        possible to write:
-</p>
-<pre class="programlisting">
-project tennis 
-    : requirements &lt;threading&gt;multi 
-    : default-build release
-    ;
-</pre>
-<p>The possible attributes are listed below.</p>
-<p><span class="emphasis"><em>Project id</em></span> is a short way to denote a project, as
-        opposed to the Jamfile's pathname. It is a hierarchical path,
-        unrelated to filesystem, such as "boost/thread". <a href="../reference/definitions.html#bbv2.reference.ids" title="Target identifiers and references">Target references</a> make use of project ids to
-        specify a target.</p>
-<p><span class="emphasis"><em>Source location</em></span> specifies the directory where sources
-        for the project are located.</p>
-<p><span class="emphasis"><em>Project requirements</em></span> are requirements that apply to
-        all the targets in the projects as well as all subprojects.</p>
-<p><span class="emphasis"><em>Default build</em></span> is the build request that should be
-        used when no build request is specified explicitly.</p>
-<p><a name="bbv2.advanced.projects.attributes.projectrule"></a>
-        The default values for those attributes are
-        given in the table below.
-
-        </p>
-<div class="table">
-<a name="id2536169"></a><p class="title"><b>Table 4.1. </b></p>
-<table class="table" summary="">
-<colgroup>
-<col>
-<col>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th>Attribute</th>
-<th>Name for the 'project' rule</th>
-<th>Default value</th>
-<th>Handling by the 'project' rule</th>
-</tr></thead>
-<tbody>
-<tr>
-<td>Project id</td>
-<td>none</td>
-<td>none</td>
-<td>Assigned from the first parameter of the 'project' rule.
-                  It is assumed to denote absolute project id.</td>
-</tr>
-<tr>
-<td>Source location</td>
-<td><tt class="literal">source-location</tt></td>
-<td>The location of jamfile for the project</td>
-<td>Sets to the passed value</td>
-</tr>
-<tr>
-<td>Requirements</td>
-<td><tt class="literal">requirements</tt></td>
-<td>The parent's requirements</td>
-<td>The parent's requirements are refined with the passed
-                  requirement and the result is used as the project
-                  requirements.</td>
-</tr>
-<tr>
-<td>Default build</td>
-<td><tt class="literal">default-build</tt></td>
-<td>none</td>
-<td>Sets to the passed value</td>
-</tr>
-<tr>
-<td>Build directory</td>
-<td><tt class="literal">build-dir</tt></td>
-<td>If parent has a build dir set, the value of it, joined
-                  with the relative path from parent to the current project.
-                  Otherwise, empty</td>
-<td>Sets to the passed value, interpreted as relative to the
-                  project's location.</td>
-</tr>
-</tbody>
-</table>
-</div>
-</div>
-<div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.advanced.other-rules"></a>Additional Jamfile rules</h3></div></div>
-<div></div>
-</div>
-<p>There's a number of other helper rules which can be used in
-      Jamfile, described in the following table.</p>
-<div class="table">
-<a name="id2536280"></a><p class="title"><b>Table 4.2. </b></p>
-<table class="table" summary="">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th>Rule</th>
-<th>Semantic</th>
-</tr></thead>
-<tbody>
-<tr>
-<td><a href="jamfiles.html#bbv2.advanced.projects.attributes.projectrule">project</a></td>
-<td>Define project attributes.</td>
-</tr>
-<tr>
-<td><a href="../../">use-project</a></td>
-<td>Make another project known.</td>
-</tr>
-<tr>
-<td><a href="../../">build-project</a></td>
-<td>Build another project when this one is built.</td>
-</tr>
-<tr>
-<td><a href="../../">explicit</a></td>
-<td>States that the target should be built only by explicit
-                request.</td>
-</tr>
-<tr>
-<td>glob</td>
-<td>Takes a list of wildcards, and returns the list of files
-                which match any of the wildcards.</td>
-</tr>
-</tbody>
-</table>
-</div>
-</div>
-<div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.advanced.project-root"></a>Project root</h3></div></div>
-<div></div>
-</div>
-<p>Each project is also associated with <span class="emphasis"><em>project root</em></span>.
-        That's a root for a tree of projects, which specifies some global
-        properties.</p>
-<p>
-          Project root for a projects is the nearest parent directory
-          which contains a file called
-          <tt class="filename">project-root.jam</tt>. That file defines
-          certain properties which apply to all projects under project
-          root. It can:
-
-        </p>
-<div class="itemizedlist"><ul type="disc">
-<li>
-              configure toolsets, via call to <tt class="literal">toolset.using</tt>
-</li>
-<li>
-              refer to other projects, via the <tt class="literal">use-project</tt>
-              rule
-            </li>
-<li>
-              declare constants, via the <tt class="literal">constant</tt> and
-              <tt class="literal">path-constant</tt> rules.
-            </li>
-</ul></div>
-<p>To facilitate declaration of simple projects, Jamfile and
-        project-root can be merged together. To achieve this effect, the
-        project root file should call the <tt class="literal">project</tt> rule. The
-        semantic is precisely the same as if the call was made in
-        Jamfile, except that project-root.jam will start to serve as
-        Jamfile. The Jamfile in the directory of project-root.jam will be
-        ignored, and project-root.jam will be able to declare main
-        targets as usual.</p>
-</div>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><small></small></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="../advanced.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="build_process.html"><img src="../../images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>

Added: boost-build/branches/upstream/current/doc/html/bbv2/advanced/other-rules.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/other-rules.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/other-rules.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,92 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Jamfile Utility Rules</title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../advanced.html" title="Chapter 4. User documentation">
+<link rel="prev" href="projects.html" title="Projects">
+<link rel="next" href="build_process.html" title="The Build Process">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="projects.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="build_process.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.other-rules"></a>Jamfile Utility Rules</h2></div></div></div>
+<p>The following table describes utility rules that can be
+      used in Jamfiles. Detailed information for any of these rules can
+      be obtained by running:
+</p>
+<pre class="screen">
+bjam --help project.<em class="replaceable"><code>rulename</code></em>
+</pre>
+<p>
+      </p>
+<div class="table">
+<a name="id2573917"></a><p class="title"><b>Table 4.2. </b></p>
+<table class="table" summary="">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>Rule</th>
+<th>Semantics</th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+<a href="projects.html#bbv2.advanced.projects.attributes.projectrule">project</a>
+              </td>
+<td>Define this project's symbolic ID or attributes.</td>
+</tr>
+<tr>
+<td>???</td>
+<td>Make another project known so that it can be referred to by symbolic ID.</td>
+</tr>
+<tr>
+<td>???</td>
+<td>Cause another project to be built when this one is built.</td>
+</tr>
+<tr>
+<td>???</td>
+<td>State that a target should be built only by explicit
+                request.</td>
+</tr>
+<tr>
+<td>glob</td>
+<td>Translate a list of shell-style wildcards into a
+              corresponding list of files.</td>
+</tr>
+<tr>
+<td>constant</td>
+<td>Injects a variable setting into this project's
+              Jamfile module and those of all its subprojects.</td>
+</tr>
+<tr>
+<td>path-constant</td>
+<td>Injects a variable set to a path value into
+              this project's Jamfile module and those of all its subprojects.
+              If the value is a relative path it will be adjusted for
+              each subproject so that it refers to the same
+              directory.</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="projects.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="build_process.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Added: boost-build/branches/upstream/current/doc/html/bbv2/advanced/projects.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/projects.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/projects.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,178 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Projects</title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../advanced.html" title="Chapter 4. User documentation">
+<link rel="prev" href="targets.html" title="Declaring targets">
+<link rel="next" href="other-rules.html" title="Jamfile Utility Rules">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="targets.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="other-rules.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.projects"></a>Projects</h2></div></div></div>
+<p>As mentioned before, targets are grouped into projects,
+      and each Jamfile is a separate project. Projects are useful
+      because they allow us to group related targets together, define
+      properties common to all those targets, and assign a symbolic
+      name to the project that can be used in referring to its
+      targets. 
+      </p>
+<p>Projects are named using the
+      <code class="computeroutput">project</code> rule, which has the
+      following syntax:
+</p>
+<pre class="programlisting">
+project <em class="replaceable"><code>id</code></em> : <em class="replaceable"><code>attributes</code></em> ;
+</pre>
+<p>
+        Here, <em class="replaceable"><code>attributes</code></em> is a sequence of
+        rule arguments, each of which begins with an attribute-name
+        and is followed by any number of build properties. The list
+        of attribute names along with its handling is also shown in
+        the table below. For example, it is possible to write:
+</p>
+<pre class="programlisting">
+project tennis 
+    : requirements &lt;threading&gt;multi 
+    : default-build release
+    ;
+</pre>
+<p>   
+      </p>
+<p>The possible attributes are listed below.</p>
+<p><span class="emphasis"><em>Project id</em></span> is a short way to denote a project, as
+        opposed to the Jamfile's pathname. It is a hierarchical path,
+        unrelated to filesystem, such as "boost/thread". <a href="../reference/definitions.html#bbv2.reference.ids" title="Target identifiers and references">Target references</a> make use of project ids to
+        specify a target.</p>
+<p><span class="emphasis"><em>Source location</em></span> specifies the directory where sources
+        for the project are located.</p>
+<p><span class="emphasis"><em>Project requirements</em></span> are requirements that apply to
+        all the targets in the projects as well as all subprojects.</p>
+<p><span class="emphasis"><em>Default build</em></span> is the build request that should be
+        used when no build request is specified explicitly.</p>
+<p><a name="bbv2.advanced.projects.attributes.projectrule"></a>
+        The default values for those attributes are
+        given in the table below.
+
+        </p>
+<div class="table">
+<a name="id2573625"></a><p class="title"><b>Table 4.1. </b></p>
+<table class="table" summary="">
+<colgroup>
+<col>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>Attribute</th>
+<th>Name</th>
+<th>Default value</th>
+<th>Handling by the <code class="computeroutput">project</code>
+                rule</th>
+</tr></thead>
+<tbody>
+<tr>
+<td>Project id</td>
+<td>none</td>
+<td>none</td>
+<td>Assigned from the first parameter of the 'project' rule.
+                  It is assumed to denote absolute project id.</td>
+</tr>
+<tr>
+<td>Source location</td>
+<td><code class="literal">source-location</code></td>
+<td>The location of jamfile for the project</td>
+<td>Sets to the passed value</td>
+</tr>
+<tr>
+<td>Requirements</td>
+<td><code class="literal">requirements</code></td>
+<td>The parent's requirements</td>
+<td>The parent's requirements are refined with the passed
+                  requirement and the result is used as the project
+                  requirements.</td>
+</tr>
+<tr>
+<td>Default build</td>
+<td><code class="literal">default-build</code></td>
+<td>none</td>
+<td>Sets to the passed value</td>
+</tr>
+<tr>
+<td>Build directory</td>
+<td><code class="literal">build-dir</code></td>
+<td>Empty if the parent has no build directory set.
+                Otherwise, the parent's build directory with the
+                relative path from parent to the current project
+                appended to it.
+                </td>
+<td>Sets to the passed value, interpreted as relative to the
+                  project's location.</td>
+</tr>
+</tbody>
+</table>
+</div>
+<p>
+        </p>
+<p>Besides defining projects and main targets, Jamfiles
+      commonly invoke utility rules such as
+      <code class="computeroutput">constant</code> and
+      <code class="computeroutput">path-constant</code>, which inject a
+      specified Boost.Jam variable setting into this project's Jamfile
+      module and those of all its subprojects.  See <a href="other-rules.html" title="Jamfile Utility Rules">the section called &#8220;Jamfile Utility Rules&#8221;</a> for a complete description
+      of these utility rules.  Jamfiles are regular Boost.Jam source
+      files and Boost.Build modules, so naturally they can contain any kind of Boost.Jam code,
+      including rule definitions.
+      
+      </p>
+<p>Each subproject inherits attributes, constants and rules
+      from its parent project, which is defined by the nearest
+      Jamfile in an ancestor directory above
+      the subproject.  The top-level project is declared in a file
+      called <code class="filename">Jamroot</code> rather than
+      <code class="filename">Jamfile</code>.  When loading a project,
+      Boost.Build looks for either <code class="filename">Jamroot</code> or
+      <code class="computeroutput">Jamfile</code>.  They are handled identically, except
+      that if the file is called <code class="filename">Jamroot</code>, the
+      search for a parent project is not performed.
+      </p>
+<p>Even when building in a subproject directory, parent
+      project files are always loaded before those of their
+      subprojects, so that every definition made in a parent project
+      is always available to its children. The loading order of any
+      other projects is unspecified.  Even if one project refers to
+      another via ???,
+      or a target reference, no specific order should be assumed.
+      </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>Giving the root project the special name
+        &#8220;<code class="filename">Jamroot</code>&#8221; ensures that
+        Boost.Build won't misinterpret a directory above it as the
+        project root just because the directory contains a Jamfile.
+        
+        </p></td></tr>
+</table></div>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="targets.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="other-rules.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Added: boost-build/branches/upstream/current/doc/html/bbv2/advanced/targets.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced/targets.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced/targets.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,296 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Declaring targets</title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../advanced.html" title="Chapter 4. User documentation">
+<link rel="prev" href="invocation.html" title="Invocation">
+<link rel="next" href="projects.html" title="Projects">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="invocation.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="projects.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.targets"></a>Declaring targets</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="targets.html#id2572930">Name</a></span></dt>
+<dt><span class="section"><a href="targets.html#id2522684">Sources</a></span></dt>
+<dt><span class="section"><a href="targets.html#bbv2.advanced.targets.requirements">Requirements</a></span></dt>
+<dt><span class="section"><a href="targets.html#id2573377">Default build</a></span></dt>
+<dt><span class="section"><a href="targets.html#id2573405">Additional information</a></span></dt>
+</dl></div>
+<p><a name="bbv2.advanced.targets.main"></a>
+        A <em class="firstterm">Main target</em> is a user-defined named
+        entity that can be built, for example an executable file.
+        Declaring a main target is usually done using one of the main
+        target rules described in <a href="builtins/targets.html" title="Builtin target types">the section called &#8220;Builtin target types&#8221;</a>.  The user can also declare
+        custom main target rules as shown in <a href="../extending/rules.html" title="Main target rules">the section called &#8220;Main target rules&#8221;</a>.
+      </p>
+<a class="indexterm" name="id2572778"></a><p>Most main target rules in Boost.Build have the same common
+      signature:</p>
+<a class="indexterm" name="id2572791"></a><a name="bbv2.main-target-rule-syntax"></a><pre class="programlisting">
+rule <em class="replaceable"><code>rule-name</code></em> (
+     main-target-name :
+     sources + :
+     requirements * :
+     default-build * :
+     usage-requirements * )
+</pre>
+<div class="itemizedlist"><ul type="disc">
+<li>
+            <em class="parameter"><code>main-target-name</code></em> is the name used
+            to request the target on command line and to use it from
+            other main targets. A main target name may contain
+            alphanumeric characters, dashes
+            (&#8216;<code class="computeroutput">-</code>&#8217;), and underscores
+            (&#8216;<code class="computeroutput">_</code>&#8217;).
+          </li>
+<li>
+            <em class="parameter"><code>sources</code></em> is the list of source files and other main
+            targets that must be combined. 
+          </li>
+<li>
+            <em class="parameter"><code>requirements</code></em> is the list of properties that must always
+            be present when this main target is built.
+          </li>
+<li>
+            <em class="parameter"><code>default-build</code></em> is the list of properties that will be used
+            unless some other value of the same feature is already
+            specified, e.g. on the command line or by propogation from a dependent target.
+          </li>
+<li>
+            <em class="parameter"><code>usage-requirements</code></em> is the list of properties that will be
+            propagated to all main targets that use this one, i.e. to all its
+            dependents.
+          </li>
+</ul></div>
+<p>          
+        Some main target rules have a different list of parameters, their 
+        documentation explicitly says so.
+      </p>
+<p>The actual requirements for a target are obtained by refining
+      requirements of the project where a target is declared with the
+      explicitly specified requirements. The same is true for
+      usage-requirements. More details can be found in 
+      <a href="../reference/definitions.html#bbv2.reference.variants.proprefine" title="Property refinement">the section called &#8220;Property refinement&#8221;</a>
+      </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2572930"></a>Name</h3></div></div></div>
+<p>The name of main target has two purposes. First, it's used to refer to this target from
+        other targets and from command line. Second, it's used to compute the names of the generated files.
+        Typically, filenames are obtained from main target name by appending system-dependent suffixes and
+        prefixes.
+        </p>
+<p>Name of main target can contain alphanumeral characters, dash, undescore and dot. The entire
+        name is significant when resolving references from other targets. For determining filenames, only the
+        part before the first dot is taken. For example:</p>
+<pre class="programlisting">
+obj test.release : test.cpp : &lt;variant&gt;release ;
+obj test.debug : test.cpp : &lt;variant&gt;debug ;
+</pre>
+<p>will generate two files named <code class="filename">test.obj</code> (in two different directories), not
+        two files named <code class="filename">test.release.obj</code> and <code class="filename">test.debug.obj</code>.
+        </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2522684"></a>Sources</h3></div></div></div>
+<p>The list of sources specifies what should be processed to
+        get the resulting targets. Most of the time, it's just a list of
+        files. Sometimes, you'll want to automatically construct the
+        list of source files rather than having to spell it out
+        manually, in which case you can use the
+        <code class="computeroutput">glob</code> rule. Here are two examples:
+</p>
+<pre class="programlisting">
+exe a : a.cpp ;           # a.cpp is the only source file
+exe b : [ glob *.cpp ] ;  # all .cpp files in this directory are sources 
+</pre>
+<p>
+        Unless you specify a file with an absolute path, the name is
+        considered relative to the source directory&#8212;which is typically
+        the directory where the Jamfile is located, but can be changed as
+        described in <a href="projects.html#bbv2.advanced.projects.attributes.projectrule" title="">the section called &#8220;Projects&#8221;</a>.
+        </p>
+<p>
+          
+          The list of sources can also refer to other main targets.
+          Targets in the same project can be referred to by name, while
+          targets in other projects must be qualified with a directory or a
+          symbolic project name. The directory/project name is separated from
+          the target name by double slash. There's no special syntax to
+          distinguish directory name from project name&#8212;the part before
+          double slash is first looked up as project name, and then as directory
+          name. For example:
+</p>
+<pre class="programlisting">
+lib helper : helper.cpp ;
+exe a : a.cpp helper ;
+# Since all project ids start with slash, ".." is directory name.
+exe b : b.cpp ..//utils ;
+exe c : c.cpp /boost/program_options//program_options ;
+</pre>
+<p>
+          The first exe uses the library defined in the same
+          project. The second one uses some target (most likely library)
+          defined by Jamfile one level higher. Finally, the third target
+          uses some <a href="http://boost.org" target="_top">C++ Boost</a>
+          library, referring to it by absolute symbolic name. More
+          information about target references can be found in <a href="../tutorial/libs.html" title="Dependent Targets">the section called &#8220;Dependent Targets&#8221;</a> and <a href="../reference/definitions.html#bbv2.reference.ids" title="Target identifiers and references">the section called &#8220;Target identifiers and references&#8221;</a>.
+        </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.advanced.targets.requirements"></a>Requirements</h3></div></div></div>
+<p>Requirements are the properties that should always be present when
+        building a target. Typically, they are includes and defines:
+</p>
+<pre class="programlisting">
+exe hello : hello.cpp : &lt;include&gt;/opt/boost &lt;define&gt;MY_DEBUG ;
+</pre>
+<p>
+        There is a number of other features, listed in
+        <a href="builtins/features.html" title="Builtin features">the section called &#8220;Builtin features&#8221;</a>. For example if
+        a library can only be built statically, or a file can't be compiled
+        with optimization due to a compiler bug, one can use
+</p>
+<pre class="programlisting">
+lib util : util.cpp : &lt;link&gt;static ;
+obj main : main.cpp : &lt;optimization&gt;off ;
+</pre>
+<p>                
+        </p>
+<p><a name="bbv2.advanced.targets.requirements.conditional"></a>Sometimes, particular relationships need to be maintained
+        among a target's build properties. This can be achieved with 
+        <em class="firstterm">conditional
+        requirements</em>. For example, you might want to set
+        specific <code class="computeroutput">#defines</code> when a library is built as shared,
+        or when a target's <code class="computeroutput">release</code> variant is built in
+        release mode.
+</p>
+<pre class="programlisting">
+lib network : network.cpp 
+    : <span class="bold"><strong>&lt;link&gt;shared:&lt;define&gt;NEWORK_LIB_SHARED</strong></span>
+     &lt;variant&gt;release:&lt;define&gt;EXTRA_FAST
+    ;
+</pre>
+<p>
+
+        In the example above, whenever <code class="filename">network</code> is
+        built with <code class="computeroutput">&lt;link&gt;shared</code>,
+        <code class="computeroutput">&lt;define&gt;NEWORK_LIB_SHARED</code> will be in its
+        properties, too.      
+        </p>
+<p>You can use several properties in the condition, for example:
+</p>
+<pre class="programlisting">
+lib network : network.cpp
+    : &lt;toolset&gt;gcc,&lt;optimization&gt;speed:&lt;define&gt;USE_INLINE_ASSEMBLER
+    ;
+</pre>
+<p>
+        </p>
+<p><a name="bbv2.advanced.targets.requirements.indirect"></a>
+          More powerfull variant of conditional requirements is <em class="firstterm">indirect conditional requiremens</em>.
+          You can provide a rule that will be called with the current build properties and can compute additional properties
+          to be added. For example:
+</p>
+<pre class="programlisting">
+lib network : network.cpp 
+    : &lt;conditional&gt;@my-rule
+    ;
+rule my-rule ( properties * )
+{
+    local result ;
+    if &lt;toolset&gt;gcc &lt;optimization&gt;speed in $(properties)
+    {
+        result += &lt;define&gt;USE_INLINE_ASSEMBLER ;
+    }
+    return $(result) ;
+}  
+</pre>
+<p>
+        This example is equivalent to the previous one, but for complex cases, indirect conditional
+        requirements can be easier to write and understand.
+        </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2573377"></a>Default build</h3></div></div></div>
+<p>The <code class="varname">default-build</code> parameter
+        is a set of properties to be used if the build request does
+        not otherwise specify a value for features in the set. For example:
+</p>
+<pre class="programlisting">
+exe hello : hello.cpp : : &lt;threading&gt;multi ;
+</pre>
+<p>
+        would build a multi-threaded target in unless the user
+        explicitly requests a single-threaded version. The difference between
+        requirements and default-build is that requirements cannot be
+        overriden in any way.
+        </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2573405"></a>Additional information</h3></div></div></div>
+<p>
+          The ways a target is built can be so different that
+          describing them using conditional requirements would be
+          hard. For example, imagine that a library actually uses
+          different source files depending on the toolset used to build
+          it. We can express this situation using <em class="firstterm">target
+          alternatives</em>:
+</p>
+<pre class="programlisting">
+lib demangler : dummy_demangler.cpp ;                      # alternative 1
+lib demangler : demangler_gcc.cpp : &lt;toolset&gt;gcc ;   # alternative 2
+lib demangler : demangler_msvc.cpp : &lt;toolset&gt;msvc ; # alternative 3
+</pre>
+<p>
+          In the example above, when built with <code class="literal">gcc</code>
+          or <code class="literal">msvc</code>, <code class="filename">demangler</code>
+          will use a source file specific to the toolset.  Otherwise, it
+          will use a generic source file,
+          <code class="filename">dummy_demangler.cpp</code>.
+        </p>
+<p>It is possible to declare a target inline, i.e. the "sources"
+        parameter may include calls to other main rules. For example:</p>
+<pre class="programlisting">
+exe hello : hello.cpp 
+    [ obj helpers : helpers.cpp : &lt;optimization&gt;off ] ;</pre>
+<p>
+           Will cause "helpers.cpp" to be always compiled without
+           optimization. When referring to an inline main target, its declared
+           name must be prefixed by its parent target's name and two dots. In
+           the example above, to build only helpers, one should run
+           <code class="computeroutput">bjam hello..helpers</code>.
+         </p>
+<p>When no target is requested on the command line, all targets in the
+         current project will be built. If a target should be built only by
+         explicit request, this can be expressed by the
+         <code class="computeroutput">explicit</code> rule:
+         </p>
+<pre class="programlisting">
+         explicit install_programs ;</pre>
+<p>
+         </p>
+</div>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="invocation.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="projects.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/advanced.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/advanced.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/advanced.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,166 +3,295 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Chapter 4. User documentation</title>
 <link rel="stylesheet" href="../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="previous" href="tutorial/prebuilt.html" title="Prebuilt targets">
-<link rel="next" href="advanced/jamfiles.html" title="Writing Jamfiles">
+<link rel="prev" href="tutorial/prebuilt.html" title="Prebuilt targets">
+<link rel="next" href="advanced/configuration.html" title="Configuration">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="tutorial/prebuilt.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="advanced/jamfiles.html"><img src="../images/next.png" alt="Next"></a>
+<a accesskey="p" href="tutorial/prebuilt.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="advanced/configuration.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 <div class="chapter" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title">
-<a name="bbv2.advanced"></a>Chapter 4. User documentation</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title">
+<a name="bbv2.advanced"></a>Chapter 4. User documentation</h2></div></div></div>
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl>
-<dt><a href="advanced.html#bbv2.advanced.configuration">Configuration</a></dt>
-<dt><a href="advanced/jamfiles.html">Writing Jamfiles</a></dt>
-<dt><a href="advanced/build_process.html">Build process</a></dt>
-<dt><a href="advanced/builtins/targets.html">Builtin target types</a></dt>
-<dt><a href="advanced/builtins/features.html">Builtin features</a></dt>
-<dt><a href="advanced/differences_to_v1.html">Differences to Boost.Build V1</a></dt>
+<dt><span class="section"><a href="advanced.html#bbv2.advanced.jam_language">Boost.Jam language</a></span></dt>
+<dt><span class="section"><a href="advanced/configuration.html">Configuration</a></span></dt>
+<dt><span class="section"><a href="advanced/invocation.html">Invocation</a></span></dt>
+<dt><span class="section"><a href="advanced/targets.html">Declaring targets</a></span></dt>
+<dt><span class="section"><a href="advanced/projects.html">Projects</a></span></dt>
+<dt><span class="section"><a href="advanced/other-rules.html">Jamfile Utility Rules</a></span></dt>
+<dt><span class="section"><a href="advanced/build_process.html">The Build Process</a></span></dt>
+<dt><span class="section"><a href="advanced/builtins/targets.html">Builtin target types</a></span></dt>
+<dt><span class="section"><a href="advanced/builtins/features.html">Builtin features</a></span></dt>
+<dt><span class="section"><a href="advanced/differences_to_v1.html">Differences to Boost.Build V1</a></span></dt>
 </dl>
 </div>
 <p>This section will provide the information necessary to create your own
   projects using Boost.Build. The information provided here is relatively
-  high-level, and <a href="reference.html" title="Chapter 6. Detailed reference">detailed reference</a> as
+  high-level, and <a href="reference.html" title="Chapter 6. Detailed reference">Chapter 6, <i>Detailed reference</i></a> as
   well as the on-line help system must be used to obtain
-  low-level documentation (see the <a href="reference.html#bbv2.reference.init.options.help">help option</a>).</p>
-<p>The Boost.Build actually consists of two parts - Boost.Jam, which is a
+  low-level documentation (see <a href="advanced/invocation.html#bbv2.reference.init.options.help"><code class="option">--help</code></a>).</p>
+<p>Boost.Build actually consists of two parts - Boost.Jam, a
   build engine with its own interpreted language, and Boost.Build itself,
-  implemented in Boost.Jam's language. The chain of event which happen when
-  you type "bjam" on the command is:
+  implemented in Boost.Jam's language. The chain of events when
+  you type <span><strong class="command">bjam</strong></span> on the command line is:
       </p>
 <div class="orderedlist"><ol type="1">
 <li><p>Boost.Jam tries to find Boost.Build and loads the top-level
-          module. The exact process is described in the <a href="reference.html#bbv2.reference.init" title="Initialization">section on
-          initialization</a></p></li>
-<li><p>Boost.Build top-level module loads user-defined configuration
-          files, "user-config.jam" and "site-config.jam", which define
+          module. The exact process is described in <a href="reference.html#bbv2.reference.init" title="Initialization">the section called &#8220;Initialization&#8221;</a></p></li>
+<li><p>The top-level module loads user-defined configuration
+          files, <code class="filename">user-config.jam</code> and <code class="filename">site-config.jam</code>, which define
           available toolsets.</p></li>
 <li><p>The Jamfile in the current directory is read. That in turn
           might cause reading of further Jamfiles. As a result, a tree of
           projects is created, with targets inside projects.</p></li>
-<li><p>Finally, using build request specified on the command line,
+<li><p>Finally, using the build request specified on the command line,
           Boost.Build decides which targets should be built, and how. That
           information is passed back to Boost.Jam, which takes care of
           actually running commands.</p></li>
 </ol></div>
-<p>So, to be able to successfully use Boost.Build, you'd need to know only
-      three things:
+<p>
+    </p>
+<p>So, to be able to successfully use Boost.Build, you need to know only
+      four things:
       </p>
 <div class="itemizedlist"><ul type="disc">
-<li><p><a href="advanced.html#bbv2.advanced.configuration" title="Configuration">
+<li><p><a href="advanced/configuration.html" title="Configuration">
               How to configure Boost.Build</a></p></li>
-<li><p><a href="advanced/jamfiles.html" title="Writing Jamfiles">
+<li><p><a href="../">
               How to write Jamfiles</a></p></li>
-<li><p><a href="advanced/build_process.html" title="Build process">
+<li><p><a href="advanced/build_process.html" title="The Build Process">
               How the build process works</a></p></li>
+<li><p>Some Basics about the Boost.Jam language. See also the
+          <a href="http://www.boost.org/tools/jam/index.html" target="_top">Boost.Jam</a>
+          documentation.
+          
+          </p></li>
 </ul></div>
+<p>
+    </p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.advanced.configuration"></a>Configuration</h2></div></div>
-<div></div>
-</div>
-<p>The Boost.Build configuration is specified in the file
-    "user-config.jam". You can edit the one which comes with Boost.Build, or
-    create a copy in your home directory and edit that. (See the <a href="reference.html#bbv2.reference.init.config" title="Table 6.1. Search paths for configuration files">reference</a> for the exact search
-    paths.) The primary function of that file is to declarate which compilers
-    and other tools are available. The simplest syntax to configure a tool is:
-</p>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.advanced.jam_language"></a>Boost.Jam language</h2></div></div></div>
+<p>This section will describe the basics of the Boost.Jam
+      language&#8212;just enough for writing Jamfiles. For more information,
+      please see the <a href="http://www.boost.org/tools/jam/index.html" target="_top">Boost.Jam</a>
+      documentation.</p>
+<p>Boost.Jam has an interpreted, procedural language. 
+      On the lowest level, a Boost.Jam program consists of variables and 
+      <a class="indexterm" name="id2571563"></a>
+      <em class="firstterm">rules</em> (the Jam term for function). They are grouped
+      in modules&#8212;there's one global module and a number of named
+      modules. Besides that, a Boost.Jam program contains classes and class
+      instances.      
+      </p>
+<p>Syntantically, a Boost.Jam program consists of two kind of
+      elements&#8212;keywords (which have a special meaning to Boost.Jam) and
+      literals.
+
+      Consider this code:
+      </p>
 <pre class="programlisting">
-using &lt;tool-name&gt; ;        
-</pre>
+a = b ;</pre>
 <p>
-      The "using" rule is given a name of tool, and will make that tool
-      available to Boost.Build. For example, "using gcc ;" will make available
-      the gcc compiler.      
-    </p>
+      which assigns the value <code class="literal">b</code> to the variable
+      <code class="literal">a</code>. Here, <code class="literal">=</code> and
+      <code class="literal">;</code> are keywords, while <code class="literal">a</code> and
+      <code class="literal">b</code> are literals.
+      </p>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>All syntax elements, even keywords, must be separated by
+        spaces. For example, omitting the space character before
+        <code class="literal">;</code> will lead to a syntax error.
+        </p></td></tr>
+</table></div>
 <p>
-      Since nothing but tool name is specified, Boost.Build will pick some
-      default settings -- for example will use gcc found in path, or look in
-      some known installation locations. For ordinary users, this is quite
-      fine. In case you have several version of a compiler, or it's located in
-      some unusual location, or you need to tweak the configuration, you'd
-      need to pass additional parameters to the "using" rule. Generally, 
-      for every tool module, the parameters differ, and you can obtain the documentaiton
-      by running
-</p>
+      If you want to use a literal value that is the same as some keyword, the
+      value can be quoted:
+      </p>
 <pre class="programlisting">
-bjam --help &lt;tool-name&gt;.init         
-</pre>
+a = "=" ;</pre>
 <p>
-      on the command line. However, for all compilers the meaning of the first
-      three parameters is the same: version, invocation command and options.
-    </p>
-<p>The "version" parameter identifies the compiler, in case you have
-    several. It can have any form you like, but it's recommended that you use
-    a numeric identifier, like "7.1". The "invocation command"
-    parameter is the command which must be executed to run the compiler. This
-    might be just compiler name, or a name with a path in it. Here are some
-    examples. 
-    </p>
-<p>To configure a compiler installed in non-standard location and not
-    present in path, you can do the following:
-</p>
+      </p>
+<p>All variables in Boost.Jam have the same type&#8212;list of
+      strings. To define a variable one assigns a value to it, like in the
+      previous example. An undefined variable is the same as a variable with
+      an empty value. Variables can be accessed with the
+      <code class="computeroutput">$(<em class="replaceable"><code>variable</code></em>)</code> syntax. For example:
+      </p>
 <pre class="programlisting">
-using msvc : : Z:/Programs/Microsoft Visual Studio/vc98/bin/cl.exe ;
-</pre>
-<p>To configure several versions of a compiler, the following can be used.
-</p>
+a = $(b) $(c) ;</pre>
+<p>
+      </p>
+<p>
+        Rules are defined by specifying the rule name, the parameter names,
+        and the allowed size of the list value for each parameter. 
+        </p>
 <pre class="programlisting">
-using gcc : 3.3 ;
-using gcc : 3.4 : g++-3.4 ;
-using gcc : 3.2 : g++-3.2 ;
-</pre>
+rule <em class="replaceable"><code>example</code></em> 
+     (
+         <em class="replaceable"><code>parameter1</code></em> : 
+         <em class="replaceable"><code>parameter2 ?</code></em> : 
+         <em class="replaceable"><code>parameter3 +</code></em> :
+         <em class="replaceable"><code>parameter4 *</code></em> 
+     )
+     {
+        // body
+     }</pre>
 <p>
-        Note that in the first call to "using", the compiler found in path
-      will be used, and there's no need to explicitly specify the command.
-    </p>
-<p>As shown above, both "version" and "invocation command" parameters
-      are optional, but there's an important restriction: if you configure the
-      same compiler more then once, you must pass the "version" parameter
-      every time. For example, the following is not allowed:
+        When this rule is called, the list passed as the first argument must
+        have exactly one value. The list passed as the second argument can
+        either have one value of be empty. The two remaining arguments can
+        be arbitrary long, but the third argument may not be empty.
+      </p>
+<p>The overview of Boost.Jam language statements is given below:
+      </p>
+<pre class="programlisting">
+helper 1 : 2 : 3 ; 
+x = [ helper 1 : 2 : 3 ] ;</pre>
+<p>
+      This code calls the named rule with the specified arguments. When the
+      result of the call must be used inside some expression, you need to add
+      brackets around the call, like shown on the second line.
+      </p>
+<pre class="programlisting">
+if cond { statements } [ else { statements } ]</pre>
+<p>
+      This is a regular if-statement. The condition is composed of:
+      </p>
+<div class="itemizedlist"><ul type="disc">
+<li><p>Literals (true if at least one string is not empty)</p></li>
+<li><p>Comparisons: <code class="computeroutput">a
+        <em class="replaceable"><code>operator</code></em> b</code> where
+        <em class="replaceable"><code>operator</code></em> is one of <code class="computeroutput">=</code>,
+        <code class="computeroutput">!=</code>, <code class="computeroutput">&lt;</code>, <code class="computeroutput">&gt;</code>,
+        <code class="computeroutput">&lt;=</code>, <code class="computeroutput">&gt;=</code>. The comparison is done
+        pairwise between each string in the left and the right arguments.
+        </p></li>
+<li><p>Logical operations: <code class="computeroutput">! a</code>, <code class="computeroutput">a &amp;&amp;
+        b</code>, <code class="computeroutput">a || b</code></p></li>
+<li><p>Grouping: <code class="computeroutput">( cond )</code></p></li>
+</ul></div>
+<p>
+      </p>
+<pre class="programlisting">
+for var in list { statements }</pre>
+<p>
+      Executes statements for each element in list, setting the variable
+      <code class="varname">var</code> to the element value.
+      </p>
+<pre class="programlisting">
+while cond { statements }</pre>
+<p>
+      Repeatedly execute statements while cond remains true upon entry. 
+      </p>
+<pre class="programlisting">
+return values ;
+      </pre>
+<p>This statement should be used only inside a
+      rule and assigns <code class="computeroutput">values</code> to the return value of the
+      rule.
+      </p>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top">
+<p>
+        The <code class="computeroutput">return</code> statement does not exit the rule. For example:
+        </p>
+<pre class="programlisting">
+rule test ( )
+{
+   if 1 = 1 {
+      return "reasonable" ;
+   }
+   return "strange" ;
+}</pre>
+<p> will return <code class="literal">strange</code>, not
+<code class="literal">reasonable</code>.
+      </p>
+</td></tr>
+</table></div>
+<p>
+
+        </p>
+<pre class="programlisting">
+import <em class="replaceable"><code>module</code></em> ;
+import <em class="replaceable"><code>module</code></em> : <em class="replaceable"><code>rule</code></em> ;</pre>
+<p>
+      The first form imports the specified bjam module. All rules from
+      that module are made available using the qualified name:
+      <code class="computeroutput"><em class="replaceable"><code>module</code></em>.<em class="replaceable"><code>rule</code></em></code>.
+      The second form imports the specified rules only, and they can be called
+      using unqualified names.
+      </p>
+<p><a name="bbv2.advanced.jam_language.actions"></a>
+        Sometimes, you'd need to specify the actual command lines to be used
+        when creating targets. In jam language, you use named actions to do this.
+        For example:
 </p>
 <pre class="programlisting">
-using gcc ;
-using gcc : 3.4 : g++-3.4 ;
+actions create-file-from-another
+{
+    create-file-from-another $(&lt;) $(&gt;)
+}
 </pre>
 <p>
-      because the first "using" does not specify the version. 
-    </p>
-<p>The <tt class="computeroutput">options</tt> parameter is used to fine-tune the
-      configuration. All compilers allow to pass four option, intentionally
-      similiar in spelling to builtin features: <tt class="computeroutput">cflags</tt>,
-      <tt class="computeroutput">cxxflags</tt>, <tt class="computeroutput">compileflags</tt> and
-      <tt class="computeroutput">linkflags</tt>. They specify additional options which will be
-      always passed to the corresponding tools. The <tt class="computeroutput">cflags</tt> option
-      applies only to the C compiler, the <tt class="computeroutput">cxxflags</tt> option applies
-      only to the C++ compiler and the <tt class="computeroutput">compileflags</tt> options
-      applies to both. For example, to use 64 bit mode with gcc you can use:
+        This specifies a named action called 
+        <code class="literal">create-file-from-another</code>. The text inside braces is the
+        command to invoke. The <code class="literal">$(&lt;)</code> variable will be expanded to list of
+        generated files, and the <code class="literal">$(&gt;)</code> variable will be expanded
+        to the list of source files.
+      </p>
+<p>To flexibly adjust command line, you can define a rule with the
+      same name as the action, and taking three parameters -- targets, sources 
+      and properties. For example:
 </p>
 <pre class="programlisting">
-using gcc : 3.4 : : &lt;compileflags&gt;-m64 &lt;linkflags&gt;-m64 ;
+rule create-file-from-another ( targets * : sources * : properties * )
+{
+   if &lt;variant&gt;debug in $(properties)
+   {
+       OPTIONS on $(targets) = --debug ;
+   }
+}
+actions create-file-from-another
+{
+    create-file-from-another $(OPTIONS) $(&lt;) $(&gt;)
+}
 </pre>
+<p>
+      In this example, the rule checks if certain build property is specified.
+      If so, it sets variable <code class="varname">OPIONS</code> that's used inside
+      action. Note that the variable is set "on targets" -- the value will
+      be only visible inside action, not globally. Were it set globally,
+      using variable named <code class="varname">OPTIONS</code> in two unrelated
+      actions would be impossible.
+      </p>
+<p>More details can be found in Jam reference, <a href="../jam/language.html#jam.language.rules" title=" Rules">the section called &#8220; Rules&#8221;</a>
+      </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="tutorial/prebuilt.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="advanced/jamfiles.html"><img src="../images/next.png" alt="Next"></a>
+<a accesskey="p" href="tutorial/prebuilt.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="advanced/configuration.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/arch/build.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/arch/build.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/arch/build.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,108 +3,176 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>The build layer</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../arch.html" title="Appendix A. Boost.Build v2 architecture">
-<link rel="previous" href="../arch.html" title="Appendix A. Boost.Build v2 architecture">
+<link rel="prev" href="../arch.html" title="Appendix A. Boost.Build v2 architecture">
 <link rel="next" href="tools.html" title="The tools layer">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="../arch.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../arch.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="tools.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.arch.build"></a>The build layer</h2></div></div>
-<div></div>
-</div>
-<p>The build layer has just four main parts -- abstract targets,
-      virtual targets, generators and properties. The abstract targets,
-      represented by the "abstract-target" class, correspond to main targets
-      -- which, as you recall, can produce different files depending on
-      properties. Virtual targets, represented by the 'virtual-target' class
-      correspond to real files. The abstract-target class has a method
-      'generate', which is given a set of properties and produces virtual
-      targets for those properties.       
-    </p>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.arch.build"></a>The build layer</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="build.html#bbv2.arch.metatargets">Metatargets</a></span></dt>
+<dt><span class="section"><a href="build.html#bbv2.arch.virtual">Virtual targets</a></span></dt>
+<dt><span class="section"><a href="build.html#bbv2.arch.properties"></a></span></dt>
+</dl></div>
+<p>The build layer has just four main parts -- metatargets (abstract targets),
+        virtual targets, generators and properties. 
+        </p>
+<div class="itemizedlist"><ul type="disc">
+<li><p>Metatargets (see the "targets.jam" module) represent
+              all the user-defined entities which can be built. The "meta" prefix
+              signify that they don't really corrspond to files -- depending of
+              build request, they can produce different set of
+              files. Metatargets are created when Jamfiles are loaded. Each
+              metagarget has a <code class="computeroutput">generate</code> method which is given a
+              property set and produces virtual targets for the passed properties.
+            </p></li>
+<li><p>Virtual targets (see the "virtual-targets.jam"
+              module) correspond to the atomic things which can be updated --
+              most typically files. 
+            </p></li>
+<li><p>Properties are just (name, value) pairs, specified
+              by the user and describing how the targets should be
+              built. Properties are stored using the <code class="computeroutput">property-set</code> class.
+              </p></li>
+<li><p>Generators are the objects which encapsulate tools
+              -- they can take a list of source virtual targets and produce new
+              virtual targets from them.
+            </p></li>
+</ul></div>
+<p>
+      </p>
+<p>The build process includes those steps:
+        </p>
+<div class="orderedlist"><ol type="1">
+<li><p>Top-level code calls the <code class="computeroutput">generate</code>
+              method of a metatarget with some properties.  </p></li>
+<li><p>The metatarget combines the requested properties
+              with requirements and passes the result, together with the list
+              of sources, to the <code class="computeroutput">generators.construct</code>
+              function</p></li>
+<li><p>A generator appropriate for the build properties is
+              selected and its <code class="computeroutput">run</code> method is
+              called. The method returns a list of virtual targets
+            </p></li>
+<li><p>The targets are returned to the top level code. They
+              are converted into bjam targets (via
+              <code class="computeroutput">virtual-target.actualize</code>) and passed to bjam for building.
+            </p></li>
+</ol></div>
+<p>
+      </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.arch.metatargets"></a>Metatargets</h3></div></div></div>
 <p>There are several classes derived from "abstract-target". The
-      "main-target" class represents top-level main target, the "project-target"
-      acts like container for all main targets, and "basic-target" class is a
-      base class for all further target types.
-    </p>
+          "main-target" class represents top-level main target, the "project-target"
+          acts like container for all main targets, and "basic-target" class is a
+          base class for all further target types.
+        </p>
 <p>Since each main target can have several alternatives, all top-level
-      target objects are just containers, referring to "real" main target
-      classes. The type is that container is "main-target". For example, given:
+          target objects are just containers, referring to "real" main target
+          classes. The type is that container is "main-target". For example, given:
 </p>
 <pre class="programlisting">
 alias a ;
 lib a : a.cpp : &lt;toolset&gt;gcc ;
 </pre>
 <p>
-      we would have one-top level instance of "main-target-class", which will
-      contain one instance of "alias-target-class" and one instance of
-      "lib-target-class". The "generate" method of "main-target" decides
-      which of the alternative should be used, and call "generate" on the
-      corresponding instance.
-</p>
+          we would have one-top level instance of "main-target-class", which will
+          contain one instance of "alias-target-class" and one instance of
+          "lib-target-class". The "generate" method of "main-target" decides
+          which of the alternative should be used, and call "generate" on the
+          corresponding instance.
+        </p>
 <p>Each alternative is a instance of a class derived from
-    "basic-target". The "basic-target.generate" does several things that are
-    always should be done:
-      </p>
+          "basic-target". The "basic-target.generate" does several things that are
+          always should be done:
+          </p>
 <div class="itemizedlist"><ul type="disc">
 <li><p>Determines what properties should be used for building the
-          target. This includes looking at requested properties, requirements,
-          and usage requirements of all sources.</p></li>
+                target. This includes looking at requested properties, requirements,
+                and usage requirements of all sources.</p></li>
 <li><p>Builds all sources</p></li>
 <li><p>Computes the usage requirements which should be passes back.</p></li>
 </ul></div>
 <p>
-      For the real work of constructing virtual target, a new method
-      "construct" is called.
-    </p>
+          For the real work of constructing virtual target, a new method
+          "construct" is called.
+        </p>
 <p>The "construct" method can be implemented in any way by classes
-      derived from "basic-target", but one specific derived class plays the
-      central role -- "typed-target". That class holds the desired type of file
-      to be produces, and calls the generators modules to do the job.
-    </p>
-<p>Generators are Boost.Build abstractions for a tool. For example, one
-      can register a generator which converts target of type CPP into target of
-      type OBJ. When run with on a virtual target with CPP type, the generator
-      will construct the virtual target of type OBJ. The "generators" module
-      implements an algorithm, which given a list of sources, the desired type
-      and a list of properties, find all the generators which can perform the conversion.
-    </p>
-<p>The virtual targets which are produces by the main targets form a
-      graph. Targets which are produces from other ones refer to an instance of
-      "action" class, which in turn refers to action's sources, which can
-      further refer to actions. The sources, which are not produces from
-      anything, don't refer to any actions.
-    </p>
-<p>When all virtual targets are produced, they are "actualized". This
-    means that the real file names are computed, and the commands that should
-    be run are generated. This is done by "virtual-target.actualize" and
-    "action.actualize" methods. The first is conceptually simple, while the
-    second need additional explanation. The commands in bjam are generated in
-    two-stage process. First, a rule with the appropriate name (for example
-    "gcc.compile") is called and is given the names of targets. The rule sets
-    some variables, like "OPTIONS". After that, the command string is taken,
-    and variable are substitutes, so use of OPTIONS inside the command string
-    become the real compile options. 
-    </p>
+          derived from "basic-target", but one specific derived class plays the
+          central role -- "typed-target". That class holds the desired type of file
+          to be produces, and calls the generators modules to do the job.
+        </p>
+<p>This means that a specific metatarget subclass may avoid using
+          generators at all. However, this is deprecated and we're trying to
+          eliminate all such subsclasses at the moment.
+        </p>
+<p>Note that the <code class="filename">build/targets.jam</code> file contains
+            an UML diagram which might help.</p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.arch.virtual"></a>Virtual targets</h3></div></div></div>
+<p>Virtual targets correspond to the atomic things which can be
+          updated. Each virtual target can be assigned an updating action --
+          instance of the <code class="computeroutput">action</code> class. The action class, in
+          turn, contains a list of source targets, properties, and a name of
+          bjam action block which should be executed.
+        </p>
+<p>We try hard to never create equal instances of the
+          <code class="computeroutput">virtual-target</code> class. Each code which creates virtual
+          targets passes them though the <code class="computeroutput">virtual-target.register</code>
+          function, which detects if a target with the same name, sources, and
+          properties was created. In that case, existing target is returned.
+        </p>
+<p>When all virtual targets are produced, they are
+          "actualized". This means that the real file names are computed, and
+          the commands that should be run are generated. This is done by the
+          <code class="computeroutput">virtual-target.actualize</code> method and the
+          <code class="computeroutput">action.actualize</code> methods. The first is conceptually
+          simple, while the second need additional explanation. The commands
+          in bjam are generated in two-stage process. First, a rule with the
+          appropriate name (for example
+          "gcc.compile") is called and is given the names of targets. The rule
+          sets some variables, like "OPTIONS". After that, the command string
+          is taken, and variable are substitutes, so use of OPTIONS inside the
+          command string become the real compile options.
+        </p>
 <p>Boost.Build added a third stage to simplify things. It's now
-    possible to automatically convert properties to appropriate assignments to
-    variables. For example, &lt;debug-symbols&gt;on would add "-g" to the
-    OPTIONS variable, without requiring to manually add this logic to
-    gcc.compile. This functionality is part of the "toolset" module.
-    </p>
-<p>When target paths are computed and the commands are set, Boost.Build
-    just gives control to bjam, which controls the execution of
-    commands.</p>
+          possible to automatically convert properties to appropriate assignments to
+          variables. For example, &lt;debug-symbols&gt;on would add "-g" to the
+          OPTIONS variable, without requiring to manually add this logic to
+          gcc.compile. This functionality is part of the "toolset" module.
+        </p>
+<p>Note that the <code class="filename">build/virtual-targets.jam</code> file
+            contains an UML diagram which might help.</p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<div class="section" lang="en">
+<div class="titlepage"></div>
+<p>Above, we noted that metatargets are built with a set of
+          properties. That set is represented with the
+          <code class="computeroutput">property-set</code> class. An important point is that handling
+          of property sets can get very expensive. For that reason, we make
+          sure that for each set of (name, value) pairs only one
+          <code class="computeroutput">property-set</code> instance is created. The
+          <code class="computeroutput">property-set</code> uses extensive caching for all operation,
+          so most work is avoided. The <code class="computeroutput">property-set.create</code> is the 
+          factory function which should be used to create instances of the
+          <code class="computeroutput">property-set</code> class.
+        </p>
+</div>
+</div>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/arch/targets.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/arch/targets.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/arch/targets.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,24 +3,22 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Targets</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../arch.html" title="Appendix A. Boost.Build v2 architecture">
-<link rel="previous" href="tools.html" title="The tools layer">
+<link rel="prev" href="tools.html" title="The tools layer">
+<link rel="next" href="../jam.html" title="Appendix B. Boost.Jam documentation">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="tools.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../arch.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a>
+<a accesskey="p" href="tools.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../arch.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../jam.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.arch.targets"></a>Targets</h2></div></div>
-<div></div>
-</div>
-<div class="toc"><dl><dt><a href="targets.html#bbv2.arch.depends">Dependency scanning</a></dt></dl></div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.arch.targets"></a>Targets</h2></div></div></div>
+<div class="toc"><dl><dt><span class="section"><a href="targets.html#bbv2.arch.depends">Dependency scanning</a></span></dt></dl></div>
 <p>NOTE: THIS SECTION IS NOT EXPECTED TO BE READ!
         There are two user-visible kinds of targets in Boost.Build.
   First are "abstract" &#8212; they correspond to things declared
@@ -37,24 +35,21 @@
   file type for sources, and also rules for transforming between
   file targets of different types. That information is used in
   constructing dependency graph, as desribed in the "next section".
-  [ link? ] <span class="bold"><b>Note:</b></span>File targets are not
+  [ link? ] <span class="bold"><strong>Note:</strong></span>File targets are not
   the same as targets in Jam sense; the latter are created from
-  file targets at the latest possible moment. <span class="bold"><b>Note:</b></span>"File
+  file targets at the latest possible moment. <span class="bold"><strong>Note:</strong></span>"File
   target" is a proposed name for what we call virtual targets. It
   it more understandable by users, but has one problem: virtual
   targets can potentially be "phony", and not correspond to any
   file.</p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.arch.depends"></a>Dependency scanning</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.arch.depends"></a>Dependency scanning</h3></div></div></div>
 <div class="toc"><dl>
-<dt><a href="targets.html#id2541586">Support for different scanning algorithms</a></dt>
-<dt><a href="targets.html#id2541595">Ability to scan the same file several times</a></dt>
-<dt><a href="targets.html#id2541654">Proper detection of dependencies on generated files.</a></dt>
-<dt><a href="targets.html#id2541833">Proper detection of dependencies from generated files</a></dt>
+<dt><span class="section"><a href="targets.html#id2581175">Support for different scanning algorithms</a></span></dt>
+<dt><span class="section"><a href="targets.html#id2581188">Ability to scan the same file several times</a></span></dt>
+<dt><span class="section"><a href="targets.html#id2581258">Proper detection of dependencies on generated files.</a></span></dt>
+<dt><span class="section"><a href="targets.html#id2581482">Proper detection of dependencies from generated files</a></span></dt>
 </dl></div>
 <p>Dependency scanning is the process of finding implicit
   dependencies, like "#include" statements in C++. The requirements
@@ -78,28 +73,22 @@
       </li>
 </ul></div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h4 class="title">
-<a name="id2541586"></a>Support for different scanning algorithms</h4></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2581175"></a>Support for different scanning algorithms</h4></div></div></div>
 <p>Different scanning algorithm are encapsulated by objects
   called "scanners". Please see the documentation for "scanner"
   module for more details.</p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h4 class="title">
-<a name="id2541595"></a>Ability to scan the same file several times</h4></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2581188"></a>Ability to scan the same file several times</h4></div></div></div>
 <p>As said above, it's possible to compile a C++ file twice, with
   different include paths. Therefore, include dependencies for
   those compilations can be different. The problem is that bjam
   does not allow several scans of the same target.</p>
 <p>The solution in Boost.Build is straigtforward. When a virtual
   target is converted to bjam target (via
-  <tt class="literal">virtual-target.actualize</tt> method), we specify the scanner
+  <code class="literal">virtual-target.actualize</code> method), we specify the scanner
   object to be used. The actualize method will create different
   bjam targets for different scanners.</p>
 <p>All targets with specific scanner are made dependent on target
@@ -122,11 +111,8 @@
 </pre>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h4 class="title">
-<a name="id2541654"></a>Proper detection of dependencies on generated files.</h4></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2581258"></a>Proper detection of dependencies on generated files.</h4></div></div></div>
 <p>This requirement breaks down to the following ones.</p>
 <div class="orderedlist"><ol type="1">
 <li>
@@ -210,6 +196,8 @@
 b.cpp -----&gt; &lt;scanner2&gt;header.h [ search path: d1, d2, d4]
 </pre>
 <p>
+        </p>
+<p>
 The first alternative was used for some time. The problem
 however is: what include paths should be used when scanning
 header.h? The second alternative was suggested by Matt Armstrong.
@@ -248,14 +236,11 @@
   be implemented anew.</p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h4 class="title">
-<a name="id2541833"></a>Proper detection of dependencies from generated files</h4></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2581482"></a>Proper detection of dependencies from generated files</h4></div></div></div>
 <div class="toc"><dl>
-<dt><a href="targets.html#id2541934">File targets</a></dt>
-<dt><a href="targets.html#id2541969">Target paths</a></dt>
+<dt><span class="section"><a href="targets.html#id2581610">File targets</a></span></dt>
+<dt><span class="section"><a href="targets.html#id2581655">Target paths</a></span></dt>
 </dl></div>
 <p>Suppose file "a.cpp" includes "a.h" and both are generated by
   some action. Note that classic jam has two stages. In first stage
@@ -318,19 +303,19 @@
 <p>Tbe above consideration lead to decision that we'll rescan a
   target whenever it's updated, no matter if this target is
   internal or not.</p>
-<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
-<h3 class="title">Warning</h3>
-<p>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>
     The remainder of this document is not indended to be read at
     all. This will be rearranged in future.
-    </p>
-</div>
+    </p></td></tr>
+</table></div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h5 class="title">
-<a name="id2541934"></a>File targets</h5></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h5 class="title">
+<a name="id2581610"></a>File targets</h5></div></div></div>
 <p>
   As described above, file targets corresponds
   to files that Boost.Build manages. User's may be concerned about
@@ -339,27 +324,21 @@
   determining where file target will be placed. File targets can
   also be connected with actions, that determine how the target is
   created. Both file targets and actions are implemented in the
-  <tt class="literal">virtual-target</tt> module.
+  <code class="literal">virtual-target</code> module.
           </p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h6 class="title">
-<a name="id2541953"></a>Types</h6></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h6 class="title">
+<a name="id2581633"></a>Types</h6></div></div></div>
 <p>A file target can be given a file, which determines
   what transformations can be applied to the file. The
-  <tt class="literal">type.register</tt> rule declares new types. File type can
+  <code class="literal">type.register</code> rule declares new types. File type can
   also be assigned a scanner, which is used to find implicit
   dependencies. See "dependency scanning" [ link? ] below.</p>
 </div>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h5 class="title">
-<a name="id2541969"></a>Target paths</h5></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h5 class="title">
+<a name="id2581655"></a>Target paths</h5></div></div></div>
 <p>To distinguish targets build with different properties, they
   are put in different directories. Rules for determining target
   paths are given below:</p>
@@ -371,16 +350,16 @@
 <li>
         Each non free, non incidental property cause an additional
     element to be added to the target path. That element has the
-    form <tt class="literal">&lt;feature-name&gt;-&lt;feature-value&gt;</tt> for
-    ordinary features and <tt class="literal">&lt;feature-value&gt;</tt> for
+    form <code class="literal">&lt;feature-name&gt;-&lt;feature-value&gt;</code> for
+    ordinary features and <code class="literal">&lt;feature-value&gt;</code> for
     implicit ones. [Note about composite features].
       </li>
 <li>
         If the set of free, non incidental properties is different
     from the set of free, non incidental properties for the project
     in which the main target that uses the target is defined, a
-    part of the form <tt class="literal">main_target-&lt;name&gt;</tt> is added to
-    the target path. <span class="bold"><b>Note:</b></span>It would be nice to completely
+    part of the form <code class="literal">main_target-&lt;name&gt;</code> is added to
+    the target path. <span class="bold"><strong>Note:</strong></span>It would be nice to completely
     track free features also, but this appears to be complex and
     not extremely needed.
       </li>
@@ -394,13 +373,13 @@
 </div>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="tools.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../arch.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a>
+<a accesskey="p" href="tools.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../arch.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../jam.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/arch/tools.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/arch/tools.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/arch/tools.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,27 +3,24 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>The tools layer</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../arch.html" title="Appendix A. Boost.Build v2 architecture">
-<link rel="previous" href="build.html" title="The build layer">
+<link rel="prev" href="build.html" title="The build layer">
 <link rel="next" href="targets.html" title="Targets">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="build.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../arch.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="targets.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.arch.tools"></a>The tools layer</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.arch.tools"></a>The tools layer</h2></div></div></div>
 <p>Write me!</p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/arch.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/arch.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/arch.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,41 +3,35 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Appendix A. Boost.Build v2 architecture</title>
 <link rel="stylesheet" href="../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="previous" href="recipies/site-config.html" title="Targets in site-config.jam">
+<link rel="prev" href="faq/header-only-libraries.html" title="Header-only libraries">
 <link rel="next" href="arch/build.html" title="The build layer">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="recipies/site-config.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="arch/build.html"><img src="../images/next.png" alt="Next"></a>
+<a accesskey="p" href="faq/header-only-libraries.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="arch/build.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 <div class="appendix" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title">
-<a name="bbv2.arch"></a>Appendix A. Boost.Build v2 architecture</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title">
+<a name="bbv2.arch"></a>Appendix A. Boost.Build v2 architecture</h2></div></div></div>
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl>
-<dt><a href="arch.html#bbv2.arch.overview">Overview</a></dt>
-<dt><a href="arch/build.html">The build layer</a></dt>
-<dt><a href="arch/tools.html">The tools layer</a></dt>
-<dt><a href="arch/targets.html">Targets</a></dt>
+<dt><span class="section"><a href="arch.html#bbv2.arch.overview">Overview</a></span></dt>
+<dt><span class="section"><a href="arch/build.html">The build layer</a></span></dt>
+<dt><span class="section"><a href="arch/tools.html">The tools layer</a></span></dt>
+<dt><span class="section"><a href="arch/targets.html">Targets</a></span></dt>
 </dl>
 </div>
 <div class="sidebar"><p>This document is work-in progress. Don't expect much from it
       yet.</p></div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.arch.overview"></a>Overview</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.arch.overview"></a>Overview</h2></div></div></div>
 <p>The Boost.Build code is structured in four different components:
     "kernel", "util", "build" and "tools". The first two are relatively
     uninteresting, so we'll focus on the remaining pair. The "build" component
@@ -49,13 +43,13 @@
     </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="recipies/site-config.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="arch/build.html"><img src="../images/next.png" alt="Next"></a>
+<a accesskey="p" href="faq/header-only-libraries.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="arch/build.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/extender.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/extender.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/extender.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,52 +3,46 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Chapter 5. Extender Manual</title>
 <link rel="stylesheet" href="../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="previous" href="advanced/differences_to_v1.html" title="Differences to Boost.Build V1">
+<link rel="prev" href="advanced/differences_to_v1.html" title="Differences to Boost.Build V1">
 <link rel="next" href="extending/targets.html" title="Target types">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="advanced/differences_to_v1.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="extending/targets.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 <div class="chapter" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title">
-<a name="bbv2.extender"></a>Chapter 5. Extender Manual</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title">
+<a name="bbv2.extender"></a>Chapter 5. Extender Manual</h2></div></div></div>
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl>
-<dt><a href="extender.html#bbv2.extender.intro">Introduction</a></dt>
-<dt><a href="extending/targets.html">Target types</a></dt>
-<dt><a href="extending/tools.html">Tools and generators</a></dt>
-<dt><a href="extending/features.html">Features</a></dt>
-<dt><a href="extending/rules.html">Main target rules</a></dt>
-<dt><a href="extending/toolset_modules.html">Toolset modules</a></dt>
+<dt><span class="section"><a href="extender.html#bbv2.extender.intro">Introduction</a></span></dt>
+<dt><span class="section"><a href="extending/targets.html">Target types</a></span></dt>
+<dt><span class="section"><a href="extending/tools.html">Tools and generators</a></span></dt>
+<dt><span class="section"><a href="extending/features.html">Features</a></span></dt>
+<dt><span class="section"><a href="extending/rules.html">Main target rules</a></span></dt>
+<dt><span class="section"><a href="extending/toolset_modules.html">Toolset modules</a></span></dt>
 </dl>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.extender.intro"></a>Introduction</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.extender.intro"></a>Introduction</h2></div></div></div>
 <p>This document explains how to extend Boost.Build to accomodate
-  your local requirements. Let's start with quite simple, but
+  your local requirements. Let's start with a simple but
   realistic example.</p>
-<p>Say you're writing an application which generates C++ code. If
+<p>Say you're writing an application that generates C++ code. If
   you ever did this, you know that it's not nice. Embedding large
   portions of C++ code in string literals is very awkward. A much
   better solution is:</p>
 <div class="orderedlist"><ol type="1">
 <li>
         Write the template of the code to be generated, leaving
-    placeholders at the points which will change
+    placeholders at the points that will change
       </li>
 <li>
         Access the template in your application and replace
@@ -56,47 +50,61 @@
       </li>
 <li>Write the result.</li>
 </ol></div>
-<p>It's quite easy to achieve. You write special verbatim files,
-  which are just C++, except that the very first line of the file
-  gives a name of variable that should be generated. A simple tool
-  is created which takes verbatim file and creates a cpp file with
-  a single char* variable, which name is taken from the first line
-  of verbatim file, and which value is properly quoted content of
-  the verbatim file.</p>
+<p>It's quite easy to achieve. You write special verbatim files
+  that are just C++, except that the very first line of the file
+  contains the name of a variable that should be generated. A simple tool
+  is created that takes a verbatim file and creates a cpp file with
+  a single <code class="computeroutput">char*</code> variable whose name is taken from the first line
+  of the verbatim file and whose value is the file's properly quoted content.</p>
 <p>Let's see what Boost.Build can do.</p>
 <p>First off, Boost.Build has no idea about "verbatim files". So,
-  you must register a new type. The following code does it:</p>
+  you must register a new target type. The following code does
+  it:</p>
 <pre class="programlisting">
 import type ;
-type.register VERBATIM : verbatim ;
+type.register VERBATIM : vrb ;
 </pre>
-<p>The first parameter to 'type.register' gives the name of
-  declared type. By convention, it's uppercase. The second
-  parameter is suffix for this type. So, if Boost.Build sees
-  "code.verbatim" in the list of sources, it knows that it's of
-  type <tt class="literal">VERBATIM</tt>.</p>
-<p>Lastly, you need a tool to convert verbatim files to C++. Say
-  you've sketched such a tool in Python. Then, you have to inform
-  Boost.Build about the tool. The Boost.Build concept which
-  represents a tool is <span class="emphasis"><em>generator</em></span>.</p>
-<p>First, you say that generator 'inline-file' is able to convert
-  VERBATIM type into C++:</p>
+<p>The first parameter to
+  <code class="computeroutput">type.register</code> gives the name of the
+  declared type. By convention, it's uppercase. The second parameter
+  is the suffix for files of this type. So, if Boost.Build sees
+  <code class="filename">code.vrb</code> in a list of sources, it knows that it's of type
+  <code class="computeroutput">VERBATIM</code>.</p>
+<p>Next, you tell Boost.Build that the verbatim files can be
+  transformed into C++ files in one build step.  A
+  <em class="firstterm">generator</em> is a template for a build step that
+  transforms targets of one type (or set of types) into another.  Our
+  generator will be called <code class="computeroutput">verbatim.inline-file</code>; it
+  transforms <code class="computeroutput">VERBATIM</code> files into <code class="computeroutput">CPP</code> files:
+
+</p>
 <pre class="programlisting">
 import generators ;
 generators.register-standard verbatim.inline-file : VERBATIM : CPP ;
 </pre>
-<p>Second, you must specify the commands to be run to actually
-  perform convertion:</p>
+<p>
+  </p>
+<p>Lastly, you have to inform Boost.Build about the shell
+  commands used to make that transformation.  That's done with an
+  <code class="computeroutput">actions</code> declaration.
+
+</p>
 <pre class="programlisting">
 actions inline-file
 {
     "./inline-file.py" $(&lt;) $(&gt;)
 }
 </pre>
+<p>
+
+
+
+
+</p>
 <p>Now, we're ready to tie it all together. Put all the code
-  above in file "verbatim.jam", add "import verbatim ;" to
-  "project-root.jam", and it's possible to write the following in
-  Jamfile:</p>
+  above in file <code class="filename">verbatim.jam</code>, add <code class="computeroutput">import verbatim ;</code> 
+  to <code class="filename">project-root.jam</code>, and it's possible to write
+  the following in Jamfile:</p>
 <pre class="programlisting">
 exe codegen : codegen.cpp class_template.verbatim usage.verbatim ;
 </pre>
@@ -105,12 +113,12 @@
 and linked it.
   </p>
 <p>In the subsequent sections, we will extend this example, and review
-        all the mechanisms in detail. The complete code is available in <a href="../../example/customization" target="_top">example/customization</a>
+        all the mechanisms in detail. The complete code is available in <code class="filename">example/customization</code>
         directory.
       </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/extending/features.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/extending/features.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/extending/features.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,30 +3,27 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Features</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../extender.html" title="Chapter 5. Extender Manual">
-<link rel="previous" href="tools.html" title="Tools and generators">
+<link rel="prev" href="tools.html" title="Tools and generators">
 <link rel="next" href="rules.html" title="Main target rules">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="tools.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../extender.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="rules.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.extending.features"></a>Features</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.extending.features"></a>Features</h2></div></div></div>
 <p>
         Often, we need to control the options passed the invoked tools. This 
         is done with features. Consider an example:
 </p>
 <pre class="programlisting">
-# Declare a new feature
+# Declare a new free feature
 import feature : feature ;
 feature verbatim-options : : free ;
 
@@ -42,90 +39,105 @@
 }
 </pre>
 <p>
-        We first define a new feature. Then, the <tt class="computeroutput">flags</tt> invocation
+        We first define a new feature. Then, the <code class="computeroutput">flags</code> invocation
         says that whenever verbatin.inline-file action is run, the value of
-        the <tt class="computeroutput">verbatim-options</tt> feature will be added to the
-        <tt class="computeroutput">OPTIONS</tt> variable, an can be used inside the action body.
+        the <code class="computeroutput">verbatim-options</code> feature will be added to the
+        <code class="computeroutput">OPTIONS</code> variable, and can be used inside the action body.
         You'd need to consult online help (--help) to find all the features of
-        the <tt class="computeroutput">toolset.flags</tt> rule.
+        the <code class="computeroutput">toolset.flags</code> rule.
+        
       </p>
 <p>
       Although you can define any set of features and interpret their values
       in any way, Boost.Build suggests the following coding standard for
       designing features.
     </p>
-<p>Most features should have a fixed set of values, which is portable
+<p>Most features should have a fixed set of values that is portable
       (tool neutral) across the class of tools they are designed to work
       with. The user does not have to adjust the values for a exact tool.  For
-      example, <tt class="computeroutput">&lt;optimization&gt;speed</tt> has the same meaning for
+      example, <code class="computeroutput">&lt;optimization&gt;speed</code> has the same meaning for
       all C++ compilers and the user does not have to worry about the exact
-      options which are passed to the compiler's command line.
+      options passed to the compiler's command line.
     </p>
 <p>
-      Besides such portable features there are special 'raw' features which
+      Besides such portable features there are special 'raw' features that
       allow the user to pass any value to the command line parameters for a
       particular tool, if so desired. For example, the
-      <tt class="computeroutput">&lt;cxxflags&gt;</tt> feature allows to pass any command line
-      options to a C++ compiler. The <tt class="computeroutput">&lt;include&gt;</tt> feature
-      allows to pass any value to the <tt class="computeroutput">-I</tt> and the interpretation
-      is tool-specific. (There an <a href="../faq/external.html" title="Can I get output of external program as a variable in a Jamfile?
-    ">example</a> of very smart usage of that
-      feature).  Of course one should always strive to use the portable
-      features but these should still be provided as a backdoor just to make
+      <code class="computeroutput">&lt;cxxflags&gt;</code> feature allows you to pass any command line
+      options to a C++ compiler. The <code class="computeroutput">&lt;include&gt;</code> feature
+      allows you to pass any string preceded by <code class="computeroutput">-I</code> and the interpretation
+      is tool-specific.  (See <a href="../faq/external.html" title="Can I get output of external program as a variable in a Jamfile?
+    ">the section called &#8220;Can I get output of external program as a variable in a Jamfile?
+    &#8221;</a> for an example of very smart usage of that
+      feature).  Of course one should always strive to use portable
+      features, but these are still be provided as a backdoor just to make
       sure Boost.Build does not take away any control from the user. 
     </p>
 <p>
-      Some of the reasons why portable features are better are:
+      Using portable features is a good idea because:
       </p>
 <div class="itemizedlist"><ul type="disc">
-<li><p>Since a portable feature have a fixed set of value, you will
-            be able to build your project with two different settings of the
-            feature. Boost.Build will automatically use two different
-            directories for produced files. If you pass raw compiler options,
-            Boost.Build assumes you know what you are doing, and would not
-            care about what options are passed.
+<li><p>When a portable feature is given a fixed set of
+          values, you can build your project with two different
+          settings of the feature and Boost.Build will automatically
+          use two different directories for generated files.
+          Boost.Build does not try to separate targets built with
+          different raw options.
+            
           </p></li>
-<li><p>Unlike "raw" features, you don't need to use specific
-            compiler flags in Jamfile, and it will more likely work on other systems.
+<li><p>Unlike with &#8220;raw&#8221; features, you don't need to use
+          specific command-line flags in your Jamfile, and it will be
+          more likely to work with other tools.
           </p></li>
 </ul></div>
+<p>
+    </p>
 <h3>
-<a name="id2538586"></a>Steps for adding a feauture</h3>
+<a name="id2577355"></a>Steps for adding a feauture</h3>
 <p>Adding a feature requires three steps:
 
         </p>
 <div class="orderedlist"><ol type="1">
 <li>
 <p>Declaring a feature. For that, the "feature.feature"
-              rule is used. You should have to decide on the set of <a href="../reference/definitions.html#bbv2.reference.features.attributes" title="Feature Attributes">feature
+              rule is used. You have to decide on the set of <a href="../reference/definitions.html#bbv2.reference.features.attributes" title="Feature Attributes">feature
               attributes</a>:
 
               </p>
 <div class="itemizedlist"><ul type="disc">
-<li><p>if feature has several values, and
-                    significally affects build, make it "propagated", so that
-                    whole project is build with the same value by
+<li><p>if a feature has several values and
+                    significantly affects the build, make it &#8220;propagated,&#8221; so that the
+                    whole project is built with the same value by
                     default</p></li>
-<li><p>if a feature does not have a fixed list of
-                    values, it must be "free".</p></li>
-<li><p>if feature is used to refer to a path, it must
-                be "path".</p></li>
+<li><p>if a feature does not have a fixed
+                list of values, it must be &#8220;free.&#8221;  For example, the
+                <code class="computeroutput">include</code> feature is a free
+                feature.</p></li>
+<li><p>if a feature is used to refer to a
+                path relative to the Jamfile, it must be a &#8220;path&#8221;
+                feature.  <code class="computeroutput">include</code> is also a path
+                feature.</p></li>
 <li><p>if feature is used to refer to some target, it
-                must be "dependency".</p></li>
+                must be a &#8220;dependency&#8221; feature. </p></li>
 </ul></div>
+<p>
+              </p>
 </li>
-<li><p>Converting the feature value into variable. To use
-              feature in build action, it must be converted into a variable,
-              accessible in build action. This is accomplished by
-              "toolset.flags" rule.</p></li>
+<li><p>Representing the feature value in a
+          target-specific variable. Build actions are command
+          templates modified by Boost.Jam variable expansions.  The
+          <code class="computeroutput">toolset.flags</code> rule sets a target-specific
+          variable to the value of a feature.</p></li>
 <li><p>Using the variable. The variable set in step 2 can
-              be used in build action to form command parameters or
+              be used in a build action to form command parameters or
               files.</p></li>
 </ol></div>
+<p>
+      </p>
 <h3>
-<a name="id2538645"></a>Another example</h3>
-<p>Here's an another example.
-        Let's see how we can make a feature which refers to a target. For example,
+<a name="id2577462"></a>Another example</h3>
+<p>Here's another example.
+        Let's see how we can make a feature that refers to a target. For example,
         when linking dynamic libraries on windows, one sometimes needs to specify
         "DEF file", telling what functions should be exported. It would be nice to
         use this file like this:
@@ -134,7 +146,9 @@
         lib a : a.cpp : &lt;def-file&gt;a.def ;
 </pre>
 <p>
+
         Actually, this feature is already supported, but anyway...
+        
       </p>
 <div class="orderedlist"><ol type="1">
 <li>
@@ -143,20 +157,29 @@
 <pre class="programlisting">
 feature def-file : : free dependency ;
 </pre>
+<p>
+            </p>
 </li>
 <li>
-<p>One of the toolsets which cares about DEF files is
-msvc. The following line should be added to it.
+<p>One of the toolsets that cares about
+        
+        DEF files is msvc. The following line should be added to it.
+        
 
 </p>
 <pre class="programlisting">
 flags msvc.link DEF_FILE &lt;def-file&gt; ;
 </pre>
+<p>
+            
+            </p>
 </li>
 <li>
 <p>Since the DEF_FILE variable is not used by the
-msvc.link action, we need to modify it to be:
+msvc.link action, 
 
+we need to modify it to be:
+
 </p>
 <pre class="programlisting">
 actions link bind DEF_FILE
@@ -164,12 +187,17 @@
     $(.LD) .... /DEF:$(DEF_FILE) ....
 }
 </pre>
-<p> Note the "bind DEF_FILE" part. It tells bjam that DEF_FILE
-            refers to a file, otherwise the variable will contain internal
-            target name, which is not likely to make sense for the linker.
+<p>
+            </p>
+<p> Note the <code class="computeroutput">bind DEF_FILE</code> part. It tells
+          bjam to translate the internal target name in
+          <code class="varname">DEF_FILE</code> to a corresponding filename in
+          the <code class="computeroutput">link</code> action.  Without it the expansion of
+          <code class="computeroutput">$(DEF_FILE)</code> would be a strange symbol that is
+          not likely to make sense for the linker.
           </p>
 <p>
-            We've almost done, but should stop for a small workaround. Add the following
+            We are almost done, but we should stop for a small workaround. Add the following
             code to msvc.jam
 
 </p>
@@ -181,18 +209,20 @@
 </pre>
 <p>
 
+
             This is needed to accomodate some bug in bjam, which hopefully
-            will be fixed one day.</p>
+            will be fixed one day.
+            
+</p>
 </li>
 </ol></div>
 <h3>
-<a name="id2538721"></a>Variants and composite features.</h3>
-<p>Sometimes you want to create a shorcut for some set of
-        features. For example, <tt class="computeroutput">release</tt> is a value of the
-        <tt class="computeroutput">variant</tt> and is a shortcut for a set of features.
-        </p>.
-
-      <p>It is possible to define your build variants. For example:
+<a name="id2577576"></a>Variants and composite features.</h3>
+<p>Sometimes you want to create a shortcut for some set of
+        features. For example, <code class="computeroutput">release</code> is a value of 
+        <code class="computeroutput">&lt;variant&gt;</code> and is a shortcut for a set of features.
+      </p>
+<p>It is possible to define your own build variants. For example:
 </p>
 <pre class="programlisting">
 variant crazy : &lt;optimization&gt;speed &lt;inlining&gt;off
@@ -206,11 +236,13 @@
 variant super_release : release : &lt;define&gt;USE_ASM ;
 </pre>
 <p>
-        In this case, <tt class="computeroutput">super_release</tt> will expand to all properties
-        specified by <tt class="computeroutput">release</tt>, and the additional one you've specified.
+        In this case, <code class="computeroutput">super_release</code> will expand to all properties
+        specified by <code class="computeroutput">release</code>, and the additional one you've specified.
       </p>
-<p>You are not restricted to using the <tt class="computeroutput">variant</tt> feature
-      only. Here's example which defines a brand new feature:
+<p>You are not restricted to using the <code class="computeroutput">variant</code> feature
+      only. 
+      
+      Here's example that defines a brand new feature:
 </p>
 <pre class="programlisting">
 feature parallelism : mpi fake none : composite link-incompatible ;
@@ -218,12 +250,13 @@
 feature.compose &lt;parallelism&gt;fake : &lt;library&gt;/mpi//fake/&lt;parallelism&gt;none ;
 </pre>
 <p>
-        This will allow you to specify value of feature
-        <tt class="computeroutput">parallelism</tt>, which will expand to link to the necessary
+
+        This will allow you to specify the value of feature
+        <code class="computeroutput">parallelism</code>, which will expand to link to the necessary
         library. 
       </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/extending/rules.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/extending/rules.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/extending/rules.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,41 +3,61 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Main target rules</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../extender.html" title="Chapter 5. Extender Manual">
-<link rel="previous" href="features.html" title="Features">
+<link rel="prev" href="features.html" title="Features">
 <link rel="next" href="toolset_modules.html" title="Toolset modules">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="features.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../extender.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="toolset_modules.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.extending.rules"></a>Main target rules</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.extending.rules"></a>Main target rules</h2></div></div></div>
 <p>
-      The main target rule is what creates a top-level target, for example "exe" or
-      "lib". It's quite likely that you'll want to declare your own and
-      there are as many as three ways to do that.
+      A main target rule (e.g &#8220;<code class="computeroutput">exe</code>&#8221;
+      Or &#8220;<code class="computeroutput">lib</code>&#8221;) creates a top-level target. It's quite likely that you'll want to declare your own and
+      there are two ways to do that.
+      
     </p>
-<p>The first is the simplest, but is sufficient in a number of
-      cases. Just write a wrapper rule, which will redirect to any of the
-      existing rules. For example, you have only one library per directory and
-      want all cpp files in the directory to be compiled. You can achieve this
-      effect with:
+<p><a name="bbv2.extending.rules.main-type"></a>The first way applies when
+
+      your target rule should just produce a target of specific type. In that case, a
+      rule is already defined for you! When you define a new type, Boost.Build
+      automatically defines a corresponding rule. The name of the rule is
+      obtained from the name of the type, by downcasing all letters and
+      replacing underscores with dashes. 
+      
+      For example, if you create a module
+      <code class="filename">obfuscate.jam</code> containing:
+
 </p>
 <pre class="programlisting">
+import type ;
+type.register OBFUSCATED_CPP  : ocpp ;
+
+import generators ;
+generators.register-standard obfuscate.file : CPP : OBFUSCATED_CPP ;
+</pre>
+<p>
+      and import that module, you'll be able to use the rule "obfuscated-cpp"
+      in Jamfiles, which will convert source to the OBFUSCATED_CPP type.
+    </p>
+<p>The second way is to write a wrapper rule that calls
+      any of the existing rules. For example, suppose you have only one library per
+      directory and want all cpp files in the directory to be compiled into that library. You
+      can achieve this effect with:
+</p>
+<pre class="programlisting">
 lib codegen : [ glob *.cpp ] ;
 </pre>
 <p>
-      but what if you want to make it even simple. Then, you add the following
-      definition to the project-root.jam file:
+      but if you want to make it even simpler, you could add the following
+      definition to the <code class="filename">project-root.jam</code> file:
 </p>
 <pre class="programlisting">
 rule glib ( name : extra-sources * : requirements * )
@@ -46,38 +66,25 @@
 }
 </pre>
 <p>
-which would allow to reduce Jamfile to
+which would allow you to reduce the Jamfile to
 </p>
 <pre class="programlisting">
 glib codegen ;
 </pre>
-<p>The second approach is suitable when your target rule should just
-      produce a target of specific type. Then, when declaring a type you
-      should tell Boost.Build that a main target rule should be created.
-      For example, if you create a module "obfuscate.jam" containing:
-
-</p>
-<pre class="programlisting">
-import type ;
-type.register OBFUSCATED_CPP  : ocpp : : main ;
-
-import generators ;
-generators.register-standard obfuscate.file : CPP : OBFUSCATED_CPP ;
-</pre>
 <p>
-      and import that module, you'll be able to use the rule "obfuscated-cpp"
-      in Jamfiles, which will convert source to the OBFUSCATED_CPP type.
     </p>
 <p>
-      The remaining method is to declare your own main target class. The
-      simplest example of this can be found in "build/alias.jam" file. The
-      current V2 uses this method when transformations are relatively
-      complex. However, we might deprecate this approach. If you find that you
-      need to use it (that is, the first two approaches are not sufficient),
-      please let us know by posting to the mailing list.
+      Note that because you can associate a custom generator with a target
+      type, the logic of building can be rather compiler. 
+      
+      For example, the
+      <code class="computeroutput">boostbook</code> module declares a target type
+      <code class="computeroutput">BOOSTBOOK_MAIN</code> and a custom generator for that
+      type. You can use that as example if your main target rule is
+      non-trivial.
     </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/extending/targets.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/extending/targets.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/extending/targets.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,25 +3,22 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Target types</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../extender.html" title="Chapter 5. Extender Manual">
-<link rel="previous" href="../extender.html" title="Chapter 5. Extender Manual">
+<link rel="prev" href="../extender.html" title="Chapter 5. Extender Manual">
 <link rel="next" href="tools.html" title="Tools and generators">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="../extender.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../extender.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="tools.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.extending.targets"></a>Target types</h2></div></div>
-<div></div>
-</div>
-<div class="toc"><dl><dt><a href="targets.html#bbv2.extending.scanners">Scanners</a></dt></dl></div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.extending.targets"></a>Target types</h2></div></div></div>
+<div class="toc"><dl><dt><span class="section"><a href="targets.html#bbv2.extending.scanners">Scanners</a></span></dt></dl></div>
 <p>The first thing we did in the <a href="../extender.html#bbv2.extender.intro" title="Introduction">intruduction</a> was declaring a
       new target type:
 </p>
@@ -36,25 +33,46 @@
         because Boost.Build can guess the type of sources from their
         extensions.        
       </p>
-<p>The first two parameters for the <tt class="computeroutput">type.register</tt> rule
+<p>The first two parameters for the <code class="computeroutput">type.register</code> rule
         are the name of new type and the list of extensions associated with
         it. A file with an extension from the list will have the given target
         type. In the case where a target of the declared type is generated
-        from other sources, the first specified extension will be used. This
-        behaviour can be changed using the
-        <tt class="computeroutput">type.set-generated-target-suffix</tt> rule.
+        from other sources, the first specified extension will be used. 
       </p>
+<p>Sometimes you want to change the suffix used for generated targets
+      depending on build properties, such as toolset. For example, some compiler
+      uses extension <code class="literal">elf</code> for executable files. You can use the
+      <code class="computeroutput">type.set-generated-target-suffix</code> rule:
+</p>
+<pre class="programlisting">
+type.set-generated-target-suffix EXE : &lt;toolset&gt;elf : elf ;
+</pre>
 <p>
-        Something about 'main' types.
-      </p>
-<p>Something about base types.
-      </p>
+    </p>
+<p>A new target type can be inherited from an existing one. 
+</p>
+<pre class="programlisting">
+type.register PLUGIN : : SHARED_LIB ;
+</pre>
+<p>
+      The above code defines a new type derived from
+      <code class="computeroutput">SHARED_LIB</code>. Initially, the new type inherits all the
+      properties of the base type - in particular generators and suffix.
+      Typically, you'll change the new type in some way. For example, using
+      <code class="computeroutput">type.set-generated-target-suffix</code> you can set the suffix for
+      the new type. Or you can write special a generator for the new type. For
+      example, it can generate additional metainformation for the plugin.
+      In either way, the <code class="computeroutput">PLUGIN</code> type can be used whenever
+      <code class="computeroutput">SHARED_LIB</code> can. For example, you can directly link plugins
+      to an application.
+    </p>
+<p>A type can be defined as "main", in which case Boost.Build will
+      automatically declare a main target rule for building targets of that
+      type. More details can be found <a href="rules.html#bbv2.extending.rules.main-type">later</a>.
+    </p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.extending.scanners"></a>Scanners</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.extending.scanners"></a>Scanners</h3></div></div></div>
 <p>
           Sometimes, a file can refer to other files via some include
           mechanism. To make Boost.Build track dependencies to the included
@@ -73,11 +91,15 @@
 }
 </pre>
 <p>         
-          All the complex logic is in the <tt class="computeroutput">common-scanner</tt> class,
-          and you only need to override the method which returns the regular
-          expression to be used for scanning. The paranthethis in the regular
-          expression indicate which part of the string is the name of the
-          included file. 
+          All the complex logic is in the <code class="computeroutput">common-scanner</code>
+          class, and you only need to override the method that returns
+          the regular expression to be used for scanning. The
+          parentheses in the regular expression indicate which part
+          of the string is the name of the included file.  Only the
+          first parenthesized group in the regular expression will be
+          recognized; if you can't express everything you want that
+          way, you can return multiple regular expressions, each of
+          which contains a parenthesized group to be matched.
         </p>
 <p>After that, we need to register our scanner class:
 </p>
@@ -86,10 +108,10 @@
 </pre>
 <p>
             The value of the second parameter, in this case
-            <tt class="computeroutput">include</tt>, specifies which properties contain the list
-            of paths which should be searched for the included files.
+            <code class="computeroutput">include</code>, specifies the properties that contain the list
+            of paths that should be searched for the included files.
          </p>
-<p>Finally, we assign the new scaner to the <tt class="computeroutput">VERBATIM</tt>
+<p>Finally, we assign the new scanner to the <code class="computeroutput">VERBATIM</code>
         target type:
 </p>
 <pre class="programlisting">
@@ -100,7 +122,7 @@
         </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/extending/tools.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/extending/tools.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/extending/tools.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,45 +3,43 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Tools and generators</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../extender.html" title="Chapter 5. Extender Manual">
-<link rel="previous" href="targets.html" title="Target types">
+<link rel="prev" href="targets.html" title="Target types">
 <link rel="next" href="features.html" title="Features">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="targets.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../extender.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="features.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.extending.tools"></a>Tools and generators</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.extending.tools"></a>Tools and generators</h2></div></div></div>
 <p>
         This section will describe how Boost.Build can be extended to support
         new tools.
       </p>
 <p>For each additional tool, a Boost.Build object called generator
-        must be created. That object has specific types of targets which it
-        accepts an produces. Using that information, Boost.Build is able
+        must be created. That object has specific types of targets that it
+        accepts and produces. Using that information, Boost.Build is able
         to automatically invoke the generator. For example, if you declare a
-        generator which takes a target of the type <tt class="literal">D</tt> and
-        produces a target of the type <tt class="literal">OBJ</tt>, when placing a
-        file with extention <tt class="literal">.d</tt> in a list of sources will
+        generator that takes a target of the type <code class="literal">D</code> and
+        produces a target of the type <code class="literal">OBJ</code>, when placing a
+        file with extention <code class="literal">.d</code> in a list of sources will
         cause Boost.Build to invoke your generator, and then to link the
         resulting object file into an application. (Of course, this requires
-        that you specify that the <tt class="literal">.d</tt> extension corresponds
-        to the <tt class="literal">D</tt> type.)
+        that you specify that the <code class="literal">.d</code> extension corresponds
+        to the <code class="literal">D</code> type.)
       </p>
 <p>Each generator should be an instance of a class derived from the
-        <tt class="computeroutput">generator</tt> class. In the simplest case, you don't need to
+        <code class="computeroutput">generator</code> class. In the simplest case, you don't need to
         create a derived class, but simply create an instance of the
-        <tt class="computeroutput">generator</tt> class. Let's review the example we've seen in the
+        <code class="computeroutput">generator</code> class. Let's review the example we've seen in the
         <a href="../extender.html#bbv2.extender.intro" title="Introduction">introduction</a>.
+        
 </p>
 <pre class="programlisting">
 import generators ;
@@ -51,22 +49,24 @@
     "./inline-file.py" $(&lt;) $(&gt;)
 }
 </pre>
+<p>
+      </p>
 <p>We declare a standard generator, specifying its id, the source type
         and the target type. When invoked, the generator will create a target
-        of type <tt class="literal">CPP</tt> which will have the source target of
-        type <tt class="literal">VERBATIM</tt> as the only source. But what command
+        of type <code class="literal">CPP</code> with a source target of
+        type <code class="literal">VERBATIM</code> as the only source. But what command
         will be used to actually generate the file? In bjam, actions are
         specified using named "actions" blocks and the name of the action
         block should be specified when creating targets. By convention,
         generators use the same name of the action block as their own id. So,
-        in above example, the "inline-file" actions block will be use to
+        in above example, the "inline-file" actions block will be used to
         convert the source into the target.
       </p>
 <p>
         There are two primary kinds of generators: standard and composing,
         which are registered with the
-        <tt class="computeroutput">generators.register-standard</tt> and the
-        <tt class="computeroutput">generators.register-composing</tt> rules, respectively. For
+        <code class="computeroutput">generators.register-standard</code> and the
+        <code class="computeroutput">generators.register-composing</code> rules, respectively. For
         example:
 </p>
 <pre class="programlisting">
@@ -74,26 +74,27 @@
 generators.register-composing mex.mex : CPP LIB : MEX ;
 </pre>
 <p>
-        The first generators takes a <span class="emphasis"><em>single</em></span> source of type
-        <tt class="computeroutput">VERBATIM</tt> and produces a result. The second generator
+        Standard generators take a <span class="emphasis"><em>single</em></span> source of type
+        <code class="computeroutput">VERBATIM</code> and produces a result. The second generator
         takes any number of sources, which can have either the
-        <tt class="computeroutput">CPP</tt> or the <tt class="computeroutput">LIB</tt> type. Composing generators
+        <code class="computeroutput">CPP</code> or the <code class="computeroutput">LIB</code> type. Composing generators
         are typically used for generating top-level target type. For example,
-        the first generator invoked when building an <tt class="computeroutput">exe</tt> target
+        the first generator invoked when building an <code class="computeroutput">exe</code> target
         is a composing generator corresponding to the proper linker.
       </p>
-<p>You should also know about two specific function for registering
-        generators: <tt class="computeroutput">generators.register-c-compiler</tt> and
-        <tt class="computeroutput">generators.register-linker</tt>. The first sets up header
+<p>You should also know about two specific functions for registering
+        generators: <code class="computeroutput">generators.register-c-compiler</code> and
+        <code class="computeroutput">generators.register-linker</code>. The first sets up header
         dependecy scanning for C files, and the seconds handles various
         complexities like searched libraries. For that reason, you should always
         use those functions when adding support for compilers and linkers.
       </p>
 <p>(Need a note about UNIX)</p>
 <h3>
-<a name="id2538271"></a>Custom generator classes</h3>
+<a name="id2577024"></a>Custom generator classes</h3>
 <p>The standard generators allows you to specify source and target
-        types, action, and a set of flags. If you need anything more complex,
+        types, an action, and a set of flags. If you need anything more complex,
+        
         you need to create a new generator class with your own logic. Then,
         you have to create an instance of that class and register it. Here's
         an example how you can create your own generator class:
@@ -105,6 +106,7 @@
     {
         generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
     }
+
 }
 
 generators.register 
@@ -112,36 +114,38 @@
 </pre>
 <p>
         This generator will work exactly like the
-        <tt class="computeroutput">verbatim.inline-file</tt> generator we've defined above, but
+        <code class="computeroutput">verbatim.inline-file</code> generator we've defined above, but
         it's possible to customize the behaviour by overriding methods of the
-        <tt class="computeroutput">generator</tt> class.
+        <code class="computeroutput">generator</code> class.
       </p>
-<p>There are two methods of interest. The <tt class="computeroutput">run</tt> methods is
-        responsible for overall process - it takes a number of source targets,
-        converts them the the right types, and creates the result. The
-        <tt class="computeroutput">generated-targets</tt> method is called when all sources are
+<p>There are two methods of interest. The <code class="computeroutput">run</code> method is
+        responsible for the overall process - it takes a number of source targets,
+        converts them to the right types, and creates the result. The
+        <code class="computeroutput">generated-targets</code> method is called when all sources are
         converted to the right types to actually create the result.
       </p>
-<p>The <tt class="computeroutput">generated-target</tt> method can be overridden when you
-        want to add additional properties to the generated targets or use
-        additional sources. For example (which is real), you have a tool for
-        analysing programs, which should be given a name of executable and the
-        list of all sources. Naturally, you don't want to list all source
-        files manually. Here's how the <tt class="computeroutput">generated-target</tt> method
-        can find the list of sources automatically:
+<p>The <code class="computeroutput">generated-target</code> 
+      method can be overridden
+      when you want to add additional properties to the generated
+      targets or use additional sources. For a real-life example,
+      suppose you have a program analysis tool that should be given a
+      name of executable and the list of all sources. Naturally, you
+      don't want to list all source files manually. Here's how the
+      <code class="computeroutput">generated-targets</code> method can find the list of
+      sources automatically:
 </p>
 <pre class="programlisting">
 class itrace-generator : generator {
 ....
     rule generated-targets ( sources + : property-set : project name ? )
     {
-        local leafs ;
+        local leaves ;
         local temp = [ virtual-target.traverse $(sources[1]) : : include-sources ] ;
         for local t in $(temp)
         {
             if ! [ $(t).action ]
             {
-                leafs += $(t) ;
+                leaves += $(t) ;
             }
         }
         return [ generator.generated-targets $(sources) $(leafs)
@@ -151,20 +155,21 @@
 generators.register [ new itrace-generator nm.itrace : EXE : ITRACE ] ;
 </pre>
 <p>
-        The <tt class="computeroutput">generated-targets</tt> rule will be called with a single
-        source target of type <tt class="literal">EXE</tt>. The call to the
-        <tt class="computeroutput">virtual-target.traverse</tt> will return all targets the
-        executable depends on, and we further find files which are not
-        produced from anything. The found targets are added to the sources.
+        The <code class="computeroutput">generated-targets</code> method will be called with a single
+        source target of type <code class="literal">EXE</code>. The call to 
+        <code class="computeroutput">virtual-target.traverse</code> will return all targets the
+        executable depends on, and we further find files that are not
+        produced from anything. 
+        The found targets are added to the sources.
       </p>
-<p>The <tt class="computeroutput">run</tt> method can be overriden to completely
-        customize the way generator works. In particular, the conversion of
+<p>The <code class="computeroutput">run</code> method can be overriden to completely
+        customize the way the generator works. In particular, the conversion of
         sources to the desired types can be completely customized. Here's
         another real example. Tests for the Boost Python library usually
         consist of two parts: a Python program and a C++ file. The C++ file is
-        compiled to Python extension which is loaded by the Python
+        compiled to Python extension that is loaded by the Python
         program. But in the likely case that both files have the same name,
-        the created Python extension must be renamed. Otherwise, Python
+        the created Python extension must be renamed. Otherwise, the Python
         program will import itself, not the extension. Here's how it can be
         done:
 </p>
@@ -194,10 +199,10 @@
     {
         if [ type.is-derived [ $(s).type ] CPP ] 
         {
-            local name = [ $(s).name ] ;
+            local name = [ $(s).name ] ;    # get the target's basename
             if $(name) = [ $(python).name ] 
             {
-                name = $(name)_ext ;
+                name = $(name)_ext ;        # rename the target
             }                                
             new-sources += [ generators.construct $(project) $(name) :
               PYTHON_EXTENSION : $(property-set) : $(s) $(libs) ] ;
@@ -209,14 +214,16 @@
 }    
 </pre>
 <p>        
+        
+
         First, we separate all source into python files, libraries and C++
         sources. For each C++ source we create a separate Python extension by
-        calling <tt class="computeroutput">generators.construct</tt> and passing the C++ source
+        calling <code class="computeroutput">generators.construct</code> and passing the C++ source
         and the libraries. At this point, we also change the extension's name,
         if necessary.        
       </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/extending/toolset_modules.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/extending/toolset_modules.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/extending/toolset_modules.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,67 +3,72 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Toolset modules</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../extender.html" title="Chapter 5. Extender Manual">
-<link rel="previous" href="rules.html" title="Main target rules">
+<link rel="prev" href="rules.html" title="Main target rules">
 <link rel="next" href="../reference.html" title="Chapter 6. Detailed reference">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="rules.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../extender.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.extending.toolset_modules"></a>Toolset modules</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.extending.toolset_modules"></a>Toolset modules</h2></div></div></div>
 <p>If your extensions will be used only on one project, they can be
-      placed in a separate <tt class="filename">.jam</tt> file which will be
-      imported by your <tt class="filename">project-root.jam</tt>. If the
-      extensions will be used on many projects, the users will thank you for 
+      placed in a separate <code class="filename">.jam</code> file that will be
+      imported by your <code class="filename">project-root.jam</code>. If the
+      extensions will be used on many projects, users will thank you for 
       a finishing touch.
     </p>
-<p>The standard way to use a tool in Boost.Build is the
-      <tt class="computeroutput">using</tt> rule. To make it work, you module should provide an
-      <tt class="computeroutput">init</tt> rule. The rule will be called with the same parameters
-      which were passed to the <tt class="computeroutput">using</tt> rule. The set of allowed
-      parameters is determined by you. For example, you can allow the user to
-      specify paths, tool version, or tool options.
+<p>The <code class="computeroutput">using</code> rule provides a standard mechanism
+    for loading and configuring extensions.  To make it work, your module
+    
+    should provide an <code class="computeroutput">init</code> rule. The rule will be called
+    with the same parameters that were passed to the
+    <code class="computeroutput">using</code> rule. The set of allowed parameters is
+    determined by you. For example, you can allow the user to specify
+    paths, tool versions, and other options.
+    
     </p>
-<p>Here are some guidelines which help to make Boost.Build more
+<p>Here are some guidelines that help to make Boost.Build more
       consistent:
       </p>
 <div class="itemizedlist"><ul type="disc">
-<li><p>The <tt class="computeroutput">init</tt> rule should never fail. Even if
-          user provided a wrong path, you should emit a warning and go
+<li><p>The <code class="computeroutput">init</code> rule should never fail. Even if
+          the user provided an incorrect path, you should emit a warning and go
           on. Configuration may be shared between different machines, and
           wrong values on one machine can be OK on another.
+          
           </p></li>
 <li>
-<p>Prefer specifying command to be executed to specifying
-            path. First of all, this gives more control: it's possible to
-            specify
+<p>Prefer specifying the command to be executed
+        to specifying the tool's installation path. First of all, this
+        gives more control: it's possible to specify
 </p>
 <pre class="programlisting">
 /usr/bin/g++-snapshot
 time g++
+
 </pre>
 <p>
             as the command. Second, while some tools have a logical
-            "installation root", it better if user don't have to remember if
-            a specific tool requires a full command or a path.            
+            "installation root", it's better if the user doesn't have to remember whether
+            a specific tool requires a full command or a path.
+            
           </p>
 </li>
 <li>
 <p>Check for multiple initialization. A user can try to
             initialize the module several times. You need to check for this
             and decide what to do. Typically, unless you support several
-            versions of a tool, duplicate initialization is a user error. If
-            tool version can be specified during initialization, make sure the
+            versions of a tool, duplicate initialization is a user error. 
+            
+            If the
+            tool's version can be specified during initialization, make sure the
             version is either always specified, or never specified (in which
             case the tool is initialied only once). For example, if you allow:
 </p>
@@ -76,26 +81,31 @@
             Then it's not clear if the first initialization corresponds to
             version 3.3 of the tool, version 3.4 of the tool, or some other
             version. This can lead to building twice with the same version.
+            
             </p>
 </li>
 <li>
-<p>If possible, the <tt class="computeroutput">init</tt> must be callable
+<p>If possible, <code class="computeroutput">init</code> must be callable
           with no parameters. In which case, it should try to autodetect all
           the necessary information, for example, by looking for a tool in
-          <tt class="envar">PATH</tt> or in common installation locations. Often this
+          <code class="envar">PATH</code> or in common installation locations. Often this
           is possible and allows the user to simply write:
 </p>
 <pre class="programlisting">
 using yfc ;
 </pre>
+<p>
+          </p>
 </li>
 <li><p>Consider using facilities in the
-          <tt class="computeroutput">tools/common</tt> module. You can take a look at how
-          <tt class="computeroutput">tools/gcc.jam</tt> uses that module in the <tt class="computeroutput">init</tt> rule.
+          <code class="computeroutput">tools/common</code> module. You can take a look at how
+          <code class="computeroutput">tools/gcc.jam</code> uses that module in the <code class="computeroutput">init</code> rule.
           </p></li>
 </ul></div>
+<p>
+    </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/faq/dll-path.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/dll-path.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/dll-path.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -5,27 +5,24 @@
     hardcode-dll-paths properties useful?
     </title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
-<link rel="previous" href="s07.html" title="How to change compilation flags for one file?
+<link rel="prev" href="s08.html" title="How to change compilation flags for one file?
     ">
 <link rel="next" href="../recipies/site-config.html" title="Targets in site-config.jam">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="s07.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../recipies/site-config.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="s08.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../recipies/site-config.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.faq.dll-path"></a>Why are the <tt class="computeroutput">dll-path</tt> and
-    <tt class="computeroutput">hardcode-dll-paths</tt> properties useful?
-    </h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.faq.dll-path"></a>Why are the <code class="computeroutput">dll-path</code> and
+    <code class="computeroutput">hardcode-dll-paths</code> properties useful?
+    </h2></div></div></div>
 <p>(This entry is specific to Unix system.)Before answering the
       questions, let's recall a few points about shared libraries. Shared
       libraries can be used by several applications, or other libraries,
@@ -38,7 +35,7 @@
       started. The dynamic linker will search in a system-defined list of
       paths, load the library and resolve the symbols. Which means that you
       should either change the system-defined list, given by the
-      <tt class="envar">LD_LIBRARY_PATH</tt> environment variable, or install the
+      <code class="envar">LD_LIBRARY_PATH</code> environment variable, or install the
       libraries to a system location. This can be inconvenient when
       developing, since the libraries are not yet ready to be installed, and
       cluttering system paths is undesirable. Luckily, on Unix there's another
@@ -47,16 +44,16 @@
 <p>An executable can include a list of additional library paths, which
       will be searched before system paths. This is excellent for development,
       because the build system knows the paths to all libraries and can include
-      them in executables. That's done when the <tt class="computeroutput">hardcode-dll-paths</tt>
-      feature has the <tt class="literal">true</tt> value, which is the
+      them in executables. That's done when the <code class="computeroutput">hardcode-dll-paths</code>
+      feature has the <code class="literal">true</code> value, which is the
       default. When the executables should be installed, the story is
       different.
     </p>
 <p>
       Obviously, installed executable should not hardcode paths to your
-      development tree. (The <tt class="computeroutput">stage</tt> rule explicitly disables the
-      <tt class="computeroutput">hardcode-dll-paths</tt> feature for that reason.) However, you
-      can use the <tt class="computeroutput">dll-path</tt> feature to add explicit paths
+      development tree. (The <code class="computeroutput">stage</code> rule explicitly disables the
+      <code class="computeroutput">hardcode-dll-paths</code> feature for that reason.) However, you
+      can use the <code class="computeroutput">dll-path</code> feature to add explicit paths
       manually. For example:
 </p>
 <pre class="programlisting">
@@ -65,7 +62,7 @@
 </pre>
 <p>
       will allow the application to find libraries placed to
-      <tt class="filename">/usr/lib/snake</tt>.
+      <code class="filename">/usr/lib/snake</code>.
     </p>
 <p>If you install libraries to a nonstandard location and add an
       explicit path, you get more control over libraries which will be used. A
@@ -77,7 +74,7 @@
 <p>Which approach is best depends on your situation. If the libraries
       are relatively standalone and can be used by third party applications,
       they should be installed in the system location. If you have lots of
-      libraries which can be used only by our application, it makes sense to
+      libraries which can be used only by your application, it makes sense to
       install it to a nonstandard directory and add an explicit path, like the
       example above shows. Please also note that guidelines for different
       systems differ in this respect. The Debian guidelines prohibit any
@@ -85,13 +82,13 @@
       always be used.
     </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="s07.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../recipies/site-config.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="s08.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../recipies/site-config.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Added: boost-build/branches/upstream/current/doc/html/bbv2/faq/envar.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/envar.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/envar.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,61 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>
+      Accessing environment variables
+      </title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
+<link rel="prev" href="s02.html" title="
+        I'm getting &quot;Duplicate name of actual target&quot; error. What
+        does it mean?
+      ">
+<link rel="next" href="s04.html" title="
+        How to control properties order?
+      ">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="s02.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s04.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.faq.envar"></a>
+      Accessing environment variables
+      </h2></div></div></div>
+<p>    
+      Many users would like to use environment variables in Jamfiles, for
+      example, to control location of external libraries. In many cases you
+      better declare those external libraries in the site-config.jam file, as
+      documented in the <a href="../recipies/site-config.html" title="Targets in site-config.jam">recipes
+      section</a>. However, if the users already have the environment variables set
+      up, it's not convenient to ask them to set up site-config.jam files as
+      well, and using environment variables might be reasonable.
+    </p>
+<p>In Boost.Build V2, each Jamfile is a separate namespace, and the
+    variables defined in environment is imported into the global
+    namespace. Therefore, to access environment variable from Jamfile, you'd
+    need the following code:
+</p>
+<pre class="programlisting">
+import os ;
+local SOME_LIBRARY_PATH = [ os.environ SOME_LIBRARY_PATH ] ;
+exe a : a.cpp : &lt;include&gt;$(SOME_LIBRARY_PATH) ;
+</pre>
+<p>
+    </p>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="s02.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s04.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/faq/external.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/external.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/external.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -4,61 +4,40 @@
 <title>Can I get output of external program as a variable in a Jamfile?
     </title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
-<link rel="previous" href="s04.html" title="
+<link rel="prev" href="s05.html" title="
       How to control the library order on Unix?
     ">
-<link rel="next" href="s06.html" title="How to get the project-root location?
+<link rel="next" href="s07.html" title="How to get the project-root location?
     ">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="s04.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s06.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="s05.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s07.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
 <a name="bbv2.faq.external"></a>Can I get output of external program as a variable in a Jamfile?
-    </h2></div></div>
-<div></div>
-</div>
-<p>From time to time users ask how to run an external program and save
-    the result in Jamfile variable, something like:
+    </h2></div></div></div>
+<p>The <code class="computeroutput">SHELL</code> builtin can be used for the purpose:
 </p>
 <pre class="programlisting">
-local gtk_includes = [ RUN_COMMAND gtk-config ] ;
+local gtk_includes = [ SHELL "gtk-config --cflags" ] ;
 </pre>
 <p>
-      Unfortunately, this is not possible at the moment. However, if the
-      result of command invocation is to be used in a command to some tool,
-      and you're working on Unix, the following workaround is possible.
-</p>
-<pre class="programlisting">
- alias gtk+-2.0 : : : :
-         &lt;cflags&gt;"`pkg-config --cflags gtk+-2.0`"
-         &lt;inkflags&gt;"`pkg-config --libs gtk+-2.0`"
-     ;
-</pre>
-<p>
-      If you use the "gtk+-2.0" target in sources, then the properties
-      specified above will be added to the build properties and eventually
-      will appear in the command line. Unix command line shell processes
-      the backticks quoting by running the tool and using its output --
-      which is what's desired in that case. Thanks to Daniel James for
-      sharing this approach.
     </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="s04.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s06.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="s05.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s07.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Added: boost-build/branches/upstream/current/doc/html/bbv2/faq/header-only-libraries.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/header-only-libraries.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/header-only-libraries.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,67 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Header-only libraries</title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
+<link rel="prev" href="../recipies/site-config.html" title="Targets in site-config.jam">
+<link rel="next" href="../arch.html" title="Appendix A. Boost.Build v2 architecture">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../recipies/site-config.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../arch.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.faq.header-only-libraries"></a>Header-only libraries</h2></div></div></div>
+<p>In modern C++, libraries often consist of just header files, without
+    any source files to compile. To use such libraries, you need to add proper
+    includes and, maybe, defines, to your project. But with large number of
+    external libraries it becomes problematic to remember which libraries are
+    header only, and which are "real" ones. However, with Boost.Build a 
+    header-only library can be declared as Boost.Build target and all 
+    dependents can use such library without remebering if it's header-only or not.
+    </p>
+<p>Header-only libraries are declared using the <code class="computeroutput">alias</code> rule,
+    that specifies only usage requirements, for example:
+</p>
+<pre class="programlisting">
+alias mylib 
+    : # no sources
+    : # no build requirements
+    : # no default build
+    : &lt;include&gt;whatever
+    ;
+</pre>
+<p>
+    The includes specified in usage requirements of <code class="computeroutput">mylib</code> are
+    automatically added to build properties of all dependents. The dependents
+    need not care if <code class="computeroutput">mylib</code> is header-only or not, and it's possible
+    to later make <code class="computeroutput">mylib</code> into a regular compiled library.
+    </p>
+<p>
+      If you already have proper usage requirements declared for project where
+      header-only library is defined, you don't need to duplicate them for
+      the <code class="computeroutput">alias</code> target:
+</p>
+<pre class="programlisting">
+project my : usage-requirements &lt;include&gt;whatever ;
+alias mylib ;
+</pre>
+<p>      
+    </p>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../recipies/site-config.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../arch.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/faq/s02.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/s02.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/s02.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -2,58 +2,106 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>
-      Accessing environment variables
+        I'm getting "Duplicate name of actual target" error. What
+        does it mean?
       </title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
-<link rel="previous" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
-<link rel="next" href="s03.html" title="
-        How to control properties order?
+<link rel="prev" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
+<link rel="next" href="envar.html" title="
+      Accessing environment variables
       ">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="../faq.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s03.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="../faq.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="envar.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="id2540896"></a>
-      Accessing environment variables
-      </h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id2579987"></a>
+        I'm getting "Duplicate name of actual target" error. What
+        does it mean?
+      </h2></div></div></div>
 <p>    
-      Many users would like to use environment variables in Jamfiles, for
-      example, to control location of external libraries. In many cases you
-      better declare those external libraries in the site-config.jam file, as
-      documented in the <a href="../recipies/site-config.html" title="Targets in site-config.jam">recipes
-      section</a>. However, if the users already have the environment variables set
-      up, it's not convenient to ask them to set up site-config.jam files as
-      well, and using environment variables might be reasonable.
+    The most likely case is that you're trying to
+    compile the same file twice, with almost the same,
+    but differing properties. For example:
+
+</p>
+<pre class="programlisting">
+exe a : a.cpp : &lt;include&gt;/usr/local/include ;
+exe b : a.cpp ;
+</pre>
+<p>    
+
     </p>
-<p>In Boost.Build V2, each Jamfile is a separate namespace, and the
-    variables defined in environment is imported into the global
-    namespace. Therefore, to access environment variable from Jamfile, you'd
-    need the following code:
+<p>
+    The above snippet requires two different compilations
+    of 'a.cpp', which differ only in 'include' property.
+    Since the 'include' property is free, Boost.Build
+    can't generate two objects files into different directories.
+    On the other hand, it's dangerous to compile the file only
+    once -- maybe you really want to compile with different
+    includes.
+    </p>
+<p>
+    To solve this issue, you need to decide if file should
+    be compiled once or twice.</p>
+<div class="orderedlist"><ol type="1">
+<li>
+<p>Two compile file only once, make sure that properties
+      are the same:
+
 </p>
 <pre class="programlisting">
-import modules ;
-local SOME_LIBRARY_PATH = [ modules.peek : SOME_LIBRARY_PATH ] ;
-exe a : a.cpp : &lt;include&gt;$(SOME_LIBRARY_PATH) ;
+exe a : a.cpp : &lt;include&gt;/usr/local/include ;
+exe b : a.cpp : &lt;include&gt;/usr/local/include ;
 </pre>
+</li>
+<li>
+<p>
+      If changing the properties is not desirable, for example
+      if 'a' and 'b' target have other sources which need
+      specific properties, separate 'a.cpp' into it's own target:
+
+</p>
+<pre class="programlisting">
+obj a_obj : a.cpp : &lt;include&gt;/usr/local/include ;
+exe a : a_obj ;
+</pre>
+</li>
+<li>
+<p>
+      To compile file twice, you can make the object file local
+      to the main target:
+
+</p>
+<pre class="programlisting">
+      exe a : [ obj a_obj : a.cpp ] : &lt;include&gt;/usr/local/include ;
+      exe b : [ obj a_obj : a.cpp ] ;
+</pre>
+</li>
+</ol></div>
+<p>
+   A good question is why Boost.Build can't use some of the above
+   approaches automatically. The problem is that such magic would
+   require additional implementation complexities and would only
+   help in half of the cases, while in other half we'd be silently
+   doing the wrong thing. It's simpler and safe to ask user to
+   clarify his intention in such cases.
+   </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="../faq.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s03.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="../faq.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="envar.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Deleted: boost-build/branches/upstream/current/doc/html/bbv2/faq/s03.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/s03.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/s03.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,67 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>
-        How to control properties order?
-      </title>
-<link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
-<link rel="previous" href="s02.html" title="
-      Accessing environment variables
-      ">
-<link rel="next" href="s04.html" title="
-      How to control the library order on Unix?
-    ">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="s02.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s04.html"><img src="../../images/next.png" alt="Next"></a>
-</div>
-<div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="id2540933"></a>
-        How to control properties order?
-      </h2></div></div>
-<div></div>
-</div>
-<p>For internal reasons, Boost.Build sorts all the properties
-    alphabetically. This means that if you write:
-</p>
-<pre class="programlisting">
-exe a : a.cpp : &lt;include&gt;b &lt;include&gt;a ;
-</pre>
-<p>
-      then the command line with first mention the "a" include directory, and
-      then "b", even though they are specified in the opposite order. In most
-      cases, the user doesn't care. But sometimes the order of includes, or
-      other properties, is important. For example, if one uses both the C++
-      Boost library and the "boost-sandbox" (libraries in development), then
-      include path for boost-sandbox must come first, because some headers may
-      override ones in C++ Boost. For such cases, a special syntax is
-      provided:
-</p>
-<pre class="programlisting">
-exe a : a.cpp : &lt;include&gt;a&amp;&amp;b ;        
-</pre>
-<p>The <tt class="computeroutput">&amp;&amp;</tt> symbols separate values of an
-      property, and specify that the order of the values should be preserved. You
-      are advised to use this feature only when the order of properties really
-      matters, and not as a convenient shortcut. Using it everywhere might
-      negatively affect performance.
-    </p>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><small></small></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="s02.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s04.html"><img src="../../images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/faq/s04.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/s04.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/s04.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -2,68 +2,65 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>
-      How to control the library order on Unix?
-    </title>
+        How to control properties order?
+      </title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
-<link rel="previous" href="s03.html" title="
-        How to control properties order?
+<link rel="prev" href="envar.html" title="
+      Accessing environment variables
       ">
-<link rel="next" href="external.html" title="Can I get output of external program as a variable in a Jamfile?
+<link rel="next" href="s05.html" title="
+      How to control the library order on Unix?
     ">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="s03.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="external.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="envar.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s05.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="id2540977"></a>
-      How to control the library order on Unix?
-    </h2></div></div>
-<div></div>
-</div>
-<p>On the Unix-like operating systems, the order in which static
-      libraries are specified when invoking the linker is important, because by
-      default, the linker uses one pass though the libraries list. Passing the
-      libraries in the incorrect order will lead to a link error. Further, this
-      behaviour is often used to make one library override symbols from
-      another. So, sometimes it's necessary to force specific order of
-      libraries.    
-    </p>
-<p>Boost.Build tries to automatically compute the right order.  The
-      primary rule is that if library a "uses" library b, then library a will
-      appear on the command line before library b. Library a is considered to
-      use b is b is present either in the sources of a or in its
-      requirements. To explicitly specify the use relationship one can use the
-      &lt;use&gt; feature. For example, both of the following lines will cause
-      a to appear before b on the command line:
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id2580132"></a>
+        How to control properties order?
+      </h2></div></div></div>
+<p>For internal reasons, Boost.Build sorts all the properties
+    alphabetically. This means that if you write:
 </p>
 <pre class="programlisting">
-lib a : a.cpp b ;
-lib a : a.cpp : &lt;use&gt;b ;
+exe a : a.cpp : &lt;include&gt;b &lt;include&gt;a ;
 </pre>
 <p>
-      The same approach works for searched libraries, too:
+      then the command line with first mention the "a" include directory, and
+      then "b", even though they are specified in the opposite order. In most
+      cases, the user doesn't care. But sometimes the order of includes, or
+      other properties, is important. For example, if one uses both the C++
+      Boost library and the "boost-sandbox" (libraries in development), then
+      include path for boost-sandbox must come first, because some headers may
+      override ones in C++ Boost. For such cases, a special syntax is
+      provided:
 </p>
 <pre class="programlisting">
-lib z ;
-lib png : : &lt;use&gt;z ;
-exe viewer : viewer png z ;
+exe a : a.cpp : &lt;include&gt;a&amp;&amp;b ;        
 </pre>
+<p>
+    </p>
+<p>The <code class="computeroutput">&amp;&amp;</code> symbols separate values of an
+      property, and specify that the order of the values should be preserved. You
+      are advised to use this feature only when the order of properties really
+      matters, and not as a convenient shortcut. Using it everywhere might
+      negatively affect performance.
+    </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="s03.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="external.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="envar.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s05.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Added: boost-build/branches/upstream/current/doc/html/bbv2/faq/s05.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/s05.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/s05.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,70 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>
+      How to control the library order on Unix?
+    </title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
+<link rel="prev" href="s04.html" title="
+        How to control properties order?
+      ">
+<link rel="next" href="external.html" title="Can I get output of external program as a variable in a Jamfile?
+    ">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="s04.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="external.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id2580183"></a>
+      How to control the library order on Unix?
+    </h2></div></div></div>
+<p>On the Unix-like operating systems, the order in which static
+      libraries are specified when invoking the linker is important, because by
+      default, the linker uses one pass though the libraries list. Passing the
+      libraries in the incorrect order will lead to a link error. Further, this
+      behaviour is often used to make one library override symbols from
+      another. So, sometimes it's necessary to force specific order of
+      libraries.    
+    </p>
+<p>Boost.Build tries to automatically compute the right order.  The
+      primary rule is that if library a "uses" library b, then library a will
+      appear on the command line before library b. Library a is considered to
+      use b is b is present either in the sources of a or in its
+      requirements. To explicitly specify the use relationship one can use the
+      &lt;use&gt; feature. For example, both of the following lines will cause
+      a to appear before b on the command line:
+</p>
+<pre class="programlisting">
+lib a : a.cpp b ;
+lib a : a.cpp : &lt;use&gt;b ;
+</pre>
+<p>
+    </p>
+<p>
+      The same approach works for searched libraries, too:
+</p>
+<pre class="programlisting">
+lib z ;
+lib png : : &lt;use&gt;z ;
+exe viewer : viewer png z ;
+</pre>
+<p>
+    </p>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="s04.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="external.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Deleted: boost-build/branches/upstream/current/doc/html/bbv2/faq/s06.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/s06.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/s06.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,48 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>How to get the project-root location?
-    </title>
-<link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
-<link rel="previous" href="external.html" title="Can I get output of external program as a variable in a Jamfile?
-    ">
-<link rel="next" href="s07.html" title="How to change compilation flags for one file?
-    ">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="external.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s07.html"><img src="../../images/next.png" alt="Next"></a>
-</div>
-<div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="id2541063"></a>How to get the project-root location?
-    </h2></div></div>
-<div></div>
-</div>
-<p>You might want to use the location of the project-root in your
-      Jamfiles. To do it, you'd need to declare path constant in your
-      project-root.jam:
-</p>
-<pre class="programlisting">
-path-constant TOP : . ;
-</pre>
-<p>
-      After that, the <tt class="computeroutput">TOP</tt> variable can be used in every Jamfile.
-    </p>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><small></small></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="external.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s07.html"><img src="../../images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/faq/s07.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/s07.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/s07.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,63 +1,45 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>How to change compilation flags for one file?
+<title>How to get the project-root location?
     </title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
-<link rel="previous" href="s06.html" title="How to get the project-root location?
+<link rel="prev" href="external.html" title="Can I get output of external program as a variable in a Jamfile?
     ">
-<link rel="next" href="dll-path.html" title="Why are the dll-path and
-    hardcode-dll-paths properties useful?
+<link rel="next" href="s08.html" title="How to change compilation flags for one file?
     ">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="s06.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="dll-path.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="external.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s08.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="id2541085"></a>How to change compilation flags for one file?
-    </h2></div></div>
-<div></div>
-</div>
-<p>If one file must be compiled with special options, you need to
-      explicitly declare an <tt class="computeroutput">obj</tt> target for that file and then use
-      that target in your <tt class="computeroutput">exe</tt> or <tt class="computeroutput">lib</tt> target:
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id2580265"></a>How to get the project-root location?
+    </h2></div></div></div>
+<p>You might want to use the location of the project-root in your
+      Jamfiles. To do it, you'd need to declare path constant in your
+      project-root.jam:
 </p>
 <pre class="programlisting">
-exe a : a.cpp b ;
-obj b : b.cpp : &lt;optimization&gt;off ;
+path-constant TOP : . ;
 </pre>
 <p>
-      Of course you can use other properties, for example to specify specific
-      compiler options:
-</p>
-<pre class="programlisting">
-exe a : a.cpp b ;
-obj b : b.cpp : &lt;cflags&gt;-g ;
-</pre>
-<p>
-      You can also use <a href="../tutorial/conditions.html" title="Conditions and alternatives">conditional
-      properties</a> for finer control:
-</p>
-<pre class="programlisting">
-exe a : a.cpp b ;
-obj b : b.cpp : &lt;variant&gt;release:&lt;optimization&gt;off ;
-</pre>
+      After that, the <code class="computeroutput">TOP</code> variable can be used in every Jamfile.
+    </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="s06.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="dll-path.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="external.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="s08.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Added: boost-build/branches/upstream/current/doc/html/bbv2/faq/s08.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq/s08.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq/s08.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,63 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>How to change compilation flags for one file?
+    </title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
+<link rel="prev" href="s07.html" title="How to get the project-root location?
+    ">
+<link rel="next" href="dll-path.html" title="Why are the dll-path and
+    hardcode-dll-paths properties useful?
+    ">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="s07.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="dll-path.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id2580291"></a>How to change compilation flags for one file?
+    </h2></div></div></div>
+<p>If one file must be compiled with special options, you need to
+      explicitly declare an <code class="computeroutput">obj</code> target for that file and then use
+      that target in your <code class="computeroutput">exe</code> or <code class="computeroutput">lib</code> target:
+</p>
+<pre class="programlisting">
+exe a : a.cpp b ;
+obj b : b.cpp : &lt;optimization&gt;off ;
+</pre>
+<p>
+      Of course you can use other properties, for example to specify specific
+      compiler options:
+</p>
+<pre class="programlisting">
+exe a : a.cpp b ;
+obj b : b.cpp : &lt;cflags&gt;-g ;
+</pre>
+<p>
+      You can also use <a href="../tutorial/conditions.html" title="Conditions and alternatives">conditional
+      properties</a> for finer control:
+</p>
+<pre class="programlisting">
+exe a : a.cpp b ;
+obj b : b.cpp : &lt;variant&gt;release:&lt;optimization&gt;off ;
+</pre>
+<p>
+
+    </p>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="s07.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="dll-path.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/faq.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/faq.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/faq.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,131 +3,82 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Chapter 7. Frequently Asked Questions</title>
 <link rel="stylesheet" href="../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="previous" href="reference/generators.html" title="Generators">
+<link rel="prev" href="reference/generators.html" title="Generators">
 <link rel="next" href="faq/s02.html" title="
-      Accessing environment variables
+        I'm getting &quot;Duplicate name of actual target&quot; error. What
+        does it mean?
       ">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="reference/generators.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="faq/s02.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 <div class="chapter" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title">
-<a name="bbv2.faq"></a>Chapter 7. Frequently Asked Questions</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title">
+<a name="bbv2.faq"></a>Chapter 7. Frequently Asked Questions</h2></div></div></div>
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl>
-<dt><a href="faq.html#id2540813">
+<dt><span class="section"><a href="faq.html#id2579924">
+        How do I get the current value of feature in Jamfile?
+      </a></span></dt>
+<dt><span class="section"><a href="faq/s02.html">
         I'm getting "Duplicate name of actual target" error. What
         does it mean?
-      </a></dt>
-<dt><a href="faq/s02.html">
+      </a></span></dt>
+<dt><span class="section"><a href="faq/envar.html">
       Accessing environment variables
-      </a></dt>
-<dt><a href="faq/s03.html">
+      </a></span></dt>
+<dt><span class="section"><a href="faq/s04.html">
         How to control properties order?
-      </a></dt>
-<dt><a href="faq/s04.html">
+      </a></span></dt>
+<dt><span class="section"><a href="faq/s05.html">
       How to control the library order on Unix?
-    </a></dt>
-<dt><a href="faq/external.html">Can I get output of external program as a variable in a Jamfile?
-    </a></dt>
-<dt><a href="faq/s06.html">How to get the project-root location?
-    </a></dt>
-<dt><a href="faq/s07.html">How to change compilation flags for one file?
-    </a></dt>
-<dt><a href="faq/dll-path.html">Why are the dll-path and
-    hardcode-dll-paths properties useful?
-    </a></dt>
-<dt><a href="recipies/site-config.html">Targets in site-config.jam</a></dt>
+    </a></span></dt>
+<dt><span class="section"><a href="faq/external.html">Can I get output of external program as a variable in a Jamfile?
+    </a></span></dt>
+<dt><span class="section"><a href="faq/s07.html">How to get the project-root location?
+    </a></span></dt>
+<dt><span class="section"><a href="faq/s08.html">How to change compilation flags for one file?
+    </a></span></dt>
+<dt><span class="section"><a href="faq/dll-path.html">Why are the <code class="computeroutput">dll-path</code> and
+    <code class="computeroutput">hardcode-dll-paths</code> properties useful?
+    </a></span></dt>
+<dt><span class="section"><a href="recipies/site-config.html">Targets in site-config.jam</a></span></dt>
+<dt><span class="section"><a href="faq/header-only-libraries.html">Header-only libraries</a></span></dt>
 </dl>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="id2540813"></a>
-        I'm getting "Duplicate name of actual target" error. What
-        does it mean?
-      </h2></div></div>
-<div></div>
-</div>
-<p>    
-    The most likely case is that you're trying to
-    compile the same file twice, with almost the same,
-    but differing properties. For example:
-
-</p>
-<pre class="programlisting">
-exe a : a.cpp : &lt;include&gt;/usr/local/include ;
-exe b : a.cpp ;
-</pre>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id2579924"></a>
+        How do I get the current value of feature in Jamfile?
+      </h2></div></div></div>
 <p>
-    The above snippet requires two different compilations
-    of 'a.cpp', which differ only in 'include' property.
-    Since the 'include' property is free, Boost.Build
-    can't generate two objects files into different directories.
-    On the other hand, it's dangerous to compile the file only
-    once -- maybe you really want to compile with different
-    includes.
-    </p>
-<p>
-    To solve this issue, you need to decide if file should
-    be compiled once or twice.</p>
-<div class="orderedlist"><ol type="1">
-<li>
-<p>Two compile file only once, make sure that properties
-      are the same:
-
-</p>
-<pre class="programlisting">
-exe a : a.cpp : &lt;include&gt;/usr/local/include ;
-exe b : a.cpp : &lt;include&gt;/usr/local/include ;
-</pre>
-</li>
-<li>
-<p>
-      If changing the properties is not desirable, for example
-      if 'a' and 'b' target have other sources which need
-      specific properties, separate 'a.cpp' into it's own target:
-
-</p>
-<pre class="programlisting">
-obj a_obj : a.cpp : &lt;include&gt;/usr/local/include ;
-exe a : a_obj ;
-</pre>
-</li>
-<li>
-<p>
-      To compile file twice, you can make the object file local
-      to the main target:
-
-</p>
-<pre class="programlisting">
-      exe a : [ obj a_obj : a.cpp ] : &lt;include&gt;/usr/local/include ;
-      exe b : [ obj a_obj : a.cpp ] ;
-</pre>
-</li>
-</ol></div>
-<p>
-   A good question is why Boost.Build can't use some of the above
-   approaches automatically. The problem is that such magic would
-   require additional implementation complexities and would only
-   help in half of the cases, while in other half we'd be silently
-   doing the wrong thing. It's simpler and safe to ask user to
-   clarify his intention in such cases.
-   </p>
+        This is not possible, since Jamfile does not have "current" value of any 
+        feature, be it toolset, build variant or anything else. For a single invocation of
+        <code class="filename">bjam</code>, any given main target can be built with several property sets.
+        For example, user can request two build variants on the command line. Or one library
+        is built as shared when used from one application, and as static when used from another.
+        Obviously, Jamfile is read only once, so generally, there's no single value of a feature
+        you can access in Jamfile.               
+      </p>
+<p>A feature has a specific value only when building a target, and there are two ways how you
+      can use that value:</p>
+<div class="itemizedlist"><ul type="disc">
+<li>Use conditional requirements or indirect conditional requirements. See 
+        <a href="advanced/targets.html#bbv2.advanced.targets.requirements.conditional">the section called &#8220;Requirements&#8221;</a>.</li>
+<li>Define a custom generator and a custom main target type. The custom generator can do arbitrary processing
+        or properties. See the <a href="extender.html" title="Chapter 5. Extender Manual">Chapter 5, <i>Extender Manual</i></a>.
+        </li>
+</ul></div>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/howto.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/howto.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/howto.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,27 +3,24 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Chapter 1. How to use this document</title>
 <link rel="stylesheet" href="../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="previous" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="prev" href="../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="next" href="installation.html" title="Chapter 2. Installation">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="../index.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="installation.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 <div class="chapter" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title">
-<a name="bbv2.howto"></a>Chapter 1. How to use this document</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title">
+<a name="bbv2.howto"></a>Chapter 1. How to use this document</h2></div></div></div>
 <p>
       If you've just found out about Boost.Build V2 and want to know
-      if it will work for you, start with <a href="tutorial.html" title="Chapter 3. Tutorial">Chapter 3, <i>Tutorial</i></a>. You can continue with the <a href="advanced.html" title="Chapter 4. User documentation">Chapter 4, <i>User documentation</i></a>. When you're ready to try Boost.Build
+      if it will work for you, start with <a href="tutorial.html" title="Chapter 3. Tutorial">Chapter 3, <i>Tutorial</i></a>. You can continue with <a href="advanced.html" title="Chapter 4. User documentation">Chapter 4, <i>User documentation</i></a>. When you're ready to try Boost.Build
       in practice, go to <a href="installation.html" title="Chapter 2. Installation">Chapter 2, <i>Installation</i></a>.
     </p>
 <p>
@@ -32,16 +29,15 @@
     </p>
 <p>
       If you're trying to build a project which uses Boost.Build,
-      look at <a href="installation.html" title="Chapter 2. Installation">Chapter 2, <i>Installation</i></a> and then read about
+      see <a href="installation.html" title="Chapter 2. Installation">Chapter 2, <i>Installation</i></a> and then read about
       <a href="reference.html#bbv2.reference.commandline" title="Command line">the section called &#8220;Command line&#8221;</a>.
     </p>
 <p>
-      If you have questions, please post them to our <a href="../../../../more/mailing_lists.htm#jamboost" target="_top">mailing
-      list</a>, and be sure to indicate in the subject line that
-      you're asking about Boost.Build <span class="bold"><b>V2</b></span>.
+      If you have questions, please post them to our mailing list (<a href="http://boost.org/more/mailing_lists.htm#jamboost" target="_top">http://boost.org/more/mailing_lists.htm#jamboost</a>). The mailing list is
+      also mirrowed to newsgroup <a href="news://news.gmane.org/gmane.comp.lib.boost.build" target="_top">news://news.gmane.org/gmane.comp.lib.boost.build</a>.
     </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/installation.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/installation.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/installation.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,56 +3,60 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Chapter 2. Installation</title>
 <link rel="stylesheet" href="../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="previous" href="howto.html" title="Chapter 1. How to use this document">
+<link rel="prev" href="howto.html" title="Chapter 1. How to use this document">
 <link rel="next" href="tutorial.html" title="Chapter 3. Tutorial">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="howto.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="tutorial.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 <div class="chapter" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title">
-<a name="bbv2.installation"></a>Chapter 2. Installation</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title">
+<a name="bbv2.installation"></a>Chapter 2. Installation</h2></div></div></div>
 <p>
       This section describes how to install Boost.Build from a
-      released source distribution. All paths are given relative to
-      the <i class="firstterm">Boost.Build v2 root directory</i>, which is 
+      released <a href="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=8041" target="_top">Boost
+      source distribution</a>
+      or <a href="http://sourceforge.net/cvs/?group_id=7586" target="_top">CVS
+      image</a>.
+      <sup>[<a name="id2523867" href="#ftn.id2523867">1</a>]</sup>
+All paths are given relative to
+      the <em class="firstterm">Boost.Build v2 root directory</em>, which is 
 
       
 
-      located in the <tt class="filename">tools/build/v2</tt> subdirectory
-      of a full <a href="http://www.boost.org" target="_top">Boost</a>
-      distribution.
+      
+
+      located in the <code class="filename">tools/build/v2</code> subdirectory
+      of a full Boost <a href="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=8041" target="_top">distribution</a>.
+      <sup>[<a name="id2523909" href="#ftn.id2523909">2</a>]</sup>
     </p>
 <div class="orderedlist"><ol type="1">
 <li>
-          Boost.Build uses <a href="../jam_src/index.html" target="_top">Boost.Jam</a>, an
+          Boost.Build uses <a href="../../../tools/jam/index.html" target="_top">Boost.Jam</a>, an
           extension of the <a href="http://www.perforce.com/jam/jam.html" target="_top">Perforce
-          Jam</a> portable <b class="command">make</b> replacement. The
-          recommended way to get Boost.Jam is to <span class="bold"><b><a href="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=72941" target="_top">download
-          a prebuilt executable</a></b></span> from SourceForge.
+          Jam</a> portable <span><strong class="command">make</strong></span> replacement. The
+          recommended way to get Boost.Jam is to <span class="bold"><strong><a href="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=72941" target="_top">download
+          a prebuilt executable</a></strong></span> from SourceForge.
           If a prebuilt executable is not provided for your platform
           or you are using Boost's sources in an unreleased state, it
-          may be neccessary to <a href="../../jam_src/index.html#building_bjam" target="_top">build <b class="command">bjam</b>
+          may be necessary to <a href="../../../doc/html/jam/buildin.html" target="_top">build <span><strong class="command">bjam</strong></span>
           from sources</a> included in the Boost source tree.
         </li>
 <li>
 <p>
 
           To install Boost.Jam, copy the executable,
-          called <b class="command">bjam</b>
-          or <b class="command">bjam.exe</b> to a location accessible in
-          your <tt class="envar">PATH</tt>.  Go to the Boost.Build root
+          called <span><strong class="command">bjam</strong></span>
+          or <span><strong class="command">bjam.exe</strong></span> to a location accessible in
+          your <code class="envar">PATH</code>.  Go to the Boost.Build root
           directory and
-          run <b class="command">bjam <tt class="option">--version</tt></b>. You
+          run <span><strong class="command">bjam <code class="option">--version</code></strong></span>. You
           should see:
 
           </p>
@@ -69,57 +73,83 @@
           Configure Boost.Build to recognize the build resources (such
           as compilers and libraries) you have installed on your
           system.  Open the
-          <tt class="filename">user-config.jam</tt> file in the Boost.Build
+          <code class="filename">user-config.jam</code> file in the Boost.Build
           root directory and follow the instructions there to describe
-          your toolsets and libraries, and, if neccessary, where they
+          your toolsets and libraries, and, if necessary, where they
           are located.
         </li>
 <li>
           You should now be able to go to the
-          <tt class="filename">example/hello/</tt> directory and run
-          <b class="command">bjam</b> there. A simple application will be
+          <code class="filename">example/hello/</code> directory and run
+          <span><strong class="command">bjam</strong></span> there. A simple application will be
           built. You can also play with other projects in the
-          <tt class="filename">example/</tt> directory. 
-    </li>
+          <code class="filename">example/</code> directory. 
+    
+        </li>
 </ol></div>
 <p>
       If you are using Boost's CVS state, be sure to
-      rebuild <b class="command">bjam</b> even if you have a previous
+      rebuild <span><strong class="command">bjam</strong></span> even if you have a previous
       version.  The CVS version of Boost.Build requires the CVS
       version of Boost.Jam.
     </p>
 <p>
-      When <b class="command">bjam</b> is invoked, it always needs to be
+      When <span><strong class="command">bjam</strong></span> is invoked, it always needs to be
       able to find the Boost.Build root directory, where the
       interpreted source code of Boost.Build is located.  There are
-      two ways to tell <b class="command">bjam</b> about the root directory:
+      two ways to tell <span><strong class="command">bjam</strong></span> about the root directory:
     </p>
 <div class="itemizedlist"><ul type="disc">
 <li>
-          Set the environment variable <tt class="envar">BOOST_BUILD_PATH</tt>
+          Set the environment variable <code class="envar">BOOST_BUILD_PATH</code>
           to the absolute path of the Boost.Build root directory.
         </li>
 <li>
 <p>
           At the root directory of your project or in any of its
           parent directories, create a file called
-          <tt class="filename">boost-build.jam</tt>, with a single line:
+          <code class="filename">boost-build.jam</code>, with a single line:
 
 </p>
 <pre class="programlisting">
-boost-build <i class="replaceable"><tt>/path/to/boost.build</tt></i> ;
+boost-build <em class="replaceable"><code>/path/to/boost.build</code></em> ;
 </pre>
+<p>
+
+        </p>
 </li>
 </ul></div>
-<p><span class="bold"><b>N.B.</b></span>
-  When <b class="command">bjam</b> is invoked from anywhere in the Boost
+<p><span class="bold"><strong>N.B.</strong></span>
+  When <span><strong class="command">bjam</strong></span> is invoked from anywhere in the Boost
   directory tree <span class="emphasis"><em>other than</em></span> the Boost.Build root
-  and its subdirectories, <a href="../../tools/build" target="_top">Boost.Build
+  and its subdirectories, <a href="../../../tools/build/index.html" target="_top">Boost.Build
   v1</a> is used by default. To override the default and use
-  Boost.Build v2, you have to add the <tt class="option">--v2</tt> command
-  line option to all <b class="command">bjam</b> invocations.</p>
+  Boost.Build v2, you have to add the <code class="option">--v2</code> command
+  line option to all <span><strong class="command">bjam</strong></span> invocations.</p>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a name="ftn.id2523867" href="#id2523867">1</a>] </sup>Note that packages prepared for
+      Unix/Linux systems usually make their own choices about where to
+      put things and even which parts of Boost to include.  When we
+      say &#8220;released source distribution&#8221; we mean a
+      distribution of Boost as released on its SourceForge
+      <a href="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=8041" target="_top">project
+      page</a>.
+        </p></div>
+<div class="footnote"><p><sup>[<a name="ftn.id2523909" href="#id2523909">2</a>] </sup>The Boost.Build subset of boost is also distributed
+        separately, for those who are only interested in getting a
+        build tool. The top-level directory of a <a href="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=80982" target="_top">Boost.Build
+        distribution</a> contains all the subdirectories of the
+        <code class="filename">tools/build/v2</code> subdirectory from a full
+        Boost distribution, so it is itself a valid Boost.Build root
+        directory.  It also contains the
+        <code class="filename">tools/jam/src</code> subdirectory of a
+        full Boost distribution, so you can rebuild Boost.Jam from
+        source.
+        </p></div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+</div>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Added: boost-build/branches/upstream/current/doc/html/bbv2/jam.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/jam.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/jam.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,96 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Appendix B. Boost.Jam documentation</title>
+<link rel="stylesheet" href="../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="prev" href="arch/targets.html" title="Targets">
+<link rel="next" href="../jam/building.html" title=" Building BJam">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="arch/targets.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="../jam/building.html"><img src="../images/next.png" alt="Next"></a>
+</div>
+<div class="appendix" lang="en">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="bbv2.jam"></a>Appendix B. Boost.Jam documentation</h2></div></div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="section"><a href="jam.html#jam.intro"> Introduction</a></span></dt>
+<dt><span class="section"><a href="../jam/building.html"> Building BJam</a></span></dt>
+<dt><span class="section"><a href="../jam/usage.html"> Using BJam</a></span></dt>
+<dt><span class="section"><a href="../jam/language.html"> Language</a></span></dt>
+<dt><span class="section"><a href="../jam/miscellaneous.html">Miscellaneous</a></span></dt>
+</dl>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="jam.intro"></a><a href="jam.html#jam.intro" title=" Introduction"> Introduction</a></h2></div></div></div>
+<div class="toc"><dl><dt><span class="section"><a href="jam.html#jam.intro.features"> Features</a></span></dt></dl></div>
+<p>
+      Boost.Jam (BJam) is a build tool based on FTJam, which in turn is based on
+      <a href="http://www.perforce.com/jam/jam.html" target="_top">Perforce Jam</a>. It
+      contains significant improvements made to facilitate its use in the Boost Build
+      System, but should be backward compatible with <a href="http://www.perforce.com/jam/jam.html" target="_top">Perforce
+      Jam</a>.
+    </p>
+<p>
+      This is version 3.1.13 of BJam and is based on version 2.4 of Jam/MR:
+    </p>
+<pre class="programlisting">/+\
++\  Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.
++/
+This is Release 2.4 of Jam/MR, a make-like program.
+License is hereby granted to use this software and distribute it
+freely, as long as this copyright notice is retained and modifications
+are clearly marked.
+ALL WARRANTIES ARE HEREBY DISCLAIMED.
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.intro.features"></a><a href="jam.html#jam.intro.features" title=" Features"> Features</a></h3></div></div></div>
+<p>
+        Jam is a make(1) replacement that makes building simple things simple and
+        building complicated things manageable.
+      </p>
+<p>
+        Jam's language is expressive, making Jamfiles (c.f. Makefiles) compact.
+      </p>
+<p>
+        Jam handles header file dependencies automatically and on-the-fly.
+      </p>
+<p>
+        Jam is very portable: it runs on UNIX, VMS, Mac, and NT. Most Jamfiles themselves
+        are portable.
+      </p>
+<p>
+        Jam is unintrusive: it is small, it has negligible CPU overhead, and it doesn't
+        create any of its own funny files (c.f. Odin, nmake, SunOS make).
+      </p>
+<p>
+        Jam can build large projects spread across many directories in one pass,
+        without recursing, tracking the relationships among all files. Jam can do
+        this with multiple, concurrent processes.
+      </p>
+<p>
+        Jam isn't under the blinkin GNU copyright, so you can incorporate it into
+        commercial products.
+      </p>
+</div>
+</div>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="arch/targets.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="../jam/building.html"><img src="../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/recipies/site-config.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/recipies/site-config.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/recipies/site-config.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,26 +3,23 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Targets in site-config.jam</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
-<link rel="previous" href="../faq/dll-path.html" title="Why are the dll-path and
+<link rel="prev" href="../faq/dll-path.html" title="Why are the dll-path and
     hardcode-dll-paths properties useful?
     ">
-<link rel="next" href="../arch.html" title="Appendix A. Boost.Build v2 architecture">
+<link rel="next" href="../faq/header-only-libraries.html" title="Header-only libraries">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="../faq/dll-path.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../arch.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="../faq/dll-path.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../faq/header-only-libraries.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.recipies.site-config"></a>Targets in site-config.jam</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.recipies.site-config"></a>Targets in site-config.jam</h2></div></div></div>
 <p>It is desirable to declare standard libraries available on a
       given system. Putting target declaration in Jamfile is not really
       good, since locations of the libraries can vary. The solution is
@@ -44,13 +41,13 @@
 <p>
       in any Jamfile.</p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="../faq/dll-path.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../arch.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="../faq/dll-path.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../faq/header-only-libraries.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/reference/buildprocess.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/reference/buildprocess.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/reference/buildprocess.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,30 +3,27 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Build process</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../reference.html" title="Chapter 6. Detailed reference">
-<link rel="previous" href="jamfiles.html" title="Writing Jamfiles">
-<link rel="next" href="definitions.html" title="">
+<link rel="prev" href="jamfiles.html" title="Writing Jamfiles">
+<link rel="next" href="definitions.html" title="Definitions">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="jamfiles.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="definitions.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.reference.buildprocess"></a>Build process</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.reference.buildprocess"></a>Build process</h2></div></div></div>
 <div class="toc"><dl>
-<dt><a href="buildprocess.html#bbv2.reference.buildprocess.alternatives">Alternative selection</a></dt>
-<dt><a href="buildprocess.html#bbv2.reference.buildprocess.common">Determining common properties</a></dt>
+<dt><span class="section"><a href="buildprocess.html#bbv2.reference.buildprocess.alternatives">Alternative selection</a></span></dt>
+<dt><span class="section"><a href="buildprocess.html#bbv2.reference.buildprocess.common">Determining common properties</a></span></dt>
 </dl></div>
 <p>The general overview of the build process was given in the 
-      <a href="../advanced/build_process.html" title="Build process">user documentation</a>.
+      <a href="../advanced/build_process.html" title="The Build Process">user documentation</a>.
       This section provides additional details, and some specific rules.
     </p>
 <p>To recap, building a target with specific properties includes the
@@ -36,20 +33,19 @@
 <li><p>applying default build,</p></li>
 <li><p>selecting the main target alternative to use,
           </p></li>
-<li><p>determining "common" properties</p></li>
+<li><p>determining "common" properties,</p></li>
 <li><p>building targets referred by the sources list and
-            dependency properties</p></li>
+            dependency properties,</p></li>
 <li><p>adding the usage requirements produces when building
-            dependencies to the "common" properties</p></li>
-<li><p>building the target using generators</p></li>
-<li><p>computing the usage requirements to be returned</p></li>
+            dependencies to the "common" properties,</p></li>
+<li><p>building the target using generators,</p></li>
+<li><p>computing the usage requirements to be returned.</p></li>
 </ol></div>
+<p>
+    </p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.buildprocess.alternatives"></a>Alternative selection</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.buildprocess.alternatives"></a>Alternative selection</h3></div></div></div>
 <p>When there are several alternatives, one of them must be
         selected. The process is as follows:</p>
 <div class="orderedlist"><ol type="1">
@@ -66,20 +62,17 @@
 <li>
             If there's one viable alternative, it's choosen. Otherwise,
             an attempt is made to find one best alternative. An alternative
-            a is better than another alternative b, iff set of properties
-            in b's condition is strict subset of the set of properities of
+            a is better than another alternative b, iff the set of properties
+            in b's condition is a strict subset of the set of properities of
             'a's condition. If there's one viable alternative, which is
-            better than all other, it's selected. Otherwise, an error is
+            better than all others, it's selected. Otherwise, an error is
             reported.
           </li>
 </ol></div>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.buildprocess.common"></a>Determining common properties</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.buildprocess.common"></a>Determining common properties</h3></div></div></div>
 <p>The "common" properties is a somewhat artificial term. Those are
         the intermediate property set from which both the build request for
         dependencies and properties for building the target are derived.
@@ -120,9 +113,11 @@
       : &lt;toolset&gt;gcc:&lt;variant&gt;release 
         &lt;variant&gt;release:&lt;define&gt;FOO ;
 </pre>
+<p>
+      </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/reference/definitions.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/reference/definitions.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/reference/definitions.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,83 +1,75 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title></title>
+<title>Definitions</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../reference.html" title="Chapter 6. Detailed reference">
-<link rel="previous" href="buildprocess.html" title="Build process">
+<link rel="prev" href="buildprocess.html" title="Build process">
 <link rel="next" href="generators.html" title="Generators">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="buildprocess.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="generators.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.reference.definitions"></a>Definitions</h2></div></div></div>
 <div class="toc"><dl>
-<dt><a href="definitions.html#bbv2.reference.features">Features and properties</a></dt>
-<dt><a href="definitions.html#bbv2.reference.variants">Build Variants</a></dt>
-<dt><a href="definitions.html#bbv2.reference.variants.proprefine">Property refinement</a></dt>
-<dt><a href="definitions.html#bbv2.reference.variants.propcond">Conditional properties</a></dt>
-<dt><a href="definitions.html#bbv2.reference.ids">Target identifiers and references</a></dt>
+<dt><span class="section"><a href="definitions.html#bbv2.reference.features">Features and properties</a></span></dt>
+<dt><span class="section"><a href="definitions.html#bbv2.reference.variants">Build Variants</a></span></dt>
+<dt><span class="section"><a href="definitions.html#bbv2.reference.variants.proprefine">Property refinement</a></span></dt>
+<dt><span class="section"><a href="definitions.html#bbv2.reference.variants.propcond">Conditional properties</a></span></dt>
+<dt><span class="section"><a href="definitions.html#bbv2.reference.ids">Target identifiers and references</a></span></dt>
 </dl></div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.features"></a>Features and properties</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.features"></a>Features and properties</h3></div></div></div>
 <div class="toc"><dl>
-<dt><a href="definitions.html#bbv2.reference.features.validity">Property Validity</a></dt>
-<dt><a href="definitions.html#bbv2.reference.features.attributes">Feature Attributes</a></dt>
-<dt><a href="definitions.html#bbv2.reference.features.declaration">Feature Declaration</a></dt>
+<dt><span class="section"><a href="definitions.html#bbv2.reference.features.validity">Property Validity</a></span></dt>
+<dt><span class="section"><a href="definitions.html#bbv2.reference.features.attributes">Feature Attributes</a></span></dt>
+<dt><span class="section"><a href="definitions.html#bbv2.reference.features.declaration">Feature Declaration</a></span></dt>
 </dl></div>
 <p>A <span class="emphasis"><em>feature</em></span> is a normalized (toolset-independent)
         aspect of a build configuration, such as whether inlining is
-        enabled. Feature names may not contain the '<tt class="literal">&gt;</tt>'
+        enabled. Feature names may not contain the '<code class="literal">&gt;</code>'
         character.</p>
 <p>Each feature in a build configuration has one or more
         associated <span class="emphasis"><em>value</em></span>s. Feature values for non-free features
-        may not contain the '<tt class="literal">&lt;</tt>', '<tt class="literal">:</tt>', or
-        '<tt class="literal">=</tt>' characters. Feature values for free features may not
-        contain the '<tt class="literal">&lt;</tt>' character.</p>
+        may not contain the '<code class="literal">&lt;</code>', '<code class="literal">:</code>', or
+        '<code class="literal">=</code>' characters. Feature values for free features may not
+        contain the '<code class="literal">&lt;</code>' character.</p>
 <p>A <span class="emphasis"><em>property</em></span> is a (feature,value) pair, expressed as
         &lt;feature&gt;value.</p>
-<p>A <span class="emphasis"><em>subfeature</em></span> is a feature which only exists in the
+<p>A <span class="emphasis"><em>subfeature</em></span> is a feature that only exists in the
         presence of its parent feature, and whose identity can be derived
         (in the context of its parent) from its value. A subfeature's
         parent can never be another subfeature. Thus, features and their
         subfeatures form a two-level hierarchy.</p>
-<p>A <span class="emphasis"><em>value-string</em></span> for a feature <span class="bold"><b>F</b></span> is a string of
+<p>A <span class="emphasis"><em>value-string</em></span> for a feature <span class="bold"><strong>F</strong></span> is a string of
         the form
-        <tt class="literal">value-subvalue1-subvalue2</tt>...<tt class="literal">-subvalueN</tt>, where
-        <tt class="literal">value</tt> is a legal value for <span class="bold"><b>F</b></span> and
-        <tt class="literal">subvalue1</tt>...<tt class="literal">subvalueN</tt> are legal values of some
-        of <span class="bold"><b>F</b></span>'s subfeatures. For example, the properties
-        <tt class="literal">&lt;toolset&gt;gcc &lt;toolset-version&gt;3.0.1</tt> can be
+        <code class="literal">value-subvalue1-subvalue2</code>...<code class="literal">-subvalueN</code>, where
+        <code class="literal">value</code> is a legal value for <span class="bold"><strong>F</strong></span> and
+        <code class="literal">subvalue1</code>...<code class="literal">subvalueN</code> are legal values of some
+        of <span class="bold"><strong>F</strong></span>'s subfeatures. For example, the properties
+        <code class="literal">&lt;toolset&gt;gcc &lt;toolset-version&gt;3.0.1</code> can be
         expressed more conscisely using a value-string, as
-        <tt class="literal">&lt;toolset&gt;gcc-3.0.1</tt>.</p>
+        <code class="literal">&lt;toolset&gt;gcc-3.0.1</code>.</p>
 <p>A <span class="emphasis"><em>property set</em></span> is a set of properties (i.e. a
         collection without duplicates), for instance:
-        <tt class="literal">&lt;toolset&gt;gcc &lt;runtime-link&gt;static</tt>.</p>
+        <code class="literal">&lt;toolset&gt;gcc &lt;runtime-link&gt;static</code>.</p>
 <p>A <span class="emphasis"><em>property path</em></span> is a property set whose elements have
         been joined into a single string separated by slashes. A property
         path representation of the previous example would be
-        <tt class="literal">&lt;toolset&gt;gcc/&lt;runtime-link&gt;static</tt>.</p>
-<p>A <span class="emphasis"><em>build specification</em></span> is a property set which fully
+        <code class="literal">&lt;toolset&gt;gcc/&lt;runtime-link&gt;static</code>.</p>
+<p>A <span class="emphasis"><em>build specification</em></span> is a property set that fully
         describes the set of features used to build a target.</p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h4 class="title">
-<a name="bbv2.reference.features.validity"></a>Property Validity</h4></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h4 class="title">
+<a name="bbv2.reference.features.validity"></a>Property Validity</h4></div></div></div>
 <p>
           For <a href="definitions.html#bbv2.reference.features.attributes.free">free</a>
             features, all values are valid. For all other features,
@@ -86,17 +78,14 @@
           feature-value. Subproperty validity may be restricted so
           that certain values are valid only in the presence of
           certain other subproperties. For example, it is possible
-          to specify that the <tt class="computeroutput">&lt;gcc-target&gt;mingw</tt>
+          to specify that the <code class="computeroutput">&lt;gcc-target&gt;mingw</code>
           property is only valid in the presence of
-          <tt class="computeroutput">&lt;gcc-version&gt;2.95.2</tt>.
+          <code class="computeroutput">&lt;gcc-version&gt;2.95.2</code>.
         </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h4 class="title">
-<a name="bbv2.reference.features.attributes"></a>Feature Attributes</h4></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h4 class="title">
+<a name="bbv2.reference.features.attributes"></a>Feature Attributes</h4></div></div></div>
 <p>Each feature has a collection of zero or more of the following
           attributes. Feature attributes are low-level descriptions of how the
           build system should interpret a feature's values when they appear in
@@ -110,7 +99,7 @@
 <p>Incidental features are assumed not to affect build
               products at all. As a consequence, the build system may use
               the same file for targets whose build specification differs
-              only in incidental features. A feature which controls a
+              only in incidental features. A feature that controls a
               compiler's warning level is one example of a likely
               incidental feature.</p>
 <p>Non-incidental features are assumed to affect build
@@ -120,19 +109,25 @@
             </p>
 </li>
 <li>
-<p><a name="bbv2.reference.features.attributes.propagated"></a><span class="emphasis"><em>propagated</em></span></p>
+<p>
+              <a name="bbv2.reference.features.attributes.propagated"></a>
+              <span class="emphasis"><em>propagated</em></span>
+            </p>
 <p>Features of this kind are
-              propagated to dependencies. That is, if a <a href="../advanced/jamfiles.html#bbv2.advanced.targets.main">main target</a> is built using a
+              propagated to dependencies. That is, if a <a href="../advanced/targets.html#bbv2.advanced.targets.main">main target</a> is built using a
               propagated
               property, the build systems attempts to use the same property
               when building any of its dependencies as part of that main
               target. For instance, when an optimized exectuable is
               requested, one usually wants it to be linked with optimized
-              libraries. Thus, the <tt class="literal">&lt;optimization&gt;</tt> feature is
+              libraries. Thus, the <code class="literal">&lt;optimization&gt;</code> feature is
               propagated.</p>
 </li>
 <li>
-<p><a name="bbv2.reference.features.attributes.free"></a><span class="emphasis"><em>free</em></span></p>
+<p>
+              <a name="bbv2.reference.features.attributes.free"></a>
+              <span class="emphasis"><em>free</em></span>
+            </p>
 <p>Most features have a finite set of allowed values, and can
               only take on a single value from that set in a given build
               specification. Free features, on the other hand, can have
@@ -145,9 +140,9 @@
 </li>
 <li>
 <p><span class="emphasis"><em>optional</em></span></p>
-<p>An optional feature is a feature which is not required to
+<p>An optional feature is a feature that is not required to
               appear in a build specification. Every non-optional non-free
-              feature has a default value which is used when a value for
+              feature has a default value that is used when a value for
               the feature is not otherwise specified, either in a target's
               requirements or in the user's build request. [A feature's
               default value is given by the first value listed in the
@@ -189,14 +184,10 @@
               feature. When generating targets from a set of build
               properties, composite features are recursively expanded and
               <span class="emphasis"><em>added</em></span> to the build property set, so rules can find
-              them if neccessary. Non-composite non-free features override
+              them if necessary. Non-composite non-free features override
               components of composite features in a build property set.</p>
 </li>
 <li>
-<p><span class="emphasis"><em>link-incompatible</em></span></p>
-<p>See <a href="../../">below</a>.</p>
-</li>
-<li>
 <p><span class="emphasis"><em>dependency</em></span></p>
 <p>The value of dependency feature if a target reference.
               When used for building of a main target, the value of
@@ -208,18 +199,15 @@
               the sources of A. </p>
 </li>
 </ul></div>
-<p>Features which are neither free nor incidental are called
+<p>Features that are neither free nor incidental are called
           <span class="emphasis"><em>base</em></span> features.</p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h4 class="title">
-<a name="bbv2.reference.features.declaration"></a>Feature Declaration</h4></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h4 class="title">
+<a name="bbv2.reference.features.declaration"></a>Feature Declaration</h4></div></div></div>
 <p>The low-level feature declaration interface is the
-          <tt class="literal">feature</tt> rule from the
-          <tt class="literal">feature</tt> module:
+          <code class="literal">feature</code> rule from the
+          <code class="literal">feature</code> module:
           
 </p>
 <pre class="programlisting">
@@ -228,19 +216,16 @@
 <p>
           
           A feature's allowed-values may be extended with the
-          <tt class="computeroutput">feature.extend</tt> rule.
+          <code class="computeroutput">feature.extend</code> rule.
         </p>
 </div>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.variants"></a>Build Variants</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.variants"></a>Build Variants</h3></div></div></div>
 <p>
         A build variant, or (simply variant) is a special kind of composite
-        feature which automatically incorporates the default values of
+        feature that automatically incorporates the default values of
         features that . Typically you'll want at least two separate
         variants: one for debugging, and one for your release code. [
         Volodya says: "Yea, we'd need to mention that it's a composite
@@ -252,21 +237,14 @@
       </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.variants.proprefine"></a>Property refinement</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.variants.proprefine"></a>Property refinement</h3></div></div></div>
 <p>When a target with certain properties is requested, and that
         target requires some set of properties, it is needed to find the
         set of properties to use for building. This process is called
         <span class="emphasis"><em>property refinement</em></span> and is performed by these rules</p>
 <div class="orderedlist"><ol type="1">
 <li>
-            If original properties and required properties are not
-            link-compatible, refinement fails.
-          </li>
-<li>
             Each property in the required set is added to the original
             property set
           </li>
@@ -277,11 +255,8 @@
 </ol></div>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.variants.propcond"></a>Conditional properties</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.variants.propcond"></a>Conditional properties</h3></div></div></div>
 <p>Sometime it's desirable to apply certain requirements only for
         a specific combination of other properties. For example, one of
         compilers that you use issues a pointless warning that you want to
@@ -298,13 +273,20 @@
 <pre class="programlisting">
 exe hello : hello.cpp : &lt;toolset&gt;yfc:&lt;cxxflags&gt;-disable-pointless-warning ;
 </pre>
+<p>
+      </p>
+<p>The syntax also allows several properties in the condition, for
+        example:
+</p>
+<pre class="programlisting">
+exe hello : hello.cpp : &lt;os&gt;NT,&lt;toolset&gt;gcc:&lt;link&gt;static ;
+</pre>
+<p>
+      </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.ids"></a>Target identifiers and references</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.ids"></a>Target identifiers and references</h3></div></div></div>
 <p><span class="emphasis"><em>Target identifier</em></span> is used to denote a
         target. The syntax is:</p>
 <pre class="programlisting">
@@ -345,7 +327,10 @@
 /boost/thread                        -- project "/boost/thread"
 /home/ghost/build/lr_library//parser -- target in specific project
 </pre>
-<p><span class="bold"><b>Rationale:</b></span>Target is separated from project by special
+<p>
+
+      </p>
+<p><span class="bold"><strong>Rationale:</strong></span>Target is separated from project by special
         separator (not just slash), because:</p>
 <div class="itemizedlist"><ul type="disc">
 <li>
@@ -354,9 +339,11 @@
 <li>
             It allows to have main target names with slashes. 
 
-            </li>
+            
+          </li>
 </ul></div>
-<p><a name="bbv2.reference.targets.references"></a><span class="emphasis"><em>Target reference</em></span> is used to
+<p><a name="bbv2.reference.targets.references"></a>
+        <span class="emphasis"><em>Target reference</em></span> is used to
         specify a source target, and may additionally specify desired
         properties for that target. It has this syntax:</p>
 <pre class="programlisting">
@@ -372,14 +359,14 @@
         </pre>
 <p>
         
-        would cause the version of <tt class="literal">cmdline</tt> library,
+        would cause the version of <code class="literal">cmdline</code> library,
         optimized for space, to be linked in even if the
-        <tt class="literal">compiler</tt> executable is build with optimization for
+        <code class="literal">compiler</code> executable is build with optimization for
         speed.
       </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/reference/generators.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/reference/generators.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/reference/generators.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,37 +3,37 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Generators</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../reference.html" title="Chapter 6. Detailed reference">
-<link rel="previous" href="definitions.html" title="">
+<link rel="prev" href="definitions.html" title="Definitions">
 <link rel="next" href="../faq.html" title="Chapter 7. Frequently Asked Questions">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="definitions.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../faq.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.reference.generators"></a>Generators</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.reference.generators"></a>Generators</h2></div></div></div>
 <div class="toc"><dl>
-<dt><a href="generators.html#id2540607">Selecting and ranking viable generators</a></dt>
-<dt><a href="generators.html#id2540667">Running generators</a></dt>
-<dt><a href="generators.html#id2540706">Selecting dependency graph</a></dt>
-<dt><a href="generators.html#id2540717">Property adjustment</a></dt>
-<dt><a href="generators.html#id2540792">Transformations cache</a></dt>
+<dt><span class="section"><a href="generators.html#id2579691">Selecting and ranking viable generators</a></span></dt>
+<dt><span class="section"><a href="generators.html#id2579754">Running generators</a></span></dt>
+<dt><span class="section"><a href="generators.html#id2579798">Selecting dependency graph</a></span></dt>
+<dt><span class="section"><a href="generators.html#id2579819">Property adjustment</a></span></dt>
+<dt><span class="section"><a href="generators.html#id2579895">Transformations cache</a></span></dt>
 </dl></div>
-<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
-<h3 class="title">Warning</h3>
-<p>The information is this section is likely to be outdated
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>The information is this section is likely to be outdated
         and misleading. 
-      </p>
-</div>
+      </p></td></tr>
+</table></div>
 <p>To construct a main target with given properties from sources,
       it is required to create a dependency graph for that main target,
       which will also include actions to be run. The algorithm for
@@ -50,14 +50,11 @@
 <p>Given a set of generators, the fundamental operation is to
       construct a target of a given type, with given properties, from a
       set of targets. That operation is performed by rule
-      <tt class="literal">generators.construct</tt> and the used algorithm is described
+      <code class="literal">generators.construct</code> and the used algorithm is described
       below.</p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2540607"></a>Selecting and ranking viable generators</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2579691"></a>Selecting and ranking viable generators</h3></div></div></div>
 <p>Each generator, in addition to target types that it can
         produce, have attribute that affects its applicability in
         particular sitiation. Those attributes are:</p>
@@ -81,7 +78,7 @@
 <p>When trying to construct a target, the first step is to select
         all possible generators for the requested target type, which
         required properties are a subset of requested properties.
-        Generators which were already selected up the call stack are
+        Generators that were already selected up the call stack are
         excluded. In addition, if any composing generators were selected
         up the call stack, all other composing generators are ignored
         (TODO: define composing generators). The found generators
@@ -90,13 +87,10 @@
         rank are selected for futher processing.</p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2540667"></a>Running generators</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2579754"></a>Running generators</h3></div></div></div>
 <p>When generators are selected, each is run to produce a list of
-        created targets. This list might include targets which are not of
+        created targets. This list might include targets that are not of
         requested types, because generators create the same targets as
         some tool, and tool's behaviour is fixed. (Note: should specify
         that in some cases we actually want extra targets). If generator
@@ -107,19 +101,16 @@
         otherwise when actually consuming properties we might discover
         that the set of propagated properties is different from what was
         used for building sources.</p>
-<p>For all targets which are not of requested types, we try to
+<p>For all targets that are not of requested types, we try to
         convert them to requested type, using a second call to
-        <tt class="literal">construct</tt>. This is done in order to support
+        <code class="literal">construct</code>. This is done in order to support
         transformation sequences where single source file expands to
         several later. See <a href="http://groups.yahoo.com/group/jamboost/message/1667" target="_top">this
           message</a> for details.</p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2540706"></a>Selecting dependency graph</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2579798"></a>Selecting dependency graph</h3></div></div></div>
 <p>
         After all generators are run,
         it is necessary to decide which of successfull invocation will be
@@ -129,14 +120,11 @@
       </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2540717"></a>Property adjustment</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2579819"></a>Property adjustment</h3></div></div></div>
 <p>Because target location is determined by the build system, it
         is sometimes necessary to adjust properties, in order to not
-        break actions. For example, if there's an action which generates
+        break actions. For example, if there's an action that generates
         a header, say "a_parser.h", and a source file "a.cpp" which
         includes that file, we must make everything work as if a_parser.h
         is generated in the same directory where it would be generated
@@ -165,17 +153,14 @@
         element, this is not possible. So, either generated headers should not
         be included with quotes, or first element of include path should be
         ".", which essentially erases the difference between quoted and angle
-        includes. <span class="bold"><b>Note:</b></span> the only way to get
+        includes. <span class="bold"><strong>Note:</strong></span> the only way to get
         "." as include path into compiler command line is via verbatim
         compiler option. In all other case, Boost.Build will convert "." into
         directory where it occurs.</p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="id2540792"></a>Transformations cache</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2579895"></a>Transformations cache</h3></div></div></div>
 <p>
         Under certain conditions, an
         attempt is made to cache results of transformation search. First,
@@ -186,7 +171,7 @@
       </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/reference/jamfiles.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/reference/jamfiles.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/reference/jamfiles.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,34 +3,28 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Writing Jamfiles</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../reference.html" title="Chapter 6. Detailed reference">
-<link rel="previous" href="../reference.html" title="Chapter 6. Detailed reference">
+<link rel="prev" href="../reference.html" title="Chapter 6. Detailed reference">
 <link rel="next" href="buildprocess.html" title="Build process">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="../reference.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="buildprocess.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.reference.jamfiles"></a>Writing Jamfiles</h2></div></div>
-<div></div>
-</div>
-<div class="toc"><dl><dt><a href="jamfiles.html#bbv2.reference.headers">Generated headers</a></dt></dl></div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.reference.jamfiles"></a>Writing Jamfiles</h2></div></div></div>
+<div class="toc"><dl><dt><span class="section"><a href="jamfiles.html#bbv2.reference.headers">Generated headers</a></span></dt></dl></div>
 <p>This section describes specific information about writing Jamfiles.</p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.headers"></a>Generated headers</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.headers"></a>Generated headers</h3></div></div></div>
 <p>Usually, Boost.Build handles implicit dependendies completely
-        automatically. For example, for C++ files, all <tt class="literal">#include</tt>
+        automatically. For example, for C++ files, all <code class="literal">#include</code>
         statements are found and handled. The only aspect where user help
         might be needed is implicit dependency on generated files.</p>
 <p>By default, Boost.Build handles such dependencies within one
@@ -44,7 +38,7 @@
 <p>Making this mechanism work across main target boundaries is
         possible, but imposes certain overhead. For that reason, if
         there's implicit dependency on files from other main targets, the
-        <tt class="literal">&lt;implicit-dependency&gt;</tt> [ link ] feature must
+        <code class="literal">&lt;implicit-dependency&gt;</code> [ link ] feature must
         be used, for example:</p>
 <pre class="programlisting">
 lib parser : parser.y ;
@@ -57,7 +51,7 @@
       </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/reference.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/reference.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/reference.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,53 +3,44 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Chapter 6. Detailed reference</title>
 <link rel="stylesheet" href="../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="previous" href="extending/toolset_modules.html" title="Toolset modules">
+<link rel="prev" href="extending/toolset_modules.html" title="Toolset modules">
 <link rel="next" href="reference/jamfiles.html" title="Writing Jamfiles">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="extending/toolset_modules.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="reference/jamfiles.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 <div class="chapter" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title">
-<a name="bbv2.reference"></a>Chapter 6. Detailed reference</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title">
+<a name="bbv2.reference"></a>Chapter 6. Detailed reference</h2></div></div></div>
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl>
-<dt><a href="reference.html#bbv2.reference.general">General information</a></dt>
-<dt><a href="reference/jamfiles.html">Writing Jamfiles</a></dt>
-<dt><a href="reference/buildprocess.html">Build process</a></dt>
-<dt><a href="reference/definitions.html"></a></dt>
-<dt><a href="reference/generators.html">Generators</a></dt>
+<dt><span class="section"><a href="reference.html#bbv2.reference.general">General information</a></span></dt>
+<dt><span class="section"><a href="reference/jamfiles.html">Writing Jamfiles</a></span></dt>
+<dt><span class="section"><a href="reference/buildprocess.html">Build process</a></span></dt>
+<dt><span class="section"><a href="reference/definitions.html">Definitions</a></span></dt>
+<dt><span class="section"><a href="reference/generators.html">Generators</a></span></dt>
 </dl>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.reference.general"></a>General information</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.reference.general"></a>General information</h2></div></div></div>
 <div class="toc"><dl>
-<dt><a href="reference.html#bbv2.reference.init">Initialization</a></dt>
-<dt><a href="reference.html#bbv2.reference.commandline">Command line</a></dt>
+<dt><span class="section"><a href="reference.html#bbv2.reference.init">Initialization</a></span></dt>
+<dt><span class="section"><a href="reference.html#bbv2.reference.commandline">Command line</a></span></dt>
 </dl></div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.init"></a>Initialization</h3></div></div>
-<div></div>
-</div>
-<p>bjam's first job upon startup is to load the Jam code which
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.init"></a>Initialization</h3></div></div></div>
+<p>bjam's first job upon startup is to load the Jam code that
         implements the build system. To do this, it searches for a file
-        called "boost-build.jam", first in the invocation directory, then
+        called <code class="filename">boost-build.jam</code>, first in the invocation directory, then
         in its parent and so forth up to the filesystem root, and finally
         in the directories specified by the environment variable
         BOOST_BUILD_PATH. When found, the file is interpreted, and should
@@ -60,14 +51,14 @@
 </pre>
 <p>
         If location is a relative path, it is treated as relative to
-        the directory of boost-build.jam. The directory specified by
-        location and directories in BOOST_BUILD_PATH are then searched for
-        a file called bootstrap.jam which is interpreted and is expected to
+        the directory of <code class="filename">boost-build.jam</code>. The directory specified by
+        that location and the directories in BOOST_BUILD_PATH are then searched for
+        a file called <code class="filename">bootstrap.jam</code>, which is expected to
         bootstrap the build system. This arrangement allows the build
         system to work without any command-line or environment variable
         settings. For example, if the build system files were located in a
         directory "build-system/" at your project root, you might place a
-        boost-build.jam at the project root containing:
+        <code class="filename">boost-build.jam</code> at the project root containing:
 
 </p>
 <pre class="programlisting">
@@ -77,10 +68,10 @@
 
         In this case, running bjam anywhere in the project tree will
         automatically find the build system.</p>
-<p>The default "bootstrap.jam", after loading some standard
+<p>The default <code class="filename">bootstrap.jam</code>, after loading some standard
         definitions, loads two files, which can be provided/customised by
-        user: "site-config.jam" and "user-config.jam".</p>
-<p>Locations where those files a search are summarized below:</p>
+        user: <code class="filename">site-config.jam</code> and <code class="filename">user-config.jam</code>.</p>
+<p>Locations where those files are searched are summarized below:</p>
 <div class="table">
 <a name="bbv2.reference.init.config"></a><p class="title"><b>Table 6.1. Search paths for configuration files</b></p>
 <table class="table" summary="Search paths for configuration files">
@@ -98,44 +89,44 @@
 <tr>
 <td>Linux</td>
 <td>
-<p>/etc</p>
-<p>$HOME</p>
-<p>$BOOST_BUILD_PATH</p>
-</td>
+                <p><code class="computeroutput">/etc</code></p>
+                <p><code class="computeroutput">$HOME</code></p>
+                <p><code class="computeroutput">$BOOST_BUILD_PATH</code></p>
+              </td>
 <td>
-<p>$HOME</p>
-<p>$BOOST_BUILD_PATH</p>
-</td>
+                <p><code class="computeroutput">$HOME</code></p>
+                <p><code class="computeroutput">$BOOST_BUILD_PATH</code></p>
+              </td>
 </tr>
 <tr>
 <td>Windows</td>
 <td>
-<p>$SystemRoot</p>
-<p>$HOME</p>
-<p>$BOOST_BUILD_PATH</p>
-</td>
+                <p><code class="computeroutput">%SystemRoot%</code></p>
+                <p><code class="computeroutput">%HOMEDRIVE%%HOMEPATH%</code></p>
+                <p><code class="computeroutput">%HOME%</code></p>
+                <p><code class="computeroutput">%BOOST_BUILD_PATH%</code></p>
+              </td>
 <td>
-<p>$HOME</p>
-<p>$BOOST_BUILD_PATH</p>
-</td>
+                <p><code class="computeroutput">%HOMEDRIVE%%HOMEPATH%</code></p>
+                <p><code class="computeroutput">%HOME%</code></p>
+                <p><code class="computeroutput">%BOOST_BUILD_PATH%</code></p>
+              </td>
 </tr>
 </tbody>
 </table>
 </div>
 <p>
         Boost.Build comes with default versions of those files,
+        
         which can serve as templates for customized versions.
       </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.reference.commandline"></a>Command line</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.reference.commandline"></a>Command line</h3></div></div></div>
 <div class="toc"><dl>
-<dt><a href="reference.html#bbv2.reference.init.args">Command line arguments</a></dt>
-<dt><a href="reference.html#bbv2.reference.init.options">Command line options</a></dt>
+<dt><span class="section"><a href="reference.html#bbv2.reference.init.args">Command line arguments</a></span></dt>
+<dt><span class="section"><a href="reference.html#bbv2.reference.init.options">Command line options</a></span></dt>
 </dl></div>
 <p>The command line may contain:</p>
 <div class="itemizedlist"><ul type="disc">
@@ -144,31 +135,29 @@
 <li>Command line arguments</li>
 </ul></div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h4 class="title">
-<a name="bbv2.reference.init.args"></a>Command line arguments</h4></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h4 class="title">
+<a name="bbv2.reference.init.args"></a>Command line arguments</h4></div></div></div>
 <p>
           Command line arguments specify targets and build
           request using the following rules.
         </p>
 <div class="itemizedlist"><ul type="disc">
 <li>
-              An argument which does not contain slashes or the "="
-              symbol is either a value of an implicit feature, or target to
-              be built. It is taken to be value of a feature if appropriate
-              feature exists. Otherwise, it is considered a <a href="reference/definitions.html#bbv2.reference.ids" title="Target identifiers and references">target id</a>. Special target name "clean"
-              has the same effect as "--clean" option.
+              An argument that does not contain slashes or the <code class="computeroutput">=</code>
+              symbol is either a value of an implicit feature or of a target to
+              be built. It is taken to be value of a feature if an appropriate
+              feature exists. Otherwise, it is considered a <a href="reference/definitions.html#bbv2.reference.ids" title="Target identifiers and references">target id</a>. Building the
+              special target name &#8220;clean&#8221; has the same effect as
+              using the <code class="computeroutput">--clean</code> option.
             </li>
 <li>
 <p>
-              An argument with either slashes or the "=" symbol specifies
-              a number of <a href="../">build
-                request</a>
-              elements. In the simplest form, it's just a set of properties,
-              separated by slashes, which become a single build request
-              element, for example:
+              An argument containing either slashes or
+              the <code class="computeroutput">=</code> symbol specifies a number of build
+              request elements (see ???). In its simplest
+              form, it's just a set of properties, separated by
+              slashes, which become a single build request element,
+              for example:
 
 </p>
 <pre class="programlisting">
@@ -176,7 +165,7 @@
 </pre>
 <p>
 
-              More complex form is used to save typing. For example,
+              A more complex form can be used to save typing. For example,
               instead of
 
 </p>
@@ -196,27 +185,36 @@
               Exactly, the conversion from argument to build request
               elements is performed by (1) splitting the argument at each slash,
               (2) converting each split part into a set of properties and (3)
-              taking all possible combination of the property sets. Each split
-              part should have the either the form
+              taking all possible combinations
+                
+              of the property sets. Each split
+              part should have either the form
 
 </p>
-<pre class="programlisting"><span class="emphasis"><em>feature-name</em></span>=<span class="emphasis"><em>feature-value1</em></span>[","<span class="emphasis"><em>feature-valueN</em></span>]*   
+<pre class="programlisting">
+<span class="emphasis"><em>feature-name</em></span>=<span class="emphasis"><em>feature-value1</em></span>[","<span class="emphasis"><em>feature-valueN</em></span>]*   
 </pre>
 <p>
 
-              or, in case of implicit feature
+              or, in case of implicit features
 
 </p>
-<pre class="programlisting"><span class="emphasis"><em>feature-value1</em></span>[","<span class="emphasis"><em>feature-valueN</em></span>;]*   
+<pre class="programlisting">
+<span class="emphasis"><em>feature-value1</em></span>[","<span class="emphasis"><em>feature-valueN</em></span>;]*   
 </pre>
 <p>
 
-              and will be converted into property set
+              will be converted into the property set
 
 </p>
 <pre class="programlisting">
 &lt;feature-name&gt;feature-value1 .... &lt;feature-name&gt;feature-valueN
 </pre>
+<p>
+
+
+
+            </p>
 </li>
 </ul></div>
 <p>
@@ -228,77 +226,23 @@
 </pre>
 <p>
 
-          would cause target called <tt class="literal">target1</tt> to be rebuilt in
+          would cause target called <code class="literal">target1</code> to be rebuilt in
           debug mode, except that for gcc, both dynamically and statically
           linked binaries would be created.
         </p>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h4 class="title">
-<a name="bbv2.reference.init.options"></a>Command line options</h4></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h4 class="title">
+<a name="bbv2.reference.init.options"></a>Command line options</h4></div></div></div>
 <p>All of the Boost.Build options start with the "--" prefix.
           They are described in the following table.</p>
-<div class="table">
-<a name="id2539335"></a><p class="title"><b>Table 6.2. Command line options</b></p>
-<table class="table" summary="Command line options">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th>Option</th>
-<th>Description</th>
-</tr></thead>
-<tbody>
-<tr>
-<td><tt class="literal">--version</tt></td>
-<td>Prints information on Boost.Build and Boost.Jam
-                  versions.</td>
-</tr>
-<tr>
-<td>
-<a name="bbv2.reference.init.options.help"></a><tt class="literal">--help</tt>
-</td>
-<td>Access to the online help system. This prints general
-                  information on how to use the help system with additional
-                  --help* options.</td>
-</tr>
-<tr>
-<td><tt class="literal">--clean</tt></td>
-<td>Removes everything instead of building. Unlike
-                  <tt class="literal">clean</tt> target in make, it is possible to clean only
-                  some targets.</td>
-</tr>
-<tr>
-<td><tt class="literal">--debug</tt></td>
-<td>Enables internal checks.</td>
-</tr>
-<tr>
-<td><tt class="literal">--dump-projects</tt></td>
-<td>Cause the project structure to be output.</td>
-</tr>
-<tr>
-<td><tt class="literal">--no-error-backtrace</tt></td>
-<td>Don't print backtrace on errors. Primary useful for
-                  testing.</td>
-</tr>
-<tr>
-<td><tt class="literal">--ignore-config</tt></td>
-<td>Do not load <tt class="literal">site-config.jam</tt> and
-                  <tt class="literal">user-config.jam</tt>
-</td>
-</tr>
-</tbody>
-</table>
+<p>FIXME: That table has moved into "User documentation" section
+        and there's nothing we can add here. Remove this part?</p>
 </div>
 </div>
 </div>
 </div>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/tutorial/conditions.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/tutorial/conditions.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/tutorial/conditions.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,72 +3,65 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Conditions and alternatives</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<style type="text/css">
-body { background-image: url('http://docbook.sourceforge.net/release/images/draft.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-       /* The following properties make the watermark "fixed" on the page. */
-       /* I think that's just a bit too distracting for the reader... */
-       /* background-attachment: fixed; */
-       /* background-position: center center; */
-     }</style>
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../tutorial.html" title="Chapter 3. Tutorial">
-<link rel="previous" href="linkage.html" title="Static and shared libaries">
+<link rel="prev" href="linkage.html" title="Static and shared libaries">
 <link rel="next" href="prebuilt.html" title="Prebuilt targets">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="linkage.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="prebuilt.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.tutorial.conditions"></a>Conditions and alternatives</h2></div></div>
-<div></div>
-</div>
-<p>As we've just figured out, properties can significally affect the
-      way targets are built. The processing of the &lt;link&gt; feature is
-      built in the build system, and is quite complex. But there is a couple
-      of mechanisms which allow ordinary users to do different things 
-      depending on properties.
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.tutorial.conditions"></a>Conditions and alternatives</h2></div></div></div>
+<p>Sometimes, particular relationships need to be maintained
+    among a target's build properties. For example, you might want to set
+    specific <code class="computeroutput">#define</code> when a library is built as shared,
+    or when a target's <code class="computeroutput">release</code> variant is built. 
+    This can be achieved with <em class="firstterm">conditional requirements</em>. 
+
     </p>
-<p>The first mechanism is called <i class="firstterm">conditinal
-        requirement</i>. For example, you might want to set specific
-      defines when the library is build as shared, or you have your own define
-      to be used in release mode. Here's a piece of Jamfile.
-</p>
 <pre class="programlisting">
 lib network : network.cpp 
-    : &lt;link&gt;shared:&lt;define&gt;NEWORK_LIB_SHARED 
-      &lt;variant&gt;release:&lt;define&gt;EXTRA_FAST
+    : <span class="bold"><strong>&lt;link&gt;shared:&lt;define&gt;NEWORK_LIB_SHARED</strong></span>
+     &lt;variant&gt;release:&lt;define&gt;EXTRA_FAST
     ;
 </pre>
 <p>
-      This will have exactly the effect we wanted: whenever &lt;link&gt;shared
-      is in properties, &lt;define&gt;NEWORK_LIB_SHARED will be in properties
-      as well.
+
+      In the example above, whenever <code class="filename">network</code> is
+      built with <code class="computeroutput">&lt;link&gt;shared</code>,
+      <code class="computeroutput">&lt;define&gt;NEWORK_LIB_SHARED</code> will be in its
+      properties, too. Also, whenever its release variant is built, 
+      <code class="computeroutput">&lt;define&gt;EXTRA_FAST</code> will appear in its properties.
     </p>
 <p>
-      Sometimes different variant of a target are so different, that
-      describing them using conditional requirements would be hard. Imagine
-      that a library has different sources on two supported toolsets, and
-      dummy implementation for all the other toolset. We can express this
-      situation using <i class="firstterm">target alternatives</i>:
+      Sometimes the ways a target is built are so different that
+      describing them using conditional requirements would be
+      hard. For example, imagine that a library actually uses
+      different source files depending on the toolset used to build
+      it. We can express this situation using <em class="firstterm">target
+      alternatives</em>:
 </p>
 <pre class="programlisting">
-lib demangler : dummy_demangler.cpp ;
-lib demangler : demangler_gcc.cpp : &lt;toolset&gt;gcc ;
-lib demangler : demangler_msvc.cpp : &lt;toolset&gt;msvc ;
+lib demangler : dummy_demangler.cpp ;                      # alternative 1
+lib demangler : demangler_gcc.cpp : &lt;toolset&gt;gcc ;   # alternative 2
+lib demangler : demangler_msvc.cpp : &lt;toolset&gt;msvc ; # alternative 3
 </pre>
 <p>
-      The proper alternative will be automatically selected. 
+      When building <code class="filename">demangler</code>, Boost.Build will compare
+      requirements for each alternative with build properties to find the best match.
+      For example, when building with with <code class="computeroutput">&lt;toolset&gt;gcc</code> 
+      alternative 2, will be selected, and when building with 
+      <code class="computeroutput">&lt;toolset&gt;msvc</code> alternative 3 will be selected. In all other
+      cases, the most generic alternative 1 will be built.
     </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Deleted: boost-build/branches/upstream/current/doc/html/bbv2/tutorial/depends.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/tutorial/depends.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/tutorial/depends.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,77 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Library dependencies</title>
-<link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<style type="text/css">
-body { background-image: url('http://docbook.sourceforge.net/release/images/draft.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-       /* The following properties make the watermark "fixed" on the page. */
-       /* I think that's just a bit too distracting for the reader... */
-       /* background-attachment: fixed; */
-       /* background-position: center center; */
-     }</style>
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="up" href="../tutorial.html" title="Chapter 3. Tutorial">
-<link rel="previous" href="libs.html" title="Libraries and Dependent Targets">
-<link rel="next" href="linkage.html" title="Static and shared libaries">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="libs.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="linkage.html"><img src="../../images/next.png" alt="Next"></a>
-</div>
-<div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.tutorial.depends"></a>Library dependencies</h2></div></div>
-<div></div>
-</div>
-<p>The previous example was simple. Often, there are long chains
-      of dependencies between libraries. The main application is a thin
-      wrapper on top of library with core logic, which uses library of
-      utility functions, which uses boost filesystem library.
-      Expressing these dependencies is straightforward:</p>
-<pre class="programlisting">
-lib utils : utils.cpp /boost/filesystem//fs ;   
-lib core : core.cpp utils ;
-exe app : app.cpp core ;
-</pre>
-<p>So, what's the reason to even mention this case? First,
-      because it's a bit more complex that it seems. When using shared
-      linking, libraries are build just as written, and everything will
-      work. However, what happens with static linking? It's not
-      possible to include another library in static library.
-      Boost.Build solves this problem by returning back library targets
-      which appear as sources for static libraries. In this case, if
-      everything is built statically, the "app" target will link not
-      only "core" library, but also "utils" and
-      "/boost/filesystem//fs".</p>
-<p>So, the net result is that the above code will work for both
-      static linking and for shared linking.</p>
-<p>Sometimes, you want all applications in some project to link
-      to a certain library. Putting the library in sources of all
-      targets is possible, but verbose. You can do better by using the
-      &lt;source&gt; property. For example, if "/boost/filesystem//fs"
-      should be linked to all applications in your project, you can add
-      &lt;source&gt;/boost/filesystem//fs to requirements of the
-      project, like this:</p>
-<pre class="programlisting">
-project 
-   : requirements &lt;source&gt;/boost/filesystem//fs
-   ;   
-</pre>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><small></small></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="libs.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="linkage.html"><img src="../../images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/tutorial/hierarchy.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/tutorial/hierarchy.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/tutorial/hierarchy.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,53 +3,40 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Project Hierarchies</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<style type="text/css">
-body { background-image: url('http://docbook.sourceforge.net/release/images/draft.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-       /* The following properties make the watermark "fixed" on the page. */
-       /* I think that's just a bit too distracting for the reader... */
-       /* background-attachment: fixed; */
-       /* background-position: center center; */
-     }</style>
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../tutorial.html" title="Chapter 3. Tutorial">
-<link rel="previous" href="properties.html" title="Properties">
-<link rel="next" href="libs.html" title="Libraries and Dependent Targets">
+<link rel="prev" href="properties.html" title="Properties">
+<link rel="next" href="libs.html" title="Dependent Targets">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="properties.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="libs.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.tutorial.hierarchy"></a>Project Hierarchies</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.tutorial.hierarchy"></a>Project Hierarchies</h2></div></div></div>
 <p>So far we've only considered examples with one project
-      (i.e. with one <tt class="filename">Jamfile</tt>). A typical large
-      software project would be composed of sub-projects organized
-      into a tree. The top of the tree is called the
-      <i class="firstterm">project root</i>.  Besides a
-      <tt class="filename">Jamfile</tt>, the project root directory
-      contains a file called <tt class="filename">project-root.jam</tt>. Every other
-      <tt class="filename">Jamfile</tt> in the project has a single parent
-      project, rooted in the nearest parent directory containing a
-      <tt class="filename">Jamfile</tt>. For example, in the following
-      directory layout:
+    &#8212;a. with one user-written Boost.Jam file,
+    <code class="filename">Jamroot</code>). A typical large codebase would be
+    composed of many projects organized into a tree. The top of the
+    tree is called the <em class="firstterm">project root</em>.  Every
+    subproject is defined by a file called
+    <code class="filename">Jamfile</code> in a descendant directory of the
+    project root.  The parent project of a subproject is defined by
+    the nearest <code class="filename">Jamfile</code> or
+    <code class="filename">Jamroot</code> file in an ancestor directory. For
+    example, in the following directory layout:
 
 </p>
 <pre class="screen">
 top/ 
   |
-  +-- Jamfile
-  +-- project-root.jam
+  +-- Jamroot
   |
-  +-- src/
+  +-- app/
   |    |
   |    +-- Jamfile
   |    `-- app.cpp
@@ -63,18 +50,34 @@
 </pre>
 <p>
 
-      the project root is <tt class="filename">top/</tt>.  Because there is
-      no <tt class="filename">Jamfile</tt> in
-      <tt class="filename">top/util/</tt>, the projects in
-      <tt class="filename">top/src/</tt> and
-      <tt class="filename">top/util/foo/</tt> are immediate children of the
+      the project root is <code class="filename">top/</code>.  The projects in
+      <code class="filename">top/app/</code> and
+      <code class="filename">top/util/foo/</code> are immediate children of the
       root project.
+
+      </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+          When we refer to a &#8220;Jamfile,&#8221; set in normal
+          type, we mean a file called either
+          <code class="filename">Jamfile</code> or
+          <code class="filename">Jamroot</code>.  When we need to be more
+          specific, the filename will be set as
+          &#8220;<code class="filename">Jamfile</code>&#8221; or
+          &#8220;<code class="filename">Jamroot</code>.&#8221;
+        </p></td></tr>
+</table></div>
+<p>
     </p>
 <p>
       Projects inherit all attributes (such as requirements)
       from their parents.  Inherited requirements are combined with
-      any requirements specified by the sub-project.  
-      For example, if <tt class="filename">top/Jamfile</tt> has
+      any requirements specified by the subproject.  
+      For example, if <code class="filename">top/Jamroot</code> has
 
 </p>
 <pre class="programlisting">
@@ -82,37 +85,41 @@
 </pre>
 <p>
 
-      in its requirements, then all of its sub-projects will have it
+      in its requirements, then all of its subprojects will have it
       in their requirements, too.  Of course, any project can add
-      additional includes. <sup>[<a name="id2534693" href="#ftn.id2534693">2</a>]</sup> More details can be found in the section
-      on <a href="../advanced/jamfiles.html#bbv2.advanced.projects" title="Projects">projects</a>.
+      include paths to those specified by its parents. <sup>[<a name="id2570317" href="#ftn.id2570317">4</a>]</sup> 
+    More details can be found in 
+      <a href="../advanced/projects.html" title="Projects">the section called &#8220;Projects&#8221;</a>.
     </p>
 <p>
-      Invoking <b class="command">bjam</b> without explicitly specifying
-      any targets on the command-line builds the project rooted in the
+      Invoking <span><strong class="command">bjam</strong></span> without explicitly specifying
+      any targets on the command line builds the project rooted in the
       current directory.  Building a project does not automatically
-      cause its sub-projects to be built unless the parent project's
-      <tt class="filename">Jamfile</tt> explicitly requests it. In our
-      example, <tt class="filename">top/Jamfile</tt> might contain:
+      cause its subprojects to be built unless the parent project's
+      Jamfile explicitly requests it. In our example,
+      <code class="filename">top/Jamroot</code> might contain:
 
 </p>
 <pre class="programlisting">
-build-project src ;
+build-project app ;
 </pre>
 <p>
 
-      which would cause the project in <tt class="filename">top/src/</tt>
-      to be built whenever the project in <tt class="filename">top/</tt> is
-      built. However, targets in <tt class="filename">top/util/foo/</tt>
+      which would cause the project in <code class="filename">top/app/</code>
+      to be built whenever the project in <code class="filename">top/</code> is
+      built. However, targets in <code class="filename">top/util/foo/</code>
       will be built only if they are needed by targets in
-      <tt class="filename">top/</tt> or <tt class="filename">top/src/</tt>.
+      <code class="filename">top/</code> or <code class="filename">top/app/</code>.
     </p>
 <div class="footnotes">
 <br><hr width="100" align="left">
-<div class="footnote"><a href="../reference/definitions.html#bbv2.reference.features.attributes" title="Feature Attributes"><sup>[<a name="ftn.id2534693" href="#id2534693">2</a>] </sup>the section called &#8220;Feature Attributes&#8221;</a></div>
+<div class="footnote"><p><sup>[<a name="ftn.id2570317" href="#id2570317">4</a>] </sup>Many
+      features will be overridden,
+      rather than added-to, in subprojects.  See <a href="../reference/definitions.html#bbv2.reference.features.attributes" title="Feature Attributes">the section called &#8220;Feature Attributes&#8221;</a> for more
+      information</p></div>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/tutorial/libs.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/tutorial/libs.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/tutorial/libs.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,46 +1,36 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Libraries and Dependent Targets</title>
+<title>Dependent Targets</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<style type="text/css">
-body { background-image: url('http://docbook.sourceforge.net/release/images/draft.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-       /* The following properties make the watermark "fixed" on the page. */
-       /* I think that's just a bit too distracting for the reader... */
-       /* background-attachment: fixed; */
-       /* background-position: center center; */
-     }</style>
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../tutorial.html" title="Chapter 3. Tutorial">
-<link rel="previous" href="hierarchy.html" title="Project Hierarchies">
-<link rel="next" href="depends.html" title="Library dependencies">
+<link rel="prev" href="hierarchy.html" title="Project Hierarchies">
+<link rel="next" href="testing.html" title="Testing">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="hierarchy.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="depends.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="hierarchy.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="testing.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.tutorial.libs"></a>Libraries and Dependent Targets</h2></div></div>
-<div></div>
-</div>
-<i><span class="comment">TODO: need to make this
-      section consistent with "examples-v2/libraries".</span></i><p>
-      Targets that are "needed" by other targets are called
-      <i class="firstterm">dependencies</i> of those other targets.  The
-      targets that need the other targets are called
-      <i class="firstterm">dependent</i> targets.
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.tutorial.libs"></a>Dependent Targets</h2></div></div></div>
+<p>
+      When a building a target <code class="filename">X</code> depends on first
+      building another target <code class="filename">Y</code> (such as a
+      library that must be linked with <em class="firstterm">X</em>),
+      <code class="filename">Y</code> is called a
+      <em class="firstterm">dependency</em> of <code class="filename">X</code> and
+      <code class="filename">X</code> is termed a
+      <em class="firstterm">dependent</em> of <code class="filename">Y</code>.
     </p>
 <p>To get a feeling of target dependencies, let's continue the
-      above example and see how <tt class="filename">src/Jamfile</tt> can
-      use libraries from <tt class="filename">util/foo</tt>.  Assume
-      util/foo/Jamfile contains:
+      above example and see how <code class="filename">top/app/Jamfile</code> can
+      use libraries from <code class="filename">top/util/foo</code>.  If
+      <code class="filename">top/util/foo/Jamfile</code> contains
 
 </p>
 <pre class="programlisting">
@@ -48,7 +38,8 @@
 </pre>
 <p>
 
-      Then, to use this library in <tt class="filename">src/Jamfile</tt>, we can write:
+      then to use this library in <code class="filename">top/app/Jamfile</code>, we can
+      write:
 
 </p>
 <pre class="programlisting">
@@ -56,35 +47,48 @@
 </pre>
 <p>
 
-      While <tt class="computeroutput">app.cpp</tt> refers to a regular source file,
-      <tt class="computeroutput">../util/foo//bar</tt> is a reference to another target:
-      a library "bar" declared in the <tt class="filename">Jamfile</tt> at
-      <tt class="filename">../util/foo</tt>.  When linking the
-      <b class="command">app</b> executable, the appropriate version of
-      <tt class="computeroutput">bar</tt> will be built and linked in. What do we mean by
-      "appropriate"? For example, suppose we build "app" with:
-
-</p>
+      While <code class="computeroutput">app.cpp</code> refers to a regular source file,
+      <code class="computeroutput">../util/foo//bar</code> is a reference to another target:
+      a library <code class="filename">bar</code> declared in the Jamfile at
+      <code class="filename">../util/foo</code>. 
+    </p>
+<div class="tip"><table border="0" summary="Tip">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../images/tip.png"></td>
+<th align="left">Tip</th>
+</tr>
+<tr><td align="left" valign="top"><p>Some other build system have special syntax for listing dependent
+      libraries, for example <code class="varname">LIBS</code> variable. In Boost.Build,
+      you just add the library to the list of sources.
+      </p></td></tr>
+</table></div>
+<p>Suppose we build <code class="filename">app</code> with:
+    </p>
 <pre class="screen">
-bjam app optimization=full cxxflags=-w-8080
-</pre>
+bjam app optimization=full define=USE_ASM
+    </pre>
 <p>
+    Which properties will be used to build <code class="computeroutput">foo</code>? The answer is
+    that some features are
+    <em class="firstterm">propagated</em>&#8212;Boost.Build attempts to use
+    dependencies with the same value of propagated features. The
+    <code class="varname">&lt;optimization&gt;</code> feature is propagated, so both
+    <code class="filename">app</code> and <code class="filename">foo</code> will be compiled
+    with full optimization. But <code class="varname">&lt;define&gt;</code> is not
+    propagated: its value will be added as-is to the compiler flags for
+    <code class="filename">a.cpp</code>, but won't affect <code class="filename">foo</code>.
+    </p>
+<p>Let's improve this project further.
+      The library
+      probably has some headers that must be used when compiling
+      <code class="filename">app.cpp</code>. We could manually add the necessary
+      <code class="computeroutput">#include</code> paths to <code class="filename">app</code>'s
+      requirements as values of the
+      <code class="varname">&lt;include&gt;</code> feature, but then this work will 
+      be repeated for all programs
+      that use <code class="filename">foo</code>. A better solution is to modify
+      <code class="filename">util/foo/Jamfile</code> in this way:
 
-      Which properties must be used to build <tt class="computeroutput">foo</tt>? The
-      answer is that some properties are
-      <i class="firstterm">propagated</i> &#8212; Boost.Build attempts to
-      use dependencies with the same value of propagated features. The
-      &lt;optimization&gt; feature is propagated, so both "app" and
-      "foo" will be compiled with full optimization. But
-      &lt;cxxflags&gt; feature is not propagated: its value will be
-      added as-is to compiler flags for "a.cpp", but won't affect
-      "foo". There is still a couple of problems. First, the library
-      probably has some headers which must be used when compiling
-      "app.cpp". We could use requirements on "app" to add those
-      includes, but then this work will be repeated for all programs
-      which use "foo". A better solution is to modify
-      util/foo/Jamfilie in this way:
-
 </p>
 <pre class="programlisting">
 project 
@@ -95,63 +99,67 @@
 </pre>
 <p>
 
-      Usage requirements are requirements which are applied to
-      dependents. In this case, &lt;include&gt; will be applied to all
-      targets which use "foo" &#8212; i.e. targets which have "foo"
-      either in sources or in dependency properties. You'd need to
-      specify usage requirements only once, and programs which use "foo"
-      don't have to care about include paths any longer. Or course, the
-      path will be interpreted relatively to "util/foo" and will be
-      adjusted according to the <b class="command">bjam</b>s invocation
-      directory. For
-      example, if building from project root, the final compiler's
-      command line will contain <tt class="option">-Ilib/foo</tt>.
+      Usage requirements are applied not to the target being declared
+      but to its
+      dependents. In this case, <code class="literal">&lt;include&gt;.</code> will be applied to all
+      targets that directly depend on <code class="filename">foo</code>.
     </p>
-<p>The second problem is that we hardcode the path to library's
-      Jamfile. Imagine it's hardcoded in 20 different places and we
-      change the directory layout. The solution is to use project ids
-      &#8212; symbolic names, not tied to directory layout. First, we
-      assign a project id to Jamfile in util/foo:</p>
+<p>Another improvement is using symbolic identifiers to refer to
+      the library, as opposed to <code class="filename">Jamfile</code> location.
+      In a large project, a library can be used by many targets, and if 
+      they all use <code class="filename">Jamfile</code> location,
+      a change in directory organization entails much work.
+      The solution is to use project ids&#8212;symbolic names
+      not tied to directory layout. First, we need to assign a project id by
+      adding this code to
+      <code class="filename">Jamroot</code>:</p>
 <pre class="programlisting">
-project foo
-    : usage-requirements &lt;include&gt;.
-    ;
-</pre>
-<p>
-      Second, we use the project id to refer to the library in
-      src/Jamfile:
+use-project /library-example/foo : util/foo ;
+      </pre>
+<p>Second, we modify <code class="filename">app/Jamfile</code> to use the
+      project id:
 
 </p>
 <pre class="programlisting">
-exe app : app.cpp /foo//bar ;
+exe app : app.cpp /library-example/foo//bar ;
 </pre>
 <p>
-
-      The "/foo//bar" syntax is used to refer to target "foo" in
-      project with global id "/foo" (the slash is used to specify global
-      id). This way, users of "foo" do not depend on its location, only
-      on id, which is supposedly stable. The only thing left, it to make
-      sure that src/Jamfile knows the project id that it uses. We add to
-      top/Jamfile the following line:
-
-</p>
+The <code class="filename">/library-example/foo//bar</code> syntax is used 
+      to refer to the target <code class="filename">bar</code> in
+      the project with id <code class="filename">/library-example/foo</code>.
+      We've achieved our goal&#8212;if the library is moved to a different
+      directory, only <code class="filename">Jamroot</code> must be modified.
+      Note that project ids are global&#8212;two Jamfiles are not
+      allowed to assign the same project id to different directories.
+           
+    </p>
+<div class="tip"><table border="0" summary="Tip">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../images/tip.png"></td>
+<th align="left">Tip</th>
+</tr>
+<tr><td align="left" valign="top">
+<p>If you want all applications in some project to link
+      to a certain library, you can avoid having to specify it directly the sources of every
+      target by using the
+      <code class="varname">&lt;source&gt;</code> property. For example, if <code class="filename">/boost/filesystem//fs</code>
+      should be linked to all applications in your project, you can add
+      <code class="computeroutput">&lt;source&gt;/boost/filesystem//fs</code> to the project's requirements, like this:</p>
 <pre class="programlisting">
-use-project /foo : util/foo ;
-</pre>
-<p>
-
-      Now, all projects can refer to "foo" using the symbolic
-      name. If the library is moved somewhere, only a single line in the
-      top-level Jamfile should be changed.
-    </p>
+project 
+   : requirements &lt;source&gt;/boost/filesystem//fs
+   ;   
+      </pre>
+</td></tr>
+</table></div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="hierarchy.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="depends.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="hierarchy.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="testing.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/tutorial/linkage.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/tutorial/linkage.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/tutorial/linkage.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,132 +3,145 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Static and shared libaries</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<style type="text/css">
-body { background-image: url('http://docbook.sourceforge.net/release/images/draft.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-       /* The following properties make the watermark "fixed" on the page. */
-       /* I think that's just a bit too distracting for the reader... */
-       /* background-attachment: fixed; */
-       /* background-position: center center; */
-     }</style>
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../tutorial.html" title="Chapter 3. Tutorial">
-<link rel="previous" href="depends.html" title="Library dependencies">
+<link rel="prev" href="testing.html" title="Testing">
 <link rel="next" href="conditions.html" title="Conditions and alternatives">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="depends.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="conditions.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="testing.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="conditions.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.tutorial.linkage"></a>Static and shared libaries</h2></div></div>
-<div></div>
-</div>
-<p>While the
-      previous section explained how to create and use libraries, it
-      omitted one important detail. Libraries can be either
-      <span class="emphasis"><em>static</em></span>, which means they are included in executable
-      files which use them, or <span class="emphasis"><em>shared</em></span> (a.k.a.
-      <span class="emphasis"><em>dynamic</em></span>), which are only referred to from executables,
-      and must be available at run time. Boost.Build can work with both
-      types. By default, all libraries are shared. This is much more
-      efficient in build time and space. But the need to install all
-      libraries to some location is not always convenient, especially
-      for debug builds. Also, if the installed shared library changes,
-      all application which use it might start to behave differently.
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.tutorial.linkage"></a>Static and shared libaries</h2></div></div></div>
+<p>Libraries can be either
+    <span class="emphasis"><em>static</em></span>, which means they are included in executable
+    files that use them, or <span class="emphasis"><em>shared</em></span> (a.k.a.
+    <span class="emphasis"><em>dynamic</em></span>), which are only referred to from executables,
+    and must be available at run time. Boost.Build can create and use both kinds.
     </p>
-<p>Static libraries do not suffer from these problems, but
-      considerably increase the size of application. Before describing
-      static libraries, it's reasonable to give another, quite simple
-      approach. If your project is built with
-      &lt;hardcode-dll-paths&gt;true property, then the application
-      will include the full paths for all shared libraries, eliminating
-      the above problems. Unfortunately, you no longer can move shared
-      library to a different location, which makes this option suitable
-      only for debug builds. Further, only gcc compiler supports this
-      option.</p>
-<p>Building a library statically is easy. You'd need to change
-      the value of &lt;link&gt; feature from it's deafault value
-      <tt class="literal">shared</tt>, to <tt class="literal">static</tt>. So, to build everything as
-      static libraries, you'd say</p>
+<p>The kind of library produced from a <code class="computeroutput">lib</code> target is
+    determined by the value of the <code class="varname">link</code> feature. Default
+    value is <code class="literal">shared</code>, and to build static library, the value
+    should be <code class="literal">static</code>. You can either requiest static build
+    on the command line:
+    </p>
 <pre class="screen">
 bjam link=static
-</pre>
+    </pre>
 <p>
-      on the command line. The linking mode can be fine-tuned on
-      per-target basis.
-
-      </p>
-<div class="orderedlist"><ol type="1">
-<li>
-<p>
-            Suppose your library can be only build statically. This is
-            easily achieved using requirements:
-
-</p>
+    or in the library's requirements:    
+    </p>
 <pre class="programlisting">
 lib l : l.cpp : &lt;link&gt;static ;
-</pre>
-</li>
-<li>
+    </pre>
 <p>
-            What if library can be both static and shared, but when
-            using it in specific executable, you want it static?
-            <a href="../../">Target
-              references</a> are here to help:
+    </p>
+<p>
+      We can also use the <code class="varname">&lt;link&gt;</code> property
+      to express linking requirements on a per-target basis.  
+      For example, if a particular executable can be correctly built
+      only with the static version of a library, we can qualify the
+      executable's <a href="../reference/definitions.html#bbv2.reference.targets.references">target
+      reference</a> to the library as follows:
 
-</p>
+
+
+    </p>
 <pre class="programlisting">
-exe important : main.cpp helpers/&lt;link&gt;static ;
-</pre>
-</li>
-<li>
+exe important : main.cpp helpers/&lt;link&gt;static ;</pre>
 <p>
-            What if the library is defined in some other project, which
-            you cannot change. But still, you want static linking to that
-            library in all cases. You can use target references everywhere:
 
-</p>
+    No matter what arguments are specified on the <span><strong class="command">bjam</strong></span>
+    command line, <code class="filename">important</code> will only be linked with
+    the static version of <code class="filename">helpers</code>.
+    </p>
+<p>
+        Specifying properties in target references is especially useful if you
+        use a library defined in some other project (one you can't
+        change) but you still want static (or dynamic) linking to that library
+        in all cases. If that library is used by many targets,
+        you <span class="emphasis"><em>could</em></span> use target references
+        everywhere:
+
+        </p>
 <pre class="programlisting">
 exe e1 : e1.cpp /other_project//bar/&lt;link&gt;static ;
-exe e10 : e10.cpp /other_project//bar/&lt;link&gt;static ;
-</pre>
+exe e10 : e10.cpp /other_project//bar/&lt;link&gt;static ;</pre>
 <p>
 
-            but that's far from being convenient. Another way is to
-            introduce a level of indirection: create a local target, which will
-            refer to static version of <tt class="filename">foo</tt>. Here's the
-            solution:
+        but that's far from being convenient. A better approach is
+        to introduce a level of indirection.  Create a local
+        <span class="type">alias</span> target that refers to the static (or
+        dynamic) version of <code class="filename">foo</code>:
 
-</p>
+        </p>
 <pre class="programlisting">
 alias foo : /other_project//bar/&lt;link&gt;static ;
 exe e1 : e1.cpp foo ;
-exe e10 : e10.cpp foo ;
-</pre>
+exe e10 : e10.cpp foo ;</pre>
 <p>
 
-            Note that the <a href="../advanced/builtins/targets.html#bbv2.builtins.alias" title="Alias">alias</a> 
-            rule is specifically used for rename a reference to a target and possibly
-            change the properties.
-
+        The <a href="../advanced/builtins/targets.html#bbv2.builtins.alias" title="Alias"><code class="computeroutput">alias</code></a> 
+        rule is specifically used to rename a reference to a target and possibly
+        change the properties.
+        
+        
+      </p>
+<div class="tip"><table border="0" summary="Tip">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../images/tip.png"></td>
+<th align="left">Tip</th>
+</tr>
+<tr><td align="left" valign="top">
+<p>
+          When one library uses another, you put the second library in
+          the source list of the first. For example:
           </p>
-</li>
-</ol></div>
+<pre class="programlisting">
+lib utils : utils.cpp /boost/filesystem//fs ;   
+lib core : core.cpp utils ;
+exe app : app.cpp core ;</pre>
+<p>
+          This works no matter what kind of linking is used. When 
+          <code class="filename">core</code> is built as a shared library, it is linked
+          directly into <code class="filename">utils</code>. Static libraries can't
+          link to other libraries, so when <code class="filename">core</code> is built
+          as a static library, its dependency on <code class="filename">utils</code> is passed along to
+          <code class="filename">core</code>'s dependents, causing
+          <code class="filename">app</code> to be linked with both
+          <code class="filename">core</code> and <code class="filename">utils</code>.
+        </p>
+</td></tr>
+</table></div>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>(Note for non-UNIX system). Typically, shared libraries must be
+        installed to a directory in the dynamic linker's search
+        path. Otherwise, applications that use shared libraries can't be
+        started. On Windows, the dynamic linker's search path is given by the
+        <code class="envar">PATH</code> environment variable. This restriction is lifted
+        when you use Boost.Build testing facilities&#8212;the
+        <code class="envar">PATH</code> variable will be automatically adjusted before
+        running executable.
+        
+        </p></td></tr>
+</table></div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="depends.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="conditions.html"><img src="../../images/next.png" alt="Next"></a>
+<a accesskey="p" href="testing.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="conditions.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/tutorial/prebuilt.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/tutorial/prebuilt.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/tutorial/prebuilt.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,43 +3,30 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Prebuilt targets</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<style type="text/css">
-body { background-image: url('http://docbook.sourceforge.net/release/images/draft.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-       /* The following properties make the watermark "fixed" on the page. */
-       /* I think that's just a bit too distracting for the reader... */
-       /* background-attachment: fixed; */
-       /* background-position: center center; */
-     }</style>
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../tutorial.html" title="Chapter 3. Tutorial">
-<link rel="previous" href="conditions.html" title="Conditions and alternatives">
+<link rel="prev" href="conditions.html" title="Conditions and alternatives">
 <link rel="next" href="../advanced.html" title="Chapter 4. User documentation">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="conditions.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../advanced.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.tutorial.prebuilt"></a>Prebuilt targets</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.tutorial.prebuilt"></a>Prebuilt targets</h2></div></div></div>
 <p>
-      We've just learned how to use libraries which are created by
-      Boost.Build. But some libraries are not. At the same time, those
-      libraries can have different versions (release and debug, for
-      example), that we
-      should select depending on build properties. Prebuilt targets
-      provide a mechanism for that. Jamfile in util/lib2 can contain:
-
+      To link to libraries whose build instructions aren't given in a Jamfile,
+      you need to create <code class="computeroutput">lib</code> targets with an appropriate
+      <code class="varname">file</code> property.  Target alternatives can be used to
+      associate multiple library files with a single conceptual target. For
+      example:
 </p>
 <pre class="programlisting">
+# util/lib2/Jamfile
 lib lib2
     : 
     : &lt;file&gt;lib2_release.a &lt;variant&gt;release
@@ -52,11 +39,13 @@
 </pre>
 <p>
 
-      This defines two alternatives for target "lib2", and for each
-      one names a prebuilt file. Naturally, there are no sources.
-      Instead, the &lt;file&gt; feature is used to specify the file name.
-      Which alternative is selected depends on properties of dependents.
-      If "app" binary should use "lib2", we can write:
+      This example defines two alternatives for <code class="filename">lib2</code>, and
+      for each one names a prebuilt file.  Naturally, there are no sources.
+      Instead, the <code class="varname">&lt;file&gt;</code> feature is used to specify
+      the file name.
+    </p>
+<p>
+      Once a prebuilt target has been declared, it can be used just like any other target:
 
 </p>
 <pre class="programlisting">
@@ -64,45 +53,53 @@
 </pre>
 <p>
 
-      If we build release version of "app", then it will be linked
-      with "lib2_release.a", and debug version will use "lib2_debug.a".
-      Another important kind of prebuilt targets are system libraries
-      &#8212; more specifically, libraries which are automatically found
-      by the compiler. E.g. gcc uses "-l" switch for that. Such libraries
-      should be declared almost like regular ones:
+      As with any target, the alternative selected depends on the
+      properties propagated from <code class="filename">lib2</code>'s dependents.
+      If we build the the release and debug versions of <code class="filename">app</code> will be linked
+      with <code class="filename">lib2_release.a</code> and <code class="filename">lib2_debug.a</code>, respectively.  
 
+    </p>
+<p>
+      System libraries&#8212;those that are automatically found by
+      the toolset by searching through some set of predetermined
+      paths&#8212;should be declared almost like regular ones:
+
 </p>
 <pre class="programlisting">
-lib zlib : : &lt;name&gt;z ;
+lib pythonlib : : &lt;name&gt;python22 ;
 </pre>
 <p>
 
-      We again don't specify any sources, but give a name which
-      should be passed to the compiler. In this example, and for gcc
-      compiler, the "-lz" option will be added. Paths where library
-      should be searched can also be specified:
+      We again don't specify any sources, but give a
+      <code class="varname">name</code> that should be passed to the
+      compiler. If the gcc toolset were used to link an executable
+      target to <code class="filename">pythonlib</code>, <code class="option">-lpython22</code>
+      would appear in the command line (other compilers may use
+      different options). 
+    </p>
+<p>
+      We can also specify where the toolset should look for the library:
 
 </p>
 <pre class="programlisting">
-lib zlib : : &lt;name&gt;z &lt;search&gt;/opt/lib ;
+lib pythonlib : : &lt;name&gt;python22 &lt;search&gt;/opt/lib ;
 </pre>
 <p>
 
-      And, of course, two variants can be used:
+      And, of course, target alternatives can be used in the usual way:
 
 </p>
 <pre class="programlisting">
-lib zlib : : &lt;name&gt;z &lt;variant&gt;release ;
-lib zlib : : &lt;name&gt;z_d &lt;variant&gt;debug ;
+lib pythonlib : : &lt;name&gt;python22 &lt;variant&gt;release ;
+lib pythonlib : : &lt;name&gt;python22_d &lt;variant&gt;debug ;
 </pre>
 <p>
 
-      Of course, you'll probably never in your life need debug
-      version of zlib, but for other libraries this is quite reasonable.
     </p>
-<p>More advanced use of prebuilt target is described in <a href="doc/recipes.html#site_config_targets" target="_top">recipes</a>.</p>
+<p>A more advanced use of prebuilt targets is described in <a href="../recipies/site-config.html" title="Targets in site-config.jam">the section called &#8220;Targets in site-config.jam&#8221;</a>.    
+    </p>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/tutorial/properties.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/tutorial/properties.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/tutorial/properties.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,137 +3,137 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Properties</title>
 <link rel="stylesheet" href="../../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<style type="text/css">
-body { background-image: url('http://docbook.sourceforge.net/release/images/draft.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-       /* The following properties make the watermark "fixed" on the page. */
-       /* I think that's just a bit too distracting for the reader... */
-       /* background-attachment: fixed; */
-       /* background-position: center center; */
-     }</style>
-<link rel="home" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../tutorial.html" title="Chapter 3. Tutorial">
-<link rel="previous" href="../tutorial.html" title="Chapter 3. Tutorial">
+<link rel="prev" href="../tutorial.html" title="Chapter 3. Tutorial">
 <link rel="next" href="hierarchy.html" title="Project Hierarchies">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="../tutorial.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="hierarchy.html"><img src="../../images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.tutorial.properties"></a>Properties</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.tutorial.properties"></a>Properties</h2></div></div></div>
 <div class="toc"><dl>
-<dt><a href="properties.html#bbv2.tutorial.properties.requirements">Build Requests and Target Requirements</a></dt>
-<dt><a href="properties.html#bbv2.tutorial.properties.project_attributes">Project Attributes</a></dt>
+<dt><span class="section"><a href="properties.html#bbv2.tutorial.properties.requirements">Build Requests and Target Requirements</a></span></dt>
+<dt><span class="section"><a href="properties.html#bbv2.tutorial.properties.project_attributes">Project Attributes</a></span></dt>
 </dl></div>
 <p>
       To portably represent aspects of target configuration such as
       debug and release variants, or single- and multi-threaded
-      builds, Boost.Build uses <i class="firstterm">features</i> with
-      associated <i class="firstterm">values</i>.  For
-      example, the "debug-symbols" feature can have a value of "on" or
-      "off".  A <i class="firstterm">property</i> is just a (feature,
+      builds, Boost.Build uses <em class="firstterm">features</em> with
+      associated <em class="firstterm">values</em>.  For
+      example, the <code class="computeroutput">debug-symbols</code> feature can have a value of <code class="computeroutput">on</code> or
+      <code class="computeroutput">off</code>.  A <em class="firstterm">property</em> is just a (feature,
       value) pair.  When a user initiates a build, Boost.Build
       automatically translates the requested properties into appropriate
       command-line flags for invoking toolset components like compilers
       and linkers.</p>
 <p>There are many built-in features that can be combined to
       produce arbitrary build configurations.  The following command
-      builds the project's "release" variant with inlining
+      builds the project's <code class="computeroutput">release</code> variant with inlining
       disabled and debug symbols enabled:
 
 </p>
 <pre class="screen">
 bjam release inlining=off debug-symbols=on
 </pre>
+<p>
+</p>
 <p>Properties on the command-line are specified with the syntax:
 
 </p>
-<pre class="screen"><i class="replaceable"><tt>feature-name</tt></i>=<i class="replaceable"><tt>feature-value</tt></i></pre>
-<p>The "release" and "debug" that we've seen
-      in <b class="command">bjam</b> invocations are just a shorthand way to
-      specify values of the "variant" feature.  For example, the command
+<pre class="screen">
+<em class="replaceable"><code>feature-name</code></em>=<em class="replaceable"><code>feature-value</code></em>
+</pre>
+<p>
+</p>
+<p>The <code class="option">release</code> and <code class="option">debug</code> that we've seen
+      in <span><strong class="command">bjam</strong></span> invocations are just a shorthand way to
+      specify values of the <code class="varname">variant</code> feature.  For example, the command
       above could also have been written this way:
 
       </p>
 <pre class="screen">
 bjam variant=release inlining=off debug-symbols=on
       </pre>
-<p>  "variant" is so commonly-used that it has been given
-      special status as an <i class="firstterm">implicit</i> feature
-      &#8212; Boost.Build will deduce the its identity just from the name
-      of one of its values.  
+<p>
     </p>
+<p> <code class="varname">variant</code> is so commonly-used that it has
+      been given special status as an <em class="firstterm">implicit</em>
+      feature&#8212;Boost.Build will deduce the its identity just
+      from the name of one of its values.
+    </p>
 <p>
-      A complete description of features can be found
-      <a href="../reference/definitions.html#bbv2.reference.features" title="Features and properties">here</a>. 
+      A complete description of features can be found in <a href="../reference/definitions.html#bbv2.reference.features" title="Features and properties">the section called &#8220;Features and properties&#8221;</a>.
     </p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.tutorial.properties.requirements"></a>Build Requests and Target Requirements</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.tutorial.properties.requirements"></a>Build Requests and Target Requirements</h3></div></div></div>
 <p>      
-        The set of properties specified in the command line constitute a
-        <i class="firstterm">build request</i> &#8212; a description of
+        The set of properties specified on the command line constitute
+        a <em class="firstterm">build request</em>&#8212;a description of
         the desired properties for building the requested targets (or,
         if no targets were explicitly requested, the project in the
-        current directory).  The <span class="emphasis"><em>actual</em></span> properties
-        used for building targets is typically a combination of the
-        build request and properties derived from the
-        project's <tt class="filename">Jamfile</tt>s.  For example, the
-        locations of <tt class="computeroutput">#include</tt>d header files are normally
-        not specified on the command-line, but described
-        in <tt class="filename">Jamfile</tt>s as <i class="firstterm">target
-          requirements</i> and automatically combined with the
+        current directory).  The <span class="emphasis"><em>actual</em></span>
+        properties used for building targets are typically a
+        combination of the build request and properties derived from
+        the project's <code class="filename">Jamroot</code> (and its other
+        Jamfiles, as described in <a href="hierarchy.html" title="Project Hierarchies">the section called &#8220;Project Hierarchies&#8221;</a>).  For example, the
+        locations of <code class="computeroutput">#include</code>d header files are normally
+        not specified on the command-line, but described in
+        Jamfiles as <em class="firstterm">target
+        requirements</em> and automatically combined with the
         build request for those targets.  Multithread-enabled
-        compilation is another example of a typical target requirement.
-        The <tt class="filename">Jamfile</tt> fragment below illustrates how
-        these requirements might be specified.
+        compilation is another example of a typical target
+        requirement.  The Jamfile fragment below
+        illustrates how these requirements might be specified.
       </p>
 <pre class="programlisting">
 exe hello 
     : hello.cpp
-    : &lt;include&gt;/home/ghost/Work/boost &lt;threading&gt;multi
+    : &lt;include&gt;boost &lt;threading&gt;multi
     ;
 </pre>
 <p> 
-        When <tt class="filename">hello</tt> is built, the two
-        requirements specified above will normally always be present.
-        If the build request given on the <b class="command">bjam</b>
+        When <code class="filename">hello</code> is built, the two
+        requirements specified above will always be present. 
+        If the build request given on the <span><strong class="command">bjam</strong></span>
         command-line explictly contradicts a target's requirements,
-        the command-line usually overrides (or, in the case of
-        "free" feautures like <tt class="computeroutput">&lt;include&gt;</tt><sup>[<a name="id2473668" href="#ftn.id2473668">1</a>]</sup>,
-        augments) the target requirements.  However, when a
-        contradiction of a target's requrements involves certain
-        <i class="firstterm">link-incompatible</i> features, the target
-        will be skipped.  See ??? for more information.
+        the target requirements usually override (or, in the case of
+        &#8220;free&#8221;&#8221; features like
+        <code class="varname">&lt;include&gt;</code>,
+        <sup>[<a name="id2523321" href="#ftn.id2523321">3</a>]</sup>
+        augments) the build request.
+
       </p>
+<div class="tip"><table border="0" summary="Tip">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../images/tip.png"></td>
+<th align="left">Tip</th>
+</tr>
+<tr><td align="left" valign="top"><p>The value of the <code class="varname">&lt;include&gt;</code> feature is
+          relative to the location of <code class="filename">Jamroot</code> where it's
+          used. 
+        </p></td></tr>
+</table></div>
 </div>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h3 class="title">
-<a name="bbv2.tutorial.properties.project_attributes"></a>Project Attributes</h3></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bbv2.tutorial.properties.project_attributes"></a>Project Attributes</h3></div></div></div>
 <p>
         If we want the same requirements for our other
-        target, <tt class="filename">hello2</tt>, we could simply duplicate
+        target, <code class="filename">hello2</code>, we could simply duplicate
         them.  However, as projects grow, that approach leads to a great
         deal of repeated boilerplate in Jamfiles.
         
-        Fortunately, there's a better way. Each project (i.e. each
-        <tt class="filename">Jamfile</tt>), can specify a set of <i class="firstterm">attributes</i>,
-        including requirements:
+        Fortunately, there's a better way. Each project can specify a
+        set of <em class="firstterm">attributes</em>, including
+        requirements:
 
 </p>
 <pre class="programlisting">
@@ -147,15 +147,17 @@
 <p>
 
         The effect would be as if we specified the same requirement for
-        both <b class="command">hello</b> and <b class="command">hello2</b>.
+        both <code class="filename">hello</code> and <code class="filename">hello2</code>.
       </p>
 </div>
 <div class="footnotes">
 <br><hr width="100" align="left">
-<div class="footnote"><a href="../reference/definitions.html#bbv2.reference.features.attributes" title="Feature Attributes"><sup>[<a name="ftn.id2473668" href="#id2473668">1</a>] </sup>the section called &#8220;Feature Attributes&#8221;</a></div>
+<div class="footnote"><p><sup>[<a name="ftn.id2523321" href="#id2523321">3</a>] </sup>
+See <a href="../reference/definitions.html#bbv2.reference.features.attributes" title="Feature Attributes">the section called &#8220;Feature Attributes&#8221;</a>
+</p></div>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Added: boost-build/branches/upstream/current/doc/html/bbv2/tutorial/testing.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/tutorial/testing.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/tutorial/testing.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,29 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Testing</title>
+<link rel="stylesheet" href="../../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../tutorial.html" title="Chapter 3. Tutorial">
+<link rel="prev" href="libs.html" title="Dependent Targets">
+<link rel="next" href="linkage.html" title="Static and shared libaries">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="libs.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="linkage.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.tutorial.testing"></a>Testing</h2></div></div></div></div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="libs.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="linkage.html"><img src="../../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Modified: boost-build/branches/upstream/current/doc/html/bbv2/tutorial.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/bbv2/tutorial.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/bbv2/tutorial.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,56 +3,45 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Chapter 3. Tutorial</title>
 <link rel="stylesheet" href="../boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<style type="text/css">
-body { background-image: url('http://docbook.sourceforge.net/release/images/draft.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-       /* The following properties make the watermark "fixed" on the page. */
-       /* I think that's just a bit too distracting for the reader... */
-       /* background-attachment: fixed; */
-       /* background-position: center center; */
-     }</style>
-<link rel="home" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="up" href="../index.html" title="Part I. Boost.Build v2 User Manual">
-<link rel="previous" href="installation.html" title="Chapter 2. Installation">
+<link rel="prev" href="installation.html" title="Chapter 2. Installation">
 <link rel="next" href="tutorial/properties.html" title="Properties">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav">
 <a accesskey="p" href="installation.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="tutorial/properties.html"><img src="../images/next.png" alt="Next"></a>
 </div>
 <div class="chapter" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title">
-<a name="bbv2.tutorial"></a>Chapter 3. Tutorial</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title">
+<a name="bbv2.tutorial"></a>Chapter 3. Tutorial</h2></div></div></div>
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl>
-<dt><a href="tutorial.html#bbv2.tutorial.hello">Hello, world</a></dt>
-<dt><a href="tutorial/properties.html">Properties</a></dt>
-<dt><a href="tutorial/hierarchy.html">Project Hierarchies</a></dt>
-<dt><a href="tutorial/libs.html">Libraries and Dependent Targets</a></dt>
-<dt><a href="tutorial/depends.html">Library dependencies</a></dt>
-<dt><a href="tutorial/linkage.html">Static and shared libaries</a></dt>
-<dt><a href="tutorial/conditions.html">Conditions and alternatives</a></dt>
-<dt><a href="tutorial/prebuilt.html">Prebuilt targets</a></dt>
+<dt><span class="section"><a href="tutorial.html#bbv2.tutorial.hello">Hello, world</a></span></dt>
+<dt><span class="section"><a href="tutorial/properties.html">Properties</a></span></dt>
+<dt><span class="section"><a href="tutorial/hierarchy.html">Project Hierarchies</a></span></dt>
+<dt><span class="section"><a href="tutorial/libs.html">Dependent Targets</a></span></dt>
+<dt><span class="section"><a href="tutorial/testing.html">Testing</a></span></dt>
+<dt><span class="section"><a href="tutorial/linkage.html">Static and shared libaries</a></span></dt>
+<dt><span class="section"><a href="tutorial/conditions.html">Conditions and alternatives</a></span></dt>
+<dt><span class="section"><a href="tutorial/prebuilt.html">Prebuilt targets</a></span></dt>
 </dl>
 </div>
+<p>This section will guide you though the most basic features of
+  Boost.Build V2. We will start with the &#8220;Hello, world&#8221; example,
+  learn how to use libraries, and finish with testing and installing features.  
+  </p>
 <div class="section" lang="en">
-<div class="titlepage">
-<div><div><h2 class="title" style="clear: both">
-<a name="bbv2.tutorial.hello"></a>Hello, world</h2></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bbv2.tutorial.hello"></a>Hello, world</h2></div></div></div>
 <p>The simplest project that Boost.Build can construct is
-      stored in <tt class="filename">example/hello/</tt> directory. The
+      stored in <code class="filename">example/hello/</code> directory. The
       project is described by a file
-      called <tt class="filename">Jamfile</tt> that contains:
+      called <code class="filename">Jamroot</code> that contains:
 
 </p>
 <pre class="programlisting">
@@ -61,11 +50,12 @@
 <p>
 
       Even with this simple setup, you can do some interesting
-      things. First of all, just invoking <b class="command">bjam</b> will
-      build the debug variant of the <b class="command">hello</b>
+      things. First of all, just invoking <span><strong class="command">bjam</strong></span> will
+      build the <code class="filename">hello</code>
       executable by compiling and
-      linking <tt class="filename">hello.cpp</tt>.  Now, to build the
-      release variant of <b class="command">hello</b>, invoke
+      linking <code class="filename">hello.cpp</code>. By default, debug variant 
+      is built. Now, to build the
+      release variant of <code class="filename">hello</code>, invoke 
 
 </p>
 <pre class="screen">
@@ -75,9 +65,9 @@
 
       Note that debug and release variants are created in different
       directories, so you can switch between variants or even build
-      multiple variants at once, without any unneccessary
+      multiple variants at once, without any unnecessary
       recompilation. Let's extend the example by adding another line
-      to our project's <tt class="filename">Jamfile</tt>:
+      to our project's <code class="filename">Jamroot</code>:
 
 </p>
 <pre class="programlisting">
@@ -85,8 +75,8 @@
 </pre>
 <p>
 
-      Now we can build both the debug and release variants of our
-      project:
+      Now let us build both the debug and release variants of our project
+      again:
 
 </p>
 <pre class="screen">
@@ -94,11 +84,11 @@
 </pre>
 <p>
 
-      Note that two variants of <b class="command">hello2</b> are linked.
+      Note that two variants of <code class="filename">hello2</code> are linked.
       Since we have already built both variants
-      of <b class="command">hello</b>, hello.cpp won't be recompiled;
+      of <code class="filename">hello</code>, hello.cpp won't be recompiled;
       instead the existing object files will just be linked into the
-      corresponding variants of <b class="command">hello2</b>. Now 
+      corresponding variants of <code class="filename">hello2</code>. Now 
       let's remove all the built products:
 
 </p>
@@ -109,16 +99,18 @@
 
       It's also possible to build or clean specific targets.  The
       following two commands, respectively, build or clean only the
-      debug version of <b class="command">hello2</b>.
+      debug version of <code class="filename">hello2</code>.
 
 </p>
 <pre class="screen">
 bjam hello2
 bjam --clean hello2
 </pre>
+<p>
+    </p>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<table width="100%"><tr>
 <td align="left"></td>
 <td align="right"><small></small></td>
 </tr></table>

Modified: boost-build/branches/upstream/current/doc/html/boostbook.css
===================================================================
--- boost-build/branches/upstream/current/doc/html/boostbook.css	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/boostbook.css	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,331 +1,511 @@
-/*=============================================================================
-    Copyright (c) 2002 2004 Joel de Guzman
-    http://spirit.sourceforge.net/
-
-    Use, modification and distribution is subject to the Boost Software
-    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-    http://www.boost.org/LICENSE_1_0.txt)
-=============================================================================*/
-
-/* CSS based on w3c documentation which I like a lot, and the classic Spirit
-documentation. */
-
-/* Body defaults */
-body 
-{
-    padding: 2em 1em 2em 1em;
-    margin: 1em 1em 1em 1em;
-    font-family: sans-serif;
-}
-
-/* Paragraphs */
-p 
-{
-    text-align: justify;
-}
-
-pre.synopsis
-{
-    margin: 1pc 4% 0pc 4%;
-    padding: 0.5pc 0.5pc 0.5pc 0.5pc;
-}
-
-/* Headings */
-h1, h2, h3, h4, h5, h6 { text-align: left; margin-top: 2pc; }
-h1 { font: 170% sans-serif }
-h2 { font: bold 140% sans-serif }
-h3 { font: 120% sans-serif }
-h4 { font: bold 100% sans-serif }
-h5 { font: italic 100% sans-serif }
-h6 { font: italic 100% sans-serif }
-
-/* Unordered lists */
-ul 
-{
-    text-align: justify;
-}
-
-/* Links */
-a
-{
-    text-decoration: none; /* no underline */
-}
-
-a:hover
-{
-    text-decoration: underline;
-}
-
-/* Top page title */
-title, h1.title, h2.title, h3.title,
-       h4.title, h5.title, h6.title,
-       .refentrytitle
-{
-    font-weight:   bold;
-    font-size:     2pc;
-    margin-bottom: 1pc;
-}
-
-/* Spirit style navigation */
-.spirit-nav
-{
-    text-align: right;
-}
-
-.spirit-nav a
-{
-    color: white;
-    padding-left: 0.5em;
-}
-
-.spirit-nav img
-{
-    border-width: 0px;
-}
-
-/* Program listing box */
-.programlisting, .screen
-{
-    display: block;
-    margin-left:  4%;
-    margin-right: 4%;
-    padding: 0.5pc 0.5pc 0.5pc 0.5pc;
-}
-
-/* Table of contents */
-.toc
-{
-   margin: 1pc 4% 0pc 4%;
-   padding: 0.5pc 0.5pc 0.5pc 0.5pc;
-}
-
-.boost-toc
-{
-   float:   right;
-   padding: 0.5pc;
-}
-
-/* Tables */
-.table-title, div.table p.title
-{
-    margin-left: 4%;
-    padding-right: 0.5em; 
-    padding-left: 0.5em;
-    font-size: 120%;
-}
-
-.informaltable table, .table table
-{
-    width: 92%;
-    margin-left: 4%;
-    margin-right: 4%;
-}
-
-div.informaltable table, div.table table
-{
-    padding: 4px 4px 4px 4px;
-}
-
-div.informaltable table tr td, div.table table tr td
-{
-    padding: 0.5em 0.5em 0.5em 0.5em;
-    text-align: justify;
-}
-
-div.informaltable table tr th, div.table table tr th
-{
-    padding: 0.5em 0.5em 0.5em 0.5em;
-    border: 1pt solid white;
-}
-
-/* inlined images */
-.inlinemediaobject
-{
-    padding: 0.5em 0.5em 0.5em 0.5em;
-}
-
-/* tone down the title of Parameter lists */
-div.variablelist p.title
-{
-    font-weight: bold;
-    font-size: 100%;
-    text-align: left;
-}
-
-/* tabularize parameter lists */
-div.variablelist dl dt
-{
-    float: left;
-    clear: left;
-    display: block;
-    font-style: italic;
-}
-
-div.variablelist dl dd
-{
-    display: block;
-    clear:   right;
-    padding-left: 8pc;
-}
-
-/* title of books and articles in bibliographies */
-span.title
-{
-    font-style: italic;
-}
-
-div.tip, div.note, div.warning
-{
-    padding: 0.5em 0.5em 0.5em 0.5em;
-    border: 1pt solid white;
-}
-
-div.tip .title, div.note .title, div.warning .title
-{
-    font: bold 100% sans-serif;
-    margin-top: 0pc;
-}
-
-div.tip .title:before
-{
-    content: url(images/tip.png) " ";
-}
-
-div.note .title:before
-{
-    content: url(images/note.png) " ";
-}
-
-div.warning .title:before
-{
-    content: url(images/caution.png) " ";
-}
-
- at media screen
-{
-    a
-    {
-        color: #005a9c;
-    }
-
-    a:visited
-    {
-        color: #9c5a9c;
-    }
-
-    /* Syntax Highlighting */
-    .keyword        { color: #0000AA; font-weight: bold; }
-    .identifier     {}
-    .special        { color: #707070; }
-    .preprocessor   { color: #402080; font-weight: bold; }
-    .char           { color: teal; }
-    .comment        { color: #800000; }
-    .string         { color: teal; }
-    .number         { color: teal; }
-    .copyright      { color: #666666; font-size: small; }
-    .white_bkd      { background-color: #FFFFFF; }
-    .dk_grey_bkd    { background-color: #999999; }
-
-    pre.synopsis
-    {
-        background-color: #f3f3f3;
-    }
-
-    .programlisting, .screen
-    {
-        background-color: #f3f3f3;
-    }
-
-    /* Table of contents */
-    .toc
-    {
-        background-color: #f3f3f3;
-    }
-
-    div.informaltable table tr td, div.table table tr td
-    {
-        background-color: #F3F3F3;
-        border: 1pt solid white;
-    }
-
-    div.informaltable table tr th, div.table table tr th
-    {
-        background-color: #e4e4e4;
-    }
-
-    div.tip, div.note, div.warning
-    {
-        background-color: #F3F3F3;
-    }
-
-    span.highlight
-    {
-        color: #00A000;
-    }
-}
-
- at media print
-{
-    a
-    {
-        color: black;
-    }
-
-    a:visited
-    {
-        color: black;
-    }
-
-    .spirit-nav
-    {
-        display: none;
-    }
-
-    /* Syntax Highlighting */
-    .keyword
-    {
-        font-weight: bold;
-    }
-
-    pre.synopsis
-    {
-        border: 1px solid gray;
-    }
-
-    .programlisting, .screen
-    {
-        border: 1px solid gray;
-    }
-
-    /* Table of contents */
-    .toc
-    {
-        border: 1px solid gray;
-    }
-
-    .informaltable table, .table table
-    {
-        border: 1px solid gray;
-        border-collapse: collapse;
-    }
-
-    div.informaltable table tr td, div.table table tr td
-    {
-        border: 1px solid gray;
-    }
-
-    div.informaltable table tr th, div.table table tr th
-    {
-        border: 1px solid gray;
-    }
-
-    div.tip, div.note, div.warning
-    {
-        border: 1px solid gray;
-    }
-
-    span.highlight
-    {
-        font-weight: bold;
-    }
-}
+/*=============================================================================
+    Copyright (c) 2004 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+/*=============================================================================
+    Body defaults
+=============================================================================*/
+
+    body 
+    {
+        margin: 1em;
+        font-family: sans-serif;
+    }
+
+/*=============================================================================
+    Paragraphs
+=============================================================================*/
+
+    p 
+    {
+        text-align: left;
+        font-size: 10pt; 
+        line-height: 1.15;
+    }
+
+/*=============================================================================
+    Program listings
+=============================================================================*/
+
+    /* Code on paragraphs */
+    p tt.computeroutput
+    {
+        font-size: 9pt;
+    }
+
+    pre.synopsis
+    {
+        font-size: 90%;
+        margin: 1pc 4% 0pc 4%;
+        padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+    }
+
+    .programlisting, 
+    .screen
+    {
+        font-size: 9pt;
+        display: block;
+        margin: 1pc 4% 0pc 4%;
+        padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+    }
+
+    /* Program listings in tables don't get borders */
+    td .programlisting, 
+    td .screen
+    {
+        margin: 0pc 0pc 0pc 0pc;
+        padding:  0pc 0pc 0pc 0pc;
+    }
+
+/*=============================================================================
+    Headings
+=============================================================================*/
+
+    h1, h2, h3, h4, h5, h6 
+    { 
+        text-align: left; 
+        margin: 1em 0em 0.5em 0em;
+        font-weight: bold;
+    }
+
+    h1 { font: 140% }
+    h2 { font: bold 140% }
+    h3 { font: bold 130% }
+    h4 { font: bold 120% }
+    h5 { font: italic 110% }
+    h6 { font: italic 100% }
+
+    /* Top page titles */
+    title, 
+    h1.title, 
+    h2.title
+    h3.title, 
+    h4.title, 
+    h5.title, 
+    h6.title, 
+    .refentrytitle
+    {
+        font-weight: bold;
+        margin-bottom: 1pc;
+    }
+
+    h1.title { font-size: 140% }
+    h2.title { font-size: 140% }
+    h3.title { font-size: 130% }
+    h4.title { font-size: 120% }
+    h5.title { font-size: 110% }
+    h6.title { font-size: 100% }
+
+    .section h1 
+    {
+        margin: 0em 0em 0.5em 0em;
+        font-size: 140%;
+    }
+
+    .section h2 { font-size: 140% }
+    .section h3 { font-size: 130% }
+    .section h4 { font-size: 120% }
+    .section h5 { font-size: 110% }
+    .section h6 { font-size: 100% }
+
+    /* Code on titles */
+    h1 tt.computeroutput { font-size: 140% }
+    h2 tt.computeroutput { font-size: 140% }
+    h3 tt.computeroutput { font-size: 130% }
+    h4 tt.computeroutput { font-size: 120% }
+    h5 tt.computeroutput { font-size: 110% }
+    h6 tt.computeroutput { font-size: 100% }
+
+/*=============================================================================
+    Author
+=============================================================================*/
+
+    h3.author 
+    { 
+        font-size: 100% 
+    }
+
+/*=============================================================================
+    Lists
+=============================================================================*/
+
+    li
+    {
+        font-size: 10pt;
+        line-height: 1.3;
+    }
+    
+    /* Unordered lists */
+    ul 
+    {
+        text-align: left;
+    }
+    
+    /* Ordered lists */
+    ol 
+    {
+        text-align: left;
+    }
+
+/*=============================================================================
+    Links
+=============================================================================*/
+
+    a
+    {
+        text-decoration: none; /* no underline */
+    }
+    
+    a:hover
+    {
+        text-decoration: underline;
+    }
+
+/*=============================================================================
+    Spirit style navigation
+=============================================================================*/
+
+    .spirit-nav
+    {
+        text-align: right;
+    }
+    
+    .spirit-nav a
+    {
+        color: white;
+        padding-left: 0.5em;
+    }
+    
+    .spirit-nav img
+    {
+        border-width: 0px;
+    }
+
+/*=============================================================================
+    Table of contents
+=============================================================================*/
+
+    .toc
+    {
+       margin: 1pc 4% 0pc 4%;
+       padding: 0.1pc 1pc 0.1pc 1pc;
+       font-size: 80%; 
+       line-height: 1.15;
+    }
+    
+    .boost-toc
+    {
+       float: right;
+       padding: 0.5pc;
+    }
+
+/*=============================================================================
+    Tables
+=============================================================================*/
+
+    .table-title, 
+    div.table p.title
+    {
+        margin-left: 4%;
+        padding-right: 0.5em; 
+        padding-left: 0.5em;
+    }
+    
+    .informaltable table, 
+    .table table
+    {
+        width: 92%;
+        margin-left: 4%;
+        margin-right: 4%;
+    }
+    
+    div.informaltable table, 
+    div.table table
+    {
+        padding: 4px;
+    }
+    
+    /* Table Cells */
+    div.informaltable table tr td, 
+    div.table table tr td
+    {
+        padding: 0.5em;
+        text-align: left;
+        font-size: 9pt;
+    }
+
+    div.informaltable table tr th, 
+    div.table table tr th
+    {
+        padding: 0.5em 0.5em 0.5em 0.5em;
+        border: 1pt solid white;
+        font-size: 80%;
+    }
+
+/*=============================================================================
+    Blurbs
+=============================================================================*/
+
+    div.note,
+    div.tip,
+    div.important,
+    div.caution,
+    div.warning,
+    p.blurb
+    {
+        font-size: 9pt; /* A little bit smaller than the main text */
+        line-height: 1.2;
+        display: block;
+        margin: 1pc 4% 0pc 4%;
+        padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+    }
+    
+    p.blurb img
+    {
+        padding: 1pt;
+    }
+
+/*=============================================================================
+    Variable Lists
+=============================================================================*/
+
+    /* Make the terms in definition lists bold */
+    div.variablelist dl dt,
+    span.term
+    {
+        font-weight: bold;
+        font-size: 10pt;
+    }
+
+    div.variablelist table tbody tr td
+    {
+        text-align: left;
+        vertical-align: top;
+        padding: 0em 2em 0em 0em;
+        font-size: 10pt;
+        margin: 0em 0em 0.5em 0em;
+        line-height: 1;
+    }
+
+    div.variablelist dl dt
+    {
+        margin-bottom: 0.2em;
+    }
+
+    div.variablelist dl dd
+    {
+        margin: 0em 0em 0.5em 2em;
+        font-size: 10pt;
+    }
+
+    div.variablelist table tbody tr td p,
+    div.variablelist dl dd p
+    {
+        margin: 0em 0em 0.5em 0em;
+        line-height: 1;
+    }
+
+/*=============================================================================
+    Misc
+=============================================================================*/
+
+    /* Title of books and articles in bibliographies */
+    span.title
+    {
+        font-style: italic;
+    }
+
+    span.underline
+    {
+        text-decoration: underline;
+    }
+
+    span.strikethrough
+    {
+        text-decoration: line-through;
+    }
+
+    /* Copyright, Legal Notice */
+    div div.legalnotice p
+    {
+        text-align: left
+    }
+
+/*=============================================================================
+    Colors
+=============================================================================*/
+
+    @media screen
+    {
+    /* Links */
+        a
+        {
+            color: #005a9c;
+        }
+    
+        a:visited
+        {
+            color: #9c5a9c;
+        }
+
+        h1 a, h2 a, h3 a, h4 a, h5 a, h6 a,
+        h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover,
+        h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited
+        {
+            text-decoration: none; /* no underline */
+            color: #000000;
+        }
+    
+    /* Syntax Highlighting */
+        .keyword        { color: #0000AA; }
+        .identifier     { color: #000000; }
+        .special        { color: #707070; }
+        .preprocessor   { color: #402080; }
+        .char           { color: teal; }
+        .comment        { color: #800000; }
+        .string         { color: teal; }
+        .number         { color: teal; }
+        .white_bkd      { background-color: #FFFFFF; }
+        .dk_grey_bkd    { background-color: #999999; }
+    
+    /* Copyright, Legal Notice */
+        .copyright      
+        { 
+            color: #666666; 
+            font-size: small; 
+        }
+    
+        div div.legalnotice p
+        {
+            color: #666666;
+        }
+    
+    /* Program listing */
+        pre.synopsis
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+        .programlisting, 
+        .screen
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+        td .programlisting, 
+        td .screen
+        {
+            border: 0px solid #DCDCDC;
+        }
+    
+    /* Blurbs */
+        div.note,
+        div.tip,
+        div.important,
+        div.caution,
+        div.warning,
+        p.blurb
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+    /* Table of contents */
+        .toc
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+    /* Tables */
+        div.informaltable table tr td, 
+        div.table table tr td
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+        div.informaltable table tr th, 
+        div.table table tr th
+        {
+            background-color: #F0F0F0;
+            border: 1px solid #DCDCDC;
+        }
+    
+    /* Misc */
+        span.highlight
+        {
+            color: #00A000;
+        }
+    }
+    
+    @media print
+    {
+    /* Links */
+        a
+        {
+            color: black;
+        }
+    
+        a:visited
+        {
+            color: black;
+        }
+    
+        .spirit-nav
+        {
+            display: none;
+        }
+    
+    /* Program listing */
+        pre.synopsis
+        {
+            border: 1px solid gray;
+        }
+    
+        .programlisting, 
+        .screen
+        {
+            border: 1px solid gray;
+        }
+    
+        td .programlisting, 
+        td .screen
+        {
+            border: 0px solid #DCDCDC;
+        }
+    
+    /* Table of contents */
+        .toc
+        {
+            border: 1px solid gray;
+        }
+    
+        .informaltable table, 
+        .table table
+        {
+            border: 1px solid gray;
+            border-collapse: collapse;
+        }
+    
+    /* Tables */
+        div.informaltable table tr td, 
+        div.table table tr td
+        {
+            border: 1px solid gray;
+        }
+    
+        div.informaltable table tr th, 
+        div.table table tr th
+        {
+            border: 1px solid gray;
+        }
+    
+    /* Misc */
+        span.highlight
+        {
+            font-weight: bold;
+        }
+    }

Modified: boost-build/branches/upstream/current/doc/html/images/caution.png
===================================================================
(Binary files differ)

Modified: boost-build/branches/upstream/current/doc/html/images/important.png
===================================================================
(Binary files differ)

Added: boost-build/branches/upstream/current/doc/html/images/next_disabled.png
===================================================================
(Binary files differ)


Property changes on: boost-build/branches/upstream/current/doc/html/images/next_disabled.png
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:mime-type
   + application/octet-stream

Modified: boost-build/branches/upstream/current/doc/html/images/note.png
===================================================================
(Binary files differ)

Added: boost-build/branches/upstream/current/doc/html/images/prev_disabled.png
===================================================================
(Binary files differ)


Property changes on: boost-build/branches/upstream/current/doc/html/images/prev_disabled.png
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:mime-type
   + application/octet-stream

Modified: boost-build/branches/upstream/current/doc/html/images/tip.png
===================================================================
(Binary files differ)

Added: boost-build/branches/upstream/current/doc/html/images/up_disabled.png
===================================================================
(Binary files differ)


Property changes on: boost-build/branches/upstream/current/doc/html/images/up_disabled.png
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:mime-type
   + application/octet-stream

Modified: boost-build/branches/upstream/current/doc/html/images/warning.png
===================================================================
(Binary files differ)

Modified: boost-build/branches/upstream/current/doc/html/index.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/index.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/index.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,108 +3,113 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Part I. Boost.Build v2 User Manual</title>
 <link rel="stylesheet" href="boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.61.3">
-<link rel="home" href="index.html" title="Part I. Boost.Build v2 User Manual">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="index.html" title="Part I. Boost.Build v2 User Manual">
 <link rel="next" href="bbv2/howto.html" title="Chapter 1. How to use this document">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><td valign="top"><img alt="boost.png (6897 bytes)" width="277" height="86" src="../../boost.png"></td></table>
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../boost.png"></td></table>
 <hr>
 <div class="spirit-nav"><a accesskey="n" href="bbv2/howto.html"><img src="images/next.png" alt="Next"></a></div>
 <div class="part" lang="en">
-<div class="titlepage">
-<div><div><h1 class="title">
-<a name="bbv2"></a>Boost.Build v2 User Manual</h1></div></div>
-<div></div>
-</div>
+<div class="titlepage"><div><div><h1 class="title">
+<a name="bbv2"></a>Part I. Boost.Build v2 User Manual</h1></div></div></div>
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl>
-<dt>1. <a href="bbv2/howto.html">How to use this document</a>
-</dt>
-<dt>2. <a href="bbv2/installation.html">Installation</a>
-</dt>
-<dt>3. <a href="bbv2/tutorial.html">Tutorial</a>
-</dt>
+<dt><span class="chapter"><a href="bbv2/howto.html">1. How to use this document</a></span></dt>
+<dt><span class="chapter"><a href="bbv2/installation.html">2. Installation</a></span></dt>
+<dt><span class="chapter"><a href="bbv2/tutorial.html">3. Tutorial</a></span></dt>
 <dd><dl>
-<dt><a href="bbv2/tutorial.html#bbv2.tutorial.hello">Hello, world</a></dt>
-<dt><a href="bbv2/tutorial/properties.html">Properties</a></dt>
-<dt><a href="bbv2/tutorial/hierarchy.html">Project Hierarchies</a></dt>
-<dt><a href="bbv2/tutorial/libs.html">Libraries and Dependent Targets</a></dt>
-<dt><a href="bbv2/tutorial/depends.html">Library dependencies</a></dt>
-<dt><a href="bbv2/tutorial/linkage.html">Static and shared libaries</a></dt>
-<dt><a href="bbv2/tutorial/conditions.html">Conditions and alternatives</a></dt>
-<dt><a href="bbv2/tutorial/prebuilt.html">Prebuilt targets</a></dt>
+<dt><span class="section"><a href="bbv2/tutorial.html#bbv2.tutorial.hello">Hello, world</a></span></dt>
+<dt><span class="section"><a href="bbv2/tutorial/properties.html">Properties</a></span></dt>
+<dt><span class="section"><a href="bbv2/tutorial/hierarchy.html">Project Hierarchies</a></span></dt>
+<dt><span class="section"><a href="bbv2/tutorial/libs.html">Dependent Targets</a></span></dt>
+<dt><span class="section"><a href="bbv2/tutorial/testing.html">Testing</a></span></dt>
+<dt><span class="section"><a href="bbv2/tutorial/linkage.html">Static and shared libaries</a></span></dt>
+<dt><span class="section"><a href="bbv2/tutorial/conditions.html">Conditions and alternatives</a></span></dt>
+<dt><span class="section"><a href="bbv2/tutorial/prebuilt.html">Prebuilt targets</a></span></dt>
 </dl></dd>
-<dt>4. <a href="bbv2/advanced.html">User documentation</a>
-</dt>
+<dt><span class="chapter"><a href="bbv2/advanced.html">4. User documentation</a></span></dt>
 <dd><dl>
-<dt><a href="bbv2/advanced.html#bbv2.advanced.configuration">Configuration</a></dt>
-<dt><a href="bbv2/advanced/jamfiles.html">Writing Jamfiles</a></dt>
-<dt><a href="bbv2/advanced/build_process.html">Build process</a></dt>
-<dt><a href="bbv2/advanced/builtins/targets.html">Builtin target types</a></dt>
-<dt><a href="bbv2/advanced/builtins/features.html">Builtin features</a></dt>
-<dt><a href="bbv2/advanced/differences_to_v1.html">Differences to Boost.Build V1</a></dt>
+<dt><span class="section"><a href="bbv2/advanced.html#bbv2.advanced.jam_language">Boost.Jam language</a></span></dt>
+<dt><span class="section"><a href="bbv2/advanced/configuration.html">Configuration</a></span></dt>
+<dt><span class="section"><a href="bbv2/advanced/invocation.html">Invocation</a></span></dt>
+<dt><span class="section"><a href="bbv2/advanced/targets.html">Declaring targets</a></span></dt>
+<dt><span class="section"><a href="bbv2/advanced/projects.html">Projects</a></span></dt>
+<dt><span class="section"><a href="bbv2/advanced/other-rules.html">Jamfile Utility Rules</a></span></dt>
+<dt><span class="section"><a href="bbv2/advanced/build_process.html">The Build Process</a></span></dt>
+<dt><span class="section"><a href="bbv2/advanced/builtins/targets.html">Builtin target types</a></span></dt>
+<dt><span class="section"><a href="bbv2/advanced/builtins/features.html">Builtin features</a></span></dt>
+<dt><span class="section"><a href="bbv2/advanced/differences_to_v1.html">Differences to Boost.Build V1</a></span></dt>
 </dl></dd>
-<dt>5. <a href="bbv2/extender.html">Extender Manual</a>
-</dt>
+<dt><span class="chapter"><a href="bbv2/extender.html">5. Extender Manual</a></span></dt>
 <dd><dl>
-<dt><a href="bbv2/extender.html#bbv2.extender.intro">Introduction</a></dt>
-<dt><a href="bbv2/extending/targets.html">Target types</a></dt>
-<dt><a href="bbv2/extending/tools.html">Tools and generators</a></dt>
-<dt><a href="bbv2/extending/features.html">Features</a></dt>
-<dt><a href="bbv2/extending/rules.html">Main target rules</a></dt>
-<dt><a href="bbv2/extending/toolset_modules.html">Toolset modules</a></dt>
+<dt><span class="section"><a href="bbv2/extender.html#bbv2.extender.intro">Introduction</a></span></dt>
+<dt><span class="section"><a href="bbv2/extending/targets.html">Target types</a></span></dt>
+<dt><span class="section"><a href="bbv2/extending/tools.html">Tools and generators</a></span></dt>
+<dt><span class="section"><a href="bbv2/extending/features.html">Features</a></span></dt>
+<dt><span class="section"><a href="bbv2/extending/rules.html">Main target rules</a></span></dt>
+<dt><span class="section"><a href="bbv2/extending/toolset_modules.html">Toolset modules</a></span></dt>
 </dl></dd>
-<dt>6. <a href="bbv2/reference.html">Detailed reference</a>
-</dt>
+<dt><span class="chapter"><a href="bbv2/reference.html">6. Detailed reference</a></span></dt>
 <dd><dl>
-<dt><a href="bbv2/reference.html#bbv2.reference.general">General information</a></dt>
-<dt><a href="bbv2/reference/jamfiles.html">Writing Jamfiles</a></dt>
-<dt><a href="bbv2/reference/buildprocess.html">Build process</a></dt>
-<dt><a href="bbv2/reference/definitions.html"></a></dt>
-<dt><a href="bbv2/reference/generators.html">Generators</a></dt>
+<dt><span class="section"><a href="bbv2/reference.html#bbv2.reference.general">General information</a></span></dt>
+<dt><span class="section"><a href="bbv2/reference/jamfiles.html">Writing Jamfiles</a></span></dt>
+<dt><span class="section"><a href="bbv2/reference/buildprocess.html">Build process</a></span></dt>
+<dt><span class="section"><a href="bbv2/reference/definitions.html">Definitions</a></span></dt>
+<dt><span class="section"><a href="bbv2/reference/generators.html">Generators</a></span></dt>
 </dl></dd>
-<dt>7. <a href="bbv2/faq.html">Frequently Asked Questions</a>
-</dt>
+<dt><span class="chapter"><a href="bbv2/faq.html">7. Frequently Asked Questions</a></span></dt>
 <dd><dl>
-<dt><a href="bbv2/faq.html#id2540813">
+<dt><span class="section"><a href="bbv2/faq.html#id2579924">
+        How do I get the current value of feature in Jamfile?
+      </a></span></dt>
+<dt><span class="section"><a href="bbv2/faq/s02.html">
         I'm getting "Duplicate name of actual target" error. What
         does it mean?
-      </a></dt>
-<dt><a href="bbv2/faq/s02.html">
+      </a></span></dt>
+<dt><span class="section"><a href="bbv2/faq/envar.html">
       Accessing environment variables
-      </a></dt>
-<dt><a href="bbv2/faq/s03.html">
+      </a></span></dt>
+<dt><span class="section"><a href="bbv2/faq/s04.html">
         How to control properties order?
-      </a></dt>
-<dt><a href="bbv2/faq/s04.html">
+      </a></span></dt>
+<dt><span class="section"><a href="bbv2/faq/s05.html">
       How to control the library order on Unix?
-    </a></dt>
-<dt><a href="bbv2/faq/external.html">Can I get output of external program as a variable in a Jamfile?
-    </a></dt>
-<dt><a href="bbv2/faq/s06.html">How to get the project-root location?
-    </a></dt>
-<dt><a href="bbv2/faq/s07.html">How to change compilation flags for one file?
-    </a></dt>
-<dt><a href="bbv2/faq/dll-path.html">Why are the dll-path and
-    hardcode-dll-paths properties useful?
-    </a></dt>
-<dt><a href="bbv2/recipies/site-config.html">Targets in site-config.jam</a></dt>
+    </a></span></dt>
+<dt><span class="section"><a href="bbv2/faq/external.html">Can I get output of external program as a variable in a Jamfile?
+    </a></span></dt>
+<dt><span class="section"><a href="bbv2/faq/s07.html">How to get the project-root location?
+    </a></span></dt>
+<dt><span class="section"><a href="bbv2/faq/s08.html">How to change compilation flags for one file?
+    </a></span></dt>
+<dt><span class="section"><a href="bbv2/faq/dll-path.html">Why are the <code class="computeroutput">dll-path</code> and
+    <code class="computeroutput">hardcode-dll-paths</code> properties useful?
+    </a></span></dt>
+<dt><span class="section"><a href="bbv2/recipies/site-config.html">Targets in site-config.jam</a></span></dt>
+<dt><span class="section"><a href="bbv2/faq/header-only-libraries.html">Header-only libraries</a></span></dt>
 </dl></dd>
-<dt>A. <a href="bbv2/arch.html">Boost.Build v2 architecture</a>
-</dt>
+<dt><span class="appendix"><a href="bbv2/arch.html">A. Boost.Build v2 architecture</a></span></dt>
 <dd><dl>
-<dt><a href="bbv2/arch.html#bbv2.arch.overview">Overview</a></dt>
-<dt><a href="bbv2/arch/build.html">The build layer</a></dt>
-<dt><a href="bbv2/arch/tools.html">The tools layer</a></dt>
-<dt><a href="bbv2/arch/targets.html">Targets</a></dt>
+<dt><span class="section"><a href="bbv2/arch.html#bbv2.arch.overview">Overview</a></span></dt>
+<dt><span class="section"><a href="bbv2/arch/build.html">The build layer</a></span></dt>
+<dt><span class="section"><a href="bbv2/arch/tools.html">The tools layer</a></span></dt>
+<dt><span class="section"><a href="bbv2/arch/targets.html">Targets</a></span></dt>
 </dl></dd>
+<dt><span class="appendix"><a href="bbv2/jam.html">B. Boost.Jam documentation</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="bbv2/jam.html#jam.intro"> Introduction</a></span></dt>
+<dt><span class="section"><a href="jam/building.html"> Building BJam</a></span></dt>
+<dt><span class="section"><a href="jam/usage.html"> Using BJam</a></span></dt>
+<dt><span class="section"><a href="jam/language.html"> Language</a></span></dt>
+<dt><span class="section"><a href="jam/miscellaneous.html">Miscellaneous</a></span></dt>
+</dl></dd>
 </dl>
 </div>
 </div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"><small><p>Last revised: October 21, 2004 at 10:05:15 GMT</p></small></td>
+<table width="100%"><tr>
+<td align="left"><small><p>Last revised: July 20, 2006 at 07:19:25 GMT</p></small></td>
 <td align="right"><small></small></td>
 </tr></table>
 <hr>

Added: boost-build/branches/upstream/current/doc/html/jam/building.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/jam/building.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/jam/building.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,330 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Building BJam</title>
+<link rel="stylesheet" href="../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../bbv2/jam.html" title="Appendix B. Boost.Jam documentation">
+<link rel="prev" href="../bbv2/jam.html" title="Appendix B. Boost.Jam documentation">
+<link rel="next" href="usage.html" title=" Using BJam">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../bbv2/jam.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../bbv2/jam.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="usage.html"><img src="../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="jam.building"></a><a href="building.html" title=" Building BJam"> Building BJam</a></h2></div></div></div>
+<p>
+      Installing <code class="literal">BJam</code> after building it is simply a matter of
+      copying the generated executables someplace in your <code class="literal">PATH</code>.
+      For building the executables there are a set of <code class="literal">build</code> bootstrap
+      scripts to accomodate particular environments. The scripts take one optional
+      argument, the name of the toolset to build with. When the toolset is not given
+      an attempt is made to detect an available toolset and use that. The build scripts
+      accept these arguments:
+    </p>
+<pre class="programlisting"><span class="emphasis"><em>build</em></span> [<span class="emphasis"><em>toolset</em></span>]
+</pre>
+<p>
+      Running the scripts without arguments will give you the best chance of success.
+      On Windows platforms from a command console do:
+    </p>
+<pre class="programlisting">cd <span class="emphasis"><em>jam source location</em></span>
+.\build.bat
+</pre>
+<p>
+      On Unix type platforms do:
+    </p>
+<pre class="programlisting">cd <span class="emphasis"><em>jam source location</em></span>
+sh ./build.sh
+</pre>
+<p>
+      For the Boost.Jam source included with the Boost distribution the <span class="emphasis"><em>jam
+      source location</em></span> is <code class="literal">BOOST_ROOT/tools/jam/src</code>.
+    </p>
+<p>
+      If the scripts fail to detect an appropriate toolset to build with your particular
+      toolset may not be auto-detectable. In that case, you can specify the toolset
+      as the first argument, this assumes that the toolset is readily available in
+      the <code class="literal">PATH</code>.
+    </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+        The toolset used to build Boost.Jam is independent of the toolsets used for
+        Boost.Build. Only one version of Boost.Jam is needed to use Boost.Build.
+      </p></td></tr>
+</table></div>
+<p>
+      The supported toolsets, and wether they are auto-detected, are:
+    </p>
+<div class="informaltable">
+<h4>
+<a name="id2582001"></a>
+        <span class="table-title">Supported Toolsets</span>
+      </h4>
+<table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>Script</th>
+<th>Platform</th>
+<th>Toolset</th>
+<th>Detection</th>
+</tr></thead>
+<tbody>
+<tr>
+<td><code class="literal">build.bat</code></td>
+<td>Windows NT, 2000, and
+            XP</td>
+<td> <a href="http://www.borland.com/bcppbuilder/freecompiler" target="_top"><code class="literal">borland</code></a><br>
+            <a href="http://www.borland.com/" target="_top">Borland</a> C++Builder (BCC
+            5.5)</td>
+<td> * Common install location: "<code class="literal">C:\Borland\BCC55</code>"<br>
+            * <code class="literal">BCC32.EXE</code> in <code class="literal">PATH</code> </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www.comeaucomputing.com/" target="_top"><code class="literal">como</code></a><br>
+            Comeau Computing C/C++</td>
+<td> </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://gcc.gnu.org/" target="_top"><code class="literal">gcc</code></a><br>
+            GNU GCC</td>
+<td> </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://gcc.gnu.org/" target="_top"><code class="literal">gcc-nocygwin</code></a><br>
+            GNU GCC</td>
+<td> </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www.intel.com/software/products/compilers/c60" target="_top"><code class="literal">intel-win32</code></a><br>
+            Intel C++ Compiler for Windows</td>
+<td> * <code class="literal">ICL.EXE</code>
+            in <code class="literal">PATH</code> </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www.metrowerks.com/" target="_top"><code class="literal">metrowerks</code></a><br>
+            MetroWerks CodeWarrior C/C++ 7.x, 8.x, 9.x</td>
+<td> * <code class="literal">CWFolder</code>
+            variable configured * <code class="literal">MWCC.EXE</code> in <code class="literal">PATH</code>
+            </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www.mingw.org/" target="_top"><code class="literal">mingw</code></a><br>
+            GNU <a href="http://gcc.gnu.org/" target="_top">GCC</a> as the <a href="http://www.mingw.org/" target="_top">MinGW</a>
+            configuration</td>
+<td> * Common install location: "<code class="literal">C:\MinGW</code>"
+            </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://msdn.microsoft.com/visualc/" target="_top"><code class="literal">msvc</code></a><br>
+            Microsoft Visual C++ 6.x</td>
+<td> * <code class="literal">VCVARS32.BAT</code>
+            already configured<br> * <code class="literal">%MSVCDir%</code> is present in
+            environment<br> * Common install locations: "<code class="literal">%ProgramFiles%\Microsoft
+            Visual Studio</code>", "<code class="literal">%ProgramFiles%\Microsoft
+            Visual C++</code>"<br> * <code class="literal">CL.EXE</code> in <code class="literal">PATH</code><br>
+            * <code class="literal">VCVARS32.BAT</code> in <code class="literal">PATH</code> </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://msdn.microsoft.com/visualc/" target="_top"><code class="literal">vc7</code></a><br>
+            Microsoft Visual C++ 7.x</td>
+<td> * <code class="literal">VCVARS32.BAT</code>
+            or <code class="literal">VSVARS32.BAT</code> already configured * <code class="literal">%VS71COMNTOOLS%</code>
+            is present in environment<br> * <code class="literal">%VCINSTALLDIR%</code> is
+            present in environment<br> * Common install locations: "<code class="literal">%ProgramFiles%\Microsoft
+            Visual Studio .NET</code>", "<code class="literal">%ProgramFiles%\Microsoft
+            Visual Studio .NET 2003</code>"<br> * <code class="literal">CL.EXE</code>
+            in <code class="literal">PATH</code><br> * <code class="literal">VCVARS32.BAT</code> in
+            <code class="literal">PATH</code> </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://msdn.microsoft.com/visualc/" target="_top"><code class="literal">vc8</code></a><br>
+            Microsoft Visual C++ 8.x</td>
+<td> * <code class="literal">VCVARS32.BAT</code>
+            or <code class="literal">VSVARS32.BAT</code> already configured<br> * <code class="literal">%VS80COMNTOOLS%</code>
+            is present in environment<br> * Common install location: "<code class="literal">%ProgramFiles%\Microsoft
+            Visual Studio 8</code>"<br> * <code class="literal">CL.EXE</code> in
+            <code class="literal">PATH</code><br> * <code class="literal">VCVARS32.BAT</code> in <code class="literal">PATH</code>
+            </td>
+</tr>
+<tr>
+<td><code class="literal">build.sh</code></td>
+<td>Unix, Linux, Cygwin,
+            etc.</td>
+<td> <a href="http://www.hp.com/go/c++" target="_top"><code class="literal">acc</code></a><br>
+            HP-UX aCC</td>
+<td> * <code class="literal">aCC</code> in <code class="literal">PATH</code><br>
+            * <code class="literal">uname</code> is "HP-UX" </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www.comeaucomputing.com/" target="_top"><code class="literal">como</code></a><br>
+            Comeau Computing C/C++</td>
+<td> * como in <code class="literal">PATH</code>
+            </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://gcc.gnu.org/" target="_top"><code class="literal">gcc</code></a><br>
+            GNU GCC</td>
+<td> * gcc in <code class="literal">PATH</code> </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www.intel.com/software/products/compilers/c60l/" target="_top"><code class="literal">intel-linux</code></a><br>
+            Intel C++ for Linux</td>
+<td> * <code class="literal">icc</code> in <code class="literal">PATH</code><br>
+            * Common install locations: "<code class="literal">/opt/intel/cc/9.0</code>",
+            "<code class="literal">/opt/intel_cc_80</code>", "<code class="literal">/opt/intel/compiler70</code>",
+            "<code class="literal">/opt/intel/compiler60</code>", "<code class="literal">/opt/intel/compiler50</code>"
+            </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <code class="literal">kcc</code><br>
+            Intel KAI C++</td>
+<td> * <code class="literal">KCC</code> in <code class="literal">PATH</code>
+            </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www.borland.com/bcppbuilder/freecompiler" target="_top"><code class="literal">kylix</code></a><br>
+            <a href="http://www.borland.com/" target="_top">Borland</a> C++Builder</td>
+<td>
+            * bc++ in PATH </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www.sgi.com/developers/devtools/languages/mipspro.html" target="_top"><code class="literal">mipspro</code></a><br>
+            SGI MIPSpro C</td>
+<td> * <code class="literal">uname</code> is "<code class="literal">IRIX</code>"
+            or "<code class="literal">IRIX64</code>" </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <code class="literal">sunpro</code><br>
+            Sun Workshop 6 C++</td>
+<td> * Standard install location: "<code class="literal">/opt/SUNWspro</code>"
+            </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <code class="literal">qcc</code><br>
+            <a href="http://www.qnx.com/" target="_top">QNX Neutrino</a>
+</td>
+<td>
+            * <code class="literal">uname</code> is "<code class="literal">QNX</code>" and
+            <code class="literal">qcc</code> in <code class="literal">PATH</code> </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www.tru64unix.compaq.com/cplus/" target="_top"><code class="literal">true64cxx</code></a><br>
+            Compaq C++ Compiler for True64 UNIX</td>
+<td> * <code class="literal">uname</code>
+            is "<code class="literal">OSF1</code>" </td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td> <a href="http://www-3.ibm.com/software/ad/vacpp/" target="_top"><code class="literal">vacpp</code></a><br>
+            IBM VisualAge C++</td>
+<td> * <code class="literal">xlc</code> in <code class="literal">PATH</code>
+            </td>
+</tr>
+<tr>
+<td> </td>
+<td>MacOS X</td>
+<td> <a href="http://developer.apple.com/tools/compilers.html" target="_top"><code class="literal">darwin</code></a><br>
+            Apple MacOS X GCC</td>
+<td> * <code class="literal">uname</code> is "<code class="literal">Darwin</code>"
+            </td>
+</tr>
+<tr>
+<td> </td>
+<td>Windows NT, 2000, and XP</td>
+<td> <a href="http://www.mingw.org/" target="_top"><code class="literal">mingw</code></a><br> GNU
+            <a href="http://gcc.gnu.org/" target="_top">GCC</a> as the <a href="http://www.mingw.org/" target="_top">MinGW</a>
+            configuration with the MSYS shell</td>
+<td> * Common install location:
+            "<code class="literal">/mingw</code>" </td>
+</tr>
+</tbody>
+</table>
+</div>
+<p>
+      The built executables are placed in a subdirectory specific to your platform.
+      For example, in Linux running on an Intel x86 compatible chip, the executables
+      are placed in: "<code class="literal">bin.linuxx86</code>". The <code class="literal">bjam[.exe]</code>
+      executable can be used to invoke Boost.Build.
+    </p>
+<p>
+      The build scripts support additional invocation arguments for use by developers
+      of Boost.Jam. The extra arguments come after the toolset, and can take the
+      form of "<code class="literal">--option</code>" or targets for the <code class="literal">build.jam</code>
+      script:
+    </p>
+<pre class="programlisting"><span class="emphasis"><em>build</em></span> [<span class="emphasis"><em>toolset</em></span>] [--<span class="emphasis"><em>option</em></span>+ <span class="emphasis"><em>target</em></span>*]
+</pre>
+<p>
+      There is currently only one available option, "<code class="literal">--debug</code>",
+      which builds debugging versions of the executable. When built they are placed
+      in their own directory "<code class="literal">bin./platform/.debug</code>".
+      To specify targets without options, one can suply a special ignore option "<code class="literal">---</code>".
+    </p>
+<p>
+      Currently there are two targets supported: <code class="literal">dist</code>, and <code class="literal">clean</code>.
+      Respectively they: generate packages (compressed archives) as appropriate for
+      distribution in the platform, or remove all the built executables and objects.
+    </p>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../bbv2/jam.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../bbv2/jam.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="usage.html"><img src="../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Added: boost-build/branches/upstream/current/doc/html/jam/language.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/jam/language.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/jam/language.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,1596 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Language</title>
+<link rel="stylesheet" href="../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../bbv2/jam.html" title="Appendix B. Boost.Jam documentation">
+<link rel="prev" href="usage.html" title=" Using BJam">
+<link rel="next" href="miscellaneous.html" title="Miscellaneous">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="usage.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../bbv2/jam.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="miscellaneous.html"><img src="../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="jam.language"></a><a href="language.html" title=" Language"> Language</a></h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="language.html#jam.language.lexical"> Lexical Features</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.target"> Targets</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.rules"> Rules</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.flow_of_control">Flow-of-Control</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.variables">Variables</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.modules">Modules</a></span></dt>
+</dl></div>
+<p>
+      <code class="literal">BJam</code> has an interpreted, procedural language. Statements
+      in <code class="literal">bjam</code> are rule (procedure) definitions, rule invocations,
+      flow-of-control structures, variable assignments, and sundry language support.
+    </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.language.lexical"></a><a href="language.html#jam.language.lexical" title=" Lexical Features"> Lexical Features</a></h3></div></div></div>
+<p>
+        <code class="literal">BJam</code> treats its input files as whitespace-separated tokens,
+        with two exceptions: double quotes (") can enclose whitespace to embed
+        it into a token, and everything between the matching curly braces ({}) in
+        the definition of a rule action is treated as a single string. A backslash
+        (\) can escape a double quote, or any single whitespace character.
+      </p>
+<p>
+        <code class="literal">BJam</code> requires whitespace (blanks, tabs, or newlines) to
+        surround all tokens, including the colon (:) and semicolon (;) tokens.
+      </p>
+<p>
+        <code class="literal">BJam</code> keywords (an mentioned in this document) are reserved
+        and generally must be quoted with double quotes (") to be used as arbitrary
+        tokens, such as variable or target names.
+      </p>
+<p>
+        Comments start with the <code class="literal">#</code> character and extend until the
+        end of line.
+      </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.language.target"></a><a href="language.html#jam.language.target" title=" Targets"> Targets</a></h3></div></div></div>
+<div class="toc"><dl><dt><span class="section"><a href="language.html#jam.language.target.binding_detection">Binding Detection</a></span></dt></dl></div>
+<p>
+        The essential <code class="literal">bjam</code> data entity is a target. Build targets
+        are files to be updated. Source targets are the files used in updating built
+        targets. Built targets and source targets are collectively referred to as
+        file targets, and frequently built targets are source targets for other built
+        targets. Pseudotargets are symbols which represent dependencies on other
+        targets, but which are not themselves associated with any real file.
+      </p>
+<p>
+        A file target's identifier is generally the file's name, which can be absolutely
+        rooted, relative to the directory of <code class="literal">bjam</code>'s invocation,
+        or simply local (no directory). Most often it is the last case, and the actual
+        file path is bound using the <code class="literal">$(SEARCH)</code> and <code class="literal">$(LOCATE)</code>
+        special variables. See <a href="language.html#jam.language.variables.builtins.search" title=" SEARCH and
+          LOCATE">SEARCH
+        and LOCATE Variables</a> below. A local filename is optionally qualified
+        with grist, a string value used to assure uniqueness. A file target with
+        an identifier of the form <span class="emphasis"><em>file(member)</em></span> is a library
+        member (usually an <code class="literal">ar</code>(1) archive on Unix).
+      </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.target.binding_detection"></a><a href="language.html#jam.language.target.binding_detection" title="Binding Detection">Binding Detection</a></h4></div></div></div>
+<p>
+          Whenever a target is bound to a location in the filesystem, Boost Jam will
+          look for a variable called <code class="literal">BINDRULE</code> (first "on"
+          the target being bound, then in the global module). If non-empty, <code class="literal">$(BINDRULE[1])</code>
+          names a rule which is called with the name of the target and the path it
+          is being bound to. The signature of the rule named by <code class="literal">$(BINDRULE[1])</code>
+          should match the following:
+        </p>
+<pre class="programlisting">rule <span class="emphasis"><em>bind-rule</em></span> ( <span class="emphasis"><em>target</em></span> : <span class="emphasis"><em>path</em></span> )
+</pre>
+<p>
+          This facility is useful for correct header file scanning, since many compilers
+          will search for <code class="computeroutput"><span class="preprocessor">#include</span></code>
+          files first in the directory containing the file doing the <code class="computeroutput"><span class="preprocessor">#include</span></code> directive. <code class="literal">$(BINDRULE)</code>
+          can be used to make a record of that directory.
+        </p>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.language.rules"></a><a href="language.html#jam.language.rules" title=" Rules"> Rules</a></h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="language.html#jam.language.rules.action_modifiers">Action Modifiers</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.rules.argument_lists">Argument lists</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.rules.builtins"> Built-in Rules</a></span></dt>
+</dl></div>
+<p>
+        The basic <code class="literal">bjam</code> language entity is called a rule. A rule
+        is defined in two parts: the procedure and the actions. The procedure is
+        a body of jam statements to be run when the rule is invoked; the actions
+        are the OS shell commands to execute when updating the built targets of the
+        rule.
+      </p>
+<p>
+        Rules can return values, which can be expanded into a list with "[
+        <span class="emphasis"><em>rule</em></span> <span class="emphasis"><em>args</em></span> ... ]". A rule's
+        value is the value of its last statement, though only the following statements
+        have values: 'if' (value of the leg chosen), 'switch' (value of the case
+        chosen), set (value of the resulting variable), and 'return' (value of its
+        arguments). Note that 'return' doesn't actually cause a return, i.e., is
+        a no-op unless it is the last statement of the last block executed within
+        rule body.
+      </p>
+<p>
+        The <code class="literal">bjam</code> statements for defining and invoking rules are
+        as follows:
+      </p>
+<p>
+        Define a rule's procedure, replacing any previous definition.
+      </p>
+<pre class="programlisting">rule <span class="emphasis"><em>rulename</em></span> { <span class="emphasis"><em>statements</em></span> }
+</pre>
+<p>
+        Define a rule's updating actions, replacing any previous definition.
+      </p>
+<pre class="programlisting">actions [ <span class="emphasis"><em>modifiers</em></span> ] <span class="emphasis"><em>rulename</em></span> { <span class="emphasis"><em>commands</em></span> }
+</pre>
+<p>
+        Invoke a rule.
+      </p>
+<pre class="programlisting"><span class="emphasis"><em>rulename</em></span> <span class="emphasis"><em>field1</em></span> : <span class="emphasis"><em>field2</em></span> : <span class="emphasis"><em>...</em></span> : <span class="emphasis"><em>fieldN</em></span> ;
+</pre>
+<p>
+        Invoke a rule under the influence of target's specific variables..
+      </p>
+<pre class="programlisting">on <span class="emphasis"><em>target</em></span> <span class="emphasis"><em>rulename</em></span> <span class="emphasis"><em>field1</em></span> : <span class="emphasis"><em>field2</em></span> : <span class="emphasis"><em>...</em></span> : <span class="emphasis"><em>fieldN</em></span> ;
+</pre>
+<p>
+        Used as an argument, expands to the return value of the rule invoked.
+      </p>
+<pre class="programlisting">[ <span class="emphasis"><em>rulename</em></span> <span class="emphasis"><em>field1</em></span> : <span class="emphasis"><em>field2</em></span> : <span class="emphasis"><em>...</em></span> : <span class="emphasis"><em>fieldN</em></span> ]
+[ on <span class="emphasis"><em>target</em></span> <span class="emphasis"><em>rulename</em></span> <span class="emphasis"><em>field1</em></span> : <span class="emphasis"><em>field2</em></span> : <span class="emphasis"><em>...</em></span> : <span class="emphasis"><em>fieldN</em></span> ]
+</pre>
+<p>
+        A rule is invoked with values in <span class="emphasis"><em>field1</em></span> through <span class="emphasis"><em>fieldN</em></span>.
+        They may be referenced in the procedure's statements as <code class="literal">$(1)</code>
+        through <code class="literal">$(<span class="emphasis"><em>N</em></span>)</code> (9 max), and the first
+        two only may be referenced in the action's <span class="emphasis"><em>commands</em></span>
+        as <code class="literal">$(1)</code> and <code class="literal">$(2)</code>. <code class="literal">$(&lt;)</code>
+        and <code class="literal">$(&gt;)</code> are synonymous with <code class="literal">$(1)</code>
+        and <code class="literal">$(2)</code>.
+      </p>
+<p>
+        Rules fall into two categories: updating rules (with actions), and pure procedure
+        rules (without actions). Updating rules treat arguments <code class="literal">$(1)</code>
+        and <code class="literal">$(2)</code> as built targets and sources, respectively, while
+        pure procedure rules can take arbitrary arguments.
+      </p>
+<p>
+        When an updating rule is invoked, its updating actions are added to those
+        associated with its built targets (<code class="literal">$(1)</code>) before the rule's
+        procedure is run. Later, to build the targets in the updating phase, <span class="emphasis"><em>commands</em></span>
+        are passed to the OS command shell, with <code class="literal">$(1)</code> and <code class="literal">$(2)</code>
+        replaced by bound versions of the target names. See Binding above.
+      </p>
+<p>
+        Rule invocation may be indirected through a variable:
+      </p>
+<pre class="programlisting">$(<span class="emphasis"><em>var</em></span>) <span class="emphasis"><em>field1</em></span> : <span class="emphasis"><em>field2</em></span> : <span class="emphasis"><em>...</em></span> : <span class="emphasis"><em>fieldN</em></span> ;
+
+on <span class="emphasis"><em>target</em></span> $(<span class="emphasis"><em>var</em></span>) <span class="emphasis"><em>field1</em></span> : <span class="emphasis"><em>field2</em></span> : <span class="emphasis"><em>...</em></span> : <span class="emphasis"><em>fieldN</em></span> ;
+
+[ $(<span class="emphasis"><em>var</em></span>) <span class="emphasis"><em>field1</em></span> : <span class="emphasis"><em>field2</em></span> : <span class="emphasis"><em>...</em></span> : <span class="emphasis"><em>fieldN</em></span> ]
+[ on <span class="emphasis"><em>target</em></span> $(<span class="emphasis"><em>var</em></span>) <span class="emphasis"><em>field1</em></span> : <span class="emphasis"><em>field2</em></span> : <span class="emphasis"><em>...</em></span> : <span class="emphasis"><em>fieldN</em></span> ]
+</pre>
+<p>
+        The variable's value names the rule (or rules) to be invoked. A rule is invoked
+        for each element in the list of <code class="literal">$(<span class="emphasis"><em>var</em></span>)</code>'s
+        values. The fields <code class="literal"><span class="emphasis"><em>field1</em></span> : <span class="emphasis"><em>field2</em></span>
+        : <span class="emphasis"><em>...</em></span></code> are passed as arguments for each invokation.
+        For the [ ... ] forms, the return value is the concatenation of the return
+        values for all of the invocations.
+      </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.rules.action_modifiers"></a><a href="language.html#jam.language.rules.action_modifiers" title="Action Modifiers">Action Modifiers</a></h4></div></div></div>
+<p>
+          The following action modifiers are understood:
+        </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">actions bind <span class="emphasis"><em>vars</em></span></code></span></dt>
+<dd>
+<code class="literal">$(<span class="emphasis"><em>vars</em></span>)</code> will be replaced with
+            bound values.
+          </dd>
+<dt><span class="term"><code class="literal">actions existing</code></span></dt>
+<dd>
+<code class="literal">$(&gt;)</code> includes only source targets currently existing.
+          </dd>
+<dt><span class="term"><code class="literal">actions ignore</code></span></dt>
+<dd>
+            The return status of the commands is ignored.
+          </dd>
+<dt><span class="term"><code class="literal">actions piecemeal</code></span></dt>
+<dd>
+            commands are repeatedly invoked with a subset of <code class="literal">$(&gt;)</code>
+            small enough to fit in the command buffer on this OS.
+          </dd>
+<dt><span class="term"><code class="literal">actions quietly</code></span></dt>
+<dd>
+            The action is not echoed to the standard output.
+          </dd>
+<dt><span class="term"><code class="literal">actions together</code></span></dt>
+<dd>
+            The <code class="literal">$(&gt;)</code> from multiple invocations of the same
+            action on the same built target are glommed together.
+          </dd>
+<dt><span class="term"><code class="literal">actions updated</code></span></dt>
+<dd>
+<code class="literal">$(&gt;)</code> includes only source targets themselves marked
+            for updating.
+          </dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.rules.argument_lists"></a><a href="language.html#jam.language.rules.argument_lists" title="Argument lists">Argument lists</a></h4></div></div></div>
+<p>
+          You can describe the arguments accepted by a rule, and refer to them by
+          name within the rule. For example, the following prints "I'm sorry,
+          Dave" to the console:
+        </p>
+<pre class="programlisting">rule report ( pronoun index ? : state : names + )
+{
+    local he.suffix she.suffix it.suffix = s ;
+    local I.suffix = m ;
+    local they.suffix you.suffix = re ;
+    ECHO $(pronoun)'$($(pronoun).suffix) $(state), $(names[$(index)]) ;
+}
+report I 2 : sorry : Joe Dave Pete ;
+</pre>
+<p>
+          Each name in a list of formal arguments (separated by "<code class="literal">:</code>"
+          in the rule declaration) is bound to a single element of the corresponding
+          actual argument unless followed by one of these modifiers:
+        </p>
+<div class="informaltable">
+<h4>
+<a name="id2585068"></a>
+          </h4>
+<table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>Symbol</th>
+<th>Semantics of preceding symbol</th>
+</tr></thead>
+<tbody>
+<tr>
+<td><code class="literal">?</code></td>
+<td>optional</td>
+</tr>
+<tr>
+<td><code class="literal">*</code></td>
+<td>Bind to zero or more unbound
+                elements of the actual argument. When <code class="literal">*</code> appears
+                where an argument name is expected, any number of additional arguments
+                are accepted. This feature can be used to implement "varargs"
+                rules.</td>
+</tr>
+<tr>
+<td><code class="literal">+</code></td>
+<td>Bind to one or more unbound
+                elements of the actual argument.</td>
+</tr>
+</tbody>
+</table>
+</div>
+<p>
+          The actual and formal arguments are checked for inconsistencies, which
+          cause Jam to exit with an error code:
+        </p>
+<pre class="programlisting">### argument error
+# rule report ( pronoun index ?  : state  : names + )
+# called with: ( I 2 foo  : sorry  : Joe Dave Pete )
+# extra argument foo
+### argument error
+# rule report ( pronoun index ?  : state  : names + )
+# called with: ( I 2  : sorry )
+# missing argument names
+</pre>
+<p>
+          If you omit the list of formal arguments, all checking is bypassed as in
+          "classic" Jam. Argument lists drastically improve the reliability
+          and readability of your rules, however, and are <span class="bold"><strong>strongly
+          recommended</strong></span> for any new Jam code you write.
+        </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.rules.builtins"></a><a href="language.html#jam.language.rules.builtins" title=" Built-in Rules"> Built-in Rules</a></h4></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="language.html#jam.language.rules.builtins.dependency_building">Dependency
+          Building</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.rules.builtins.modifying_binding">Modifying
+          Binding</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.rules.builtins.utility">Utility</a></span></dt>
+</dl></div>
+<p>
+          <code class="literal">BJam</code> has a growing set of built-in rules, all of which
+          are pure procedure rules without updating actions. They are in three groups:
+          the first builds the dependency graph; the second modifies it; and the
+          third are just utility rules.
+        </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.language.rules.builtins.dependency_building"></a><a href="language.html#jam.language.rules.builtins.dependency_building" title="Dependency
+          Building">Dependency
+          Building</a></h5></div></div></div>
+<pre class="programlisting">DEPENDS <span class="emphasis"><em>targets1</em></span> : <span class="emphasis"><em>targets2</em></span> ;
+</pre>
+<p>
+            Builds a direct dependency: makes each of <span class="emphasis"><em>targets1</em></span>
+            depend on each of <span class="emphasis"><em>targets2</em></span>. Generally, <span class="emphasis"><em>targets1</em></span>
+            will be rebuilt if <span class="emphasis"><em>targets2</em></span> are themselves rebuilt
+            are or are newer than <span class="emphasis"><em>targets1</em></span>.
+          </p>
+<pre class="programlisting">INCLUDES <span class="emphasis"><em>targets1</em></span> : <span class="emphasis"><em>targets2</em></span> ;
+</pre>
+<p>
+            Builds a sibling dependency: makes any target that depends on any of
+            <span class="emphasis"><em>targets1</em></span> also depend on each of <span class="emphasis"><em>targets2</em></span>.
+            This reflects the dependencies that arise when one source file includes
+            another: the object built from the source file depends both on the original
+            and included source file, but the two sources files don't depend on each
+            other. For example:
+          </p>
+<pre class="programlisting">DEPENDS foo.o : foo.c ;
+INCLUDES foo.c : foo.h ;
+</pre>
+<p>
+            "<code class="literal">foo.o</code>" depends on "<code class="literal">foo.c</code>"
+            and "<code class="literal">foo.h</code>" in this example.
+          </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.language.rules.builtins.modifying_binding"></a><a href="language.html#jam.language.rules.builtins.modifying_binding" title="Modifying
+          Binding">Modifying
+          Binding</a></h5></div></div></div>
+<p>
+            The six rules <code class="literal">ALWAYS</code>, <code class="literal">LEAVES</code>,
+            <code class="literal">NOCARE</code>, <code class="literal">NOTFILE</code>, <code class="literal">NOUPDATE</code>,
+            and <code class="literal">TEMPORARY</code> modify the dependency graph so that
+            <code class="literal">bjam</code> treats the targets differently during its target
+            binding phase. See Binding above. Normally, <code class="literal">bjam</code> updates
+            a target if it is missing, if its filesystem modification time is older
+            than any of its dependencies (recursively), or if any of its dependencies
+            are being updated. This basic behavior can be changed by invoking the
+            following rules:
+          </p>
+<pre class="programlisting">ALWAYS <span class="emphasis"><em>targets</em></span> ;
+</pre>
+<p>
+            Causes <span class="emphasis"><em>targets</em></span> to be rebuilt regardless of whether
+            they are up-to-date (they must still be in the dependency graph). This
+            is used for the clean and uninstall targets, as they have no dependencies
+            and would otherwise appear never to need building. It is best applied
+            to targets that are also <code class="literal">NOTFILE</code> targets, but it can
+            also be used to force a real file to be updated as well.
+          </p>
+<pre class="programlisting">LEAVES <span class="emphasis"><em>targets</em></span> ;
+</pre>
+<p>
+            Makes each of <span class="emphasis"><em>targets</em></span> depend only on its leaf sources,
+            and not on any intermediate targets. This makes it immune to its dependencies
+            being updated, as the "leaf" dependencies are those without
+            their own dependencies and without updating actions. This allows a target
+            to be updated only if original source files change.
+          </p>
+<pre class="programlisting">NOCARE <span class="emphasis"><em>targets</em></span> ;
+</pre>
+<p>
+            Causes <code class="literal">bjam</code> to ignore <span class="emphasis"><em>targets</em></span>
+            that neither can be found nor have updating actions to build them. Normally
+            for such targets <code class="literal">bjam</code> issues a warning and then skips
+            other targets that depend on these missing targets. The <code class="literal">HdrRule</code>
+            in <code class="literal">Jambase</code> uses <code class="literal">NOCARE</code> on the header
+            file names found during header file scanning, to let <code class="literal">bjam</code>
+            know that the included files may not exist. For example, if an <code class="computeroutput"><span class="preprocessor">#include</span></code> is within an <code class="computeroutput"><span class="preprocessor">#ifdef</span></code>, the included file may not
+            actually be around.
+          </p>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+              For targets with build actions: if their build actions exit with a
+              nonzero return code, dependent targets will still be built.
+            </p></td></tr>
+</table></div>
+<pre class="programlisting">NOTFILE <span class="emphasis"><em>targets</em></span> ;
+</pre>
+<p>
+            Marks <span class="emphasis"><em>targets</em></span> as pseudotargets and not real files.
+            No timestamp is checked, and so the actions on such a target are only
+            executed if the target's dependencies are updated, or if the target is
+            also marked with <code class="literal">ALWAYS</code>. The default <code class="literal">bjam</code>
+            target "<code class="literal">all</code>" is a pseudotarget. In <code class="literal">Jambase</code>,
+            <code class="literal">NOTFILE</code> is used to define several addition convenient
+            pseudotargets.
+          </p>
+<pre class="programlisting">NOUPDATE <span class="emphasis"><em>targets</em></span> ;
+</pre>
+<p>
+            Causes the timestamps on <span class="emphasis"><em>targets</em></span> to be ignored.
+            This has two effects: first, once the target has been created it will
+            never be updated; second, manually updating target will not cause other
+            targets to be updated. In <code class="literal">Jambase</code>, for example, this
+            rule is applied to directories by the <code class="literal">MkDir</code> rule,
+            because <code class="literal">MkDir</code> only cares that the target directory
+            exists, not when it has last been updated.
+          </p>
+<pre class="programlisting">TEMPORARY <span class="emphasis"><em>targets</em></span> ;
+</pre>
+<p>
+            Marks <span class="emphasis"><em>targets</em></span> as temporary, allowing them to be
+            removed after other targets that depend upon them have been updated.
+            If a <code class="literal">TEMPORARY</code> target is missing, <code class="literal">bjam</code>
+            uses the timestamp of the target's parent. <code class="literal">Jambase</code>
+            uses <code class="literal">TEMPORARY</code> to mark object files that are archived
+            in a library after they are built, so that they can be deleted after
+            they are archived.
+          </p>
+<pre class="programlisting">FAIL_EXPECTED <span class="emphasis"><em>targets</em></span> ;
+</pre>
+<p>
+            For handling targets whose build actions are expected to fail (e.g. when
+            testing that assertions or compile-time type checkin work properly),
+            Boost Jam supplies the <code class="literal">FAIL_EXPECTED</code> rule in the same
+            style as <code class="literal">NOCARE</code>, et. al. During target updating, the
+            return code of the build actions for arguments to <code class="literal">FAIL_EXPECTED</code>
+            is inverted: if it fails, building of dependent targets continues as
+            though it succeeded. If it succeeds, dependent targets are skipped.
+          </p>
+<pre class="programlisting">RMOLD <span class="emphasis"><em>targets</em></span> ;
+</pre>
+<p>
+            <code class="literal">BJam</code> removes any target files that may exist on disk
+            when the rule used to build those targets fails. However, targets whose
+            dependencies fail to build are not removed by default. The <code class="literal">RMOLD</code>
+            rule causes its arguments to be removed if any of their dependencies
+            fail to build.
+          </p>
+<pre class="programlisting">rule ISFILE ( <span class="emphasis"><em>targets</em></span> * )
+</pre>
+<p>
+            <code class="literal">ISFILE</code> marks targets as required to be files. This
+            changes the way <code class="literal">bjam</code> searches for the target such
+            that it ignores mathes for file system items that are not file, like
+            directories. This makes it possible to avoid <code class="computeroutput"><span class="preprocessor">#include</span> <span class="string">"exception"</span></code> matching if one happens
+            to have a directory named exception in the header search path.
+          </p>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+              This is currently not fully implemented.
+            </p></td></tr>
+</table></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.language.rules.builtins.utility"></a><a href="language.html#jam.language.rules.builtins.utility" title="Utility">Utility</a></h5></div></div></div>
+<p>
+            The two rules <code class="literal">ECHO</code> and <code class="literal">EXIT</code> are
+            utility rules, used only in <code class="literal">bjam</code>'s parsing phase.
+          </p>
+<pre class="programlisting">ECHO <span class="emphasis"><em>args</em></span> ;
+</pre>
+<p>
+            Blurts out the message <span class="emphasis"><em>args</em></span> to stdout.
+          </p>
+<pre class="programlisting">rule EXIT ( <span class="emphasis"><em>message</em></span> * : <span class="emphasis"><em>result-value</em></span> ? )
+</pre>
+<p>
+            Blurts out the <span class="emphasis"><em>message</em></span> to stdout and then exits
+            with a failure status if no <span class="emphasis"><em>result-value</em></span> is given,
+            otherwise it exits with the given <span class="emphasis"><em>result-value</em></span>.
+          </p>
+<p>
+            "<code class="literal">Echo</code>", "<code class="literal">echo</code>",
+            "<code class="literal">Exit</code>", and "<code class="literal">exit</code>"
+            are accepted as aliases for <code class="literal">ECHO</code> and <code class="literal">EXIT</code>,
+            since it is hard to tell that these are built-in rules and not part of
+            the language, like "<code class="literal">include</code>".
+          </p>
+<p>
+            The <code class="literal">GLOB</code> rule does filename globbing.
+          </p>
+<pre class="programlisting">GLOB <span class="emphasis"><em>directories</em></span> : <span class="emphasis"><em>patterns</em></span> : <span class="emphasis"><em>downcase-opt</em></span>
+</pre>
+<p>
+            Using the same wildcards as for the patterns in the switch statement.
+            It is invoked by being used as an argument to a rule invocation inside
+            of "<code class="literal">[ ]</code>". For example: "<code class="literal">FILES
+            = [ GLOB dir1 dir2 : *.c *.h ]</code>" sets <code class="literal">FILES</code>
+            to the list of C source and header files in <code class="literal">dir1</code> and
+            <code class="literal">dir2</code>. The resulting filenames are the full pathnames,
+            including the directory, but the pattern is applied only to the file
+            name without the directory.
+          </p>
+<p>
+            If <span class="emphasis"><em>downcase-opt</em></span> is supplied, filenames are converted
+            to all-lowercase before matching against the pattern; you can use this
+            to do case-insensitive matching using lowercase patterns. The paths returned
+            will still have mixed case if the OS supplies them. On Windows NT and
+            Cygwin, filenames are always downcased before matching.
+          </p>
+<p>
+            The <code class="literal">MATCH</code> rule does pattern matching.
+          </p>
+<pre class="programlisting">MATCH <span class="emphasis"><em>regexps</em></span> : <span class="emphasis"><em>list</em></span>
+</pre>
+<p>
+            Matches the <code class="literal">egrep</code>(1) style regular expressions <span class="emphasis"><em>regexps</em></span>
+            against the strings in <span class="emphasis"><em>list</em></span>. The result is the concatenation
+            of matching <code class="literal">()</code> subexpressions for each string in
+            <span class="emphasis"><em>list</em></span>, and for each regular expression in <span class="emphasis"><em>regexps</em></span>.
+            Only useful within the "<code class="literal">[ ]</code>" construct,
+            to change the result into a list.
+          </p>
+<pre class="programlisting">rule BACKTRACE ( )
+</pre>
+<p>
+            Returns a list of quadruples: <span class="emphasis"><em>filename</em></span> <span class="emphasis"><em>line</em></span> <span class="emphasis"><em>module</em></span> <span class="emphasis"><em>rulename</em></span>...,
+            describing each shallower level of the call stack. This rule can be used
+            to generate useful diagnostic messages from Jam rules.
+          </p>
+<pre class="programlisting">rule UPDATE ( <span class="emphasis"><em>targets</em></span> * )
+</pre>
+<p>
+            Classic jam treats any non-option element of command line as a name of
+            target to be updated. This prevented more sophisticated handling of command
+            line. This is now enabled again but with additional changes to the <code class="literal">UPDATE</code>
+            rule to allow for the flexibility of changing the list of targets to
+            update. The UPDATE rule has two effects:
+          </p>
+<div class="orderedlist"><ol type="1">
+<li>
+              It clears the list of targets to update, and
+            </li>
+<li>
+              Causes the specified targets to be updated.
+            </li>
+</ol></div>
+<p>
+            If no target was specified with the <code class="literal">UPDATE</code> rule, no
+            targets will be updated. To support changing of the update list in more
+            usefull ways, the rule also returns the targets previously in the update
+            list. This makes it possible to add targets as such:
+          </p>
+<pre class="programlisting">local previous-updates = [ UPDATE ] ;
+UPDATE $(previous-updates) a-new-target ;
+</pre>
+<pre class="programlisting">rule W32_GETREG ( <span class="emphasis"><em>path</em></span> : <span class="emphasis"><em>data</em></span> ? )
+</pre>
+<p>
+            Defined only for win32 platform. It reads the registry of Windows. '<span class="emphasis"><em>path</em></span>'
+            is the location of the information, and '<span class="emphasis"><em>data</em></span>' is
+            the name of the value which we want to get. If '<span class="emphasis"><em>data</em></span>'
+            is omitted, the default value of '<span class="emphasis"><em>path</em></span>' will be
+            returned. The '<span class="emphasis"><em>path</em></span>' value must conform to MS key
+            path format and must be prefixed with one of the predefined root keys.
+            As usual,
+          </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+              '<code class="literal">HKLM</code>' is equivalent to '<code class="literal">HKEY_LOCAL_MACHINE</code>'.
+            </li>
+<li>
+              '<code class="literal">HKCU</code>' is equivalent to '<code class="literal">HKEY_CURRENT_USER</code>'.
+            </li>
+<li>
+              '<code class="literal">HKCR</code>' is equivalent to '<code class="literal">HKEY_CLASSES_ROOT</code>'.
+            </li>
+</ul></div>
+<p>
+            Other predefined root keys are not supported.
+          </p>
+<p>
+            Currently supported data types : '<code class="literal">REG_DWORD</code>', '<code class="literal">REG_SZ</code>',
+            '<code class="literal">REG_EXPAND_SZ</code>', '<code class="literal">REG_MULTI_SZ</code>'.
+            The data with '<code class="literal">REG_DWORD</code>' type will be turned into
+            a string, '<code class="literal">REG_MULTI_SZ</code>' into a list of strings, and
+            for those with '<code class="literal">REG_EXPAND_SZ</code>' type environment variables
+            in it will be replaced with their defined values. The data with '<code class="literal">REG_SZ</code>'
+            type and other unsupported types will be put into a string without modification.
+            If it can't receive the value of the data, it just return an empty list.
+            For example,
+          </p>
+<pre class="programlisting">local PSDK-location =
+  [ W32_GETREG HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MicrosoftSDK\\Directories : "Install Dir" ] ;
+</pre>
+<pre class="programlisting">rule SHELL ( <span class="emphasis"><em>command</em></span> : * )
+</pre>
+<p>
+            <code class="literal">SHELL</code> executes <span class="emphasis"><em>command</em></span>, and then
+            returns the standard output of <span class="emphasis"><em>command</em></span>. <code class="literal">SHELL</code>
+            only works on platforms with a <code class="literal">popen()</code> function in
+            the C library. On platforms without a working <code class="literal">popen()</code>
+            function, <code class="literal">SHELL</code> is implemented as a no-op. <code class="literal">SHELL</code>
+            works on Unix, MacOS X, and most Windows compilers. <code class="literal">SHELL</code>
+            is a no-op on Metrowerks compilers under Windows. There is a variable
+            set of allowed options as additional arguments:
+          </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">exit-status</code></span></dt>
+<dd>
+              In addition to the output the result status of the executed command
+              is returned as a second element of the result.
+            </dd>
+<dt><span class="term"><code class="literal">no-output</code></span></dt>
+<dd>
+              Don't capture the output of the command. Instead an empty ("")
+              string value is returned in place of the output.
+            </dd>
+</dl>
+</div>
+<p>
+            Because the Perforce/Jambase defines a <code class="literal">SHELL</code> rule
+            which hides the builtin rule, <code class="literal">COMMAND</code> can be used
+            as an alias for <code class="literal">SHELL</code> in such a case.
+          </p>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.language.flow_of_control"></a><a href="language.html#jam.language.flow_of_control" title="Flow-of-Control">Flow-of-Control</a></h3></div></div></div>
+<p>
+        <code class="literal">BJam</code> has several simple flow-of-control statements:
+      </p>
+<pre class="programlisting">for <span class="emphasis"><em>var</em></span> in <span class="emphasis"><em>list</em></span> { <span class="emphasis"><em>statements</em></span> }
+</pre>
+<p>
+        Executes <span class="emphasis"><em>statements</em></span> for each element in <span class="emphasis"><em>list</em></span>,
+        setting the variable <span class="emphasis"><em>var</em></span> to the element value.
+      </p>
+<pre class="programlisting">if <span class="emphasis"><em>cond</em></span> { <span class="emphasis"><em>statements</em></span> }
+[ else { <span class="emphasis"><em>statements</em></span> } ]
+</pre>
+<p>
+        Does the obvious; the <code class="literal">else</code> clause is optional. <span class="emphasis"><em>cond</em></span>
+        is built of:
+      </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>a</em></span></code></span></dt>
+<dd>
+          true if any <span class="emphasis"><em>a</em></span> element is a non-zero-length string
+        </dd>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>a</em></span> = <span class="emphasis"><em>b</em></span></code></span></dt>
+<dd>
+          list <span class="emphasis"><em>a</em></span> matches list <span class="emphasis"><em>b</em></span> string-for-string
+        </dd>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>a</em></span> != <span class="emphasis"><em>b</em></span></code></span></dt>
+<dd>
+          list <span class="emphasis"><em>a</em></span> does not match list <span class="emphasis"><em>b</em></span>
+</dd>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>a</em></span> &lt;
+        <span class="emphasis"><em>b</em></span></code></span></dt>
+<dd>
+<span class="emphasis"><em>a[i]</em></span> string is less than <span class="emphasis"><em>b[i]</em></span>
+          string, where <span class="emphasis"><em>i</em></span> is first mismatched element in lists
+          <span class="emphasis"><em>a</em></span> and <span class="emphasis"><em>b</em></span>
+</dd>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>a</em></span> &lt;=
+        <span class="emphasis"><em>b</em></span></code></span></dt>
+<dd>
+          every <span class="emphasis"><em>a</em></span> string is less than or equal to its <span class="emphasis"><em>b</em></span>
+          counterpart
+        </dd>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>a</em></span> &gt;
+        <span class="emphasis"><em>b</em></span></code></span></dt>
+<dd>
+<span class="emphasis"><em>a[i]</em></span> string is greater than <span class="emphasis"><em>b[i]</em></span>
+          string, where <span class="emphasis"><em>i</em></span> is first mismatched element
+        </dd>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>a</em></span> &gt;=
+        <span class="emphasis"><em>b</em></span></code></span></dt>
+<dd>
+          every <span class="emphasis"><em>a</em></span> string is greater than or equal to its <span class="emphasis"><em>b</em></span>
+          counterpart
+        </dd>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>a</em></span> in <span class="emphasis"><em>b</em></span></code></span></dt>
+<dd>
+          true if all elements of <span class="emphasis"><em>a</em></span> can be found in <span class="emphasis"><em>b</em></span>,
+          or if <span class="emphasis"><em>a</em></span> has no elements
+        </dd>
+<dt><span class="term"><code class="literal">! <span class="emphasis"><em>cond</em></span></code></span></dt>
+<dd>
+          condition not true
+        </dd>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>cond</em></span> &amp;&amp;
+        <span class="emphasis"><em>cond</em></span></code></span></dt>
+<dd>
+          conjunction
+        </dd>
+<dt><span class="term"><code class="literal"><span class="emphasis"><em>cond</em></span> ||
+        <span class="emphasis"><em>cond</em></span></code></span></dt>
+<dd>
+          disjunction
+        </dd>
+<dt><span class="term"><code class="literal">( <span class="emphasis"><em>cond</em></span>
+        )</code></span></dt>
+<dd>
+          precedence grouping
+        </dd>
+</dl>
+</div>
+<pre class="programlisting">include <span class="emphasis"><em>file</em></span> ;
+</pre>
+<p>
+        Causes <code class="literal">bjam</code> to read the named <span class="emphasis"><em>file</em></span>.
+        The <span class="emphasis"><em>file</em></span> is bound like a regular target (see Binding
+        above) but unlike a regular target the include <span class="emphasis"><em>file</em></span>
+        cannot be built.
+      </p>
+<p>
+        The include <span class="emphasis"><em>file</em></span> is inserted into the input stream during
+        the parsing phase. The primary input file and all the included file(s) are
+        treated as a single file; that is, jam infers no scope boundaries from included
+        files.
+      </p>
+<pre class="programlisting">local <span class="emphasis"><em>vars</em></span> [ = <span class="emphasis"><em>values</em></span> ] ;
+</pre>
+<p>
+        Creates new <span class="emphasis"><em>vars</em></span> inside to the enclosing <code class="literal">{}</code>
+        block, obscuring any previous values they might have. The previous values
+        for vars are restored when the current block ends. Any rule called or file
+        included will see the local and not the previous value (this is sometimes
+        called Dynamic Scoping). The local statement may appear anywhere, even outside
+        of a block (in which case the previous value is restored when the input ends).
+        The <span class="emphasis"><em>vars</em></span> are initialized to <span class="emphasis"><em>values</em></span>
+        if present, or left uninitialized otherwise.
+      </p>
+<pre class="programlisting">return <span class="emphasis"><em>values</em></span> ;
+</pre>
+<p>
+        Within a rule body, the return statement sets the return value for an invocation
+        of the rule. It does <span class="bold"><strong>not</strong></span> cause the rule
+        to return; a rule's value is actually the value of the last statement executed,
+        so a return should be the last statement executed before the rule "naturally"
+        returns.
+      </p>
+<pre class="programlisting">switch <span class="emphasis"><em>value</em></span>
+{
+    case <span class="emphasis"><em>pattern1</em></span> : <span class="emphasis"><em>statements</em></span> ;
+    case <span class="emphasis"><em>pattern2</em></span> : <span class="emphasis"><em>statements</em></span> ;
+    ...
+}
+</pre>
+<p>
+        The switch statement executes zero or one of the enclosed <span class="emphasis"><em>statements</em></span>,
+        depending on which, if any, is the first case whose <span class="emphasis"><em>pattern</em></span>
+        matches <span class="emphasis"><em>value</em></span>. The <span class="emphasis"><em>pattern</em></span> values
+        are not variable-expanded. The pattern values may include the following wildcards:
+      </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">?</code></span></dt>
+<dd>
+          match any single character
+        </dd>
+<dt><span class="term"><code class="literal">*</code></span></dt>
+<dd>
+          match zero or more characters
+        </dd>
+<dt><span class="term"><code class="literal">[<span class="emphasis"><em>chars</em></span>]</code></span></dt>
+<dd>
+          match any single character in <span class="emphasis"><em>chars</em></span>
+</dd>
+<dt><span class="term"><code class="literal">[^<span class="emphasis"><em>chars</em></span>]</code></span></dt>
+<dd>
+          match any single character not in <span class="emphasis"><em>chars</em></span>
+</dd>
+<dt><span class="term"><code class="literal">\<span class="emphasis"><em>x</em></span></code></span></dt>
+<dd>
+          match <span class="emphasis"><em>x</em></span> (escapes the other wildcards)
+        </dd>
+</dl>
+</div>
+<pre class="programlisting">while <span class="emphasis"><em>cond</em></span> { <span class="emphasis"><em>statements</em></span> }
+</pre>
+<p>
+        Repeatedly execute <span class="emphasis"><em>statements</em></span> while <span class="emphasis"><em>cond</em></span>
+        remains true upon entry. (See the description of <span class="emphasis"><em>cond</em></span>
+        expression syntax under if, above).
+      </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.language.variables"></a><a href="language.html#jam.language.variables" title="Variables">Variables</a></h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="language.html#jam.language.variables.expansion"> Variable Expansion</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.variables.local_for_loop_variables">Local
+        For Loop Variables</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.variables.builtins"> Built-in Variables</a></span></dt>
+</dl></div>
+<p>
+        <code class="literal">BJam</code> variables are lists of zero or more elements, with
+        each element being a string value. An undefined variable is indistinguishable
+        from a variable with an empty list, however, a defined variable may have
+        one more elements which are null strings. All variables are referenced as
+        <code class="literal">$(<span class="emphasis"><em>variable</em></span>)</code>.
+      </p>
+<p>
+        Variables are either global or target-specific. In the latter case, the variable
+        takes on the given value only during the updating of the specific target.
+      </p>
+<p>
+        A variable is defined with:
+      </p>
+<pre class="programlisting"><span class="emphasis"><em>variable</em></span> = <span class="emphasis"><em>elements</em></span> ;
+<span class="emphasis"><em>variable</em></span> += <span class="emphasis"><em>elements</em></span> ;
+<span class="emphasis"><em>variable</em></span> on <span class="emphasis"><em>targets</em></span> = <span class="emphasis"><em>elements</em></span> ;
+<span class="emphasis"><em>variable</em></span> on <span class="emphasis"><em>targets</em></span> += <span class="emphasis"><em>elements</em></span> ;
+<span class="emphasis"><em>variable</em></span> default = <span class="emphasis"><em>elements</em></span> ;
+<span class="emphasis"><em>variable</em></span> ?= <span class="emphasis"><em>elements</em></span> ;
+</pre>
+<p>
+        The first two forms set <span class="emphasis"><em>variable</em></span> globally. The third
+        and forth forms set a target-specific variable. The <code class="literal">=</code>
+        operator replaces any previous elements of <span class="emphasis"><em>variable</em></span>
+        with <span class="emphasis"><em>elements</em></span>; the <code class="literal">+=</code> operation adds
+        <span class="emphasis"><em>elements</em></span> to <span class="emphasis"><em>variable</em></span>'s list of
+        elements. The final two forms are synonymous: they set <span class="emphasis"><em>variable</em></span>
+        globally, but only if it was previously unset.
+      </p>
+<p>
+        Variables referenced in updating commands will be replaced with their values;
+        target-specific values take precedence over global values. Variables passed
+        as arguments (<code class="literal">$(1)</code> and <code class="literal">$(2)</code>) to actions
+        are replaced with their bound values; the "<code class="literal">bind</code>"
+        modifier can be used on actions to cause other variables to be replaced with
+        bound values. See Action Modifiers above.
+      </p>
+<p>
+        <code class="literal">BJam</code> variables are not re-exported to the environment
+        of the shell that executes the updating actions, but the updating actions
+        can reference <code class="literal">bjam</code> variables with <code class="literal">$(<span class="emphasis"><em>variable</em></span>)</code>.
+      </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.variables.expansion"></a><a href="language.html#jam.language.variables.expansion" title=" Variable Expansion"> Variable Expansion</a></h4></div></div></div>
+<p>
+          During parsing, <code class="literal">bjam</code> performs variable expansion on
+          each token that is not a keyword or rule name. Such tokens with embedded
+          variable references are replaced with zero or more tokens. Variable references
+          are of the form <code class="literal">$(<span class="emphasis"><em>v</em></span>)</code> or <code class="literal">$(<span class="emphasis"><em>vm</em></span>)</code>,
+          where <span class="emphasis"><em>v</em></span> is the variable name, and <span class="emphasis"><em>m</em></span>
+          are optional modifiers.
+        </p>
+<p>
+          Variable expansion in a rule's actions is similar to variable expansion
+          in statements, except that the action string is tokenized at whitespace
+          regardless of quoting.
+        </p>
+<p>
+          The result of a token after variable expansion is the <span class="emphasis"><em>product</em></span>
+          of the components of the token, where each component is a literal substring
+          or a list substituting a variable reference. For example:
+        </p>
+<pre class="programlisting">$(X) -&gt; a b c
+t$(X) -&gt; ta tb tc
+$(X)z -&gt; az bz cz
+$(X)-$(X) -&gt; a-a a-b a-c b-a b-b b-c c-a c-b c-c
+</pre>
+<p>
+          The variable name and modifiers can themselves contain a variable reference,
+          and this partakes of the product as well:
+        </p>
+<pre class="programlisting">$(X) -&gt; a b c
+$(Y) -&gt; 1 2
+$(Z) -&gt; X Y
+$($(Z)) -&gt; a b c 1 2
+</pre>
+<p>
+          Because of this product expansion, if any variable reference in a token
+          is undefined, the result of the expansion is an empty list. If any variable
+          element is a null string, the result propagates the non-null elements:
+        </p>
+<pre class="programlisting">$(X) -&gt; a ""
+$(Y) -&gt; "" 1
+$(Z) -&gt;
+-$(X)$(Y)- -&gt; -a- -a1- -- -1-
+-$(X)$(Z)- -&gt;
+</pre>
+<p>
+          A variable element's string value can be parsed into grist and filename-related
+          components. Modifiers to a variable are used to select elements, select
+          components, and replace components. The modifiers are:
+        </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">[<span class="emphasis"><em>n</em></span>]</code></span></dt>
+<dd>
+            Select element number <span class="emphasis"><em>n</em></span> (starting at 1). If the
+            variable contains fewer than <span class="emphasis"><em>n</em></span> elements, the result
+            is a zero-element list. <span class="emphasis"><em>n</em></span> can be negative in which
+            case the element number <span class="emphasis"><em>n</em></span> from the last leftward
+            is returned.
+          </dd>
+<dt><span class="term"><code class="literal">[<span class="emphasis"><em>n</em></span>-<span class="emphasis"><em>m</em></span>]</code></span></dt>
+<dd>
+            Select elements number <span class="emphasis"><em>n</em></span> through <span class="emphasis"><em>m</em></span>.
+            <span class="emphasis"><em>n</em></span> and <span class="emphasis"><em>m</em></span> can be negative in
+            which case they refer to elements counting from the last leftward.
+          </dd>
+<dt><span class="term"><code class="literal">[<span class="emphasis"><em>n</em></span>-]</code></span></dt>
+<dd>
+            Select elements number <span class="emphasis"><em>n</em></span> through the last. <span class="emphasis"><em>n</em></span>
+            can be negative in which case it refers to the element counting from
+            the last leftward.
+          </dd>
+<dt><span class="term"><code class="literal">:B</code></span></dt>
+<dd>
+            Select filename base.
+          </dd>
+<dt><span class="term"><code class="literal">:S</code></span></dt>
+<dd>
+            Select (last) filename suffix.
+          </dd>
+<dt><span class="term"><code class="literal">:M</code></span></dt>
+<dd>
+            Select archive member name.
+          </dd>
+<dt><span class="term"><code class="literal">:D</code></span></dt>
+<dd>
+            Select directory path.
+          </dd>
+<dt><span class="term"><code class="literal">:P</code></span></dt>
+<dd>
+            Select parent directory.
+          </dd>
+<dt><span class="term"><code class="literal">:G</code></span></dt>
+<dd>
+            Select grist.
+          </dd>
+<dt><span class="term"><code class="literal">:U</code></span></dt>
+<dd>
+            Replace lowercase characters with uppercase.
+          </dd>
+<dt><span class="term"><code class="literal">:L</code></span></dt>
+<dd>
+            Replace uppercase characters with lowercase.
+          </dd>
+<dt><span class="term"><code class="literal">:W</code></span></dt>
+<dd>
+            When invoking Windows-based tools from <a href="http://www.cygwin.com/" target="_top">Cygwin</a>
+            it can be important to pass them true windows-style paths. The <code class="literal">:W</code>
+            modifier, <span class="bold"><strong>under Cygwin only</strong></span>, turns a
+            cygwin path into a Win32 path using the <a href="http://www.cygwin.com/cygwin-api/func-cygwin-conv-to-win32-path.html" target="_top"><code class="literal">cygwin_conv_to_win32_path</code></a>
+            function. On other platforms, the string is unchanged. For example 
+<pre class="programlisting">
+
+<span class="identifier">x</span> <span class="special">=</span> <span class="string">"/cygdrive/c/Program Files/Borland"</span> <span class="special">;</span> <span class="identifier">ECHO</span> #<span class="special">(</span><span class="identifier">x</span><span class="special">:</span><span class="identifier">W</span><span class="special">)</span> <span class="special">;</span>
+</pre>
+            prints <code class="literal">"C:\Program Files\Borland"</code> on Cygwin
+          </dd>
+<dt><span class="term"><code class="literal">:<span class="emphasis"><em>chars</em></span></code></span></dt>
+<dd>
+            Select the components listed in <span class="emphasis"><em>chars</em></span>.
+          </dd>
+<dt><span class="term"><code class="literal">:G=<span class="emphasis"><em>grist</em></span></code></span></dt>
+<dd>
+            Replace grist with <span class="emphasis"><em>grist</em></span>.
+          </dd>
+<dt><span class="term"><code class="literal">:D=<span class="emphasis"><em>path</em></span></code></span></dt>
+<dd>
+            Replace directory with <span class="emphasis"><em>path</em></span>.
+          </dd>
+<dt><span class="term"><code class="literal">:B=<span class="emphasis"><em>base</em></span></code></span></dt>
+<dd>
+            Replace the base part of file name with <span class="emphasis"><em>base</em></span>.
+          </dd>
+<dt><span class="term"><code class="literal">:S=<span class="emphasis"><em>suf</em></span></code></span></dt>
+<dd>
+            Replace the suffix of file name with <span class="emphasis"><em>suf</em></span>.
+          </dd>
+<dt><span class="term"><code class="literal">:M=<span class="emphasis"><em>mem</em></span></code></span></dt>
+<dd>
+            Replace the archive member name with <span class="emphasis"><em>mem</em></span>.
+          </dd>
+<dt><span class="term"><code class="literal">:R=<span class="emphasis"><em>root</em></span></code></span></dt>
+<dd>
+            Prepend <span class="emphasis"><em>root</em></span> to the whole file name, if not already
+            rooted.
+          </dd>
+<dt><span class="term"><code class="literal">:E=<span class="emphasis"><em>value</em></span></code></span></dt>
+<dd>
+            Assign <span class="emphasis"><em>value</em></span> to the variable if it is unset.
+          </dd>
+<dt><span class="term"><code class="literal">:J=<span class="emphasis"><em>joinval</em></span></code></span></dt>
+<dd>
+            Concatentate list elements into single element, separated by <span class="emphasis"><em>joinval</em></span>'.
+          </dd>
+</dl>
+</div>
+<p>
+          On VMS, <code class="literal">$(var:P)</code> is the parent directory of <code class="literal">$(var:D)</code>.
+        </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.variables.local_for_loop_variables"></a><a href="language.html#jam.language.variables.local_for_loop_variables" title="Local
+        For Loop Variables">Local
+        For Loop Variables</a></h4></div></div></div>
+<p>
+          Boost Jam allows you to declare a local for loop control variable right
+          in the loop:
+        </p>
+<pre class="programlisting">x = 1 2 3 ;
+y = 4 5 6 ;
+for <span class="bold"><strong>local</strong></span> y in $(x)
+{
+    ECHO $(y) ; # prints "1", "2", or "3"
+}
+ECHO $(y) ;     # prints "4 5 6"
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.variables.builtins"></a><a href="language.html#jam.language.variables.builtins" title=" Built-in Variables"> Built-in Variables</a></h4></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="language.html#jam.language.variables.builtins.search"> SEARCH and
+          LOCATE</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.variables.builtins.hdrscan"> HDRSCAN
+          and HDRRULE</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.variables.builtins.semaphores">Semaphores</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.variables.builtins.platform_identifier">Platform
+          Identifier</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.variables.builtins.jam_version">Jam
+          Version</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.variables.builtins.jamshell">JAMSHELL</a></span></dt>
+</dl></div>
+<p>
+          This section discusses variables that have special meaning to <code class="literal">bjam</code>.
+        </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.language.variables.builtins.search"></a><a href="language.html#jam.language.variables.builtins.search" title=" SEARCH and
+          LOCATE"> SEARCH and
+          LOCATE</a></h5></div></div></div>
+<p>
+            These two variables control the binding of file target names to locations
+            in the file system. Generally, <code class="literal">$(SEARCH)</code> is used to
+            find existing sources while <code class="literal">$(LOCATE)</code> is used to fix
+            the location for built targets.
+          </p>
+<p>
+            Rooted (absolute path) file targets are bound as is. Unrooted file target
+            names are also normally bound as is, and thus relative to the current
+            directory, but the settings of <code class="literal">$(LOCATE)</code> and <code class="literal">$(SEARCH)</code>
+            alter this:
+          </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+              If <code class="literal">$(LOCATE)</code> is set then the target is bound relative
+              to the first directory in <code class="literal">$(LOCATE)</code>. Only the first
+              element is used for binding.
+            </li>
+<li>
+              If <code class="literal">$(SEARCH)</code> is set then the target is bound to
+              the first directory in <code class="literal">$(SEARCH)</code> where the target
+              file already exists.
+            </li>
+<li>
+              If the <code class="literal">$(SEARCH)</code> search fails, the target is bound
+              relative to the current directory anyhow.
+            </li>
+</ul></div>
+<p>
+            Both <code class="literal">$(SEARCH)</code> and <code class="literal">$(LOCATE)</code> should
+            be set target-specific and not globally. If they were set globally,
+            <code class="literal">bjam</code> would use the same paths for all file binding,
+            which is not likely to produce sane results. When writing your own rules,
+            especially ones not built upon those in Jambase, you may need to set
+            <code class="literal">$(SEARCH)</code> or <code class="literal">$(LOCATE)</code> directly.
+            Almost all of the rules defined in Jambase set <code class="literal">$(SEARCH)</code>
+            and <code class="literal">$(LOCATE)</code> to sensible values for sources they
+            are looking for and targets they create, respectively.
+          </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.language.variables.builtins.hdrscan"></a><a href="language.html#jam.language.variables.builtins.hdrscan" title=" HDRSCAN
+          and HDRRULE"> HDRSCAN
+          and HDRRULE</a></h5></div></div></div>
+<p>
+            These two variables control header file scanning. <code class="literal">$(HDRSCAN)</code>
+            is an <code class="literal">egrep(1)</code> pattern, with ()'s surrounding the
+            file name, used to find file inclusion statements in source files. <code class="literal">Jambase</code>
+            uses <code class="literal">$(HDRPATTERN)</code> as the pattern for <code class="literal">$(HDRSCAN)</code>.
+            <code class="literal">$(HDRRULE)</code> is the name of a rule to invoke with the
+            results of the scan: the scanned file is the target, the found files
+            are the sources. This is the only place where <code class="literal">bjam</code>
+            invokes a rule through a variable setting.
+          </p>
+<p>
+            Both <code class="literal">$(HDRSCAN)</code> and <code class="literal">$(HDRRULE)</code>
+            must be set for header file scanning to take place, and they should be
+            set target-specific and not globally. If they were set globally, all
+            files, including executables and libraries, would be scanned for header
+            file include statements.
+          </p>
+<p>
+            The scanning for header file inclusions is not exact, but it is at least
+            dynamic, so there is no need to run something like <code class="literal">makedepend(GNU)</code>
+            to create a static dependency file. The scanning mechanism errs on the
+            side of inclusion (i.e., it is more likely to return filenames that are
+            not actually used by the compiler than to miss include files) because
+            it can't tell if <code class="computeroutput"><span class="preprocessor">#include</span></code>
+            lines are inside <code class="computeroutput"><span class="preprocessor">#ifdefs</span></code>
+            or other conditional logic. In <code class="literal">Jambase</code>, <code class="literal">HdrRule</code>
+            applies the <code class="literal">NOCARE</code> rule to each header file found
+            during scanning so that if the file isn't present yet doesn't cause the
+            compilation to fail, <code class="literal">bjam</code> won't care.
+          </p>
+<p>
+            Also, scanning for regular expressions only works where the included
+            file name is literally in the source file. It can't handle languages
+            that allow including files using variable names (as the <code class="literal">Jam</code>
+            language itself does).
+          </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.language.variables.builtins.semaphores"></a><a href="language.html#jam.language.variables.builtins.semaphores" title="Semaphores">Semaphores</a></h5></div></div></div>
+<p>
+            It is sometimes desirable to disallow parallel execution of some actions.
+            For example:
+          </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+              Old versions of yacc use files with fixed names. So, running two yacc
+              actions is dangerous.
+            </li>
+<li>
+              One might want to perform parallel compiling, but not do parallel linking,
+              because linking is i/o bound and only gets slower.
+            </li>
+</ul></div>
+<p>
+            Craig McPeeters has extended Perforce Jam to solve such problems, and
+            that extension was integrated in Boost.Jam.
+          </p>
+<p>
+            Any target can be assigned a <span class="emphasis"><em>semaphore</em></span>, by setting
+            a variable called <code class="literal">SEMAPHORE</code> on that target. The value
+            of the variable is the semaphore name. It must be different from names
+            of any declared target, but is arbitrary otherwise.
+          </p>
+<p>
+            The semantic of semaphores is that in a group of targets which have the
+            same semaphore, only one can be updated at the moment, regardless of
+            "<code class="literal">-j</code>" option.
+          </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.language.variables.builtins.platform_identifier"></a><a href="language.html#jam.language.variables.builtins.platform_identifier" title="Platform
+          Identifier">Platform
+          Identifier</a></h5></div></div></div>
+<p>
+            A number of Jam built-in variables can be used to identify runtime platform:
+          </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">OS</code></span></dt>
+<dd>
+              OS identifier string
+            </dd>
+<dt><span class="term"><code class="literal">OSPLAT</code></span></dt>
+<dd>
+              Underlying architecture, when applicable
+            </dd>
+<dt><span class="term"><code class="literal">MAC</code></span></dt>
+<dd>
+              true on MAC platform
+            </dd>
+<dt><span class="term"><code class="literal">NT</code></span></dt>
+<dd>
+              true on NT platform
+            </dd>
+<dt><span class="term"><code class="literal">OS2</code></span></dt>
+<dd>
+              true on OS2 platform
+            </dd>
+<dt><span class="term"><code class="literal">UNIX</code></span></dt>
+<dd>
+              true on Unix platforms
+            </dd>
+<dt><span class="term"><code class="literal">VMS</code></span></dt>
+<dd>
+              true on VMS platform
+            </dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.language.variables.builtins.jam_version"></a><a href="language.html#jam.language.variables.builtins.jam_version" title="Jam
+          Version">Jam
+          Version</a></h5></div></div></div>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">JAMDATE</code></span></dt>
+<dd>
+              Time and date at <code class="literal">bjam</code> start-up.
+            </dd>
+<dt><span class="term"><code class="literal">JAMUNAME</code></span></dt>
+<dd>
+              Ouput of uname(1) command (Unix only)
+            </dd>
+<dt><span class="term"><code class="literal">JAMVERSION</code></span></dt>
+<dd>
+<code class="literal">bjam</code> version, currently "3.1.13"
+            </dd>
+<dt><span class="term"><code class="literal">JAM_VERSION</code></span></dt>
+<dd>
+              A predefined global variable with two elements indicates the version
+              number of Boost Jam. Boost Jam versions start at "<code class="literal">03</code>"
+              "<code class="literal">00</code>". Earlier versions of <code class="literal">Jam</code>
+              do not automatically define <code class="literal">JAM_VERSION</code>.
+            </dd>
+</dl>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.language.variables.builtins.jamshell"></a><a href="language.html#jam.language.variables.builtins.jamshell" title="JAMSHELL">JAMSHELL</a></h5></div></div></div>
+<p>
+            When <code class="literal">bjam</code> executes a rule's action block, it forks
+            and execs a shell, passing the action block as an argument to the shell.
+            The invocation of the shell can be controlled by <code class="literal">$(JAMSHELL)</code>.
+            The default on Unix is, for example:
+          </p>
+<pre class="programlisting">JAMSHELL = /bin/sh -c % ;
+</pre>
+<p>
+            The <code class="literal">%</code> is replaced with the text of the action block.
+          </p>
+<p>
+            <code class="literal">BJam</code> does not directly support building in parallel
+            across multiple hosts, since that is heavily dependent on the local environment.
+            To build in parallel across multiple hosts, you need to write your own
+            shell that provides access to the multiple hosts. You then reset <code class="literal">$(JAMSHELL)</code>
+            to reference it.
+          </p>
+<p>
+            Just as <code class="literal">bjam</code> expands a <code class="literal">%</code> to be
+            the text of the rule's action block, it expands a <code class="literal">!</code>
+            to be the multi-process slot number. The slot number varies between 1
+            and the number of concurrent jobs permitted by the <code class="literal">-j</code>
+            flag given on the command line. Armed with this, it is possible to write
+            a multiple host shell. For example:
+          </p>
+<pre class="programlisting">#!/bin/sh
+
+# This sample JAMSHELL uses the SunOS on(1) command to execute a
+# command string with an identical environment on another host.
+
+# Set JAMSHELL = jamshell ! %
+#
+# where jamshell is the name of this shell file.
+#
+# This version handles up to -j6; after that they get executed
+# locally.
+
+case $1 in
+1|4) on winken sh -c "$2";;
+2|5) on blinken sh -c "$2";;
+3|6) on nod sh -c "$2";;
+*) eval "$2";;
+esac
+</pre>
+</div>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.language.modules"></a><a href="language.html#jam.language.modules" title="Modules">Modules</a></h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="language.html#jam.language.modules.declaration">Declaration</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.modules.variable_scope">Variable Scope</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.modules.local_rules">Local Rules</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.modules.the__rulenames__rule">The <code class="literal">RULENAMES</code>
+        Rule</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.modules.the__varnames__rule">The <code class="literal">VARNAMES</code>
+        Rule</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.modules.the__import__rule">The <code class="literal">IMPORT</code>
+        Rule</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.modules.the__export__rule">The <code class="literal">EXPORT</code>
+        Rule</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.modules.the__caller_module__rule">The
+        <code class="literal">CALLER_MODULE</code> Rule</a></span></dt>
+<dt><span class="section"><a href="language.html#jam.language.modules.the__delete_module__rule">The
+        <code class="literal">DELETE_MODULE</code> Rule</a></span></dt>
+</dl></div>
+<p>
+        Boost Jam introduces support for modules, which provide some rudimentary
+        namespace protection for rules and variables. A new keyword, "<code class="literal">module</code>"
+        was also introduced. The features described in this section are primitives,
+        meaning that they are meant to provide the operations needed to write Jam
+        rules which provide a more elegant module interface.
+      </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.modules.declaration"></a><a href="language.html#jam.language.modules.declaration" title="Declaration">Declaration</a></h4></div></div></div>
+<pre class="programlisting">module <span class="emphasis"><em>expression</em></span> { ... }
+</pre>
+<p>
+          Code within the <code class="literal">{ ... }</code> executes within the module named
+          by evaluating expression. Rule definitions can be found in the module's
+          own namespace, and in the namespace of the global module as <span class="emphasis"><em>module-name</em></span>.<span class="emphasis"><em>rule-name</em></span>,
+          so within a module, other rules in that module may always be invoked without
+          qualification:
+        </p>
+<pre class="programlisting"><span class="bold"><strong>module my_module</strong></span>
+<span class="bold"><strong>{</strong></span>
+    rule salute ( x ) { ECHO $(x), world ; }
+    rule greet ( ) { salute hello ; }
+    greet ;
+<span class="bold"><strong>}</strong></span>
+<span class="bold"><strong>my_module.salute</strong></span> goodbye ;
+</pre>
+<p>
+          When an invoked rule is not found in the current module's namespace, it
+          is looked up in the namespace of the global module, so qualified calls
+          work across modules:
+        </p>
+<pre class="programlisting">module your_module
+{
+    rule bedtime ( ) { <span class="bold"><strong>my_module.salute</strong></span> goodnight ; }
+}
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.modules.variable_scope"></a><a href="language.html#jam.language.modules.variable_scope" title="Variable Scope">Variable Scope</a></h4></div></div></div>
+<p>
+          Each module has its own set of dynamically nested variable scopes. When
+          execution passes from module A to module B, all the variable bindings from
+          A become unavailable, and are replaced by the bindings that belong to B.
+          This applies equally to local and global variables:
+        </p>
+<pre class="programlisting">module A
+{
+    x = 1 ;
+    rule f ( )
+    {
+        local y = 999 ; # becomes visible again when B.f calls A.g
+        B.f ;
+    }
+    rule g ( )
+    {
+        ECHO $(y) ;     # prints "999"
+    }
+}
+module B
+{
+    y = 2 ;
+    rule f ( )
+    {
+        ECHO $(y) ; # always prints "2"
+        A.g ;
+    }
+}
+</pre>
+<p>
+          The only way to access another module's variables is by entering that module:
+        </p>
+<pre class="programlisting">rule peek ( module-name ? : variables + )
+{
+    module $(module-name)
+    {
+        return $($(&gt;)) ;
+    }
+}
+</pre>
+<p>
+          Note that because existing variable bindings change whenever a new module
+          scope is entered, argument bindings become unavailable. That explains the
+          use of "<code class="literal">$(&gt;)</code>" in the peek rule above.
+        </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.modules.local_rules"></a><a href="language.html#jam.language.modules.local_rules" title="Local Rules">Local Rules</a></h4></div></div></div>
+<pre class="programlisting">local rule <span class="emphasis"><em>rulename</em></span>...
+</pre>
+<p>
+          The rule is declared locally to the current module. It is not entered in
+          the global module with qualification, and its name will not appear in the
+          result of:
+        </p>
+<pre class="programlisting">[ RULENAMES <span class="emphasis"><em>module-name</em></span> ]
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.modules.the__rulenames__rule"></a><a href="language.html#jam.language.modules.the__rulenames__rule" title="The RULENAMES
+        Rule">The <code class="literal">RULENAMES</code>
+        Rule</a></h4></div></div></div>
+<pre class="programlisting">rule RULENAMES ( <span class="emphasis"><em>module</em></span> ? )
+</pre>
+<p>
+          Returns a list of the names of all non-local rules in the given module.
+          If <span class="emphasis"><em>module</em></span> is omitted, the names of all non-local rules
+          in the global module are returned.
+        </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.modules.the__varnames__rule"></a><a href="language.html#jam.language.modules.the__varnames__rule" title="The VARNAMES
+        Rule">The <code class="literal">VARNAMES</code>
+        Rule</a></h4></div></div></div>
+<pre class="programlisting">rule VARNAMES ( <span class="emphasis"><em>module</em></span> ? )
+</pre>
+<p>
+          Returns a list of the names of all variable bindings in the given module.
+          If <span class="emphasis"><em>module</em></span> is omitted, the names of all variable bindings
+          in the global module are returned.
+        </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+            This includes any local variables in rules from the call stack which
+            have not returned at the time of the <code class="literal">VARNAMES</code> invocation.
+          </p></td></tr>
+</table></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.modules.the__import__rule"></a><a href="language.html#jam.language.modules.the__import__rule" title="The IMPORT
+        Rule">The <code class="literal">IMPORT</code>
+        Rule</a></h4></div></div></div>
+<p>
+          <code class="literal">IMPORT</code> allows rule name aliasing across modules:
+        </p>
+<pre class="programlisting">rule IMPORT ( <span class="emphasis"><em>source_module</em></span> ? : <span class="emphasis"><em>source_rules</em></span> *
+            : <span class="emphasis"><em>target_module</em></span> ? : <span class="emphasis"><em>target_rules</em></span> * )
+</pre>
+<p>
+          The <code class="literal">IMPORT</code> rule copies rules from the <span class="emphasis"><em>source_module</em></span>
+          into the <span class="emphasis"><em>target_module</em></span> as local rules. If either
+          <span class="emphasis"><em>source_module</em></span> or <span class="emphasis"><em>target_module</em></span>
+          is not supplied, it refers to the global module. <span class="emphasis"><em>source_rules</em></span>
+          specifies which rules from the <span class="emphasis"><em>source_module</em></span> to import;
+          <span class="emphasis"><em>target_rules</em></span> specifies the names to give those rules
+          in <span class="emphasis"><em>target_module</em></span>. If <span class="emphasis"><em>source_rules</em></span>
+          contains a name which doesn't correspond to a rule in <span class="emphasis"><em>source_module</em></span>,
+          or if it contains a different number of items than <span class="emphasis"><em>target_rules</em></span>,
+          an error is issued. For example,
+        </p>
+<pre class="programlisting"># import m1.rule1 into m2 as local rule m1-rule1.
+IMPORT m1 : rule1 : m2 : m1-rule1 ;
+# import all non-local rules from m1 into m2
+IMPORT m1 : [ RULENAMES m1 ] : m2 : [ RULENAMES m1 ] ;
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.modules.the__export__rule"></a><a href="language.html#jam.language.modules.the__export__rule" title="The EXPORT
+        Rule">The <code class="literal">EXPORT</code>
+        Rule</a></h4></div></div></div>
+<p>
+          <code class="literal">EXPORT</code> allows rule name aliasing across modules:
+        </p>
+<pre class="programlisting">rule EXPORT ( <span class="emphasis"><em>module</em></span> ? : <span class="emphasis"><em>rules</em></span> * )
+</pre>
+<p>
+          The <code class="literal">EXPORT</code> rule marks <span class="emphasis"><em>rules</em></span> from
+          the <code class="literal">source_module</code> as non-local (and thus exportable).
+          If an element of <span class="emphasis"><em>rules</em></span> does not name a rule in <span class="emphasis"><em>module</em></span>,
+          an error is issued. For example,
+        </p>
+<pre class="programlisting">module X {
+  local rule r { ECHO X.r ; }
+}
+IMPORT X : r : : r ; # error - r is local in X
+EXPORT X : r ;
+IMPORT X : r : : r ; # OK.
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.modules.the__caller_module__rule"></a><a href="language.html#jam.language.modules.the__caller_module__rule" title="The
+        CALLER_MODULE Rule">The
+        <code class="literal">CALLER_MODULE</code> Rule</a></h4></div></div></div>
+<pre class="programlisting">rule CALLER_MODULE ( <span class="emphasis"><em>levels</em></span> ? )
+</pre>
+<p>
+          <code class="literal">CALLER_MODULE</code> returns the name of the module scope enclosing
+          the call to its caller (if levels is supplied, it is interpreted as an
+          integer number of additional levels of call stack to traverse to locate
+          the module). If the scope belongs to the global module, or if no such module
+          exists, returns the empty list. For example, the following prints "{Y}
+          {X}":
+        </p>
+<pre class="programlisting">module X {
+    rule get-caller { return [ CALLER_MODULE ] ; }
+    rule get-caller's-caller { return [ CALLER_MODULE 1 ] ; }
+    rule call-Y { return Y.call-X2 ; }
+}
+module Y {
+    rule call-X { return X.get-caller ; }
+    rule call-X2 { return X.get-caller's-caller ; }
+}
+callers = [ X.get-caller ] [ Y.call-X ] [ X.call-Y ] ;
+ECHO {$(callers)} ;
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.language.modules.the__delete_module__rule"></a><a href="language.html#jam.language.modules.the__delete_module__rule" title="The
+        DELETE_MODULE Rule">The
+        <code class="literal">DELETE_MODULE</code> Rule</a></h4></div></div></div>
+<pre class="programlisting">rule DELETE_MODULE ( <span class="emphasis"><em>module</em></span> ? )
+</pre>
+<p>
+          <code class="literal">DELETE_MODULE</code> removes all of the variable bindings and
+          otherwise-unreferenced rules from the given module (or the global module,
+          if no module is supplied), and returns their memory to the system.
+        </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+            Though it won't affect rules that are currently executing until they
+            complete, <code class="literal">DELETE_MODULE</code> should be used with extreme
+            care because it will wipe out any others and all variable (including
+            locals in that module) immediately. Because of the way dynamic binding
+            works, variables which are shadowed by locals will not be destroyed,
+            so the results can be really unpredictable.
+          </p></td></tr>
+</table></div>
+</div>
+</div>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="usage.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../bbv2/jam.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="miscellaneous.html"><img src="../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Added: boost-build/branches/upstream/current/doc/html/jam/miscellaneous.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/jam/miscellaneous.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/jam/miscellaneous.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,262 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Miscellaneous</title>
+<link rel="stylesheet" href="../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../bbv2/jam.html" title="Appendix B. Boost.Jam documentation">
+<link rel="prev" href="language.html" title=" Language">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="language.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../bbv2/jam.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="jam.miscellaneous"></a><a href="miscellaneous.html" title="Miscellaneous">Miscellaneous</a></h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="miscellaneous.html#jam.miscellaneous.diagnostics">Diagnostics</a></span></dt>
+<dt><span class="section"><a href="miscellaneous.html#jam.miscellaneous.bugs__limitations">Bugs, Limitations</a></span></dt>
+<dt><span class="section"><a href="miscellaneous.html#jam.miscellaneous.fundamentals">Fundamentals</a></span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.miscellaneous.diagnostics"></a><a href="miscellaneous.html#jam.miscellaneous.diagnostics" title="Diagnostics">Diagnostics</a></h3></div></div></div>
+<p>
+        In addition to generic error messages, <code class="literal">bjam</code> may emit one
+        of the following:
+      </p>
+<pre class="programlisting">warning: unknown rule X</pre>
+<p>
+        A rule was invoked that has not been defined with an "<code class="literal">actions</code>"
+        or "<code class="literal">rule</code>" statement.
+      </p>
+<pre class="programlisting">using N temp target(s)</pre>
+<p>
+        Targets marked as being temporary (but nonetheless present) have been found.
+      </p>
+<pre class="programlisting">updating N target(s)</pre>
+<p>
+        Targets are out-of-date and will be updated.
+      </p>
+<pre class="programlisting">can't find N target(s)</pre>
+<p>
+        Source files can't be found and there are no actions to create them.
+      </p>
+<pre class="programlisting">can't make N target(s)</pre>
+<p>
+        Due to sources not being found, other targets cannot be made.
+      </p>
+<pre class="programlisting">warning: X depends on itself</pre>
+<p>
+        A target depends on itself either directly or through its sources.
+      </p>
+<pre class="programlisting">don't know how to make X</pre>
+<p>
+        A target is not present and no actions have been defined to create it.
+      </p>
+<pre class="programlisting">X skipped for lack of Y</pre>
+<p>
+        A source failed to build, and thus a target cannot be built.
+      </p>
+<pre class="programlisting">warning: using independent target X</pre>
+<p>
+        A target that is not a dependency of any other target is being referenced
+        with <code class="literal">$(&lt;)</code> or <code class="literal">$(&gt;)</code>.
+      </p>
+<pre class="programlisting">X removed</pre>
+<p>
+        <code class="literal">BJam</code> removed a partially built target after being interrupted.
+      </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.miscellaneous.bugs__limitations"></a><a href="miscellaneous.html#jam.miscellaneous.bugs__limitations" title="Bugs, Limitations">Bugs, Limitations</a></h3></div></div></div>
+<p>
+        The <code class="literal">-j</code> flag can cause <code class="literal">bjam</code> to get confused
+        when single actions update more than one target at a time. <code class="literal">bjam</code>
+        may proceed as if the targets were built even though they are still under
+        construction.
+      </p>
+<p>
+        For parallel building to be successful, the dependencies among files must
+        be properly spelled out, as targets tend to get built in a quickest-first
+        ordering. Also, beware of un-parallelizable commands that drop fixed-named
+        files into the current directory, like <code class="literal">yacc(1)</code> does.
+      </p>
+<p>
+        With the <code class="literal">-j</code> flag, errors from failed commands can get
+        staggeringly mixed up.
+      </p>
+<p>
+        A poorly set <code class="literal">$(JAMSHELL)</code> is likely to result in silent
+        failure.
+      </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.miscellaneous.fundamentals"></a><a href="miscellaneous.html#jam.miscellaneous.fundamentals" title="Fundamentals">Fundamentals</a></h3></div></div></div>
+<p>
+        This section is derived from the official Jam documentation and from experience
+        using it and reading the Jambase rules. We repeat the information here mostly
+        because it is essential to understanding and using Jam, but is not consolidated
+        in a single place. Some of it is missing from the official documentation
+        altogether. We hope it will be useful to anyone wishing to become familiar
+        with Jam and the Boost build system.
+      </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+          Jam "<code class="literal">rules</code>" are actually simple procedural
+          entities. Think of them as functions. Arguments are separated by colons.
+        </li>
+<li>
+          A Jam <span class="bold"><strong>target</strong></span> is an abstract entity identified
+          by an arbitrary string. The build-in <code class="literal">DEPENDS</code> rule creates
+          a link in the dependency graph between the named targets.
+        </li>
+<li>
+          Note that the original Jam documentation for the built-in <code class="literal">INCLUDES</code>
+          rule is incorrect: <code class="literal">INCLUDES <span class="emphasis"><em>targets1</em></span> : <span class="emphasis"><em>targets2</em></span></code>
+          causes everything that depends on a member of <span class="emphasis"><em>targets1</em></span>
+          to depend on all members of <span class="emphasis"><em>targets2</em></span>. It does this
+          in an odd way, by tacking <span class="emphasis"><em>targets2</em></span> onto a special
+          tail section in the dependency list of everything in <span class="emphasis"><em>targets1</em></span>.
+          It seems to be OK to create circular dependencies this way; in fact, it
+          appears to be the "right thing to do" when a single build action
+          produces both <span class="emphasis"><em>targets1</em></span> and <span class="emphasis"><em>targets2</em></span>.
+        </li>
+<li>
+          When a rule is invoked, if there are <code class="literal">actions</code> declared
+          with the same name as the rule, the actions are added to the updating actions
+          for the target identified by the rule's first argument. It is actually
+          possible to invoke an undeclared rule if corresponding actions are declared:
+          the rule is treated as empty.
+        </li>
+<li>
+          Targets (other than <code class="literal">NOTFILE</code> targets) are associated
+          with paths in the file system through a process called binding. Binding
+          is a process of searching for a file with the same name as the target (sans
+          grist), based on the settings of the target-specific <code class="literal">SEARCH</code>
+          and <code class="literal">LOCATE</code> variables.
+        </li>
+<li>
+          In addition to local and global variables, jam allows you to set a variable
+          <code class="literal">on</code> a target. Target-specific variable values can usually
+          not be read, and take effect only in the following contexts:
+          <div class="itemizedlist"><ul type="circle">
+<li>
+              In updating actions, variable values are first looked up <code class="literal">on</code>
+              the target named by the first argument (the target being updated).
+              Because Jam builds its entire dependency tree before executing actions,
+              Jam rules make target-specific variable settings as a way of supplying
+              parameters to the corresponding actions.
+            </li>
+<li>
+              Binding is controlled <span class="emphasis"><em>entirely</em></span> by the target-specific
+              setting of the <code class="literal">SEARCH</code> and <code class="literal">LOCATE</code>
+              variables, as described here.
+            </li>
+<li>
+              In the special rule used for header file scanning, variable values
+              are first looked up <code class="literal">on</code> the target named by the rule's
+              first argument (the source file being scanned).
+            </li>
+</ul></div>
+</li>
+<li>
+          The "bound value" of a variable is the path associated with the
+          target named by the variable. In build actions, the first two arguments
+          are automatically replaced with their bound values. Target-specific variables
+          can be selectively replaced by their bound values using the <code class="literal">bind</code>
+          action modifier.
+        </li>
+<li>
+          Note that the term "binding" as used in the Jam documentation
+          indicates a phase of processing that includes three sub-phases: <span class="emphasis"><em>binding</em></span>
+          (yes!), update determination, and header file scanning. The repetition
+          of the term "binding" can lead to some confusion. In particular,
+          the Modifying Binding section in the Jam documentation should probably
+          be titled "Modifying Update Determination".
+        </li>
+<li>
+          "Grist" is just a string prefix of the form &lt;<span class="emphasis"><em>characters</em></span>&gt;.
+          It is used in Jam to create unique target names based on simpler names.
+          For example, the file name "<code class="literal">test.exe</code>" may
+          be used by targets in separate subprojects, or for the debug and release
+          variants of the "same" abstract target. Each distinct target
+          bound to a file called "test.exe" has its own unique grist prefix.
+          The Boost build system also takes full advantage of Jam's ability to divide
+          strings on grist boundaries, sometimes concatenating multiple gristed elements
+          at the beginning of a string. Grist is used instead of identifying targets
+          with absolute paths for two reasons:
+          <div class="orderedlist"><ol type="1">
+<li>
+              The location of targets cannot always be derived solely from what the
+              user puts in a Jamfile, but sometimes depends also on the binding process.
+              Some mechanism to distinctly identify targets with the same name is
+              still needed.
+            </li>
+<li>
+              Grist allows us to use a uniform abstract identifier for each built
+              target, regardless of target file location (as allowed by setting ALL_LOCATE_TARGET.
+            </li>
+</ol></div>
+</li>
+<li>
+          When grist is extracted from a name with $(var:G), the result includes
+          the leading and trailing angle brackets. When grist is added to a name
+          with $(var:G=expr), existing grist is first stripped. Then, if expr is
+          non-empty, leading &lt;s and trailing &gt;s are added if necessary to form
+          an expression of the form &lt;expr2&gt;; &lt;expr2&gt; is then prepended.
+        </li>
+<li>
+          When Jam is invoked it imports all environment variable settings into corresponding
+          Jam variables, followed by all command-line (-s...) variable settings.
+          Variables whose name ends in PATH, Path, or path are split into string
+          lists on OS-specific path-list separator boundaries (e.g. ":"
+          for UNIX and ";" for Windows). All other variables are split
+          on space (" ") boundaries. Boost Jam modifies that behavior by
+          allowing variables to be quoted.
+        </li>
+<li>
+          A variable whose value is an empty list or which consists entirely of empty
+          strings has a negative logical value. Thus, for example, code like the
+          following allows a sensible non-empty default which can easily be overridden
+          by the user: 
+<pre class="programlisting">
+<span class="identifier">MESSAGE</span> <span class="special">?\=</span> <span class="identifier">starting</span> <span class="identifier">jam</span><span class="special">...</span> <span class="special">;</span>
+<span class="keyword">if</span> #<span class="special">(</span><span class="identifier">MESSAGE</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">ECHO</span> <span class="identifier">The</span> <span class="identifier">message</span> <span class="identifier">is</span><span class="special">:</span> #<span class="special">(</span><span class="identifier">MESSAGE</span><span class="special">)</span> <span class="special">;</span> <span class="special">}</span>
+</pre>
+          If the user wants a specific message, he invokes jam with <code class="literal">"-sMESSAGE=message
+          text"</code>. If he wants no message, he invokes jam with <code class="literal">-sMESSAGE=</code>
+          and nothing at all is printed.
+        </li>
+<li>
+          The parsing of command line options in Jam can be rather unintuitive, with
+          regards to how other Unix programs accept options. There are two variants
+          accepted as valid for an option:
+          <div class="orderedlist"><ol type="1">
+<li>
+<code class="literal">-xvalue</code>, and
+            </li>
+<li>
+<code class="literal">-x value</code>.
+            </li>
+</ol></div>
+</li>
+</ul></div>
+</div>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="language.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../bbv2/jam.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a>
+</div>
+</body>
+</html>

Added: boost-build/branches/upstream/current/doc/html/jam/usage.html
===================================================================
--- boost-build/branches/upstream/current/doc/html/jam/usage.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/html/jam/usage.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,320 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title> Using BJam</title>
+<link rel="stylesheet" href="../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
+<link rel="start" href="../index.html" title="Part I. Boost.Build v2 User Manual">
+<link rel="up" href="../bbv2/jam.html" title="Appendix B. Boost.Jam documentation">
+<link rel="prev" href="building.html" title=" Building BJam">
+<link rel="next" href="language.html" title=" Language">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="building.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../bbv2/jam.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="language.html"><img src="../images/next.png" alt="Next"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="jam.usage"></a><a href="usage.html" title=" Using BJam"> Using BJam</a></h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="usage.html#jam.usage.options"> Options</a></span></dt>
+<dt><span class="section"><a href="usage.html#jam.usage.operation"> Operation</a></span></dt>
+</dl></div>
+<p>
+      If <span class="emphasis"><em>target</em></span> is provided on the command line, <code class="literal">bjam</code>
+      builds <span class="emphasis"><em>target</em></span>; otherwise <code class="literal">bjam</code> builds
+      the target <code class="literal">all</code>.
+    </p>
+<pre class="programlisting">bjam ( -option [value] | target ) *
+</pre>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.usage.options"></a><a href="usage.html#jam.usage.options" title=" Options"> Options</a></h3></div></div></div>
+<div class="toc"><dl><dt><span class="section"><a href="usage.html#jam.usage.options.command_line_and_environment_variable_quoting">Command-line
+        and Environment Variable Quoting</a></span></dt></dl></div>
+<p>
+        Options are either singular or have an accompanying value. When a value is
+        allowed, or required, it can be either given as an argument following the
+        option argument, or it can be given immediately after the option as part
+        of the option argument. The allowed options are:
+      </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">-a</code></span></dt>
+<dd>
+          Build all targets anyway, even if they are up-to-date.
+        </dd>
+<dt><span class="term"><code class="literal">-d <span class="emphasis"><em>n</em></span></code></span></dt>
+<dd>
+          Enable cummulative debugging levels from 1 to n. Values are:<br> 1 -
+          Show the actions taken for building targets, as they are executed (the
+          default).<br> 2 - Show "quiet" actions and display all action
+          text, as they are executed.<br> 3 - Show dependency analysis, and target/source
+          timestamps/paths.<br> 4 - Show arguments and timming of shell invocations.<br>
+          5 - Show rule invocations and variable expansions.<br> 6 - Show directory/header
+          file/archive scans, and attempts at binding to targets.<br> 7 - Show
+          variable settings.<br> 8 - Show variable fetches, variable expansions,
+          and evaluation of '"if"' expressions.<br> 9 - Show variable
+          manipulation, scanner tokens, and memory usage.<br> 10 - Show profile
+          information for rules, both timing and memory.<br> 11 - Show parsing
+          progress of Jamfiles.<br> 12 - Show graph of target dependencies.<br>
+          13 - Show change target status (fate).
+        </dd>
+<dt><span class="term"><code class="literal">-d +<span class="emphasis"><em>n</em></span></code></span></dt>
+<dd>
+          Enable debugging level <span class="emphasis"><em>n</em></span>.
+        </dd>
+<dt><span class="term"><code class="literal">-d 0</code></span></dt>
+<dd>
+          Turn off all debugging levels. Only errors are reported.
+        </dd>
+<dt><span class="term"><code class="literal">-f <span class="emphasis"><em>Jambase</em></span></code></span></dt>
+<dd>
+          Read <span class="emphasis"><em>Jambase</em></span> instead of using the built-in Jambase.
+          Only one -f flag is permitted, but the <span class="emphasis"><em>Jambase</em></span> may
+          explicitly include other files. A <span class="emphasis"><em>Jambase</em></span> name of
+          "-" is allowed, in which case console input is read until it
+          is closed, at which point the input is treated as the Jambase.
+        </dd>
+<dt><span class="term"><code class="literal">-j <span class="emphasis"><em>n</em></span></code></span></dt>
+<dd>
+          Run up to <span class="emphasis"><em>n</em></span> shell commands concurrently (UNIX and
+          NT only). The default is 1.
+        </dd>
+<dt><span class="term"><code class="literal">-l <span class="emphasis"><em>n</em></span></code></span></dt>
+<dd>
+          Limit actions to running for <span class="emphasis"><em>n</em></span> number of seconds,
+          after which they are stopped. Note: Windows only.
+        </dd>
+<dt><span class="term"><code class="literal">-n</code></span></dt>
+<dd>
+          Don't actually execute the updating actions, but do everything else. This
+          changes the debug level default to <code class="literal">-d 2</code>.
+        </dd>
+<dt><span class="term"><code class="literal">-o <span class="emphasis"><em>file</em></span></code></span></dt>
+<dd>
+          Write the updating actions to the specified file instead of running them.
+        </dd>
+<dt><span class="term"><code class="literal">-q</code></span></dt>
+<dd>
+          Quit quickly (as if an interrupt was received) as soon as <span class="bold"><strong>any</strong></span>
+          target fails.
+        </dd>
+<dt><span class="term"><code class="literal">-s <span class="emphasis"><em>var</em></span>=<span class="emphasis"><em>value</em></span></code></span></dt>
+<dd>
+          Set the variable <span class="emphasis"><em>var</em></span> to <span class="emphasis"><em>value</em></span>,
+          overriding both internal variables and variables imported from the environment.
+        </dd>
+<dt><span class="term"><code class="literal">-t <span class="emphasis"><em>target</em></span></code></span></dt>
+<dd>
+          Rebuild <span class="emphasis"><em>target</em></span> and everything that depends on it,
+          even if it is up-to-date.
+        </dd>
+<dt><span class="term"><code class="literal">-- <span class="emphasis"><em>value</em></span></code></span></dt>
+<dd>
+          The option and <span class="emphasis"><em>value</em></span> is ignored, but is available
+          from the <code class="literal">$(ARGV)</code> variable.
+        </dd>
+<dt><span class="term"><code class="literal">-v</code></span></dt>
+<dd>
+          Print the version of <code class="literal">bjam</code> and exit.
+        </dd>
+</dl>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.usage.options.command_line_and_environment_variable_quoting"></a><a href="usage.html#jam.usage.options.command_line_and_environment_variable_quoting" title="Command-line
+        and Environment Variable Quoting">Command-line
+        and Environment Variable Quoting</a></h4></div></div></div>
+<p>
+          Classic Jam had an odd behavior with respect to command-line variable (<code class="literal">-s...</code>)
+          and environment variable settings which made it impossible to define an
+          arbitrary variable with spaces in the value. Boost Jam remedies that by
+          treating all such settings as a single string if they are surrounded by
+          double-quotes. Uses of this feature can look interesting, since shells
+          require quotes to keep characters separated by whitespace from being treated
+          as separate arguments:
+        </p>
+<pre class="programlisting">jam -sMSVCNT="\"\"C:\Program Files\Microsoft Visual C++\VC98\"\"" ...
+</pre>
+<p>
+          The outer quote is for the shell. The middle quote is for Jam, to tell
+          it to take everything within those quotes literally, and the inner quotes
+          are for the shell again when paths are passed as arguments to build actions.
+          Under NT, it looks a lot more sane to use environment variables before
+          invoking jam when you have to do this sort of quoting:
+        </p>
+<pre class="programlisting">set MSVCNT=""C:\Program Files\Microsoft Visual C++\VC98\""
+</pre>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="jam.usage.operation"></a><a href="usage.html#jam.usage.operation" title=" Operation"> Operation</a></h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="usage.html#jam.usage.operation.startup"> Start-up</a></span></dt>
+<dt><span class="section"><a href="usage.html#jam.usage.operation.parsing"> Parsing</a></span></dt>
+<dt><span class="section"><a href="usage.html#jam.usage.operation.binding"> Binding</a></span></dt>
+<dt><span class="section"><a href="usage.html#jam.usage.operation.updating"> Updating</a></span></dt>
+</dl></div>
+<p>
+        BJam has four phases of operation: start-up, parsing, binding, and updating.
+      </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.usage.operation.startup"></a><a href="usage.html#jam.usage.operation.startup" title=" Start-up"> Start-up</a></h4></div></div></div>
+<p>
+          Upon start-up, <code class="literal">bjam</code> imports environment variable settings
+          into <code class="literal">bjam</code> variables. Environment variables are split
+          at blanks with each word becoming an element in the variable's list of
+          values. Environment variables whose names end in <code class="literal">PATH</code>
+          are split at <code class="literal">$(SPLITPATH)</code> characters (e.g., <code class="literal">":"</code>
+          for Unix).
+        </p>
+<p>
+          To set a variable's value on the command line, overriding the variable's
+          environment value, use the <code class="literal">-s</code> option. To see variable
+          assignments made during bjam's execution, use the <code class="literal">-d+7</code>
+          option.
+        </p>
+<p>
+          The Boost.Build v2 initialization behavior has been implemented. This behavior
+          only applies when the executable being invoked is called "<code class="literal">bjam</code>"
+          or, for backward-compatibility, when the <code class="literal">BOOST_ROOT</code>
+          variable is set.
+        </p>
+<div class="orderedlist"><ol type="1">
+<li>
+            We attempt to load "<code class="literal">boost-build.jam</code>" by
+            searching from the current invocation directory up to the root of the
+            file system. This file is expected to invoke the <code class="literal">boost-build</code>
+            rule to indicate where the Boost.Build system files are, and to load
+            them.
+          </li>
+<li>
+            If <code class="literal">boost-build.jam</code> is not found we error and exit,
+            giving brief instructions on possible errors. As a backward-compatibility
+            measure for older versions of Boost.Build, when the <code class="literal">BOOST_ROOT</code>
+            variable is set, we first search for <code class="literal">boost-build.jam</code>
+            in <code class="literal">$(BOOST_ROOT)/tools/build</code> and <code class="literal">$(BOOST_BUILD_PATH)</code>.
+            If found, it is loaded and initialization is complete.
+          </li>
+<li>
+            The <code class="literal">boost-build</code> rule adds its (optional) argument
+            to the front of <code class="literal">BOOST_BUILD_PATH</code>, and attempts to
+            load <code class="literal">bootstrap.jam</code> from those directories. If a relative
+            path is specified as an argument, it is treated as though it was relative
+            to the <code class="literal">boost-build.jam</code> file.
+          </li>
+<li>
+            If the <code class="literal">bootstrap.jam</code> file was not found, we print
+            a likely error message and exit.
+          </li>
+</ol></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.usage.operation.parsing"></a><a href="usage.html#jam.usage.operation.parsing" title=" Parsing"> Parsing</a></h4></div></div></div>
+<p>
+          In the parsing phase, <code class="literal">bjam</code> reads and parses the <code class="literal">Jambase</code>
+          file, by default the built-in one. It is written in the <a href="language.html" title=" Language">jam
+          language</a>. The last action of the <code class="literal">Jambase</code> is to
+          read (via the "include" rule) a user-provided file called "<code class="literal">Jamfile</code>".
+        </p>
+<p>
+          Collectively, the purpose of the <code class="literal">Jambase</code> and the <code class="literal">Jamfile</code>
+          is to name build targets and source files, construct the dependency graph
+          among them, and associate build actions with targets. The <code class="literal">Jambase</code>
+          defines boilerplate rules and variable assignments, and the <code class="literal">Jamfile</code>
+          uses these to specify the actual relationship among the target and source
+          files.
+        </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.usage.operation.binding"></a><a href="usage.html#jam.usage.operation.binding" title=" Binding"> Binding</a></h4></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="usage.html#jam.usage.operation.binding.fate"> Update Determination</a></span></dt>
+<dt><span class="section"><a href="usage.html#jam.usage.operation.binding.headerscan"> Header File
+          Scanning</a></span></dt>
+</dl></div>
+<p>
+          After parsing, <code class="literal">bjam</code> recursively descends the dependency
+          graph and binds every file target with a location in the filesystem. If
+          <code class="literal">bjam</code> detects a circular dependency in the graph, it
+          issues a warning.
+        </p>
+<p>
+          File target names are given as absolute or relative path names in the filesystem.
+          If the path name is absolute, it is bound as is. If the path name is relative,
+          it is normally bound as is, and thus relative to the current directory.
+          This can be modified by the settings of the <code class="literal">$(SEARCH)</code>
+          and <code class="literal">$(LOCATE)</code> variables, which enable jam to find and
+          build targets spread across a directory tree. See <a href="language.html#jam.language.variables.builtins.search" title=" SEARCH and
+          LOCATE">SEARCH
+          and LOCATE Variables</a> below.
+        </p>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.usage.operation.binding.fate"></a><a href="usage.html#jam.usage.operation.binding.fate" title=" Update Determination"> Update Determination</a></h5></div></div></div>
+<p>
+            After binding each target, <code class="literal">bjam</code> determines whether
+            the target needs updating, and if so marks the target for the updating
+            phase. A target is normally so marked if it is missing, it is older than
+            any of its sources, or any of its sources are marked for updating. This
+            behavior can be modified by the application of special built-in rules,
+            <code class="literal">ALWAYS</code>, <code class="literal">LEAVES</code>, <code class="literal">NOCARE</code>,
+            <code class="literal">NOTFILE</code>, <code class="literal">NOUPDATE</code>, and <code class="literal">TEMPORARY</code>.
+            See <a href="language.html#jam.language.rules.builtins.modifying_binding" title="Modifying
+          Binding">Modifying
+            Binding</a> below.
+          </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h5 class="title">
+<a name="jam.usage.operation.binding.headerscan"></a><a href="usage.html#jam.usage.operation.binding.headerscan" title=" Header File
+          Scanning"> Header File
+          Scanning</a></h5></div></div></div>
+<p>
+            During the binding phase, <code class="literal">bjam</code> also performs header
+            file scanning, where it looks inside source files for the implicit dependencies
+            on other files caused by C's #include syntax. This is controlled by the
+            special variables $(HDRSCAN) and $(HDRRULE). The result of the scan is
+            formed into a rule invocation, with the scanned file as the target and
+            the found included file names as the sources. Note that this is the only
+            case where rules are invoked outside the parsing phase. See <a href="language.html#jam.language.variables.builtins.hdrscan" title=" HDRSCAN
+          and HDRRULE">HDRSCAN
+            and HDRRULE Variables</a> below.
+          </p>
+</div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="jam.usage.operation.updating"></a><a href="usage.html#jam.usage.operation.updating" title=" Updating"> Updating</a></h4></div></div></div>
+<p>
+          After binding, <code class="literal">bjam</code> again recursively descends the dependency
+          graph, this time executing the update actions for each target marked for
+          update during the binding phase. If a target's updating actions fail, then
+          all other targets which depend on that target are skipped.
+        </p>
+<p>
+          The <code class="literal">-j</code> flag instructs <code class="literal">bjam</code> to build
+          more than one target at a time. If there are multiple actions on a single
+          target, they are run sequentially.
+        </p>
+</div>
+</div>
+</div>
+<table width="100%"><tr>
+<td align="left"></td>
+<td align="right"><small></small></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="building.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../bbv2/jam.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="language.html"><img src="../images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Modified: boost-build/branches/upstream/current/doc/src/advanced.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/advanced.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/advanced.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,25 +7,24 @@
 
   <para>This section will provide the information necessary to create your own
   projects using Boost.Build. The information provided here is relatively
-  high-level, and <link linkend="bbv2.reference">detailed reference</link> as
+  high-level, and <xref linkend="bbv2.reference"/> as
   well as the on-line help system must be used to obtain
-  low-level documentation (see the <link linkend=
-  "bbv2.reference.init.options.help">help option</link>).</para>
+  low-level documentation (see <xref linkend=
+  "bbv2.reference.init.options.help"/>).</para>
 
-  <para>The Boost.Build actually consists of two parts - Boost.Jam, which is a
+  <para>Boost.Build actually consists of two parts - Boost.Jam, a
   build engine with its own interpreted language, and Boost.Build itself,
-  implemented in Boost.Jam's language. The chain of event which happen when
-  you type "bjam" on the command is:
+  implemented in Boost.Jam's language. The chain of events when
+  you type <command>bjam</command> on the command line is:
       <orderedlist>
         <listitem>
           <para>Boost.Jam tries to find Boost.Build and loads the top-level
-          module. The exact process is described in the <link
-          linkend="bbv2.reference.init">section on
-          initialization</link></para>
+          module. The exact process is described in <xref
+          linkend="bbv2.reference.init"/></para>
         </listitem>
         <listitem>
-          <para>Boost.Build top-level module loads user-defined configuration
-          files, "user-config.jam" and "site-config.jam", which define
+          <para>The top-level module loads user-defined configuration
+          files, <filename>user-config.jam</filename> and <filename>site-config.jam</filename>, which define
           available toolsets.</para>
         </listitem>
         <listitem>
@@ -34,7 +33,7 @@
           projects is created, with targets inside projects.</para>
         </listitem>
         <listitem>
-          <para>Finally, using build request specified on the command line,
+          <para>Finally, using the build request specified on the command line,
           Boost.Build decides which targets should be built, and how. That
           information is passed back to Boost.Jam, which takes care of
           actually running commands.</para>
@@ -42,8 +41,8 @@
       </orderedlist>
     </para>
 
-    <para>So, to be able to successfully use Boost.Build, you'd need to know only
-      three things:
+    <para>So, to be able to successfully use Boost.Build, you need to know only
+      four things:
       <itemizedlist>
         <listitem>
           <para><link linkend="bbv2.advanced.configuration">
@@ -57,88 +56,337 @@
           <para><link linkend="bbv2.advanced.build_process">
               How the build process works</link></para>
         </listitem>
+        <listitem>
+          <para>Some Basics about the Boost.Jam language. See also the
+          <ulink 
+          url="http://www.boost.org/tools/jam/index.html">Boost.Jam</ulink>
+          documentation.
+          <!-- Something better than this is desperately needed; the
+               tutorial at least should clarify that whitespace is
+               significant and we shouldn't get any further than the
+               beginning of this document before briefly explaining
+               Jam's data and procedural model, rule
+               signatures, and Boost.Build modules -->
+          </para>
+        </listitem>
       </itemizedlist>
     </para>
     
+    <section id="bbv2.advanced.jam_language">
+      <title>Boost.Jam language</title>
 
+      <para>This section will describe the basics of the Boost.Jam
+      language&#x2014;just enough for writing Jamfiles. For more information,
+      please see the <ulink
+      url="http://www.boost.org/tools/jam/index.html">Boost.Jam</ulink>
+      documentation.</para>
+
+      <para>Boost.Jam has an interpreted, procedural language. 
+      On the lowest level, a Boost.Jam program consists of variables and 
+      <indexterm><primary>rule</primary></indexterm>
+      <firstterm>rules</firstterm> (the Jam term for function). They are grouped
+      in modules&#x2014;there's one global module and a number of named
+      modules. Besides that, a Boost.Jam program contains classes and class
+      instances.      
+      </para>
+
+      <para>Syntantically, a Boost.Jam program consists of two kind of
+      elements&#x2014;keywords (which have a special meaning to Boost.Jam) and
+      literals.
+
+      Consider this code:
+      <programlisting>
+a = b ;</programlisting>
+      which assigns the value <literal>b</literal> to the variable
+      <literal>a</literal>. Here, <literal>=</literal> and
+      <literal>;</literal> are keywords, while <literal>a</literal> and
+      <literal>b</literal> are literals.
+      <warning>
+        <para>All syntax elements, even keywords, must be separated by
+        spaces. For example, omitting the space character before
+        <literal>;</literal> will lead to a syntax error.
+        </para>
+      </warning>
+      If you want to use a literal value that is the same as some keyword, the
+      value can be quoted:
+      <programlisting>
+a = "=" ;</programlisting>
+      </para>
+    
+      <para>All variables in Boost.Jam have the same type&#x2014;list of
+      strings. To define a variable one assigns a value to it, like in the
+      previous example. An undefined variable is the same as a variable with
+      an empty value. Variables can be accessed with the
+      <code>$(<replaceable>variable</replaceable>)</code> syntax. For example:
+      <programlisting>
+a = $(b) $(c) ;</programlisting>
+      </para>
+
+      <para>
+        Rules are defined by specifying the rule name, the parameter names,
+        and the allowed size of the list value for each parameter. 
+        <programlisting>
+rule <replaceable>example</replaceable> 
+     (
+         <replaceable>parameter1</replaceable> : 
+         <replaceable>parameter2 ?</replaceable> : 
+         <replaceable>parameter3 +</replaceable> :
+         <replaceable>parameter4 *</replaceable> 
+     )
+     {
+        // body
+     }</programlisting>
+        When this rule is called, the list passed as the first argument must
+        have exactly one value. The list passed as the second argument can
+        either have one value of be empty. The two remaining arguments can
+        be arbitrary long, but the third argument may not be empty.
+      </para>
+
+      <para>The overview of Boost.Jam language statements is given below:
+      <programlisting>
+helper 1 : 2 : 3 ; 
+x = [ helper 1 : 2 : 3 ] ;</programlisting>
+      This code calls the named rule with the specified arguments. When the
+      result of the call must be used inside some expression, you need to add
+      brackets around the call, like shown on the second line.
+      <programlisting>
+if cond { statements } [ else { statements } ]</programlisting>
+      This is a regular if-statement. The condition is composed of:
+      <itemizedlist>
+        <listitem><para>Literals (true if at least one string is not empty)</para></listitem>        
+        <listitem><para>Comparisons: <code>a
+        <replaceable>operator</replaceable> b</code> where
+        <replaceable>operator</replaceable> is one of <code>=</code>,
+        <code>!=</code>, <code>&lt;</code>, <code>&gt;</code>,
+        <code>&lt;=</code>, <code>&gt;=</code>. The comparison is done
+        pairwise between each string in the left and the right arguments.
+        </para>
+        </listitem>
+        <listitem><para>Logical operations: <code>! a</code>, <code>a &amp;&amp;
+        b</code>, <code>a || b</code></para></listitem>
+        <listitem><para>Grouping: <code>( cond )</code></para></listitem>
+      </itemizedlist>
+      <programlisting>
+for var in list { statements }</programlisting>
+      Executes statements for each element in list, setting the variable
+      <varname>var</varname> to the element value.
+      <programlisting>
+while cond { statements }</programlisting>
+      Repeatedly execute statements while cond remains true upon entry. 
+      <programlisting>
+return values ;
+      </programlisting>This statement should be used only inside a
+      rule and assigns <code>values</code> to the return value of the
+      rule.
+      <warning><para>
+        The <code>return</code> statement does not exit the rule. For example:
+        <programlisting>
+rule test ( )
+{
+   if 1 = 1 {
+      return "reasonable" ;
+   }
+   return "strange" ;
+}</programlisting> will return <literal>strange</literal>, not
+<literal>reasonable</literal>.
+      </para></warning>
+
+        <programlisting>
+import <replaceable>module</replaceable> ;
+import <replaceable>module</replaceable> : <replaceable>rule</replaceable> ;</programlisting>
+      The first form imports the specified bjam module. All rules from
+      that module are made available using the qualified name:
+      <code><replaceable>module</replaceable>.<replaceable>rule</replaceable></code>.
+      The second form imports the specified rules only, and they can be called
+      using unqualified names.
+      </para>
+
+      <para id="bbv2.advanced.jam_language.actions">
+        Sometimes, you'd need to specify the actual command lines to be used
+        when creating targets. In jam language, you use named actions to do this.
+        For example:
+<programlisting>
+actions create-file-from-another
+{
+    create-file-from-another $(&lt;) $(&gt;)
+}
+</programlisting>
+        This specifies a named action called 
+        <literal>create-file-from-another</literal>. The text inside braces is the
+        command to invoke. The <literal>$(&lt;)</literal> variable will be expanded to list of
+        generated files, and the <literal>$(&gt;)</literal> variable will be expanded
+        to the list of source files.
+      </para>
+
+      <para>To flexibly adjust command line, you can define a rule with the
+      same name as the action, and taking three parameters -- targets, sources 
+      and properties. For example:
+<programlisting>
+rule create-file-from-another ( targets * : sources * : properties * )
+{
+   if &lt;variant&gt;debug in $(properties)
+   {
+       OPTIONS on $(targets) = --debug ;
+   }
+}
+actions create-file-from-another
+{
+    create-file-from-another $(OPTIONS) $(&lt;) $(&gt;)
+}
+</programlisting>
+      In this example, the rule checks if certain build property is specified.
+      If so, it sets variable <varname>OPIONS</varname> that's used inside
+      action. Note that the variable is set "on targets" -- the value will
+      be only visible inside action, not globally. Were it set globally,
+      using variable named <varname>OPTIONS</varname> in two unrelated
+      actions would be impossible.
+      </para>
+
+      <para>More details can be found in Jam reference, <xref linkend="jam.language.rules"/>
+      </para>
+
+    </section>
+
   <section id="bbv2.advanced.configuration">
     <title>Configuration</title>
 
     <para>The Boost.Build configuration is specified in the file
-    "user-config.jam". You can edit the one which comes with Boost.Build, or
-    create a copy in your home directory and edit that. (See the <link
-    linkend="bbv2.reference.init.config">reference</link> for the exact search
-    paths.) The primary function of that file is to declarate which compilers
-    and other tools are available. The simplest syntax to configure a tool is:
+    <filename>user-config.jam</filename>. You can edit the one in the top-level
+    directory of Boost.Build installation or create a copy in your home directory
+    and edit that. (See <xref linkend="bbv2.reference.init.config"/>  for the
+    exact search paths.) The primary function of that file is to declare which
+    compilers and other tools are available. The simplest syntax to configure
+    a tool is:
+
 <programlisting>
-using &lt;tool-name&gt; ;        
+using <replaceable>tool-name</replaceable> ;        
 </programlisting>
-      The "using" rule is given a name of tool, and will make that tool
-      available to Boost.Build. For example, "using gcc ;" will make available
-      the gcc compiler.      
+      The <functionname>using</functionname> rule is given a name of tool, and will make that tool
+      available to Boost.Build. For example, <code>using gcc ;</code> will make the gcc compiler
+      available.      
     </para>
 
     <para>
-      Since nothing but tool name is specified, Boost.Build will pick some
-      default settings -- for example will use gcc found in path, or look in
-      some known installation locations. For ordinary users, this is quite
-      fine. In case you have several version of a compiler, or it's located in
-      some unusual location, or you need to tweak the configuration, you'd
-      need to pass additional parameters to the "using" rule. Generally, 
-      for every tool module, the parameters differ, and you can obtain the documentaiton
-      by running
+      Since nothing but a tool name is specified, Boost.Build will
+      pick some default settings.  For example, it will use the
+      <command>gcc</command> executable found in the
+      <envar>PATH</envar>, or look in some known installation
+      locations. In most cases, this strategy works automatically. In
+      case you have several versions of a compiler, it's installed in
+      some unusual location, or you need to tweak its configuration,
+      you'll need to pass additional parameters to the
+      <functionname>using</functionname> rule.  The parameters to
+      <functionname>using</functionname> can be different for each
+      tool.  You can obtain specific documentation for any tool's
+      configuration parameters by invoking
 <programlisting>
-bjam --help &lt;tool-name&gt;.init         
+bjam --help <replaceable>tool-name</replaceable>.init         
 </programlisting>
-      on the command line. However, for all compilers the meaning of the first
-      three parameters is the same: version, invocation command and options.
     </para>
+    <para>
+      That said, for all the compiler toolsets Boost.Build supports
+      out-of-the-box, the list of parameters to
+      <functionname>using</functionname> is the same: <parameter
+      class="function">toolset-name</parameter>, <parameter
+      class="function">version</parameter>, <parameter
+      class="function">invocation-command</parameter>, and <parameter
+      class="function">options</parameter>.
+      <!-- the previous text here was really confusing -->
+    </para>
 
-    <para>The "version" parameter identifies the compiler, in case you have
-    several. It can have any form you like, but it's recommended that you use
-    a numeric identifier, like &quot;7.1&quot;. The "invocation command"
-    parameter is the command which must be executed to run the compiler. This
-    might be just compiler name, or a name with a path in it. Here are some
-    examples. 
+    <para>The <parameter class="function">version</parameter>
+    parameter identifies the toolset version, in case you have
+    several installed. It can have any form you like, but
+    it's recommended that you use a numeric identifier like
+    <literal>7.1</literal>.
     </para>
-      
-    <para>To configure a compiler installed in non-standard location and not
-    present in path, you can do the following:
+
+    <para>
+      The <parameter class="function">invocation-command</parameter>
+      parameter is the command that must be executed to run the
+      compiler. This parameter can usually be omitted if the compiler
+      executable
+      <itemizedlist>
+      <listitem><para>has its &#x201C;usual
+      name&#x201D; and is in the <envar>PATH</envar>,
+      or</para></listitem>
+      <listitem><para>was installed in a standard
+      &#x201C;installation directory&#x201D;,
+      or</para></listitem>
+
+      <listitem><para>can be found through a global mechanism like the
+      Windows registry.</para></listitem>
+      </itemizedlist>
+
+      For example:
 <programlisting>
-using msvc : : Z:/Programs/Microsoft Visual Studio/vc98/bin/cl.exe ;
+using msvc : 7.1 ;
+using gcc ;
 </programlisting>
+If the compiler can be found in the <envar>PATH</envar> but only by a
+nonstandard name, you can just supply that name:
+<programlisting>
+using gcc : : g++-3.2 ;
+</programlisting>
+Otherwise, it might be necessary to supply the complete path to the
+compiler executable:
+<programlisting>
+using msvc : : "Z:/Programs/Microsoft Visual Studio/vc98/bin/cl" ;
+</programlisting>
+Some Boost.Build toolsets will use that path to take additional
+actions required before invoking the compiler, such as calling
+vendor-supplied scripts to set up its required environment variables.
+When compiler executables for C and C++ are different, path to the C++
+compiler executable must be specified. The &#x201C;invocation command&#x201D;
+can be any command allowed by the operating system. For example:
+<programlisting>
+using msvc : : echo Compiling &#x26;&#x26; foo/bar/baz/cl ;
+</programlisting>
+will work.
     </para>
 
-    <para>To configure several versions of a compiler, the following can be used.
+    <para>To configure several versions of a toolset, simply invoke
+    the <functionname>using</functionname> rule multiple times:
 <programlisting>
 using gcc : 3.3 ;
 using gcc : 3.4 : g++-3.4 ;
 using gcc : 3.2 : g++-3.2 ;
 </programlisting>
-        Note that in the first call to "using", the compiler found in path
-      will be used, and there's no need to explicitly specify the command.
+        Note that in the first call to
+        <functionname>using</functionname>, the compiler found in the
+        <envar>PATH</envar> will be used, and there's no need to
+        explicitly specify the command.
     </para>
 
-    <para>As shown above, both "version" and "invocation command" parameters
-      are optional, but there's an important restriction: if you configure the
-      same compiler more then once, you must pass the "version" parameter
-      every time. For example, the following is not allowed:
+    <para>As shown above, both the <parameter
+    class="function">version</parameter> and <parameter
+    class="function">invocation-command</parameter> parameters are
+    optional, but there's an important restriction: if you configure
+    the same toolset more than once, you must pass the <parameter
+    class="function">version</parameter>
+    parameter every time. For example, the following is not allowed:
 <programlisting>
 using gcc ;
 using gcc : 3.4 : g++-3.4 ;
 </programlisting>
-      because the first "using" does not specify the version. 
+      because the first <functionname>using</functionname> call does
+      not specify a <parameter class="function">version</parameter>.
     </para>
 
-    <para>The <code>options</code> parameter is used to fine-tune the
-      configuration. All compilers allow to pass four option, intentionally
-      similiar in spelling to builtin features: <code>cflags</code>,
-      <code>cxxflags</code>, <code>compileflags</code> and
-      <code>linkflags</code>. They specify additional options which will be
-      always passed to the corresponding tools. The <code>cflags</code> option
-      applies only to the C compiler, the <code>cxxflags</code> option applies
-      only to the C++ compiler and the <code>compileflags</code> options
-      applies to both. For example, to use 64 bit mode with gcc you can use:
+    <para>The <parameter class="function">options</parameter>
+    parameter is used to fine-tune the configuration. All of
+    Boost.Build's standard compiler toolsets accept properties of the
+    four builtin features <varname>cflags</varname>,
+    <varname>cxxflags</varname>, <varname>compileflags</varname> and
+    <varname>linkflags</varname> as <parameter
+    class="function">options</parameter> specifying flags that will be
+    always passed to the corresponding tools. Values of the
+    <varname>cflags</varname> feature are passed directly to the C
+    compiler, values of the <varname>cxxflags</varname> feature are
+    passed directly to the C++ compiler, and values of the
+    <varname>compileflags</varname> feature are passed to both. For
+    example, to configure a <command>gcc</command> toolset so that it
+    always generates 64-bit code you could write:
 <programlisting>
 using gcc : 3.4 : : &lt;compileflags&gt;-m64 &lt;linkflags&gt;-m64 ;
 </programlisting>
@@ -146,374 +394,466 @@
                 
     </section>
 
-  <section id="bbv2.advanced.jamfiles">
-    <title>Writing Jamfiles</title>
+    <section id="bbv2.advanced.invocation">
+      <title>Invocation</title>
 
-    <section id="bbv2.advanced.overview">
-      <title>Overview</title>
+      <para>This section describes how invoke Boost.Build from the command line</para>
 
-      <para>Jamfiles are the thing which is most important to the user,
-      bacause they declare the targets which should be build. Jamfiles are
-      also used for organizing targets -- each Jamfile is a separate project,
-      which can be build independently from the other projects.</para>
+      <para>To build all targets defined in Jamfile in the current directory with default properties, run:
+<screen>
+bjam
+</screen></para>
 
-      <para>Jamfile mostly contain calls to Boost.Build functions, which do
-        all the work, specifically:
-        <itemizedlist>
-          <listitem>
-            <para><link linkend="bbv2.advanced.targets">declare main
-                targets</link></para>
-          </listitem>
-          <listitem>
-            <para><link
-            linkend="bbv2.advanced.projects">define
-            project properties</link></para>
-          </listitem>
-          <listitem>
-            <para><link linkend="bbv2.advanced.other-rules">do various other
-            things</link></para>            
-          </listitem>
-        </itemizedlist>
+      <para>To build specific targets, specify them on the command line:
+<screen>
+bjam lib1 subproject//lib2 
+</screen>
       </para>
 
-      <para>In addition to Jamfiles, Boost.Build has another user-editable
-        file, project-root.jam, which is mostly useful to declare constants
-        global to all the projects. It is described in more detail <link
-        linkend="bbv2.advanced.project-root">below</link>.
+      <para>To request a certain value for some property, add <literal>
+      <replaceable>property</replaceable>=<replaceable>value</replaceable></literal> to the command line:
+<screen>
+bjam toolset=gcc variant=debug optimization=space
+</screen>
+       For often used features, like <literal>toolset</literal> and <literal>variant</literal> you can
+       omit the feature name, so the above can be written as:
+<screen>
+bjam optimization=space
+</screen>
       </para>
 
-<!--
-      <para>The most fundemental entity in Boost.Build is <emphasis>main
-          target</emphasis>. This is object that user want to construct from
-        sources and keep up to date with regard to those sources. Typical
-        examples of main targets are executable files and libraries.</para>
-      
-      <para>Main targets are grouped in <emphasis>projects</emphasis>. Their main
-        purpose is organization: related targets placed in one project,
-        can then be built together, or share some definitions.</para>
-      
-      <para>Main targets and projects are created as the result of reading
-        one or several Jamfiles. Each Jamfile is a file written in
-        Boost.Jam interpreted language, and typically contains calls to
-        functions provided by Boost.Build, which create main targets of
-        needed type, declare project attributes and access other
-        projects. The full list of functions provided by Boost.Build is
-        described <link linkend="bbv2.advanced.builtins">below</link>.
-        Of course, user can create his own functions, or it can directly
-        access Boost.Build internals from Jamfile, if builtin facilities are
-        not sufficient.</para>
 
-  <para>Each main target, or project can be built in a number of ways,
-  say with optimization or without. We'll call such entities
-  "metatargets". To make Boost.Build produce any real targets, user
-  issues <link linkend="bbv2.reference.buildreq">build request</link>,
-  which specifies metatargets to be built, and properties to be
-  used.</para>
+      <para>Boost.Build recognizes the following command line options.</para>
 
-  <para>The <emphasis>properties</emphasis> are just (name,value) pairs that
-  describe various aspects of constructed objects, for example:</para>
-  <programlisting>
-&lt;optimization&gt;full &lt;inlining&gt;off
-</programlisting>
+      <variablelist>
+        
+        <varlistentry>
+          <term><option>--clean</option></term>
+          <listitem>
+            <para>Cleans all targets in the current directory and 
+            in any subprojects. Note that unlike the <literal>clean</literal> 
+            target in make, you can use <literal>--clean</literal>
+            together with target names to clean specific targets.</para>
+          </listitem>
+        </varlistentry>
 
-  <para>Given the built request, Boost.Build figures out the targets
-  needed for requested metatargets with requested properties, how
-  they can be created, and whether exising files can be reused. It
-  finally issues command to create needed files, automatically
-  converting properties into appropricate command line options.</para>
--->
-    </section>
+        <varlistentry>
+          <term><option>--clean-all</option></term>
+          <listitem>
+            <para>Cleans all targets, 
+            no matter where they are defined. In particular, it will clean targets 
+            in parent Jamfiles, and targets defined under other project roots.
+            </para>
+          </listitem>
+        </varlistentry>
 
-<!--
-    <section id="bbv2.advanced.roadmap">
-      <title>Your first project and roadmap</title>
+        <varlistentry>
+          <term><option>--build-dir</option></term>
+          <listitem>
+            <para>Changes build directories for all project roots being built. When
+            this option is specified, all Jamroot files should declare project name.
+            The build directory for the project root will be computed by concatanating
+            the value of the <option>--build-dir</option> option, the project name 
+            specified in Jamroot, and the build dir specified in Jamroot 
+            (or <literal>bin</literal>, if none is specified).
+            </para>
 
+            <para>The option is primarily useful when building from read-only
+            media, when you can't modify Jamroot.
+            </para>
+          </listitem>
+        </varlistentry>
 
-  <para>Creating your first project requires three steps:</para>
+        <varlistentry>
+          <term><option>--version</option></term>
+          <listitem>
+            <para>Prints information on Boost.Build and Boost.Jam
+                  versions.
+            </para>
+          </listitem>
+        </varlistentry>
 
-  <orderedlist>
-    <listitem><simpara>Create an empty file called "Jamfile"</simpara></listitem>
+        <varlistentry id="bbv2.reference.init.options.help">
+          <term><option>--help</option></term>
+          <listitem>
+            <para>Invokes the online help system. This prints general
+                  information on how to use the help system with additional
+                  --help* options.
+            </para>
+          </listitem>
+        </varlistentry>
 
-    <listitem>
-      <simpara>
-        Create an empty file called "project-root.jam"
-      </simpara>
-    </listitem>
+        <varlistentry>
+          <term><option>--debug-configuration</option></term>
+          <listitem>
+            <para>Produces debug information about loading of Boost.Build 
+            and toolset files.</para>
+          </listitem>
+        </varlistentry>
 
-    <listitem>
-      <para>Either set your <envar>BOOST_BUILD_PATH</envar> environment
-    variant to Boost.Build root, or create a "boost-build.jam" file
-    with the following content:
+        <varlistentry>
+          <term><option>--debug-building</option></term>
+          <listitem>
+            <para>Prints what targets are being built and with what properties.
+            </para>
+          </listitem>
+        </varlistentry>
 
-<programlisting>
-boost-build /path/to/boost.build ;
-</programlisting>
+        <varlistentry>
+          <term><option>--debug-generators</option></term>
+          <listitem>
+            <para>Produces debug output from generator search process. 
+            Useful for debugging custom generators.
+            </para>
+          </listitem>
+        </varlistentry>
 
-      </para>
-    </listitem>
-  </orderedlist>
+        <varlistentry>
+          <term><option>--ignore-config</option></term>
+          <listitem>
+            <para>Do not load <literal>site-config.jam</literal> and
+                  <literal>user-config.jam</literal> configuration files.
+            </para>
+          </listitem>
+        </varlistentry>
 
-  <para>After that, you can run the "bjam" command in the directory
-  where you've created the files. Surely, it won't do anything, but
-  it will run without error, at least. Your next steps might
-  be:</para>
+        <varlistentry>
+          <term><option>--debug</option></term>
+          <listitem>
+            <para>Enables internal checks.
+            </para>
+          </listitem>
+        </varlistentry>
+    
+      </variablelist>
 
-  <orderedlist>
-    <listitem>
-      <simpara>
-        Adding new main targets to the "Jamfile" file. The basic
-    syntax for declaring a main target is described <link linkend=
-    "bbv2.advanced.targets">below</link>, and all builtin functions for
-    declaring main targets are <link linkend=
-    "bbv2.advanced.builtins.targets">listed</link>.
-      </simpara>
-    </listitem>
 
-    <listitem>
-      <simpara>
-        Creating subprojects. Create a directory, put new Jamfile
-    there, and move some main targets to that Jamfile, or declare
-    new ones. The <link linkend="bbv2.advanced.projects">projects
-    reference</link> will help with this part.
-      </simpara>
-    </listitem>
+      <para>For complete specification of command line syntax, see 
+      <xref linkend="bbv2.reference.init.args"/>
+      </para>
 
-    <listitem>
-      <simpara>
-        Customizing Boost.Build for your needs. You might have
-    additional tools you want to run, or just want different
-    extension for some file. The <link linkend="bbv2.extending">extender manual</ulink> is waiting for
-    you.
-      </simpara>
-    </listitem>
-  </orderedlist>
 
     </section>
--->
+
     <section id="bbv2.advanced.targets">
-      <title>Main targets</title>
+      <title>Declaring targets</title>
 
       <para id="bbv2.advanced.targets.main">
-        <emphasis>Main target</emphasis> is a user-defined named
-        entity which can be build, for example a named executable file.
-        Declaring a main target is usually done using one of <link linkend=
-          "bbv2.advanced.builtins.targets">main target functions</link>.
-        The user can also declare <ulink url=
-          "doc/extending.html#main_target_rules">custom main target
-          function</ulink>.</para>
-      
-      <para>Most main targets rules in Boost.Build use similiar
-        syntax:</para>
+        A <firstterm>Main target</firstterm> is a user-defined named
+        entity that can be built, for example an executable file.
+        Declaring a main target is usually done using one of the main
+        target rules described in <xref linkend=
+        "bbv2.advanced.builtins.targets"/>.  The user can also declare
+        custom main target rules as shown in <xref
+        linkend="bbv2.extending.rules"/>.
+      </para>
 
+      <indexterm><primary>main target</primary><secondary>declaration
+      syntax</secondary></indexterm>
+      <para>Most main target rules in Boost.Build have the same common
+      signature:</para>
+
+      <!-- I think we maybe ought to be talking about a common
+           _signature_ here, having already explained Boost.Jam function
+           signatures at the beginning of this chapter.  Then we could show 
+           ( main-target-name : sources * : requirements * : default-build * : usage-requirements * )
+           instead.  More precise.
+
+           Also, I suggest replacing "default-build" by "default-properties" everywhere.
+      -->
+
+<indexterm><primary>common signature</primary></indexterm>
 <anchor id="bbv2.main-target-rule-syntax"/>
 <programlisting>
-function-name main-target-name 
-    : sources 
-    : requirements 
-    : default-build 
-    : usage-requirements 
-    ;
+rule <replaceable>rule-name</replaceable> (
+     main-target-name :
+     sources + :
+     requirements * :
+     default-build * :
+     usage-requirements * )
 </programlisting>
 
       <itemizedlist>
         <listitem>
           <simpara>
-            "main-target-name" is the name used to request the target
-            on command line and to use it from other main targets. Main
-            target name may contain alphanumeric characters and symbols '-'
-            and '_';
+            <parameter>main-target-name</parameter> is the name used
+            to request the target on command line and to use it from
+            other main targets. A main target name may contain
+            alphanumeric characters, dashes
+            (&#x2018;<code>-</code>&#x2019;), and underscores
+            (&#x2018;<code>_</code>&#x2019;).
           </simpara>
         </listitem>
         
         <listitem>
           <simpara>
-            "sources" is the list of source files and other main
+            <parameter>sources</parameter> is the list of source files and other main
             targets that must be combined. 
           </simpara>
         </listitem>
         
         <listitem>
           <simpara>
-            "requirements" is the list of properties that must always
+            <parameter>requirements</parameter> is the list of properties that must always
             be present when this main target is built.
           </simpara>
         </listitem>
         
         <listitem>
           <simpara>
-            "default-build" is the list of properties that will be used
+            <parameter>default-build</parameter> is the list of properties that will be used
             unless some other value of the same feature is already
-            specified.
+            specified, e.g. on the command line or by propogation from a dependent target.
           </simpara>
         </listitem>
         
         <listitem>
           <simpara>
-            "usage-requirements" is the list of properties that will be
-            propagated to all main targets that use this one, i.e. to all
+            <parameter>usage-requirements</parameter> is the list of properties that will be
+            propagated to all main targets that use this one, i.e. to all its
             dependents.
           </simpara>
         </listitem>
       </itemizedlist>
 
-      <para>Note that the actual requirements, default-build and
-        usage-requirements attributes for a target are obtained by combining
-        the explicitly specified one with those specified for the project
-        where a target is declared.
-      </para>
       <para>          
-        Some main target rules have shorter list of parameters, and
-        you should consult their documentation for details.
+        Some main target rules have a different list of parameters, their 
+        documentation explicitly says so.
       </para>
-      
-      <para>The list of sources specifies what should be processed to get
-        the resulting targets. Most of the time, it's just a list of
-        files. Sometimes, you'd want to use all files with the same
-        extension as sources, in which case you can use the "glob"
-        rule. Here are two examples:
+
+      <para>The actual requirements for a target are obtained by refining
+      requirements of the project where a target is declared with the
+      explicitly specified requirements. The same is true for
+      usage-requirements. More details can be found in 
+      <xref linkend="bbv2.reference.variants.proprefine"/>
+      </para>
+
+      <section>
+        <title>Name</title>
+
+        <para>The name of main target has two purposes. First, it's used to refer to this target from
+        other targets and from command line. Second, it's used to compute the names of the generated files.
+        Typically, filenames are obtained from main target name by appending system-dependent suffixes and
+        prefixes.
+        </para>
+
+        <para>Name of main target can contain alphanumeral characters, dash, undescore and dot. The entire
+        name is significant when resolving references from other targets. For determining filenames, only the
+        part before the first dot is taken. For example:</para>
 <programlisting>
-exe a : a.cpp ;
-exe b : [ glob *.cpp ] ;
+obj test.release : test.cpp : &lt;variant&gt;release ;
+obj test.debug : test.cpp : &lt;variant&gt;debug ;
 </programlisting>
-        Unless you specify a files with absolute path, the name is
-        considered relative to the source directory -- which is typically
-        the same as directory when Jamfile is located, but can be changed as
-        described <link linkend=
-          "bbv2.advanced.projects.attributes.projectrule">here</link>
-      </para>
+        <para>will generate two files named <filename>test.obj</filename> (in two different directories), not
+        two files named <filename>test.release.obj</filename> and <filename>test.debug.obj</filename>.
+        </para>      
+
+      </section>
+
+      <section>
+        <title>Sources</title>
+
+        <para>The list of sources specifies what should be processed to
+        get the resulting targets. Most of the time, it's just a list of
+        files. Sometimes, you'll want to automatically construct the
+        list of source files rather than having to spell it out
+        manually, in which case you can use the
+        <functionname>glob</functionname> rule. Here are two examples:
+<programlisting>
+exe a : a.cpp ;           # a.cpp is the only source file
+exe b : [ glob *.cpp ] ;  # all .cpp files in this directory are sources 
+</programlisting>
+        Unless you specify a file with an absolute path, the name is
+        considered relative to the source directory&#x2014;which is typically
+        the directory where the Jamfile is located, but can be changed as
+        described in <xref linkend=
+          "bbv2.advanced.projects.attributes.projectrule"/>.
+        </para>
       
-      <para>
-        The list of sources can also reference other main targets. The
-        targets in the same project can be referred by using the name, and
-        targets in other project need to specify directory or a symbolic
-        name of the other project. For example:
+        <para>
+          <!-- use "project-id" here? -->
+          The list of sources can also refer to other main targets.
+          Targets in the same project can be referred to by name, while
+          targets in other projects must be qualified with a directory or a
+          symbolic project name. The directory/project name is separated from
+          the target name by double slash. There's no special syntax to
+          distinguish directory name from project name&#x2014;the part before
+          double slash is first looked up as project name, and then as directory
+          name. For example:
 <programlisting>
 lib helper : helper.cpp ;
 exe a : a.cpp helper ;
+# Since all project ids start with slash, ".." is directory name.
 exe b : b.cpp ..//utils ;
-exe c : c.cpp /boost/program_options//program_opions ;
+exe c : c.cpp /boost/program_options//program_options ;
 </programlisting>
-        The first exe uses the library defined in the same project. The
-        second one uses some target (most likely library) defined by Jamfile
-        one level higher. Finally, the third target uses some <ulink
-          url="http://boost.org">C++ Boost</ulink> library, using the
-        symbolic name to refer to it. More information about it can be found
-        in <link linkend="bbv2.tutorial.libs">tutorial</link> and in 
-        <link linkend="bbv2.reference.ids">target id reference</link>.          
-      </para>
+          The first exe uses the library defined in the same
+          project. The second one uses some target (most likely library)
+          defined by Jamfile one level higher. Finally, the third target
+          uses some <ulink url="http://boost.org">C++ Boost</ulink>
+          library, referring to it by absolute symbolic name. More
+          information about target references can be found in <xref
+          linkend="bbv2.tutorial.libs"/> and <xref
+          linkend="bbv2.reference.ids"/>.
+        </para>
 
-<!--
-      <section id="bbv2.advanced.targets.requirements">        
-        <title>Requirements and usage-requirements</title>
-        
-        <para>The requirements argument specify what properties are absolutely
-        necessary for this main target. 
       </section>
--->
-      <para>Requirements are the properties that should always be present when
+
+      <section id="bbv2.advanced.targets.requirements">
+        <title>Requirements</title>
+        <para>Requirements are the properties that should always be present when
         building a target. Typically, they are includes and defines:
 <programlisting>
 exe hello : hello.cpp : &lt;include&gt;/opt/boost &lt;define&gt;MY_DEBUG ;
 </programlisting>
-        In special circumstances, other properties can be used, for example if
-        a library does not work if it's shared, or a file can't be compiled
+        There is a number of other features, listed in
+        <xref linkend="bbv2.advanced.builtins.features"/>. For example if
+        a library can only be built statically, or a file can't be compiled
         with optimization due to a compiler bug, one can use
 <programlisting>
 lib util : util.cpp : &lt;link&gt;static ;
 obj main : main.cpp : &lt;optimization&gt;off ;
 </programlisting>                
-      </para>
+        </para>
 
-      <para>Sometimes, requirements are necessary only for a specific
-        compiler, or build variant. The 
-        <link linkend="v2.reference.variants.propcond">conditional
-        properties</link> can be used in that case:
+        <para id="bbv2.advanced.targets.requirements.conditional">Sometimes, particular relationships need to be maintained
+        among a target's build properties. This can be achieved with 
+        <firstterm>conditional
+        requirements</firstterm>. For example, you might want to set
+        specific <code>#defines</code> when a library is built as shared,
+        or when a target's <code>release</code> variant is built in
+        release mode.
 <programlisting>
-lib util : util.cpp : &lt;toolset&gt;msvc:&lt;link&gt;static ;
+lib network : network.cpp 
+    : <emphasis role="bold">&lt;link&gt;shared:&lt;define&gt;NEWORK_LIB_SHARED</emphasis>
+     &lt;variant&gt;release:&lt;define&gt;EXTRA_FAST
+    ;
 </programlisting>
-        In means when whenever <code>&lt;toolset&gt;msvc</code> property is
-        in build properties, the <code>&lt;link&gt;static</code> property will
-        be included as well. The conditional requirements can be "chained":
+
+        In the example above, whenever <filename>network</filename> is
+        built with <code>&lt;link&gt;shared</code>,
+        <code>&lt;define&gt;NEWORK_LIB_SHARED</code> will be in its
+        properties, too.      
+        </para>
+
+        <para>You can use several properties in the condition, for example:
 <programlisting>
-lib util : util.cpp : &lt;toolset&gt;msvc:&lt;link&gt;static 
-                      &lt;link&gt;static:&lt;define&gt;STATIC_LINK ;
+lib network : network.cpp
+    : &lt;toolset&gt;gcc,&lt;optimization&gt;speed:&lt;define&gt;USE_INLINE_ASSEMBLER
+    ;
 </programlisting>
-        will set of static link and the <code>STATIC_LINK</code> define on the
-        <code>msvc</code> toolset.
-      </para>
+        </para>
 
-      <para>The default-build attribute is
-        a set of properties which should be used if build request does not
-        specify a value. For example:
+        <para id="bbv2.advanced.targets.requirements.indirect">
+          More powerfull variant of conditional requirements is <firstterm>indirect conditional requiremens</firstterm>.
+          You can provide a rule that will be called with the current build properties and can compute additional properties
+          to be added. For example:
 <programlisting>
+lib network : network.cpp 
+    : &lt;conditional&gt;@my-rule
+    ;
+rule my-rule ( properties * )
+{
+    local result ;
+    if &lt;toolset&gt;gcc &lt;optimization&gt;speed in $(properties)
+    {
+        result += &lt;define&gt;USE_INLINE_ASSEMBLER ;
+    }
+    return $(result) ;
+}  
+</programlisting>
+        This example is equivalent to the previous one, but for complex cases, indirect conditional
+        requirements can be easier to write and understand.
+        </para>
+
+      </section>
+
+      <section>
+        <title>Default build</title>
+
+        <para>The <varname>default-build</varname> parameter
+        is a set of properties to be used if the build request does
+        not otherwise specify a value for features in the set. For example:
+<programlisting>
 exe hello : hello.cpp : : &lt;threading&gt;multi ;
 </programlisting>
-        would build the target in multi-threaded mode, unless the user
-        explicitly requests single-threaded version. The difference between
+        would build a multi-threaded target in unless the user
+        explicitly requests a single-threaded version. The difference between
         requirements and default-build is that requirements cannot be
         overriden in any way.
-      </para>
+        </para>
+      </section>
 
-      <para>A target of the same name can be declared several times. In that
-        case is declaration is called an
-        <firstterm>alternative</firstterm>. When the target is build, one of
-        the alternatives will be selected and use. Alternatives need not be
-        defined by the same main target rule. The following is OK:
+      <section>
+        <title>Additional information</title>
+
+        <para>
+          The ways a target is built can be so different that
+          describing them using conditional requirements would be
+          hard. For example, imagine that a library actually uses
+          different source files depending on the toolset used to build
+          it. We can express this situation using <firstterm>target
+          alternatives</firstterm>:
 <programlisting>
-lib helpers : helpers.hpp ;
-alias helpers : helpers.lib : &lt;toolset&gt;msvc ;
+lib demangler : dummy_demangler.cpp ;                      # alternative 1
+lib demangler : demangler_gcc.cpp : &lt;toolset&gt;gcc ;   # alternative 2
+lib demangler : demangler_msvc.cpp : &lt;toolset&gt;msvc ; # alternative 3
 </programlisting>
-      </para>
+          In the example above, when built with <literal>gcc</literal>
+          or <literal>msvc</literal>, <filename>demangler</filename>
+          will use a source file specific to the toolset.  Otherwise, it
+          will use a generic source file,
+          <filename>dummy_demangler.cpp</filename>.
+        </para>
 
-      <para>Building of the same main target can differ greatly from
-        platform to platform. For example, you might have different list
-        of sources for different compilers, or different options for those
-        compilers. Two approaches to this are explained in the 
-        <link linkend="bbv2.tutorial.conditions">tutorial</link>.
-      </para>
+        <para>It is possible to declare a target inline, i.e. the "sources"
+        parameter may include calls to other main rules. For example:</para>
 
-      <para>Sometimes a main target is really needed only by some other main
-        target. For example, a rule that declares a test-suite uses a main
-        target that represent test, but those main targets are rarely needed
-        by themself.</para>
-
-      <para>It is possible to declare target inline, i.e. the "sources"
-        parameter may include call to other main rules. For example:</para>
-
 <programlisting>
 exe hello : hello.cpp 
-    [ obj helpers : helpers.cpp : &lt;optimization&gt;off ] ;
-</programlisting>
+    [ obj helpers : helpers.cpp : &lt;optimization&gt;off ] ;</programlisting>
 
-      <para>
-        Will cause "helpers.cpp" to be always compiled without
-        optimization. It's possible to request main targets declared
-        inline, but since they are considered local, they are renamed to
-        "parent-main-target_name..main-target-name". In the example above,
-        to build only helpers, one should run "bjam hello..helpers".
-      </para>
+         <para>
+           Will cause "helpers.cpp" to be always compiled without
+           optimization. When referring to an inline main target, its declared
+           name must be prefixed by its parent target's name and two dots. In
+           the example above, to build only helpers, one should run
+           <code>bjam hello..helpers</code>.
+         </para>
 
+         <para>When no target is requested on the command line, all targets in the
+         current project will be built. If a target should be built only by
+         explicit request, this can be expressed by the
+         <functionname>explicit</functionname> rule:
+         <programlisting>
+         explicit install_programs ;</programlisting>
+         </para>
+
+      </section>
     </section>
 
     <section id="bbv2.advanced.projects">
       <title>Projects</title>
 
-      <para>As mentioned before, targets are grouped into project, and each
-        Jamfile is a separate project. Projects are useful because it allows
-        to group related targets together, define properties common to all
-        those targets, and assign a symbolic name to the project, allowing to
-        easily refer to the targets in the project. Two last goals are
-        accompished with the "project" rule.
+      <para>As mentioned before, targets are grouped into projects,
+      and each Jamfile is a separate project. Projects are useful
+      because they allow us to group related targets together, define
+      properties common to all those targets, and assign a symbolic
+      name to the project that can be used in referring to its
+      targets. 
       </para>
 
-      <para>The rule has this syntax
+      <para>Projects are named using the
+      <functionname>project</functionname> rule, which has the
+      following syntax:
 <programlisting>
-project id : &lt;attributes&gt; ;
+project <replaceable>id</replaceable> : <replaceable>attributes</replaceable> ;
 </programlisting>
-        Here, attributes is a sequence of (attribute-name,
-        attribute-value) pairs. The list of attribute names along with its
-        handling is also shown in the table below. For example, it is
-        possible to write:
+        Here, <replaceable>attributes</replaceable> is a sequence of
+        rule arguments, each of which begins with an attribute-name
+        and is followed by any number of build properties. The list
+        of attribute names along with its handling is also shown in
+        the table below. For example, it is possible to write:
 <programlisting>
 project tennis 
     : requirements &lt;threading&gt;multi 
@@ -529,6 +869,11 @@
         unrelated to filesystem, such as "boost/thread". <link linkend=
           "bbv2.reference.ids">Target references</link> make use of project ids to
         specify a target.</para>
+        <!-- 
+             This is actually spelled "project-id," isn't it?  You
+             have to fix all of these and use a code font.  Also below
+             in the table.
+        -->
 
       <para><emphasis>Source location</emphasis> specifies the directory where sources
         for the project are located.</para>
@@ -538,6 +883,14 @@
 
       <para><emphasis>Default build</emphasis> is the build request that should be
         used when no build request is specified explicitly.</para>
+        <!-- 
+             This contradicts your earlier description of default
+             build and I believe it is incorrect.  Specifying a build
+             request does not neccessarily render default build
+             ineffective, because it may cover different features.
+             This description is repeated too many times in the
+             documentation; you almost *had* to get it wrong once.
+        -->
 
       <para id="bbv2.advanced.projects.attributes.projectrule">
         The default values for those attributes are
@@ -550,11 +903,13 @@
               <row>
                 <entry>Attribute</entry>
                 
-                <entry>Name for the 'project' rule</entry>
+                <entry>Name</entry>
                 
                 <entry>Default value</entry>
                 
-                <entry>Handling by the 'project' rule</entry>
+                <entry>Handling by the <functionname>project</functionname>
+                rule</entry>
+
               </row>
             </thead>
             
@@ -608,9 +963,11 @@
                 
                 <entry><literal>build-dir</literal></entry>
                 
-                <entry>If parent has a build dir set, the value of it, joined
-                  with the relative path from parent to the current project.
-                  Otherwise, empty</entry>
+                <entry>Empty if the parent has no build directory set.
+                Otherwise, the parent's build directory with the
+                relative path from parent to the current project
+                appended to it.
+                </entry>
                 
                 <entry>Sets to the passed value, interpreted as relative to the
                   project's location.</entry>
@@ -619,13 +976,70 @@
           </tgroup>
         </table>
         </para>
-      </section>
 
+      <para>Besides defining projects and main targets, Jamfiles
+      commonly invoke utility rules such as
+      <functionname>constant</functionname> and
+      <functionname>path-constant</functionname>, which inject a
+      specified Boost.Jam variable setting into this project's Jamfile
+      module and those of all its subprojects.  See <xref
+      linkend="bbv2.advanced.other-rules"/> for a complete description
+      of these utility rules.  Jamfiles are regular Boost.Jam source
+      files and Boost.Build modules, so naturally they can contain any kind of Boost.Jam code,
+      including rule definitions.
+      <!-- I improved that sentence, but I don't think it belongs
+           here.  I suggest you strike it. -->
+      </para>
+
+      <para>Each subproject inherits attributes, constants and rules
+      from its parent project, which is defined by the nearest
+      Jamfile in an ancestor directory above
+      the subproject.  The top-level project is declared in a file
+      called <filename>Jamroot</filename> rather than
+      <filename>Jamfile</filename>.  When loading a project,
+      Boost.Build looks for either <filename>Jamroot</filename> or
+      <code>Jamfile</code>.  They are handled identically, except
+      that if the file is called <filename>Jamroot</filename>, the
+      search for a parent project is not performed.
+      </para>
+
+      <para>Even when building in a subproject directory, parent
+      project files are always loaded before those of their
+      subprojects, so that every definition made in a parent project
+      is always available to its children. The loading order of any
+      other projects is unspecified.  Even if one project refers to
+      another via <xref
+      linkend="bbv2.advanced.projects.relationships.useprojectrule"><functionname>use-project</functionname></xref>,
+      or a target reference, no specific order should be assumed.
+      </para>
+
+      <note>
+        <para>Giving the root project the special name
+        &#x201C;<filename>Jamroot</filename>&#x201D; ensures that
+        Boost.Build won't misinterpret a directory above it as the
+        project root just because the directory contains a Jamfile.
+        <!-- The logic of the previous reasoning didn't hang together -->
+        </para>          
+      </note>
+
+      <!-- All this redundancy with the tutorial is bad.  The tutorial
+           should just be made into the introductory sections of this
+           document, which should be called the "User Guide."  It's
+           perfectly appropriate to start a user guide with that kind
+           of material. -->
+    </section>
+
+    
     <section id="bbv2.advanced.other-rules">
-      <title>Additional Jamfile rules</title>
+      <title>Jamfile Utility Rules</title>
 
-      <para>There's a number of other helper rules which can be used in
-      Jamfile, described in the following table.</para>
+      <para>The following table describes utility rules that can be
+      used in Jamfiles. Detailed information for any of these rules can
+      be obtained by running:
+<screen>
+bjam --help project.<replaceable>rulename</replaceable>
+</screen>
+      </para>
 
       <table>
         <title/>
@@ -634,7 +1048,7 @@
             <row>
               <entry>Rule</entry>
               
-              <entry>Semantic</entry>
+              <entry>Semantics</entry>
             </row>
           </thead>
           
@@ -644,164 +1058,91 @@
                   "bbv2.advanced.projects.attributes.projectrule">project</link>
               </entry>
               
-              <entry>Define project attributes.</entry>
+              <entry>Define this project's symbolic ID or attributes.</entry>
             </row>
             
             <row>
-              <entry><link linkend=
-                  "bbv2.advanced.projects.relationships.useprojectrule">use-project</link></entry>
+              <entry><xref linkend=
+                  "bbv2.advanced.projects.relationships.useprojectrule">use-project</xref></entry>
               
-              <entry>Make another project known.</entry>
+              <entry>Make another project known so that it can be referred to by symbolic ID.</entry>
             </row>
             
             <row>
-              <entry><link linkend=
-                  "bbv2.advanced.projects.relationships.buildprojectrule">build-project</link></entry>
+              <entry><xref linkend=
+                  "bbv2.advanced.projects.relationships.buildprojectrule">build-project</xref></entry>
               
-              <entry>Build another project when this one is built.</entry>
+              <entry>Cause another project to be built when this one is built.</entry>
             </row>
             
             <row>
-              <entry><link linkend=
-                  "bbv2.reference.buildprocess.explict">explicit</link></entry>
+              <entry><xref linkend=
+                  "bbv2.reference.buildprocess.explict">explicit</xref></entry>
               
-              <entry>States that the target should be built only by explicit
+              <entry>State that a target should be built only by explicit
                 request.</entry>
             </row>
             
             <row>
               <entry>glob</entry>
               
-              <entry>Takes a list of wildcards, and returns the list of files
-                which match any of the wildcards.</entry>
+              <entry>Translate a list of shell-style wildcards into a
+              corresponding list of files.</entry>
             </row>
-          </tbody>
-        </tgroup>
-      </table>
-    </section>
-      
-    <section id="bbv2.advanced.project-root">
-      <para>Each project is also associated with <emphasis>project root</emphasis>.
-        That's a root for a tree of projects, which specifies some global
-        properties.</para>
-      
-        <title>Project root</title>
 
-        <para>
-          Project root for a projects is the nearest parent directory
-          which contains a file called
-          <filename>project-root.jam</filename>. That file defines
-          certain properties which apply to all projects under project
-          root. It can:
+            <row>
+              <entry>constant</entry>
+              
+              <entry>Injects a variable setting into this project's
+              Jamfile module and those of all its subprojects.</entry>
+            </row>
 
-        <itemizedlist>
-          <listitem>
-            <simpara>
-              configure toolsets, via call to <literal>toolset.using</literal>
-            </simpara>
-          </listitem>
-          
-          <listitem>
-            <simpara>
-              refer to other projects, via the <literal>use-project</literal>
-              rule
-            </simpara>
-          </listitem>
-          
-          <listitem>
-            <simpara>
-              declare constants, via the <literal>constant</literal> and
-              <literal>path-constant</literal> rules.
-            </simpara>
-          </listitem>
-        </itemizedlist>
+            <row>
+              <entry>path-constant</entry>
+              
+              <entry>Injects a variable set to a path value into
+              this project's Jamfile module and those of all its subprojects.
+              If the value is a relative path it will be adjusted for
+              each subproject so that it refers to the same
+              directory.</entry>
+            </row>
 
-      </para>
 
-      <para>To facilitate declaration of simple projects, Jamfile and
-        project-root can be merged together. To achieve this effect, the
-        project root file should call the <literal>project</literal> rule. The
-        semantic is precisely the same as if the call was made in
-        Jamfile, except that project-root.jam will start to serve as
-        Jamfile. The Jamfile in the directory of project-root.jam will be
-        ignored, and project-root.jam will be able to declare main
-        targets as usual.</para>
-      
+          </tbody>
+        </tgroup>
+      </table>
     </section>
-
-<!--
-      <section id="bbv2.advanced.projects.relationships">
-        <title>Project relationship</title>
-
-  <para>There are three kinds of project relationships.</para>
-
-  <para>First is parent-child. This relationship is established
-  implicitly: parent directories of a project are searched, and the
-  first found Jamfile is assumed to define the parent project. The
-  parent-child relationship affects only attribute values for the
-  child project.</para>
-
-  <para id="bbv2.advanced.projects.relationships.buildprojectrule">
-  Second is build relationship. Some
-  project may request to recursively build other projects. Those
-  project need not be child projects. The <literal>build-project</literal>
-  rule is used for that:</para>
-  <programlisting>
-    build-project src ;   
-</programlisting>
-
-  <para id="bbv2.advanced.projects.relationships.useprojectrule">
-  The third kind is the 'use'
-  relationship. In means that one project uses targets from
-  another. It is possible to just refer to target in other projects
-  using target id. However, if target id uses project id, it is
-  required that the project id is known. The
-  <literal>use-project</literal>
-  rule is employed to guarantee that.
-  </para>
-
-<programlisting>
-use-project ( id : location )
-</programlisting>
-
-        <para>
-It loads the project at the specified location, which makes
-its project id available in the project which invokes the rule. It
-is required that the <literal>id</literal> parameter passed to the
-<literal>use-project</literal> rule be equal to the id that the loaded
-project declared. At this moment, the <literal>id</literal> paremeter
-should be absolute project id.
-        </para>
-      </section>
-    </section>
-
--->
-       
-  </section>
-  
+               
   <section id="bbv2.advanced.build_process">
-    <title>Build process</title>
+    <title>The Build Process</title>
 
     <para>When you've described your targets, you want Boost.Build to run the
-      right tools and create the needed targets. This section will describe
+      right tools and create the needed targets. 
+      <!-- That sentence is awkward and doesn't add much. -->
+      This section will describe
       two things: how you specify what to build, and how the main targets are
       actually constructed.
     </para>
 
     <para>The most important thing to note is that in Boost.Build, unlike
       other build tools, the targets you declare do not correspond to specific
-      files. What you declare in Jamfiles is more like "metatarget". Depending
-      on the properties that you specify on the command line, each
-      "metatarget" will produce a set of real targets corresponding to the
-      requested properties. It is quite possible that the same metatarget is
-      build several times with different properties, and will, of course,
-      produce different files.
+      files. What you declare in a Jamfile is more like a “metatarget.” 
+      <!-- Do we need a new word?  We already have “main target.” If
+           you're going to introduce “metatarget” you should at least
+           tie it together with the main target concept. It's too
+           strange to have been saying “main target” all along and now
+           suddenly start saying “what you declare in a jamfile” -->
+      Depending on the properties you specify on the command line,
+      each metatarget will produce a set of real targets corresponding
+      to the requested properties. It is quite possible that the same
+      metatarget is built several times with different properties,
+      producing different files.
     </para>
     <tip>
       <para>
-        This means that for Boost.Build, you cannot directly obtain build
-        variant from Jamfile. There could be several variants requested by the
-        user, and each target can be build with different properties. 
+        This means that for Boost.Build, you cannot directly obtain a build
+        variant from a Jamfile. There could be several variants requested by the
+        user, and each target can be built with different properties. 
       </para>
     </tip>
 
@@ -809,7 +1150,7 @@
       <title>Build request</title>
 
       <para>
-        The command line specifies which targets to build and with what
+        The command line specifies which targets to build and with which
         properties. For example:
 <programlisting>
 bjam app1 lib1//lib1 toolset=gcc variant=debug optimization=full
@@ -822,22 +1163,28 @@
 <programlisting>
 bjam app1 lib1//lib1 gcc debug optimization=full
 </programlisting>
-        The complete syntax which has some additional shortcuts if described <link
-          linkend="bbv2.reference.commandline">here</link>.
+        The complete syntax, which has some additional shortcuts, is
+        described in <xref linkend="bbv2.reference.commandline"/>.
       </para>
     </section>
 
     <section><title>Building a main target</title>
 
       <para>When you request, directly or indirectly, a build of a main target
-        with specific requirements, the following steps are made. Some brief
-        explanation is provided, and more detailes are given in the <link
-        linkend="bbv2.reference.buildprocess">reference</link>.
+        with specific requirements, the following steps are done. Some brief
+        explanation is provided, and more details are given in <xref
+        linkend="bbv2.reference.buildprocess"/>.
         <orderedlist>
           
           <listitem><para>Applying default build. If the default-build
-          property of a target specifies a value of a feature which is not
-          present in the build request, that value is added.</para></listitem>
+          property of a target specifies a value of a feature that is not
+          present in the build request, that value is added.</para>
+          <!--
+              Added to what?  Don't say “the build request!” The
+              request is what was requested; if its meaning changes
+              the reader will be confused.
+          -->
+          </listitem>
           
           <listitem><para>Selecting the main target alternative to use. For
               each alternative we look how many properties are present both in
@@ -845,9 +1192,20 @@
               alternative with large number of matching properties is selected.
             </para></listitem>
           
-          <listitem><para>Determining "common" properties. The build request
+          <listitem><para>Determining "common" properties. 
+          <!-- It would be nice to have a better name for this.  But
+               even more importantly, unless you say something about
+               the reason for choosing whatever term you use, the
+               reader is going to wonder what it means. -->
+              The build request
               is <link linkend="bbv2.reference.variants.proprefine">refined</link>
-              with target's requirements. The conditional properties in
+              with target's requirements. 
+              <!-- It's good that you have the links here and below,
+                   but I'm concerned that it doesn't communicate well
+                   in print and there's not enough information for the
+                   print reader.  Maybe we need separate XSL for PDF
+                   printing that generates a readable footnote. -->
+              The conditional properties in
               requirements are handled as well. Finally, default values of
               features are added.
             </para></listitem>
@@ -863,9 +1221,11 @@
               request to the other target.              
             </para></listitem>
           
-          <listitem><para>Adding the usage requirements produces when building
+          <listitem><para>Adding the usage requirements produced when building
               dependencies to the "common" properties. When dependencies are
-              built in the previous step, they return both the set of created
+              built in the previous step, they return 
+              <!-- don't assume reader has a mental model for BB internals! -->
+              both the set of created
               "real" targets, and usage requirements. The usage requirements
               are added to the common properties and the resulting property
               set will be used for building the current target.              
@@ -873,8 +1233,11 @@
           
           <listitem><para>Building the target using generators. To convert the
               sources to the desired type, Boost.Build uses "generators" ---
-              objects which correspond to tools like compilers and
-              linkers. Each generator declares what type of targets in can
+              objects that correspond to tools like compilers and
+              linkers. Each generator declares what type of targets it
+              <!-- Was "in." Why are these short and unmistakable
+                   words so commonly misspelled? -->
+              can
               produce and what type of sources it requires. Using this
               information, Boost.Build determines which generators must be run
               to produce a specific target from specific sources. When
@@ -882,7 +1245,9 @@
             </para></listitem>
           
           <listitem><para>Computing the usage requirements to be returned. The
-          conditional properties in usage requirements are expanded and the
+          conditional properties in usage requirements are expanded 
+          <!-- what does "expanded" mean? -->
+          and the
           result is returned.</para></listitem>
         </orderedlist>        
       </para>
@@ -890,12 +1255,19 @@
 
     <section><title>Building a project</title>
 
-      <para>Often, user request a build of a complete project, not just one
-        main target. In fact, invoking <command>bjam</command> without
-        parameters builds the project defined in the current directory.</para>
+      <para>Often, a user builds a complete project, not just one main
+      target. In fact, invoking <command>bjam</command> without
+      arguments
+      <!-- do you know the difference between parameters and
+           arguments?  I only learned this year -->
+      builds the project defined in the current
+      directory.</para>
 
-      <para>When a project is build, the build request is passed without
-        modification to all main targets in that project. It's is possible to
+      <para>When a project is built, the build request is passed without
+        modification to all main targets in that project.
+        <!-- What does it mean to pass a build request to a target?
+             -->
+        It's is possible to
         prevent implicit building of a target in a project with the
         <code>explicit</code> rule:
 <programlisting>
@@ -906,7 +1278,9 @@
       </para>
 
       <para>The Jamfile for a project can include a number of
-      <code>build-project</code> rule calls, that specify additional projects
+      <code>build-project</code> rule calls
+      <!-- A comma would only be correct here in German -->
+      that specify additional projects
       to be built.
       </para>
 
@@ -917,9 +1291,17 @@
   <section id="bbv2.advanced.builtins.targets">
     <title>Builtin target types</title>
 
+    <para>This section describes main targets types that Boost.Build supports
+    of-of-the-box. Unless otherwise noted, all mentioned main target rules
+    have the common signature, described in <xref
+    linkend="bbv2.main-target-rule-syntax"/>.
+    </para>
+
     <section>
       <title>Programs</title>
 
+      <indexterm><primary>Builtin
+      rules</primary><secondary>exe</secondary></indexterm>
       <para>Programs are created using the <code>exe</code> rule, which
         follows the <link linkend="bbv2.main-target-rule-syntax">common
           syntax</link>. For example:
@@ -930,7 +1312,7 @@
 </programlisting>
         This will create an executable file from the sources -- in this case,
         one C++ file, one library file present in the same directory, and
-        another library which is created by Boost.Build. Generally, sources
+        another library that is created by Boost.Build. Generally, sources
         can include C and C++ files, object files and libraries. Boost.Build
         will automatically try to convert targets of other types.
       </para>
@@ -945,7 +1327,10 @@
           manually, or place the application and the libraries to the same
           directory, for example using the <link linkend="bbv2.builtins.stage">
             stage</link> rule.
-      </para>
+        </para>
+        <!-- We should be emphasizing the use of the built-in testing
+             rules rather than continually discussing these quirks of
+             running programs with dynamic libraries. -->
       </tip>
     </section>
 
@@ -959,7 +1344,7 @@
 lib helpers : helpers.cpp : &lt;include&gt;boost : : &lt;include&gt;. ;
 </programlisting>
       </para>
-
+      <!-- Add one sentence that says what the above does. -->
       <para>In the most common case, the <code>lib</code> creates a library
         from the specified sources. Depending on the value of
         &lt;link&gt; feature the library will be either static or
@@ -968,6 +1353,7 @@
         searched by the compiler (typically, using the <option>-l</option>
         option). The second case is where the library is available as a 
         prebuilt file and the full path is known.          
+        <!-- But the first case is also prebuilt.  This is confusingly phrased. -->
         </para>
       
       <para>
@@ -976,20 +1362,20 @@
 lib z : : &lt;name&gt;z &lt;search&gt;/home/ghost ;            
 lib compress : : &lt;file&gt;/opt/libs/compress.a ;
 </programlisting>
-        The <code>name</code> property specifies the name which should be
+        The <code>name</code> property specifies the name that should be
         passed to the <option>-l</option> option, and the <code>file</code>
-        property specifies the file location. The <code>search</code> feature
-        specifies paths where the library should be searched. That feature can
-        be specified several time, or can be omitted -- in which case only
+        property specifies the file location. The <varname>search</varname> feature
+        specifies paths in which to search for the library. That feature can
+        be specified several times, or it can be omitted, in which case only
         default compiler paths will be searched.
       </para>
 
-      <para>The difference between using the <code>file</code> feature as
-        opposed to the <code>name</code> name feature together with the
-        <code>search</code> feature is that <code>file</code> is more
+      <para>The difference between using the <varname>file</varname> feature as
+        opposed to the <varname>name</varname> feature together with the
+        <varname>search</varname> feature is that <varname>file</varname> is more
         precise. A specific file will be used. On the other hand, the
-        <code>search</code> feature only adds a library path, and the
-        <code>name</code> feature gives the basic name of the library. The
+        <varname>search</varname> feature only adds a library path, and the
+        <varname>name</varname> feature gives the basic name of the library. The
         search rules are specific to the linker. For example, given these
         definition:
 <programlisting>
@@ -999,9 +1385,10 @@
 lib b : : &lt;variant&gt;debug &lt;file&gt;/pool/debug/b.so ;
 </programlisting>
         It's possible to use release version of <code>a</code> and debug
-        version of <code>b</code>. Had we used the <code>name</code> and
-        <code>search</code> features, the linker would always pick either
+        version of <code>b</code>. Had we used the <varname>name</varname> and
+        <varname>search</varname> features, the linker would always pick either
         release or debug versions.
+        <!-- explain -->
       </para>
       
       <para>
@@ -1013,13 +1400,13 @@
           and is does exactly the same as:
 <programlisting>
 lib z : : &lt;name&gt;z ;            
-lib giu : : &lt;name&gt;gui ;            
+lib gui : : &lt;name&gt;gui ;            
 lib db : : &lt;name&gt;db ;            
 lib aux : : &lt;name&gt;aux ;            
 </programlisting>
       </para>
           
-      <para>When a library uses another library you should put that another
+      <para>When a library uses another library you should put that other
         library in the list of sources. This will do the right thing in all
         cases. For portability, you should specify library dependencies even
         for searched and prebuilt libraries, othewise, static linking on
@@ -1031,39 +1418,53 @@
         </para>
 
       <note>
-        <para>When a library (say, <code>a</code>), which has another
-          library, (say, <code>b</code>) is linked dynamically, the <code>b</code>
-          library will be incorporated in <code>a</code>. (If <code>b</code>
+        <para>When a library (say, <code>a</code>), that has another
+          library, (say, <code>b</code>) 
+          <!-- how can a library "have" a library? -->
+          is linked dynamically, the <code>b</code>
+          library will be incorporated 
+          <!-- Incorporated?  Be precise. -->
+          in <code>a</code>. (If <code>b</code>
           is dynamic library as well, then <code>a</code> will only refer to
-          it, and not include any extra code.) When the <code>a</code>
+          it, and not include any extra code.) 
+          <!-- Don't parenthesize a whole sentence. -->
+          When the <code>a</code>
           library is linked statically, Boost.Build will assure that all
-          executables which link to <code>a</code> will also link to
+          executables that link to <code>a</code> will also link to
           <code>b</code>.
         </para>
       </note>
          
-      <para>One feature of Boost.Build which is very important for libraries
-        is usage requirements. For example, if you write:
+      <para>One feature of Boost.Build that is very important for libraries
+        is usage requirements. 
+        <!-- Rephrase that.  But then, it's much too late for an
+             introduction of usage requirements - you've already
+             discussed them many times. -->
+        For example, if you write:
 <programlisting>
 lib helpers : helpers.cpp : : : &lt;include&gt;. ;
 </programlisting>
-        then compiler include path for all targets which use
-        <code>helpers</code> will contain the directory where the target is
-        defined.path to "helpers.cpp". So, the user need only to add
-        <code>helpers</code> to the list of sources, and don't bother about
-        other requirements. This allows to greatly simplify Jamfiles.
+        then the compiler include path for all targets that use
+        <code>helpers</code> will contain the directory 
+        <!-- The rest of this sentence is unintelligible -->
+        where the target is defined.path to "helpers.cpp". The user
+        only needs to add <code>helpers</code> to the list of sources,
+        and needn't consider the requirements its use imposes on a
+        dependent target. This feature greatly simplifies Jamfiles.
+        <!-- You can't say “allows to”—you need a noun.  This error is
+             repeated throughout. -->
       </para>
 
       <note>
         <para>If you don't want shared libraries to include all libraries
-          which are specified in sources (especially statically linked ones),
+          that are specified in sources (especially statically linked ones),
           you'd need to use the following:
 <programlisting>
 lib b : a.cpp ;
 lib a : a.cpp : &lt;use&gt;b : : &lt;library&gt;b ;
 </programlisting>
           This specifies that <code>a</code> uses <code>b</code>, and causes
-          all executables which link to <code>a</code> also link to
+          all executables that link to <code>a</code> also link to
           <code>b</code>. In this case, even for shared linking, the
           <code>a</code> library won't even refer to <code>b</code>.
         </para>
@@ -1074,34 +1475,34 @@
     <section id="bbv2.builtins.alias">
       <title>Alias</title>
 
-      <para>The <code>alias</code> rule follows the <link
-          linkend="bbv2.main-target-rule-syntax">common syntax</link>. For
-        example:
-<programlisting>
-alias core : im reader writer ;
-</programlisting>
-        will build the sources and return the generated source targets
-        without modification. 
-      </para>
+      <para>
+        The <functionname>alias</functionname> rule gives alternative name to
+        a group of targets. For example, to give the name
+        <filename>core</filename> to a group of three other targets with the
+        following code:
+        <programlisting>
+alias core : im reader writer ;</programlisting>
+        Using <filename>core</filename> on the command line, or in the source list
+        of any other target is the same as explicitly using
+        <filename>im</filename>, <filename>reader</filename>, and
+        <filename>writer</filename>, but it is just more convenient.
 
-      <para>
-        The <code>alias</code> rule is a convenience tool. If you often build
-        the same group of targets at the same time, you can define the alias
-        to save typing.        
       </para>
 
+
       <para>
         Another use of the <code>alias</code> rule is to change build
         properties. For example, if you always want static linking for a
         specific C++ Boost library, you can write the following:
 <programlisting>
-alias boost_thread : /boost/thread//boost_thread : &lt;link&gt;static ;
+alias threads : /boost/thread//boost_thread : &lt;link&gt;static ;
 </programlisting>
-        and use only the <code>boost_thread</code> alias in your Jamfiles.
+        and use only the <code>threads</code> alias in your Jamfiles.
+        <!-- changed name for clarity -->
       </para>              
 
       <para>
-        It is also allowed to specify usage requirements for the
+        You can also specify usage requirements for the
         <code>alias</code> target. If you write the following:
 <programlisting>
 alias header_only_library : : : :  &lt;include&gt;/usr/include/header_only_library ; 
@@ -1111,7 +1512,7 @@
         requirements are propagated, too. For example:
 <programlisting>
 lib lib : lib.cpp : : : &lt;include&gt;. ;
-alias lib_alias ;
+alias lib_alias ; <!-- This line can't possibly be correct!?? -->
 exe main : main.cpp lib_alias ;
 </programlisting>
         will compile <filename>main.cpp</filename> with the additional include.
@@ -1122,35 +1523,90 @@
     <section id="bbv2.builtins.stage">
       <title>Installing</title>
 
-      <para>For installing the built target you should use the
-        <code>stage</code> rule follows the <link
+      <para>For installing a built target you should use the
+        <code>install</code> rule, which follows the <link
           linkend="bbv2.main-target-rule-syntax">common syntax</link>. For
         example:
 <programlisting>
-stage dist : hello helpers ;
+install dist : hello helpers ;
 </programlisting>
         will cause the targets <code>hello</code> and <code>helpers</code> to
-        be moved to the <filename>dist</filename> directory. The directory can
+        be moved to the <filename>dist</filename> directory, relative to
+        Jamfile's directory. The directory can
         be changed with the <code>location</code> property:
 <programlisting>
-stage dist : hello helpers : &lt;location&gt;/usr/bin ;
+install dist : hello helpers : &lt;location&gt;/usr/bin ;
 </programlisting>
+        While you can achieve the same effect by changing the target name to
+        <filename>/usr/bin</filename>, using the <code>location</code>
+        property is better, because it allows you to use a mnemonic target
+        name.
       </para>
 
+      <para>The <code>location</code> property is especially handy when the location
+        is not fixed, but depends on build variant or environment variables:
+<programlisting>
+install dist : hello helpers : &lt;variant&gt;release:&lt;location&gt;dist/release
+                             &lt;variant&gt;debug:&lt;location&gt;dist/debug ;
+install dist2 : hello helpers : &lt;location&gt;$(DIST) ;
+</programlisting> 
+        See also <link linkend="bbv2.reference.variants.propcond">conditional
+          properties</link> and <link linkend="bbv2.faq.envar">environment variables</link>
+      </para>
+      
       <para>
         Specifying the names of all libraries to install can be boring. The
-        <code>stage</code> allows to specify only the top-level executable
+        <code>install</code> allows you to specify only the top-level executable
         targets to install, and automatically install all dependencies:
 <programlisting>
-stage dist : hello 
-           : &lt;traverse-dependencies&gt;on &lt;include-type&gt;EXE
-             &lt;include-type&gt;LIB
+install dist : hello 
+           : &lt;install-dependencies&gt;on &lt;install-type&gt;EXE
+             &lt;install-type&gt;LIB
            ;
 </programlisting>
         will find all targets that <code>hello</code> depends on, and install
-        all of the which are either executables or libraries.
+        all of those which are either executables or libraries. More
+        specifically, for each target, other targets that were specified as
+        sources or as dependency properties, will be recursively found.  One
+        exception is that targets referred with the <link
+        linkend="bbv2.builtin.features.use"><code>use</code></link> feature
+        are not considered, because that feature is typically used to refer to
+        header-only libraries.
+        If the set of target types is specified, only targets of that type
+        will be installed, otherwise, all found target will be installed.
       </para>
-        
+
+      <para>The <link linkend="bbv2.builtins.alias"><code>alias</code></link>
+      rule can be used when targets must be installed into several
+      directories:
+<programlisting>
+alias install : install-bin install-lib ;
+install install-bin : applications : /usr/bin ;
+install install-lib : helper : /usr/lib ;
+</programlisting>
+    </para>
+
+    <para>Because the <code>install</code> rule just copies targets, most 
+    free features <footnote><para>see the definition of "free" in <xref
+    linkend="bbv2.reference.features.attributes"/>.</para></footnote>
+    have no effect when used in requirements of the <code>install</code> rule.
+    The only two which matter are  
+    <link linkend="bbv2.builtin.features.dependency">
+    <varname>dependency</varname></link> and, on Unix,
+    <link linkend="bbv2.builtin.feature.dll-path"><varname>dll-path</varname></link>. 
+    </para>
+
+    <note>
+      <para>
+        (Unix specific). On Unix, executables built with Boost.Build typically
+        contain the list of paths to all used dynamic libraries. For
+        installing, this is not desired, so Boost.Build relinks the executable
+        with an empty list of paths. You can also specify additional paths for
+        installed executables with the <varname>dll-path</varname> feature.
+      </para>
+    </note>
+      
+
     </section>
 
     <section id="bbv2.builtins.testing">
@@ -1166,20 +1622,98 @@
 </programlisting>
       </para>
 
-      <para>The <code>unit-test</code> rule behaves like the
-        <code>exe</code> rule, but after the executable is created it is
-        run. If the executable returns error, the build system will also
-        return error and will try running the executable on the next
+      <para>The <functionname>unit-test</functionname> rule behaves like the
+        <functionname>exe</functionname> rule, but after the executable is created it is
+        run. If the executable returns an error code, the build system will also
+        return an error and will try running the executable on the next
         invocation until it runs successfully. This behaviour ensures that you
         can't miss a unit test failure.
       </para>
 
+      <para>By default, the executable is run directly. Sometimes, it's 
+      desirable to run the executable using some helper command. You should use the
+      <literal>testing.launcher</literal> property to specify the name of the
+      helper command. For example, if you write:
+      </para>
+<programlisting>
+unit-test helpers_test 
+   : helpers_test.cpp helpers 
+   : <emphasis role="bold">&lt;testing.launcher&gt;valgrind</emphasis>
+   ;  
+</programlisting>
+      <para>The command used to run the executable will be:</para>
+<screen>
+<emphasis role="bold">valgrind</emphasis> bin/$toolset/debug/helpers_test 
+</screen>
+      
+      
+
       <para>There are rules for more elaborate testing: <code>compile</code>,
         <code>compile-fail</code>, <code>run</code> and
         <code>run-fail</code>. They are more suitable for automated testing, and
-        are not covered here yet.
+        are not covered here.
       </para>        
     </section>
+
+    <section id="bbv2.builtins.raw">
+
+      <title>Raw commands: 'make' and 'notfile'</title>
+
+      <para>Sometimes, the builtin target types are not enough, and you
+      want Boost.Build to just run specific commands. There are two main
+      target rules that make it possible: <functionname>make</functionname>
+      and <functionname>notfile</functionname>.
+      </para>
+
+      <para>The <functionname>make</functionname> rule is used when you want to
+      create one file from a number of sources using some specific command.
+      The <functionname>notfile</functionname> is used to unconditionally run
+      a command. 
+      </para>
+
+      <para>
+        Suppose you want to create file <filename>file.out</filename> from
+        file <filename>file.in</filename> by running command 
+        <command>in2out</command>. Here's how you'd do this in Boost.Build:
+<programlisting>
+actions in2out
+{
+    in2out $(&lt;) $(&gt;)
+}
+make file.out : file.in : @in2out ;
+</programlisting>
+        If you run <command>bjam</command> and <filename>file.out</filename> 
+        does not exist, Boost.Build will run the <command>in2out</command>
+        command to create that file. For more details on specifying actions,
+        see <xref linkend="bbv2.advanced.jam_language.actions"/>.
+      </para>
+
+      <note>
+        <para>
+          The <functionname>make</functionname> rule is useful to express custom
+          transformation that are used just once or twice in your project. For
+          transformations that are used often, you are advised to declare
+          new generator, as described in <xref linkend="bbv2.extending.tools"/>.
+        </para>
+      </note>
+
+      <para>
+        It could be that you just want to run some command unconditionally,
+        and that command does not create any specific files. The, you can use
+        the <functionname>notfile</functionname> rule. For example:
+<programlisting>
+notfile echo_something : @echo ;
+actions echo
+{
+    echo "something"
+}
+</programlisting>
+        The only difference from the <functionname>make</functionname> rule is
+        that the name of the target is not considered a name of a file, so
+        Boost.Build will unconditionally run the action.
+      </para>
+            
+    </section>
     
   </section>
   
@@ -1190,37 +1724,41 @@
       <varlistentry><term><literal>variant</literal></term>
         
         <listitem>
-          <simpara>
-            The feature which combines several low-level features in
-            order to make building most common variants simple.
-          </simpara>
+          <para>
+            A feature that combines several low-level features, making
+            it easy to request common build configurations.
+          </para>
           
           <para><emphasis role="bold">Allowed values:</emphasis> <literal>debug</literal>, <literal>release</literal>,
-            <literal>profile</literal></para>
+            <literal>profile</literal>.</para>
           
           <para>The value <literal>debug</literal> expands to</para>
           
-          <programlisting>
-            &lt;optimization&gt;off &lt;debug-symbols&gt;on &lt;inlining&gt;off &lt;runtime-debugging&gt;on
-          </programlisting>
+<programlisting>
+&lt;optimization&gt;off &lt;debug-symbols&gt;on &lt;inlining&gt;off &lt;runtime-debugging&gt;on
+</programlisting>
           
           <para>The value <literal>release</literal> expands to</para>
           
-          <programlisting>
-            &lt;optimization&gt;speed &lt;debug-symbols&gt;off &lt;inlining&gt;full &lt;runtime-debugging&gt;off
-          </programlisting>
+<programlisting>
+&lt;optimization&gt;speed &lt;debug-symbols&gt;off &lt;inlining&gt;full &lt;runtime-debugging&gt;off
+</programlisting>
           
           <para>The value <literal>profile</literal> expands to the same as
-            <literal>release</literal>, plus:</para>
+          <literal>release</literal>, plus:</para>
           
-          <programlisting>
-            &lt;profiling&gt;on &lt;debug-symbols&gt;on
-          </programlisting>
+<programlisting>
+&lt;profiling&gt;on &lt;debug-symbols&gt;on
+</programlisting>
+
+          <para>User can define his own build variants using the <code>variant</code> rule from the <code>common</code>
+          module.</para>
           
-          <para><emphasis role="bold">Rationale:</emphasis> Runtime debugging is on in debug build
-            to suit expectations of people used various IDEs. It's
-            assumed other folks don't have any specific expectation in
-            this point.</para>
+          <para><emphasis role="bold">Notee:</emphasis> Runtime
+          debugging is on in debug builds to suit the expectations of
+          people used to various IDEs. 
+          <!-- Define "runtime debugging." Why will those people expect it to be on in debug builds? -->
+          </para>
         </listitem></varlistentry>
       
       <varlistentry id="bbv2.advanced.builtins.features.link">
@@ -1228,7 +1766,7 @@
         
         <listitem>
           <simpara>
-            Feature which controls how libraries are built.
+            A feature that controls how libraries are built.
           </simpara>
           
           <para><emphasis role="bold">Allowed values:</emphasis> <literal>shared</literal>,
@@ -1239,11 +1777,13 @@
         
         <listitem>
           <simpara>
-            Tthe &lt;source&gt;X feature has the same effect on building a target
-            as putting X in the list of sources. The feature
-            is sometimes more convenient: you can put &lt;source&gt;X in
-            the requirements for a project and it will be linked to all
-            executables.
+            The <code>&lt;source&gt;X</code> feature has the same effect on 
+            building a target as putting X in the list of sources. 
+            It's useful when you want to add
+            the same source to all targets in the project 
+            (you can put &lt;source&gt; in requirements) or to conditionally
+            include a source (using conditional requirements, see <xref linkend="bbv2.tutorial.conditions"/>)
+            See also the <code>&lt;library&gt;</code> feature.
           </simpara>
         </listitem>
       </varlistentry>
@@ -1252,35 +1792,74 @@
         
         <listitem>
           <simpara>
-            This feature is equivalent to the &lt;source&gt; feature, and exists
-            for backward compatibility reasons.
+            This feature is almost equivalent to the <code>&lt;source&gt;</code> feature, 
+            except that it takes effect only for linking. When you want to 
+            link all targets in a Jamfile to certain library, the 
+            <code>&lt;library&gt;</code> feature is preferred over 
+            <code>&lt;source&gt;X</code> -- the latter will add the library to
+            all targets, even those that have nothing to do with libraries.
           </simpara>
         </listitem>
       </varlistentry>
-      
-      
-      <varlistentry><term><literal>use</literal></term>
+
+      <varlistentry><term><anchor id="bbv2.builtin.features.dependency"/>
+          <literal>dependency</literal></term>
         
         <listitem>
           <simpara>
-            Causes the target referenced by the value of this feature
-            to be constructed and adds it's usage requirements to build
-            properties. The constructed targets are not used in any other
-            way. The primary use case is when you use some library and want
-            it's usage requirements (such as include paths) to be applied,
-            but don't want to link to the library.
+            Introduces a dependency on the target named by the
+            value of this feature (so it will be brought
+            up-to-date whenever the target being declared is).
+            The dependency is not used in any other way. For example, in
+            application with plugins, the plugins are not used when linking
+            the application, 
+            application might have dependency on its plugins, even though 
+
+
+            , and
+            adds its usage requirements to the build properties 
+            of the target being declared.  
+
+ The primary use case is when you want
+            the usage requirements (such as <code>#include</code> paths) of some
+            library to be applied, but don't want to link to it.
+            <!-- It's hard to picture why anyone would want to do
+                 that.  Please flesh out this motivation -->
           </simpara>
         </listitem>
       </varlistentry>
+
+            
+      <varlistentry><term><anchor id="bbv2.builtin.features.use"/>
+          <literal>use</literal></term>
+        
+        <listitem>
+          <simpara>
+            Introduces a dependency on the target named by the
+            value of this feature (so it will be brought
+            up-to-date whenever the target being declared is), and
+            adds its usage requirements to the build properties 
+            <!-- Do you really mean "to the requirements?" -->
+            of the target being declared.  The dependency is not used
+            in any other way. The primary use case is when you want
+            the usage requirements (such as <code>#include</code> paths) of some
+            library to be applied, but don't want to link to it.
+            <!-- It's hard to picture why anyone would want to do
+                 that.  Please flesh out this motivation -->
+          </simpara>
+        </listitem>
+      </varlistentry>
       
-      <varlistentry><term><literal>dll-path</literal></term>
+      <varlistentry><term><anchor id="bbv2.builtin.features.dll-path"/>
+      <literal>dll-path</literal></term>
         
         <listitem>
           <simpara>
-            Specify an additional path where shared libraries should be
-            searched where the executable or shared library is run. This
-            feature only affect Unix compilers. Plase see the <link
-            linkend="bbv2.faq.dll-path">FAQ entry</link> for details.
+            Specify an additional directory where the system should
+            look for shared libraries when the executable or shared
+            library is run. This feature only affects Unix
+            compilers. Plase see <xref linkend="bbv2.faq.dll-path"/>
+            in <xref linkend="bbv2.faq"/> for details.
           </simpara>
         </listitem></varlistentry>
       
@@ -1293,21 +1872,89 @@
           
           <para><emphasis role="bold">Allowed values:</emphasis>
             <literal>true</literal>, <literal>false</literal>.  This property
-            is specific to Unix systems. If an executable is build with
+            is specific to Unix systems. If an executable is built with
             <code>&lt;hardcode-dll-paths&gt;true</code>, the generated binary
             will contain the list of all the paths to the used shared
             libraries. As the result, the executable can be run without
-            changing system paths to shared libraries, or installing the
-            libraries to system paths. This is very convenient during
+            changing system paths to shared libraries or installing the
+            libraries to system paths. This 
+            <!-- you need an antecedent.  This _what_? -->
+            is very convenient during
             development. Plase see the <link
             linkend="bbv2.faq.dll-path">FAQ entry</link> for details.
+            Note that on Mac OSX, the paths are unconditionally hardcoded by
+            the linker, and it's not possible to disable that behaviour.
           </para>
         </listitem></varlistentry>
+
+      <varlistentry>
+        <term><literal>cflags</literal></term>
+        <term><literal>cxxflags</literal></term>
+        <term><literal>linkflags</literal></term>
+        
+        <listitem>
+          <simpara>
+            The value of those features is passed without modification to the
+            corresponding tools. For <code>cflags</code> that's both the C and C++
+            compilers, for <code>cxxflags</code> that's the C++ compiler and for
+            <code>linkflags</code> that's the linker. The features are handy when
+            you're trying to do something special that cannot be achieved by
+            higher-level feature in Boost.Build.
+          </simpara>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry><term><literal>warnings</literal></term>
+        
+        <listitem>
+          <simpara>
+            The <code>&lt;warnings&gt;</code> feature controls the warning level of compilers. It has the following values:
+            <itemizedlist>
+              <listitem><para><code>off</code> - disables all warnings.</para></listitem>
+              <listitem><para><code>on</code> - enables default warning level for the tool.</para></listitem>
+              <listitem><para><code>all</code> - enables all warnings.</para></listitem>
+            </itemizedlist>
+            Default value is <code>all</code>.
+          </simpara>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry><term><literal>warnings-as-errors</literal></term>
+        
+        <listitem>
+          <simpara>
+            The <code>&lt;warnings-as-errors&gt;</code> makes it possible to treat warnings as errors and abort
+            compilation on a warning. The value <code>on</code> enables this behaviour. The default value is
+            <code>off</code>.
+          </simpara>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry><term><literal>build</literal></term>
+        
+        <listitem>
+          <para><emphasis role="bold">Allowed values:</emphasis> <literal>no</literal></para>
+
+          <para>
+            The <code>build</code> feature is used to conditionally disable build of a target. If <code>&lt;build&gt;no</code>
+            is in properties when building a target, build of that target is skipped. Combined with conditional requirements this
+            allows to skip building some target in configurations where the build is known to fail. 
+          </para>
+        </listitem>
+      </varlistentry>
+
+
+
+
+
     </variablelist>
   </section>
 
   <section id="bbv2.advanced.differences_to_v1">
     <title>Differences to Boost.Build V1</title>
+    <!-- "Differences to" is the British English usage.  American
+         English is "differences from."  You can use the former but be
+         sure you know what you're doing -->
 
     <para>While Boost.Build V2 is based on the same ideas as Boost.Build V1,
     some of the syntax was changed, and some new important features were
@@ -1316,14 +1963,13 @@
     <section id="bbv2.advanced.differences_to_v1.configuration">
       <title>Configuration</title>
       
-      <para>In V1, there were two methods to configure a toolset. One is to
-      set some environment variable, or use "-s" command line option to set
-      variable inside BJam. Another method was creating new toolset module,
-      which would set the variables and then invoke basic toolset. Neither
-      method is necessary now, the "using" rule provides a consistent way to
-      initialize toolset, including several versions. See <link
-      linkend="bbv2.advanced.configuration">section on configuraton</link> for
-      details.
+      <para>In V1, toolsets were configured by environment variables. If you
+      wanted to use two versions of the same toolset, you had to create a new
+      toolset module that would set the variables and then invoke the base
+      toolset. In V2, toolsets are configured by the
+      <functionname>using</functionname>, and you can easily configure several
+      versions of a toolset. See <xref
+      linkend="bbv2.advanced.configuration"/> for details.
       </para>
       
     </section>
@@ -1332,25 +1978,29 @@
       <title>Writing Jamfiles</title>
 
       <para>Probably one of the most important differences in V2 Jamfiles is
-      the project requirements. In V1, if several targets have the same
-      requirements (for example, common include path), it was necessary to
-      manually write that requirements, or use a helper rule. In V2, the
-      common properties can be specified with the "requirements" project
-      attribute, as documented <link linkend="bbv2.advanced.projects">here</link>.
+      the use of project requirements. In V1, if several targets had the same
+      requirements (for example, a common <code>#include</code> path), it was necessary to
+      manually write the requirements or use a helper rule or template target. In V2, the
+      common properties can be specified with the <code>requirements</code> project
+      attribute, as documented in <xref linkend="bbv2.advanced.projects"/>.
       </para>
 
-      <para>The <link linkend="bbv2.tutorial.libs">usage requirements</link>
-      is also important mechanism to simplify Jamfile. If a library requires
-      all clients to use specific includes, or macros when compiling the
-      code which depends on the library, this information can be cleanly
+      <para><link linkend="bbv2.tutorial.libs">Usage requirements</link>
+      also help to simplify Jamfiles. 
+      <!-- Simplify, simplify, simplify!  You could go through the
+           entire document several times and make changes like that
+           one -->
+      If a library requires
+      all clients to use specific <code>#include</code> paths or macros when compiling 
+      code that depends on the library, that information can be cleanly
       represented.</para>
 
-      <para>The difference between "lib" and "dll" targets in V1 is completely
-      eliminated in V2. There's only one target -- "lib", which can create
-      either static or shared library depending on the value of the 
-        <link linkend="bbv2.advanced.builtins.features.link">&lt;link&gt;
-      feature</link>. If your target should be only build in one variant, you
-      can add &lt;link&gt;shared or &lt;link&gt;static to requirements.
+      <para>The difference between <code>lib</code> and <code>dll</code> targets in V1 is completely
+      eliminated in V2. There's only one library target type, <code>lib</code>, which can create
+      either static or shared libraries depending on the value of the 
+        <link linkend="bbv2.advanced.builtins.features.link"><varname>&lt;link&gt;</varname>
+      feature</link>. If your target should be only built in one way<!--"variant" has a different meaning here-->, you
+      can add <code>&lt;link&gt;shared</code> or <code>&lt;link&gt;static</code> to its requirements.
       </para>
 
       <para>The syntax for referring to other targets was changed a bit. While
@@ -1363,9 +2013,9 @@
 exe a : a.cpp ../foo//bar ;
 </programlisting>
         Note that you don't need to specify the type of other target, but the
-        last element should be separated to double slash, to indicate that
-        you're referring to target "bar" in project "../foo", and not to
-        project "../foo/bar".
+        last element should be separated from the others by a double slash to indicate that
+        you're referring to target <filename>bar</filename> in project <filename>../foo</filename>, and not to
+        project <filename>../foo/bar</filename>.
         </para>
       
                   
@@ -1382,11 +2032,11 @@
 <programlisting>
 bjam toolset=msvc variant=release some_target
 </programlisting>
-        or, using shortcuts, just:
+        or, using implicit features, just:
 <programlisting>
 bjam msvc release some_target
 </programlisting>
-      See <link linkend="bbv2.reference.commandline">the reference</link> for
+      See <link linkend="bbv2.reference.commandline">the reference</link> for a
       complete description of the syntax.
       </para>
 
@@ -1395,12 +2045,11 @@
 
   </section>
     
-
   </chapter>
 
 <!--
      Local Variables:
-     mode: xml
+     mode: nxml
      sgml-indent-data: t     
      sgml-parent-document: ("userman.xml" "chapter")
      sgml-set-face: t

Modified: boost-build/branches/upstream/current/doc/src/architecture.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/architecture.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/architecture.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -28,100 +28,172 @@
   <section id="bbv2.arch.build">
     <title>The build layer</title>
 
-    <para>The build layer has just four main parts -- abstract targets,
-      virtual targets, generators and properties. The abstract targets,
-      represented by the "abstract-target" class, correspond to main targets
-      -- which, as you recall, can produce different files depending on
-      properties. Virtual targets, represented by the 'virtual-target' class
-      correspond to real files. The abstract-target class has a method
-      'generate', which is given a set of properties and produces virtual
-      targets for those properties.       
-    </para>
+      <para>The build layer has just four main parts -- metatargets (abstract targets),
+        virtual targets, generators and properties. 
+        <itemizedlist>
+          <listitem><para>Metatargets (see the "targets.jam" module) represent
+              all the user-defined entities which can be built. The "meta" prefix
+              signify that they don't really corrspond to files -- depending of
+              build request, they can produce different set of
+              files. Metatargets are created when Jamfiles are loaded. Each
+              metagarget has a <code>generate</code> method which is given a
+              property set and produces virtual targets for the passed properties.
+            </para></listitem>
+          <listitem><para>Virtual targets (see the "virtual-targets.jam"
+              module) correspond to the atomic things which can be updated --
+              most typically files. 
+            </para></listitem>
+          <listitem><para>Properties are just (name, value) pairs, specified
+              by the user and describing how the targets should be
+              built. Properties are stored using the <code>property-set</code> class.
+              </para></listitem>
+          <listitem><para>Generators are the objects which encapsulate tools
+              -- they can take a list of source virtual targets and produce new
+              virtual targets from them.
+            </para></listitem>
+        </itemizedlist>
+      </para>
 
-    <para>There are several classes derived from "abstract-target". The
-      "main-target" class represents top-level main target, the "project-target"
-      acts like container for all main targets, and "basic-target" class is a
-      base class for all further target types.
-    </para>
+      <para>The build process includes those steps:
+        <orderedlist>
+          <listitem><para>Top-level code calls the <code>generate</code>
+              method of a metatarget with some properties.  </para></listitem>
 
-    <para>Since each main target can have several alternatives, all top-level
-      target objects are just containers, referring to "real" main target
-      classes. The type is that container is "main-target". For example, given:
+
+          <listitem><para>The metatarget combines the requested properties
+              with requirements and passes the result, together with the list
+              of sources, to the <code>generators.construct</code>
+              function</para></listitem> 
+
+          
+          <listitem><para>A generator appropriate for the build properties is
+              selected and its <code>run</code> method is
+              called. The method returns a list of virtual targets
+            </para></listitem>
+
+          <listitem><para>The targets are returned to the top level code. They
+              are converted into bjam targets (via
+              <code>virtual-target.actualize</code>) and passed to bjam for building.
+            </para></listitem>
+        </orderedlist>
+      </para>
+
+      <section id="bbv2.arch.metatargets">
+        <title>Metatargets</title>
+
+        <para>There are several classes derived from "abstract-target". The
+          "main-target" class represents top-level main target, the "project-target"
+          acts like container for all main targets, and "basic-target" class is a
+          base class for all further target types.
+        </para>
+        
+        <para>Since each main target can have several alternatives, all top-level
+          target objects are just containers, referring to "real" main target
+          classes. The type is that container is "main-target". For example, given:
 <programlisting>
 alias a ;
 lib a : a.cpp : &lt;toolset&gt;gcc ;
 </programlisting>
-      we would have one-top level instance of "main-target-class", which will
-      contain one instance of "alias-target-class" and one instance of
-      "lib-target-class". The "generate" method of "main-target" decides
-      which of the alternative should be used, and call "generate" on the
-      corresponding instance.
-</para>
+          we would have one-top level instance of "main-target-class", which will
+          contain one instance of "alias-target-class" and one instance of
+          "lib-target-class". The "generate" method of "main-target" decides
+          which of the alternative should be used, and call "generate" on the
+          corresponding instance.
+        </para>
 
-    <para>Each alternative is a instance of a class derived from
-    "basic-target". The "basic-target.generate" does several things that are
-    always should be done:
-      <itemizedlist>
-        <listitem>
-          <para>Determines what properties should be used for building the
-          target. This includes looking at requested properties, requirements,
-          and usage requirements of all sources.</para>
-        </listitem>
-        <listitem>
-          <para>Builds all sources</para>
-        </listitem>
-        <listitem>
-          <para>Computes the usage requirements which should be passes back.</para>
-        </listitem>
-      </itemizedlist>
-      For the real work of constructing virtual target, a new method
-      "construct" is called.
-    </para>
+        <para>Each alternative is a instance of a class derived from
+          "basic-target". The "basic-target.generate" does several things that are
+          always should be done:
+          <itemizedlist>
+            <listitem>
+              <para>Determines what properties should be used for building the
+                target. This includes looking at requested properties, requirements,
+                and usage requirements of all sources.</para>
+            </listitem>
+            <listitem>
+              <para>Builds all sources</para>
+            </listitem>
+            <listitem>
+              <para>Computes the usage requirements which should be passes back.</para>
+            </listitem>
+          </itemizedlist>
+          For the real work of constructing virtual target, a new method
+          "construct" is called.
+        </para>
 
-    <para>The "construct" method can be implemented in any way by classes
-      derived from "basic-target", but one specific derived class plays the
-      central role -- "typed-target". That class holds the desired type of file
-      to be produces, and calls the generators modules to do the job.
-    </para>
+        <para>The "construct" method can be implemented in any way by classes
+          derived from "basic-target", but one specific derived class plays the
+          central role -- "typed-target". That class holds the desired type of file
+          to be produces, and calls the generators modules to do the job.
+        </para>
 
-    <para>Generators are Boost.Build abstractions for a tool. For example, one
-      can register a generator which converts target of type CPP into target of
-      type OBJ. When run with on a virtual target with CPP type, the generator
-      will construct the virtual target of type OBJ. The "generators" module
-      implements an algorithm, which given a list of sources, the desired type
-      and a list of properties, find all the generators which can perform the conversion.
-    </para>
+        <para>This means that a specific metatarget subclass may avoid using
+          generators at all. However, this is deprecated and we're trying to
+          eliminate all such subsclasses at the moment.
+        </para>
 
-    <para>The virtual targets which are produces by the main targets form a
-      graph. Targets which are produces from other ones refer to an instance of
-      "action" class, which in turn refers to action's sources, which can
-      further refer to actions. The sources, which are not produces from
-      anything, don't refer to any actions.
-    </para>
+        <para>Note that the <filename>build/targets.jam</filename> file contains
+            an UML diagram which might help.</para>
 
-    <para>When all virtual targets are produced, they are "actualized". This
-    means that the real file names are computed, and the commands that should
-    be run are generated. This is done by "virtual-target.actualize" and
-    "action.actualize" methods. The first is conceptually simple, while the
-    second need additional explanation. The commands in bjam are generated in
-    two-stage process. First, a rule with the appropriate name (for example
-    "gcc.compile") is called and is given the names of targets. The rule sets
-    some variables, like "OPTIONS". After that, the command string is taken,
-    and variable are substitutes, so use of OPTIONS inside the command string
-    become the real compile options. 
-    </para>
+      </section>
 
-    <para>Boost.Build added a third stage to simplify things. It's now
-    possible to automatically convert properties to appropriate assignments to
-    variables. For example, &lt;debug-symbols&gt;on would add "-g" to the
-    OPTIONS variable, without requiring to manually add this logic to
-    gcc.compile. This functionality is part of the "toolset" module.
-    </para>
-    
-    <para>When target paths are computed and the commands are set, Boost.Build
-    just gives control to bjam, which controls the execution of
-    commands.</para>
+      <section id="bbv2.arch.virtual">
+        <title>Virtual targets</title>
+
+        <para>Virtual targets correspond to the atomic things which can be
+          updated. Each virtual target can be assigned an updating action --
+          instance of the <code>action</code> class. The action class, in
+          turn, contains a list of source targets, properties, and a name of
+          bjam action block which should be executed.
+        </para>
+
+        <para>We try hard to never create equal instances of the
+          <code>virtual-target</code> class. Each code which creates virtual
+          targets passes them though the <code>virtual-target.register</code>
+          function, which detects if a target with the same name, sources, and
+          properties was created. In that case, existing target is returned.
+        </para>
         
+        <para>When all virtual targets are produced, they are
+          "actualized". This means that the real file names are computed, and
+          the commands that should be run are generated. This is done by the
+          <code>virtual-target.actualize</code> method and the
+          <code>action.actualize</code> methods. The first is conceptually
+          simple, while the second need additional explanation. The commands
+          in bjam are generated in two-stage process. First, a rule with the
+          appropriate name (for example
+          "gcc.compile") is called and is given the names of targets. The rule
+          sets some variables, like "OPTIONS". After that, the command string
+          is taken, and variable are substitutes, so use of OPTIONS inside the
+          command string become the real compile options.
+        </para>
+
+        <para>Boost.Build added a third stage to simplify things. It's now
+          possible to automatically convert properties to appropriate assignments to
+          variables. For example, &lt;debug-symbols&gt;on would add "-g" to the
+          OPTIONS variable, without requiring to manually add this logic to
+          gcc.compile. This functionality is part of the "toolset" module.
+        </para>
+
+        <para>Note that the <filename>build/virtual-targets.jam</filename> file
+            contains an UML diagram which might help.</para>
+      </section>
+
+      <section id="bbv2.arch.properties">
+        <para>Above, we noted that metatargets are built with a set of
+          properties. That set is represented with the
+          <code>property-set</code> class. An important point is that handling
+          of property sets can get very expensive. For that reason, we make
+          sure that for each set of (name, value) pairs only one
+          <code>property-set</code> instance is created. The
+          <code>property-set</code> uses extensive caching for all operation,
+          so most work is avoided. The <code>property-set.create</code> is the 
+          factory function which should be used to create instances of the
+          <code>property-set</code> class.
+        </para>
+      </section>
+      
+        
   </section>
 
   <section id="bbv2.arch.tools">

Modified: boost-build/branches/upstream/current/doc/src/extending.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/extending.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/extending.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -9,10 +9,10 @@
       <title>Introduction</title>
 
   <para>This document explains how to extend Boost.Build to accomodate
-  your local requirements. Let's start with quite simple, but
+  your local requirements. Let's start with a simple but
   realistic example.</para>
 
-  <para>Say you're writing an application which generates C++ code. If
+  <para>Say you're writing an application that generates C++ code. If
   you ever did this, you know that it's not nice. Embedding large
   portions of C++ code in string literals is very awkward. A much
   better solution is:</para>
@@ -21,7 +21,7 @@
     <listitem>
       <simpara>
         Write the template of the code to be generated, leaving
-    placeholders at the points which will change
+    placeholders at the points that will change
       </simpara>
     </listitem>
 
@@ -37,45 +37,50 @@
     </listitem>
   </orderedlist>
 
-  <para>It's quite easy to achieve. You write special verbatim files,
-  which are just C++, except that the very first line of the file
-  gives a name of variable that should be generated. A simple tool
-  is created which takes verbatim file and creates a cpp file with
-  a single char* variable, which name is taken from the first line
-  of verbatim file, and which value is properly quoted content of
-  the verbatim file.</para>
+  <para>It's quite easy to achieve. You write special verbatim files
+  that are just C++, except that the very first line of the file
+  contains the name of a variable that should be generated. A simple tool
+  is created that takes a verbatim file and creates a cpp file with
+  a single <code>char*</code> variable whose name is taken from the first line
+  of the verbatim file and whose value is the file's properly quoted content.</para>
 
   <para>Let's see what Boost.Build can do.</para>
 
   <para>First off, Boost.Build has no idea about "verbatim files". So,
-  you must register a new type. The following code does it:</para>
+  you must register a new target type. The following code does
+  it:</para>
 
 <programlisting>
 import type ;
-type.register VERBATIM : verbatim ;
+type.register VERBATIM : vrb ;
 </programlisting>
 
-  <para>The first parameter to 'type.register' gives the name of
-  declared type. By convention, it's uppercase. The second
-  parameter is suffix for this type. So, if Boost.Build sees
-  "code.verbatim" in the list of sources, it knows that it's of
-  type <literal>VERBATIM</literal>.</para>
+<!-- changed "verbatim" to "vrb."  Too many similar things
+     (verbatim/VERBATIM) makes for easy confusion -->
 
-  <para>Lastly, you need a tool to convert verbatim files to C++. Say
-  you've sketched such a tool in Python. Then, you have to inform
-  Boost.Build about the tool. The Boost.Build concept which
-  represents a tool is <emphasis>generator</emphasis>.</para>
+  <para>The first parameter to
+  <functionname>type.register</functionname> gives the name of the
+  declared type. By convention, it's uppercase. The second parameter
+  is the suffix for files of this type. So, if Boost.Build sees
+  <filename>code.vrb</filename> in a list of sources, it knows that it's of type
+  <code>VERBATIM</code>.</para>
 
-  <para>First, you say that generator 'inline-file' is able to convert
-  VERBATIM type into C++:</para>
+  <para>Next, you tell Boost.Build that the verbatim files can be
+  transformed into C++ files in one build step.  A
+  <firstterm>generator</firstterm> is a template for a build step that
+  transforms targets of one type (or set of types) into another.  Our
+  generator will be called <code>verbatim.inline-file</code>; it
+  transforms <code>VERBATIM</code> files into <code>CPP</code> files:
 
 <programlisting>
 import generators ;
 generators.register-standard verbatim.inline-file : VERBATIM : CPP ;
 </programlisting>
+  </para>
 
-  <para>Second, you must specify the commands to be run to actually
-  perform convertion:</para>
+  <para>Lastly, you have to inform Boost.Build about the shell
+  commands used to make that transformation.  That's done with an
+  <code>actions</code> declaration.
 
 <programlisting>
 actions inline-file
@@ -83,14 +88,21 @@
     "./inline-file.py" $(&lt;) $(&gt;)
 }
 </programlisting>
+
+<!-- You need to explain all the parameters to an "actions" and
+     describe the accompanying rule declaration: the user has no clue
+     what $(<) and $(>) are, and doesn't know about the third
+     parameter that gets passed to the rule. -->
+
 <!-- We use verbatim.inline-file in one place and just inline-file in
              another. Is this confusing for user?
         -->
+</para>
 
   <para>Now, we're ready to tie it all together. Put all the code
-  above in file "verbatim.jam", add "import verbatim ;" to
-  "project-root.jam", and it's possible to write the following in
-  Jamfile:</para>
+  above in file <filename>verbatim.jam</filename>, add <code>import verbatim ;</code> 
+  to <filename>project-root.jam</filename>, and it's possible to write
+  the following in Jamfile:</para>
 
 <programlisting>
 exe codegen : codegen.cpp class_template.verbatim usage.verbatim ;
@@ -102,8 +114,7 @@
   </para>
 
       <para>In the subsequent sections, we will extend this example, and review
-        all the mechanisms in detail. The complete code is available in <ulink url=
-          "../../example/customization">example/customization</ulink>
+        all the mechanisms in detail. The complete code is available in <filename>example/customization</filename>
         directory.
       </para>
 
@@ -128,18 +139,40 @@
         are the name of new type and the list of extensions associated with
         it. A file with an extension from the list will have the given target
         type. In the case where a target of the declared type is generated
-        from other sources, the first specified extension will be used. This
-        behaviour can be changed using the
-        <code>type.set-generated-target-suffix</code> rule.
+        from other sources, the first specified extension will be used. 
       </para>
 
-      <para>
-        Something about 'main' types.
-      </para>
+    <para>Sometimes you want to change the suffix used for generated targets
+      depending on build properties, such as toolset. For example, some compiler
+      uses extension <literal>elf</literal> for executable files. You can use the
+      <code>type.set-generated-target-suffix</code> rule:
+<programlisting>
+type.set-generated-target-suffix EXE : &lt;toolset&gt;elf : elf ;
+</programlisting>
+    </para>
 
-      <para>Something about base types.
-      </para>
+    <para>A new target type can be inherited from an existing one. 
+<programlisting>
+type.register PLUGIN : : SHARED_LIB ;
+</programlisting>
+      The above code defines a new type derived from
+      <code>SHARED_LIB</code>. Initially, the new type inherits all the
+      properties of the base type - in particular generators and suffix.
+      Typically, you'll change the new type in some way. For example, using
+      <code>type.set-generated-target-suffix</code> you can set the suffix for
+      the new type. Or you can write special a generator for the new type. For
+      example, it can generate additional metainformation for the plugin.
+      In either way, the <code>PLUGIN</code> type can be used whenever
+      <code>SHARED_LIB</code> can. For example, you can directly link plugins
+      to an application.
+    </para>
 
+    <para>A type can be defined as "main", in which case Boost.Build will
+      automatically declare a main target rule for building targets of that
+      type. More details can be found <link
+      linkend="bbv2.extending.rules.main-type">later</link>.
+    </para>
+
       <section id="bbv2.extending.scanners">
         <title>Scanners</title>
         <para>
@@ -159,11 +192,15 @@
     }
 }
 </programlisting>         
-          All the complex logic is in the <code>common-scanner</code> class,
-          and you only need to override the method which returns the regular
-          expression to be used for scanning. The paranthethis in the regular
-          expression indicate which part of the string is the name of the
-          included file. 
+          All the complex logic is in the <code>common-scanner</code>
+          class, and you only need to override the method that returns
+          the regular expression to be used for scanning. The
+          parentheses in the regular expression indicate which part
+          of the string is the name of the included file.  Only the
+          first parenthesized group in the regular expression will be
+          recognized; if you can't express everything you want that
+          way, you can return multiple regular expressions, each of
+          which contains a parenthesized group to be matched.
         </para>
 
         <para>After that, we need to register our scanner class:
@@ -171,11 +208,11 @@
 scanner.register verbatim-scanner : include ;
 </programlisting>
             The value of the second parameter, in this case
-            <code>include</code>, specifies which properties contain the list
-            of paths which should be searched for the included files.
+            <code>include</code>, specifies the properties that contain the list
+            of paths that should be searched for the included files.
          </para>
 
-        <para>Finally, we assign the new scaner to the <code>VERBATIM</code>
+        <para>Finally, we assign the new scanner to the <code>VERBATIM</code>
         target type:
 <programlisting>
 type.set-scanner VERBATIM : verbatim-scanner ;
@@ -185,7 +222,6 @@
 
       </section>
 
-
   </section>
   
   <section id="bbv2.extending.tools">
@@ -196,10 +232,10 @@
       </para>
 
       <para>For each additional tool, a Boost.Build object called generator
-        must be created. That object has specific types of targets which it
-        accepts an produces. Using that information, Boost.Build is able
+        must be created. That object has specific types of targets that it
+        accepts and produces. Using that information, Boost.Build is able
         to automatically invoke the generator. For example, if you declare a
-        generator which takes a target of the type <literal>D</literal> and
+        generator that takes a target of the type <literal>D</literal> and
         produces a target of the type <literal>OBJ</literal>, when placing a
         file with extention <literal>.d</literal> in a list of sources will
         cause Boost.Build to invoke your generator, and then to link the
@@ -213,6 +249,9 @@
         create a derived class, but simply create an instance of the
         <code>generator</code> class. Let's review the example we've seen in the
         <link linkend="bbv2.extender.intro">introduction</link>.
+        <!-- Is the following supposed to be verbatim.jam?  Tell the
+             user so.  You also need to describe the meanings of $(<)
+             and $(>); this is the first time they're encountered. -->
 <programlisting>
 import generators ;
 generators.register-standard verbatim.inline-file : VERBATIM : CPP ;
@@ -225,13 +264,13 @@
 
       <para>We declare a standard generator, specifying its id, the source type
         and the target type. When invoked, the generator will create a target
-        of type <literal>CPP</literal> which will have the source target of
+        of type <literal>CPP</literal> with a source target of
         type <literal>VERBATIM</literal> as the only source. But what command
         will be used to actually generate the file? In bjam, actions are
         specified using named "actions" blocks and the name of the action
         block should be specified when creating targets. By convention,
         generators use the same name of the action block as their own id. So,
-        in above example, the "inline-file" actions block will be use to
+        in above example, the "inline-file" actions block will be used to
         convert the source into the target.
       </para>
 
@@ -245,7 +284,7 @@
 generators.register-standard verbatim.inline-file : VERBATIM : CPP ;
 generators.register-composing mex.mex : CPP LIB : MEX ;
 </programlisting>
-        The first generators takes a <emphasis>single</emphasis> source of type
+        Standard generators take a <emphasis>single</emphasis> source of type
         <code>VERBATIM</code> and produces a result. The second generator
         takes any number of sources, which can have either the
         <code>CPP</code> or the <code>LIB</code> type. Composing generators
@@ -254,7 +293,7 @@
         is a composing generator corresponding to the proper linker.
       </para>
 
-      <para>You should also know about two specific function for registering
+      <para>You should also know about two specific functions for registering
         generators: <code>generators.register-c-compiler</code> and
         <code>generators.register-linker</code>. The first sets up header
         dependecy scanning for C files, and the seconds handles various
@@ -263,11 +302,12 @@
       </para>
 
       <para>(Need a note about UNIX)</para>
-
+      <!-- What kind of note?  Either write the note or don't, but remove this dross. -->
       <bridgehead>Custom generator classes</bridgehead>
 
       <para>The standard generators allows you to specify source and target
-        types, action, and a set of flags. If you need anything more complex,
+        types, an action, and a set of flags. If you need anything more complex,
+        <!-- What sort of flags?  Command-line flags?  What does the system do with them? -->
         you need to create a new generator class with your own logic. Then,
         you have to create an instance of that class and register it. Here's
         an example how you can create your own generator class:
@@ -278,6 +318,7 @@
     {
         generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
     }
+<!-- What is the point of this __init__ function?? -->
 }
 
 generators.register 
@@ -289,32 +330,34 @@
         <code>generator</code> class.
       </para>
 
-      <para>There are two methods of interest. The <code>run</code> methods is
-        responsible for overall process - it takes a number of source targets,
-        converts them the the right types, and creates the result. The
+      <para>There are two methods of interest. The <code>run</code> method is
+        responsible for the overall process - it takes a number of source targets,
+        converts them to the right types, and creates the result. The
         <code>generated-targets</code> method is called when all sources are
         converted to the right types to actually create the result.
       </para>
 
-      <para>The <code>generated-target</code> method can be overridden when you
-        want to add additional properties to the generated targets or use
-        additional sources. For example (which is real), you have a tool for
-        analysing programs, which should be given a name of executable and the
-        list of all sources. Naturally, you don't want to list all source
-        files manually. Here's how the <code>generated-target</code> method
-        can find the list of sources automatically:
+      <para>The <code>generated-target</code> <!-- Is it generated-target or generated-targets? -->
+      method can be overridden
+      when you want to add additional properties to the generated
+      targets or use additional sources. For a real-life example,
+      suppose you have a program analysis tool that should be given a
+      name of executable and the list of all sources. Naturally, you
+      don't want to list all source files manually. Here's how the
+      <code>generated-targets</code> method can find the list of
+      sources automatically:
 <programlisting>
 class itrace-generator : generator {
 ....
     rule generated-targets ( sources + : property-set : project name ? )
     {
-        local leafs ;
-        local temp = [ virtual-target.traverse $(sources[1]) : : include-sources ] ;
+        local leaves ;
+        local temp = [ virtual-target.traverse $(sources[1]) : : include-sources ] ;<!-- You must explain include-sources! -->
         for local t in $(temp)
         {
-            if ! [ $(t).action ]
+            if ! [ $(t).action<!-- In what namespace is this evaluated? --> ]
             {
-                leafs += $(t) ;
+                leaves += $(t) ;
             }
         }
         return [ generator.generated-targets $(sources) $(leafs)
@@ -323,21 +366,22 @@
 }
 generators.register [ new itrace-generator nm.itrace : EXE : ITRACE ] ;
 </programlisting>
-        The <code>generated-targets</code> rule will be called with a single
-        source target of type <literal>EXE</literal>. The call to the
+        The <code>generated-targets</code> method will be called with a single
+        source target of type <literal>EXE</literal>. The call to 
         <code>virtual-target.traverse</code> will return all targets the
-        executable depends on, and we further find files which are not
-        produced from anything. The found targets are added to the sources.
+        executable depends on, and we further find files that are not
+        produced from anything. <!-- What does "not produced from anything" mean? -->
+        The found targets are added to the sources.
       </para>
       
       <para>The <code>run</code> method can be overriden to completely
-        customize the way generator works. In particular, the conversion of
+        customize the way the generator works. In particular, the conversion of
         sources to the desired types can be completely customized. Here's
         another real example. Tests for the Boost Python library usually
         consist of two parts: a Python program and a C++ file. The C++ file is
-        compiled to Python extension which is loaded by the Python
+        compiled to Python extension that is loaded by the Python
         program. But in the likely case that both files have the same name,
-        the created Python extension must be renamed. Otherwise, Python
+        the created Python extension must be renamed. Otherwise, the Python
         program will import itself, not the extension. Here's how it can be
         done:
 <programlisting>
@@ -351,7 +395,7 @@
             python = $(s) ;
         }
     }
-    
+    <!-- This is horrible code.  Use a filter function, or at _least_ consolidate the two loops! -->
     local libs ;
     for local s in $(sources)
     {
@@ -366,10 +410,10 @@
     {
         if [ type.is-derived [ $(s).type ] CPP ] 
         {
-            local name = [ $(s).name ] ;
+            local name = [ $(s).name ] ;    # get the target's basename
             if $(name) = [ $(python).name ] 
             {
-                name = $(name)_ext ;
+                name = $(name)_ext ;        # rename the target
             }                                
             new-sources += [ generators.construct $(project) $(name) :
               PYTHON_EXTENSION : $(property-set) : $(s) $(libs) ] ;
@@ -380,6 +424,10 @@
                  : $(property-set) ] ;        
 }    
 </programlisting>        
+        <!-- Why are we doing this with a generator??? It seems
+             insane.  We could just use a nice front-end rule that
+             calls some normal target-creation rules. No? -->
+
         First, we separate all source into python files, libraries and C++
         sources. For each C++ source we create a separate Python extension by
         calling <code>generators.construct</code> and passing the C++ source
@@ -396,14 +444,14 @@
         Often, we need to control the options passed the invoked tools. This 
         is done with features. Consider an example:
 <programlisting>
-# Declare a new feature
+# Declare a new free feature
 import feature : feature ;
 feature verbatim-options : : free ;
 
 # Cause the value of the 'verbatim-options' feature to be
 # available as 'OPTIONS' variable inside verbatim.inline-file
 import toolset : flags ;
-flags verbatim.inline-file OPTIONS &lt;verbatim-options&gt; ;
+flags verbatim.inline-file OPTIONS &lt;verbatim-options&gt; ;<!-- You must tell the reader what the syntax of the flags rule is -->
 
 # Use the "OPTIONS" variable
 actions inline-file
@@ -414,9 +462,13 @@
         We first define a new feature. Then, the <code>flags</code> invocation
         says that whenever verbatin.inline-file action is run, the value of
         the <code>verbatim-options</code> feature will be added to the
-        <code>OPTIONS</code> variable, an can be used inside the action body.
+        <code>OPTIONS</code> variable, and can be used inside the action body.
         You'd need to consult online help (--help) to find all the features of
         the <code>toolset.flags</code> rule.
+        <!-- It's been a while since I wrote these notes, so I don't
+             remember what I meant.  But right here, I wrote "bad" and
+             circled it.  Maybe you can figure out what I meant. ;-)
+             -->
       </para>
 
     <para>
@@ -425,85 +477,92 @@
       designing features.
     </para>
 
-    <para>Most features should have a fixed set of values, which is portable
+    <para>Most features should have a fixed set of values that is portable
       (tool neutral) across the class of tools they are designed to work
       with. The user does not have to adjust the values for a exact tool.  For
       example, <code>&lt;optimization&gt;speed</code> has the same meaning for
       all C++ compilers and the user does not have to worry about the exact
-      options which are passed to the compiler's command line.
+      options passed to the compiler's command line.
     </para>
 
     <para>
-      Besides such portable features there are special 'raw' features which
+      Besides such portable features there are special 'raw' features that
       allow the user to pass any value to the command line parameters for a
       particular tool, if so desired. For example, the
-      <code>&lt;cxxflags&gt;</code> feature allows to pass any command line
+      <code>&lt;cxxflags&gt;</code> feature allows you to pass any command line
       options to a C++ compiler. The <code>&lt;include&gt;</code> feature
-      allows to pass any value to the <code>-I</code> and the interpretation
-      is tool-specific. (There an <link
-      linkend="bbv2.faq.external">example</link> of very smart usage of that
-      feature).  Of course one should always strive to use the portable
-      features but these should still be provided as a backdoor just to make
+      allows you to pass any string preceded by <code>-I</code> and the interpretation
+      is tool-specific. <!-- It's really tool-specific?  That surprises me --> (See <xref
+      linkend="bbv2.faq.external"/> for an example of very smart usage of that
+      feature).  Of course one should always strive to use portable
+      features, but these are still be provided as a backdoor just to make
       sure Boost.Build does not take away any control from the user. 
     </para>
    
     <para>
-      Some of the reasons why portable features are better are:
+      Using portable features is a good idea because:
       <itemizedlist>
         <listitem>
-          <para>Since a portable feature have a fixed set of value, you will
-            be able to build your project with two different settings of the
-            feature. Boost.Build will automatically use two different
-            directories for produced files. If you pass raw compiler options,
-            Boost.Build assumes you know what you are doing, and would not
-            care about what options are passed.
+          <para>When a portable feature is given a fixed set of
+          values, you can build your project with two different
+          settings of the feature and Boost.Build will automatically
+          use two different directories for generated files.
+          Boost.Build does not try to separate targets built with
+          different raw options.
+            <!-- It's a computer program.  It doesn't "care" about options -->
           </para>
         </listitem>
         
         <listitem>
-          <para>Unlike "raw" features, you don't need to use specific
-            compiler flags in Jamfile, and it will more likely work on other systems.
+          <para>Unlike with “raw” features, you don't need to use
+          specific command-line flags in your Jamfile, and it will be
+          more likely to work with other tools.
           </para>
         </listitem>
       </itemizedlist>
     </para>
            
       <bridgehead>Steps for adding a feauture</bridgehead>
+      <!-- This section is redundant with the previous one -->
       <para>Adding a feature requires three steps:
 
         <orderedlist>
           <listitem><para>Declaring a feature. For that, the "feature.feature"
-              rule is used. You should have to decide on the set of <link
+              rule is used. You have to decide on the set of <link
               linkend="bbv2.reference.features.attributes">feature
               attributes</link>:
 
               <itemizedlist>
-                <listitem><para>if feature has several values, and
-                    significally affects build, make it "propagated", so that
-                    whole project is build with the same value by
+                <listitem><para>if a feature has several values<!-- what do you mean by that?? --> and
+                    significantly affects the build, make it “propagated,” so that the
+                    whole project is built with the same value by
                     default</para></listitem> 
 
-                <listitem><para>if a feature does not have a fixed list of
-                    values, it must be "free".</para></listitem>
+                <listitem><para>if a feature does not have a fixed
+                list of values, it must be “free.”  For example, the
+                <code>include</code> feature is a free
+                feature.</para></listitem>
 
-                <listitem><para>if feature is used to refer to a path, it must
-                be "path".</para></listitem>
+                <listitem><para>if a feature is used to refer to a
+                path relative to the Jamfile, it must be a “path”
+                feature.  <code>include</code> is also a path
+                feature.</para></listitem>
         
                 <listitem><para>if feature is used to refer to some target, it
-                must be "dependency".</para></listitem>
+                must be a “dependency” feature. <!-- for example? --></para></listitem>
               </itemizedlist>
               </para>
           </listitem>
               
 
-          <listitem><para>Converting the feature value into variable. To use
-              feature in build action, it must be converted into a variable,
-              accessible in build action. This is accomplished by
-              "toolset.flags" rule.</para></listitem>
+          <listitem><para>Representing the feature value in a
+          target-specific variable. Build actions are command
+          templates modified by Boost.Jam variable expansions.  The
+          <code>toolset.flags</code> rule sets a target-specific
+          variable to the value of a feature.</para></listitem>
 
-      
-          <listitem><para>Using the variable. The variable set in step 2 can
-              be used in build action to form command parameters or
+                <listitem><para>Using the variable. The variable set in step 2 can
+              be used in a build action to form command parameters or
               files.</para></listitem>
 
         </orderedlist>
@@ -511,15 +570,21 @@
 
       <bridgehead>Another example</bridgehead>
 
-      <para>Here's an another example.
-        Let's see how we can make a feature which refers to a target. For example,
+      <para>Here's another example.
+        Let's see how we can make a feature that refers to a target. For example,
         when linking dynamic libraries on windows, one sometimes needs to specify
         "DEF file", telling what functions should be exported. It would be nice to
         use this file like this:
 <programlisting>
         lib a : a.cpp : &lt;def-file&gt;a.def ;
 </programlisting>
+<!-- Why would that be nice?  It seems to me that having a.def in the sources is the obvious and much nicer thing to do: 
+
+        lib a : a.cpp a.def ;
+-->
         Actually, this feature is already supported, but anyway...
+        <!-- Something about saying that is very off-putting.  I'm
+             sorry that I can't put my finger on it -->
       </para>
 
       <orderedlist>
@@ -530,16 +595,24 @@
 </programlisting>
             </para></listitem>
 
-        <listitem><para>One of the toolsets which cares about DEF files is
-msvc. The following line should be added to it.
+        <listitem><para>One of the toolsets that cares about
+        <!-- The toolset doesn't "care." What do your really mean? -->
+        DEF files is msvc. The following line should be added to it.
+        <!-- Are you saying the msvc toolset is broken (or that it
+             doesn't use DEF files) as-shipped and the reader needs to
+             fix it? -->
 
 <programlisting>
 flags msvc.link DEF_FILE &lt;def-file&gt; ;
 </programlisting>
+            <!-- And that line does... what? -->
             </para></listitem>
-
+            
         <listitem><para>Since the DEF_FILE variable is not used by the
-msvc.link action, we need to modify it to be:
+msvc.link action, 
+<!-- It's not?  You just told us that MSVC "cares" about DEF files. I
+     presume that means that it uses them in some appropriate way? -->
+we need to modify it to be:
 
 <programlisting>
 actions link bind DEF_FILE
@@ -550,13 +623,19 @@
             </para>
           
           
-          <para> Note the "bind DEF_FILE" part. It tells bjam that DEF_FILE
-            refers to a file, otherwise the variable will contain internal
-            target name, which is not likely to make sense for the linker.
+          <para> Note the <code>bind DEF_FILE</code> part. It tells
+          bjam to translate the internal target name in
+          <varname>DEF_FILE</varname> to a corresponding filename in
+          the <code>link</code> action.  Without it the expansion of
+          <code>$(DEF_FILE)</code> would be a strange symbol that is
+          not likely to make sense for the linker.
           </para>
 
+          <!-- I have a note here that says: "none of this works for
+               targets in general, only source files."  I'm not sure
+               what I meant by that; maybe you can figure it out. -->
           <para>
-            We've almost done, but should stop for a small workaround. Add the following
+            We are almost done, but we should stop for a small workaround. Add the following
             code to msvc.jam
 
 <programlisting>
@@ -565,20 +644,23 @@
     DEPENDS $(&lt;) : [ on $(&lt;) return $(DEF_FILE) ] ;
 }
 </programlisting>
+<!-- You *must* explain the part in [...] above.  It's completely opaque to the casual reader -->
 
             This is needed to accomodate some bug in bjam, which hopefully
-            will be fixed one day.</para></listitem>
+            will be fixed one day.
+            <!-- This is *NOT* a bug!!  Anyway,  BBv2 shouild handle this automatically.  Why doesn't it? -->
+</para></listitem>
 
       </orderedlist>
 
       <bridgehead>Variants and composite features.</bridgehead>
 
-      <para>Sometimes you want to create a shorcut for some set of
-        features. For example, <code>release</code> is a value of the
-        <code>variant</code> and is a shortcut for a set of features.
-        </para>.
+      <para>Sometimes you want to create a shortcut for some set of
+        features. For example, <code>release</code> is a value of 
+        <code>&lt;variant&gt;</code> and is a shortcut for a set of features.
+      </para>
 
-      <para>It is possible to define your build variants. For example:
+      <para>It is possible to define your own build variants. For example:
 <programlisting>
 variant crazy : &lt;optimization&gt;speed &lt;inlining&gt;off
                 &lt;debug-symbols&gt;on &lt;profiling&gt;on ;
@@ -593,13 +675,17 @@
       </para>
 
       <para>You are not restricted to using the <code>variant</code> feature
-      only. Here's example which defines a brand new feature:
+      only. 
+      <!-- What do you mean by that?  How is defining a new feature related to what came before? -->
+      Here's example that defines a brand new feature:
 <programlisting>
 feature parallelism : mpi fake none : composite link-incompatible ;
 feature.compose &lt;parallelism&gt;mpi : &lt;library&gt;/mpi//mpi/&lt;parallelism&gt;none ;
 feature.compose &lt;parallelism&gt;fake : &lt;library&gt;/mpi//fake/&lt;parallelism&gt;none ;
 </programlisting>
-        This will allow you to specify value of feature
+<!-- The use of the <library>/mpi//mpi/<parallelism>none construct
+     above is at best confusing and unexplained -->
+        This will allow you to specify the value of feature
         <code>parallelism</code>, which will expand to link to the necessary
         library. 
       </para>
@@ -609,59 +695,71 @@
   <section id="bbv2.extending.rules">
     <title>Main target rules</title>
     <para>
-      The main target rule is what creates a top-level target, for example "exe" or
-      "lib". It's quite likely that you'll want to declare your own and
-      there are as many as three ways to do that.
+      A main target rule (e.g “<functionname>exe</functionname>”
+      Or “<functionname>lib</functionname>”) creates a top-level target. It's quite likely that you'll want to declare your own and
+      there are two ways to do that.
+      <!-- Why did "that" get changed to "this" above? -->
     </para>
+
+    <para id="bbv2.extending.rules.main-type">The first way applies when
+<!-- This is not a "way of defining a main target rule."  Rephrase this and the previous sentence. -->
+      your target rule should just produce a target of specific type. In that case, a
+      rule is already defined for you! When you define a new type, Boost.Build
+      automatically defines a corresponding rule. The name of the rule is
+      obtained from the name of the type, by downcasing all letters and
+      replacing underscores with dashes. 
+      <!-- This strikes me as needless complexity, and confusing.  Why
+           do we have the uppercase-underscore convention for target
+           types?  If we just dropped that, the rule names could be
+           the same as the type names. -->
+      For example, if you create a module
+      <filename>obfuscate.jam</filename> containing:
+
+<programlisting>
+import type ;
+type.register OBFUSCATED_CPP  : ocpp ;
+
+import generators ;
+generators.register-standard obfuscate.file : CPP : OBFUSCATED_CPP ;
+</programlisting>
+      and import that module, you'll be able to use the rule "obfuscated-cpp"
+      in Jamfiles, which will convert source to the OBFUSCATED_CPP type.
+    </para>
     
-    <para>The first is the simplest, but is sufficient in a number of
-      cases. Just write a wrapper rule, which will redirect to any of the
-      existing rules. For example, you have only one library per directory and
-      want all cpp files in the directory to be compiled. You can achieve this
-      effect with:
+    <para>The second way is to write a wrapper rule that calls
+      any of the existing rules. For example, suppose you have only one library per
+      directory and want all cpp files in the directory to be compiled into that library. You
+      can achieve this effect with:
 <programlisting>
 lib codegen : [ glob *.cpp ] ;
 </programlisting>
-      but what if you want to make it even simple. Then, you add the following
-      definition to the project-root.jam file:
+      but if you want to make it even simpler, you could add the following
+      definition to the <filename>project-root.jam</filename> file:
 <programlisting>
 rule glib ( name : extra-sources * : requirements * )
 {
     lib $(name) : [ glob *.cpp ] $(extra-sources) : $(requirements) ;
 }
 </programlisting>
-which would allow to reduce Jamfile to
+which would allow you to reduce the Jamfile to
 <programlisting>
 glib codegen ;
 </programlisting>
     </para>
 
-    <para>The second approach is suitable when your target rule should just
-      produce a target of specific type. Then, when declaring a type you
-      should tell Boost.Build that a main target rule should be created.
-      For example, if you create a module "obfuscate.jam" containing:
-
-<programlisting>
-import type ;
-type.register OBFUSCATED_CPP  : ocpp : : main ;
-
-import generators ;
-generators.register-standard obfuscate.file : CPP : OBFUSCATED_CPP ;
-</programlisting>
-      and import that module, you'll be able to use the rule "obfuscated-cpp"
-      in Jamfiles, which will convert source to the OBFUSCATED_CPP type.
-    </para>
-
     <para>
-      The remaining method is to declare your own main target class. The
-      simplest example of this can be found in "build/alias.jam" file. The
-      current V2 uses this method when transformations are relatively
-      complex. However, we might deprecate this approach. If you find that you
-      need to use it (that is, the first two approaches are not sufficient),
-      please let us know by posting to the mailing list.
+      Note that because you can associate a custom generator with a target
+      type, the logic of building can be rather compiler. 
+      <!-- "compiler" is not an adjective.  The logic can't be "rather
+           compiler."  What you might mean here is completely
+           mysterious to me -->
+      For example, the
+      <code>boostbook</code> module declares a target type
+      <code>BOOSTBOOK_MAIN</code> and a custom generator for that
+      type. You can use that as example if your main target rule is
+      non-trivial.
     </para>
-    
-
+         
   </section>
 
   <section id="bbv2.extending.toolset_modules">
@@ -669,46 +767,66 @@
     <title>Toolset modules</title>
 
     <para>If your extensions will be used only on one project, they can be
-      placed in a separate <filename>.jam</filename> file which will be
+      placed in a separate <filename>.jam</filename> file that will be
       imported by your <filename>project-root.jam</filename>. If the
-      extensions will be used on many projects, the users will thank you for 
+      extensions will be used on many projects, users will thank you for 
       a finishing touch.
     </para>
 
-    <para>The standard way to use a tool in Boost.Build is the
-      <code>using</code> rule. To make it work, you module should provide an
-      <code>init</code> rule. The rule will be called with the same parameters
-      which were passed to the <code>using</code> rule. The set of allowed
-      parameters is determined by you. For example, you can allow the user to
-      specify paths, tool version, or tool options.
+    <para>The <code>using</code> rule provides a standard mechanism
+    for loading and configuring extensions.  To make it work, your module
+    <!-- "module" hasn't been defined yet.  Furthermore you haven't
+         said anything about where that module file must be
+         placed. -->
+    should provide an <code>init</code> rule. The rule will be called
+    with the same parameters that were passed to the
+    <code>using</code> rule. The set of allowed parameters is
+    determined by you. For example, you can allow the user to specify
+    paths, tool versions, and other options.
+    <!-- But it's not entirely arbitrary.  We have a standard
+         parameter order which you should describe here for
+         context. -->
     </para>
 
-    <para>Here are some guidelines which help to make Boost.Build more
+    <para>Here are some guidelines that help to make Boost.Build more
       consistent:
       <itemizedlist>
         <listitem><para>The <code>init</code> rule should never fail. Even if
-          user provided a wrong path, you should emit a warning and go
+          the user provided an incorrect path, you should emit a warning and go
           on. Configuration may be shared between different machines, and
           wrong values on one machine can be OK on another.
+          <!-- So why shouldn't init fail on machines where it's wrong?? -->
           </para></listitem>
 
-        <listitem><para>Prefer specifying command to be executed to specifying
-            path. First of all, this gives more control: it's possible to
-            specify
+        <listitem><para>Prefer specifying the command to be executed
+        to specifying the tool's installation path. First of all, this
+        gives more control: it's possible to specify
 <programlisting>
 /usr/bin/g++-snapshot
 time g++
+<!-- Is this meant to be a single command?  If not, insert "or" -->
 </programlisting>
             as the command. Second, while some tools have a logical
-            "installation root", it better if user don't have to remember if
-            a specific tool requires a full command or a path.            
+            "installation root", it's better if the user doesn't have to remember whether
+            a specific tool requires a full command or a path.
+            <!-- But many tools are really collections: e.g. a
+                 compiler, a linker, and others.  The idea that the
+                 "command to invoke" has any significance may be
+                 completely bogus.  Plus if you want to allow "time
+                 /usr/bin/g++" the toolset may need to somehow parse
+                 the command and find the path when it needs to invoke
+                 some related executable.  And in that case, will the
+                 command be ignored?  This scheme doesn't scale and
+                 should be fixed. -->
           </para></listitem>
 
         <listitem><para>Check for multiple initialization. A user can try to
             initialize the module several times. You need to check for this
             and decide what to do. Typically, unless you support several
-            versions of a tool, duplicate initialization is a user error. If
-            tool version can be specified during initialization, make sure the
+            versions of a tool, duplicate initialization is a user error. 
+            <!-- Why should that be typical? -->
+            If the
+            tool's version can be specified during initialization, make sure the
             version is either always specified, or never specified (in which
             case the tool is initialied only once). For example, if you allow:
 <programlisting>
@@ -719,9 +837,12 @@
             Then it's not clear if the first initialization corresponds to
             version 3.3 of the tool, version 3.4 of the tool, or some other
             version. This can lead to building twice with the same version.
+            <!-- That would not be so terrible, and is much less harmful
+                 than this restriction, IMO.  It makes site-config
+                 harder to maintain than necessary. -->
             </para></listitem>
 
-        <listitem><para>If possible, the <code>init</code> must be callable
+        <listitem><para>If possible, <code>init</code> must be callable
           with no parameters. In which case, it should try to autodetect all
           the necessary information, for example, by looking for a tool in
           <envar>PATH</envar> or in common installation locations. Often this
@@ -748,7 +869,6 @@
 
 <!--
      Local Variables:
-     mode: xml
      sgml-indent-data: t     
      sgml-parent-document: ("userman.xml" "chapter")
      sgml-set-face: t

Modified: boost-build/branches/upstream/current/doc/src/faq.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/faq.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/faq.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,6 +7,34 @@
 
     <section>
       <title>
+        How do I get the current value of feature in Jamfile?
+      </title>
+
+      <para>
+        This is not possible, since Jamfile does not have "current" value of any 
+        feature, be it toolset, build variant or anything else. For a single invocation of
+        <filename>bjam</filename>, any given main target can be built with several property sets.
+        For example, user can request two build variants on the command line. Or one library
+        is built as shared when used from one application, and as static when used from another.
+        Obviously, Jamfile is read only once, so generally, there's no single value of a feature
+        you can access in Jamfile.               
+      </para>
+
+      <para>A feature has a specific value only when building a target, and there are two ways how you
+      can use that value:</para>
+      <itemizedlist>
+        <listitem><simpara>Use conditional requirements or indirect conditional requirements. See 
+        <xref linkend="bbv2.advanced.targets.requirements.conditional"/>.</simpara>
+        </listitem>
+        <listitem>Define a custom generator and a custom main target type. The custom generator can do arbitrary processing
+        or properties. See the <xref linkend="bbv2.extender">extender manual</xref>.
+        </listitem>                
+      </itemizedlist>
+
+    </section>
+
+    <section>
+      <title>
         I'm getting "Duplicate name of actual target" error. What
         does it mean?
       </title>
@@ -79,7 +107,7 @@
 
     </section>
 
-    <section>
+    <section id="bbv2.faq.envar">
       <title>
       Accessing environment variables
       </title>
@@ -99,8 +127,8 @@
     namespace. Therefore, to access environment variable from Jamfile, you'd
     need the following code:
 <programlisting>
-import modules ;
-local SOME_LIBRARY_PATH = [ modules.peek : SOME_LIBRARY_PATH ] ;
+import os ;
+local SOME_LIBRARY_PATH = [ os.environ SOME_LIBRARY_PATH ] ;
 exe a : a.cpp : &lt;include&gt;$(SOME_LIBRARY_PATH) ;
 </programlisting>
     </para>
@@ -180,28 +208,11 @@
     <title>Can I get output of external program as a variable in a Jamfile?
     </title>
 
-    <para>From time to time users ask how to run an external program and save
-    the result in Jamfile variable, something like:
+    <para>The <code>SHELL</code> builtin can be used for the purpose:
 <programlisting>
-local gtk_includes = [ RUN_COMMAND gtk-config ] ;
+local gtk_includes = [ SHELL "gtk-config --cflags" ] ;
 </programlisting>
-      Unfortunately, this is not possible at the moment. However, if the
-      result of command invocation is to be used in a command to some tool,
-      and you're working on Unix, the following workaround is possible.
-<programlisting>
- alias gtk+-2.0 : : : :
-         &lt;cflags&gt;"`pkg-config --cflags gtk+-2.0`"
-         &lt;inkflags&gt;"`pkg-config --libs gtk+-2.0`"
-     ;
-</programlisting>
-      If you use the "gtk+-2.0" target in sources, then the properties
-      specified above will be added to the build properties and eventually
-      will appear in the command line. Unix command line shell processes
-      the backticks quoting by running the tool and using its output --
-      which is what's desired in that case. Thanks to Daniel James for
-      sharing this approach.
     </para>
-
   </section>
 
   <section>
@@ -304,7 +315,7 @@
     <para>Which approach is best depends on your situation. If the libraries
       are relatively standalone and can be used by third party applications,
       they should be installed in the system location. If you have lots of
-      libraries which can be used only by our application, it makes sense to
+      libraries which can be used only by your application, it makes sense to
       install it to a nonstandard directory and add an explicit path, like the
       example above shows. Please also note that guidelines for different
       systems differ in this respect. The Debian guidelines prohibit any
@@ -338,11 +349,52 @@
       in any Jamfile.</para>
 
   </section>
+
+  <section id="bbv2.faq.header-only-libraries">
+    <title>Header-only libraries</title>
+
+    <para>In modern C++, libraries often consist of just header files, without
+    any source files to compile. To use such libraries, you need to add proper
+    includes and, maybe, defines, to your project. But with large number of
+    external libraries it becomes problematic to remember which libraries are
+    header only, and which are "real" ones. However, with Boost.Build a 
+    header-only library can be declared as Boost.Build target and all 
+    dependents can use such library without remebering if it's header-only or not.
+    </para>
+
+    <para>Header-only libraries are declared using the <code>alias</code> rule,
+    that specifies only usage requirements, for example:
+<programlisting>
+alias mylib 
+    : # no sources
+    : # no build requirements
+    : # no default build
+    : &lt;include&gt;whatever
+    ;
+</programlisting>
+    The includes specified in usage requirements of <code>mylib</code> are
+    automatically added to build properties of all dependents. The dependents
+    need not care if <code>mylib</code> is header-only or not, and it's possible
+    to later make <code>mylib</code> into a regular compiled library.
+    </para>
+
+    <para>
+      If you already have proper usage requirements declared for project where
+      header-only library is defined, you don't need to duplicate them for
+      the <code>alias</code> target:
+<programlisting>
+project my : usage-requirements &lt;include&gt;whatever ;
+alias mylib ;
+</programlisting>      
+    </para>
+
+  </section>
+
     
   </chapter>
 <!--
      Local Variables:
-     mode: xml
+     mode: nxml
      sgml-indent-data: t     
      sgml-parent-document: ("userman.xml" "chapter")
      sgml-set-face: t

Modified: boost-build/branches/upstream/current/doc/src/howto.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/howto.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/howto.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -8,7 +8,7 @@
     <para>
       If you've just found out about Boost.Build V2 and want to know
       if it will work for you, start with <xref linkend=
-      "bbv2.tutorial" />. You can continue with the <xref
+      "bbv2.tutorial" />. You can continue with <xref
       linkend="bbv2.advanced" />. When you're ready to try Boost.Build
       in practice, go to <xref linkend="bbv2.installation"/>.
     </para>
@@ -21,16 +21,14 @@
 
     <para>
       If you're trying to build a project which uses Boost.Build,
-      look at <xref linkend="bbv2.installation"/> and then read about
+      see <xref linkend="bbv2.installation"/> and then read about
       <xref linkend="bbv2.reference.commandline"/>.
     </para>
 
     <para>
-      If you have questions, please post them to our <ulink
-      url="../../../../more/mailing_lists.htm#jamboost">mailing
-      list</ulink>, and be sure to indicate in the subject line that
-      you're asking about Boost.Build <emphasis
-      role="bold">V2</emphasis>.
+      If you have questions, please post them to our mailing list (<ulink
+      url="http://boost.org/more/mailing_lists.htm#jamboost"/>). The mailing list is
+      also mirrowed to newsgroup <ulink url="news://news.gmane.org/gmane.comp.lib.boost.build"/>.
     </para>
 
   </chapter>

Modified: boost-build/branches/upstream/current/doc/src/install.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/install.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/install.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,7 +7,22 @@
 
     <para>
       This section describes how to install Boost.Build from a
-      released source distribution. All paths are given relative to
+      released <ulink
+      url="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=8041">Boost
+      source distribution</ulink>
+      or <ulink url="http://sourceforge.net/cvs/?group_id=7586">CVS
+      image</ulink>.
+      <footnote>
+        <para>Note that packages prepared for
+      Unix/Linux systems usually make their own choices about where to
+      put things and even which parts of Boost to include.  When we
+      say &#x201C;released source distribution&#x201D; we mean a
+      distribution of Boost as released on its SourceForge
+      <ulink url="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=8041">project
+      page</ulink>.
+        </para>
+    </footnote>
+All paths are given relative to
       the <firstterm>Boost.Build v2 root directory</firstterm>, which is 
 
       <!-- the normal location of the document you are reading.
@@ -18,15 +33,28 @@
       distributed separately -->
 
       located in the <filename>tools/build/v2</filename> subdirectory
-      of a full <ulink url="http://www.boost.org">Boost</ulink>
-      distribution.
+      of a full Boost <ulink url="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=8041">distribution</ulink>.
+      <footnote>
+        <para>The Boost.Build subset of boost is also distributed
+        separately, for those who are only interested in getting a
+        build tool. The top-level directory of a <ulink
+        url="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=80982">Boost.Build
+        distribution</ulink> contains all the subdirectories of the
+        <filename>tools/build/v2</filename> subdirectory from a full
+        Boost distribution, so it is itself a valid Boost.Build root
+        directory.  It also contains the
+        <filename>tools/jam/src</filename> subdirectory of a
+        full Boost distribution, so you can rebuild Boost.Jam from
+        source.
+        </para>
+    </footnote>
     </para>
 
     <orderedlist>
       <listitem>
         <simpara>
           Boost.Build uses <ulink
-          url= "../jam_src/index.html">Boost.Jam</ulink>, an
+          url= "../../tools/jam/index.html">Boost.Jam</ulink>, an
           extension of the <ulink
           url="http://www.perforce.com/jam/jam.html">Perforce
           Jam</ulink> portable <command>make</command> replacement. The
@@ -36,8 +64,8 @@
           a prebuilt executable</ulink></emphasis> from SourceForge.
           If a prebuilt executable is not provided for your platform
           or you are using Boost's sources in an unreleased state, it
-          may be neccessary to <ulink
-          url= "../../jam_src/index.html#building_bjam">build <command>bjam</command>
+          may be necessary to <ulink
+          url= "../../doc/html/jam/buildin.html">build <command>bjam</command>
           from sources</ulink> included in the Boost source tree.
         </simpara>
       </listitem>
@@ -69,7 +97,7 @@
           system.  Open the
           <filename>user-config.jam</filename> file in the Boost.Build
           root directory and follow the instructions there to describe
-          your toolsets and libraries, and, if neccessary, where they
+          your toolsets and libraries, and, if necessary, where they
           are located.
         </simpara>
       </listitem>
@@ -134,7 +162,7 @@
   <para><emphasis role="bold">N.B.</emphasis>
   When <command>bjam</command> is invoked from anywhere in the Boost
   directory tree <emphasis>other than</emphasis> the Boost.Build root
-  and its subdirectories, <ulink url="../../tools/build">Boost.Build
+  and its subdirectories, <ulink url="../../tools/build/index.html">Boost.Build
   v1</ulink> is used by default. To override the default and use
   Boost.Build v2, you have to add the <option>--v2</option> command
   line option to all <command>bjam</command> invocations.</para>

Modified: boost-build/branches/upstream/current/doc/src/reference.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/reference.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/reference.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -11,9 +11,9 @@
     <section id="bbv2.reference.init">
       <title>Initialization</title>
 
-      <para>bjam's first job upon startup is to load the Jam code which
+      <para>bjam's first job upon startup is to load the Jam code that
         implements the build system. To do this, it searches for a file
-        called "boost-build.jam", first in the invocation directory, then
+        called <filename>boost-build.jam</filename>, first in the invocation directory, then
         in its parent and so forth up to the filesystem root, and finally
         in the directories specified by the environment variable
         BOOST_BUILD_PATH. When found, the file is interpreted, and should
@@ -26,14 +26,14 @@
 
       <para>
         If location is a relative path, it is treated as relative to
-        the directory of boost-build.jam. The directory specified by
-        location and directories in BOOST_BUILD_PATH are then searched for
-        a file called bootstrap.jam which is interpreted and is expected to
+        the directory of <filename>boost-build.jam</filename>. The directory specified by
+        that location and the directories in BOOST_BUILD_PATH are then searched for
+        a file called <filename>bootstrap.jam</filename>, which is expected to
         bootstrap the build system. This arrangement allows the build
         system to work without any command-line or environment variable
         settings. For example, if the build system files were located in a
         directory "build-system/" at your project root, you might place a
-        boost-build.jam at the project root containing:
+        <filename>boost-build.jam</filename> at the project root containing:
 
 <programlisting>
 boost-build build-system ;
@@ -42,11 +42,11 @@
         In this case, running bjam anywhere in the project tree will
         automatically find the build system.</para>
 
-      <para>The default "bootstrap.jam", after loading some standard
+      <para>The default <filename>bootstrap.jam</filename>, after loading some standard
         definitions, loads two files, which can be provided/customised by
-        user: "site-config.jam" and "user-config.jam".</para>
+        user: <filename>site-config.jam</filename> and <filename>user-config.jam</filename>.</para>
 
-      <para>Locations where those files a search are summarized below:</para>
+      <para>Locations where those files are searched are summarized below:</para>
 
       <table id="bbv2.reference.init.config">
         <title>Search paths for configuration files</title>
@@ -69,14 +69,14 @@
               <entry>Linux</entry>
 
               <entry>
-                <simpara>/etc</simpara>
-                <simpara>$HOME</simpara>
-                <simpara>$BOOST_BUILD_PATH</simpara>
+                <simpara><code>/etc</code></simpara>
+                <simpara><code>$HOME</code></simpara>
+                <simpara><code>$BOOST_BUILD_PATH</code></simpara>
               </entry>
 
               <entry>
-                <simpara>$HOME</simpara>
-                <simpara>$BOOST_BUILD_PATH</simpara>
+                <simpara><code>$HOME</code></simpara>
+                <simpara><code>$BOOST_BUILD_PATH</code></simpara>
               </entry>
             </row>
 
@@ -84,14 +84,16 @@
               <entry>Windows</entry>
 
               <entry>
-                <simpara>$SystemRoot</simpara>
-                <simpara>$HOME</simpara>
-                <simpara>$BOOST_BUILD_PATH</simpara>
+                <simpara><code>%SystemRoot%</code></simpara>
+                <simpara><code>%HOMEDRIVE%%HOMEPATH%</code></simpara>
+                <simpara><code>%HOME%</code></simpara>
+                <simpara><code>%BOOST_BUILD_PATH%</code></simpara>
               </entry>
 
               <entry>
-                <simpara>$HOME</simpara>
-                <simpara>$BOOST_BUILD_PATH</simpara>
+                <simpara><code>%HOMEDRIVE%%HOMEPATH%</code></simpara>
+                <simpara><code>%HOME%</code></simpara>
+                <simpara><code>%BOOST_BUILD_PATH%</code></simpara>
               </entry>
             </row>
           </tbody>
@@ -100,6 +102,7 @@
 
       <para>
         Boost.Build comes with default versions of those files,
+        <!-- Where are those files installed?  The user can't use them as templates unless she can find them -->
         which can serve as templates for customized versions.
       </para>
 
@@ -129,29 +132,31 @@
         <itemizedlist>
           <listitem>
             <simpara>
-              An argument which does not contain slashes or the "="
-              symbol is either a value of an implicit feature, or target to
-              be built. It is taken to be value of a feature if appropriate
+              An argument that does not contain slashes or the <code>=</code>
+              symbol is either a value of an implicit feature or of a target to
+              be built. It is taken to be value of a feature if an appropriate
               feature exists. Otherwise, it is considered a <link linkend=
-                "bbv2.reference.ids">target id</link>. Special target name "clean"
-              has the same effect as "--clean" option.
+                "bbv2.reference.ids">target id</link>. Building the
+              special target name “clean” has the same effect as
+              using the <code>--clean</code> option.
             </simpara>
           </listitem>
 
           <listitem>
             <para>
-              An argument with either slashes or the "=" symbol specifies
-              a number of <link linkend="bbv2.reference.buildreq">build
-                request</link>
-              elements. In the simplest form, it's just a set of properties,
-              separated by slashes, which become a single build request
-              element, for example:
+              An argument containing either slashes or
+              the <code>=</code> symbol specifies a number of build
+              request elements (see <xref
+              linkend="bbv2.reference.buildreq"/>). In its simplest
+              form, it's just a set of properties, separated by
+              slashes, which become a single build request element,
+              for example:
 
 <programlisting>
 borland/&lt;runtime-link&gt;static
 </programlisting>
 
-              More complex form is used to save typing. For example,
+              A more complex form can be used to save typing. For example,
               instead of
 
 <programlisting>
@@ -167,25 +172,29 @@
               Exactly, the conversion from argument to build request
               elements is performed by (1) splitting the argument at each slash,
               (2) converting each split part into a set of properties and (3)
-              taking all possible combination of the property sets. Each split
-              part should have the either the form
+              taking all possible combinations
+                <!-- Be specific.  Do you mean the cross-product? -->
+              of the property sets. Each split
+              part should have either the form
 
 <programlisting>
 <emphasis>feature-name</emphasis>=<emphasis>feature-value1</emphasis>[","<emphasis>feature-valueN</emphasis>]*   
 </programlisting>
 
-              or, in case of implicit feature
+              or, in case of implicit features
 
 <programlisting>
 <emphasis>feature-value1</emphasis>[","<emphasis>feature-valueN</emphasis>;]*   
 </programlisting>
 
-              and will be converted into property set
+              will be converted into the property set
 
 <programlisting>
 &lt;feature-name&gt;feature-value1 .... &lt;feature-name&gt;feature-valueN
 </programlisting>
 
+<!-- There's absolutely no explanation of how arguments are combined.  Fix that. -->
+
             </para>
           </listitem>
         </itemizedlist>
@@ -209,71 +218,10 @@
         <para>All of the Boost.Build options start with the "--" prefix.
           They are described in the following table.</para>
 
-        <table>
-          <title>Command line options</title>
-          <tgroup cols="2">
+        <para>FIXME: That table has moved into "User documentation" section
+        and there's nothing we can add here. Remove this part?</para>
 
-            <thead>
-              <row>
-                <entry>Option</entry>
 
-                <entry>Description</entry>
-              </row>
-            </thead>
-
-            <tbody>
-              <row>
-                <entry><literal>--version</literal></entry>
-
-                <entry>Prints information on Boost.Build and Boost.Jam
-                  versions.</entry>
-              </row>
-
-              <row id="bbv2.reference.init.options.help">
-                <entry><literal>--help</literal></entry>
-
-                <entry>Access to the online help system. This prints general
-                  information on how to use the help system with additional
-                  --help* options.</entry>
-              </row>
-
-              <row>
-                <entry><literal>--clean</literal></entry>
-
-                <entry>Removes everything instead of building. Unlike
-                  <literal>clean</literal> target in make, it is possible to clean only
-                  some targets.</entry>
-              </row>
-
-              <row>
-                <entry><literal>--debug</literal></entry>
-
-                <entry>Enables internal checks.</entry>
-              </row>
-
-              <row>
-                <entry><literal>--dump-projects</literal></entry>
-
-                <entry>Cause the project structure to be output.</entry>
-              </row>
-
-              <row>
-                <entry><literal>--no-error-backtrace</literal></entry>
-
-                <entry>Don't print backtrace on errors. Primary useful for
-                  testing.</entry>
-              </row>
-
-              <row>
-                <entry><literal>--ignore-config</literal></entry>
-
-                <entry>Do not load <literal>site-config.jam</literal> and
-                  <literal>user-config.jam</literal></entry>
-              </row>
-            </tbody>
-          </tgroup>
-        </table>
-
       </section>
     </section>
 
@@ -340,17 +288,17 @@
         <listitem><para>selecting the main target alternative to use,
           </para></listitem>
 
-        <listitem><para>determining "common" properties</para></listitem>
+        <listitem><para>determining "common" properties,</para></listitem>
 
         <listitem><para>building targets referred by the sources list and
-            dependency properties</para></listitem>
+            dependency properties,</para></listitem>
 
         <listitem><para>adding the usage requirements produces when building
-            dependencies to the "common" properties</para></listitem>
+            dependencies to the "common" properties,</para></listitem>
 
-        <listitem><para>building the target using generators</para></listitem>
+        <listitem><para>building the target using generators,</para></listitem>
 
-        <listitem><para>computing the usage requirements to be returned</para></listitem>
+        <listitem><para>computing the usage requirements to be returned.</para></listitem>
 
       </orderedlist>
     </para>
@@ -382,10 +330,10 @@
           <simpara>
             If there's one viable alternative, it's choosen. Otherwise,
             an attempt is made to find one best alternative. An alternative
-            a is better than another alternative b, iff set of properties
-            in b's condition is strict subset of the set of properities of
+            a is better than another alternative b, iff the set of properties
+            in b's condition is a strict subset of the set of properities of
             'a's condition. If there's one viable alternative, which is
-            better than all other, it's selected. Otherwise, an error is
+            better than all others, it's selected. Otherwise, an error is
             reported.
           </simpara>
         </listitem>
@@ -446,168 +394,15 @@
       </para>        
 
   </section>
-      
-    
-<!--
-
-    <para>Construction of each main target begins with finding
-      properties for <emphasis>this</emphasis> main target. They are found by
-      processing both build request, and <emphasis>target requirements</emphasis>,
-      which give properties needed for the target to build. For
-      example, a given main target might require certian defines, or
-      will not work unless compiled in multithreaded mode. The process
-      of finding properties for main target is described in <link linkend=
-        "bbv2.reference.variants.proprefine">property refinement</link>.
-    </para>
-    
-    <para>After that, dependencies (i.e. other main targets) are built
-      recursively. Build request for dependencies is not always equal
-      to those of dependent &#x2014; certain properties are dropped and
-      user can explicitly specify desired properties for dependencies.
-      See <link linkend="bbv2.reference.features.attributes.propagated">
-        propagated features</link> and <xref linkend=
-        "bbv2.advanced.targets.references"/> for details.</para>
-    
-    <para>When dependencies are constructed, the dependency graph for
-      this main target and for this property set is created, which
-      describes which files need to be created, on which other files
-      they depend and what actions are needed to construct those files.
-      There's more that one method, and user can define new ones, but
-      usually, this involves <emphasis>generators</emphasis> and <emphasis>target
-        types</emphasis>.</para>
-    
-    <para>Target type is just a way to classify targets. For example,
-      there are builtin types <literal>EXE</literal>, <literal>OBJ</literal> and
-      <literal>CPP</literal>. <link linkend=
-        "bbv2.reference.generators">Generators</link> are objects
-      that know how to convert between different target type. When a
-      target of a given type must be created, all generators for that
-      type, which can handle needed properties, are found. Each is
-      passed the list of sources, and either fails, or returns a
-      dependency graph. If a generator cannot produce desired type from
-      given sources, it may try to recursively construct types that it
-  can handle from the types is was passed. This allows to try all
-      possible transformations. When all generators are tried, a
-      dependency graph is selected.</para>
-    
-    <para>Finally, the dependency graph is passed to underlying
-      Boost.Jam program, which runs all actions needed to bring all
-      main targets up-to date. At this step, implicit dependencies are
-      also scanned and accounted for, as described "here." [ link? ]</para>
-    
-    <para>Given a list of targets ids and a build request, building goes
-      this way. First, for each id we obtain the abstract targets
-      corresponding to it. This also loads all necessary projects. If
-      no target id is given, project in the current directory is used.
-      Build request is expanded, and for each resulting property set,
-      the <literal>generate</literal> method of all targets is called, which
-      yields a list of virtual targets. After that all virtual targets
-      are actualized, and target "all" is set to depend on all created
-      actual targets. Lastly, depending on whether <literal>- XXXXXX -clean</literal>
-      option was given, either target "all" or target "clean" is
-      updated. Generation of virtual target from abstract one is
-      performed as follows:</para>
-    
-    <itemizedlist>
-      <listitem>
-        <para>For project targets, all of main targets are generated
-          with the same properties. Then all projects referred via
-          "build-project" are generated as well. If it's not possible
-          to refine requested properties with project requirements, the
-          project is skipped.</para>
-        
-        <para id="bbv2.reference.buildprocess.explict">
-          It is possible to disable building of certain target using the
-          <literal>explicit</literal> rule, available in all project
-          modules. The syntax is
-          
-<programlisting>
-rule explicit ( target-name )
-</programlisting>
-
-          If this rule is invoked on a target, it will be built only
-          when it's explicitly requested on the command line.
-        </para>
-      </listitem>
-      
-      <listitem>
-        <para>
-          For main target, with several alternatives, one of them is
-    selected as described <link linkend=
-            "bbv2.reference.buildprocess.alternatives">below</link>.
-          If there's only one
-          alternative, it's used unconditionally.
-
-          <orderedlist>
-            <listitem>
-              <simpara>
-                All main target alternatives which requirements are
-                satisfied by the build request are enumerated.
-          </simpara>
-            </listitem>
-            
-            <listitem>
-              <simpara>
-                If there are several such alternatives, the one which
-                longer requirements list is selected.
-              </simpara>
-            </listitem>
-          </orderedlist>
-      </para>
-      </listitem>
-      
-      <listitem>
-        <para>
-          For the selected alternative
-          
-          <orderedlist>
-            <listitem>
-              <simpara>
-                Each target reference in the source list are
-                recursively constructed.
-              </simpara>
-            </listitem>
-            
-            <listitem>
-              <simpara>
-                Properties are refined with alternative's requirements,
-                and active features in the resulting set are executed.
-              </simpara>
-            </listitem>
-            
-            <listitem>
-              <simpara>
-                Conditional properties are evaluated.
-              </simpara>
-            </listitem>
-            
-            <listitem>
-              <simpara>
-                The dependency graph for the target is constructed in a
-                way which depends on the kind of main target, typically
-                using generators.
-              </simpara>
-            </listitem>
-          </orderedlist>
-        </para>
-      </listitem>
-      
-      <listitem>
-        <simpara>
-          If, when building sources, the properties on recursively
-          created targets are not link-compatibile with build properties,
-          a warning is issued.
-        </simpara>
-      </listitem>
-    </itemizedlist>
--->
-     
+              
   </section>
 
 
 
   <section id="bbv2.reference.definitions">
 
+    <title>Definitions</title>
+
     <section id="bbv2.reference.features">
       <title>Features and properties</title>
 
@@ -629,7 +424,7 @@
       <para>A <emphasis>property</emphasis> is a (feature,value) pair, expressed as
         &lt;feature&gt;value.</para>
 
-      <para>A <emphasis>subfeature</emphasis> is a feature which only exists in the
+      <para>A <emphasis>subfeature</emphasis> is a feature that only exists in the
         presence of its parent feature, and whose identity can be derived
         (in the context of its parent) from its value. A subfeature's
         parent can never be another subfeature. Thus, features and their
@@ -654,7 +449,7 @@
         path representation of the previous example would be
         <literal>&lt;toolset&gt;gcc/&lt;runtime-link&gt;static</literal>.</para>
       
-      <para>A <emphasis>build specification</emphasis> is a property set which fully
+      <para>A <emphasis>build specification</emphasis> is a property set that fully
         describes the set of features used to build a target.</para>
       
       <section id="bbv2.reference.features.validity">
@@ -693,7 +488,7 @@
             <para>Incidental features are assumed not to affect build
               products at all. As a consequence, the build system may use
               the same file for targets whose build specification differs
-              only in incidental features. A feature which controls a
+              only in incidental features. A feature that controls a
               compiler's warning level is one example of a likely
               incidental feature.</para>
             
@@ -744,9 +539,9 @@
           <listitem>
             <para><emphasis>optional</emphasis></para>
             
-            <para>An optional feature is a feature which is not required to
+            <para>An optional feature is a feature that is not required to
               appear in a build specification. Every non-optional non-free
-              feature has a default value which is used when a value for
+              feature has a default value that is used when a value for
               the feature is not otherwise specified, either in a target's
               requirements or in the user's build request. [A feature's
               default value is given by the first value listed in the
@@ -797,18 +592,11 @@
               feature. When generating targets from a set of build
               properties, composite features are recursively expanded and
               <emphasis>added</emphasis> to the build property set, so rules can find
-              them if neccessary. Non-composite non-free features override
+              them if necessary. Non-composite non-free features override
               components of composite features in a build property set.</para>
           </listitem>
 
           <listitem>
-            <para><emphasis>link-incompatible</emphasis></para>
-
-            <para>See <link linkend=
-                "bbv2.reference.variants.compat">below</link>.</para>
-          </listitem>
-
-          <listitem>
             <para><emphasis>dependency</emphasis></para>
 
             <para>The value of dependency feature if a target reference.
@@ -823,7 +611,7 @@
           </listitem>
         </itemizedlist>
 
-        <para>Features which are neither free nor incidental are called
+        <para>Features that are neither free nor incidental are called
           <emphasis>base</emphasis> features.</para>
 
 
@@ -851,7 +639,7 @@
       
       <para>
         A build variant, or (simply variant) is a special kind of composite
-        feature which automatically incorporates the default values of
+        feature that automatically incorporates the default values of
         features that . Typically you'll want at least two separate
         variants: one for debugging, and one for your release code. [
         Volodya says: "Yea, we'd need to mention that it's a composite
@@ -862,46 +650,6 @@
         V1, so can't document this for V2.". Will clean up soon -DWA ]
       </para>
 
-<!-- I no longer think link compatibility is a great idea, so comment out
-     this part of docs.
-
-      <section id="bbv2.reference.variants.compat">
-        <title>Link compatible and incompatible properties</title>
-        
-        <para>When the build system tries to generate a target (such as
-          library dependency) matching a given build request, it may find
-          that an exact match isn't possible &#x2014; for example, the
-          target may impose additonal build requirements. We need to
-          determine whether a buildable version of that target can actually
-          be used.</para>
-        
-        <para>The build request can originate in many ways: it may come
-          directly from the user's command-line, from a dependency of a
-          main target upon a library, or from a dependency of a target upon
-          an executable used to build that target, for example. For each
-          way, there are different rules whether we can use a given
-          subvariant or not. The current rules are described below.</para>
-        
-        <para>Two property sets are called <emphasis>link-compatible</emphasis> when
-          targets with those property sets can be used interchangably. In
-          turn, two property sets are link compatible when there's no
-          link-incompatible feature which has different values in those
-          property sets.</para>
-        
-        <para>When building of a main target is requested from a command
-          line or some project, link-compatibility is not considered. When
-          building is requested by other main target, via sources or
-          dependency properties, the requested and actual property sets
-          must be link-compatible, otherwise a warning is produced.</para>
-
-  <para><emphasis role="bold">Rationale:</emphasis>Link-compatibility is not considered when
-  main target is requested by a project, because it causes problems
-  in practice. For example, some parts of a project might be
-  single-threaded, while others &#x2014; multi-threaded. They are
-  not link-compatible, but they are not linked, either. So, there's
-  no need to issue error or warning. The errors used to be
-  generated, and only caused problems.</para> -->
-
       </section>
 
     <section id="bbv2.reference.variants.proprefine">
@@ -913,12 +661,6 @@
         <emphasis>property refinement</emphasis> and is performed by these rules</para>
       
       <orderedlist>
-        <listitem>
-          <simpara>
-            If original properties and required properties are not
-            link-compatible, refinement fails.
-          </simpara>
-        </listitem>
 
         <listitem>
           <simpara>
@@ -958,6 +700,13 @@
 </programlisting>
       </para>
 
+      <para>The syntax also allows several properties in the condition, for
+        example:
+<programlisting>
+exe hello : hello.cpp : &lt;os&gt;NT,&lt;toolset&gt;gcc:&lt;link&gt;static ;
+</programlisting>
+      </para>
+
     </section>
 
     <section id="bbv2.reference.ids">
@@ -1031,13 +780,13 @@
 
             So, to summarize:
 
-            1. The project which extract tarfile may extract all possible kinds
+            1. The project that extract tarfile may extract all possible kinds
             of targets, and it's reasonable to use them directly from other
             project.
 
             2. The rule for unpacking tar is inplemented in terms of
             "patch-file", for maintainability, and therefore, must use main
-            target name which contains slashes?
+            target name that contains slashes?
 
             3. Using sub-Jamfile in "foo" to declare extracted file "foo/b" is
             not an option, because you should not change existing tree 
@@ -1136,7 +885,7 @@
       <para>When trying to construct a target, the first step is to select
         all possible generators for the requested target type, which
         required properties are a subset of requested properties.
-        Generators which were already selected up the call stack are
+        Generators that were already selected up the call stack are
         excluded. In addition, if any composing generators were selected
         up the call stack, all other composing generators are ignored
         (TODO: define composing generators). The found generators
@@ -1149,7 +898,7 @@
       <title>Running generators</title>
 
       <para>When generators are selected, each is run to produce a list of
-        created targets. This list might include targets which are not of
+        created targets. This list might include targets that are not of
         requested types, because generators create the same targets as
         some tool, and tool's behaviour is fixed. (Note: should specify
         that in some cases we actually want extra targets). If generator
@@ -1161,7 +910,7 @@
         that the set of propagated properties is different from what was
         used for building sources.</para>
 
-      <para>For all targets which are not of requested types, we try to
+      <para>For all targets that are not of requested types, we try to
         convert them to requested type, using a second call to
         <literal>construct</literal>. This is done in order to support
         transformation sequences where single source file expands to
@@ -1189,7 +938,7 @@
 
       <para>Because target location is determined by the build system, it
         is sometimes necessary to adjust properties, in order to not
-        break actions. For example, if there's an action which generates
+        break actions. For example, if there's an action that generates
         a header, say "a_parser.h", and a source file "a.cpp" which
         includes that file, we must make everything work as if a_parser.h
         is generated in the same directory where it would be generated

Added: boost-build/branches/upstream/current/doc/src/standalone.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/standalone.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/standalone.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE part PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+  "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+
+<part xmlns:xi="http://www.w3.org/2001/XInclude"
+      id="bbv2" last-revision="$Date: 2006/07/20 07:19:25 $">
+
+  <title>Boost.Build v2 User Manual</title>
+
+  <!-- Chapters -->
+  <xi:include href="howto.xml"/>
+  <xi:include href="install.xml"/>
+  <xi:include href="tutorial.xml"/>
+  <xi:include href="advanced.xml"/>
+  <xi:include href="extending.xml"/>
+  <xi:include href="reference.xml"/>
+  <xi:include href="faq.xml"/>
+
+  <!-- Appendicies -->
+  <xi:include href="architecture.xml"/>
+  <appendix id="bbv2.jam">
+    <title>Boost.Jam documentation</title>
+    <xi:include href="jam_docs.xml" parse="xml" 
+	xpointer="xpointer(id('jam.intro')|id('jam.intro')/following-sibling::*)"/>
+  </appendix>    
+
+</part>

Modified: boost-build/branches/upstream/current/doc/src/tutorial.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/tutorial.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/tutorial.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -4,16 +4,30 @@
 
 <?psgml nofill screen programlisting literallayout?>
 
-<chapter id="bbv2.tutorial" status="draft">
+<chapter id="bbv2.tutorial">
   <title>Tutorial</title>
 
+<!--   You can't launch into this stuff without describing how to configure -->
+<!--   Boost.Build... unless of course you think it's likely to work with -->
+<!--   no configuration.  But even if you do you have to tell people how to -->
+<!--   configure their installation in case it doesn't work. -->
+<!--
+    VP: need also mention the examples which correspond to specific
+    sections.
+-->
+
+  <para>This section will guide you though the most basic features of
+  Boost.Build V2. We will start with the &#x201C;Hello, world&#x201D; example,
+  learn how to use libraries, and finish with testing and installing features.  
+  </para>
+
   <section id="bbv2.tutorial.hello">
     <title>Hello, world</title>
 
     <para>The simplest project that Boost.Build can construct is
       stored in <filename>example/hello/</filename> directory. The
       project is described by a file
-      called <filename>Jamfile</filename> that contains:
+      called <filename>Jamroot</filename> that contains:
 
 <programlisting>
 exe hello : hello.cpp ;
@@ -21,10 +35,11 @@
 
       Even with this simple setup, you can do some interesting
       things. First of all, just invoking <command>bjam</command> will
-      build the debug variant of the <command>hello</command>
+      build the <filename>hello</filename>
       executable by compiling and
-      linking <filename>hello.cpp</filename>.  Now, to build the
-      release variant of <command>hello</command>, invoke
+      linking <filename>hello.cpp</filename>. By default, debug variant 
+      is built. Now, to build the
+      release variant of <filename>hello</filename>, invoke 
 
 <screen>
 bjam release
@@ -32,26 +47,26 @@
 
       Note that debug and release variants are created in different
       directories, so you can switch between variants or even build
-      multiple variants at once, without any unneccessary
+      multiple variants at once, without any unnecessary
       recompilation. Let's extend the example by adding another line
-      to our project's <filename>Jamfile</filename>:
+      to our project's <filename>Jamroot</filename>:
 
 <programlisting>
 exe hello2 : hello.cpp ;
 </programlisting>
 
-      Now we can build both the debug and release variants of our
-      project:
+      Now let us build both the debug and release variants of our project
+      again:
 
 <screen>
 bjam debug release
 </screen>
 
-      Note that two variants of <command>hello2</command> are linked.
+      Note that two variants of <filename>hello2</filename> are linked.
       Since we have already built both variants
-      of <command>hello</command>, hello.cpp won't be recompiled;
+      of <filename>hello</filename>, hello.cpp won't be recompiled;
       instead the existing object files will just be linked into the
-      corresponding variants of <command>hello2</command>. Now 
+      corresponding variants of <filename>hello2</filename>. Now 
       let's remove all the built products:
 
 <screen>
@@ -60,7 +75,7 @@
 
       It's also possible to build or clean specific targets.  The
       following two commands, respectively, build or clean only the
-      debug version of <command>hello2</command>.
+      debug version of <filename>hello2</filename>.
 
 <screen>
 bjam hello2
@@ -77,8 +92,8 @@
       debug and release variants, or single- and multi-threaded
       builds, Boost.Build uses <firstterm>features</firstterm> with
       associated <firstterm>values</firstterm>.  For
-      example, the "debug-symbols" feature can have a value of "on" or
-      "off".  A <firstterm>property</firstterm> is just a (feature,
+      example, the <code>debug-symbols</code> feature can have a value of <code>on</code> or
+      <code>off</code>.  A <firstterm>property</firstterm> is just a (feature,
       value) pair.  When a user initiates a build, Boost.Build
       automatically translates the requested properties into appropriate
       command-line flags for invoking toolset components like compilers
@@ -86,7 +101,7 @@
 
     <para>There are many built-in features that can be combined to
       produce arbitrary build configurations.  The following command
-      builds the project's &quot;release&quot; variant with inlining
+      builds the project's <code>release</code> variant with inlining
       disabled and debug symbols enabled:
 
 <screen>
@@ -101,9 +116,9 @@
 </screen>
 </para>
 
-    <para>The "release" and "debug" that we've seen
+    <para>The <option>release</option> and <option>debug</option> that we've seen
       in <command>bjam</command> invocations are just a shorthand way to
-      specify values of the "variant" feature.  For example, the command
+      specify values of the <varname>variant</varname> feature.  For example, the command
       above could also have been written this way:
 
       <screen>
@@ -111,15 +126,14 @@
       </screen>
     </para>
 
-    <para>  &quot;variant&quot; is so commonly-used that it has been given
-      special status as an <firstterm>implicit</firstterm> feature
-      &#x2014; Boost.Build will deduce the its identity just from the name
-      of one of its values.  
+    <para> <varname>variant</varname> is so commonly-used that it has
+      been given special status as an <firstterm>implicit</firstterm>
+      feature&#x2014;Boost.Build will deduce the its identity just
+      from the name of one of its values.
     </para>
 
     <para>
-      A complete description of features can be found
-      <link linkend="bbv2.reference.features">here</link>. 
+      A complete description of features can be found in <xref linkend="bbv2.reference.features"/>.
     </para>
 
 
@@ -127,47 +141,56 @@
       <title>Build Requests and Target Requirements</title>
 
       <para>      
-        The set of properties specified in the command line constitute a
-        <firstterm>build request</firstterm> &#x2014; a description of
+        The set of properties specified on the command line constitute
+        a <firstterm>build request</firstterm>&#x2014;a description of
         the desired properties for building the requested targets (or,
         if no targets were explicitly requested, the project in the
-        current directory).  The <emphasis>actual</emphasis> properties
-        used for building targets is typically a combination of the
-        build request and properties derived from the
-        project's <filename>Jamfile</filename>s.  For example, the
+        current directory).  The <emphasis>actual</emphasis>
+        properties used for building targets are typically a
+        combination of the build request and properties derived from
+        the project's <filename>Jamroot</filename> (and its other
+        Jamfiles, as described in <xref
+        linkend="bbv2.tutorial.hierarchy"/>).  For example, the
         locations of <code>#include</code>d header files are normally
-        not specified on the command-line, but described
-        in <filename>Jamfile</filename>s as <firstterm>target
-          requirements</firstterm> and automatically combined with the
+        not specified on the command-line, but described in
+        Jamfiles as <firstterm>target
+        requirements</firstterm> and automatically combined with the
         build request for those targets.  Multithread-enabled
-        compilation is another example of a typical target requirement.
-        The <filename>Jamfile</filename> fragment below illustrates how
-        these requirements might be specified.
+        compilation is another example of a typical target
+        requirement.  The Jamfile fragment below
+        illustrates how these requirements might be specified.
       </para>
 
 <programlisting>
 exe hello 
     : hello.cpp
-    : &lt;include&gt;/home/ghost/Work/boost &lt;threading&gt;multi
+    : &lt;include&gt;boost &lt;threading&gt;multi
     ;
 </programlisting>
 
       <para> 
         When <filename>hello</filename> is built, the two
-        requirements specified above will normally always be present.
+        requirements specified above will always be present. 
         If the build request given on the <command>bjam</command>
         command-line explictly contradicts a target's requirements,
-        the command-line usually overrides (or, in the case of
-        &quot;free&quot; feautures like <code>&lt;include&gt;</code>
-        <footnote>See <xref
-        linkend="bbv2.reference.features.attributes"/></footnote>,
-        augments) the target requirements.  However, when a
-        contradiction of a target's requrements involves certain
-        <firstterm>link-incompatible</firstterm> features, the target
-        will be skipped.  See <xref linkend=
-        "bbv2.reference.variants.compat"/> for more information.
+        the target requirements usually override (or, in the case of
+        &#x201C;free&rdquo;&#x201D; features like
+        <varname>&lt;include&gt;</varname>,
+        <footnote>
+<para>
+See <xref linkend="bbv2.reference.features.attributes"/>
+</para></footnote>
+        augments) the build request.
+
       </para>
 
+      <tip>
+        <para>The value of the <varname>&lt;include&gt;</varname> feature is
+          relative to the location of <filename>Jamroot</filename> where it's
+          used. 
+        </para>
+      </tip>
+
     </section>
     <section id="bbv2.tutorial.properties.project_attributes">
       <title>Project Attributes</title>
@@ -178,9 +201,9 @@
         them.  However, as projects grow, that approach leads to a great
         deal of repeated boilerplate in Jamfiles.
         
-        Fortunately, there's a better way. Each project (i.e. each
-        <filename>Jamfile</filename>), can specify a set of <firstterm>attributes</firstterm>,
-        including requirements:
+        Fortunately, there's a better way. Each project can specify a
+        set of <firstterm>attributes</firstterm>, including
+        requirements:
 
 <programlisting>
 project 
@@ -192,7 +215,7 @@
 </programlisting>
 
         The effect would be as if we specified the same requirement for
-        both <command>hello</command> and <command>hello2</command>.
+        both <filename>hello</filename> and <filename>hello2</filename>.
       </para>
     </section>
   </section>
@@ -201,24 +224,23 @@
     <title>Project Hierarchies</title>
 
     <para>So far we've only considered examples with one project
-      (i.e. with one <filename>Jamfile</filename>). A typical large
-      software project would be composed of sub-projects organized
-      into a tree. The top of the tree is called the
-      <firstterm>project root</firstterm>.  Besides a
-      <filename>Jamfile</filename>, the project root directory
-      contains a file called <filename>project-root.jam</filename>. Every other
-      <filename>Jamfile</filename> in the project has a single parent
-      project, rooted in the nearest parent directory containing a
-      <filename>Jamfile</filename>. For example, in the following
-      directory layout:
+    &#x2014;a. with one user-written Boost.Jam file,
+    <filename>Jamroot</filename>). A typical large codebase would be
+    composed of many projects organized into a tree. The top of the
+    tree is called the <firstterm>project root</firstterm>.  Every
+    subproject is defined by a file called
+    <filename>Jamfile</filename> in a descendant directory of the
+    project root.  The parent project of a subproject is defined by
+    the nearest <filename>Jamfile</filename> or
+    <filename>Jamroot</filename> file in an ancestor directory. For
+    example, in the following directory layout:
 
 <screen>
 top/ 
   |
-  +-- Jamfile
-  +-- project-root.jam
+  +-- Jamroot
   |
-  +-- src/
+  +-- app/
   |    |
   |    +-- Jamfile
   |    `-- app.cpp
@@ -231,78 +253,91 @@
        .    `-- bar.cpp
 </screen>
 
-      <!-- "lib/lib1/lib1" changed to "util/foo/bar" to avoid confusion -->
-
-      the project root is <filename>top/</filename>.  Because there is
-      no <filename>Jamfile</filename> in
-      <filename>top/util/</filename>, the projects in
-      <filename>top/src/</filename> and
+      the project root is <filename>top/</filename>.  The projects in
+      <filename>top/app/</filename> and
       <filename>top/util/foo/</filename> are immediate children of the
       root project.
+
+      <note>
+        <para>
+          When we refer to a &#x201C;Jamfile,&#x201D; set in normal
+          type, we mean a file called either
+          <filename>Jamfile</filename> or
+          <filename>Jamroot</filename>.  When we need to be more
+          specific, the filename will be set as
+          &#x201C;<filename>Jamfile</filename>&#x201D; or
+          &#x201C;<filename>Jamroot</filename>.&#x201D;
+        </para>
+      </note>
     </para>
 
     <para>
       Projects inherit all attributes (such as requirements)
       from their parents.  Inherited requirements are combined with
-      any requirements specified by the sub-project.  
-      For example, if <filename>top/Jamfile</filename> has
+      any requirements specified by the subproject.  
+      For example, if <filename>top/Jamroot</filename> has
 
 <programlisting>
 &lt;include&gt;/home/ghost/local
 </programlisting>
 
-      in its requirements, then all of its sub-projects will have it
+      in its requirements, then all of its subprojects will have it
       in their requirements, too.  Of course, any project can add
-      additional includes. <footnote>Many features will be overridden,
-      rather than added-to, in sub-projects.  See <xref
+      include paths to those specified by its parents. <footnote>
+      <para>Many
+      features will be overridden,
+      rather than added-to, in subprojects.  See <xref
       linkend="bbv2.reference.features.attributes"/> for more
-      information</footnote> More details can be found in the section
-      on <link linkend= "bbv2.advanced.projects">projects</link>.
+      information</para>
+    </footnote> 
+    More details can be found in 
+      <xref linkend= "bbv2.advanced.projects"/>.
     </para>
 
     <para>
       Invoking <command>bjam</command> without explicitly specifying
-      any targets on the command-line builds the project rooted in the
+      any targets on the command line builds the project rooted in the
       current directory.  Building a project does not automatically
-      cause its sub-projects to be built unless the parent project's
-      <filename>Jamfile</filename> explicitly requests it. In our
-      example, <filename>top/Jamfile</filename> might contain:
+      cause its subprojects to be built unless the parent project's
+      Jamfile explicitly requests it. In our example,
+      <filename>top/Jamroot</filename> might contain:
 
 <programlisting>
-build-project src ;
+build-project app ;
 </programlisting>
 
-      which would cause the project in <filename>top/src/</filename>
+      which would cause the project in <filename>top/app/</filename>
       to be built whenever the project in <filename>top/</filename> is
       built. However, targets in <filename>top/util/foo/</filename>
       will be built only if they are needed by targets in
-      <filename>top/</filename> or <filename>top/src/</filename>.
+      <filename>top/</filename> or <filename>top/app/</filename>.
     </para>
   </section>
 
   <section id="bbv2.tutorial.libs">
-    <title>Libraries and Dependent Targets</title>
+    <title>Dependent Targets</title>
 
-    <comment>TODO: need to make this
-      section consistent with "examples-v2/libraries".</comment>
-
     <para>
-      Targets that are "needed" by other targets are called
-      <firstterm>dependencies</firstterm> of those other targets.  The
-      targets that need the other targets are called
-      <firstterm>dependent</firstterm> targets.
+      When a building a target <filename>X</filename> depends on first
+      building another target <filename>Y</filename> (such as a
+      library that must be linked with <firstterm>X</firstterm>),
+      <filename>Y</filename> is called a
+      <firstterm>dependency</firstterm> of <filename>X</filename> and
+      <filename>X</filename> is termed a
+      <firstterm>dependent</firstterm> of <filename>Y</filename>.
     </para>
 
     <para>To get a feeling of target dependencies, let's continue the
-      above example and see how <filename>src/Jamfile</filename> can
-      use libraries from <filename>util/foo</filename>.  Assume
-      util/foo/Jamfile contains:
+      above example and see how <filename>top/app/Jamfile</filename> can
+      use libraries from <filename>top/util/foo</filename>.  If
+      <filename>top/util/foo/Jamfile</filename> contains
 
 <programlisting>
 lib bar : bar.cpp ;
 </programlisting>
 
-      Then, to use this library in <filename>src/Jamfile</filename>, we can write:
+      then to use this library in <filename>top/app/Jamfile</filename>, we can
+      write:
 
 <programlisting>
 exe app : app.cpp ../util/foo//bar ;
@@ -310,31 +345,44 @@
 
       While <code>app.cpp</code> refers to a regular source file,
       <code>../util/foo//bar</code> is a reference to another target:
-      a library "bar" declared in the <filename>Jamfile</filename> at
-      <filename>../util/foo</filename>.  When linking the
-      <command>app</command> executable, the appropriate version of
-      <code>bar</code> will be built and linked in. What do we mean by
-      "appropriate"? For example, suppose we build "app" with:
+      a library <filename>bar</filename> declared in the Jamfile at
+      <filename>../util/foo</filename>. 
+    </para>
 
-<screen>
-bjam app optimization=full cxxflags=-w-8080
-</screen>
+    <tip>
+      <para>Some other build system have special syntax for listing dependent
+      libraries, for example <varname>LIBS</varname> variable. In Boost.Build,
+      you just add the library to the list of sources.
+      </para>
+    </tip>
 
-      Which properties must be used to build <code>foo</code>? The
-      answer is that some properties are
-      <firstterm>propagated</firstterm> &#x2014; Boost.Build attempts to
-      use dependencies with the same value of propagated features. The
-      &lt;optimization&gt; feature is propagated, so both "app" and
-      "foo" will be compiled with full optimization. But
-      &lt;cxxflags&gt; feature is not propagated: its value will be
-      added as-is to compiler flags for "a.cpp", but won't affect
-      "foo". There is still a couple of problems. First, the library
-      probably has some headers which must be used when compiling
-      "app.cpp". We could use requirements on "app" to add those
-      includes, but then this work will be repeated for all programs
-      which use "foo". A better solution is to modify
-      util/foo/Jamfilie in this way:
+    <para>Suppose we build <filename>app</filename> with:
+    <screen>
+bjam app optimization=full define=USE_ASM
+    </screen>
+    Which properties will be used to build <code>foo</code>? The answer is
+    that some features are
+    <firstterm>propagated</firstterm>&#x2014;Boost.Build attempts to use
+    dependencies with the same value of propagated features. The
+    <varname>&lt;optimization&gt;</varname> feature is propagated, so both
+    <filename>app</filename> and <filename>foo</filename> will be compiled
+    with full optimization. But <varname>&lt;define&gt;</varname> is not
+    propagated: its value will be added as-is to the compiler flags for
+    <filename>a.cpp</filename>, but won't affect <filename>foo</filename>.
+    </para>
 
+
+    <para>Let's improve this project further.
+      The library
+      probably has some headers that must be used when compiling
+      <filename>app.cpp</filename>. We could manually add the necessary
+      <code>#include</code> paths to <filename>app</filename>'s
+      requirements as values of the
+      <varname>&lt;include&gt;</varname> feature, but then this work will 
+      be repeated for all programs
+      that use <filename>foo</filename>. A better solution is to modify
+      <filename>util/foo/Jamfile</filename> in this way:
+
 <programlisting>
 project 
     : usage-requirements &lt;include&gt;.
@@ -343,254 +391,240 @@
 lib foo : foo.cpp ;
 </programlisting>
 
-      Usage requirements are requirements which are applied to
-      dependents. In this case, &lt;include&gt; will be applied to all
-      targets which use "foo" &#x2014; i.e. targets which have "foo"
-      either in sources or in dependency properties. You'd need to
-      specify usage requirements only once, and programs which use "foo"
-      don't have to care about include paths any longer. Or course, the
-      path will be interpreted relatively to "util/foo" and will be
-      adjusted according to the <command>bjam</command>s invocation
-      directory. For
-      example, if building from project root, the final compiler's
-      command line will contain <option>-Ilib/foo</option>.
+      Usage requirements are applied not to the target being declared
+      but to its
+      dependents. In this case, <literal>&lt;include&gt;.</literal> will be applied to all
+      targets that directly depend on <filename>foo</filename>.
     </para>
 
-    <para>The second problem is that we hardcode the path to library's
-      Jamfile. Imagine it's hardcoded in 20 different places and we
-      change the directory layout. The solution is to use project ids
-      &#x2014; symbolic names, not tied to directory layout. First, we
-      assign a project id to Jamfile in util/foo:</para>
+    <para>Another improvement is using symbolic identifiers to refer to
+      the library, as opposed to <filename>Jamfile</filename> location.
+      In a large project, a library can be used by many targets, and if 
+      they all use <filename>Jamfile</filename> location,
+      a change in directory organization entails much work.
+      The solution is to use project ids&#x2014;symbolic names
+      not tied to directory layout. First, we need to assign a project id by
+      adding this code to
+      <filename>Jamroot</filename>:</para>
+      <programlisting>
+use-project /library-example/foo : util/foo ;
+      </programlisting>
+      <para>Second, we modify <filename>app/Jamfile</filename> to use the
+      project id:
 
 <programlisting>
-project foo
-    : usage-requirements &lt;include&gt;.
-    ;
+exe app : app.cpp /library-example/foo//bar ;
 </programlisting>
-
-    <para>
-      Second, we use the project id to refer to the library in
-      src/Jamfile:
-
-<programlisting>
-exe app : app.cpp /foo//bar ;
-</programlisting>
-
-      The "/foo//bar" syntax is used to refer to target "foo" in
-      project with global id "/foo" (the slash is used to specify global
-      id). This way, users of "foo" do not depend on its location, only
-      on id, which is supposedly stable. The only thing left, it to make
-      sure that src/Jamfile knows the project id that it uses. We add to
-      top/Jamfile the following line:
-
-<programlisting>
-use-project /foo : util/foo ;
-</programlisting>
-
-      Now, all projects can refer to "foo" using the symbolic
-      name. If the library is moved somewhere, only a single line in the
-      top-level Jamfile should be changed.
+The <filename>/library-example/foo//bar</filename> syntax is used 
+      to refer to the target <filename>bar</filename> in
+      the project with id <filename>/library-example/foo</filename>.
+      We've achieved our goal&#x2014;if the library is moved to a different
+      directory, only <filename>Jamroot</filename> must be modified.
+      Note that project ids are global&#x2014;two Jamfiles are not
+      allowed to assign the same project id to different directories.
+           
     </para>
-  </section>
 
-  <section id="bbv2.tutorial.depends">
-    <title>Library dependencies</title>
-
-    <para>The previous example was simple. Often, there are long chains
-      of dependencies between libraries. The main application is a thin
-      wrapper on top of library with core logic, which uses library of
-      utility functions, which uses boost filesystem library.
-      Expressing these dependencies is straightforward:</para>
-
-<programlisting>
-lib utils : utils.cpp /boost/filesystem//fs ;   
-lib core : core.cpp utils ;
-exe app : app.cpp core ;
-</programlisting>
-
-    <para>So, what's the reason to even mention this case? First,
-      because it's a bit more complex that it seems. When using shared
-      linking, libraries are build just as written, and everything will
-      work. However, what happens with static linking? It's not
-      possible to include another library in static library.
-      Boost.Build solves this problem by returning back library targets
-      which appear as sources for static libraries. In this case, if
-      everything is built statically, the "app" target will link not
-      only "core" library, but also "utils" and
-      "/boost/filesystem//fs".</para>
-
-    <para>So, the net result is that the above code will work for both
-      static linking and for shared linking.</para>
-
-    <para>Sometimes, you want all applications in some project to link
-      to a certain library. Putting the library in sources of all
-      targets is possible, but verbose. You can do better by using the
-      &lt;source&gt; property. For example, if "/boost/filesystem//fs"
+    <tip>
+      <para>If you want all applications in some project to link
+      to a certain library, you can avoid having to specify it directly the sources of every
+      target by using the
+      <varname>&lt;source&gt;</varname> property. For example, if <filename>/boost/filesystem//fs</filename>
       should be linked to all applications in your project, you can add
-      &lt;source&gt;/boost/filesystem//fs to requirements of the
-      project, like this:</para>
+      <code>&lt;source&gt;/boost/filesystem//fs</code> to the project's requirements, like this:</para>
 
-<programlisting>
+      <programlisting>
 project 
    : requirements &lt;source&gt;/boost/filesystem//fs
    ;   
-</programlisting>
-    </section>
+      </programlisting>
+    </tip>
+    
+  </section>
 
+  <section id="bbv2.tutorial.testing">
+    <title>Testing</title>
+
+
+  </section>
+
   <section id="bbv2.tutorial.linkage">
     <title>Static and shared libaries</title>
 
-    <para>While the
-      previous section explained how to create and use libraries, it
-      omitted one important detail. Libraries can be either
-      <emphasis>static</emphasis>, which means they are included in executable
-      files which use them, or <emphasis>shared</emphasis> (a.k.a.
-      <emphasis>dynamic</emphasis>), which are only referred to from executables,
-      and must be available at run time. Boost.Build can work with both
-      types. By default, all libraries are shared. This is much more
-      efficient in build time and space. But the need to install all
-      libraries to some location is not always convenient, especially
-      for debug builds. Also, if the installed shared library changes,
-      all application which use it might start to behave differently.
+    <para>Libraries can be either
+    <emphasis>static</emphasis>, which means they are included in executable
+    files that use them, or <emphasis>shared</emphasis> (a.k.a.
+    <emphasis>dynamic</emphasis>), which are only referred to from executables,
+    and must be available at run time. Boost.Build can create and use both kinds.
     </para>
-
-    <para>Static libraries do not suffer from these problems, but
-      considerably increase the size of application. Before describing
-      static libraries, it's reasonable to give another, quite simple
-      approach. If your project is built with
-      &lt;hardcode-dll-paths&gt;true property, then the application
-      will include the full paths for all shared libraries, eliminating
-      the above problems. Unfortunately, you no longer can move shared
-      library to a different location, which makes this option suitable
-      only for debug builds. Further, only gcc compiler supports this
-      option.</para>
-
-    <para>Building a library statically is easy. You'd need to change
-      the value of &lt;link&gt; feature from it's deafault value
-      <literal>shared</literal>, to <literal>static</literal>. So, to build everything as
-      static libraries, you'd say</para>
-
-<screen>
+    
+    <para>The kind of library produced from a <code>lib</code> target is
+    determined by the value of the <varname>link</varname> feature. Default
+    value is <literal>shared</literal>, and to build static library, the value
+    should be <literal>static</literal>. You can either requiest static build
+    on the command line:
+    <screen>
 bjam link=static
-</screen>
+    </screen>
+    or in the library's requirements:    
+    <programlisting>
+lib l : l.cpp : &lt;link&gt;static ;
+    </programlisting>
+    </para>
 
     <para>
-      on the command line. The linking mode can be fine-tuned on
-      per-target basis.
+      We can also use the <varname>&lt;link&gt;</varname> property
+      to express linking requirements on a per-target basis.  
+      For example, if a particular executable can be correctly built
+      only with the static version of a library, we can qualify the
+      executable's <link
+      linkend="bbv2.reference.targets.references">target
+      reference</link> to the library as follows:
 
-      <orderedlist>
-        <listitem>
-          <para>
-            Suppose your library can be only build statically. This is
-            easily achieved using requirements:
+<!-- There has been no earlier indication that target references can
+     contain properties.  You can't assume that the reader will
+     recognize that strange incantation as a target reference, or that
+     she'll know what it means.  You also can't assume that hyperlinks
+     will help the reader, because she may be working from a printout,
+     as I was. 
+     VP: to be addressed when this section is moved. See comment
+     below.
+-->
 
-<programlisting>
-lib l : l.cpp : &lt;link&gt;static ;
-</programlisting>
-            
-          </para>
-        </listitem>
+    <programlisting>
+exe important : main.cpp helpers/&lt;link&gt;static ;</programlisting>
 
-        <listitem>
-          <para>
-            What if library can be both static and shared, but when
-            using it in specific executable, you want it static?
-            <link linkend="bbv2.advanced.targets.references">Target
-              references</link> are here to help:
+    No matter what arguments are specified on the <command>bjam</command>
+    command line, <filename>important</filename> will only be linked with
+    the static version of <filename>helpers</filename>.
+    </para>
 
-<programlisting>
-exe important : main.cpp helpers/&lt;link&gt;static ;
-</programlisting>
+      <para>
+        Specifying properties in target references is especially useful if you
+        use a library defined in some other project (one you can't
+        change) but you still want static (or dynamic) linking to that library
+        in all cases. If that library is used by many targets,
+        you <emphasis>could</emphasis> use target references
+        everywhere:
 
-          </para>
-        </listitem>
-
-        <listitem>
-          <para>
-            What if the library is defined in some other project, which
-            you cannot change. But still, you want static linking to that
-            library in all cases. You can use target references everywhere:
-
-<programlisting>
+        <programlisting>
 exe e1 : e1.cpp /other_project//bar/&lt;link&gt;static ;
-exe e10 : e10.cpp /other_project//bar/&lt;link&gt;static ;
-</programlisting>
+exe e10 : e10.cpp /other_project//bar/&lt;link&gt;static ;</programlisting>
 
-            but that's far from being convenient. Another way is to
-            introduce a level of indirection: create a local target, which will
-            refer to static version of <filename>foo</filename>. Here's the
-            solution:
+        but that's far from being convenient. A better approach is
+        to introduce a level of indirection.  Create a local
+        <type>alias</type> target that refers to the static (or
+        dynamic) version of <filename>foo</filename>:
 
-<programlisting>
+        <programlisting>
 alias foo : /other_project//bar/&lt;link&gt;static ;
 exe e1 : e1.cpp foo ;
-exe e10 : e10.cpp foo ;
-</programlisting>
+exe e10 : e10.cpp foo ;</programlisting>
 
-            Note that the <link linkend="bbv2.builtins.alias">alias</link> 
-            rule is specifically used for rename a reference to a target and possibly
-            change the properties.
+        The <link linkend="bbv2.builtins.alias"><functionname>alias</functionname></link> 
+        rule is specifically used to rename a reference to a target and possibly
+        change the properties.
+        
+        <!-- You should introduce the alias rule in an earlier
+             section, before describing how it applies to this
+             specific use-case, and the foregoing sentence should
+             go there. 
+             VP: we've agreed that this section should be moved further
+             in the docs, since it's more like advanced reading. When
+             I'll move it, I'll make sure 'alias' is already mentioned.
+        -->
+      </para>
 
-          </para>
-        </listitem>
-      </orderedlist>
-    </para>
+      <tip>
+        <para>
+          When one library uses another, you put the second library in
+          the source list of the first. For example:
+          <programlisting>
+lib utils : utils.cpp /boost/filesystem//fs ;   
+lib core : core.cpp utils ;
+exe app : app.cpp core ;</programlisting>
+          This works no matter what kind of linking is used. When 
+          <filename>core</filename> is built as a shared library, it is linked
+          directly into <filename>utils</filename>. Static libraries can't
+          link to other libraries, so when <filename>core</filename> is built
+          as a static library, its dependency on <filename>utils</filename> is passed along to
+          <filename>core</filename>'s dependents, causing
+          <filename>app</filename> to be linked with both
+          <filename>core</filename> and <filename>utils</filename>.
+        </para>
+      </tip>
+
+      <note>
+        <para>(Note for non-UNIX system). Typically, shared libraries must be
+        installed to a directory in the dynamic linker's search
+        path. Otherwise, applications that use shared libraries can't be
+        started. On Windows, the dynamic linker's search path is given by the
+        <envar>PATH</envar> environment variable. This restriction is lifted
+        when you use Boost.Build testing facilities&#x2014;the
+        <envar>PATH</envar> variable will be automatically adjusted before
+        running executable.
+        <!-- Need ref here to 'testing facilities' -->
+        </para>
+      </note>
+
   </section>
 
   <section id="bbv2.tutorial.conditions">
     <title>Conditions and alternatives</title>
 
-    <para>As we've just figured out, properties can significally affect the
-      way targets are built. The processing of the &lt;link&gt; feature is
-      built in the build system, and is quite complex. But there is a couple
-      of mechanisms which allow ordinary users to do different things 
-      depending on properties.
-    </para>
+    <para>Sometimes, particular relationships need to be maintained
+    among a target's build properties. For example, you might want to set
+    specific <code>#define</code> when a library is built as shared,
+    or when a target's <code>release</code> variant is built. 
+    This can be achieved with <firstterm>conditional requirements</firstterm>. 
 
-    <para>The first mechanism is called <firstterm>conditinal
-        requirement</firstterm>. For example, you might want to set specific
-      defines when the library is build as shared, or you have your own define
-      to be used in release mode. Here's a piece of Jamfile.
-<programlisting>
+    <programlisting>
 lib network : network.cpp 
-    : &lt;link&gt;shared:&lt;define&gt;NEWORK_LIB_SHARED 
-      &lt;variant&gt;release:&lt;define&gt;EXTRA_FAST
+    : <emphasis role="bold">&lt;link&gt;shared:&lt;define&gt;NEWORK_LIB_SHARED</emphasis>
+     &lt;variant&gt;release:&lt;define&gt;EXTRA_FAST
     ;
 </programlisting>
-      This will have exactly the effect we wanted: whenever &lt;link&gt;shared
-      is in properties, &lt;define&gt;NEWORK_LIB_SHARED will be in properties
-      as well.
+
+      In the example above, whenever <filename>network</filename> is
+      built with <code>&lt;link&gt;shared</code>,
+      <code>&lt;define&gt;NEWORK_LIB_SHARED</code> will be in its
+      properties, too. Also, whenever its release variant is built, 
+      <code>&lt;define&gt;EXTRA_FAST</code> will appear in its properties.
     </para>
 
     <para>
-      Sometimes different variant of a target are so different, that
-      describing them using conditional requirements would be hard. Imagine
-      that a library has different sources on two supported toolsets, and
-      dummy implementation for all the other toolset. We can express this
-      situation using <firstterm>target alternatives</firstterm>:
+      Sometimes the ways a target is built are so different that
+      describing them using conditional requirements would be
+      hard. For example, imagine that a library actually uses
+      different source files depending on the toolset used to build
+      it. We can express this situation using <firstterm>target
+      alternatives</firstterm>:
 <programlisting>
-lib demangler : dummy_demangler.cpp ;
-lib demangler : demangler_gcc.cpp : &lt;toolset&gt;gcc ;
-lib demangler : demangler_msvc.cpp : &lt;toolset&gt;msvc ;
+lib demangler : dummy_demangler.cpp ;                      # alternative 1
+lib demangler : demangler_gcc.cpp : &lt;toolset&gt;gcc ;   # alternative 2
+lib demangler : demangler_msvc.cpp : &lt;toolset&gt;msvc ; # alternative 3
 </programlisting>
-      The proper alternative will be automatically selected. 
+      When building <filename>demangler</filename>, Boost.Build will compare
+      requirements for each alternative with build properties to find the best match.
+      For example, when building with with <code>&lt;toolset&gt;gcc</code> 
+      alternative 2, will be selected, and when building with 
+      <code>&lt;toolset&gt;msvc</code> alternative 3 will be selected. In all other
+      cases, the most generic alternative 1 will be built.
     </para>
     
   </section>
 
-
   <section id="bbv2.tutorial.prebuilt">
     <title>Prebuilt targets</title>
 
     <para>
-      We've just learned how to use libraries which are created by
-      Boost.Build. But some libraries are not. At the same time, those
-      libraries can have different versions (release and debug, for
-      example), that we
-      should select depending on build properties. Prebuilt targets
-      provide a mechanism for that. Jamfile in util/lib2 can contain:
-
+      To link to libraries whose build instructions aren't given in a Jamfile,
+      you need to create <code>lib</code> targets with an appropriate
+      <varname>file</varname> property.  Target alternatives can be used to
+      associate multiple library files with a single conceptual target. For
+      example:
 <programlisting>
+# util/lib2/Jamfile
 lib lib2
     : 
     : &lt;file&gt;lib2_release.a &lt;variant&gt;release
@@ -602,49 +636,61 @@
     ;
 </programlisting>
 
-      This defines two alternatives for target "lib2", and for each
-      one names a prebuilt file. Naturally, there are no sources.
-      Instead, the &lt;file&gt; feature is used to specify the file name.
-      Which alternative is selected depends on properties of dependents.
-      If "app" binary should use "lib2", we can write:
+      This example defines two alternatives for <filename>lib2</filename>, and
+      for each one names a prebuilt file.  Naturally, there are no sources.
+      Instead, the <varname>&lt;file&gt;</varname> feature is used to specify
+      the file name.
+    </para>
+    <para>
+      Once a prebuilt target has been declared, it can be used just like any other target:
 
 <programlisting>
 exe app : app.cpp ../util/lib2//lib2 ;
 </programlisting>
 
-      If we build release version of "app", then it will be linked
-      with "lib2_release.a", and debug version will use "lib2_debug.a".
-      Another important kind of prebuilt targets are system libraries
-      &#x2014; more specifically, libraries which are automatically found
-      by the compiler. E.g. gcc uses "-l" switch for that. Such libraries
-      should be declared almost like regular ones:
+      As with any target, the alternative selected depends on the
+      properties propagated from <filename>lib2</filename>'s dependents.
+      If we build the the release and debug versions of <filename>app</filename> will be linked
+      with <filename>lib2_release.a</filename> and <filename>lib2_debug.a</filename>, respectively.  
 
+    </para>
+
+    <para>
+      System libraries&#x2014;those that are automatically found by
+      the toolset by searching through some set of predetermined
+      paths&#x2014;should be declared almost like regular ones:
+
 <programlisting>
-lib zlib : : &lt;name&gt;z ;
+lib pythonlib : : &lt;name&gt;python22 ;
 </programlisting>
 
-      We again don't specify any sources, but give a name which
-      should be passed to the compiler. In this example, and for gcc
-      compiler, the "-lz" option will be added. Paths where library
-      should be searched can also be specified:
+      We again don't specify any sources, but give a
+      <varname>name</varname> that should be passed to the
+      compiler. If the gcc toolset were used to link an executable
+      target to <filename>pythonlib</filename>, <option>-lpython22</option>
+      would appear in the command line (other compilers may use
+      different options). 
+    </para>
 
+    <para>
+      We can also specify where the toolset should look for the library:
+
 <programlisting>
-lib zlib : : &lt;name&gt;z &lt;search&gt;/opt/lib ;
+lib pythonlib : : &lt;name&gt;python22 &lt;search&gt;/opt/lib ;
 </programlisting>
 
-      And, of course, two variants can be used:
+      And, of course, target alternatives can be used in the usual way:
 
 <programlisting>
-lib zlib : : &lt;name&gt;z &lt;variant&gt;release ;
-lib zlib : : &lt;name&gt;z_d &lt;variant&gt;debug ;
+lib pythonlib : : &lt;name&gt;python22 &lt;variant&gt;release ;
+lib pythonlib : : &lt;name&gt;python22_d &lt;variant&gt;debug ;
 </programlisting>
 
-      Of course, you'll probably never in your life need debug
-      version of zlib, but for other libraries this is quite reasonable.
     </para>
 
-    <para>More advanced use of prebuilt target is described in <ulink
-        url="doc/recipes.html#site_config_targets">recipes</ulink>.</para>
+    <para>A more advanced use of prebuilt targets is described in <xref
+        linkend="bbv2.recipies.site-config"/>.    
+    </para>
 
   </section>
 
@@ -652,7 +698,7 @@
 
 <!--
      Local Variables:
-     mode: xml
+     mode: nxml
      sgml-indent-data:t
      sgml-parent-document:("userman.xml" "chapter")
      sgml-set-face: t

Modified: boost-build/branches/upstream/current/doc/src/userman.xml
===================================================================
--- boost-build/branches/upstream/current/doc/src/userman.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/src/userman.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,7 +3,7 @@
   "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
 
 <part xmlns:xi="http://www.w3.org/2001/XInclude"
-      id="bbv2" last-revision="$Date: 2004/10/21 10:05:15 $">
+      id="bbv2" last-revision="$Date: 2006/07/20 07:19:26 $">
 
   <title>Boost.Build v2 User Manual</title>
 

Deleted: boost-build/branches/upstream/current/doc/tracker.html
===================================================================
--- boost-build/branches/upstream/current/doc/tracker.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/tracker.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,69 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-
-<html>
-  <head>
-    <meta name="generator" content=
-    "HTML Tidy for Linux/x86 (vers 1st April 2002), see www.w3.org">
-    <meta name="generator" content="Microsoft FrontPage 5.0">
-    <meta http-equiv="Content-Type" content=
-    "text/html; charset=windows-1252">
-    <!-- tidy options: &dash;&dash;tidy-mark false -i -wrap 78 !-->
-
-    <title>Boost Build System V2 tracker</title>
-  </head>
-
-  <body bgcolor="#FFFFFF" text="#000000">
-    <img src="../../../../boost.png" alt="boost.png (6897 bytes)" align="center"
-    width="277" height="86"> <a href="http://sourceforge.net"><img src=
-    "http://sourceforge.net/sflogo.php?group_id=7586&amp;type=1" width="88"
-    height="31" border="0" alt="SourceForge.net Logo" align="right"></a> 
-
-    <h1>Boost Build System V2 tracker</h1>
-
-    <p>All bugs, planned features and enhancements for Boost.Build V2 are
-    kept in a online tracker, awailable at <a href=
-    "http://zigzag.cs.msu.su:7814/">http://zigzag.cs.msu.su:7814/</a></p>
-
-    <p>For read only access, please do the following:</p>
-
-    <ol>
-      <li>Point your browser to the above URL.</li>
-
-      <li>Type "anonymous" as username and password.</li>
-
-      <li>To see all issues, go to "Select query" menu, and choose
-      "Active"</li>
-
-      <li>To see issues planned for the next milestone, choose "Next
-      Milestone".</li>
-    </ol>
-
-    <p>If you want to create new issues and add comments, you'd need
-    read-write access. To obtain it, please do the following:</p>
-
-    <ol>
-      <li>Point your browser to the above URL.</li>
-
-      <li>Click on the "create an account" link and follow the
-      instructions.</li>
-
-      <li>Once you've registered and logged in, click "request roles" link
-      and request "Observe" role in "Boost-&gt;Build" module.</li>
-    </ol>
-    <hr>
-
-    <p>&copy; Copyright Vladimir Prus 2003. Permission to copy, use, modify,
-    sell and distribute this document is granted provided this copyright
-    notice appears in all copies. This document is provided "as is" without
-    express or implied warranty, and with no claim as to its suitability for
-    any purpose.</p>
-
-    <p>Revised 
-    <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan
-                                            -->Jule 8, 2003 
-    <!--webbot bot="Timestamp" endspan i-checksum="13972"
-                                            -->
-    </p>
-  </body>
-</html>
-

Added: boost-build/branches/upstream/current/doc/userman.pdf
===================================================================
--- boost-build/branches/upstream/current/doc/userman.pdf	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/doc/userman.pdf	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,4763 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 237 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Garo;9aefl%#46L'fg.:A,<I<]+u+q"GM.7%mr8fVSdiWqsAJ4"XTMrc(!dNF_nXN+;>_=_3Kt@^`=</R;j>k*&pMh;F>1)1R!@$_EQ]79c(]8B^I\";M^VUf!_a9%W-]p:1<0+_KsfL9rP/b>G"tO*5J]/gp-a77gmY?'upGVC4&c?CC2KCQJ(5X`1mh;jVN=b1!'#,He.7h2_P)s&oKE#lO(t9$K]V"hY%(;n48i~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+>>
+endobj
+7 0 obj
+<< /Length 2150 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/l?#uJp'Sc)T/"#104gUgf#r#FB9g?)BREi7Ime1+&0,,sR\equ`8DAX/J?_*o`09GP*VW9G*YBX@"MO"=]c8Z&UIWY at _]m^)37E!13V*i(]]thDOmdTk(rgGE!b])drcpJg=1K52(Od(/EPR8!:oD"h'4"^?f_*nmf9uV8FWEHcX*Uakme81X/rSAZf,+9nh+:Fmn=eAQQYT%hYfPC$CSm;9=WOKq_Lo)Li`<Sb)[HQJh49oE2=aeVqGP;-:9%V9CFf!]g.W<joQWn+l6$WDFDP\<<")Bt+*J8X/Zgq!bc?/:1cb9]#(]%4qa.F/L3kZpf-,+S!YSJ54P.?.G6.;*D=Ui[j<?SW3Ij@;ckl#<-T[fFD=gF<S#JG/-m3CM&El=,+mBADhNP\J.]Jb"g,\#J9GqQ-74X*6U2(;Go^,%\1+5a.^D!HAC8Hg at AnAE9V5Z:m<Nc^9"=ub1M1 at jaF.cQsi^$.n==6[i=_Y4<dj&#>]#K%>N?[aP]99%^5Xj\bk6M-?^,Pj,-"5Z'P_<?j,u8V;bA-VRZ(gpP7-7O<U=,OsNJ,*:"p1=tD+0$cMM-e"?:J4c=\^.`9-U%mfI$_%J^0m*'<K3:'l[WtJ%J`nI)B.&1V#:%O[1,:;.XS$SA1J9q,&e)9=&nXG/?+&[M]2LSY0pV at YoSI17K$MnSS^-LKp]ZhIM]L06#t:-T[OA!eEW"5[/dH"pN-oB(G2<4G\DgAi[tX^G\,MlR(:*,.@^WJ\G<N"rHr$9RPa*$<<:enQq6HZp1`P95pCCqlE%*d!_ZiMu5kBJ=,g.>*LLN9 at LJVi;`k/5X.rHp1l?u"=p2nm4:ts;+748O,6oo]$u%Ch7ZAJD`4b62B\t/!hD#^F^RG;dk(ETO>s#-IBrO`)J&C<Pq:(T2N'f9UU2-TkbMpnFj]-;-h(g65&9el9NlK;SCo"rk_/0(Q>tn<TAGn"p(<gG5bO=7Xf)\0%M1gDThi)ADgSR'XpSa9eY`<GB3<O`JO"G+SRElH,I[.*h-s[*r*t4p&-rF8C?=LTT^mBHGQ(2U1/OBZj$;cNT)SnD5i5#-#2KVK%e]rkW_?&KCUM7pfs/j*"9P,ED,k>t9>N!-(;@.2b at rCcUKWl3\?8McS.u;43Z6XDgYd)sO,1RLpEod/GKQ3dWA_q:SHV62[Xg]:DkK1cO1GT>&Er<Z27RbL"4htkNs'j2>q(HB8'W(W!hH!9$'/]#d]D)$1roL[5p4O2;_)cqYS91nj8I2%lPgT.NIjEge#'7Y%50^sig>45e;$p:2ZGnr`Lr:Ds3W^F2l0^HAp84'Jj>uWV&@RsHc.0/nsAI*4H*eIC&&!0b>k,[dZQ)RKj9e,:-4bu/a6a(`cq9PgRsMQ`pMLK(6Y'"AssL;af$dbal9e,M:*+d5R4JF5:/STa%;g[m9NVi\B^$cQG"*V?;$L(X*4H^a$1FE3k9f)+jSm[qI;I1Bmm6Sf@;k%9jhQ)8f=*qD:`Bs9J,Hj`l&Sp3f-]up`R$fM(]b>QI_>IZR[70$"]Ur:RX_mDi<s\UC70$H6CQT7VG=$SPLLK9/"=BZ6SD3[&]@u8IVL\26T%.hn\DEOsj2U=q9R3F80V\I0Pg]Yk<=mUE"0/T8!h__h!;m]1fsp'"u1^fB at RHfF+H3q+.ZP`lVImBd1PI9L,7h2NA"_.)')5R4U%%0di_TdE>OUmiFOBCeSn1-T at JnpEki0n*ReV9JF=LB1.MF)CJjpG7,$g8OE\PF-g_:Ie5aG=M8R?mWr=dEd?1'CR4-".qog3h1D-.<VOq`hJQ%bY?MOu1Z;)2Iuf:?ZUE-h`V,,R",Grdi:=PkL,)E`>,>fe9J&8&90_K(A2hY4dT%9]kj-HmMkkW`YPZ$?-q'"l]cb[i;QCbQrd0qL^PhOm^WU,rPDR+7P[+)qEe@"#Q'<P:D7=MU.7C!D&EkL9Xfr5fK^7=U:0 at M.<ouGARm7\X+UA4^GB?sU-H'lRH_:%4Ih%aeccrJjLl[!O+;!c7l*,+q_(EN8q_&B1$5`FJl%)*m,=iXnPd!sm-,1U&+;!c'BO;1?9h-9pShhHG.K)dk2fM1V<WTBJURZGuAop'#BDs,QBE$X8,t=bT:K[cXET:7feN[T@^\m"%\]:c<!I$ueQf%K-5J#>@PQ~>
+endstream
+endobj
+8 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 7 0 R
+/Annots 9 0 R
+>>
+endobj
+9 0 obj
+[
+10 0 R
+12 0 R
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+46 0 R
+48 0 R
+50 0 R
+52 0 R
+54 0 R
+56 0 R
+58 0 R
+60 0 R
+62 0 R
+64 0 R
+66 0 R
+68 0 R
+70 0 R
+72 0 R
+74 0 R
+76 0 R
+78 0 R
+80 0 R
+82 0 R
+84 0 R
+86 0 R
+88 0 R
+90 0 R
+92 0 R
+94 0 R
+96 0 R
+98 0 R
+]
+endobj
+10 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 655.001 176.44 645.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 11 0 R
+/H /I
+>>
+endobj
+12 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 644.001 117.0 634.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 633.001 104.22 623.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 622.001 146.55 612.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 611.001 136.55 601.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 600.001 172.92 590.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 589.001 171.81 579.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 578.001 196.26 568.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 567.001 205.44 557.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 556.001 156.83 546.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 545.001 152.82 535.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 534.001 152.11 524.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 523.001 162.94 513.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 512.001 169.33 502.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 501.001 172.67 491.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 490.001 157.94 480.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 479.001 218.21 469.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 468.001 141.15 458.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 457.001 145.44 447.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+48 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 446.001 145.71 436.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+50 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 435.001 179.87 425.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+52 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 424.001 129.88 414.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+54 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 413.001 164.32 403.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+56 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 402.001 162.39 392.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+58 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 391.001 145.57 381.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+60 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 380.001 177.37 370.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 369.001 162.94 359.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 358.001 150.72 348.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 347.001 141.0 337.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+68 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 336.001 139.87 326.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+70 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 325.001 185.88 315.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+72 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 314.001 381.45 304.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+74 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 303.001 228.75 293.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+76 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 292.001 227.08 282.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 77 0 R
+/H /I
+>>
+endobj
+78 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 281.001 263.47 271.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 79 0 R
+/H /I
+>>
+endobj
+80 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 270.001 348.72 260.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 81 0 R
+/H /I
+>>
+endobj
+82 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 259.001 244.03 249.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+84 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 248.001 280.13 238.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 85 0 R
+/H /I
+>>
+endobj
+86 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 237.001 396.68 227.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+88 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 226.001 199.04 216.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+90 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 215.001 194.49 205.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 91 0 R
+/H /I
+>>
+endobj
+92 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 204.001 135.43 194.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 93 0 R
+/H /I
+>>
+endobj
+94 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 193.001 157.1 183.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 95 0 R
+/H /I
+>>
+endobj
+96 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 182.001 155.99 172.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 97 0 R
+/H /I
+>>
+endobj
+98 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.0 171.001 125.99 161.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 99 0 R
+/H /I
+>>
+endobj
+100 0 obj
+<< /Length 1008 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasao968i1&AJ$CE,.5h:q`!omUM^B3odZtBm[WNNeh9*81:)-qdP6&Y3\+g?1]`8le>]QZ(/N-*0VeEGoi12AepJ`=\&VcKnMlO+B`$t/7E)",JS02W5C3tM\r3X*Y]L&d0epJ'9`ljm'($&b'k]VI7sR&j]CJ+-"11$)<]XlQI(^.KB)ig2%n>hgq9Tbh6ZVGZ1#%i)q?l_%oj.kp^4ik;Os\C?IhC#7g/NQ9*a;R?'i)"h_pK1M^/R.!f_i6COfBrKgE0r^UZk*jt3m5WtTR-)08B8)q$Eab?h5Mo(i^PBb4*>)l,s:dpK-LT]D*=KZfY#?FNmnQ;):UPTG7`\4<>FE@$GqM.r)[Mr-VDHMt+(\<a/*P#i?o1leddlHT7.7,u\"Y?DKX/,8rE`2pb($Pk(+1^GB]]Pi(pALZbJoUrGIf*e$:1eVfmpPimE\pc1*UrXupB?=L/>oZQd/^7s@)=`5=D?_didJt:Hp>6kk".4+=KrREk>*&BZH5*3IK=tZXf=iNUQ#%L(PTV//\c\o+1Q3 at M>Ld0fr7+DV_,bud1b>m/6M=/kC=Q*sH?YMF..iC8e1tYnc*54L;OTnCPVNb`*!AP1)r/V1-T_fh9OYRPbND;66WZ2t4B/VfYfQH+LF&TZk'1I="E8[h)KD::6-1G^r84<g7sab.ladQ-[(+T%99/C!$#uICUkT&D at 7mPVWR?GKesB!D!qS_VM5'ctg?loR[Kf>T)dsMF>@QR1`^oL9J8`nek,0(=^c3_EHKmqCN3o($ftJ67"+0aa?+q)B>^$/ss6msT!';fKf6)_=Q:EG`HJiSOIP"Y&Vd82;bALjsQ6k,a8l0cZaD1(p0o-$;XgghO]n8Lo\%OcMC!&Q_j5FP?ngESqV;W>VS_o*'6rSiB*Zlf6G&kY:C,R8iYoc.]B2A5LB-UtZ85oCl0Uh.-'kB,t2Hq_P67fAP$>\j8b;Xa1FW0E);=N9lm*`O!ii=-\+?"7]?]FO!f\?3,`85]@~>
+endstream
+endobj
+101 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 100 0 R
+/Annots 102 0 R
+>>
+endobj
+102 0 obj
+[
+103 0 R
+104 0 R
+105 0 R
+106 0 R
+107 0 R
+108 0 R
+109 0 R
+111 0 R
+112 0 R
+]
+endobj
+103 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 472.55 671.009 505.34 661.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+104 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 143.94 660.009 225.32 650.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+105 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 452.65 660.009 498.77 650.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+106 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 472.09 639.009 541.24 629.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+107 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 628.009 87.56 618.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+108 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 342.412 607.009 388.532 597.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+109 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 475.252 607.009 544.682 597.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+111 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 596.009 140.05 586.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+112 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 261.834 575.009 307.124 565.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://boost.org/more/mailing_lists.htm#jamboost)
+/S /URI >>
+/H /I
+>>
+endobj
+113 0 obj
+<< /Length 3318 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat<CfokC(nU8,<Dr.Ub_=0XYV]@jBf&c6Z[B`^[O)'ZJ+Gm]E+nLe-o(?_&6)'j(Pb^n^kU%3]o\G%heouULhu.h5Xa[q[rK!5Og9*b4==`,473&Ij/)0Y(R'1<+/uqcls1!DZh`^tsY6$tjG<ipXZ[j*np'Wjs%cc+9\GH/`rH at kSCAh($&0\kDfl&7mOmq0,-\"t#I(O]D!`(fTl:l[tC''uioP:b!'h+DYPa$2]:chYikgq#*H2KZQRMURW?E76NkrMPh,^KA]0ZW6)B16ES?$.S%PTEei1<,K:C+/P;K.P]%MOoDoXUeR>B587SI.Afr[W%NRR#oIZ'!!#RSs68?&Jq!]\GiR3KY:!`,0cUZ'J5Sg_:LXG4<O_3?)/?>af>H6*QKaC/s?XmUSk&f9F8g!X6MIp1j,Z&T^_([50AOpREUj6/=ma"_iZfnA]@[:kTX/(VLIg_r]ufr_UYVb?XubE5:,^[DCC=o#:$QF)106hIDi\X,F0Y8?6SV:g6$;1.\<([h\'bUCarR$KXLpb2M2_eS5f\_nk'L5&?o^2[pGEN14Qtbf\Z4ID8rTMS6c\Ih5$k(<2"_91K;l^/J[/!.gWAGFU_YD(Sh9UM5+*$(BikEXOZPY#Hu;'YtNHF.UP\$S2s:OZ*%/&bCf,*_ at 7l]):0Ud*Up$Xl6Il0MM%!Y_7F-'!("^iS!df/S[LPH[]apl?VUadC<,ZXXgkCO:5Fto/%4\gZ&!4Wd1W<_.20<k*SJima+b\CpXr]Ch(oos$>#/EX8'.rk.;35;ftR4E;Qu3P<A/Q#6nR3SS^WY9%=Us"<],d4e&5&Ck/M]He`b_H(g%qLbVR<pE_hKY0-C*p1t=&0jA%e]q,loW.B."oX\NfimJ\.Y5c9 at n>[BRO"T?0&PMN?;iQL&W?4r&5:&f5PI9ASoOEKZ$ZZqYjA+]U&B,j_6<s54;:XT_$2X!2:tqEFliEp5U%hb4cj53CY`5)cn+DLhasmSB82BA$/dCNs"?k%l#D3j2,9hIn6RXZVP3XMZ at BNDM4`@)TL"J#plg]26I3S"ukAsuYHn$>tL=3q^5Y;WQ)"+b!*6ZielI3"I0%P6K*2]#5po^$+9'Sd1f0GJlODb]_B=`ga&7bmC4d-1SS`qm!_I16Q*J=<D!T/6gP]<6POq'Q_`6]'8\OANg[O[jjk53r'223jt_2K?s=)"C-WW$#DT.Z`%lG9X3jmuaoe&-i"N^XqKA2An+LKP@<Uik&KG?WIX!`4ZEq-oE>n1ED%j%.+-<\H/(H0ojtY\fS1V[`DZji.!BeC8KmB:uRU7)DqoEc4-Mpqs at aWF\q at 5=?1iA/sp@!.eKf$"[420Gk6VE)L8<CiZ<BE,'*K&0cQUm"Lbu$j[(n$)<'k/5K/hPXR1JrbKY,=FiNMKWQ4!p:(bf<5$1iQ`d`8/SB#u4l1C*Xp/S;f-h'CL2QP:NWiH%"ao&VoQdu>[UtN;$r<7UaSta!V@=@2N%79TF^r-]+1H5-dVT8BID>YD\<mpsd0?5B]_s`4%,nNlkA6&R,6WINl5fuIecZ%KfC8TL0Vc/_cuBnRVU@=aJt;VLW=/iL&j]pddOUH";p\iG'A!fgmKm`I`^aiE&_IYT$46T08P)*U0$mNg&Mdud.*""sEnl%VNH*>]C`@tc_b&u?(=J**L3uWKArOQ64rfT0n%+`N.E$h,mtZW<LBb.D-:V&>E?%KU.NumL$h$)><MroYdG,Xn1#4Q9llrWih>u:7O<>G02l,or+\4iU1p-!p#=g-S;=%&%&]"4MSO*^aCee#lA=7D at 9AB;HK1nmA"3o3%R3FVL%_A1_+kM"2_\r=4h>2%k9/1'O,P\]3N\?XD,9WhCNkJu*VJ=P'1qHTM'09jNFY-G:fhHJ27"B:7kM.a!Z0`u7j9R-o1_1+0=]X.$!GJGZFQ<r!?PjHa?QN06cWj';m1nI16$k3LgV/LAfn-QT/?m?:NYt'rq0SFNW`Fg1a:HU88(uBa><^PRChZSBRdT9+FMB?Hn'pcZ5#bF.!q.d-nVeP\po5)<@Z^0?^#%CF_!8\.]6"?k2T0mTB6\K3M#0p^]56B_13"un-F4L4d>i5%<\jOrq_t4r-UD.X8P;XL3hi4>0ZF/8iIlT2.d7)i.g\gP4T]o;.?jH8W7>OAe6*T=6ZOO/kb'NL&q_cW"a[<`P"tg*PY"W"Ke<enj%1!j]&$IQR3_nrip/sG>X"sSnAY()m=`iUqj_u!l"[-N4r^iV"66,g6h^75#dFaK7%ptFYZ#h-:&<*1X_>nTC\+T0M7S`+\`PM1"(Qg:^eDA9F.ii&oS/gR_8.>`f`V at f`0H(OLO:2S/$MWU0)_U#bBYanNaOiL8%f<5TPF_J,6:WYKpHW^CnqpZ2/NT_2P;#XeNEiB+Zc2Br#jpFb*V16b2qYLJta?j`ct\j/gof4K1m*BB\,&)B6fS1*PUTo,0"\sR0lGskY+X:D;Pq6BC4phH`'f6V=\Y`>:d^?'>u]\D,^&m>*,Q`Qa53^rP5(u9QKuAFNNeM$2<g9aAdP)@AWHAF"AfpL"Z\;4a*3!cWA:JE7Y[>^"o5_]Gne$l?dV.^V(c=nJHi6JN at 3&Je025&0gV89`q8n6$Pa4WZ&IM%OXHsrnZjES-Y"`.-1<`/>$bk#9Kf-T-nX=Ce4\V7agi]6YL,YR;0h=FVu;17_dj)Lkh9)*Ff#q`q:RonU0.As(jsJ9;P4pl$lp85lENX/oG>>_2$S&jt[]L?uqK8mA1I%.r[HW?3NRr at .gY>=acQ at EhM'R_b#;K?:U66PhQcWA$:G<HBVo^"CJ%YAJd)BN5LH^Pf:n&5*Hr0i2rd7p%e"/2Vg/7fOI(TT0h?oJJ%1W[nbIS?8ID"\^;>J,h*mAk/j!ehtf[6WE.D?5uGhac@!((F^8F0r(+<0+1`obC`(:`YD4!^=m4q\SJ/+=PKr.?EW!7cYk:r->hVIZkH%WOHf[eg'C$]`+ZE='5h:W;cSg4Jq!li0o@'o3J,]H=NP;nQrC5k+9l at 89<8Q-s?N^\YH+O6ss.qfK%5goE/^!]+rZ*+$?3GSIhZ+i!.c-lk*t,Z"?_S`4rZ.]1P)oGo^DeQ>_Ku&#(j\3HqI52G^;r`Z>0<Wfr$Q*T4+r&,^JC</+n7nX71g>?pWn\O/skGY;1*SBr-kFXaLRt1^nh2M2$WWsdFJR`Xh(jul6QH`%:8GT;r5cQLG_dDIQXKTCeaQ,<fc&LJhJk=:6 at bIi@fMgrkI.c:;>T<!nt/WI at .HN<6Eb:r4?e=\L$n%Mc*gPq_Hia0=$!f'(Os4^4"p*k<$.7F_i-V.Je6rc`H^[7f-6Z~>
+endstream
+endobj
+114 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 113 0 R
+/Annots 115 0 R
+>>
+endobj
+115 0 obj
+[
+116 0 R
+117 0 R
+118 0 R
+119 0 R
+120 0 R
+121 0 R
+122 0 R
+123 0 R
+124 0 R
+125 0 R
+]
+endobj
+116 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 359.42 671.009 459.98 661.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041)
+/S /URI >>
+/H /I
+>>
+endobj
+117 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 483.286 671.009 529.676 661.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://sourceforge.net/cvs/?group_id=7586)
+/S /URI >>
+/H /I
+>>
+endobj
+118 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 445.488 62.4 484.808 54.4 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041)
+/S /URI >>
+/H /I
+>>
+endobj
+119 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 147.83 649.009 193.95 639.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041)
+/S /URI >>
+/H /I
+>>
+endobj
+120 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 78.742 62.4 156.094 54.4 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=80982)
+/S /URI >>
+/H /I
+>>
+endobj
+121 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 164.686 618.009 206.636 608.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (../../tools/build/jam_src/index.html)
+/S /URI >>
+/H /I
+>>
+endobj
+122 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 296.545 618.009 349.025 608.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.perforce.com/jam/jam.html)
+/S /URI >>
+/H /I
+>>
+endobj
+123 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 206.312 607.009 339.932 597.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=72941)
+/S /URI >>
+/H /I
+>>
+endobj
+124 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 523.484 596.009 544.044 586.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (../../tools/build/jam_src/index.html#building_bjam)
+/S /URI >>
+/H /I
+>>
+endobj
+125 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 585.009 168.65 575.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (../../tools/build/jam_src/index.html#building_bjam)
+/S /URI >>
+/H /I
+>>
+endobj
+126 0 obj
+<< /Length 566 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasIe95gRZ&AI`dHq^?<lNcQl7GX5P%kCXHg-aDC'27F%E,-Lprr&9NYan0M>\;"Iq4#^J9U5pE^LD^*6m+,b"Ps1gOSLSdM2B3-5TGEh"tuI\0S<U!$M$Cc_\UHV5G^&/W/(.l&C#f_Y7R'DaB7LhG43(M+i,=S;3ZA<fl"V.8Q&*q7Q,nq&;:RX>1M3ac11ZRZu?&smLIN.VGu;Q[uae[4/J!5\e\a(27b9&7MJbcX&Fa>]7dh"&K at GI,##WgY%r\n0.TPt<iU3U4%HStSuV1%%l:cJngMHbgKCoum>hhsKf<\Ci..pmF_%fT<]F6oUU:J,o"OC^NTA79C(ORl6J0 at 1h#lEI/9E&K="\Iq*E@$K"!:cGV^,R_(Y-a39<VO>."uC#^#eY%:680eaP(kNaLq/YWp<eE)fms'CkVK2B.$\hrCP(@o;Yt394E at Z3:XNH9I1kP7<.?-meKsNHeoW)oAJrA@&CmU at KQo]o7mFS"b7A]%%`)&^XtbZZJ>8OGr[c&V^O[Lpt`<JOhtb)970LI_0TkP)C\,)`#49f9Zl]brrGdN0T5~>
+endstream
+endobj
+127 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 126 0 R
+/Annots 128 0 R
+>>
+endobj
+128 0 obj
+[
+129 0 R
+]
+endobj
+129 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 119.496 698.0 180.066 688.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (../../tools/build)
+/S /URI >>
+/H /I
+>>
+endobj
+130 0 obj
+<< /Length 2560 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm==c_T$&q9:VTssXoDN54l8s"gF,_Kp;#SNqa4=#3F-+_?X/39$F*rl,%G_i. at bHnO5"raM)l<plWO7`%e_tss9&7\ZR8apbF#_U`a-j\cb$M#$f5us3u_g1`l$@[JP)1!nPC#0#C"tr1jd1GD22N%??Bo55^.'Xk-e*u2*i$lrm<9 at VT#EKZRRX3DG##PY($S=r+MDW`#NtbP=Bnk'oZ"'\Q6bD2qc at UPAQ,DgH`1`b_ms=UgYgKIZ<hsjDhKHRL>SX>]/Afi7,Knf_qf:YDP%:MII/iFY1A^qJ3(Ds,`mQSX8!9daFNjriNf,En/pIt2XP\07VGGp=+5a$((:m,B]j,!9NZL at OYP+C:`rg+UV(0nM[,)'WPX-WA^8W3r8T<O)`#oO_Pg6)sL)RtBm0RR?Y;^:@7Ae&&C>+?gpFMOYjA&hJle*4VS^3Vpc+RX^ZP#^HcM)7!9J$[Y0dJjHO-]'lEbdM.1>/@85Fcq`^@K)Q.Ub23F%;+[*$)-JWIX8AmAjm.II3,-Hsf8VO='e>5/X6Y/pnYomo]J,s,rgn4S!%fV`DUcm"]-OOdrkc^.;(d at UJ97R`8Oflft#V7.9Pl>$,?^]5N!,Kc$)boS"DrWhCeeQ1H;L at 1#@b=8[/PN=*%)Og_\$]^gZ^F>S_QR?r0;=-\:prCrqS(4sVrIWjMJl%'7;^N2F4_/]=25\"_ZbE+`!((>c_*R-h=Mkd97rg1pqjVA_#X>cgekLTTdP0W;EN`V)m-L'nuPGBTYI>)l(4^6(qX?E!<pX:Z3gV&s:VJQU=QaGR2E1%kc2#P:=)1r"Q^bj(g2/Sg,Ffm0&Z=Ok6I%BlBE*cUtP+F]A`gJ_&@YY%BOk-qBB+Uioc>l!aT2i3QlA;:=K-",8/\S(\L!k.f="`hqQ2Pfm4Ldq!gns-_1)-!b=Tjd58:%00X2FUH9jA_$M<8YDG<TeYjF!>C8(t#i(tt9V[-NO8]n#UoG!UGo>NEQr&+.-#3CH+)[%/d>=-WRo3 at u#VT,AtuX]q%U2@!f&26&[F;2#MB<2;!e?&XE?KZ5+o)K$@))PK"^e_eCK;4/u2mS81h0ac*n;a:8rNI;eaga]5E^"A,te7i/Tk5[#rVjcZZ*LHgKSS1gLY#/<eLcO#R2+tuO*9eE3j_0)H/9NnM$1('CYP(!:l$q=Y')5hrZaL+ at 0Xbgo;\s<XGG0o#4Vi)5#5bi&'&3\a;2X?ep8)m*<&Ve=:2=AX^G9I>QFo3'8+Pe=Uk-Ni?S+Xj=,593nO9Lt3(?=LY:Ol*I,ukF43)iK0[0*4qc1D^4H_8$3qd=A&]2!RdJ=g*"9dUL0J(+,#"d0;bb/(_iHpcuMB5P<SL$.$e<C0?RW<gRS*.AV;9[IDM at 75JBAV42,MojWf/C)a#?Znh+.^#HQpMQ at Ul[G_qp!8!5Z(=L2eK:][W1;F:=gU<?n9K7b0$\re8RI_J)ErY&<Qg)Q[!hVTJ*\PF5%NB!62mjeaek_;p1;J6rRaTF\H4fc0:e.V at RH?iXPj&gsfkYVA21sb0`Sp/+)G<8osW=>S.2N4*sg2 at jE[eBrH[uFE<;61i#c?88\&iS*TK8SE+O.?- at s>%`#>47,K%=DcCfY9Kj80VZ9j5?i/Z4NllSiK^L-c$jW:X=\U<jTJ(sk'X#c^72F2(^3Qb*D^BA(FT*idR>RT`mU!Io!)f$F%S`PK!M-"nL7PjlO-`q?/*IlA6(r4P9k9-'5#WKW/Zhq"k>f/XYh)03jQXGE#)UMd.m at gu`;N(J&^Om<7NA;iOh7%!@cd^@8M_Ct2_ at QK^NtKj!#\Q%m>p:H<B#&/0ia=81rYj<"Y/Z]3?+BghuRMjV/PW!a/;4>mXL1(=O+kWD322!\rKicS\o>K:SJ+\!I/A982G)9QC!\e08-Fc&#tmC6D#Hl+Dp#=i!@4\_UgBgjJfb_p:T)L$^Ujqo$pQ?oCDC\ZIN)eKab!(658Z79(aT"A')?L#'klMc+Mlt at F-!X.%Nqc/K6CX+VSH#LVoDi^^CM^ACpIWNGOGDfUT&4A^@A^?+5tS!B7pEQW*WDb,E-TMh(h92K1V0KKn<r`gJO>XPgR_3rUds5pZk2Z'P&mH$$+Eb1_#tqPA&C+*tZX37?G3oE;jI]ZhKZE<=$fr!>ZN[VN6i_c(&O&VBuk25oq>2!aLe"iJgQ;H)X=INuj$=f)B+:\qH#\VGpP3dM:9A;sK.%m.>AU$uUU[n6\1;Me:Q<f\K;qM+t1hWcVa/f`[1SNS9H(*-RY$cCFg]-C<gVDO(g\8(AO`^sO1=H5e@:[0j\Ec&F2\^R_`'1^qA3U12\@<Ho&F$3I?I9PUcL%BWq=WpfcY3/9EM(<S?oCD!&e*H!^hp_8:"X)eMY.HQ+g>.;OT63^]p>sd_E?COf;1XUmeDg1&:VQ(2("1/S=lE6/NAp7tNNAVceS3GK#&U4/h#e"kehGB.Defg"q"UuXf&!CF9Y,/?@Ia<>_r(#$<+Q6U.h-GUNjB:g":YhO^H=Wng]iWr/l8>aqbE6jr-Y&%ONX,#q<#$RhK7#RrV7Q:I[VCc?('77&%fP*a8~>
+endstream
+endobj
+131 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 130 0 R
+>>
+endobj
+132 0 obj
+<< /Length 2931 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat<C?'"#(mX9P<JU?$T?q02FO6pe80!9P<JHL5M!.F)'5tR<Z>K9KMH*[8?8"6eP3KCH5Rn8MP8b#aQa48*%X+rn]I.,r'^]!TrhU]k:k'MBlMTe/.5o^iBncF&"HbV]@pYk/tiV?F3V1;\8J9q5,!3ttr8=nooa9lj.oR;-+]^pUH<^.&ZF'NY7B)UGN,uKP8IhC\2pCnr<i8:O:!Eua*AQ)gOL0'Ym>50BPUJHKB:(jSqP`k.>;keut0bG]#-^++"Vg/PWUEi(Ijs6`P7;KH]m2b.Dc1/m at m8I$9"O!bim7D-:>tH>+Qg/N_gIn[DQhNu-^qV%4)R(bXM0Gor;pCB?&/J>hGbUGl_pUHZ+OJn-YIs/=?'@_YM_sDXYU!</ZQ]_s!\#V8gSI&b.#$3V6Nm_"Uj`q4TQ2Hh at bpF<G0)P+"M$mp%U?hq78_>s3(i`'<EQI?U:*m$)rB6_mkB`(>e'@+5P*oe3$F[303iM>qR,#G5!iGb0fks35'JRjQkNm=N<F*EWu6'T`<*%_CBlL>0*`jI>;eQ0\9Qlo*hdLOGic6l[9>VH+D$BsUOA9XaSF=V$]$J6GcJ^BEnHP2>rSt4qlZZ3X1#:[J^^H24Rk/3AZ:o5Z:. at U#akAb4j,*r_2<j at _c,h2eCmY>9QZ4Har9hH=mnR3]:HnNcMc7!NpEQW5;],g\spYBbG)al$u$>6<2a,lYQ12hZ-U+?S%?0nFY0IS7-j'a:e at 5hS8]CKMU9(bV;U9i]HRUbc9S<W-Z3EJ]i$9$+M31ON^DY`jec:g6gVjpaCC!!4![dplsnMOMLFj6MC<p+.jFLaCqG[o4V7snOf.6GV':q!DFL["Fg2c(jVljpk'4f<YtCD+[\Hjj`X?Ep%"'r`H]T,u^N6+Y at Sma">L@>!H#i43h,.C?CqJY:l'h+q2'%\;nlDah.t%QRf1?W'di2[r0d)nSPfNq/K_\V=a,mdj0L<Sn^ORB(8>(XLrL`iu/;c>D8A23X='Y0I\tU^O3.`ZfpW at KGJn,%ea%mj(R]*]RZ2gHs5+e?782$jbN$bOkZ_ECMP"!=A,`T"n(0n at J"NQj<22YOC7'7m&d?mHXd?4mWLnLJTH0TG7K9f^o'CWTBN2%`$L-sTgmIi at Q+E<Ru>tp5[5]$T^Q51=eJqS"rUFQk*<`;(5^)u-_n9]H8a@?W(48W8A$Zp#)a\Lh'-H#+(Zhrbln\>-s+kXluoo56+:.eBIQ!5s(7Q'c-nnpA'`,RPPj.$%r\!>;j3>?k9]"W,7<4IP!EU$F^JIk*`SU59t<RVL#Sd*9pBoFpT7d0hF^V-/[4r7MGHi"(GZn?-sSP^W:g!\pd1"k<5-6<TUR_53?CFeNf(P9uc6UEdSfK^<J9s)g)('am-$#eOo^-!uLT#C%45OkLbR\`7Z"/s$gdEAI0DN7^i!tE<t/I;8uAL6&#MrJ8)Aq2bhEq&$J*Go*0#ZFe]gt.g`9h8sY&#G at mD@UP5\`NKmA at 9?>2bJ.M:XeKAN0Xp(MN.msl<WTH=VMa3P/Q2G+(`-b]'[p&(.,N9d;A9J#Jmm$LcsDIJiXk_W#L"%ULD(h$d]5;W`7kPT2+Rf7-fm&]B/NJBJm'?&8$A5-(*'KH#t?jiU&s8$=KM:P0i#Mg#DF\EVgK94cI54cu1nV`l8$Jku;^,(Dub%7Uo>i)N at f2#jEUoJ>oeS2U!TgTe"_cfsHE5B0Ko^s66P/KDP[$NTqY&B:_N9f/f;9J0dXVd>*1VX at u6n08<V_^q;R6Dim(k>U1Xq6Ks(_78K$*Tb/8)39IrkSr4_uhmgaujSL0&7"S^&W]<jSXfAOp2.QiDcPf]%7D%6j^rNn(/SU;PV]2n]Edo3a"mrrs.'e1UD$8D&(pB(?(G`QC6rc)X22ZJunQ?E:P4oUk[Q0mjM.4gp\L.0N:1<%_qpCA\dES=dIs^N3<R1/oHkq_8r8q=X*>\VGY#kXL&G:Wh$:mEjlB4tjbhmb5qT)!i8C-3]@HjOe4^(sCZ3JU6"fCIB=Js&,Pdqc"cqLb?Z9%Rbh4Lc2_'Gj%6">B!h2oi+)(V1O15N/9!*IP4$(m^=Cj7FTDQS'EOpqmAV at 85hHHVc]GfS>.`k"#s'[/BFEEg5e(<PqgVMmIp,s?oOZLB!6<:_p^gU3SDncJq':!.KL(n$cl6!_IrL=aOX(cI?k3)(32>jkmeSJ;%i7uZiZm6SH9s&cq1c4^DQKX7oihkaKn'j#L<A:4[$hC5#cYWNG!&gu;g/$@MPIJ%Wjo57+LmE7R=V35(DqR"MNi7!WGCHUd]B`nOPrYi$k:No`4*'aUsOdX;$WgQ)VjX]$bN1$LpkH?n!!.lSgd-[^&B'=rI'R_""pSk1'@El'DFnN;E6A5)HN[XY"MC=7?C-m&,#Y07_^BjLRi;F%VITT17ko2i at NT7:Sb- at S>m[\Mt"=t%'A2U13^2rQm(^51+mVt`&c)?1/YQ$F98L5:5*M!D'NWQea)EA=rl#Gr)r.LoG/+la!_PL02o1t2ak;=8ul::7<gY7X?[p>W$\Iso[Nm*)>1hQiGP-?n4]5./r\&.@>(.Xaf+!^Kb3Bp\dr()JP561fB*%[t=Y(KR2QPR9%1)6%u<aZ;m&@S\8/B%orlBu>$X;g at Tjf(Ss2%jP(Hlg<DAl16bWicP`lJe`Dmf0/T'lYahlMY/2>VO\IF$YRH51Ft at QEXGjk-F4IU=Xj;)R!Ym4$ff90"@L`_ at WM;?((K>7,3l]>rqOJ#nu<C9m>,Thu2!PBA*9**d+Hm%Q"G!84r\X=$$`FBs7D]BTD(t%g/5Grj at l<4TCE'\%`H3ZJ9;G*@7?h9p>KuB0V">/c:DC=mKE-p(-pS!T\gMMpq[g!?[o/n94LAKNXdVEGiMOs%DogY:ikOXQXk2_)*_5bE9X*75MPCG8\YCDKB"bp`s=RhCu9`rXY^E$#9~>
+endstream
+endobj
+133 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 132 0 R
+/Annots 134 0 R
+>>
+endobj
+134 0 obj
+[
+135 0 R
+137 0 R
+138 0 R
+]
+endobj
+135 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 277.23 524.56 451.35 514.56 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+137 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 380.804 441.121 538.534 431.121 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+138 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 90.552 71.2 213.192 63.2 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 139 0 R
+/H /I
+>>
+endobj
+140 0 obj
+<< /Length 2908 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatTK?'"$SnU5n at hQi'B\Iq>Z3%YJJd9L_nd^6LfnrO;Wg7m1mA^QY$gN1^`T:nf46WoQ]A02SUd0r%*):"THr,VQ!bM@)\@IVUTT770aTEm;F_B=o]3XZE``7P'T5m5O&_5FpFgc`F-4afkQ'G)oZi-r:rJ2n#^_k,s8b1=DP+o(l)4p8V'0Ah!G\Y1*Y'2?Y@&uUKX#@<rCJe_!HG]CJ3]KOf>EL:rQQ4DUSpT-Q:\s>c.W^hiGH+Om#KA/Pm*5mE>=LAJj8G'JRD-"\\r at 56m6QGrd&9pJD1dEK)>%,Ut;A9UiV)80ZcK()EZu%BRVcGYDR\@VL,ksZ6(0SJs"#l]Ph6)AY*%A?Q6qBlb)<H`/HAscJf%>nd<7J`kO'[t9n`Wf!75g[k-d=)sm631*.:Tag[3,jW;cue`O<[-9*FciG5)QJt8ZYqL#5j"E>5WQ,[5`uBSPe`C[JL+J`b\B#\TbV[3t(>0JX6*_]IK6@=K`%+Q[@)59j!pEH,r5l#;d]o^/AGc-.H5DIiI"jWlQs*hI2iVpYSP>o6S$8qU/ZS3!HITRDh@@7TM7e8.PLX[0,:)=.b0K<E5V2ZrL*N$W2-!ZoIT0+-'oVkPHR$2N_2E/U&2[?kKU:OpH(An#6ollFiL#.k6=&<iTlUp\]Qe,>7R:?pBrIKVcCH@"DL\G!UliNA%eJ+->^D=Ctq);<l6Wo2.i1d4?1VL*7#o94#@>+15+&f^NL+m4TYMD(ZY98(ED-Q.l''_8L/Cl(dBsYC>Msr-c5JXBO^q\.?$U0ICoj'4ESS3\Cfn??"D'KTRL)LZgm-`nE8?\JJ]69]R1XVBLd=+t\.1'WjqF7fFUMZ%!-amd*20;&;<9a0<mDfZD:S8qYb=B'p_JM`[k%poMM7Lfb3p4<_Q$bpr=9O[0_ENm;5LmY*o[BXXWbG_HW.5U>6q$D5)>Z at 0/q^]9RE7s]P#m-*+T=YjSM?JE*n'ajQ`1^LG"H04PB2i>EhUR5\)'SA)/1!fP-#,hZ\d'S^sLe/ZbEo18]3%%;;Ho at N1(\;#A=`(h!'mG[h4C1sYX`l\(R0kCjHeuWe9rbXJlg7IfmK4dI?WN@[e^\HMH'_cJ$9kYTfI9A-n$77\.*ho'WoRf8C;7J`KdB;ad^0P>lM*3!1Y5'=!r!oM/^aSG.:P7CZP7mlX^$;:S&/g4n3:8b2IZe]c\Z6/ECSFhm$bLC=-OSWan6NR57&^9a%&C4lRr8<;`:nrIn.AEU30oGE0+m5#:p#hm<.>=HYR+P<^ILC4:/AJl--/nKI);+;l\Y&27"csFtpn.In$o5S3eNh:QXJ,>e<=eOH`MAi2L/&CS]e>W\@a,cBi at qKk<%3C,LVt%bj at V=h$k^0#Jnl>2A#0a]+_JQTW3'pailOe0"d7X!i at HqWCI&`S_F=7RnER&;6g77$5eAQhn7[;NbYVV%U"f:@=@CQ].!^_(X#c%_jEVG&V,V/n@;2A$USeB-^,?+t^8q$+T4<Eljg^phlIoOOiY$h7#soTo]n82X\!.LP%!#D\3>fUp?p&8g%k-P>&'Y>KEhs2/HFB?,VZ5PX2E\]=!-fG0--\4j-E1l$qEVXp3U<`-0N$\JDep,[s&<I%+d:*qcJKqXC8N9 at u1_BH85C-C(/oP\B1MZ-0Kf1)pG#-F^CjJV@>4DI=X43+nqM:.Z(FMR\*I)2fX+-6CcJ0uP3(ZY7"pPu<EhgQ%YW45$I at -@@l"#1cCk'+fj%)T_=DWKA3lC`d;[<3*"h`[CB,2WFoREuXL*9<g6J#UCpJPT(emBP#-CO36rWkDB8EVFni0>V0IMR#)Xd-EI?p at d&kT\lbD3,jlUXE+7Ms8D\&!,DNIrO+2l_ at _3`0NbHelX*K-_hsG0$n1ii(ZM%.mp$&?F#lE!TDJnP-DBl\c5';[`3c&X$K<SrY1SIES'RNi+F5bN,o:s.HH,eI`C_r(S5@@!eK.,M*lkZpK$tYnUZVF9)3*4UT2e(S6V.-CPNGa$Ib`Mj!<nm1ELqc1AeNl=2m8_V!Q)Yc4/S>K\5TQKU:->H18W@$cJ at 5@>d&dUW(,Gl)!L!a9QGOkhL[E!<JbH_q(_5or\ajq4SG%i!8eD=,LrA#I;r%^IC)tLuW.2;;*1sVeVVIG's5oR!=Tmi6hX6N0ieZEB]p:&$fSq2#H$<$h46m$$")a9;Td\)hHa>P2VU,REe2tha?5=tXb at QN@f]#[V)m=lX<Tk"#Sb>dM:&7\$_JY,UP=C'H\JP0Roi_6slel'>FYReBiOGl-[eWp!J*/=Nh4JBr+Vl*7eB+N)La6d2dfJN3b,oL'Z]@$L551h+!T/[B!R^10Xu5s([#/ll<g<ag at dF+FkuB15d@8Ae$J+>H4*#b)e03%>AAH<fJt-R35b"tjoKKtVr39"cl1*Q8QIID*@(:R%Zb6iG..`;B5a=[>po.9i6^`+sZU=JXT*=VQ1;Gk=)6CBQk';S][8,+uVlCF?B%nP62c0,VneImSF>5enU<nSf$L?kfI at B`>Crh[3_1=r42"qTk/>pUS2daA>C]/A`bB%0^$h]8bO7=@Mp8Er*WX;'cF`j&eAR,UTm](GpQ1G8?$@95\gSLJoUisTK^$MaLRYQ3b3..hbi8?Nu[+7)7c5C%TfppZ(QkRW0\+^>[1JQFG"TA46DU/b)BQ-[m'ZencZhYO=Vo at 7$U-)(%`*[80TScNnaj!d)8P:'$SU/o94sFuP34qODA(`j9`4K^rOAJKAQuftN)H:N+;h].`oVV`RNAk"eXk[a;MDDu/6l1XNN*[KMEAEbD=l=9NIg3tmOsLo+>T<CTCs:GmDYr1P[la1k"mEmgJ>N*D+sB)!,1r=@ReXX3@/AJ$Ata_(I&AP-Xj_*g2=pq^^R![q at _c-@M&i;DM&/+0_\hmSiO9cgDOiul?:ckG~>
+endstream
+endobj
+141 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 140 0 R
+/Annots 142 0 R
+>>
+endobj
+142 0 obj
+[
+143 0 R
+145 0 R
+]
+endobj
+143 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 381.82 250.2 494.85 240.2 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+145 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 318.944 71.2 441.584 63.2 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 139 0 R
+/H /I
+>>
+endobj
+146 0 obj
+<< /Length 3038 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%&h/D=3&qA57 at Gi1b"VO;!^=2cc)mfdWkWKpFU(?YM5YI?D4]un"Z/48CIm]>2LU'UO#S:rES/H?,*<(]bbP(AgVdMkTOp(;e>MaXprLL^ni6U:+P^&\9$]#U0S*b4equ%''`1)?;rAU39RNs.O]K"U"Dcs^8IJ;"Khja#ZTJ5*p*f,D/93%LX,Rm,;C6j,RBL:_'I=GY<TifJInHYmV_g0'+BSD2UHS]Nd+*`^N/_+&4F&po*R)^.QN0gCZn^Gi+EhR-<=55[b+H/l'fV5+Y',;P&2/m"agB2ZDbBBBI')ooD3:1jE'/VI]Sjm`=8AAab^M2])hu#GXJSh&60ltlVe4WAFM]"a\9E71k!_J at 2$c26o8/QrHB$#=(21*4Xf0d$4,t$^(IPC,WpE)F`k+_+ at B&H5+!>0,q^*&SgA]I`/^Ggii3f^oo`-M&UG2]FILR$+.gBG8M4gEK#l">/jX-u*i*<CcsW at a^J`g at jZop?%0,>_IRQF5a*Qm/;A`R-DVT4WcQ[MCmgTs*aZ;@$oOp_T[C)#dJqbYfP"0tD2q*?GRi#g.i.\b<+>3eq;.1bU$b2,8d$a5/f@*GZ,SD"1)G3Z5rH[utKj7`:p85R98]0+65MQZ`:HW6itleU003Wc>.O&e[eQB&=VY1qo3'0UC$cY!GuH[oLbHDtuJH&5GBjQ at J#9N=>^Vg#Ccc-H$&-PI4#l=!@oA3*H:KJ/toS7]A5OA`gg6[H!#SM&0&A06oW##dINTh.EP;o)2CGo?iLl$uO9!/Q_AV[?k9a@:J!*o[`\`,^m$2YIZ5OKc*2Uj]<eZbXZ9(cE-2/?#suBL`@>#@C[bK;%hR\$_Du`H"$.aZe8/OcT>Z$?@,b8A<9"WgDFtAF.`8pP&pX+!bomc?7*"T3`R\3*0/jm1a,hBIhbI6WQ<C>Us\7 at W9V6]h-8M&US/4b$^0mP4KhkH]0in&C?SP<eTKF8l<r3PKJlLGI9Jd=;)06=f2(3>(-P9l.KAu'jji=a0_7jKKpKdr(^AaFS/C"QR^LU&9]B4=7>S)o0 at GV(;ne+)&>+`\7j1kH=/,.-e)M*Nd1^<FBF1MpF^,\OObnnQF;"Aq_7<iA`:^p4H-Wnk0m@)cA)c5EkGgc%4>B/@&jTB1gOEhU.jp'2p!p>D+6tH)Hs[A+D*A]IX;_*:YHL1ikMtkmDs`r8$N[ud7mqffR0k,`g>&<(ET1i=:mL16X3m0/G20I`4>.,>d\H5Q_m^<[9c- at N:i7NlnENp2+3'tV:DCX6m]:H8U+8'iWDl_oVc&8H9$[:,`H*+/O/mt(8:;+]p6_W\fq.l86<W!.:h2tc/I5?fK!lO86iXY3k<U$1ZB34(Wa8;GZ_^W*K.]UFe`4T5;2U#;8>'H_7"&M:J4R'o<?'82i_BCtL:'1S;I#;]#tXR8^;FCZGGe61e;Z"^D;SI!]&eIo>mpZ[*HFV!jT,MY4HIXXZ0 at g@mW4U5E.A!tZF&IR=HH'?C.gD/>SRL^O"CD,G4NID$.N?b6>ps.1N([P31d-RK8c3[Kob3Vm"@?C'oDnRAT5JH5gCpg^%\)?GKsmk@=GKK6="NRL&o0E$kpP)p4oYTLs?q?HU5r&-("Z99dA;!crCbsXg.:+f0`UM7D/if[\U"X*Z)YeFXCE*$>_gOFp%0]GU\1T^huCboN=!m0E`dsSi`8S`o;c>C3S#/@Cd.TK`FF&boM8\2^VsrP!H55&Jf\GH\eZE;8e#\T>q7GAi[42<t_"':*7D.+NINm"6?lJ*n\?45*Kq%c3dQX=T`8oYoOP\6_)t!OZou]kH'P``)-Oni`S3V$##(bfr_8o7/L(U!DpS!S,;*QC$/sP5^ao=X;P,'3_aZ0[+'c_)k(G"JATT;Bi0E!U!+lt,_)k`]H.FC%87$TFVn=l-e9A#1_en2f`I>V9:ra-R--++4s4>es)Y,BIY8mIE>`MP.14J_@?%sD at s.b"jBM!n=2OWE$IoHjjRi8KnjOf5:\c3_UM)?XoA<*07JgF[9dc-&_G.WG5Vms$`DKX#-5`&$rO6^uZ,8I;)NVFO>V3]Q!#C#u:XGN4,Wo=(&7b,QSl+Bd2!dueK01Rl#Q$u_%:f8`MJ=0LG_m<8CI8*_8cu-k?auKq!D<U)[!h=lca5KT]3,N`#G%jlT+eFd].B9(,_5Sg2ft6AFDT8F(OJN!RtGs2A13.NON4p:qf^5VZ=:q-Q!;`m#$,X7JH$F(;5p2/qi]@FYAttq"pe+P+hj>,k3D+T9q4t$V<TeS;"-pfW]8Jp!tq(F*]1Rjl7,/bkZV]c0O.IZiM"Lt+R0P11$(QN)+91ikH&a]qh7U2ZHTd_FKqLj*UC\Ne=9,FI_gPNG2N]3 at p&$UI;7%PWZ$YXb53)_E@>`B>.?2oBaTC6[g%8U1sXOG^a^o+dqJ1=&`$gB"Y`!;Rk+E1Zg"146"3sPgMnV+.UNJ(&?*`d\f@;+ke#?4*j8f(?$+^;L'Cck2O?!HM=CqO\C>pifE+$R")@YtFt*oo2^Ds-WYYD8nK at .4+.sd\Y#Z/R4Ykr+p`r\dbfKFmE0t at 6q_c@>D]"Aa+Z1/I:1'(gJ1a7SE6%)Z,Zp>1l[^9H]kM(o/pn?6HjCs4f'i)gSB3Ua[]d'af=d at i=G'm^+lB5H/$SJ1]6_!0EdP+$B8s'0V&8Q)>n:uO4BH_bo/Pe9Rj3IoYut:Z!TTRU#6P2>[p&"HQTd2g?2SrG][[/pel$V\jp>m3oW_gp^9F>iAn4s*bj,A9r+akAHP8c]R/9ZZg[u)X5*)X6i[A[0?Q6*.m&mD_#`UOe7'=mt,tQ&dASrnSVDnAe7$EO\gU8,*4cljZGSUkJXUqY-,Qor-$Je*H5,IhL=s:G:5FSQd*:fm]`1qd%Ge/W;bS/=7+Ul0&kpH:mkFsE.]W4ZWl9qIt"I_*In""C/e0CY5kBMO>c at D9ErT!V>cg`ASlDI1H:SRBb&I_",jdYi/?["0X`@mP<<JAGt5I at MVRf+cA(aC\"#M9LNI;.j.:+I)iq3))N_#UcK[#"k[1-->tN1U%ORGPC)~>
+endstream
+endobj
+147 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 146 0 R
+>>
+endobj
+148 0 obj
+<< /Length 2763 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatTJfl#h0ni^@=[n_I,epYd8d$SNT#E&Tu at plOn//GTe`LN5^[uMa5qk_AsWi26FhAl_)==',1XLlUsGB_e;q8W/r\(ML?hWEqFhg#"DhkYhC-$d;3GdFG/s10$8iaMGCGf/BbIQf"GSV(P[qJBHZID_PtPBc9@\J3dbWU4lT)r1#__rfjGh6392GiH['6N<*sMqprug[hVW&+#%-F's]QX&O^"@t"tKpU$9uj6rH&3654-\X+nNqc4[Kl4gB?;2Ai[;`D@"!dO;\\s8UN)NdN"8*b)L_MAAH.goKe+b+CZTAn3 at i_=SDo%)h.B5nco4IZWtp:G'5r+X'#;HDZ6B?BL&e'*Mp3ge58ikqf^O<74q]Gc1u7eI2l08c+B6'04jEE3bR!,%*AMM?8MS=>L!8%Q2mb!KlLe/^t8>/%#I4;,Bno!0TDJ,\Y=H1eNmf[u\e1eMm at P0>]tkD=8SlJ$m;+O13lmffjEV-bFcOWj!KeWC<sM3F]J7"CB>('39RK.j(T><R(H$IS^$Ke13N;mdg9o<M>67N!F,j<EHhnti4BP&"6-M,g\pAK9ir`.4"0fCag&\sB(%P:G"?+"`2T+D-b.5\uYIS"\1:=ZGjL>@E>b/Df/h<0+g6#C[)W,t3 at U\Wd?U8QE6UPr5^K"l_6J'otYrj3>0"p#kEi*1$oXFIWsD%stt+r.1'Fr)Li`Jg^OIl^)1Gm9(E>E?UAe>[*b`jD-\#&kBaB:*GgO>9,a7ef7WG\86_3*Fqj2!-!nT,J5D]qA-SqXfFH5n9+:n>Xj1HSG]a[Z]^8YWI%;hn#W at 8@7^9ZC<.')oR0-O&/MHi((Lq*7Uiu2WpR77D(f`RWpR6.=4iHpTD@/6bU:r-7j>NUc"'!Z)(a)pIi>Y at 1^(DpHO!qjmhT]`dB5,\56(i[roe`"!/qTZ5-F"d+P/@!ja'nds!kB(8XU[`mUc%4&Ds!*Hm%lp`+%_^;\/?odVBr(F<kWD0p\*qZTtHNanE?3-eh::Us*ne5T;m,iji^qH-?e-+"8?PJXdkV>=@X\+*]>-iHd%0_i;[6"5+RHOd8Eof"/V?g0tO]IOWH=01iR[l_BAO:HCS^E&tGt+n4BHj&)&F,e(_kDW7 at sE@-`<%((OZa`]7X>pcfB9>3$D&m[BicM]=WAu3.4=ctdX*g,O<8KLV4<eAqV;pESk+\:3#OS,=6O&eRlL:lSQ*;Y]a96+K6ro;hC]WdJMZ5p4ciDH_6,YE(mVQhWbd+ri2bB"H2B:eQPqoh$(+Vb52$[h^$nZqA*;&E)5C0n"l-r3qZ3 at CC?9HiXhbg5lC6S/n7<<bbAJs0Y;HX_u%?u9&)E7(W,`LueU)'@F&#Qi.AK%\K&iicUQ?jIH044a&sN(mF]k+Y$L_1@%$ANAef3YY">Jp29noj[/%"jnT>0L?]gpW><a!.C1+E at Ub=$ZscS?EgcL7Pq'l&06eA(fOrVQujU0e:I;F+2mO0W%#[S[1&micc"!Ir\Un1``RF;8`H8-$6MUbp.P`6744NreoQ<7ZWD9jl+HSm([L'`YGNL.A8rC/hDgb%f3LVh<Cl>2V9mfA2qHcGoZs8iIG*Fe=gkf&AuP$hDiRQ+Qd(Om-]D2Y%VPk3A@(,g?=CW(.uZ0]b/_D#)&ATG"fKD(D7k6j#D7q[M>P:s3 at Tp"q&+qJrb6+&!(Pj(^mH67fMiLc6I=`0B6$lB'aYl0Eq^U>U24AFJg+VSSn`8O>RFtHe"nbGq3+l^ndK.,j%Vhm9*/C!qt:Y,i*-\amIG5=0sP>tD/7)bX1IUDf0aPIdZ?1<rNJ*o/D[!Bq=;Gmb+C#OI-X=Bi&M9!rBJ;GV:[mKJ=!B)#X`f^.qn]taE!jM.2C%iRTF6&NKV(;1cA`p0]>R8T,Z1dL_r[ArN/B0C14n-qF4_)8l+)n>25^YZ=O;kR]I`VgHUUY`U_9ddHXlAr]jQ^j(nP?N-0b(\'63Nn15(!@t?fATGhXniNr7$%RDLL!.t"l5[`:]Qu!(:h57YZ&\>E-[qh!s3gKaif/WfYo+FM%$Okt2Xa at l"3oP3M(hAg99gL,k")YWjZt[X;&]';_(M]=uh0*<ncZI.;0]AAK=Z)`j,^o'g'pl>odjJ"-")PIHVaL?mLWY..hs?7G(3lG=AMgZp'9.os)b5r&7a&827j2R),4(gj_WYr*K2YJuN=b?k[)Ft0,\>_"n*@A[VQ4rI%F?=\V[P$7Buh!LCDetW/WB-<-2P/Yalps6`IW*u9u8lO]H$'C'4sHB),=Cl!l+nN&p#<mF-iqEh5-,?&c]58X4ClZ^)sU:FY3[;>78\q1-`-JW;F/:)`R\4a,(@f1Ko#6+W]9Z`7n7L0LfNi:#8#t4+i6l;-lT-S+&Im'n&)(>IZAGX.2O0K"E-3,8hr_$`MWXSiBK&&Yl#oEof.gO:h;iNG`aWkD.H\JI<0;.>pmtrQl/G`9S60r.(/_:Hgj1gWl6MJ1qt85#0Y$JY-fX"OQ[J>'!:@F#5#4`jY1Hn*&?%EO,pRj-io<%_OY`(6#Jcm!n&d/["&VaAF.J70s4X,[h^?8G]P+9;d8/N7UQoK=>C:Ka6?I>^+-9 at u59DBrITf`LHa_`L4".Rl7V-V0*jEJ at gosKYNo'KKo at ug0!rr^js[J`](2m6TroSA%5(c]0bBOX7Unph0h"BiYr)"h8dO)-lJIB?'9(DYpo,?EVFHs4U\1*&)Y`mr7pdNd"S)>WMs9KrU?Qt0. at Ah/Po4e(+p6?Y0]++i8H$e6ZA.1GgV!A-oJ[$~>
+endstream
+endobj
+149 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 148 0 R
+/Annots 150 0 R
+>>
+endobj
+150 0 obj
+[
+151 0 R
+153 0 R
+]
+endobj
+151 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 524.63 246.36 547.4 236.36 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+153 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 235.36 109.19 225.36 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+154 0 obj
+<< /Length 3263 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatTKCQI4.o)&Cnj8*0t@)E`P<\=Z>ZjE2X+mC::Uql)rTOiGo7[@;9g9(DRNC6Yab*'EV at Bg#L`8M,[_g+glf2oHMUD<HX[p&7'][crq?$Yp0=, at HtK_g?KX7]ooT4aWo5$u"m;bEe71V%/h]!:abeHi+SK7u3gPkPs;X7Ch.JsVX&j;U3e8raZsa(&D[HuC_ at nWaj+Qa3d&D9``u*>\R((Da)qQuFQjSkDqG8>[JEcK*2Q<R/rpX:Pf``9J/b=8uR.Ii0]aUOt>jH*>Gj;gbcB$e9XFlNTMSn4[_N7PZE5$\*M(eJ?l18p1dA\*"P"!:.KC/YZ010B_a"CbPo8Z_'Y(cQ&p.<Ab=Uk6+pA-@!)*I]nqpnOORta[V8pf*g1d1VcXF]WFF,oc7/Rmr2mJ[i8B*^+)PHrUlfp4nJ, at V\$liaYLhts2jYE:++_79(M"^7]^;6&L\chjP\:en=IF*9'(q;i/pG!>B^9,X7?\WaI05S50JKQ5)EO-\h0!U$=p-\Olp1$i,05VMesEIS[R[LK8H>1f]Wt;1?[,NBI;Lmk;':TEB at 2q,;rYmI*]r^]ILWm?rKR%9>MQ&kTj<YE(]@O-?0f:Xc)596]/126tZGM4ib%96m<=S;mY1X?\<RS>Q9]%S>m?ATTq<;CH+<1m/eAWO=k+pf"!#6K:"&O3^L1fFe`3SK&:)$`;aA'A&0h0LF<XhT4k?XaS&ZA;A at 2T]Gs(Sn'g[$WZ$/p'*W;LNT>lLgDqK0]Z!_^P)rGDcE!C0Epb!YN(6c at 1CCrRU3OO^0YGn.#Oes<-+`:o,!R@&E*Vk^ab02>f_&@sh[rskG'm[E0^G]!C+8AY:tDHcAJJt8\RqB5-j8\a3<s"ZFYRKF,4H3XplW/h[JAJr#6C2gm#k`_2Q\CS4rAUam',0LRW%_nqWi3TFsX&1fPM^/W`2?r,X&c(e]!G3""V*oWd1N0SWS"T%Nmok=3nUJ.&gX_("%@GNQPCL/b+ej]7kPqXN/"1RTSjpiYjZPn\Xhm0aU`Zn4TYe\!2JKF_Cp3ME+uP1A$AG+X_DQ6JE%a;/Z2lQWj_k-_uWrSZ+DuA,-LF#[Y=n_&iHo)CMVlU/G(:`l_FmBTeH6E7_gsAfl')1!)9ca!a>6-o0ncD>K/TT45Y at n7$UphW`:W2k4qGU;2W%`X,W,jsg(&a?>tpFjR4'TbieIr(BWh+\<#1,^hR+cQl2?TDg^c#a9<Jo!_9V8slIYE]H#U at jRK8Ta9YFG_Y.G-37>s8EtJlhrUfEM^YXs`P4Wdps$dXGl-kgERF+$;<<WnUZoeE,+Rtl#5"U+Ul3ob6kgs&l_56"V]FCi1Da"#\uJQd`C?op8)/4&23o8!YeG"P!e2%U<lGM\F^O26Bgfi+K$-<^i2=lJ5)P*P=<-+\!gM?&Xc:<b at T#Q)?S-emgV^1'H^+4$4h/>XOD.?&Xc6/R*Iie<?Tg;+=:dlZQ(rUX-jDH$$,o_[>=pUc;Qa>cn&7Yd<blYqZ=CFI(==ra)$D"9n#pZ\5;.<#Xtp.DTgQ`@#>nRa!?@fpr;\<ZRt;<3dQ*YKC>R$8o^.FuN>5nMe[[,2Ki%rO!^Hka]G9qEbBh97Lk(:`!]TG1?+gJoh91i?U(CT^oZd,o$OR<8if.7?$i6Vq6K/T6d1gcW75=2b=Y$O?(UW"-PAPdS[t)0kL at 8)bCb!W:/-V'!OE0Nde0h'R%3XXr_&K#Y7<#kQ7[:VN6:E3Ep%-!QB8IEP6OAV]"_>n)8Gg2h>^Od?85`YoI]3f^MM"[&6>G;u&[%kLgS4/J+ahNBjU_(EfXQu7Y"ZoGPTR9:]'L1r0ZZrHIn[lm.bDJ7dE6l3IQ`j%@git:!uKbfJ[lp>".j40>aFg^J)K'1b7<OM.TPR2q at qr\-:pH(-oi<2gmiKDp'[UrbP5iO7glRgh=c+]cR@;*^:PGkX/NU3"1g,!Yo%o$'lX`YHYL;d<[('TV]%K64YU`@V9Bl@?pI5OraEuoE;GL78.^o"]K,#D'R+/E[ca:qlAX8<8CTNMA7Prie9+XI$mhFR_slls=O-b3f?IcV*-Ei"LDekucC2]l)-fWjU?XmFM:s78LEA!Ar<UM,E&3;;[70LtVSME]Vo`gJa^nQ,5G.3fk\$oji2Abr]1$F-,1?e%%3%ne8sXQ]?h\./K6m>cg!f8Jn%O8Ir/\I>IX$56jl\Rphu0p('R_DLGbA!!m(Un?IBAbkXS_Fpp#e8Xn)&Lq:[Q&Tho)&.`>4<&J1Ah1&%su9OPN!tT1.sZlQY#ZH;HQRi]=+C+&suE6kj*E(:b%dk;R=-&5TtjFii/3ZL!?.L*RCiAP`BT6s8M%MbeJp<_J'dg7'C#?%71=lCuPI*FKl?<T_a9I-FUeJ(=rr%RsJ6R;tqa,_<d7bjKO)h_mq]nAnAg&OWlu-X4Ii9cHi&;q5PIeR;>8Xk<<+F,?;@"DrFJf4(L1+=l<b6Fphhi$e4H,RSrjaN(=2RAOop4J=:Hp]b#T$)rNn9*cPIT`T0a<#BU_pS)SlCP:B0Js[RQ8>Dg=ZIPA;`ot.JL)dlUeBms at E8NfJ'Re.lX%K'brbb-AE`Q266h8$?M]^]Y:6Hsrk54 at Oj3IL&ABu_u)D^%le.tedhg&KP5UY!*+m:h#c>t5fO%>_NZCJUYH!7N>B3?$'SY[sQ&"jg<:.D`F5Hs^mkduu?0lG_e%]?pINnZ^P at .8aP^&ibfGdJ'@Uf1nn;kNiKmg:\'AY.c7kIE)WRe9:BcYJn)Oue#[d/Kifn/FdqO3i[Ei<`D+ZWscqVb%n6o'nQ2,`?W'p*'7+p-hr>r.mcMJQ]lXWYh35.+,ropuqT(A35Vu8q0V-L*(#8_l6:,/Z&Z4&nc4H;CJruF+N7r7^EeVr=m0Wh"f#&k+d;@6'S9"i=Ks<mHp#/m1?s6N/`T]:PZ5e37_j,Lpa2oMtnXmPM]cpd'HX(NnTQqTE<!P)-WPhUMAd0o!oZgKJ at p[g?iTOm6UaQKHo*E[otbAn8*e+F>>8GPPY.)MdL6`fY)-+.*m at IA!')uDE^9=TB"S57Qu-6jIa2,o$*YtWo4^MXTArTNSM+iLK9=^Ifo6;>$BSNrrsZ(eII(;#CRp'UYh^p5ds<3UsAZ-5kEh0mNW#t!Mke5Xj1"oE+Pc^`rq%;#K>nn(4%'I:Yge'`lR&>YQ!`Mhbmf"L#%MT at GKCC*fOjJg0O[ClKroi5uO'[?g at PgZX'J%R`.kL)=G)$("?@i`p$&.*+MNi(E!DuKkF7J6HtTi]?pQXB&jpr~>
+endstream
+endobj
+155 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 154 0 R
+/Annots 156 0 R
+>>
+endobj
+156 0 obj
+[
+157 0 R
+]
+endobj
+157 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 90.05 637.56 120.05 627.56 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+159 0 obj
+<< /Length 1945 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D?]Wr"%"H#f&RZ.:!I%067s981%VW*^BHK,@$a>EB:aicB\@!X/QLC8\5MDDSg9HhW=HOD^+XrSKI\cmZGI)`o=3cP:<kJ!9ZT?l$Wt"us<TjK;FBmgYX'N",qfQ%Q9_$lf5HEU1d#&#ZUCi353[9nHbH1h/;fH!6\9,$5/:"'ejE>\7L-E\nhQc@]Q).WdGU8a"Sp>1`0b]l*F1Z=)SleTVA>lYBgrEr-7?adRbRl5Kp(aW'QI3^*p3k'4&Xg#L3YMa7.$c(>V.s+m]OB@(cHeK;)e[4t`82em[`Nmp?<3BM?WdET5$U(2c<LouaHlP^IKK1Me#>8UbL[;t]DfkYFAuc+?pgZef*,<Xh'u/6U7bMZi4ISk4Nn0-%WTBP^t="_HLTQjrD`<WZ^MP^rdABTIR63_s(2^e%e6+HnB\GG3"?8/.i(+"mA3oujH/S7/.(2mLY550IqF[XiBBrpR(GOf9Jg]ZW.fH9XK>07]-VQt%a.CfRL,!"e;L]PjB?88g=G"fFh.L;"O>'nPfc"Y?#Y+aEJJoQa^j]\(`"2F,m=WKYQB0qm'<]8`EB@*9fNquakrJ#.[K6FjF]Ma$<_#/&9=qT.,79*9J)_`ju'`T+%34j9C=>9G.<W4LJgI6OjUn5/cfYhE&-!9GoI^3]6:$Ef*2nr5LQ_#P/g^ORQ,)=*[D0E-D&F.`/OscIL"B/.a0NmiL$_OT^V+i6S at gf(R@[<SAWJ,XCb"%2Zohc'_pjg7S7t""a_^q&nG2\;b+%.Xrg*Ndr<4>EXMoL/1pBGifb5Z8''D9oX_e at k.dt<i.p%f\_hQH,bV)GBr[4m'7F84Ls_d-&[_mQR5NoBXLbKJ:;TXV'"">H$O1a[cZhV8YlbqJ9Ij7N8 at Iu4K_hHgYFptQ_l:YVH5Zf#Wk6<?q&r0US8FO?&.[jVddAT%]@!:W5RdV80R=/WK^KG,I-+G"8Pr]P9J=8(84%ge=''^kkSsTHq/iG&P3'71Di[$*1\$/DBD]PLoZ$L?1ZQr-^O0L^:V<rMQ`0#?J2)^H1V4)*H#YM&H=s7%pr$cW2P12+FGlm\29AY#pum'H&H22'm at iaFLN_O-/+M]3TfPeO)I\, at R'K]KR1.Ik=hrRHgMUWVWGHZ:Fl`OTNFC".ju$63Ou6lPI"ZJT.p'#:*0H1237^?lg(H8Y!<%QQMA.b#,dXJ$-\4i`ajdRg6[b1nNc5p^]'0>'\ar-?j*JZT%4E?8LQUdMP^CbbK5bFC/5L4S@`3S[?+t$bj^Tt3ILhBan5M+%nm<D^DYstl%P/9Z9Vcp0/8>!k&Jp8M;p(Zmll2aJcj6g40-O$IP;&dW-egm>@18+=>Bcm:le4=2:><:5Hn"%!`mK:lk[N+5,T+_!KOL]$QIQ*4N9h^JYsi^I1ukDO#L=pN$bRV_4]ZgWZVL2Z(*bE]N?rl['1(D%[dPScX_B+)A8+'u/j-KB3cY at gj+S)8T'>':g1Lf^[?:*0DX2Oe)pa;fnAa4qR$6(b-qiE&787DC4o0hX!`$)KDhB48kjPEX5dU$f)!t2PVQ)3Y1gh(-%=Cm0+XTi\-j"rR7@'t at _b[bJq!NFQpr^mAV(Af'c.t&L))=.*,IH%U'7e<'r.:ehr68V[8:TF)%Y'"/&cE=2pSMj]O))i#H=Z1g0Quhc47uY4Va0-ZFNspPC5uY.P?5crF4,9G+>U3`fr!=BHLtpWlUbt_?13Ooq<[.`1s'5tr!i2qa(G&pR;p2>[blJdRqVTFneU%bM/N\nSf,1"PM>nkN9as;q2&hd^R,[@a&TSJVR*J\iD0ec9R2XU at A`R<B=f=@3`Gr?Q6OQ`j>/;OhS3 at h01)5-?["I/G+WRImtEq6].gF+ at GT5-'jmdrJ)%]k9g1*(gYoKu0,7.7i128%UXnuG-:g+b*:pPab`:'E]o*hU)[H?E3;3$"Nb]+&#:E#BF8~>
+endstream
+endobj
+160 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 159 0 R
+/Annots 161 0 R
+>>
+endobj
+161 0 obj
+[
+162 0 R
+]
+endobj
+162 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 294.73 216.8 478.58 206.8 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+163 0 obj
+<< /Length 2935 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%&99\*g'#)\qd*:T#%@8>2Ok`+0ip=89S?c_n+VjGHU*'a[MGORtAF6R-&.`r:Uu\?6K)Pmp2nIBIJFddXoX at V,Q"ElrP1B9q'X*NmaXYkkaf7n,GdT!$BTj13m<SBZo7&%OhQL86U55g)Xu<?D]r:faCDBiS[-q)r?#>)B*:m/Cla<0gaD6u.8PrVsgConUY:>Ph+3A9 at _#mcq1dG>-n](;3!-LU2D\&R(duZl=C*k7oDJ5/_ESW at L&<E=E4.sO"%>=baeO/'aP.*q(57/Q6oWdT(4p#hQ=%-Vqcn[T^bIGgbLXfrU's$L2lPNILDKag?7PfI&bmhq[a4!]!1q3aO[enH8S!eWON'oZt6TtFj']feTULOP28R&M+SgJ.aO_b]:U.FArZ^u;cTjO<g/Kri7L:7R1Tt(.LDc3hrd-"^bTQY!S0C]hE)/pdC08n,s;UA[<^`8&Uf]I6"Y1BlY9d7Bj?hKOn5^rLtiVgpun31"iWm*F/70cGkaRUf1j#BfA[;+7@`]+p2[:gkQk("XT*(!h770m.32dQ"fP#dX9l$5Eh,:%JS79OuEc9p6LX&FiDREd/In;LDQma<i/-3>+>*d`3D;pE<l*a2X;dQ?#SF]-p1<EO<E,N*r`f\fkdB=0E7NUomHkgbOjEd>G5ond-!`^apJO&`4lX6YV9R6!P5Tl(YP_."13=]XhDQJnuj^XMe,Yg!Lf`E<tZ&P)p;CdX`=G>+Q/'eo+hCkI8]^FubBPcu>L/=3jMUPUit&n9AS30T.40L"tl,>X#"Fs+a[)F=+bQ.b*:pG)raK?dr`2o`*4f]!)$RuU2cFUfM9%fdT/pIs-Yh_Cpb3>>,Dke];R;O&t??D&PYUn1b&#^^5j.S<Y1\`J^tLB#Sq.?.krSfet[RUT'/EGEM5n`eXB#AA$[aMH]USnS_o>cdPJJKOc,9Uuq_kb9<Rj&rMH-&*+27]K9j,JnJ[^2qdq*2U55"j:n6S4h']/[6MY'$1mcEtWQ"Y^F.Jehi."f+Y>`W6uO[!DVHnH)A1X5tZr&1*m`09HKu&M_'+^8tpA!XM\oE!!"ocfs/CMlb:j(J-'-)45D:kf5oWa'#qNEEXe0T[jS3D8Ei3(STR/L-Iu/.3b7Nf0a$'uC<)+Ddi*G:bt4_N%nK'Fq9$EKleo7_^U.'>(j<FM><V<i[u`ciU4>,7k^Ets/!\tlZobR$Z**hJ2J9egp8gOH9SVC&M75i.0utYd*YDUCI<1;hQ]V:;'d#^^qkIf$#=G/sYaQXnS'3b;reUSV?SFGRPDQH+,S*-+[G8GI'EIuS_NIF<@]`G#T/,3,7JC^sf/=I7+XbtQ38u3d&Q&JjHZo\gQh^Zm:apBRhpM98#<e#uNm/ZC0T at LWb4+Abh46okRSAQZIG;>8F,R/mmMn?@>)=nA]r^`6B=(5cK<ae/Tq3>%5Tc<unCGie5b_N at A;QU\.q8L]XgfQ*Zri2H"`^Y>g'#Ti%)KW<0!b9aCl)Hk',H*eq^T+gPsmDrq:ESj40FYNT*Q8/j5/c=rtFDUErtDJf)^.#7/+8D%TgW+\1cj#m6W,&,sEuV=*N01]q`?UiTAqc%mBf7I1Xai2EE73*EX$+C4%Oj`n#[A;Vg>oc0T-iXZ!ch0!,S3%/Zd>O"+k;X&DdkUP`n/M^Y3A^]p>&>RkrEW>Pq4g\m)..P/J\$?uBETla%/r:>=T.;+P`OSl-cCqhKX'P)Qnm\hX>L4>m()s5A+&SqWB+4bNIK0#3\6S^E'A at mpET:6B]-W at tF(*_>p5eAs)KUck'+9]/]=I(P9!-f^h1709nTs$(4Jlr`e]a8-B0X\]4iHSi682AoP$4YXAWfrCU^0btO<_^nhWp=[`A069oDgqsNoI[^0)T;<*AupA1C?PHef2/W&[IXN[Fc4YWg1c,Cc<=*fW/G9;U#dnX3;I&sl<*B'*DOMCa%ei#/D.*^Y8%];6/H_Sq%d_Z?pIVA!>c(T`O/+,="h)+087+$*LBVu`i(hEK3OJVZR(I"4]sR3Hthj@;1_ at tZXs13?H,Z2>s8QY20[a>oTeK;\0B_N>Xjlg;6_Rf7 at h+4':h99(YgdAO8R88pE59HUbr<FbRm>:@'TBXLCJV2gqu0>cFP0hn8XjNj?-k0DP+b`OIj+EUL-4<$itlR#fA*?FS!i=.]TN0^-b4W(Br#DejHRr`9-hY3[9Kq-Kj>ks"VB^I:oa[VSNUjk1CpZ'M^':(Y$\g+S#oL.5fWl9O3Z^@G4HVG.-qG"GNN[;n'sl)+V527Y2i!#&NiaC;KF-N1hlZhE2bkJ_BMFJa+aAqO&cioZ at b2f'/1pLQ<@RH\23eT8YZ+mdm>6AsQ5?J(NZU/<s3IY$g-hh(*ufj!<>X<AcleLu&=M5dj8eXWD)=Ub&6"cU2E]r36.aJV%U!bh&p`WA^,oDM37_XJ^+\6AA-04'a+s^&sDO+r3uoe9DegT-s6U_EJ;,;H%;dpHkY.I#-9N\jp>P>DV.L6mO#[gX'8`iBBE;K\gOS?Oc2\Esq"o$_[DTd1@]%L45<PNHMT/5a-6 at 3$@Y?>`H#P7(<B(#)K=(BUuK4]9H?+VsPf-bE&@n[[0/._g;Bg\'_UfV=E\Pfd*h9_N]QWeWiuFkrLkGs/!^I_&Zto\<cp8IG69W:eS>PDe;*oBE1Kq\f'&"BS0r>3d3%)50Z)MN\[ofH")RH]VY'3DPHT-=Ve1)gloL:lCYm7Wd+OY=_Fq&r&(>A<#:7!Z4h<8=`@c3_OR/-mNFCXK5&aK5_h(&%#LA*Y1liA$&O1S(G/:iMj>[-c@$^U[&YW5&j5tL\g3fS[nuc[M<%C7Wtl1=n$!gA_qR-?](g8(d1\tgJa*3BIJUkZo7NH1A-81BoTla'F_l2FqY/IZD9/b3hq?f*nr=d at 6suUN;0@(`-utM?jIsM#B>YOSaT"%c6 at dJ`!U/&QDZ~>
+endstream
+endobj
+164 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 163 0 R
+/Annots 165 0 R
+>>
+endobj
+165 0 obj
+[
+166 0 R
+167 0 R
+169 0 R
+171 0 R
+172 0 R
+173 0 R
+174 0 R
+175 0 R
+176 0 R
+177 0 R
+]
+endobj
+166 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 245.374 660.009 320.074 650.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+167 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 210.31 649.009 223.63 639.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 168 0 R
+/H /I
+>>
+endobj
+169 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 518.712 575.009 549.532 565.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 170 0 R
+/H /I
+>>
+endobj
+171 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 564.009 196.43 554.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 170 0 R
+/H /I
+>>
+endobj
+172 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 406.009 208.11 396.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+173 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 385.009 175.6 375.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+174 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 364.009 203.65 354.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+175 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 297.54 343.009 339.49 333.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.boost.org/tools/build/jam_src/index.html#jam_fundamentals)
+/S /URI >>
+/H /I
+>>
+endobj
+176 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 358.93 343.009 406.43 333.009 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.boost.org/tools/build/jam_src/jam.html)
+/S /URI >>
+/H /I
+>>
+endobj
+177 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 401.274 267.683 438.464 257.683 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 178 0 R
+/H /I
+>>
+endobj
+179 0 obj
+<< /Length 2720 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat$;gQJVInU8-gDgSp9X?ds_9V0P/A1O.L,b%tM;jGOY%'luuJ at o,L1Ol#$$#%EtNbbYl:ntb'eT^q&s7GklZCr?02Z)Nu[lHV!N<arTZh"4+o6dj=RshR;c_n[!]_Hr^NP'0#VsX1/o#pcss)%IZ!?0H,M$sM8 at h+2^WI.q at 6B#U"/QNKG=@AI\))8uIN*aj:rW`X9J**tb)u'F?4O<UXT5$!bB,bqlPmuYsD?H?6YQ:^Q/i"4Q??`>O1pmekU/]s10<NGS8!N^f;3eb![EV_m\%m$2;")^\K&j4\%]GE]qSFaZF!I^='m;n9/7p.76;*Y^/^)UpnjBu5E>2V:dUd_G0&41HLlNl at 8Gfu/9F7p0//4k'gR`9dUf$,\4tg+,Nk,%jTLPp'"XZEm*b+.+eD2e$X%IX>I(!Eq"Y[1cIXs_-W3%08Y)..2Qj4c\]:FYW/fituM.71.87_ElR>:]:/7'dlN+36*?.1V9M=3qMenFE@$K?TSg?`>sb!mGKW,9%f-Oe at fA-7f>cOS4J?DkGZLjc5Q#+YM>fhr2#c?#=mh*;5Y)6r-b2(lpiNBT![C]MDb at ReM.gB5&+[$o1A!ZBO^D5N#'^8n/3,s$r!AL=\hf]XGo<^nTcd;#3iA"=[a[Le]t&Y%_`WsR at 6[1L6%c\S]Ulj-lPCpnBsjpg('+#%LaA/<0PhX*[b%E$gB at +dMQK#'UuN=N at 0D/=P#N83c*j4tPCdFJfgi"-Oi,&J:X;H!5"C<LaNqBS[LnG_bq"eGG^2F>IiK5-?8%(=]<(O[F<7CK'#feh>PjUiF_g5/_ at J`u^s6U%!__C->aq607BJ4HS.4S'IQ%U-ZfTU-J*!#ullbR*DV3[RifZJY<]htIH0,F7l_chfp[=WiW-$ks&ur0=MUSdO=*'b#Y2r[909^qMSa<G$$ji:kMR]u_NfTgi$(SbCWGp";K2/Si5CF&[!j`OAIIVt7"JVd(83XVN*Do2=.n)ocK,mpEBEe=.1[:JgO\+1#r9oRcT]5:XiaH#^r'<HW'o4TPcePJjKpL)Rh*YN`E?SK at Zi3\:7a-PhUA6A&F at V_l(U^0B5G#+^8fo[C:]laL3\"("@til.3GCL.]#,d];-/?2;m:jpRA;Q7fC5Nore13+nW=ss>eMX-l%4YTMj8!d6cIa;2r:DdBPf at S]rdgnZZ"6)OarBUMb%DTZq"]]KH`^cBZ!/3P+S,$8A74RSk=8;9"8MQ6FjcG9FaFuS9Gs^DY6rk$C5c#Jaka(H&hle[t=6]o;[!qhO9Ij,D at l(gt<LUR1f"X%Y-Ip9s:#_Ll/76j'OZR$:pdWb?<7*Y*YVEfTJi+)ubSp%!FmlG6\i^rjRpKF)N8d>oka?oh=?Oc;QQJ12b>ZmM%"LtJhEodYOrX[)b(r_m[=-T*+2pOLL\lLk5]rQfkJCX=Gb^.81/&jTBa+c\Kech3gYO&!cB36QaU>6m/Gg1'mb>pUH3514YfH;a.oeq'Nps6bP+ at H\ZhYs;P49fE,XSNRUHGrL^f$/?c>^;-Va;RV'[\p)>Ak_,cYHZc*njt\RmHLe"jilo1L\tg"rdS9#dmO02FeaF2K.X[6Q0*`HI];!>tgF;6P1"fr(=Qn,EVW(YT+4_&>Rns_[uGQ502)X@/*8jn:R+HLAB_++.33a,[li]nJ!`*8>"tF*=g4h<jdRDRX$$m>+2#03$L3M/^`-CXIC-=36s+<iYa#)h\7q`B3o8 at A)b<_/BUS-'8.O&cm3"`+coK9&!$Q!gb\,Pg_ILqo:d<\+CM1=[1FsZZU;Am#YemZKoHrPp33:aogP\I\<-a&(4%kWqHc!Vq:s"JB`97$^HS^-dK]5o]'AQlJfU(.-729i4C4\c#GlQVnc"7TV&p>2q%hQ(T[8J222DnRjfpOO#_&=4('/2+NE)`0`rsaF8Y3QZdM9-c/RpB"R\P,K*i`t`F&tnr&1L$1_2opJ\qHqRp/T#r">qEVrctHSqh:R at HdH.irM&`CeDmTDk,8<7Z8#&ghlg"IR[Wu:m5VZ@<u52p%fcG#b<0_E(0VVY2^B/*#N.<EbFVK%]Xuu!JOG(E39rjeAg<_Srq6)I<utA5X#I)&_UFWFTo+SK>=GuhRN\2`n:@Ie7V7TIO66*?;t/V%8:<sT_u(WTDN.b8^$/L?5ES7\b$p:e=rsG#8eN)^AC"[DUVsjH\I#rs0d9%_$AB7nFbB'ZJqGmuM-_lR=J,(P:i9^#ohR!lVi,6O>?KNt!f3#W8CotJflC8a"P5j[ALY&^>71$!N#"c;l9dFsi1E_qmMG`#TmfJ5g36'h1j^&gUC+r\2)TIo_UI17$bcIO+QB+[Cs]o"X40R;c1%^0L[!AT57aB&q?7Qpe[.Af`/XRDUL+Dc5SU@;CtrZ27UQj2Sn$&A9=O*Q&f9_VM+..je`QB#^;_B'Hj=AB71efVipb<=Zc8m^ip:-5M"CDcLLKCQ4o=Tm[=2Cm'DH2_Z`+c4;$$tp/;//Ll4",=I_[W<`?^0d,2MuH/a0DY`a3t&C0%[h6R2QRo/HZ"n at I\\]4XK$@@@HV<>?A/7?s8e7dh^8>5ub:<Zq7miXrm$(IC1u`VA5h#0\4(-4HXd:I,6*$hq#rX9PU%e,JV+rjO*J2^5?p3u2tRgZXA7Q.R(KrpfVln,/E'`Io/TJ#mlZNM8KVg2)TAs/baX/5p9;bp8#]s1$>3bm4n9&hM0:GSK"#6->,pPYHi1%n\i/D?~>
+endstream
+endobj
+180 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 179 0 R
+>>
+endobj
+181 0 obj
+<< /Length 2373 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm==c_;q&:WMDiPu((Zau2C.$/;7LB'V;FGi>)Mh77.>E'+_Ph,1"qNBio*6PR1*>Al41aC;^:NMZ4]>+1#;n-igiiMRW2pQ/^j/sBlkH88in7'uoDS3Qa<e%hm=]_2$YL[#(<i9Z#XBp%oK\eMSnWQ[Z9m%jVf&#-I7p>VFgUq,[U\_1ErFb).WZ<.Oot5fC;.B?j4[!XT]&QsF4;WoC&k&]F[Uli3gW;YCP]<@dZeX^)7Jg at -]m92nP\?Wfhls(um'm6UAbnFBg`Rr#k?=Sa2a?hKg^lj5L3NeeLu'uET%L,?9kuQ;'<M`j]3X!P2>+E1SU73B(8#Hg:L"P/p==Ci[K)&SVSr'h9;63jP-`Flb9u.hHTG;,9P at TNl&"0-*NN=94#VO0lWZiXUO at rMok%%aL!jH37a;EbC3ofX069K%gS/1rT8T0e9M#jH><OY)SPTkXK7X-.Oa(X_I1jcpdGoQnJj6E=#YDZ^Mu)bpMg*lVJ)r[9p7l\I"lFN&jmF4"K?@UUN_(-N;7q5JR9!O#Qm5mS9YBF[<LAT%O/dYSAF3mCNXGl^KVF8j,@&7<g)$S5e;9n*<?a8n4Op57)FYB37FcATVE-PN7r-%@feI!2kGm/7\Y0lU/8Odt:cZ_A"a=[m at i`>F0],6rNOFr4VD$)P(g<T>SdY*C$k8FGNa<P7<u5Toas#kslChT9C-,B/+I[IDlf)7W$,qOV4Et1KR#GX(6c!ClMun?8*]Z;YRBhQgBUaK>Y<^YQ8jHsp2T,gA%1j\0Fj:Ijr2ZOY^u!eB_Q)9?MEtWH'GZtBV>u-nSBM=drbNj4X:.I8#&6fed at s)=>*`j8lAt6+XqAP3:2CPCUMX at N?.%/(AjgF-Ehl"b`lh2p4#ZKX>=7r`bDL-[SN4BSgLcOnAt'tO66Y[+?r<i;\7o`63X99(`pSH0D,IXGY@''pXR1o at g)l,>(KD]9*beh84[O5\nV;_fHkd&pTD48Kp'%lXMeVAZ;Zn]g7:3DP08PjU%siA?[TYNL1ed9/g8If1dGiTuid2s?"'^OQ=J^S;7p-DTl>u$@>LNqC,3b!QKKOdX<"u.4,#eoeZV9=^6UN!uSSG5l:=]+cbPI6:n9^RN`/l'r^`6S5FBd90Z.\^5a/K)Q^iUDAUTqJ2kFVE'FUTL5C5-)J'8j0Rknu at qdr8jqK3.P28%S(\L)e8Pce;j'LN)KbI6fT#6No1QRJ'`\Ul-nL::K:LG<.G2&&dB\,RQ90me>;hANJ'9)^P^@Z,B#[i[@+=W_:q7%P%=oC1Cq:'Bhp3UAH!oUnn7H8q`P1faQDAM:\*W]s,>A5t%4f9KoNQja6]WQd5:9$geD at P)mjh]X)+qm1FTQO&ZpLKV(Y>HSSO*lWgB.?:<cUp*flGb;pj>KRr"D>3ujW>TCB)8Et7 at P'Wd>dCecje+LB<gPg,=aKoKKQoNJ.B(5Y_II"j\\.U+Y-+:HcKRr`8>Ln*tVJ0C\CKXa1QP`A)iWiO%_s;YEGAM]pp-`*n`X$h`>Yk!>!T^ao[IMEm$K!0C(W0sa,:8Q:i1Va+:)&//#(&d(e,ffkoXM+[cOq4p:*MJtF<UfMA/%/L$r`K4^aR_m"I/Qd>D0>?+pt+ck2=W$N&a/'!b9b+Kr2pmN<[T]`2*?eQ^0&89<VV>M.q7fe%2_b>@_F#?CVq>NjTkOXZ>Ki>l#LPN496=36XIX]rgro<;7YLVsB$Cn)6.p!q)csd>J)tbHn(Zb-+(SFE)-Oq0Tr]5^]-eHKEapC[mqag,-YZ:ad.C8QUS-,udu:'_M(A!k1'Fs$.A<m%D7VI at .<ZT$6F8c5cFgUoMHVi!q0 at DBn?"=VT[;\.V5'!Z0!*-mK%p-2AQXimZ:J5gYj51S>^U/@-6H544gr/7JRElMt6OhJg[=*Vn:gN?tYQ\;56!S2dg.#7gpa^I*B9N>R1+iXE=Ag;;]E7448=@Q:&+c=UMp=psKB+t4k-GuIGu`q2NtiJ)a5o<Z\^3`U!6[Loj5T#&rI#sEnk/R(\c<;5 at sJ`Whn19s:'V7AFFS)1+8!+-HtW%Mm]YH==.G17Sqp%?[R`7:2GdqG<`=]#1&$s>-$5"[EGD42##FDVI at WeC53CEt$/JJu6^4Blg*74DCLnHm^"fs4Rb$%n;%D9OfTJl!-#A`cm4cK7+%^am&NEH&X_%5cBs5S/ZZW4R-l<oE\E^\.LN?]l?#^GY^1F2bt3:ES8+W/6^OgYm%Y:tNZ#<&$B;]sC0VhNp2upT-XFng<[6:ea;!-VD\&'NXMts*T=fD>496r@/T(SeOT`#iLN:QE at SS^Y[c%:OYD6')dI+a-LV>7rIYsWAO*+B+$?VAKWql6kg2^d0JP at q613S&qCL1BGCCM6]Mjq~>
+endstream
+endobj
+182 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 181 0 R
+/Annots 183 0 R
+>>
+endobj
+183 0 obj
+[
+184 0 R
+186 0 R
+187 0 R
+189 0 R
+190 0 R
+]
+endobj
+184 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 499.515 167.53 489.515 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 185 0 R
+/H /I
+>>
+endobj
+186 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 478.515 184.75 468.515 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+187 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 457.515 178.94 447.515 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 188 0 R
+/H /I
+>>
+endobj
+189 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 344.646 386.076 502.126 376.076 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+190 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 289.18 375.076 438.31 365.076 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+191 0 obj
+<< /Length 2930 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>D3*G]&cTMZ_E^=re+7>IlBem1U.HtSY0E[-3 at KbX&5Y.LAPO!]M:t,ef9b!GaIt/1P=)SsQ89.60-&8"6i#j+lLmq1Mo$U,D0B">Ck!2E6N%_FQEfR(_`3I<ZcuqPoC\/Bn`R6J,Rf<9G-12#U(hmk$IuH1d5CsPMOGW3V4+r)Du#F$V7OcQ;/XMBM at aXBpABXt5[IEi(3ur?iU(/M?6K*LHI%G^X=!ed>VT)q+uVZrE?PiOcY">4Rid%0/Cor+9eInmmIcu/1S.!Y+MiOjQD+qj4?6_hjFu6C:+!8WeJWtgUJU],4k]=_Zbc,cn]+g^k(P!Pht*:!B4P?;-):]ABZl<3HYj^\qI1=G?Yi"&C)*PNlV]R^;0(j>NGRn^/4Kg^79GT^A,Qf0ZL%\sl(#iB7d at r2:*(qM`b6)NTF08_d4pHHLX/%81kF]"P>bM,CFO8]F%6T1N7d^3V/*;./fO7u[^Q1kM3<)*-0nR8S6c.?&)9^1UBS;oCnHuhUE<X8*7]<=a/i;3^m$6Lfu5>E$X#?eD at 8K5N]7TK1fBl7E")X/kY>DRekE8GdoBQ4W-e4<>;;kONXolfT^l;ElEt_F]lmd`CJ:7^kcX-;&-Y(4"f'+4H]pW;douTOkFbS.gG`o;;L=D_,R^oCVpiAE\XekRcWFj*r#'W]o"[ipX+-3[TcPN)5jWI>g[O3SIc.JE)6>TT`IBbg/OGpPE;5$(KAq,tj<)SWa1n*kX%Op%L6t:o<a>hPA`F&1'1\ge*%lm:H:6kB<99b.&DZ/A^\>/6kaN=+k at SkaLkJ"'O87YlMHW^@hs.4B-s74q at 2D'S1`(b>o0Kfg"r[9qIALM!Gt1*I,qP!l!':DGg69in51pl@=FF$jF7MedD2/K)pS\Vugh1&iFGu(t"ro at ZAoa!cl4DkLr0is5 at 6G$26b:#Tcit3C;?%='c-=&l5!)FgX%p]4P`RI5G&(?Gc*AHqYLb:o<?6^l7+cq8^,5KfG(<LXR at U(*/nMj5hp-XfhC>,uBo]n^=LZY6HOlLc1"ehEQ8aN;BZ&Fion4WNG(Gb*:o1H;Y4NltPCESJC%OA*h1A(-[m2&8mU5u"s*queUSoM4;`bRgbp!T`oHTZ=`rTH'BS(1C'?c/@Yd0BTVrkUo65#S&]HXV:'%VVj_9*J43:7!\54`UUd+S\"X5aanH,7(^O4]17HJ6"AIM:GrMRh']7rl6`A4^5h9fZG(9>:(m#F!9Q'rM%9Oa<I[6Mj3hM?+LeYrfeR?FiESlHqP[dik'hCH0e(W2H1QYeV3h&f1Bml[9Nq6&aHj'VlZ(oCCOZkIcD`UU/*m^(]`l$.A%HJr-0*j!%NMZcDRXGk'+.&OCA_gF?&Y:J"\9_.!g^'VeP5?cm4<Fo--YpMXEF_^B^dRB="?1<t$0/GEkUGKn<(aYG`u_bS\]bCKe%OjHq4EKm3HoZl%s$4\b3BAWC#^jq)$1)9B^;Ac0[j*9kRX=c$/WpY,0oP5^Xf6-OIJ%.[5C1o&FiT9=JTF]@=G;G5\pRIrI at MNE3o5nJD:6>SR,#Rn9?97X`lub>q*93$WCqg"@5,f_LC*M8PhE[hpO@!k.p$00X*:Zp9Di._Lj[:S/>\n at VQuli3`f1dla>YMc']#QVA:<.K5`J3B5CijUjsqS3adTjpWh$4c+5.HXA?rj`m-HfEN.hIlS1M%2D7-5+\oHW.K74SEfG,!(+Dm4ZCOY?pQ<-I.Q;>:7<`(>e-t_7SEG-BEld>Hn]cKEX4Z:3))5EBE3]/?fW!![fY4G9'&(#D:j<X'!e`:(iHaYmC<f$>JHo_ID!QWQ"?fu2.pG^reE)5[Wp)]!l?TtdE?tOj7JN'eLKW/s224/!Y'Ccih#T.7*Gr5#YS'qrlqY\RgdhD-\<Dg2/gSsui?EL;a]hO+Fo5n'*A at f`cNmo.V,>1$sUeBt(+nG8dW:&KD/j<+(a?reimbN at V^&J#mqnIMG at 7h0gLSCM]]57k\@"mtph?\=a6I\GNBG<673d:KCP9K22'M`4M at 0dG^l]eq+9D(6[*J&IV0uV at sR2_;]3$Jeb-q7a:QrCq0e_d<&gZhXu;th2%]Wf-">!+%MT>Jo@*fctb7\9lj*5m>pT4GA^]db5IQCY-O:hAMOan6NP_l6kFb97n0(I=RN!)J6f7Ut"3Qk&=X<574>gX"p1Qb6K)$(aVSIs,a?"*M>fGq^h<3quJ<G2I7D at bo)u=',)2f0k at -@JnFuNf0kALl.[+Di at e+og&p!ScYGIL3VBX3"FX0IO-bXhe7Of@'sAWjA4^Hd`>0#+2BT9VLO%l%\+qPFu8i$h08UBBc at uF["$!16>gV39VcZm#)fa0k;Pl$P-So6\iV_Z`J_no3#MkH3jgQl^ND9[Yd1uN7hdP-E05Co4?Y=<Mfbp/PD(q3[g9/9Qeq*FV(81HiS[gUYNPn;bLb`F\d6_qlJ(?EEmgI7Ne9/oIYBeC!l#^7"8L6YXrn3j@\`TY>.LO+;:et!K_q[_ at PR<kO(D"Rd1,"am^j!m#.m#9e56tdli1HE]b&\b0B+ZCdaKHIfB<&)U5'=FD>q1nqs)Yfhu<D[D`JPYDu5h>GH\b!Tg0Hth!dUZnrPcP9VCFh+W5"X^.LL&4<p^ffOVS#p_1IMZtOoj(.f2D at HoH<`:<9BQTkTHEYS:=@:\9M>Z>8T#2(3l-4IWE:T'^oAA3B;WCL"T:/E+ZMn3N,EF\-c%=YSN#l)CFirLckCf?7%KOtg>dT[oPXO@,\+n>s[OQOdXL5=_Z.]ee41BUf&771*shcH=Jk<#@8g,nDIPn]C,?h8K3WOCq&f9kF(Ib<ti\J"ghF7lC,\Hi&V,;iZ%]%bj%ku#]<];pEf^"a$F%736I^96/73$DJFl.QDfhb^DaPoATHN7S/-q\ma!;.>Xla[I5/0?j[(/f:6KZu?EO%k308\,~>
+endstream
+endobj
+192 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 191 0 R
+/Annots 193 0 R
+>>
+endobj
+193 0 obj
+[
+194 0 R
+196 0 R
+197 0 R
+198 0 R
+199 0 R
+201 0 R
+202 0 R
+]
+endobj
+194 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 439.59 583.42 552.62 573.42 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 195 0 R
+/H /I
+>>
+endobj
+196 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 515.332 583.42 575.592 573.42 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 195 0 R
+/H /I
+>>
+endobj
+197 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 360.85 449.12 404.64 439.12 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://boost.org)
+/S /URI >>
+/H /I
+>>
+endobj
+198 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 334.604 438.12 491.224 428.12 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+199 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 515.128 438.12 545.948 428.12 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 200 0 R
+/H /I
+>>
+endobj
+201 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 427.12 254.99 417.12 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 200 0 R
+/H /I
+>>
+endobj
+202 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 429.47 262.82 519.19 252.82 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 203 0 R
+/H /I
+>>
+endobj
+204 0 obj
+<< /Length 2868 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat<C?'"$SnU5n at Z$j\6i+;Op>M%e`"RVnLV\F99LEI+l:#!<QU*ES!Fang0,Xi2Sg3Y7a0K?u/E&a@`C4Fr$IK-9MU^9U.gVZsq3'O0s"THig3Wn0;b/gGbCtlpIn(9.;^N`m-,ON)VCDu0J&$m.Z4.i:SB_[3 at oo/<aGPp)'NT,ELYO<:B0=F)tBVc at o'FT?t/(R,tboYHuGtuN$]6`BPUjf7$GqkdD7&"@EABMg&oAcN[R$<F#`6b;j]nb8+\`#WQR]FL%m#Q]h-):$%3-iCc!e"XnjJ!k?Zc1\eq;K,8f'Si);lH-bl;U\<F^])K:0),KNq2\2[B.h4=Y/t6*n[e$"\$*uHF. at GkgbNi[s7=Sf*OiF1HuXo^n1#"@(aD:>Wm&"<t[Z.Ognp#39m at laU6q%J].Z7)'p1ddM>,S!.jJXW6rPTm2F]JX0QOYS:rk7'AbLToIre:/gn at piGBk"bp]/>4&H/nJ9XYu\7r/iUWD#!<]<3@<!>ip7A)Kk.+WUH_cQQIgWFn<@!/\/INM_S#_"r$X3C[141/;.h2d-3Oj&'W348C_kg2Y;OV*W;*/N4#2\"c*kTt#s:)VSb%NPVdVt\,^5=W2-%'MU5*n^m*M0G>m^<R3#d:9b-HF,SF4e\_)8XptP0,tm"4SVM?*al1Y4Z at 3Am^\3FeT.u>Bl<W^GTDJ01W6)9iI7:A-QMV!JA7mOAq7X at 4N6V/kk-U'e+(j1 at Fq+Ef9g$ionI#Ca`]\0InmZ74@'SmU6/,tCus8SG_">(q!<.DcH=&Y3UPJ#J"3si at SJcS$mqc_-")l]aZqdH2<[S_E')IU@%K-lN]%ebPR(\>]KLT\<?:')2Vj'8B4 at I;2`!*$SIq9C1uf';c(m[Z4S5?W1$=:kKBV(1a-iksLn9R\+_HHMl98Q8h-\-o*H at jt!e*6\&"_udk+O6U,(bR(KPj$oR.OL<U#.R]H-d2\k6:U,jpfu+&i"dH7%D;nE,Q80&s>]Y'9CmSKEp`:-*"&JFNQZ=!`B]Lq-W&`!*9Ad*-'V^Ha<`,P31:$dAfKhSr`$;_.\]TPJRY!0@;PGC at tF:;VB48%':OS#j!$8F0l4SZnV`RJ]GiL,IW>DGd:/*`_r1e_:$/6qSrXKO8't3XZ+tT8]Iup(n&7a6FIehX$Au()84aub+0=0^_OE`Lb&6Q^GY].bJ?!UA5%.j!*PU/XG:2g1"Z^mh6ScU'WaTsU:\$OT.AcQ[?12-MapLBJDWpIT='Q7_H"9mHkoWNg0BELBKr_2HPmkj&Y1^CbI)-$/X?Z.FRGaA:Pd9%N at E1E&1 at t'qMi0+<(jE^rN7%3LrWUJb.-*LDC7WfD at JE@T1"96ZS_`0NLL`k+-S%Z?%7+"l6u4fPlGrc)+[T+7XeK4<gDY<)p6_(QTnP+h!8?t(aF"Cs/V(LO5b-J;np*Ip(fQi;Nb0;J$mgAOck+7Z%Inn*qbHpHOct?NB4S@/Yro`;0'*t8IbP.Hf<nEK*mb9^a,G=8pucbfjX78]&R94l"ldXM%JjOd<!^,[%&]g,K-]1k*s:<(c?26[F)h-f%(%?#H9gbUDX>L#QBT^R]p8 at g]Sut8o:H6YS$RjH#HX9G$AFHPqB3V9)G._5BhqOKK.W6JQULM>;$RG at d7\p"5:t2U!^<Crg^/AVaXgf9O3%$@^/&K<uBPLF:\:5"eo#4])G%N\UP:UV0>'O>88q``)5]UFA9'cXlFuo<7@>f0>7,^mGOa&bT^`D2J$X\)t]Du1'f[9[/oTECBrHF7cMfQK at 8!!L. at u&k)hR(H,Qs(_g0OgGNLqLk%pldm9pII,OF.d_Yd*^")he`o!qjG.+su5'T:+!6EJf)_fJ/+3t0A=D/hp:f)>kYGXREPZ"o/HX=#VDC65bj,)!A\6PS#ee34\eDD>N'3(Tsj&8b_S66%B_/6d*P at km\(k/HMtN7?nqHua5%$mXY'')U%,&5^aoBA:h$nh\@g:AOJ7etV+b<-\WX'k)H>-EO3%WuS%Oo&dX4ot*.G"AUk;h)VVYX\PV`?a_Tcq696Ub0KO]HRrF3]mJ=e#/3f#MG:UOe&qV;Qfepb_Gt)_L4\sfZtR8hQ$;ZS+@`O?7$cG"dFU>C[&bZIRGST;9lA:G-1b,as%#*EAkrBb+oh+f5?4`HcsAF%@%SuUc.BX3XC]`hV\A_f=HD=e,*IM`<*9thMMQGf='AY#8rIYbM96R/3#e"):l_.`oJ_:,UL,53f_1<RZMliIp\CZ+9f_0UXg9;Uf'LI>,f<_.,1[bQ:M5&pKoW"_HN5/.(aId*>r""E%W'C$RbSARh9aa8l,ga7*2Zqa"cik9bU"<E?f;DI^?id@\W`_XWHioZ-lQNAb(*5Yk/BV0aqL_KiL#u;I&-6CPZ=%[&YcPIOt0]p#eZ?fZR#8p"i\7T?L.bC)PbZ2HK%Kj^%>RCh>a<]n"%bab#A]teoc at Hhs3HZKq)/.5#P')B&BBOIVas^/9?tR[iFS'`8!fke":S'S;NhIh],qM'JqL at DhF!oUL,!2U?QAKintQ)R at CqfECbufc)?ia(R1dUAA,ce3tem8:\1Rl3*6jAMl at eM2>;poKjHoMm7*02X:t;5C<j]M`tD+@]u1d&Ae0C/F\79)Yk at I/B^qLje*,<"UHW06`6WPbXJc",6Df1CGJ'#r6g(Jj>H`]<eL:uTcR>Eu_I^0s&`nPl4O3ND[1H5aDp8+s\b:4GV23g.a(THcrtEsf*\_$l:'&E0GFjNMRI0bM4i!cC7/%\$Fn,4ndi\Gd%^\"Bd%$AZ at PsGQ$&j2=3'@02l)/BsZZWMrWI8 at S>>Gd)8.\:KC?5D5a\X\GMk/.Ae$i:HB%KJ)J>P)O-psT%AGi/e$7eKTp5JtU9XG+K~>
+endstream
+endobj
+205 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 204 0 R
+/Annots 206 0 R
+>>
+endobj
+206 0 obj
+[
+207 0 R
+208 0 R
+]
+endobj
+207 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 218.36 532.7 247.25 522.7 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+208 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 222.65 87.661 292.33 77.661 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 200 0 R
+/H /I
+>>
+endobj
+209 0 obj
+<< /Length 3441 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau/[a`c^Sna<U-XZc.+*%p/m*5D+kksLaXcc[KR!L=i9h%ZjI at ZUOQ+K@[@^dX\ZSh@)W:fSpn$K11Em`1s+>ndM%meM)DmU#@V?)W5"/rp`"&*"eTGL,I.^[HYdL3>5!fKI7=3;gL*p:Q_drPS'<]B:i):--cW1nl6+daXu=?,U%jV<BJ(r^<\+A1RA%dsbEKqan/*7&T,ho8cVX6L<,Yh\7r+i2s`oE<rEFA?uGQ-"KG$M>n*Y at OlmHPfRK7pYD,^dP?V'LQj$A9?&T=;rKBrMQ!@iaBqrTU4SuGYCb2eosV0I:ena^"_C""EHl]FMkP2tY?<h6j%n[ULPdYVAWYGN9;/UGXj!I^f5(e.;-f*_?W2#iC'H`sKhr[KEGu>M.'mf/k=A$!*^Rf(h_18MbJ*g,8otf7PgcA!*Tut#pr9 at C_c<.c9]gc\b*Sg"iuK(eQ#CcXX+o-qQ\oNb<6`$4L0STOOthV at aGL$8j\goYm*F"%^Zcl;Vkdl:,]U)!=eVKB89_2g*UiuQp[h-K7LGb5=\tuL*YYGS:uk8:;`8[.D6+Mg%,DU?.Z,?EGA3?JEJS/3+Gs7"RZUI3N>#U'>(=7BZ#Ng,."=M\rFE at bf38lb2[^96jY^a!B.P97KYR'K\:[3g>J!6&N!4c.(bS!tL5mOE7e.6b[R2oV&<#S<(R0U+XU at b<_I(Y at 6>>>GbEFnJnsNo'(+`4/(4Y<9Tp#)Lik^dGqp'uq#.5VYVDb5r9l7luULLNO<ie9B[RhIK@[$EQ$oXO95o(7eR8Y0XXRcXqcoAMQngoX?;E+9K-/H?V%I"YjBLpaC-P"+rAjZn(e91>if(l(?erbYpaHXlUc.U'd!RW'r*L"p7!O9ks^[P8aF"^!!c9i=fGPBA0IKN^UY1R<K>-ao/#,=1hBi+0as4Z4G8<<8b]5BSqEWcNp4n*k2FYcHHO&sOV0E0BWQ&^X#V4g#qZ4)$c/!X\ui3MbsB&KOTJ7jOHOQ=ATKsg at j[tk.SYpn"[5F:u9$=&8l#M&P.RS;p&\&\\YF%)sO,XDs81-s1&U6-&8QGI7p`:%XBI$>?`Xtu2M0#3"&Kk7LD6nGmM?-ZH:Fgg'Sa_<'iZ<"t at lb^W*A#rZ*28d5+RZ.b,`IZXCPc<^X)&N-1DffTWH%QB9R9MGJ>G`Xl6K^3^b8URNZeQ=0bq'ldT&$MaQ!g6*/oSq&3'pk+V?O\Z>^1W.ZbY0;VT`Kn"r2VcVEm=>4\A6rLj59ba[0C9#T-cO at ZX$:gSQ<q.U$@4aO^Y)!*KG.dHRZHM6,.k6rp4E<)rg_gTXU$)"*AK2AT_"!^X9SELHXTK,NfP_5fRaV05e17d64_ikQMG;qXj,Y>qL-J"HK#%Dnd1DFq1nVc5Kh8fniq16-[57-LT('!42EQ"[i4Zdc1)+=6f4#j4dB:SFg+Fh2/gC3`aGoAgrSOL);_44rJrZ+#skhU>!6B4YF/3NVW`jm`(nl,P,!;//te5T];OL*$C<mTK=\h&V(:BP&FN-Y;]tAb:D:H+Gf1:@s*kriXn_IV_9\"f\*NALANg;:8;J7VDcmYXXS6!^S-O$B(ERdZ^=tLCb,q(Er,h!GFp at q\9;Q.A,^k(-9c-duXY3_DYp#cg1_Kg(hj+aY2/+;jpf`qk5k]i-`<EAOQ%27FVQ58pHr3ZF_Y7/*Qqq1j!5BCW;?l_R_INK,YV\lc&p?2h&!8XHuk?@rA<;]!SK:3p>B:)bik"poS`Ee;b at tNqo9G&iie+1S#A>9Vtis4B5'AP0ojh-P(//31`t1UIA>'f`YdJGqi\LM^*3'E'O[?*^`.obSR5%an1"&4uY>=E<A\]Dp<K7iLuU'm)ad_LEmSF@=KK\fE:qp0OlX at MB[1E]l32=kB0#6RtiCtnAjrR^$\lqA)Ud\*iIDBHn3UV&?A"UO2r!RTg)1#3Fs\&Kjcg0;G5Ao7EKl at I4$"Y62+?)69d>%f*?'Z>kAtRj`G*MBo'JnPG,WD5>IUFKZE$b`\lQYrFKa+#kHaj"s8VT86M=TmKo`%6okRV0s%%SEZ$d6aK;Jul]0"29ZC"f?\GW`#(-D32%k487-kXmLh-Sd-]SkP9LSk at R6;b.Nb5JL15g_t<WkBjd$ubSkQs-.f)&KS>WK/LXMc+s5PX$Adui`q:L;CKT$;Qh<Wn+SZ0j8OLPiPnP+!4RGNP-Ci(O+o.+nA63E$fX5JV5[893 at mE6\9R<L`X>U6Ua$bb!E-U8`KqJW>!3[-uEZ(q*mN*t.qi;Aq.tOGD$`c+Y)+`W;b<*U(0D`:VFg]#BU>1M2Jnjq'sRIILhXhr81K.O#0*!AO4>l+nQ<:o!'d?NHO'3e1=?(`meQ<,EHh,U0mufN45W`=e4A9lGpqIFaG9R-t'SL#UPn5&)a:@s:8NEYGEOd`7?#HtZqPKD164gsB3*F!49_^GKjMI3\B;YaZ?:Im!TQqr[HOM)S;BBY)0+)4`.JfIJ%59s-/#"m=SoO`3HnO%jnf\QW$<d5K6MJkT1>R,uP_f(-(l?eiPd*/=)5?>iB1qOo[eh'l:lhKT`sbbr9CGc;H\QHI)DKf at 0j;`3@?Z:/dMV"S`3D?+cL2W$S4L%iJ#+XBq7Oq,LsSY\+_>hP?PXB1deK4^#P)lolV)ul;2=W5P_H-1Sj=AJMrfA79_)K4bkVn[MJ%i,kAe#n<1:i\D[%hb8KmsB%WI=EB#oH+^KVqPeWK]&m!`2X?/;cg?l]+jGiCt?L]E1I?!=D#ic)K>RfA+nV>$s?Zfd#k&&7*kSCNhc9G,_prCiLrTT<968+dm-HJf\f>WOlTke5FiLD\1&7Z=Iec(&b[U*.Krp^'a-epc9KCBUROV6LscX<Ahr3WZ3XpAJ:@mYqVj/3BU"]U6l3%Q3Dg\K;ZOWm)C at d#5NjYOTWK7dm]<4nO<jjFqe6e"YZ2Oclc?_15mY5F=^e@>Ua-R?I=T-4UpaIs$7lN>*s+?t,,/c^qNfT\8&Db7=B&j$)Qs?SV2c-oK+&Sg^5%#LYl]hPb;J=@p04.lHDE-e'h?Xal?Gm(6<ijap*TUCLsFe@%@q`cn%fclD,eem5*-Kj&NCA&*t<Hf&ZQTj;erZYV7's9:.\qR.X#`?LY:<!Sp94BZh%R]"nMsl&PI_[AGFlthEim0L<pT5Vd>euJ!P#?btD'&5X$pqgOt+H9JNms>G%f&McVO:L'K^A1\R8A3J59O;t;tihiKZ%2P5`;.UaspDJ6<#-S+04g:ZFarpejpT=hFAfuY/Ye_GYa$b at Xl*<db^Jn=0[*+hqYWNE74_c^"r>7&ZcJNa9c&UQ^gQ[%+'`+!@Nhs&fiXGO%W-7[jWUL/9>=N!L+P[5O+)!?0 at V@fT$%Mne]Y^O64Dj@[!U#"-i\5e=*<KB5Ts(qLN<(W=pCqP#(s0\U3HYE,jGe[j.qPRa]DaC%T"j*K$p68ZDG#6!bAV^[dk^Nq_N5Y~>
+endstream
+endobj
+210 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 209 0 R
+/Annots 211 0 R
+>>
+endobj
+211 0 obj
+[
+212 0 R
+213 0 R
+]
+endobj
+212 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 141.642 293.958 305.792 283.958 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 188 0 R
+/H /I
+>>
+endobj
+213 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.78 174.958 421.78 164.958 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 214 0 R
+/H /I
+>>
+endobj
+215 0 obj
+<< /Length 2840 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasash/D%-&qA57 at I20LJOJ%dD&)8-03b(W/?j?C@<&fh#?dp6[Z]j;;SBWUr[;g.)9S*_":-tOOi."SbY[lNkIYr1MH(9Zn`oph(U%05P#\U`P1:o0fHs at gA@$T"=9$!a5-eNrO'.obr;Ih-7\"buJl#hA)DYgK<%[p+.>3GI2nXW/5Rn6OhB/d>WOhAVfFcD]@XFn1RIse7*k5f"+nW_L8jgFHK90s#F4!j5,SF*IA/#7u+B.Vnr;WpkIgaN0/e`.]X%$:2?4 at a0SX-?5P. at Ko30lq`C%K%Dp?t21hFlg.lT!T6G,sHNWmr*?Z/P3IG\#&*l&ufg=kuT>@hN.Q9Zeg1;9,hSR:!@)-0^p>aZ:p'>6krL"jeQ<HiEkhpY>t?>nRt$3o7%1oi>"2<3.?L*U`oUp[OZq9Ji?]l_qn6Akl6i;6c^^>3+^]DjtMFE)WqIOD-.&`Mt?H-nU!e&S9'.=#Vq[Z>j<of%=p+a5!aGU2:D6qo@'fWQ?nI/7kD[M!XnJnTN(E$YufGkI%n^C:2e1;4N"#jum.;K8BuY'ar0$j(OX,/.dREqK`'!oqOXAfKgT*N4Al.'iM9rcNI.Lm7oLN7ca.S3LUT$<T!+!2Y8>sbSr4m7N2VmFFDDY0QGZgTu#;KPe5D?oA/GLUNsR4NCNaC?@=WO9W*[=R.Q&,D\<)cV$"GSinP]V"HHdM[M1*!aPrN<Oo6Oe0I^jJ"t!fB90q\a8""(KSFb^6O0m#e2[)07I"RKc1.kgPmKVP7Dg9BF^?Hrdq/=fV87\Kb_VccG0BVTF-mG(&5-f(j^^,7PkQA_4dDk^rVo\2e!%,Fr`bC0-L&H/BhW at Jnoh9:mQSSNf=8f(6T'&sJQC<@4AqF!G$'fmHP:>cFL1VN:]*W!1!<S+\H(@Wtd&8fj-$u.H/@mffh7aCn/UAr)-9gNuop2(lgKSs6_3FlGLu#_AOPqce"Uq#7eZ$Q7CCJ8#q?;T_=$9HYBnN\=D,Bi&qU^J'4R;$2=)tJUigi:o+mW=q4JbfIgX"V:hl]gKgChDD+[X.9W3P652Kdk63odoQTX]hsE/j:\HkNPMVg@/0/@`_V^$-T\oQ)sg+kt6X-<&mm7jY^\*>h2L^3@&A_KP%\qER>-!fGQIJ=t@]TG:,VdEO5.dO%M]V"a;<Ju2]9X/]l)2XG,o1$h06ARF`0jGmA,b-U0%]YL%eWqta#HKd0;`hquI7a?.OPsAre6XjRkPYG&A0]p&R2/Yj.1]q.d:2q8T;qs]]b+.")n9B*&=a@`<ei&.pLCI2+H at u:D.g.W!TkfU2#[fe`JC$s]algQ`4#X:%Xr(IaB;;QTAH^.#N%5l?VGe605ph2[h6J*B3Z0eGmDt`2s)h/OD3?FO(KF,4W[9:)SdS%R#>]ZnIet67r;r3I+7%uO3jrfLo_W#23B>5e(*0gG;K!oC.pb<D<N8.TCjg;WbguX![LM(OUmk(XDW:>$FoQIJYX7Oa.;G`Ek<*h_0RWQ at b0&6)r=dnVD&MGT*2fk7=#'Vhr'W75nm[)'<JH<H"k:H/]F['WF%h[V6Km.iPp.2:8BYEc03F^fi%N-"b!\'9KHT"m:eM#3oEt&IZ2N/ZTQ:gAcR(_Y^'i&)-LfSf3Z.41(Y=@]RTuE:8SFZI37B0@]gq!/c:EK5+UV#Hjp,p03!YQdoZ3d<*YumbYX8ubD8g5hCi)MK86T`mIaE at tLguU[*,9o1UKOWD)-RKp6E*oKQoAkX at 4C')KS1fUOKfEA"ci93JT.oS]j"H5XrWNoTKXJZF:J7>Gkk!h-$LuESI at P!+6[TQ.5@@s^lar8Zap0A!YFXLKPo89l-GeR:=5<Qa;IL4,SE]X)RrV0ZqYW6T.Z!n)KDU5>q`,[+?W9J$c*C4Tpqs!g^;3?RJ;BSJ'p/hRD-3Kdm]_Ln_k-CZ#9%,d*ge6Lr)[!;\t'"P<EPnU=H(XdkW*0(lt$O!OjrhfNjSnSIh_ggVW2AYi-UL#U(U3"@6TdgnbNLZpsqdSnqYcUmeToh&b!*1JZSc+JnqEMZHqLbSN3S+dom3Z2KCOVqEIn[kX?/]$/1UGX&_<guB72ac*tF*:?IS4:.joHSoRM?grUjO*i*0<9SnVSac#u?-IaOBoND"H-=;$1H3Pi:j[Z<h$**M",tHZ!7];:Tfl[B at l3"=GbYFD0(U,BT4o(h68o:+]5mJkXla**HDQ))]=)Cud,d$2Bal6cQ,=j7j+ at R`3L;k5.>InGe_)KE0\^\,Y9 at Yq2hY9JOtLSbaP88VWPDE=<uF;eMaCCp1!(d%_cmd(`+4`9V&B<1.2j9R,rIYAA!`fiJoX%'-C:/$Q]GgZ-`)4T"4-UnRgXLTN+pAR at 5=_)EjCPMm7#YR]&o8HAi1*&j!)UYk-oq$)&#eD#$luL:OK0cY;5<'6)^$,)#J^AQW@;"0_k?L`n6uQ-<pWd3Ud]1?-iMMg/Gn,IQ'pj,g+;Nm_`1M3[I<SI$_Km2uZ=koJ<TKn5 at jD6Mu8aZeb,&YW1msa8]ed2h!^p9lnc4j2XS9fbr)UR$Ifk'sp%TLrCGIq.\@>-`!<(m6aj39_$[ekQr]:cO#Z33t1m;k_]^n3!t.j,hrP<mIcnpK5sQ at 9pdMqa_4L`3nGondJ-UIO(6dn(kQodp8Qj;?<34S'/_B:7G.0E.Hhnuf[]i?>.Om*TT^>JC-6^7HWUj1((/io?.cNbhCRE_*Qo)?W.h/DQGp&\/ar(<k1['c))fRMeP?$MDqO/&a'Hd(9"gk2GdBV>aN\qhR1Hpgmi1i"s%r_ at X+P]N[RkPh#ldiNmjrf_&$=./mY:mn)Q]G*^o_Oh=(TJ4nTP+)(?HZ+;Bhn9"3Jp`\G~>
+endstream
+endobj
+216 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 215 0 R
+/Annots 217 0 R
+>>
+endobj
+217 0 obj
+[
+218 0 R
+219 0 R
+220 0 R
+222 0 R
+224 0 R
+225 0 R
+]
+endobj
+218 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 74.0 587.548 101.77 577.548 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 195 0 R
+/H /I
+>>
+endobj
+219 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 74.0 572.298 118.43 562.298 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 214 0 R
+/H /I
+>>
+endobj
+220 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 74.0 546.048 125.66 536.048 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+222 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 74.0 530.798 104.0 520.798 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 223 0 R
+/H /I
+>>
+endobj
+224 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 527.01 127.929 540.89 117.929 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 200 0 R
+/H /I
+>>
+endobj
+225 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 116.929 94.5 106.929 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 200 0 R
+/H /I
+>>
+endobj
+226 0 obj
+<< /Length 3005 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU6>Argc&q8010_3Y5J4)nOgUlZ:e+Nd>08i8)oO2sKTHuY]M'T[D`:a-+V)Uie:mRRb7=]p[M&["\F!KqIh;,!TgJnpliG*SH$WkYud4-u&d:s[@C`UO33a1q9e\=<7^P_mJl7igic6(!h'G4?EIIudQpn+eRU*-1pqr*r6IHjh7r[3#gRr8g)<IJ-NB=7WY#a8!"G_5"G3(Ql-h,,(cEFq3G\is-"B1R5\HL^k7!U$4-N^OpWa#`OT%2EHR7Zg*XH5q(^(IR(7Nf%g)AQQ6R02)#LTm"b9m:7rWB@;^<iZnIDa3"(eY!p7D8i>%E83a7.),.V6<m`sa2qQ3pZ60Q3d+6[=W_t^Lo&KC(fOduq(@"c)!/W(r([\QqhqXD@$9$0jIQ^<H at hXhW?M$KN.t8LKf09gEWn(jX\e(T?C9,@&B0ueZpZ%.`d)0<G[j[p)MB%%FrK4&H,R\`kKeKbEU6Z7+4L0Oo"QH)T8tStgaJbH'Neu4W<2-S+3$cJnU6G[qp<T<rmTUtJ7*=C_Q"Yhh6eiMSXaX9H/=EVdVGulIEA(lV<5jS"rq0F-8j:L,1?p6rB9Sj>m(*A$p(Wd/[\Tj8e5Cr.^,qmcMc5$FXN/:"`)-+0=>L8>rc4[?gIFHuOmL6-7`LX.q[4R9E=e'Hfp8J^RUin[qc-UJI$<_ZMLK4bQWUI@']\$5SdR,3A$[t&DQP\G)cGhCh;%lH`I6A2#!md.<c`,9-CDqrH!@U48J:W3rE30r2,,\<D7A7/G<5qpF1X'[_%@>\0AFl[?>%0&mF+E-/kF(H.3KcV7<*]&p[a?H[!qP-UH[#Udp.8'Xj:,^c.^<c8)/(ome%FR(2P,<B/Yj)&?0=thfK"I_k?=4 at gWj=NO'ZagfR?;#itF>8I<>VN)VZP/!8(Qmq#/!oc at r$U+_O73f&#AFOG>jH:]m?94s7RQL.-joh;m_ra;af[T3inO at ItI=ade=ogu9THU:9%J3Zp=&l+9SU(Rd::,[M_R-K4p7eIo.?L^bQF)sEh97T>f<!P!'.niJ;^7AT.$9m@,6ut3Ij<Y4 at TUfXoZ1Rfo)548gE(Ol'q^a!I%[n\?%'-i_\K.tR;h%PX:AM?)qC5''W\lg=bU1H?[4=XUIpq0L,nd:LLUN:\Co-LL,DD/Ei6"j$.:lF3B"iC2\DoC?%)IL4bjE[;M90u?g-F(D.gueoj$RQr9 at O*,2 at a6O6nIejMs!VA*U7nFZXmrP0ad",$24m<3>*1LkJJ>HZf-8"k(QZA4Jt/J<.T904_uWWTU#h$%ca:AHHKA2BU1k(YN"?UQS8hX1_N9=eXn<jn"[T!'(2c]dYGXtM8n&fJ16Tnk,F3r=BdOh7+],ghftc5=%r.&013tIWBT8\?%D#-l:$]1>>O918tc!j.`Z:43>BE5Nlo#/ZugjAc>E1WQN:RZ`%rWNE=l'CKlSTWU]<Em\I,<!$T<N/5le52cE(qT_=A14aWh"?^O!5Pno7Np&M)mR;J`JM[$$5BoU\UP)PHICgk$'Y=/?/AAis$UGeGau[F,2"`X=8g7F%H7o0_GgG0rqF`rOm6TXncP+JLY80Jihs>Dj]YX^0L\a9o.#$-1dWLg?N?_D+K"Sjrh#m"NBF]nh=c(YbH9QiPOJlQNI/]J8.3?]W$W&5Y4sB4^*M;L<>AUVPJb9"(f at 4)!cCbQ4#)0?%>iCr;-]5Od]Dbpp:%7S8a5.**fo!C7=GdOmC#q(*K<MI*cr[/fVO[7tr>C=IBY4(Vjp<T!"Cb"f>]hr3n_KFuq$:Kj7AHTHF6 at 6*e'')%pD7E\DG<qSU>=r#fUT_Def\_IcNSIfij-I%iu-]Q^h'V;21Y1VZ)]gt>s5,h/_XFoGi.b21&<&>^^i].IHBmBiHZ7q%@aZ,kTGt00d`?!TtWNJTRnR[_lc at XWQfW1:XkWTL1A3l4\3`lmn:)lTj8;,p'_*g)S+]-G9?jHdM&c at PC?T-k?c$;1d%;U=^o\b4e=W)W9nN8WECV#NPLobPmLFF`$lN,/[0V6S$d\kinnGu187+4%J;"u<J&`fIZWfsYSX6]M=`@VFEe0S9b\1TlEgZruGbf%ECaSJT`dHflr0&%sk52cYpR/_1X%9ZuEk-=Q*j2")Y(,dIM,c3C'j?1]G#Yj^"f6^bo/-CKIS at Nj*Fl;Uu-(Cos59l<&L9ZC\bXJiT1ug0g'he"SbHGKj*!Q_8BRZl!(Au/kJ.:UcrpD]FUQmQm^NJ]]-^u5Q at UT(o6SH7[j(upYJsn%2Zp`TKh(<e\ml-&q,`FD3E$Ffe!ru0/@3b;C&?.,O45^MDGS&^?Wd3,J<^F7np!rW^-jl+_o/-Md at Q.;Q-DoLTr#t)(N?6^bN0j\f"$D!;4'EW-M3V^3dg!+9&\K$.lN[BhC4c0rh-Lkf4Z51a,_LI<a\2\"Rt;uR`r]qp[VZNW%n&L!VN3$cm!*a!BKU6+esWn'5cr3a(=S`ZbbplQ:n;'>]NE0k/E=Xtr1bb]pi6I'^;.G:P0ge07glBMaHXB%@QV!$fH-a)\CL0#gFlRUc+pGBR9tRQ`cinEYDks>.;.5n*mg97Tc7gOg`T1_+NjWDd:L<lmn#E7OO&Zh6RDd+#?-0po.5]lX,5Wlo2/PRrbi<*L"P;?$@G^>#&D9NX9\_q;@!s(hQ)UV"G:RNoA^J>'I+)4UBc;,I.t.9lt<L_XIF+cm1m*Xp;/e(Mgn5%jIp+6R4[#&)#)iKmIChgec#GJ02\7dg+h'G]f%M9PGf"l at K;u<JIp=AL("(;:ElL$U)HY73-'=l5^IONS%BZ0_e$@J"h$Vjpi`B+1:+m?D")-5>j)M)9gH9d";K at X(UaV<B+:FR3"o$RrSkGsnL8rF4g.64cq'^73R/r]Z;!`085HuX=GOH]I*+-aic4e_a5,Qip6R5tMj/<GU8Ib+ZpW;Wjm$gZcb$+2D:`'kRikme"@'9Q0[:E8j)d at dgFo/7QFa<2fVOM*)ie,6-r8+XDb6O7470paQ38YZ&;S3frs_c:N;~>
+endstream
+endobj
+227 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 226 0 R
+/Annots 228 0 R
+>>
+endobj
+228 0 obj
+[
+229 0 R
+230 0 R
+231 0 R
+233 0 R
+234 0 R
+]
+endobj
+229 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 370.58 689.14 510.56 679.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+230 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 362.51 627.701 498.04 617.701 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+231 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 341.062 521.701 369.382 511.701 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 232 0 R
+/H /I
+>>
+endobj
+233 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 224.268 478.701 290.618 468.701 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 200 0 R
+/H /I
+>>
+endobj
+234 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 437.481 478.701 481.911 468.701 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 235 0 R
+/H /I
+>>
+endobj
+236 0 obj
+<< /Length 3076 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^?]X6U&V&\6iO at m0?!7je91f[%jH?CNU-MYm73 at tmTP]#"Sh-n)]R-,DhiUHDL,*=WP85P^f[Yp?jD[).IRELXmG7UD^'[dSAZP4g/m(9mKrY3&_GqMZ@$Lp&b;RIWHX?[<bF`PJ</YhhDY<bSp(&:6XMOrAJY46paWd&AE%:Jk-/Ic<74jYSf2B!HJ;d-rasSIhP8oq4YEfRfP\'9/o!?!&?PI+2])qZ%OS?9Cb=V(s802nNka,nUd&=WAT66!4o3/T^o=J!u0]`8,CF%tRENTZEoo4A;1F<]l6b9CT:!h4*P+WMP?VfO_I8qGkd:`996LAMb^G>SBDq=lfWn.37qf]Z]A#rk/M0Z9t*3gco\rcUA[jO/N"!$"Sq,4TB0+>TS\J>*Ud<i`d7Dn?V8bKO<2Z;=-U-Ql2%aq)iB/%s:dY_<rhB/"MebY5h4]Oj+qGQc.=ngkUT2eIZW-3O8(e6?W0$0 at 8IJ&l+aP=T$&H#^5[;9C,cDa/i+jP+K)TKEULupk!)NJ.UYCelMB>t$"1sB,J_ppF-()8E!UHML&ZjgM8`'.kj[-Y\!'aKKKhoepKU*us(mV-e7NX+Al=RM*j5pG@$R at W7BUrK>B=[VYh&Fc)<aTFA$01HRW8b/0%N04VVHa65+@&t$r3A.EtMcT5W?'?g<;aSrl;a/C9,qh^c,[7".5*G*fnEefZWn5Q$@(H\T:B2a+L.+[K"&Muj!Lk>h$]"8%lHUa5,b7s8WlbG)c?nWN,<cJj;H-Ws->8YkbY-D(gJWgY;Ol8Y)5G%:l'qu(G-H=h9Q8cjcOk>TO%YVO20lrh'5e+:c(W-N0h4#3cfj1=%p>(YGm5TNB8I%Q5aP at 4VGT7X+kJ[[RHJs`#6b-Ag^7E<QZ=9qRS6/O1Jr$;pB$Ao,<oDTGfEmTDqsa[o^2 at m)f?Am,7Pl!7[DB#f&bS^5@"4+N^d:,UH.Rs#s2U[o"fZ.:nPa=L319uLO:e9,q@;heF6)V%!,<tjaCt8q(+tf+Si#j8=[W)oIhAQ%;&7k_r6?=AH&n`01/LB/5>9+$F-5XYT"qlZ^`Z70kh>r8SRsE;OW6:9\C=4[lt7Wll&OQL6(BMX`u%##Q-7n&es^!,gJEnP0!"NO1:D.3AF8j&'h>Rr[/OB@:3e^`?+0t!5X0s-5-?f-od4h`cJ^EJorSH2t(?tE;.XH_A'I_h!hi>'!ZY:D_si<,*%Y8SE5C_+8bhaTSUSn1W7rtDlM-I")T2-Q+Z&])2j*f?$OI)EbI1:=2_UYK?FUL7/1C4(.S20el6[nNiI<iJRu&*6dGG3P3'Ni]4L4e><Ro(6HC53f]W!_.R-)m1(j9kDX@]k]C_f;;[D\3#]L5`OA-qJ_D]9a9uJ_O,7d[IgOg9Ye'g$!a9Fd7-Hn&8247fV.K6%h1LDZZGu-;bqZg+?VaFLGgZ`TOZMZR\Ra.[#YWu'-52\Gi/B+CKHI3P at kpXeY4S1Po)'YgWoNcso+Kpp%2He2LIGMM*g>[08Gf0]=hT>"MP.l@`B:J3l4co8V#HJ;_-YnblSBN],\T+(B3-Xc[:tu+C?!!3/Y(Wsh3rSY3L<FK5eX6NV8&J!`.7j!n49d6'P5]\gSf0lj_J;I-/6">h1s;VsnIbWP!DF$#7lb$X;b)E!KsjtsWHiU]<9fg5H**5TBU,\%*,Iq464hLq)Jn8X:[2)G._1a>;A[LuNtSlmIHBpa`Ms(NPC+XnhA\\/>b<.iek[ZknpTOU8XQ_5oW?uh5qO%*oqb9&kP)IjhsBctRe7fD`.(TU,Chan85EjKBFl"P^g2d0Y<mV0KE1r0AE1g3[0?WYRbfK%gnngjdMeH8FAO3WZm_4M1"R[]/o4?RhJON;M5HE!0t,JN(S>W\iY2eVg"aj-_D`'o,BkG-DRjsm[__`><T49l-dUS)9mFu3\g2lp%"ITr>^LXY`D\'(3!XAW<2NC1_iT#qkJF`edFb"2-r0AOQR-%"BVGe7'XKRNQ">sBSK[k[BqGX_DFr;@g51PnBk`dKL4L_`IsY6j\)0:9+?A!">f^&Wk>C)?r?FQ6`*1LC`?34%l>1D&lqJ8;\;HLUHPnf=<$H9^/MpI<$:REZqAVA-l]PSn*TU(&BLSX,!36R2PKjUZ<GDLPhYIoYp\g<PP;;"&_8ddbhJuD:45%>=>>KPL2N9kF3u4S6KDmuQf3F-NLrV'#%b[*bS\_IE$[_oTX%M.EAX1\^<KQg:"X/(+>=dh&_c`.>()1TXP8pbpHd7PT@,VQ@`>aWa?t+f.=AJuh at p-=7R;0BP&VhcEb/g^M(PJb<Z>cgLoa?$2aqts;KPY-NcHb.^4*%!Mmo:U#bPg!<D>`j.mZ;:J1\=_hfhFq@)VZDYX1r?q[*<%#(qUr%SY0NLHc5(&0]t!J,M+u7`uT4\m]M4(kC at 91k\*j'iJ>B[@XR-trm,]+<Hpd/,U=[WGEB%J]X9Q6_F6coaanMW\g7mki0e5_.mpa]f'OT!1JqX)G+p^_ at Rpm#/7j2,CFNGg$ti4?A(<AWGKiPj&6([TX`c!R]5%.5emqX![:K[?fmCt[/mGDkqTCNiS0lLsUoAk_Ue90gP/W/!b]4JDn&l!rT#'^j9mYJVf!:C7,.]2:d^iQ8QYXDUndX=-5(mXq,6$>=3C#t,jO^2Wod2g[3TJsCCA6VnamKVL,WSN1/_/Tu=gX#mO4jL^j>dSQSNaJhR#_Jl%rLfGPNCG8')f04(1[`YOC\EfCPFJI4emqpGt8"Q'=k-!"Z-9lb8kN99Z/8iN0/RS1->UdOgqaT\k(p[IPm_U>!E at gfSah[8DYm_O'oj`'+6C&jd:+TDELCW?R,r]bdq'J!-cAL.qE^NF77kTl[<'L_2.;1/&BY$PAK];MAPeTTQ[1*T9't0@#$BtUITXALqu;,C&Ogs6Lum%;+9Y(7fPWc<#mkEg"a9/l9Ck"?Z`.]9$V!N2d.7<'7IH#WAi0'EZOtjgYVn0s5u!Z$*YZU,b)Vk!)L"-*UiuTpL-.U+jq4QaF;G3^)"bl*=C7DcF[*UdSQ\\o`!9eU`I/fNl.rg7j5[tgoJa<?3#Jdn$FXS3^b,doP^-u/R\~>
+endstream
+endobj
+237 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 236 0 R
+/Annots 238 0 R
+>>
+endobj
+238 0 obj
+[
+239 0 R
+241 0 R
+243 0 R
+]
+endobj
+239 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 313.01 689.561 376.62 679.561 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 240 0 R
+/H /I
+>>
+endobj
+241 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 285.85 527.987 306.4 517.987 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 242 0 R
+/H /I
+>>
+endobj
+243 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 310.78 477.548 374.39 467.548 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 240 0 R
+/H /I
+>>
+endobj
+244 0 obj
+<< /Length 2651 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatTKbDtU at o%m_^jH=5q_\K.p2AdR#h#NX+Jd$J*LRgT4-/'\8(*,Q8g\L\B at S&,n[-Z(IJ,u^p at MS37<.B:AptO-jL'ApU4RF2Ac2N93!r\0t;PnGJ^dq'V:WL_0hc97CEUu@#L;!'L]sL%]Ic11*"oeM2q;:?!(X41rGrXt7)'^;pcg+J-Z?W10X^.8c+ at s09U8uQTd2dlD>(/jNDnhnjaKJ,G;j-=8)ua94hg:\Se=,!E5;$m?Sf][R_cn$aj5=bGo*?4BWJ:^:bSgl%cd..s')DI at 1%uTE\+rI_li2OnIh&4(U`n9Ge-t_B$e"P,C_;(W3m+h9<n]F"Q2P at G>G+-X^+(^^l8oAq#N!/UA6EDGJTnQd+LOT7<SnLb,o6)oOQ\_YZDoHTW[eJr\Nb1"'?1o\<SAI(]cUr$,ji,(^h!WUhG+]CnB\,>^e$C(J!QAdc<H3tFIFb&C>b:(jR-gr=E,R['IQbEU+R^YEl<j=!f=G);RD$7`BbUn-BChe2WD96<OZM<O5G8kPQnI["s^n(<btWZl$+Q`$WjY5 at T3X><SR2]C\__=(KGt>@BfPo/8-kU;r$nBM4;%+%WdfgaBdYAN`f+4?W&qEGI`Z at IkijCmEjM,:,b$#aW)QObS.nk=4N.3W?B>-_Bo?*"Y?L'R9T_blUZR$X at pBT]:qS0-R@"npO'\!%8GJ$_<8k at jU#&kTEB+pW,p+#"l?sZ@[9rUL+`Mh'nKMZ?L7^iBGnr.Mc5*CK*^E+XDKHqSINli"iZ at HO[_b/rUNB6-X*K%_1a$UmfE&3OSj6p)P)S,LF"%*fm;:=Bm?8hdqlRAN7]E&;4$J!@'WS?'lJ:jdNER+=AoJ7,2E]*QbZ_Fnc[.G8>J,$j9s*H;,pg:eW'*@h;`TeOlt^%)Ij@*M7\2AT4P%fC*@:9Fs],/ABKU;[h'S67>oM)[NMQ-W\;>SCr'>gFq&XmKdm6\O^aGOl>`&t((K!o;+0m)?*(.M7%$^+2=066QUs?gq$GGCnVdk-*6nca;5puK+*E!"4"#AL*H^$pW2#q^*;k]'MH<[I\g+.m\*iZ+UdDhq(%m9;:3Ojpe=-(t?+AQss5GM.X8\81;&Br^\jrsd2&uhCrPWKV at H4`T[i25k-[=h<II%["biUAnO&'+OK;Kr?*;d/_D;O7. at r@A*L\37V,I&0WHS6=X'Qr$ak[oq68TYj!02B75aR46+1XqgT9g%gd5u]5Z[,,BuINuhrFDG@%/Ij%g&*+2K9:,r0Scgl!p3dWE,bKC*!"*j2a_K%IJ?^O2&1?<T/7^:8J-isS>i+g9f4%4E56.K,UU=236B^K6fX!'28"@"*%2WOdEq9J#Nlu4i0=BsWSJo0T:bTCM&m)N2.jA8EZXB0_<glqQA1^CT=q$%N`)'WFr=*e*Dhu at sR@21t>'l6_TR6c>$W4A3Z[#]V.Qu8R+a+%'8*_=$&7M.NQ?sN.611:L_m$[?_O at IG?HPqlJC'$eAVmg&Mk@'L,dW*]m!thFF7KX[-:;ZcETY*d'Xu8"845J^3!W&A0K`^cVu&qnn1.D;R9+Fl,edX\EMqj'-+AVt0TJ[DZ29<F:cDG&7.=nIbYZ(:n_!mgN/RbNR&g`nHf0l$HOYoI2kZ+>R'k0iJ:Krc3\`aB_!VDhRPA,XmcFfVIQ#J_&YIs;O^r,id'gJ2_/bpO`T('Z>)fLbZnQdM<TI@`$jZfTMn at TuS<q-aW[d\9L\[G4B:-RbA"NPWIr=:ac1+Qi/CU^di]E@]F!e%lqMHA4^\^<,q8)[nGL^Ja(,VM6S-)FqDa=q2lP9l8EMVoAGa+4!!m]c*F*J[g4Nq%3oCR6t8ZG98QXY(Ke(.W;hn#/C*iipA_>AD$o;OmE&^(r8Td,Maqbt+>[9\eL,'eeV_^Ha$YgDCb,6)4/o[&e4dJ]Mo!d[F'>`PHAV6ZDY2nW'A$j9@\#W&m!emG<`]"%3UDh(<f'i8NLP^M'F^gX1&?1M"aVW![WRK:)tM=X`@-&5Y"Nld%'S4'p2D=p>S`>ADgE=?uW&XH_"%E:pY_tT!0/'6E>Rur<b=tURcM.TJq](lbDQ[mt$5t?3*R\m8 at C-ha\Y8"Qb5N9ta4mO`pol2bhs6lF09l`Q&pEigj0%=!W0=/2Og9kg79VVg]3)_!qAsT>U1Sg3;mKid(S2p,+\%1d"%3,;<f*L2^eQ5<9U)*>N*^4GohkAM+A9Uj5MLqTQFn$o&:SDOlZqX\<mrd*Y=;&4[pNT]0\MTLOV0$C=kP*Q[5$aZ7=pM8GFb0708l`f]@uCV.R$\>UG2<'?*[:d'.0jtUoP)f?qaU6+Hk)mV\cuTT]8l7=;/EGW=`>X_)9]ZNU']7-mf"@B4=sj^^LB\nT6,8M3l(M1$YTKQ5N/kpkWDRL#_3eXbkaePO"&1ak+$kK;mMcelB$Ok!))q:&(iDE/e5PNUOA?6!B`53&!*97:NcpKTBlu:Smj$Ikb^%\(k>[@r/B^(L(=C2hn]<$hn];t_ecm0)HgUS&"OsAYkHOihcX?7n?O29FQ.R6.^7fhg$ddXs.<'t^Q3jH at K,sD)OrZWL5u=c?8Z2uHhc41a/?nK8Eb.eTt(&riO_BPRLUWap]T7/>$S)%+,8`/8)\;Mk7Jnp8 at U-:W#M\o9-B'V#0-!qIfce\e%l~>
+endstream
+endobj
+245 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 244 0 R
+/Annots 246 0 R
+>>
+endobj
+246 0 obj
+[
+247 0 R
+]
+endobj
+247 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 187.82 206.253 251.43 196.253 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 240 0 R
+/H /I
+>>
+endobj
+248 0 obj
+<< /Length 2516 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau/ZCQIManb`:mIjiZ*@$`D/X_Y1,&%MZV,RB8e8;efScka;A.Z4c_mB6J;7jKAj[?A1XUc;c.1FD;`Ud&a8m_:>31a'VHHajA?O#M.o^d#EP6GTEd8Fg;t4`12iN`CZgml,H)d%>d=*Yi<66@<_omrqYfmCbN#DkJ`fRQ^]F9%<lhBNiuE]u0j:rT:T6p,e?i)("pOK>6q!?/:\S'7I3&\-$8I>o_?8q+.r=7@$CHaYJqHW99m+1lk5l?Q*`lR>T^H^;s&0kW<rKLl+.0deEE-kXb7$Z?*MK$k[#M,9>:(q-G$nfG<fc=[V`:4/)G+f. at X)+Os[j'W*<.&l1Edm at o0KU?Kq_.kO\\]HrU&kC[Ck#<XNanqh<\m&H5pU43$E,-We58-t8f"8N5jjm#J\-=87-;bUJ/K66o6%;cr?H=(e at J%4qcF`2j.<Vk<W*6r-C&;j`i4cPG261M?bVCA4,7poA^A[b*ir6ur6&H;q9H-[FbGSX<@THW\2`6&\nLl/U'6_%;+,S'a-NG\jKZ:.:<,ARm<cT5GaKoRns2"JTJnh%tA;,aOOXVZ7LI:Z_f[K\]AH"N,=jX$cR--CgXE?=ZeFui_&C2>7(U_bmtK3)>tH,'Xq:\NuC=%)j$g#R;>qQe$C8`grrE;_OXc'*YrS/-h^J)ThfM<XMV/RAC1YL!W[`Crp<5sib=#\@4Xjlm1BH7dacQt3`t_?mX*33n3jq1Na7>UXcW6D>4#Ak4]C(, at Y%J7q`"Wa&e*;@K,oEt,7[Wc7c9YXtAId/Rs!H,1p at NDW%:ES$&I7>g;L^JNmYU[5"WmX:oL,rpeh?VE!'MJ>ugKl(j'FVRD\q0Wm'j9X4JRK_#&I%2JIaN^Q!fus8P#6&:Za&,TpBWBeueYQs5fpk$BOOsZ]>^]=-`&*708c=%X6PB(PLNS^[XXu)s4l*4$$C%S8%XeO^guVLd5r;4Js,ruLQ=H[[5UoJ'(cs9m]d20+iE^5qdr:)L4io'X,3 at q).Z;/4;+0CdoskoP/r+9^O:Vc<jGr6s<iX?FA$'tZPOoN\(X.o0Ir-0?,XNJgH^sJcEKJF!?PlL]3(].3IcMp%B1h!c0*CF^Z-U(GHe-fd2.-%mRp>9k0N[Z'C>qZb$KKI)Sp9,G at oY2bisrQ-X8*VZ.<KtghChCTTC/ER7dQh]>/5C$!c3?#r!=B$a_QH^SIi^M#OnmKG8EZSpSKD=F+hPZDrKCpgrd%K81 at -Zd+?UsB@/+^KZL3@[uRF.QT]=)KntqG"@_YjHUGRp!R0=bmb\s-DD%KS3,o0lK2\[b\[ob9Z0^0SN;=umZmW&l[V.hr.%l$;ihou2HM_#^ft at c+\'t[qT2C=0W`b71,XpeOG_9"1$m?4Zr]OmoE+r"?+:,iD0d2.ZhM8p0PB.;LjTK/h#D<s]H:0_qf6G/qiZerm`Q\5c\*GAr8q,oF3?^7keW3_,O*Y8-Y^/W0%iX(/ooi3rZehI>Z`1&'rPeS;e)"*;\QUQ%4G&7^^D9JCkQ>occ5Q\u<R797]gY_=%-+^]/rN7[1k:]ba`lS$P`/(<fhfOB,#PeGD#!2$L;3Z_m[MNeD1@!6'tkcL6W+<orkrg!H]LUB=hifBCgm^2pK7@)VLrS;<+ZRT;C%<KTsC.T$E^ieML6Bg*MT_sNK95-+(k5c at 76Ja%5GP/8t^g-dh'rf/e5.U#dfd&UaA9G^#DIX!h.0D"l?JWj8hj4eA(.']]3l;rN`<a4V4$$GahhoIOi`g'hetbX?T#-;(UAIpKcPNIbHpR^4`6+WdhVl?E at r(WIG5_<SP:MofNJHlH/A*GXJa1]ld\aMf11JSiJ38BCLBdODLkErj.G.IYYmhOS-hSp2]:+TDnLt8meVh@?)qZqW2#Yrq"0UOV19<_*qE5#*$DB_s-^]UEFj>]W?02`:-j\b6FX^jH__h=Lb-QB6J.^l^q2cRerFVYI'7"I>_XS!opM1Xb!H!KCIXsDZ;Y^'`*iJrc&Od at fg%pd"/GM&Vp6L at ZlhLZe_%t_J'I)Cm%-NRO3]J&,-:dbfFTCiuN5B%V"Je)h]'";`420]Urr[PS%?t2hPT'.Xha`][Zkq0bH#Jk8FgCG'm!7cjkm6.qbau=Dt7nM&OBPB<m0VlB:@6W#0-?+)C9hprf8$a0De7N-0iD#$F%(N#"fP`=H3&?M[d9m!@_n(Z'`VRUs2k?,P9?"qCI%TmZf!CHFE$QVA(0^cEZI/ndWZ!FVhVnI)gZX;Y]:m43Nic=0!WogS""(e/]fg at _:aODZQAZSq^Y=6<SF459BYd`Y4?e%\0X"O-4NJB$r]#*AW0\E@$48oirWJNf,4FGi\8,,&tEiFIr7pc- at WMM66;)c=p"3)?)rFa<V.P0e at 2=Z#n:e8)KRX/=.u_>`ITIKQmpR$Y]7q.Y3I]Dg>`Mj;,MQfr'bO;0r.^,b!HoB,)aQTg?!reE'WrATTSHIan\j.^2VF2QBMCFT!`5GnuqgN^s!Rh6iuV.iqarW/_mQ%HqTL+mY$rWcLnJ$A~>
+endstream
+endobj
+249 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 248 0 R
+/Annots 250 0 R
+>>
+endobj
+250 0 obj
+[
+251 0 R
+252 0 R
+253 0 R
+254 0 R
+]
+endobj
+251 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 397.6 475.681 461.21 465.681 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 240 0 R
+/H /I
+>>
+endobj
+252 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.55 249.801 195.04 239.801 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 203 0 R
+/H /I
+>>
+endobj
+253 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 214.48 249.801 303.63 239.801 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+254 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 296.514 115.501 314.514 105.501 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 255 0 R
+/H /I
+>>
+endobj
+256 0 obj
+<< /Length 2497 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU58WVph'Y`2&Lq#,`F_A!5_[))7%"\Qed2W]R6EZQRb=jg'Vn7jocZAH;T3\GG1u.*:IX[44B'8T2oA0B-mnM_g^\Qob(O/"pO8QdD at _^.#`XA!k1oe5#^7W&F2ns1smPf(@Vd9SCr>qmZ2B`V:?Dts:_ at Q7d]5P>H?A5SrO5Bhre+uD55HRZAg;HeI9WdE@^@lH>1][H=32"*JmTI^9lWSp`Hh73TI\?<@1M6$.NB"',>q/b(FD&T8U*tIdM&6Icoo0LbgQ$l+Qqgt7'Bg[c_SB#c1.)V(*L(=5;@'tK4Bl./347>$RM!9N+H.L/[7Q+XVH>LIj;(IK*38sYT\*4SGbBX-TGb:BhM/FC32U2fkcgm*ks0!*L26kMG6=W<m><JBdq*gg(TGhUF+TCW!4+T!gU"HFmGn9X=L5+1^X=miI'_0QbB:PmhM=,TqjLMQqA3LDn7Lb!)iK#FL_L=V^*86,$fZ0!F\de9lkaMXd=nnToQ)V,*N]T,O$(e%oZJ?_+rso)cSCGgd%mnS3GETg\$OjCj4pAtS_J,_9=q&eWicTaEo^.?I:K$HkL.NNi?0TVi#p8B'[%B7KjRC41-[7Oo5s0\'douQ7&?a3JNPu at gWgkhr>rhq`oa3Wa;i_7 at Esa]r]NRN2RF3ZNDq,#gbVrZ!U'n$1e\l-hkYsQS=[@$5,*/kK_!76JQ2r>R>;E<TBe3LeqB%r=_92sG-n17NjdJXmDsn7%r=;TmV]8Ek52WR4l<=H&SG#c[=j'$mYNp)Lld:`94]SKmS0R$O!cM85:^kVrM^J&>+DLr%*o%u-;?b/3/k]6?h'^gCsT*lYC-NPgmW/`pcP at uZl0,$el+8;E'(@/R,J^B9$a9E%Kb(nK-`S]MIXtCFZp_Bl<6IjiiHn,*n6,n%[0u[DeWZ+b>bA2[n<fLTVG&=G/on*XBJ6D.3.Hk?BA%i,0S\NT"+F1Z7HCPeba6g!?EVjICQO0`.;o at WAAER@08U6+e!W#7_H(JNa^2N5XC?)g_GIqJ2p1?T23cU;n%<,RpI(OBKdJiW$=(Xl'NG8rn`Wm#66XPF9#@F6Y_XnOND]D:*I7*e48NDA9JJHgik0M/G(s2J'[@NR0<8SQP4pLYHW0EN(ad!V4TbY\k8BL&:7gqjlehDUXY at I:j8\!$h2$6=[@4tWGXA+=,O<303#JA&8hR]V2qup:hX[8O+#mp%]GA(J739K8N%!;d/;W(o\s?N'nkgLJiL'5LJr4aT?,CaR%qInkp6 at pnK>*=,6b^p'<B<E49GZ;h]e;Ec&Et*>j8JXlFM?%99G=#U"R]%lVq0=i;1BQO?K5\m:F;p at t1E&7,%!BLRr%-?c;-]gO1LMdmhY%<OKWGqYk<n"`7ue#C[;8mT$<lf72)nKh3G+BGR.V8`M4!G9be`E<F_W':N6OW at 6&&Rpg.E=_:*q.%R+19V<=Md4!4hlrCNJ`L-sSQ<+njRT'A7)-%OHUf^q/U$J2q&,R14)sH[`F,-U>%h`0K+uT+)'c/@iRkYofSPN!Wea7I/SKJq!#2#NQg'Qb//nea):Mab]0RmAE$o1X.k)6'hY4<Ja0cV37-rXI'c*B7E]ClS?9:potYkG?&aRVV#"Ze'tKk5'(6cG at b#6iHSPu'YF($0g-6I0:M&/\S-`>Ru2S?c>$/o%9['#`iZ3sbI0ng0`?(e8ZN$]X8t8Smf*#cghI[HnG@\Wr$$.oMtbG:VYS12+3-l&o_1VK8_M9t&kCKEDT^f at Q1p]F!\>C^UT8U1a.6^+$@/ZF.kN<.[-IBT^WC[,>,_P9oD!lSkkbC2PR(E3;&>o$&bq.Ae4mWV\I4Q=imoBp5 at W3Lt(1*-fWrMPH\'!?\"S/NR=3+f2XB=jZGNaXF_iVfq.cqL11QC=+lSYG1;WEb[KR_:d46l2.tBNTC$q4"K-,P!OEAh5orqKmpN32=hs6(ER$<F<ki3D,mMrgdel9O`n..9*_\X^6/(:LnR,%R2S?R'KlLfhQg1IH\IjM:(9J'G$>&NT5?X&7VSeET2Z0L at tp@I_N.6<c@!gE*0l\G4B&:nq1 at 0O#`XS:68oui]4VZ7T\_6%B8&ci77Da.-!O8pifBlVfACa_f94k"m-&Ut]8/ko)9K:nj",td/m*-G\]&RZ&g$W?jt,tVDSMc.[/nb)&6UYnPOV[X`5n!+H\8B-K05Sa2"\>6LrRE>>N;0oaGQ_/cf_q#]<2sO at K0"bo6%P"Rm-f,,g\,-2VYCs?[(_-q]0Hf-G("J at Z]D36Z4?pLM;2hCF^oi7H(07s0/6*_0,d6+J7d+eUOi6QkmJcd>kl;;^bqUUh-lr.:oEaDG*QFc'TYbg at YC^'5qhQ&8#E]W^UDMs1]cf)NhG%&Ee#_bA9Z"cT6W/i)67`f[o.4_s(O+%ib2N0*rdP,anSP)8Oih]tO8BCB"uAMUNZZD[3e<_;8TA-)KDq2iaN;G?m)KkB`m"l-hC^[ibeVI(Uq]X9O6B`dXXnOM<U7NW'*HeJ at u~>
+endstream
+endobj
+257 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 256 0 R
+/Annots 258 0 R
+>>
+endobj
+258 0 obj
+[
+259 0 R
+260 0 R
+261 0 R
+263 0 R
+]
+endobj
+259 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 90.05 709.0 120.05 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+260 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 169.952 71.2 292.592 63.2 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 139 0 R
+/H /I
+>>
+endobj
+261 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 244.53 617.56 304.53 607.56 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 262 0 R
+/H /I
+>>
+endobj
+263 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 86.72 497.987 150.33 487.987 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 240 0 R
+/H /I
+>>
+endobj
+264 0 obj
+<< /Length 3202 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!k6foFiGnpS6HJUObTb]%^4%`@eQ:1D!Hm,?270sK=9[DZrsXVNuZAu>TWGna7I[79QM at uPkFPun9L`N!CPhqd2fq0f^A4m$VLpG^skE8tk!q=?O2*(XV1"t\SJmZ3ie^O1Ip`4g-Sp@(PYhe_^i:Q`><?1Qfr\EhJ]SS3?Jks([7^IlMf`7Qj<1PLX[J8I*[oO%DjM`,MKX,1Y>5o,+[$iJL#*8@/NEiDQj,V7cae7ou!G)3/F*,Cfk^7CB0\/Xb2,\2PCEBi"Vq,.g`r9;.X6*H!bguJ1J`Mqh#aI,1XIp1FUo263TgPeQD*QAV8=,X=R`/!f2kSXDV(Z])_pZ%CA&lRTs_7aMGPNeoW?OR3 at q#`"Wg+rfD>\LgS$cJ.7,I23RQPt+t;MWE]cW7[*8_!.C-7?keS01].\BV=9?@(Vo'rNbf.D]5Q[cdH?FrV)]Pn+-8U)c;Zc%r@;,6CTQlf;r&ni`npPS91e4Eh:D8W():NHitM"[!jsB&rok'nZYDKP__VI3mDlf+([oc:Dj)"D$b%JD0-p[^0RUPVREJ(qYB,h\nh%?h$!B]Tf6ii)%'E;Vle)>AbE:5E$RCh"`YF=J1&T8&-*Z!;cUa+MQ`+2b2MF],Bq5 at 6tK4El'X$%\+).H)GX!*4ep*XP9.L$g24C`T0/R`e@@Q5:6)kYq_LR(4`qS_92iN0PCTZ9;"Fg'kdp=.-P2e<ZZKio6,A4aKl`*N4_SEY'=NUUL_R-aB@)\D"KUo=:dH&cNKnX\0V/HDm)iERHJkDarUM!X?1lqC['Y.HdTB[g]_8(r%E:"RF at HP9+=7L-!B;B['mt.bZO.acMY_oBj@(<fokX/BZAIG!hri4\f,pG>t-W5\Rb)H"MV)mfLTSQV2YeUBj&L3A7u7nqY^!;F+Y9lZ_/N7q0EGn2#!)m;AJlgTeHcK;>H%Wd*b]$B.='%=+np]n-/8b`+W5?\3J*!9NBKc#J_rF5!S0MR9k^08VZ>4h:sSc2Ti7=WeWAK[c;Wdl]nN*N=r<g8q,c:akPgdD(4-CPu#T.0O[@!j;Y"L+m!HYVI22iYU9E/Sc[^0VU,?_GCG9AB2l`t:Zp7r0s^HVnZ+ba#h;=$*'c$#3ClXp(-T9)N/,PdK0\h\Ge+j4?'u3CEK:iQq1C-J%*%EU"(4ICn;c6;U;<!/NN!"2VXAs4jq^8CC_eGBT$//[0_Y<nLkY'fN0?\4B4:^so_B54$pc&BAQ"AXN"7;m%Ap3.*!DO">-n>"Z8OD0[/iYE4XG:l%WF:fgBtgPeDs8\%T=b4go6GfZNW,b[dXLj0g at IIC`_0CWN2(@BN^!&N'NM(#ZA$<.GY.NRsIAh#uLmFW&2,u!7#U,@&<%I7CBf'!/mki?`i0IQA3]_5=&IVX513J$XG5"jXTN:(r2fanSFaOYL#kB1XR)_F##I7SXQ"6\$UB-(BJk9!cTpX"]'1W=o)$'^XY_Y9J:qJ,:f2^<CbUog]$.VCR at Ru?XsV0nEZ(8 at 3#3Ja at bWFH"<aNJ(Vg\7\k-CRQIq(X5T<VrM\IVHF_HMA*&8P>aDd3?QuY;>?qZ3,:(]q9[#;cD&d;`5PG7E'"ARL5.U_Q6@;6.D?=u2`$.:.G,6P-bL^-Eq/igVJIJBdRE(5*aEJ*0)51Z$64HWD_&slUlZ"kl$mBu41([.`7S;DH2S&7aOSM,Kob0[Wc;Q[7lO!T at 2L5<rRddRAmC<P9iU!.nLgCFC?7$j(H/F=k5N.&#K(,,lllu%=M>p0a+D&8J_aMHsE7?Sd=;1lJfm:7Rne1)3^-a(<Z7JDcn#XHVXiKG!/;tQpPujPK=rp_a;s&X at .qA$sD#T"lBuc%"C4&:&(HQjC94E\THPKn!Ci)^:HJ<qH^!r)fn"DW=]LA$KamGgmiNtn`i^7$2f.Y<5Rf%[/227mehd(>to5P=3dt5!+K.L[sgO*@ahWRX3VgYQLY.(?0#PGAk*Mu$lZRebaXA,7ke.3O"6T;/[..uj^,?\k_bL>ASOY_KZ2li4No&D_>F4UTsMdX>BB,<Y%7A!*^CPk!&+eV[nSI>:^(*E6&X:l.rq:"mH%(97WPF*Dj2Bq>nA,TY`i+#JJc]YP#QH57Vq7jZ9oJ]kF=C(:UCi3)V'9rRu+4n5>Ffnr4Fsa'9F^`B#&XLc.=U/,gZ,^>+(R+h0 at Jf8E1$8jOe,*D1!JfL!,HfD/diZD6ZDH8 at Q=hiLm9JG:IE25i)/cY%UA9;\RN^8DVQI$'VDn1=oiS)>"I(j%EBlohjmBlj.EiHXXapJ\`WHci3G,;!#f*h0!>KY at bsOtT%s"urC%ehgVdEVEJ0hMS5)E%.8sfrE`+d2YMjp`<#r@@uFnG$0n4CU<QX^9hgB8n-Z]-rDgVliAe3f8EI"nl5hh67Sp7mP-I&B1)bW<I&99lM1&R)SY\tmun$[im?(jL6N(nJ_Rr3s=X&c_Xre*W[IN2uUoJhhHd6&_p&Z`W,-nN]:lGZME>h0D<UP%d$0YLWT*GN9YF]mb<`GsV#5\K"BuidG0$+b"_4.I00A5<:IM4'q"Z[2?NV"cK!\6!*EBr30A#k[QtOf(--8LN<Jl:KL!'rpLD,Q4TsS\Z^n;Rm]\1$c<KWMX;qp9rGpgAM!/h-b.+eLoJMkPkXZc%KhnkBFm[2W]FSblNG9?<$%0&Lec)R.BbT0c-@,-Qd1mf%.ddGd?Raa9ZLl0:gE[J+A,b+V at J`/6h<e^=d3LG&V[AN!W!:]cmo4r\)/A`?1)SB[pRZl*D,/_?1"i->,7acrDiM,'jJ+(q3(i\/PC37F5?=O`4RL;aM5ZK<K6A at TgOUX)p'H!0LUG\K3lKA%0l7'#*<Q14<k-60S%GXHpK.'*!&50YeY6-QL.*^lh-kY.`cJRF](Z8Brilb6RQfC at -Md)MQ2tFO[RkC\JnTBU#Om6U[fa at 0E)MN?_H9_d1>T7C8t`&%HX!d8Jkf(,O(/L?.nuFIa:+46 at V0j=I+2O6N1'k0Tk=Cpt9$E!\I5p64cXVhChm2P<p+3WjD&4"m!u1N_R/Aj'</Rb((fcR5)W'"5*Xm!/Ha#KF&YP9D<?2.m[=+8 at p/;/.;2"KHI0->u6tZUXc%ik9 at 8:J%38h:&i=4Rk7KS^.f<BN2C31I'^T`Gk:@[[;HVRbYMV*]6pfPc;0$?;kEMXcY8G*'Vd.rCd=Vi!Sr>?EQ#^o*C<Pu_emI=clq$cU]1A\de._~>
+endstream
+endobj
+265 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 264 0 R
+/Annots 266 0 R
+>>
+endobj
+266 0 obj
+[
+267 0 R
+268 0 R
+269 0 R
+270 0 R
+]
+endobj
+267 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 206.748 326.42 534.088 316.42 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+268 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 190.0 315.42 249.98 305.42 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+269 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 262.76 315.42 375.52 305.42 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+270 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 501.432 229.42 544.482 219.42 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+271 0 obj
+<< /Length 2685 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5998*k'#++D0X->s!'M=8+-TELmEGk!+NS(*cfC0j/80lXF!?GN.CZ5HlaJ.&Al4lDaTfJ`8h at 8MO0=H5rV#Bu\*54J8?ge8Dh?6o9t1Mf(N/dLG^0j_0]-^$bqHOH4+FM\*Mp[/>M^ETltP'5et1:g,ai\C1R$$[['!P+*5+LS1q,NmA'^r\e4`l*n*kY*:hW(uGN8\<]VW20VI6J)Cpr6;!TQnAPGf<nkaa?L'2iA?52JLm\*&f"8UE)$Ml<tA0:@P?O$bMpd#EBB,i.7)#k&`6=r at F$jOp=)ZZ&=UqLb^]qMII;7Pc;`nP%=Yee?)LfATHg_Q"`2#gjh6eie"%\s at JPaqL&1mM^i*-_q]R'_;f`Z!_ig_)+\R)>Q1<X]A,eL*]ESe<d+%qqB-dY"8[RWMNl0C;iJ)ilu>X8';`A*4;[r4W;A"[;cU at h9[(VEHnC+NTg9.BM0?@O%p*\i#(1sNn42t;5'/7:Ma&>SV\/NdJmkb;4k(IrIL]HB5q\Oa['Qu(mWC&-FpF6Uh*[Ec3h^,CKi"f#^/CeG>I4"Fu at HUm&6 at J5r%f;5;6tkMjP=Xia!phG-#.F;>E=_Mt>[@eJ at 1)$"K-RM/TJZin`We/14"Y-6c@"$gi;*iX)>oC1!S9=AW8qo19K/DLI7:qFmLnC^PjZ*Uc"*q!T'*n^PqiG?CMQ:A&j8b>R\`8_Q-.O:%.E+kZgOTaa-><ie%oBn;d4%BCNJ0oBENVLal&![PGLd8Sp"JKg2A+\AD%S*FVm7aNO*F&Jmnh-3G64Wf<)]dBQ5RL!kL>j+[,G*!o#X^g"-J/aJ2L=j,C[XfSqM),jKZA)BNr>t5p=,kU9kB1\?+`_(jqIQO-fN at 2.N-Z%nT>31A+k^c]0%j&A7_]l8"4gn^Jp'eofHiec6T.Y[B>0t[8(Na4!h;W^+)($IUUVWbD%VJeF52g'2 at R\ke+T^jRGgt$KY#U+#2hQ0A#Mk2(AS=;9kOQ4$'I7Y8=B?a8(o%KIXr3l]c3HhTF$Q[edTETU!T>Q>L:tXKJK#S1a%l9Zq8&LaI.nT%+f%?34;gNF6G:f&$.cH1s\MBoa3hae*Fk_3MWd7A!h^[*.Ne4cqLOBool3q:-jT*1Sf=cd=`MQ<_$3\4ZD:SZHc9?-<i'G0MtB`d^Q#_ZUgV+WLJOb],2o(S3RVHagiCu^te\2)kVG2n<fqF\JE_0fE\0!8'(PiEVDu*K$o`BZH;HY_o1g<?I;7P.hP@)+Gd06e:"$M&jBra.\G0cAgfpcL@:a_Y(]$uZQJn)%=PP at 4)+9O9&2!t)kTtbr;&ZWAM(h]m<'+DCHY.QP<;QeZi1!08YH/5o"p_4cpl8@/Vr46>X_k#8V(f%VP>qe,2+8[]FLSI[9)36$JLph=]_BK`)8uA=55C0`&kd+Q;41j&Nb@^C`)OXeFlFV"IG/50cS#%&NOoKFg26NgNU18m.5G&5;T`K3C9YEcmAJQ_cbU,!4n at F8plc+d9bTS$;(q#^-pd6/"8qH!4VmM(I9A"SP_<aNrBSb^/*l%&^mnTl,)NVXPkc"W5baCocrHP[_nC,eRTKD:"M>KQ=HTKG"d>&fa,YdA;TL0J?t.<0,'L9A*M+Ji)RRC/!7(E#^#GtnESq&*SH`tpHm][nB1u6pHq+)7HJ36^E'70-6Hr='jWR(9.-^aBtFH#h6^LWGbWFhOh,<ro9N6*L?hVh3WIt;8UgVamHTqRV'aE6.J)ic8s7`_!GV-V:3+q1=YL;0<#-#,W]UA4_S_SnM)QJ:iJC)4mTp1I5cFqVU at i8Mk9Yt4e[=YCGF(D<'J?K$Ul]A_D?cY&4M-jbZ=RBoLP(G^GMDI]*LPV1B)De49`Wj-l+--EB1I;m5fj#)V,s:n%eaJRI_#O9`EiK?AG:nL,'5d#nK(tTIm3 at Vbt#YWQa;h5LDk7ADcck2D%[P%SM2s1T81Cki1cVW^-u:)*KQ3`5OQ64jNV"e2`iMFLG*#GkJfqVdX6(bd)V'1*Q-Ec-]1j45c=YVM9KE-ltPIL'R%qIKYEffjqUhh*1AYIWejo$YL'b=l,Y:"/#s`W(@N+oMKaTni[FbuD8nIlc,;=pmi2FUs+N<LWmE-E0`-fE'Y9s+=U9j6G,3P#A]*4pd4T5lW]8a.`_kl7\f2-O6B*g?QtBHYPC?"ZZi[oONZ;nL`Z48 at V/)\$W]ai?nB<D>^>cMl=jF)EZ`oe7&E**>(f[X]/%"OiPU91:b^?b]jT`3bR[B0L7(jmg9X!D+ACm*r*O>J8->SE4o^aDT=Zc$&0V,6;B&,(JHnG*PMd/(=9Oe!D\qf!#`oH/D%[8!*6=*:N-qd,E`\TJ^GW at Hreb6T%XcsM1^_+G/s'FYJf3W[F4TX/hDfL%XcVQ8t4c3/NPia+#:UG9.p0)=j^&.f,Y?LTu at IF*kL[W"R8j`+7Vf_N=pm:0YPOMqb*^jLM2sgbEkASE!Yj>pX%grZFHrb+UQ98#kr)]TXs,u)E(.1rXD/Y'</b:TEESg2&;"9sg09OJVPNlL=B,m*dSNWm#^;"cm&2*0iPN<VQ&c'YqFKQd]f+Er#Fo9/Mk[1>+s('Y_@[$UpgRI*?Iuj9;`^pF>,0:0/_i8jbfk,a*n!j4AjNlq`\GWo8NMQHf).=R4jfn`2jo$'5hQuR6s"_j?bp\\`aL7s5*/%jIT-G+dU<G4]5Q,#&jo~>
+endstream
+endobj
+272 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 271 0 R
+/Annots 273 0 R
+>>
+endobj
+273 0 obj
+[
+274 0 R
+275 0 R
+276 0 R
+277 0 R
+279 0 R
+]
+endobj
+274 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 318.64 625.561 455.56 615.561 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+275 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 275.59 542.122 388.62 532.122 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+276 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 521.122 151.7 511.122 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+277 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 448.344 478.122 514.604 468.122 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 278 0 R
+/H /I
+>>
+endobj
+279 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 88.94 120.083 140.85 110.083 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+280 0 obj
+<< /Length 2660 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasarl]9dY'*#[qKb5$?VVPhUI\ap`]=e><d7;n/G;rk(JX5LW'3S:&BtZuUs8.dD8fZ9b2csJ()0$];%Y$:1n(1XEhhA*R,$>\af%V]nol0#r4S\MLBgB=2P3!sGda`ZYqX=+3ViK:RCL=2]K/=m"k2j_MqA3?0[!K.VCUO.5WUiY!-A+?`<?)Z*b*8q#Fk;MV001`N=YsI\*_\[.$pBcmTb:W!\/amK,[OcCU?M?QmL4k62&541R^3Y46Z`B**L:4!HQcoimX&9*b6#%!`*S\8 at to1AI;>cR'LO8qZ=RBhhQjsb8IYK/f"FH]b)WoD"UEoOOA.Qmn!f4!B\=!gEtb6A5:VSH:kAqZij.Tu at Bh1@kTNTVi]K#SrhRS#$8OlKo4?)RI;!oHlNb>#2&\DJ`=&\(G at G_Wg)91,eZ=Hq9#LMq]C-/*Llr?;^>E+s(kOoNHrO(e95K^5RknNGCR#W-Y&V-:MQ-jV<:^0<ole)Yjm?M"Zd],`e:CNfYA!gK%,$G[Lm'Y8Yr-#3'1E<a0bgh9=E^f`K6Im_$7Y(M$m@\NMB4r'BNl+e\MM-O?gJ3/@9oeJXj)a'T/LsMo4B]sEFQfD&#O_+n8HAm[&@kt#mQ5YnRig[CT8BnF_E.pc$2jlncjf*d75^1@'X0%;$#%;R*k>\j[O2Kh=r4dHJheW]\Lp2 at IXK@@;GuZhuMRJ"dAMX,D<C4_BuqtqbV%)!l,*n`jJ#IM@#qf[B4+GDL'V1[OqZ at +.78+?^h<QPC9j?0Zl_WnGS$@.7mUmJ at ul#8!6_p1mH#QED292#94nAo,iZ$ME%u/*ndcLCQonYE1Aftf"L$YH,Yji;bC_=/Q2;AQfo*Qp)E)^;o+pjS/NE at fnCY/hdW]&YL-<lKGJY<:+o'Rrm)0/7,:T!'dE,0H(N9,%&9\HLSN'3RbHgIKac[7bgib6H032=kZ)md]T"-nT5nE4mi5?=S6?,NW,)rfQ<HOB"kCrpg!S,>?=#A/)T,RE@#<FqM$Jqb-VAcm:K(iLrA!EXY\4qB9\'n8Sa-q,$2?LC`p7jE8XnjT$%\7Q])Z6jIX at ct$_V2?]YkT&H(_k)$&Q_PZP:C+,);93BPjm(UQ7KkQ`\Sh,,b%+.$^_=;L$*F_P]?8np4`2 at LoZNl7mISKDE@19D!3h>h2rSLk"ZCcH<+-f$N3DJ]n+:MfUPO.lp%0%ot-#g1+uTU1.#XAU>J5.c9LCLIjtJ#o^622TI_054#5T)7?\_?8?8:kXP3)_&$c8&UQq5(W9qb.3.5E)i5F/hH`t$*h_[;)^Xj,j#K3RN,Ihe*DP at p@?*_ at 0eooeU8l.?Cgg(K+6G!VDqlV'K&Q^5HZS.r.pY_=i_\qBn.aob-1OsKJu=A"IaOKA,tY,ua-E>`Bu,;4rT!lprVdVNH"2SimH2p:fkY(7Ua/LoCZ?8>0I"WGffBWQX._+qMr$D1*]f#HaHo.Vj(5YRB5QfD0M7-Ca0tI>IiS1dHf-rg5nJ$*e at Ho'Z2uX",=LI(;goV8rR%JC8KIn(TPM3F5Nlkqiq*\Q;F..[EX_q6559t;[U`c:h7I/0fUJR;qVj`"Vp8j!AA?sk-UVeUOts`'8F#n=/$W(==D1SQr5gdYEh<Z&$Z%M;2GHN*Q)9t_jRJ*hk4I=8M1PkjS1UU!HtAV4iGd%K?D`Bk!8JaeEmW%h-7ftBa,<ee>GZjS28d"iNA,>N\:i52gR?BD58sbjo3J?765*mlRIMe46,k2u0hLN^^EP_9DIn]G2H3K"$_AbY#i#\6cCAC%e4!4H)^O+E[$HfEH\O)fohcPu?hbH1Ehlac8FORl*FPcgL:j!CS"(fBZn"ERfqHk([((cp:^BT/fQ)?oO5R at 41)<.eNBGMpXSXO-Wq2,cNmtF@`#=s.W)ajn3E,RH_]K8i_pj3Okh:#S(HfY3GjY>Z=a+$7TL=6VAM\Hqi:Y\'19`&_pUB!6L\;1`oc"#Di$'3I8V"U5<n3;.B9.))OYF+QVLq0Z4nR75kXN+1!B=*L4U)c,.qn7oH5*.]a`C\D=.m`5I3V6u5'YPOb/G\M9Eo%52>m7._^1f*:_+=X521_oThk7S9G9<3J:+4/$Ng*q]>n4&:!9[*i&X6[&iF$SS%I%D?#8K>Y^CR$k6!akPFFd8fi?(t#t[;OTW<niI:S(1#=si"4X?&]S]c^rcF3p.^I-0):6c2](1P%6i(1cM,qG=!n)7$![8LgNb3AFfNgL>mR._/l01Y at hh*aL!9QZdp\b]29p&ME$>FZK*&c-keN\ZbY;Q?^dr4ec35'Rj?Y.5tr:(bAZNZ\tK(B3'VOXJ&*&H&!B`=)5T.4!1.KsC9pa6Og:`&70O#(",Ln3bd6eGh[uX#V_LRf'3GW#+T,]LF^UbD at EI7a%PMoingBF#6\Qh`.M0'j40p\^KS)ZTe"o-h!/>q#[MWD8[[-=.?IKg^AWK5oUVB9:k,$'A[#1B`6SK7$45*V2>q?E0ng#=Tj6]"t at H8(1YeJW4RlV).7T!9lF5*M&"i`.n'-U])=I,V/PjC78GCVF57*N\UG)OrGgk:iR&XY$S;69n.XUg]0$gu\*L(Jj3PIi.$5%]'+L!2Wr[iV[b>'dIW`DK at L&:YlQ:o^g!Xa#*2=?#I"$7)D%\JLiC/Zuk79d"5SKo8"fYAkIp=*hd/~>
+endstream
+endobj
+281 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 280 0 R
+>>
+endobj
+282 0 obj
+<< /Length 2768 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5D3*bd%K=)V at ZW7V6Zs3ZH^kcRDO]I(Md0V0di_(X"<(L9&T2D\r%`?J?XHs19hO`>]sLmL at 6Po5,Xmh0FhbK_l7lN=*qNF%o#=o$DZ#ctrqob7-nNIA[Z4FYCA"bhifeW!\kB\Um$kX:`(nefI/W%`Q62.j4RfNNV&.\P^jEmmU>>BH<]FLNphgE<k3_HkX3I9%SFJ/./RoEt#\;`W7i?q]cQp.'.HNj;8=nr%JCKlYj[7p)C2V<-LM);3VH-B;;'7.M^-V%F?[bS6e7@?#efV#>4TiZ>AKlV)k,HqL1D[.MoUqQu\ma?M?O'I&";?&6S%?4#kY.ktWbP.Rl3.Fuggs!*j_C+biPb!=<h,sFP925d9?p/jHX=mu,0V?1WXq=[#DU$KcH_nVMV^Z,Z"UMkRuJc:rpl7^caO-F[gTr:c`co5;nFX]_aaggc\62#9q1jEboR_)!fs0do$Rc.YD.K1:<;1\cs)^2/5*Z%<H`XONh1INPN+K.ILn*@E[fbG7oJ_U]d%tWW78el[f,&<6f/BmOP:\G3AFh`e<+UMFZ=j$huST*X>&!nfro%"ZO=oF0jB!tXK7FVgZ+tL3P5b$pA?UV=Tn?:nZ3Heg%D)YM*F3%E;shIoR8Mgr=>SKp1"k.ecpigcHcOoV4DT%Kat.%]oCJpXYm9gFDRGAMD3A41aRTl_H,E]+`Q<ehX#]QLB>;^f4;<'e,WOC>-tpi;V!$.?,p/)BP[5$-J0m;M\i(HRbEG at 1c,e&k<gU.G]!^2\td>X8VVl<)PRe63faI?eQ<fiT2kjj?X9*Ob>P\Y0+Cm#F#[Pa*a)4HK1ZhB^V*&=6Jr#9CuYV2N"<jE:aTJR=-SDP0C+]p)B)6F!IT+9d,m0KQ#/n:SDk_s)Wt),n&G<09KA73ml5Ho:9CI)aSss;ETA^T<-3">1;7JEke4J=!Wk#c8SG<p*9)lH0j#q:Z_ri\KhM#<3-%\\X^joDQkY!(!=e1AjaiuUq?;$I8aSmuU!3n9Y%r''\$u["O32E?@"_k+r%W9eH__o,Gtkrhc`sdd1^@K?rgr3q;iU5G22*PTJ:9:US`t^Zo96[<D'r,2/2/0KM&uC/af"t:S"+\%VnHaMaY37 at LkuNVm&a%&Ci>O%BQ7XV4BbWV_3,58cX*AI,\IW_lKs9fm,W:&![Zr'2sf)#<Q1bCq2>OrlMI8P#?OsC,cQ<nR-k,V0IFS\b"OUc93jlFjkWZkA+gDZ%:ptQg"7^ONL8?a!,?5j?>m7sH6J<KSi-&1^u4<1NCdr at +Q#et7@)I!hF;bQ)P]<7 at _%GYr&*4*;6/ga?Ha%_\t5Rtd8=U%a21muB0&W;X0[&p:2r#*L0haJIU\3Z%crtk)MW!!)V at t\7s^:.4k.spW393[!<:QO2!^n=&5e-Xf<^.8V3a5'6<X8)G)n`F&U0G.>tu>118YN'D+knP(94(.ie-0qf:RrBLS#V'bKf!thu#e/`PMT_J$gO2,IM0JFRLmt]NUsQ"a.u2E$B'4bN+pra0"*\8f$!#TrA3Be[W?I'^p>_s0qIsn_MZ$(2ZK(5Q'd%%hIRso)7&9Dm3Q0W>h1:f08I42P'V[F)iCE"f4a58m.WeN6JY#fF.oFig$`^<Rr^;crg0c&XE4X$C0=K:choBkmK;8^%bMXHT>CIDB7D91OY"$i(:):9HLg_)T/n at 2s!re%G!7K1DO[((hU4RPQ5GNmkf0BTB8aR^/]`bY"F>H$kS%Yha#SiZ)Ke6KF%\gJ^*f6gp_/5;i13l7WUrC=`b:;8j:e%$\D;k+b]o=k0HGMa+gOCl"@h]BnZ24qp\'t;k=XKJN`2rM9_O8JiL(3:%q"Tb%4_a`[fRJFDu#bJ]WUb`"\OE"rEOTZR2<a&Q#hIkcYJ[f;1WkdF8cs-l-_(5n]n4Echl4iZj7^7(a))OqLTB)8[dWrA%C0L4#f'86l:Qm-u#5$'kR%'j_Splj-EBX0K9</'4fjZ*kqEnM'<?9n[g:,DCec)JJ6abDmMHcG at 9Z[d/UCBkYh['$Nf-o[WM at O>uQ"8Mk%1g<0m<kmVC!!DrJ&7,;TmE?a#jKd\%_C`WBGih$tIK5AfLF_&ft68DaLL^sbn%H&*-pV*B)l'OfTHq)0%[uHb<mq`QhkVMT]kJuUKk0%B`nkhX=Cl:`-&9p0.QV(E'&j5#/!nng%FU"5O?eD%9THa?RfOt'?ecqtgq7N'jZ=0ll3QjE7-8HOCK1$">on!OQn%-ehS"*Yl`&_u<LtL3t5m3o3Z.LJknrA^=o==ZiMakA:/bHaQ4a3o.L?/6/V1!=][QsUmXE)KrYT at Ph/jAqemJQkH(9i6b5l)t2VAV5i5H$GSh%@8*Fo(Ws,t[IY`m"ZD at c#ViLmU[N3tWqC6n:kC*"<4 at o8%Q5#a5b?P9^N$jT(OHo>=B9@"-"%Li(4*(&pfo]1lr`=Ng;s8=I`5W,kOA)PqrJ-[q;SV-YE]&@QP at ql&lK/#g&pmPGT,OB/4 at 8J]U/ge$@7_k"AHj2uX`AS&I;"?aatp at FI];6"\1'CM)EF&SVPDH1*JH_h_8]%V:tgso&P=kK,r_4;_[6VCM*`G"W80f!tnqd?3k7UNO"XTEt4[?Um$lOQtknX5tnd\4#DEF?7WHNNK,&Pb!>'6E>>kmmGql&!'QRMptFeK-V-^Zm1k]gSl`>.f`U[JKUH="@>5c/3I-2j`Ps)QfF")QCGfGr]bpT<?'s9n2c-hgB-Vnia/]?*MR`@+'W`8]8J7 at BeSKZggnQ73Fk"7RmC]Yq4/P~>
+endstream
+endobj
+283 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 282 0 R
+/Annots 284 0 R
+>>
+endobj
+284 0 obj
+[
+285 0 R
+286 0 R
+287 0 R
+]
+endobj
+285 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 130.05 637.28 222.82 627.28 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (../../tools/build/v2/example/customization)
+/S /URI >>
+/H /I
+>>
+endobj
+286 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 186.16 582.954 235.05 572.954 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+287 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 273.91 215.934 291.68 205.934 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 288 0 R
+/H /I
+>>
+endobj
+289 0 obj
+<< /Length 3105 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau/[CN&:Bn[j:i_H5[^@SQ1e8;\1&Es=6fE(T at R+3l<#CUmd6[*hDSmqn!^p[BmOLQY\%TI9m&33tE2iOhbXmc!1!5%"+,nQ$1T$ZG]ciNGB6T>*u#JP3\,V#KXf^\W3JTBk#\X,$-JJijVJ8KNsEec\]SZKp%8ilU#Z%^bP(;d%'!'j=tjDO(GOcf_/#JRhI&OSBuT at pP/i^V%7.oB$LcMR)-DNu%c=+!2RX+0Rm-9Dg$cfA`Dqqs2k?MBj>O;D%%G,6DGC,S!E,]*,V;nR+nS3"1WK`8?fUO<(,\$!(-`N`i$RpP4o[[YV5<k(NtaMq6El'2TgD.,a8;naacK5tK_]eP08pWaa5)p-BIWbY)4'P.'c3MPo"E!iNW=5[BX&$WW-/_QH at M0<Am_L7PTmSoqX`ZgML>+WU^QS2jgr"Mo&1L->8W'aMJ[;sE["pA*(>[cMXCECrT#5;Be<>BLF+[Pcc.)3e4K`1e;rM"O"P=pb/=San(73>RLo^IV(*D0S?.`-0r+ at cn$a/6$OX_Ib@\qh(a!XqBiZ/5[t8.*j]*6Ni%e(/`KX#c"4KYX$WS>jRcCN4>es3i85:g at D-.>a2GnPD4#O^W/+$S%:hCQ$Ge"Ef<GucE[-h<uI&Q:Qt1'qY=aS's^5Y.k7Oqf.tX8KLDEpaYL)C at 7WV@&-;U8F&AUn#Ur[@,f3ITH>19l#[eHYdLjruf!"E$,)09]E;RB9pd);%LXI#hH735"FsNMRPmdpsO,O;=1:;S$jeu]j*TalX`2[`P],ZSBTM9)#W(W^gWt9gSSp&)5D9/dc8S1')[UTd#:=su3_'@[]PhN*A at 6EC-gXJ@fL5oXQWn;g/csF)F at 7h/GgTUiIP+^3[&::,lhqPkTIeh,=Tb'oPo@`7Eq^Dh:\?<8k(eKBf?YJ+;:qL#:4&"7`o[>rs_m2mmT#7#)`T_heQuse-:dNj4p)>838YaMWE]E+4K8!VmiBl8*#?L=GBC2*#*Lci?RVkNddhK1?iI$BpjD?ho3&/nL-C`;6Xd9HB\%B4)2tNa#1>9h%[i!psLCct_W'qP,d2q#p[#))5OFPS,>*c'BW?T3K5?DJc<p]&4L6I,[M!KEsM!6?!*2WZ1mVd=,4M:]&EV>8\jDoCMH"J'0HTJB4P;A(@P/A[u)+_r^BaS$tAs2_4k.[:T;&GET2;(R5\#=naWpZL'B7+W0WC[(l`.f:7[:*(OD&D'bLF[@A8Aeu<MC/fNRS$H/V&gOR at 3%!mm3"J5Ss_PgmHUQsm?D&AOW]P*0mS[E]]eu]@%pHC"2c#1U>\'ZFu9W<]=MlAEn>B&6-q`ll,5c0dNE1;J(l%TFjllfmnOd32OVEA[thTI4q_]]L9\ekf)\5t)_R1F9,B6-X at K'=3'+2?Tmli<R*ikf,-0CQDXa$OhY6Dn=^)>PehAgGb8uVI%q`1O<+JL'(BNX.(`cuEhM;^i&PGH[feG1>1@"s<!Rq)jLr:4S3^=[eBi2):-<3nFCXF:`IA,*/T`3?UUd)J2-'D18.`/<'Mfnu08?p5`28,D0C\19WeT*n=`=nR/;LcP73s5uKSI\XRKM96>+c/l#.W<mRM]([>"OEs%9Lgi-1s@/B?+RkK:h]Qf&H0Q$=]Sb:2-b(i*_;e0P(eK/`W6CZa?Aju97oXlal;d96_2[-9d'@@eW03fpi55ln_roJ"iXt9S?a7J*d=]SNIi:XoS8SFk":i$aIGsVjmZZO,O]dk;KYr?mITcrR@&7U=!$$GolEq(/ra*G4b?Cm1BX#!_!GglML"$f$T-K&6ph.F>BHrd5ugJ3'D-Ul2h4\C*RN.EnS=q3KssrdR+o.3eYcRMpouuqa_jo0*oJC#au^]pT`I;U?%`=[+UkQI^^M'YGSWI_9)2R54A4I:*j7bD>tcCmdB^0<1_2NIj551>Y]`]18*]@hK+PUcS6k5[Sh-Wr-;bPg<aC[$-l#s!\]^]+h7R!#'/\]Zo,UEH;Due<oa+>T?To>(5tJpZk%qJ*c2>p9fn`so[$0*PV5/LP*9c7qS0DqJW0V4`]r,OGNsL'6#;3^P<SPp$5elU^"A6:*G at q;$=MnJ_'!Q6<]nMb('o"H*5&lU9%WT2`aQN at QFW$HV`6*O9NV"'(_I_cW[0R72F]&2FbnEiSX2h(T7u70U_VoJY9Z.[tbQN6oLG0*7]<oR6[,r)Ai2=;qJ5Z9OY]47+aIRk/O-QBpZ<(KI^QIuVmn:;+W at -9@AK8>aZG1&K[KL!U?FUp+Z"aJn&SK\iM/QrFg"R>+rlreiJtKX[Mor'>"Pj\*MS+-"$pl[o"K'H2iT:0m7XVO'pDl`l&dUiNA';<uldCc7hM*qXlcE_'n4GM\Fp!_5HE1>ao)A=&+(%r at pb;3]9VlQX:?)VP at J5'\3RP]f2*^h(Ba9MgEf2h$LD0N5onUSg5KWbWi'5Q>6U106 at U/Kh7k6e>k;1UPl_9L*68m'/)F<a'\H=PR$is>=pVCO?EP-'!YX-d9,&((8s.CIaj>gmOD9hY(;:b:M$iUQe%#@t`d9.L0)=EqFnuUNgE0c7DhJUII^sk!=H5b?d"b'YsY5QS.0.`,g'tk!=W!L,BU3cg0-t_lF5:[ZK&IAP at mMENgKh4tNfO`MjDNMFsl4'@*On-F7mWt]*d<nI6cDgPbo)]W[GFBBS#J!i&J'&(,GpP0e"uQOiW*5,Eck#m+(u6JM\!_pb+LCu!(49KBp!^*d^NR&?_IF,dg;c;iDm5O>]N1^'<el.;K`*Nc^p5RV at 0+p@N7R.'T8$lebZN3;XS'f4F0't2GULtEP&!?FT#&a/'d")c7n@;&WQ^!8UG4fioamoRG:,dc="jCS\@+r+B`S]]>HfJ=:90?T:ust3U-<._`U'u!HRU]g==Nb[.ja\TD:`60hH7!G+uTp,>mg at R]gfaZ.f*-1Bd&&j7J)UlVZ[H6U)%m.2Am]\?KL,IMk2`tg0A4:X[94VHh9tnN#oE<R1i0KWDuBV*Ch<t4t8J7K_+Wji]$OS1&C?I,+lfS8:Hj<K2B3qfP5d'e&C.\kg*k8N;2o/rG=p2;HH*-_EbhF^!k<7kct!i>4q0kFJ&Z3)%@3U72H[E7<t6Wj at BC\"M*@PG?X^,EW~>
+endstream
+endobj
+290 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 289 0 R
+/Annots 291 0 R
+>>
+endobj
+291 0 obj
+[
+292 0 R
+]
+endobj
+292 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 142.67 268.074 191.56 258.074 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+293 0 obj
+<< /Length 3165 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau/[CQI73p&"`G5sjiPG"eEMM at cMY'h,L@^jn%PX"'>'m$Q$CF7\&OJGAT'`5hCf`gJD#\CHjbNpZH3H$K&Uk2ob6U)!Ei\(^1e][cri?[;.%Y7_prM<?[dX>\,LVq]H^1udV3*V+mZX4s-Gh,A0@;^7?KF#JgZ=m]ApepI":0.PB1?/;lk%'o9kC6pk at _Q4qH;'/SV/$&P/K6oZ#iijP1,OT-tJae?4PO-BamJu"VX>YP2CLiVdZmESJZRiG!JRYhQP\%0<[d/@7(Xqa&7P/-c?*Nl_O$sffV7 at ZW)kW8A%m[q_3c3)V`0ebm7?5_f=_s::qGO\E7[?NN-W,!V;3Y^*d-p8>!9.434I+pV'qpo7 at ZRA5ZH+:6 at W/(?.%5#0aWm!L.4_[[b>O_X=6B,CDu]D)GFS=KS;V<7pqZsFFug9N!T/Bf0f>Mspr;7lk8F9`rG1Sn%rZs1Pfi)6-"-csK+e16fZDHK(4)Qbh(]l+jU]5Jj:elpJf.?-\t[j:2^i!iX7;]7O5"=4^+!ZAa,E804.iY[HCV5gnh%/ec\oXC5&BDj#'dfilVgaNqEhP*L7oa.IU at 9B7W&\lX]eTOF7PMJ/mU2E=e2)aag4S6W]tC?5UhNISt[+m>FBcLY_^[U'#>cq$uj90Kn0 at P7nWNDZkEZq%T?$+1!Z,\,)m_01@%@,h>@?BZR"J[l1$5T4$Eq<+8XQF+iKaVq1d[76s8+GEN60T1!_4MjCNTpW4j:1$pshW.>J9S\OLa;;2kH1A-pVb:[:nD?6uP_\JH9;;0i@"kpc[smN'u_,#\MhfsHEq'p&bKX2k'Fe,p:Y#>l at PgWOVM#s:W(EqKihk,7"_>(!rJ1dVHrm\eWm\H-56fUG[%Nh'`Ab*%T"9!=,:AH at K7l=MG_E-n^X>s0^W)M"W''')0>U^,:$V\hufM=HY<LGR]r':-Io4k+nj,Da!KCB?\!ob1WeepU%reUgN6TJk!,/-p"J=&?'cMP<S:25H/!dTL(^%dfZ*.C7O9eg*\(7'8^*W+/DQC>N2g+?X%G&m/,Q9RaZ68n71?X.Cif?-=O.H9l5g,AG!r=pPC#?TE^Q7G$7\ra`nOOmc6^2Ro;;M/"CFB4ZmnckKX(mZm?Q#ZZq<CJsP;Jp9(UQe::0*-U0CT`Ui/<1.N=j8mPk at YT9S)d2nkjP]H(I$:+kD_L4i"fo9b%UqBS[r$Z$BUOj02cmIMjIM9E7,HMF9]bkb/KONo"(P\d=7O/jj\pVG%1IB0VM^goqAtge3l*#FSXjrXrcG00N_ls$Q+AT$S2E+$Li2%jaS.'I52Uf'JuW?FX1BPHlbnG6h`edSnajrg`WW>NUe3;oe1cd\NBR91^?t4G5U1h"'Cg%-KdU\6k&!2u`Ut939SVDg:NPf?CBE]lXAKTbG$.m+.,sn5J]A&C^mOdP\M:4X#srjBRSlRV9gq^m:pj:nL7?4C\6Cq`'/#N,lLNI!^<H&dYXeKeIR/f_q0(b=G%Thik/NG;!M^3(462uCh$=,AXh?M-`=;oZLQJO*GS%#_7gS5Kd$"Ls7Tg`PK#)ss_Ai2ZC].3MTWITn_$g_Q;Cr38NUZZJ:,p>;D,.SaP<"Ch/BB\H1QTfm3Or"NSrVR,$^JQLN_J>[&<1pCSMf<W(E15#lmE?0/"d%;S5F[f8_Bf7QWpFTR:dTA6KlYB!%k&?`sK6mPJs!=^7:V5Wl#?$Kk:Whs7^=79O,IFn.b'JV8H./qGgS%qteiN52Vgt?T=l*fI8[]r.<.&I^C40pP4qulEMJlZW;ccMY$Gc[s[,nO9:gHjeZ at 1.9p2:QC$UmV.=j#?!b\;denM_))?bG?3ec*>g<j&%T at h!8&1O:@;41)cHa5$!G?eipmUY!,G`IjcUR@&iVDc^V54sn-+&lu\nqplR*%0"Ws6Yj]bC66QK8NR2\.eNP"a8_'/;d^,=aH6]I8FS9Dm!LdquDP4roC!`/eaR98\QBO#$f\@Ll.U2A/'C7l=?egfF)7"sLSp1NP0CUjbq!?7WKA2q(W&Kou;"eP[#f/"gWK.k>Pa,X[4G)JQ[F7fc?KNYDi4)I7c?)1'<<(4Mj'SIS4Hk0;22RGQVbqJf+P<;lA!^s&';O"^o;@kRmQ/OZOD8U\csp^Nl:b9`l at cb-/'+ at Bbade)(t_)0;:R)Sb2,o%#F#cO=4[.=m/qKo@&JZK9obf<qDLf74gU*TroKMP+:huf`4U%pO+LrNs8ImaU"eZ%ee1)B.==*:qY!tuhKW^^7KEtChL=o]IdJ*=u-e1rNk4(RD-FscShV<O*X&_F]:A2)m9^9&gg[b.]Za(s"%E8s=,3#2PTHR4;\S^n6[E[ef?F:aoNLFNPhA>gPpa_F36!]kn\>("07B%LgNg"j[k^\@Ne\^2JQKXDU9>5OG)a0.HM)gW[b4u)fV("[Cq3dqXok9njiDhn>AoI=6!bVplqSKR7Z8^r\1\<L'cJX#EK2[oBq+G]J?0+C[i,N;@PK7J6g2%u/*3Glr,UZiK)lX4r<?f>M,qGpB,#ZsD:%YK]XbWC,72kLWdjgp\'6BF<!CN@=.#3C\_WWMf'&Jqgj2"s^n,\nO`\WoR`Y-*W63)aOoqS<BpX`.Ig$V5Ze8"kAU8Yu^-#-7YMC^g:EPF-Ma'Rc<XFshrB)D_ZC>R"%tojkR+)s`#?:e)Dia1U_nRW6'JnS!)uf[\N1)+tBL.VJ^MQj[BV\FHEC7NM)8bU^t<_)'t.Aj59ZF6rS^Ka5u;a#:L.+cd&8aO0 at a8L'8K)4JYBchHR-XsFC at p0X.h]ncRtHJe85VIsOU*eTR04\Nu$aU at Y;Za<3H7o[GUnl`&L=9ef9"uICt/BOEG[A17C7VlQE7/YI^2<N3U>!8032uHSgA.>^q6GFi%SMN>4k at _W]R at X3UoCPC;=VkQd7A?W/e4-g4O0_B.#L)@K$Cs/J%.kM18`n>hfaQs[/]tlb:qTu+-;;s'cqjS__W4ETAQ=un:96+=i#"CcRQrJ7FEHk`0[8.Bgak_rKeIhIW'dm,AkTiDLC$*Q=KK1^pP/+^S9>j]I=B:Yr<o%@E[:U,F7[lUf2:h:U-]>I,_R3\(rB?!<r8 at Nhn7es:Y\O/:4Gk,q^13]^YC."OAAodDngG4cT5Tcq_0?a\d&a+UkqGS3/*b]>E?[*";X?*!m_GS0BkA46i~>
+endstream
+endobj
+294 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 293 0 R
+>>
+endobj
+295 0 obj
+<< /Length 2338 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E?Z4[W&:`$(0X(RPQC8O[;1CV at 6dm>pL98]Y5I>*]6F#d.Rk/iL'K7!)h+*Tl8BR0e%OgnB45V(IIRbH)Qa=ZYZ\ro0!t`Zll_ at j2HN[u4pk(@>L4U9J#fL\jfZZN!s)Tsm3*Z;k,bd[t6n&0D;%bn6mV-f!Rn#b[nbDa1q>U*a\@t-]o_1^gEkNke+AJ-/ItnZ8<K(Aq+J+gR0L2n+i3[BH at 93>75&Y.$Gug7OkV'N9f,;?"FldjRPmq*Kb4]+[7At"DEui&pFb!j2C=&P6>$G<N.BaiU'm7=EPPTnalbSHI[\5VFj#E?=e9V^95_pM\=Ls>DLdnUL!XOEH6f"M;!D[Q9<E&<S[@fTKYaT2t3q%2CYmjMoH8.C/GOFR"/q/0Cl?j4rB, at B$c>G=e8;[mhECYBGFAG".!#/kr$D&7n\f+70OMJrbhpD5&>R>>2fUI,/]OQ5)W#KKcQW]nY8$]ib<+\<E<nui'U=uK!<fS*0>[+s+Co77=7G_I93YBGtN5cilE)-S'od&C;KU+.MPTqUkeGqXBmhr<u/>)et/.o:gP>guRZ,uD_YNSs&+sOCUUTG2_`>Luu;aiO6fftpod4o1=R\6;;ZDk1"gu>I"Q51uDUF`!?`f$**G*^jniPIF\(sEb$Z^a'_A at 6!5>DA$`qF));5F)WBd9&8![3penCMR6o%$_P<ops`o^p%pp[<1(9QEl(Be*!$9[T_?7[C`46[Z0RH%(r0%_;e=;&0j\r2oX9I&IahWNeTRK"9B2>!GqLTiA/mp2fpK,-"e_h&C^.f46:(De!fD0"+F2!jbE^sYhDCm1NqG:d4WDH>fm#IJBPPEppSFlc'D(qnYZUm?'[p+k#aXJd$>eM]#(hp;Q$p&9+jKN5kMNh7hI7T0s7sBr`.H)92T=e&N?#M$`W92E3=_"^8 at DaYq0MHfVmi.)4Y<LU$1[@2/F.4d&OPHf-MMqjfC#6g5oCq4I(U:.\---jm7_7>Qu?X6p[9=am?O:6tsjM9Tb?mW<E]/>mH+eGGWJrdp5+\H'q<KN]Lpf]]IgYTVi.4W1d:jV_4aHA\_mARW:[8jfiKU`+I3bokK1e*Y+*WY%aSQZmRFR2V3sA]Acfl/LN)10/HVg/DeX(9C"+H0RB?BSq\/ngp:V&IW</HcMge at _;[&QM at S0kJ_cR]Bju)Y/'+s_`:\IbrCT1g>u(:HI<n.o.?7au`,Xf#^o5SAQ-;8.!>(-X7NN+8aa0Yq3GlHlKgBe:[Uije.cmDaRJ\Je*!=IL*YaK at Rr-9L"^,-YHu7Qc=0s/nm#("t[liqKQ)=#mSSd,/X/]i%klE7Vk2%a!qL%<%PR:hm!/01qR9M=jH'`]mos+>D%?=j2C("_?LD/S*hsR&J!p9(#N:4DgRjP>l2YXDaf?pQ/`=!7iIhsY_XcO*EFXr`D96i14DKe0PW`KQq!f.&/D>-U(@odQmZKZP3*qPbL-m%X4A^;>?,+98n_:C!JcE:I6q?3bR_:*s<^&HQ/s!!PTF9G(`reH&D=5u7Cm`!P<ED4o'=N$4h-3Y"tS4!@t;Z]f!,2u=t\:1I\8];qVEVe4KMSf^qGUf[0a5VM/RFF-aJ5u1Ujm6;Sdk=Mpc^/8Shrfj++jnpZ8S0$](gtcVD8q?%O%F^Amc0GGL4g&50o2]M#)ZoP6>tik\sr.g)K5UP4!,\S/cUVPinBmE57/'SnQ4':X/i9gq+'hiFfYSbr$.GVBEW><Ed0>#UFYViLZU!ahqo:EXaQJ5CUPHuS,1(Gc&Hr\.Jl='@00oD&%-%f2]@2rGePSR$O-o.`j.6&Zf4OZ!hK9e#^cS8M0FX]=.&?j`MmXoK:(7nR%s_B'O!(#VZ?&THV`:n+#[mcfsWmuDsV,UUM$RPLJF!*KY^3$VE1\Xmh`1b^A2mMDK5[<pWL$a]MFGU:O)W2aeIcXEji"Y'I5+M;^Dp2Xu`.(EDSb!KC7D^/+G#KZpf=lk<jN1o=?WF9`Ep`[i9ZFpPM39OtR]V:V\F:GO8K;%F?(8,`B at k*P;d"X'/7c`*&#jZqc*P<-6K]6STQDpXDG%j'"mX6FEMElJFdoQAq0;OD=c_)L,r]WlJ.nmZ$V1e9FK'0%;:9&N!_K9ksOb;uN&j^+],,W+/c7qOT,MpGHu;m#ECh at f>-.NEL6_d>l!VM)(:IC\[55BS*MQ'#d5q18&%*/o7koOtLhb<<+nMT[Q:>SYdDhN`r&J@!F>?>F9R5DE(uCr?_J8Vk=GA+JLf/MgZ_^31[14IQ]_r$kO5YJ?J\HaKp#)>+gOG4)6lq0jgoZQC=oSOqithI<uj6jRF?"!M4B5#8"7PX8_\1ckuTih)M$D~>
+endstream
+endobj
+296 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 295 0 R
+>>
+endobj
+297 0 obj
+<< /Length 3141 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasasD3*G]&cTMZ_UoXV"LlS'MtNAg;DbolO9;Y"&I4(Y[i]:?[WR^$+"=>P(B*\J`K<-UAa^eX7aHlX%d/g-Pi&T\^Aj9G_LMcIe`J2\Ci at 0ZT`0Y'/5ii+N(B<f<r9kN?6+:HG5&0V%oK'V^H+.I9H2)*.X/8UU:8qg!VWX*XfQep-S;U"H\SE#2s:u,R?U[@aQpg[(TX0m_!rTU8/A+,A4PE3=+B8IaSUP9Xqsc,Cj)F';j*8j\MR!P2G1OgRqrtCd&-;eH.rY^>hCbqFDAF$[g+CZ1DLs:\'OuQ]+Am+Z$<[Wd9QIWi[pV_=Ecib2P:L9d<d0=>qpoSfO?qirLmY<-M8)ie/)[AM*QK=;Z(5_nGg;HL'hN!e3:>-BYd.l1^`;s<S`qWN2.o(<::?&F>J:hiQ[X3J!lik:jrtkoOf`$9WVr0miSVgcPLnKBihVK-@&@<r*4=3BeL(%nW$HTg at P[Ac%U.]^:\Yke1nHg4KiBtT4Bs=ArKEUC#.-YK?]?SF8+o at X,inPrqR%B5h%DR4a>qrVFfT%FitgaFYb[LRZmN03t+Em\p;a]F=U_(9p1]NEX%k=?GQ(_CtTFBI8de,C$dl-fo09c\`ad;YitJESnAgpE`.kIUo!8#0<%)c82.(B^YXbjeK]Zt7&00fanKI8E]>3[s84]glfkfEIJ!#5NR($r('TQ8bl,;Co))D]E&!CPAOr&26'aeJ7*6ll+Zl#iYta&#_l*r;*lHHoclt)b[=^9SOp:M`9WV*]Ot;StOhhDYDDFflOs[0OUed2;C(%Z>96uc87+>/N;2NPhc1tbHi6ACerE)YQq0KHXRclD?`3id;g"hV?0+LpD6hZ/qlO")rQt51(S*_c'?e0'.OZ\\0I[`hnL1B$r(9Pt'>#iJ&4poL5W8Or'"\J'`4(Xe;il67;dN\FNB/7=e'!&Fd,mIKF?=M<[ClQE+jsqNcD4%,"N6sRXQ*KK%$'cdNo)9,a5$'6eff'p$Z3G6SGfQ8*78L*.*].HL.l5YR84O'8k#*Y;R;0lYh2OAcU+)A"PK_L03MjeiTtSZ;'"P*<D]"mBG+ at 2^IquV9n$bY)=Qo<f#dk?7?%T=E,1t[`Bs^%6"EV:$K$f:k=Bg$AasF!pJr,-LB2dNcKhE?D?i&P2Lj>eoH^F;`F4l\"IGK.2aF:a4ZBJpQGl-Jp_iODl*\DC&h-uGI*%X1J#V(qjD)a#a.jjS!lYrL0IV.O][L<,ZLVk['$BdA\!/a`N1$fqMN]o7W-t9<n0f70X*.Z/Fk'8]j?oUg[e`_uFe"H[Bb0pn+(:UC6"Drli*@30=Qd55Z?aUdH*>WFH08JqJ-5C3WMTqSG/g@>rD3.%&R0pkD&dUTA\bM&DC;#FWX$Ktj.\-p).R'd?:s1p.^aM!sdH\2IU6-IfIkh18j&I>%I8p/NM<@^866^op>gNi7^XNV1.SWXkHISkX^AcGTI(Y`"+dHEYE1uQNZ7L'pfF>M^P[u=_N_sJ?UjIdgN/j$0#S9Q35W1RZrHI.%;"FQN<A+EU!m,.g8['-VYT"]p2ZR6pE=QlYQ'7";>&2C[DV"-Z!1a_ijbY_G+21lCB:Ld*\930*UM,"3cTuuRc6f$*=]b^^0jPA"@2=M`QKZM_76'37"m7*t;5+ at RJ7>06VlXTB$$UtBn#juKOq16`F1&?="^ogL'h;.h:4YE[1BkQnKV!6FP>CJ6d9hi)FJrF'3$>Id?Og$`s6bhU,._c07%e1??![.5onM_`^3</d%3*1%oc:pGp^sSO0(jiMJB\MJHIkgD,UBqc;]I)GQJ]Cc<RBK9APebU0I^7%<.uR9BVTq.1KBL2(12L<@i=VsA%i56eM_1%0[k1em:hXk;'8-kT1p]8Gr1?a^_iW\P#g0R`\^Oe\LZ<Bh3LcBZ"k8;<F6EYM9C_PRVW<SZj"h;q0kdB!h5#b"(WcQMB7N[<jJtZ)CXq#Pmo'D^quB.iT!Q_^MZ]AiK2dA,mfI'Qs(:oQjV6?@7K^]a/ib8 at E;04\g6^UVcTK.HXSMJb4A%oV.o'`q%Q9fHg2(<keaI$SLm,J/;N)[D-X.qi^Gq><^](V^/`k,,uS[Qe:m*]cdCkmdnD.nW*B(Sme(G6?\bp<)1ta7 at -LQ3%pFR!>qLf<j:\.?S?Qc.:G,*(WT[Sb0Br1aH)=csb%Ce>kr!JFT01D^pHn__[iPS#l?9qedG3X;E at Sbq4^JekGW4IZHT7Xe-7Y<o3C0*/C.aS'j(&<grK=]:F.+>*m*%U!T#VeE]^WHif`BDE4mYm0bHDX>V4XSNWJkEL0&G'\^4a0QZemOlK+\MW97^O`X`lZf<T`m$X[eaB.Er\V8$1W;nGS%Z:KKK]j]dtDY3(XaRS6\`?+fdEhjgWngiAF47qFmVDTtfP<TD?*3&.H/<O=-2/IW*G00;)1[Rq2NS<rBc.4YW13joI5[%6?)X(#RfU8c*h&6`<@9W4FndoY at 0!h=iH_!RNjCN'qK:a!RXs,E:W&bo*+W&o#-Wd;!KQ#YP=no`)_dM:2-C7].97cuo;1e3b$k'A)pd at kQZE=YM8NpkL1WD>%ocC!ZJ[QR.1pY]m^,^'*1>h$9CEn[rRCRLh96Xo8s_0j&2,-)$k)2/3lB7UnRTJ90oH,h1uY/EF"-(>6aefsk?VFFLphcu_#)j9Jl/:cGn2F_gVHmpJXZqW]ZPW27Y]sI5OK64r&Q5P`X6cAd>8Dq5e<4op1/;/p_5irn<cZ"OS0\/IS!nHeX=9QP,n,X!V:`3 at aKLJ]<+=X"k#0%-kg0D'*FS=C.Y^)V0EcKD/ZD?&ZF2 at 9`R58VWY'X0mAj4L9^J%J3Cm:P,U>[jMl1i/LcQ,*+?=+u:&j*hD[&WJ@#*<'oVLm0D-GNX_LUsi&'"A at Qg`&eKSl&5_5 at qV([?L6pSb]!C?!jU+bbjto[7c68>!l[P^Bf?B5kW47R"n$S!jNI'2@\#5eiec3K%lD(rkGkEoJO0J[C"9VZNaV"=30M+)"0h#/T.12jmX"2a4gtWNTWhlI3`e+M0.+Db&':J5Q81(q0i#YNqrXu;I:_$dp,$@l:J5!k2r9pmoJ;kFI)ap1S#Tjh<:]Q/<;%3=8f(IE9$l?j(I*>6estd!N$_@<;dkF'u9/[M9-A5La,"/rrG8<Z&e~>
+endstream
+endobj
+298 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 297 0 R
+/Annots 299 0 R
+>>
+endobj
+299 0 obj
+[
+300 0 R
+301 0 R
+]
+endobj
+300 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 246.162 323.774 538.872 313.774 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 81 0 R
+/H /I
+>>
+endobj
+301 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 312.774 112.82 302.774 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 81 0 R
+/H /I
+>>
+endobj
+302 0 obj
+<< /Length 2352 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat<BCN%rsm!F28&I`=S,Zj;KB>]6(9s>DhL2A". at 3(*/Fc+_j3_ssW at gr8'];J3QZI03`!g7bT*6BFNo'PH'omJS%VIV_j'PGn:_c\[]WkVps%i$[cL*XheMp:=DMcMTQ3RKoADD!;d:)<<qHdc-EmJR`RalVSE#SOJY///_n)4=2O."DJrZ>CEiel2VnfFr%6"b\7,[1$oFFcLX3%s;$>.p>r"[&#2'8g5=e7d?:V=li_8Ds/EL/LA3t4OLUr>P^T2bHDTu,LmdWVt,MLh3qF3^i at 1Ie"4a[S`c6'ccTe;(-:=ZJ at 34,BiiG7?ri[_"Pk3EGRfS`".Z]L[T_l[5i_Zb5_E%R'L3@/9?=XQR)Nem!Eml!2CtYOAiZMa.1d:cMJYO^!MMn#2_AWG,#p[i7Dfu4;7,D2h>kEal"4-S,hmRqpuqDL]XolS?a4WO)YZ?peuPgqJLNTkR`?m20[Gm]9$q_-;!p_-?rs7Xa?!a?0XO,()VS$T$>`Z]#c9V6btAGR_F2UVOosLDJi1G=8GJM)7.r_XQ/rYuAoh[(OnWrrPVu:n/.&Q(!J`8[TPehYQ%#&/rSs'GR&>_2Ho^901aV`Ik]7n;dRs-p1_apUUT5.E=+IQ3-aR>Gi]Rmkji</0eJf!;(Zsa(_/Uca[!?'M$HYg2bf at n,.E"[VeFC]7QIS!r=*l$s;$UXO!GU=L+=-gYNp0WRD4"_=/F*OhgSP;!]$bF-F>#5^(K?0U28BpJ0Sd=W>IMt^$*uQ:>uoZU:V,)i#YA1 at P1KaIYkf*lCg?^UR[>R+<&2CriOMk/cmE&l#8/8<3ksHj/gO;\b.)P2S$"U`.-u4PCS at jT5[986a"WsGBcQhg8^8j&,Uk5>+@`M-'U[=+=dp2]UP&og."KA+5C"TBY]FL3h,`Dn%EaSp9e&B1#CRQ/piJPO6^X>eS=%&!Q]]CK`*Gi9UmFB5ZkusOMK0 at Q2IYEnA6Zi9!*9m%=s?hH%LgFQLqtIG>;6GD:;[)bGdB\N+h9159,fb58Ce'>l"3*:mf3P at h%p4DmqAFfDE,P%A\9+cs0FPe4E&`&ZF5H<bK)dPibfGIa\XKX[IGdTXILA7_d;$%SruoGWh!BfE'ak-4tqgRK^Ih9=n<XV41&B?j:F8`HBeKienk\189L<!h+4qh[YIcID*f#mJZ4-l.qIh3+lfT.I^Iep#l4Jh``P1"EMdee9fMe"Wo0aX`j/HUblj,Q%IgO%F1r;hGa/<(qiE?fR(Hr]7qahmkhW+Lm"'-Tp?itUSQt>KP at R\TO(XIB0"0Nh\uY"#_4%i5%ep[)W[]Q<e2q0E>f:%T*dWTK"('o*qlIsUm_Ph`X/h0pf!sK#1BLUBNs at ab7LFSUC-jc'8/sTf<V-uT3pldS")ea9XL?m"Q1*3Yj]WVq4XCGgKl:>0Q]\l#;fBRCQ#-*qn`o2'a2T3)22p\]m3LDf%2=u7Cf*`:^#.4#+bP?)iY3pOE8ggk%?`ke+&DP7UR)gX/fL5YkMUImUXo7n0PnmM'I4rp#D[48(FgND_#P_,]ja#TYQ$,)*i`X-oS3!m]q9(^3*r+oZC=Rm=5A;5fLekJ3&-^=8)7/P\4'jdT/P\C70$Wc_T]'<mp&HS2\=^Roj_B5cLXteH7<3[@[P)ET(segl-+M2R&k'`OOS"E\psJ5DWnBT9ut2=,[P9YV7-ISmlkleg$ZrCp'\gsEs at +.l05urp's"2**oE^0"1,2o?Bh?a2&VL[q'!VeH@=ga!=?K]ATsP]\SXqZ8C%[;7qqPVdL:(aPWJ:%UYjj1IR>(3;N:>c)1s?iU*O9OA8KSo at RiTlpbj_3feIpfV%)8WDA1s8(,EFNg(X`m[q"rO//k(_2WOb27]d`Xs_#3.PUu74>gY:(^)*ZB724D?BkZ[0Kn.EUuhd\kjl'*CAC;Yi'tDboS`.q4<>qe2%S=4l_n#G"Wm0eIKAg/O++bL8N'6<Vtbkma7DjHc=*=UT7R-Sif0t+K<M'nN0*XUSbku.+Gh\CmOXArec<GrA at 3kHq?lTF(l at I86ugZ<Ynr at Lg5i(8]:/2)Op<mjUjFZq8[k7S-:_c at _Vd]Z_%f!OO at VM\&'iphKi\!^fgYuV3oM.,Rb2PE]G_2[&>Ek4qVoUpX/EuF(KaoW. at r'oX$s3&im16,/F,:$B!?re'6FG-A?VSDCTKE6cT8U_,Fk4Z%U6#rI!`^c1h_`*RP7TOi6<K`G['@0e\B5t';lc4q^\81(u at u"1*sm6i,3Q.\+p?N1t4)-EE'nK_,CLpCf6f%Ed#(YpY at BTn&K>c>3PP_fdmJQ'&5WC4a`rUr^cA+<1Rof at iDR:(%Q%fJ7ok"[3Qs$s83I[T`5#GF?R>~>
+endstream
+endobj
+303 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 302 0 R
+/Annots 304 0 R
+>>
+endobj
+304 0 obj
+[
+305 0 R
+]
+endobj
+305 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 709.0 108.11 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 139 0 R
+/H /I
+>>
+endobj
+306 0 obj
+<< /Length 2565 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat$:CN&:Bn[j:i2CNN.^t.bP<FQe)a#860YIVN>(.Bi8E$`ZM40>H;P3kuks5&l/M*jFL*>hmt7\&GM3CD\?cJIBt/'#*beL!Aa=-%">b(`,n't\u(f<2Lk<h''QfCQ#al.aa"BXaJWF&m[8]D?BPq.W5/\Q0\CMZ8\p3)8,o#X-B$jGr!,:NuiKIF)g1qYC'So32ZRYF!#h,qkQ5.U"crq>L$Trlb7q^Ye!e^ZjhjZ[)bGj[N.js/?IrmXr>Tk%5.JUc*.79E8uik]l-16"rqi%G+jg8WrR+:J"8<:@LDu[`p%+>G)L6ao4VZcT at HZ1q;Qlc'gaZTH,T0&NMls at kUqL?D)3c3EUnS]Tj.5mM[#gC(1cnJJEhf@/`SE7Z+d`5SR@@i:rsYOW#pP?#mcWh?,[2"M at 9ZFi<kA5kt"87iqF*#-6FKFsi$Ijk7*0Y0IQj0bM_SQ&1X+cu;l[jU-tl-7F&M8t$?aN)uc[b(g6i7l3=In^+jWo_k.7I3JJCV\auBie`N)F_jL/CKd^33 at 07uZ)mEiQ59cQ)&#NbnO2r&:)-tIc!L]V$oqgfEV1SEk5(n.6Ut(SOI at L96+I-TWg11qX@mn8G>be>qF2'U at aYt3\$\ICl?RXtcir1d.&h.l886(__Elfu$2HAPq1e!%B4Wq<0bSVi[8W4Yr=O6E,lm6j8dWI9QcZ$IIiN&No+`o%mFWMVB"YVh-1-R\s,e%8=0U]SRV1=K63u31Z*;Ubq at H1H<4Y_BfPc$fY&U;Q.P%*q]OQZB5F`&r5DnD4;uFo"2mt`(K7Z9_/<"@XNJ_Pc_e$HU$-O/<Ul-r2)O7\0)9'>eO/uCq8-ncJaT]_&XXOa.]T^&`;1k\l.\$nKhiFnT>7(GZJ at o6D&i(+/a1bhNHXHgDE;/Jm_oG"%6T9asU!Ko;d5[AfQPh-D"AV-]&09B/]ZB.l;JAu<f7p<hRC%B!aj]KIWG7QYNU&I<)n"EXc3PAGg)c:)p'=V(9lXK:g7;V<Fb->F`0X?'^8*2ne!hI;<.?"k-s(>YkZhusSMd]rYNBX=p#8M\2=c8s.)cORnd.p/?*U23C98C_j?]]oU/bJa"L0DrO9Eb#&HnC_U/KSHm\]OWb4<<pMS9Z^A%NqE"XQ]4R5sl*gU8l?5bi?K0i"UZ(P^MpRE2Q%ZQp7g0[6$<cR/A"A/`P12agij.%/NAc4:@!Q`Ol8^g47bo>\:3QU1pcgFsO4>EUW`]gC.S)j94/PVY"'Fgul*45P*E#+_a5]JP'?;=LKZ0ho&,::osPngr?fcOI"\Qd$LIbSq-(i$`s_3!XG(aZN$k`R"T;G#$*+/r2)D18Qg:DG`LA%47=_du^Q0Y1HVNjEs&``OP7BRSY0C;4+Z\*$1DNgPVZhNh+U!c6/?,IjB'3CIb&=%O3rg<0+>'d("6'(T2ZJ_QVQ%@IJaJo]+L at P#NKrTRje.eTe9jcf`f(7%ijla0&E%d>cD'l-$>YaGK9j"WZOf,Cck&ICorS>&.Jt)n=j/`V-qn8Lm(#7\Gd,;kVJCK$;9YbFCcDHu)YQ,<jUq&Fo4KXE=loff.VZjZU"&pBkYRdi at mY,O9<Y?DfX%jlNF4X1 at f^_TXj8C5`g<''q$\[>]IAIR\VP9FbMq6W,.583M=M].brKibZ2ro&@(=[BC.,W&4kDBRl=Y0&*9&l])`!;DXMgFGNT"%rhol8D&#_P_-Y.pf(qSdO%97aYMbVf(E9ZJ!6P]LQYgZr.)`QI4c\n]ZqL1$I6Sk4e\\klq)4'h6\\)ER<%lZ at thDU`+kC!_iA*'D$-V at WTj8CD033:j"'&dG!^!7,;f7C?qahD at s(Lk'LbJ&u&^<`^br^B.(?D0!XJ+W`h^eWAUehU,KX:2V*R?Ftdl$\p#1 at LXrmE!4eEIK*$A>8Z97DH]i5?PW':'X8%-pbpuTU/ZQVR6*F3XG_e#P^;A!S6if<MCK_k^APq[aTOgk2K=WL0fFO:ELe*QF1UaV7D7c$g*Bj'tJaRK3=p^rGdB at YUQ?WqnRih)Ym.P#F&<(P67O5dtqFZeA*$/)-&T,CCetHKGPHD7qpUTZA3X4t[Ka-npLF;pl-\O4LJ!KK&919q2go$Dar;#LSQ\Q[?DshMXr:oLii#R$iA+HEH:E9TjXWK0OqFCutOd^JkF-MS!=eVt-BW=Ab92S'`OUAc?BiegrT5Tjg?;pbip"/oY:A^pEMqPjD6XRFQROblibp4QEm6W%Pb?MgRM-[9 at HN-p&\6_)qJ(Po0<=oC_2qTIj":os:`%:QW-aIYB-]hFt0<@EnAVBi,U0'nd=)"r_C->oI*BVaTS at G82#ip+fV-XCq=S2c>!5j%$YM0jM&25t]W\Mj+=^O%fg*BBhoc;\8,3']j@*m%a%\9k:h"POcVS/?dVitR8Sug\6bD7`rZl:#=//'B]VEm7B9l.57<5U(MaqBRC47Y5^dQUYZ(YrrRIdd7hf_Hrd*@k7fh6X3mX,='cZ[\S&CeRo"m;8Nq+*LkNX>Q:WXZ[IkcL8>W98Z@@7oD2"]@*oR&^<iXqTo9a'>Uppp_J,A<7hN8q3o_2!W?0_qu~>
+endstream
+endobj
+307 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 306 0 R
+>>
+endobj
+308 0 obj
+<< /Length 3003 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>D/\Gm')nJ0 at 2&r_p?F>t/6UEp;q('lg7mCbe6e*137&:LZR^m8?K03MqVO at ILZ2-mS/+(8Yi%>"E/)8U,F+&_c2INYj_`X^[EibLX5f2Kg;#pk(&:+Q2Ep`,e\5;eI&eaeG'3!:,.?<D2ZE!MOGB:VcS"`=C6t%(>,89hcJqpe&h^h3-W>o>-)B_19?:Zf)OD^"(Ukd^Vt=\gM[pK0<0_*XQ;+2Mq:ZL#B?eA"l;+FL#iHB at H$YY58PGJ;Yi/qiqet;Cg*PU#:a44oLHT"sTBkl5[\n>jFT4NB:YT/_[pa9T(BBGGHaam&;jE37W%?nu*WBl1a$LB8^GC:=#_0+s01JCI"\""P$W)sQ8%'R^4+>c3_u6:lBVZ/,O%]ILO9N]V0Pk;t,Kk-OlLfaZ<-:WA+jUEZs3`#k7A2?>3a,E.E`pLbWbPkZJUd3'!\\)(jOiNuX'ah1mqS\&p+%f"fJE.$[WT.XLj at emJEgu/6erK/ShbGJa'1X.GU[6Q7!r`bIb1O$:5;q/*\ogf(;Fu'T;AL?q72Q)B>#C9o[3R92joco?p^62$+q/ErnHJ+H,&_Ga1l%KB?(B1__er+3pV^7*JX*=Km8?e^D9-Z`3P/^0.30Z8?>Ki\bF\ZYGY]1Ml]RjK%GLqbMK at +cKcMeq?`)-_iE?tc)V-q8.l]r>!Jsof)q0^o9(AUa*^Q/#EeS[R7u'k-Np!#$%Y$p8gU+4cR3O7e#Lim_0/5kU#``E4tU,IX6'"O9U'IfcXK&niC'M/*G+N!<'IQQ-]:[]WG?iE9NHmRSA\qW:`/Z`4>r#UnQ>Y1=UtZimXMfr5M-$gpr*'r]=*si3RQUKfZmY!TN'CWIikl(MXPIdi&bbOb&hYkZ'e,j?L*>4;`N1H*/;:K&6G+O"p'WE8)2";%mTL@^[M0nrKlF>E(/;bl`kEpn7&m!6EAMi&5uXt;Vm%oj,'LMFjm[)oYSn at Kg.S_OHVGsK4rI7F:I)g;QJ,fZ&mSE?;"HK8!@EqlC:k1Le:ZkD(VA*0A'sjmE4=jBY/VZ0S5,V8YYsn=/or@'X1+ at D0F;64em9[o70V^Rm8Y!c*/^kA#Ep^AgpOm7+FOMd(&_+e;^W-kiU?'Y]T#*<)l%V.8r?3"<3-(98-K;/;.ZKXNe<6ku8`biScD*`0o4Em_%!5pagt7m25M]"t/%MCpsdW*`J!\*joqc'pD!TW9UhKk"P,lWh[)A@(t!shRoAh2IYL(3UD6hSb"es$[--9CBk8b"uX3h4&%L8d-*`,)dh&"gK%ZOB1;NOMDo=+[9f'uLJWD at 9P$Mm'38eq)q(F&DGEQiRQ1O*a(U6/Fm4b-:"r"t1eue4XXnFHg-W:9E-.'S5BeNI+#;^a>UIZogN^o9_,=&a)sRc.\/dIZjE=jBQ;WSS9I61VP-fWK'T/C.NN6'44&o95O'V.sYTCS2ENb0lI8N<f>a02T;>%u;KuCl7/+4+_I9TgKA at Ps:9\66u)T39bN3aK]0IQR"$2p.SC8=+Qi41E;R4p.3Ij4H!8)5m[,W7RQ3/)faA9?t\_BE[YP)[0dR2nZg.n,BT at A[O8dS#GNRGTi#ORC)EQpkeEreoh#Rb7m^)ogC#f:4tn=kEr`jV[@k`+ZNU#$=\Z:q7SWpC5>""2QjRVF`PgqVOnJ;'*rk1&<+l!rGS!BO<bp[_T7*<\Fhb\sYa_Oe3?@k#nK8J#9hl:OPR"0fJYD,[%+`2D7k1q*$XWlN=SB)CXs_%6V*:a>6`lSX&bAoI*t-Jju".*BOPH!c1Ok.^ts1M;h3X>C9k)kSnO8csJEH'LbGXIVNBql)9"h[f\i$m1(1c56Oa-e#_/bpJ>+=TtA/lH,A<&.?.UKP7(i5_J/;`\.VU60Jq"a/=;,uj/\>4]$Jo:oI(0-7qmY0O9jfeOXa at RNUM/6!+*+B&A<Br?VsG4amJT7lO"`6N)7B7<0P4VU],5l^tM@[6S/>>_^4e&X?%=C\r^1fB++2a3K0F at pgZdCCG/!cc:m@\pi"^2`R7]RUh`W?b,<(P<d:;Yi"Ib)?#qm#HKj;=?.T_52>DmV+22f_S$>dX)GsfMTfX3mI=nlekPqPNY&E"PN[82(_2>C0Gj3f[Y2CUp!e43nHls*A-]rSS=IAoaS3Cl)Be5PbF>$';*kJ6Bm`@#-0C,LC:qoE^1%;?F-qVuRasSoll..0k4PFLCE_BW;iglpep'jT.B at Sj00R]o=PG61]M^_-=#AOsJr;3Xrmgl_85CWV->uU8L`*YU,ok))ShrK8Yhb&Im8r=Os^&I]NE9k,YjKZM/*!8Gb@$^AY!0^r/9=UM9j_01A%cCgp<S5/%Ij.*t3um+DG[UoN9cO2UrKZM$,2=/m7M,-m:4r=WDT=(iC6U0p<,^J:c*0.T,/pq>dIr39BXD+qaoa5oQ]lA=/>)dWn<u7]%'A@\L>0p-k?Uq]k;5J>$Mh>*%%ik8_[BqcM+Pkbl6Og:Ej^PlXl&70:1X`C=0rS^@OuZs35H!uhr4'lqr="q1rj&Sk+gHtB^r^'-)^um'0XQ`3ih[nM6O at aYJ/`^#U`#=1JuqT>oO*8^e]04MPYg>KJQum[!up;&t`9jr5!TnIkkI&`B6ZfU[+A:MHR0555-4$4Kg?=Ws[62(7Q];!ArWCJ$0uJd8WXjD5O/fUTe[RHW3TP6u:GF$db^rRrEe1d$r\l[G/o-%D(*;C8.krINjfF;`:fsH>KmW#,VYL`dM!AH+t95JT,'Pj1T1MA`f_Gf\P67ra>S->cFdCJpK*"O[N7o9r?=*(Dm)+b\/uL6YLglTsY]]*b/.6,V;<&c/UC(=IjgQ9"Fh\ldSFnmHBb7YnWI4*[M7f`T(1nP5Lp:m+fnKSqTaVln<#'5$AHIM*pE$*c4T)IEp<N0>8f^]taA[pk&hMLCQW-pBJ5H`_^GP[92NLs1Wd20>IKUOH7X6pOC[Tmt8rE@^o>.2hCtI-)7C/4g2F?*lg:^1o&;J@,"gq`m5#3%t4nq/3jBITj?jmE^0rM~>
+endstream
+endobj
+309 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 308 0 R
+>>
+endobj
+310 0 obj
+<< /Length 1005 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%"9lHOU&A at P9i7<mP3#M7TSshQ7;lOL^EN.Y5]O6=1^aV1tCk$km at BiO/U1c29A'`AgnXEsje'6uki]n<i:0MI=kC*LR=8nj+8(&/"*f-JQf$9=na(]UEk$3RWIsZMj19Feq&HS\m[qEu>-iGk0)LES:?5_7B*q]"]R#p&/64`j$K!Ze_FS-j-]2J0RCTV#3.p5;[CYUJJ/4uY%K!sHRUC at qP=7dRMPSolEf!^5rZ6hLC$Duq"Uudo_d'uq]VpYsmWq4ahrp-=5UN"LnZM8/8S=7T20]`qW"pgkRBh>kd1>HP3[Q2snd#gWNFgT9r3ZLri1a?2[;c+HgV/aFn9pPc^F[TPC#BH_'IX5<C]c\<MmeV)M(^$-N8aL78)<Z*COn4EKaYUe"'EI4j<nNuW.ia7+4lan0WB3Nu,PdAPHA8I-9/*esCl)S7fW5A6b2*EW&RZ^927$+*c,t<,hA:+!kR8dk=]a^n9sf\D@>5)4K&mVD2 at Cj)S2lnAH5i"ZI^-siQqZ>sGXUI#,?h=[<qCU>Xb at ttW/rB35?>]^hAH>D`Z>=j0)8s.p1%[r?/Z6EEX@%-lEB[)O"7S'-ilnQH'g:!UZIHb2/CDl/pdAQ.r$Oa;jNO_b4_YC`4."G3Bi2VMiDr@$.*[$oI/_=R!+=;m>](mNGuq_SRO2U:?CLUN'5Nc6*=7WX)J6)A.<k\1UHd8;&^bL,7pQfNU^=uO60tt"rAQ1P\F))SC'rX+UH].nYMJO3cMA7:\HpY!t.E at 0n+CqiKM?r3!"$[>HTj,]8?TZrB'>P12Q2"0)RuAL:,[[JoMp?>dF<#.D?<Y(krEpgh.N"NU)j5!`/e'M<m,k[Oe^=5bX3F.XWIVL?c0ARi)f6n+b8!7=Jsga"[iNLN[@Do!h7MJ(.gW`ND`i-?/l:QEi$;Q8lkGgZCQ)8Jq8dc-[*h6]6l:0GqdMP:kUZ-TSTF3Bj'Te)AH^1HI*1#^q5(!?`2YqLLj45bS\[+%n\(I/~>
+endstream
+endobj
+311 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 310 0 R
+>>
+endobj
+312 0 obj
+<< /Length 2235 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=-=`56<&:XAW=9K)u!&D7^d687%Ou*YHUeTA$Te-=LU+EmVV97oR;1<r8-$MB)6W+<,E+W`H%VIa+jdYANp$9[,A!H/=\(k6`hYfn$q=63.Z4Qh<RMRB31N0hqrj[>I"K!JJ^[SDC/42ko(TDW#abFb4XiLn=05pYe,PigH;MF>/,mj/&>bh6c.`-2YJRs;!H'bnl0YYGVZ3nAN)%,siR^>0 at cu(?`-naac=#]XN?]'kCr;af&XB"^1nF#%7g(=K#OpB];?40CiYWGK7HNi8'[D6$(Hcr&^7PMG,).%qK>@NGuG\;jJ>8&E?JK8jA0?K5RU7OZ^CM4#tW=QBZ4(K4%@*k?.&6^a&5%)^*@(t>-kT%SoJW69Bh^4%qICkX977B11;(dobbP(e"i"VsE"G$nol=/O'<f=$PFQc#9CGrVp5G>fqqfe/[,d$E:Ha<\@aB%FIFhBTnA0i'W/0(L$)NM7'1;k6WquHWRC2Jfr!W*]M>>)C`X4rNVfW%'86Tl<GXK\;SN/?-^,"$'A'\3uAf[*4pl/4>iaXh9;Y`-jf[(RsI6bOit\tNZ=bMD+[+K6D2B at Y<&c$joUSDq/$+F`q]rQ"$_S)8,@^&7fOO39K'rVXdU#oo-deTrrY`.SNII!hP"Fn9^dGO%j4^?7lqNN9V0^RD+1X=5=K3p0lg`XSC#d^^#L1%+6<geaaGOAr+)l@'5sAs?ltVBk%>a\D/]-qAa6h5@,m7d<d")WmZYFq#u\S0*:>Mc2JpnPuC/f!h."n/,`Nmfrr5oNW'%T#ND)8L]oGM9F^bZ!@cW`,T%u#o<AtK?`\&G11^Gkj:X.Y<+A+D2s9!8u0@^`-'c/AMfDpe<.BCnk;,2!>q_8>bo/!V3sg[9)?hG-kKY$d:q,='2,j#a=o&>*L7$4b)$3-PY</%S*E2iB`c"$&;E7!n?a/*`!MX+"ipKR5ml>IF]@*B*b?bHp$?Bc='M#fk7^LP0/>ZdjoV]W>V+^#1_A-R#E\6U&Bb,BLh/3J6T[!b\@O&bgqsY6ae%et]C5Ms'6c-gXTtI8s'$q+!Kq[$M$dCjKk93-@#5WQmGpFCP'*'mXr`Yrg21;R#o]2ie3jRFX(u6KY8ru`=H.b;bFole2VueKmg4X%HU6-JX8pO937*pnFuANW1pRTHAM0/;F)(9gXKc'J;IEVQ>0F(U6.aG5R]u)[CUg57S39C[bNQq^.rC+`^#&n=I>M%DZ#.3UWqcJ%Hd)Ld.oTRq_g(Ak]=3XCOY]]m>upG9DT++$n>bOi3SC%b0LYJ"UJl\$%0BtKhk02JZ*_"(J8`9R+gu=s>2bp#nV9&'jbt@,XZ,WhFElO)9A!$;1F%hN>kaKsnG.p,-,=@#;if""2p,mDS8Hk6n<:a*RYje'qpl at j$V#Dp,2)BNH1f8`2l/M-`/tW]o$kW=\*/T&=sN-_CBEA66.BJFkGJdl at +K-Q0O?qUX#9&*d?1AR>dLG:N+$Lg-(^LIBM6W9YA[+#[DJ3P\/X'Ij8V[%A:6TYPI.R^=>dLF5-5-I-QJ,8Rdag4'I49RRHIu/<0/VuL)YGg.RJ-4idl87Xj$2Lb/t=XY(j7P]`"R8X?CuMj4m8>1D:MEgd*.,c;t[H3kBBS#mO;(*K at i^Lf-1;7rnIVM$9"nh$,!c))5!,U*)pF&XkQB?@3Y75^**GYe?L^JY at B`l\\X,d"W(f:$-8o4g1.fs0TOmBd<N]"]6\+]6s9r^7=CHnMV2u?JI)_A0C\G$:SCUaomk@"]M-eX>W1:[Pa]k4_d5!Agg<b0[ESP_'[3!438U:Pi<+Q9"o at T__=</gI?L6ocqE]$[IH4n5uOgULIl2FQA`O1%KFB4e5Rt5DBe)dg)2`I6-Mm)i`e"E at 2Z=CO;AB0K'][UK-nsI)bAT4,i'X)_t92[,4eiaYa[26.mqiEFu&]H1V$u=4:Ve$H0rFXN<0iG+T0f1j-qH,NdX)ap8Z!Q"/VRc]pT<$)6Jr?$5uha,9SQ1)\*,n?\hY!WM\Om54B"c3V`DI32u'OB14`q;M&A=3oWt3r+_<Oq6&SjQ$usapl$Fe1m))%WI.o>&AYM)*,b03Kn'1ft[j;j[Mtdkf+VCjl6jE47s5n<'TGdN(:a#\!s\JnQ*5ONL.KdVC/(O\ai7`MSTen7`\Yk+LB<fO$QP,mHd6)h(FUc-_"j.Nq5"d8-IauKXdO1#8'Q0)4ObXGKVg4dErub1J.Q1Lq<UP7@=>U(R>A$L]~>
+endstream
+endobj
+313 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 312 0 R
+>>
+endobj
+314 0 obj
+<< /Length 1952 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%$bEA>S']&Lb:t^eSb#T'l13lh[O/c`QWN#G at SV<"k>8'73_VOUo++XDtaVZeh)sR2_O//O$m^>&-5PkqNOdA&^r5Nk#DQr0DJ*b)pEh1hl;%eT.[WK6e54Gj'ec+.QG]A\j&-pL\?kp at tIQ6)cdSo@;<uOY#L6F%U;!_]RA:'uOK<S?\A_Nml.!NS1,\O&[22"u5qIjJo&F0VrSek!TN0W4#;JITWfJ$WgoqW8Y^$=[=F4$Ym'.`bmc>K1j2XSsfYPS/N?Tb;0:*m"\0u>FW.R:fR]O;eQ3:S?I.#G2%3smTG?WjonoMFaY\mEI%&;_XV=:WodO\-=&)#e\*]J]Y1U8$%eP at 2oCE!CMacAR9=)8Fe$JdO?B.\VW?=k9UcY<!1KMUF=UFBPKJ3=nihk>[h3MH_S/%Q9$8+Q?duo%FSO%p=4`<*g31#lA4:De at SO97;Il;dZ'<*A>X at bY!dKR>@+H0rL).3)Q`Dgp4-q at -+Y$)7.-$.;;PbmAaK3D8Fe?2bV/m*Ke;-NfXg3;!bcl;)%@Y#3krM7ZS9HC>=oCZiX/9>QAsm4DLne=(@t[T_:P^e,s.#nQ>Bmbt(37XQ_MSN;uEFh(I_$'6F[M>U`?a>/Bp>VYeJ728m2m^8F?qi,p^YBrYV0f_##sm`:"p2L4M377s4*O0P;lPZ2Z7B^pY0C]4caRccL0cCro*mp&#7I[m,h2(RL!]$+b]ADg$k\#e*P1.bk>S1G4RA8ni?oGl?sUh'=(X#Zgu-/d_%"Y,C-j at 3a1ZV2Y5Ur_!99GE%^KY`=t*`f1Z#F"V;P^/rjp4^p2?I85^;NgpBTN"_E]mFsQMtHp?27]c_=D,sE]=&iMHHU/R80uB'?*<jb21GW!Inrn+!'_1=<J>2C*e.?P&tCi/5*B)I_Hr.DBCN62?=<8E at +bQ/;q[MbksXUP.DS_(_J0Dh<e;B$]/NWlKoq*An#9Tpb;3jPHSr.WPQrj.*ZeFQf7e#g?G<R<<PqG?OmU9:\"Y#Tb at YpjEn%P.K;816!Tg`BXid`:@FJ)+hD4CM2HQ+A^`O8t2<non39Ut<2<U`f(MU_K#uK2V_CEr0!ZTR8#r+XS--o\L6,;=cJ8HK3'f)Vm5>1QQL=Hf%j:9QsC_dJ],X.-397Di[jh03[S!b3<J+33sR:K$3DNXVj#UQY>HGa:p"HkefBe:SXS+=5SV'uGP$QX8/5+EW9dcUi@!D<GBZf[DTg?hE_O57VWoD99:^GSGH[U2b(DM5RsVlOS0i6/I_G*jMgP]Z9O at sttjp&':#WJp=c5s;Z8VUA<sb<_W$Sk?-f1KGrlnT[h<<YT4i'KXm-'FO3<B??O6%hk1uSrk!A$K-jN_0-hdNqJVu<g!BX30f$.;,%>XX*KB&:D,ddA3Buj`?ti:fK0fV1c%9__iG%OK(#dn8OBXO!Y,1ZPH/90rg[D at qOi*G7d7^iI:p,gS_M[.O2KJUHnuQE8)^jH?,)B^)OB;*f(U!H(N\QJfUiWID6>r/00o@'k7UpCJUF@)lF]#m!(a'j/5H4#;HiR at jank3=C+2e7!-?H$S%1AD7]p#:;bb(F.di!C>8a\)lUpV/K48R=92_H46+cXp^#a74i^6eM90hMFLgA_7K1X>]nV='XUY)F.jOkfB/;I'Amjho'%iE:Pp,oh_pSD%\%A];G1#CJ-5q'5HI%/:p2kM)d*mb$S*W2eM`mX-FIDFNn>U%_*sX4\5K8efm=:r$JSD%t7D&7LHTaY\&/aBGb-&L+4C:Q3NOTjOB4Y/nmTY>nlj*U8#7,mZjEnHr7J&U88'=j2712Xc9+D)F5qGMfhAiU"e/Cp.cK5YTPr]9%.W0Qo5&G4eFe>;Vg9lkehc5LQ]5gkL-boK?k&+rdEKD:_/,2<Z,]=(+EJ.QVeOM)2\cjrT.- at n6<CRETAN,`>,[84?*.55l\^3i4T7`bL8,iSjVjMH~>
+endstream
+endobj
+315 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 314 0 R
+/Annots 316 0 R
+>>
+endobj
+316 0 obj
+[
+317 0 R
+319 0 R
+]
+endobj
+317 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 137.57 637.561 167.02 627.561 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+319 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 507.23 517.362 540.28 507.362 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 200 0 R
+/H /I
+>>
+endobj
+320 0 obj
+<< /Length 2696 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat$:fl#k/o%dXrbW`tu\@K23,R=sBP5kW8h$lEd6]_P]`3pLU@]q3!j1jL2+gKNK[AV(:crDXJ`O\T'mdL/JA)[YUn\+nkcM*q!!mcY:^ro'[AO/k=bhKV`+8<-VhS/W*@A8SH)rA94b/">>d at N/Y0X"r%0EH70bF[+4<THgA:N-7hW"=5?9Oaj86@>57,Rac"s.a73g1cRM7Z';;ZkdJ/&>t);:<nfhD+hl_9T%%Lrk<*:C?"H+%lMf2;$]1Da,sl,AoSJN%^[=>&,8t>nGBHEI;mQ4B1MrX35iOCaP4'l4"DZ$Sfb32H++sY.%3W<o'RBtdmM$ClSC1"f/scC,gHeXTtT1>3.sguF=M?>YS at CWBg:tQrhkCmL^4>#KS:5?3C#c"]UjDh]Dp_NmLa"1pc&V:T,*kBaE*N?CSXP'7"-2Z<a[,bW^,Vm,YPf"O%:<o[L%eB9s,.@(e&3"P-+HPGsoYu=$`S1qYT1(CZeHNr,fb=^/0.8)#<tfb9n;e)go&I#p`AW*>bRlVkFNh#WE/CedY<1R"UUPB".Z,olAMN-fNLn[@B/K/gU at mkM;dD1X6(8W=1eE^88jK$&O-bo at kH`A1o?[VQE4:'g$3JR4`dGFA[cbZK67cg;jJ!P[/@B-+qXmW at En6gM>B12LI]p^WGZ+rV'mFV"/f,9?R2Ucu33T/0HuX,qNl>RNVDQ#M'NCf[h*_4\[;>iFg`HSi.(p]8\U<;Pu%*L<'nAgjAt2(9\3%G*q0^A8%Z+^gr+LN"HQ.S\RS!Wji\Ee6^T\:<jC;T,0A-1SCD+qOa%nQLMnEK#Wn_4>%RB\$C8 at IoAaDrkGa>r2ka3."]F4.!"dJ6.W^Y[:s@]cT?)+Xd2N6cOkP$#nC1]')`b;j9qHHihc%!%tS&_9D,OZ="Jqe2fF9Ci0g8F!I*st^9 at jLKZVT"E=u1?775W,3mC\pV`@j?4LIc.ib_kcbs7/E*4NTJ5ahss$m\&\'?4okZ,?@L*_;=k9n at uns3R_W7Uj+CXOm8,40E2WbI04"TMOD6\hbnrD9`,MEHeM(p9ZpSi\+=B(W2GZat2]kV_$nVUo'T_%?=IKSo";/*6*FPm-o6Q`o/`aS"<<Z\`$hr:D;]HT$/B`4$0]WI4tHQJX.rV:J8.Tc<8dom_lu67/)CU=HofPVGB2`ae)D,iL&M+8P'm'#+1_MD[le\FW;>*6O.\J^uV`Vp#7fM.[n5`IOm/]U[c\1/76F8mKNO!'0Y*8U-%r/GK\uTo90NX,Yn`ri_BmlBS<DLRq4U3q'-F1,r<Yu8IP*U)V6l)M:79V7C_-ULV?K>EIM=VS4p-ID&bg*3mr)7+tlpo,e^^;752piIVs?-hSZ^.mVqHgS,$d\h8:@]jLV3o^[&`OJ.t:[DfR`',SDlfN'M#W92'D9,sUr5QVKY*9fLQ(A3IO!3fOSXdWTWnLYI6+WG`c>FL(fl4kpK_^@oH at TggV;_>W=ubG"IG=_p(r-:d`\U&&P0^o:[7r!$<Al'k.N&\L7a][XXI at OcP1>m:6gVCMf]Z at V7`CN4G9KQ:%k,SPt5;5^Q#fI*\B,/oReq;YO`TbZZU6qNm18uNXU5S249p]p91AusW"cNR`JZK3]!^^7Bl9\j-3?R.E(atVP))7,%uj3WZCbe?PNVtn:!<7*T`ppF^9N_2.HfaQXOCADq1Fro#=Nj4HbPrQ&O*O!GLj#t_"mE;`TS6&foU<*c*_D;[*q[S6gJ&sK>*R at 5]mpemjV8n^Yc1'XFbCHuk(U+Yua0N]i9X'g&e#;#WSieSUb\bQ(/]C at p80e[RK%C&PGV+YB3OXau:t+Aamo?QeM=\jpH91<"Z7K(Dm[?`Q%'RMK;N-$<'#\8/<`1QY:XNn-:UGnM,&\QZ6V[Z^JVFYeNB/?&_&Om+4TOms;meC(h&n>hQ1*s9TBXffXEl=PSX6j8\V.PUS=+4j2Y/4=RUnWAjOl>e6,%C26u&A%WglXY!tVi<9WL)0FMY<)?XPL:Md2;G8Pk5F.C1>oJ>dUFXf#hP3L;:<E&n?\YgDaJI+59C&,(kZ%Gf!hZS>aul3^3SLD<:W067!C]]]k3>ub!F/7>X<=I8]l!d/m6`%Uc%G%8Uoe/as.>#ms)iNdU)=4+cBLmG`9G_=,tM:m9Q2=NnSKDB#-_-q?4rUg2.):<m]a[5"3-03QBU'`2(!t^5C<G=@P,(;\ME]mHT^q!!Xk."h,0&W at 7o?"h$l:#($1Et=4*7j5e&oX8X%,:SpJa,[N[Rgd3U*fmbjiga(iBlXAZZ?27QR#hIiS2JKSMT9;CD1e"@@$%K-@[Ss:u at .rQp8oUB%5Te=3en]*T)%).)#,8'./>=V5p#W/7<hSfC)F+!VHC7Z(`.c!"PuHPH6^,LP<K,?QsCuo?E^A60aZ<QmRSab`P8h?=dq'q!-Su+e:.Zc$SJj&/HO`F>?!4%V"7W%Zk*/Zjq0`QuX.&5eM:jVA>]Z6"aAlRMLMNY!]QBm5e1D-:N$aS<clnG6n/UB7E]5Jd(NID1G8tEB?VDp!jX"#]f)L=YIO%6Dp0_ at OTB8#,2s)1>.'C1WP,3q9d0Fh>lRna3RUb=7Z?=1!`FWg.U;X^"m8ie-kk+^[`BtMtK$;Q&f=BTp*Ikr*B)sVakm*6'__4dJX`2C>IeXf!?UN:=JYPRG#(C at 8NN;RQg.K*>%mA%$eZm&/C5QrrMLU:2^~>
+endstream
+endobj
+321 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 320 0 R
+>>
+endobj
+322 0 obj
+<< /Length 2257 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5997gc&AIV:0RDC]i$`nRQCM021h_2+;:IiAfc2DS]I"bZ%S>@,IpYgD`$%jY2^j($N5X[6mihXLHhZrL^. at 63?>Oh0n`&dc=iBTl/;dEsME$TY@^/'I^--<,n7M2K?*BtXNoP6On,sbNd^i+q!e-k_p:*2NQG0H#VetJ"Nh"WBKZcIkO7>V6d((^]h:SeF^g0^QlM^dS,a'pjH8*B,jF4Dj;f?FP[JnrKIA.0qT9?(F_md at f)L2-knU7\@dl%#KPK[X*KXP>M/B^OcUh_M)fDuP+KUV=BD)o7I5t&O at MV*6 at TbUCf,MI$W%.0Vt!;e/NIfa?K1R7j(i$dV*JP3#fUNs5IgV1KDj"F-n=PL-f"$fC:MYBE5ZH]IM1AEMj0HZACZQl8s*U-em.Cop[:!-URMPUYnLCh71*UF$*6SWC.dRrGgMRX=',*=BTQj3*ARpsC$@6=uIM$M`pLjlDXiP<%^_HmL=0 at mK%'pa:d$!JR)K4bFZ!t*E?q20"llZnK'hGSoaK;6)1,BOB:p%,5LaR`Pkg^/Y2\aHY-O=.itr9,SbTe6U`j/.$^TD-]XETDhBJa^N?p9]J3QQ;BoAmO"I*/=4Xj09EG\%9.D`l"8mft;$M2c\dsr<kXU.N;mP<6j+$kM6\V,GKCSZUIb[BfYf<#MuK%UN2o at Hlq-3.uJ#(-`]7ULC.q;fhUa'bL<E2&hWKXa4j3FNW9\c#WPQWnKR"57;!WEUc[Zhr.(e=Nt\=02B!9\-F0^)[Q3WKVWOUcJt at +i%G002RTLdo`Uu#+\nMrC;81_"b/FIEHLGmE>%`f-^+a`)]U"n\]2d*:h)f!5;OX\^<P!2eN_1K(WoDJ^FrXoH7ljZ_6]<IG(o)]p>nQ$IdHRZp*O3XkJ7or!Oo+Fu=!ln>\(nl at TMKoq<Imq=3D;Jo1H2'bPm(efiG?t+qc_B:^6i$lo at VK[b4^)uN[``bkOgebYT:F_B9fRR=L:g.rd]Y,q^IQt'.$Y:;lshtU3)/Z+ai7Bj[Gq(A`1Wq.,DaukIK3u!e^td at 9m%e3.:hM#^m at Vff\bE\/-dH<#Nl`k--sY_km6b8mbu>B1s`i\_OrSc-KAalUg9e.PqZ+l##EsE?L5G:rfT4<D#2/oW1=!X'0i55PQX2Im+t'-d)m^4t,^%,`-P),+D).L%Ou$NtX,>UK+0[*?/gM(i;N[[7%<E4%kr-V$Vl_3:T)47/L$ZkQMIYJ-J>\>,-L6?X;L>PgV)G!_-ItX\he%SP[@AY+JAUpj>m*d at 2"sA9hP/f/=j#;&rbJc3-L]=^\c&4Z.(n,Unmg*BS,9*BT*ndDc8&,h:t at Tl;A<X>-Ec;4-Ir?usIbo.qlDS<"[O:_Gc.);"cAR&JG-WESXlDt_:9BZq-TSm3;e`U%nnb">\.:H,8"fq?>EG9YTX[jGl37F/n9%S,UOSk/KO/QBbgC(B8KDpTl;jEAiPi"_'0(`MdrQ-`>Oi<%jl63.A-NjFA7VRSBl`T5n1m'7E9<sZ.7_EA#tFiaI=_h`Bh$8jq9`\/AaS8QuXX?P<fF1#1_<i^^`=6lB8LRMYtl\7-.D+LeF7%cgbEB2rQ30<:U1/uCS/Mp,D3<O_W6BmlX$mj6D'!tTX+7]=[:?*@7"h?Q+#&KO#ejb-o5C>F3)6\V<LDB-;Ir*^4rXU60'8sXd#^g4>gDpNHHNQ[,f^K$#$^3;[E#`p/746OW_)t92fOAhJ6bBp.Y_&&d:=ID6%(RS[!GTm at fsquF@F4m?,:E<,.[F@;lt-+(ao_PAcr%^F]@JuO5!Gd'DbrD[gS2/nRM*N\B;JUW'ps+7TeQU+j-$*KI5Pa2?!7`umTY)-TXg,W=Lh[q50u?*[^jMe$o at KiZp0U$dH?@5jC/'_!%+g#gO55#egeQp$PQM)SmN71Cegn`V=>=e45J at hNk)4@=*KJV="&bSIn[r(2r<\ok#b(V.`Ek&4]"31/3Wbp8MgI(j>$,8q5iiOmA1l`kp%0S*#t]9A8SG0\-Qto6K`7O7Z-0%H*aepd.if3"FX=:;0`b_L2/$[0Sk.!UY.?!YZRVG\db?%<9dtDAhes*lMj15 at 0dBi.sVXBWO%G7T/+'u<-0`U<hdth=Gio(6\e=fX4i*VZQ;1D?adYN186CPDi.O0S:(A6p?ourLR\:<D)IiB<pGLE1f[<k(;%2nmlkX&s5R/RYD>uEliuJr`EF at ae5T1V$VitTe:aLX./TE=(BC.`b3VP*R;2]<KlaVirZI$!T`5!g7K@*~>
+endstream
+endobj
+323 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 322 0 R
+/Annots 324 0 R
+>>
+endobj
+324 0 obj
+[
+325 0 R
+]
+endobj
+325 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 313.816 709.0 392.416 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+326 0 obj
+<< /Length 3428 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau/[?#Sc5nNFY(DqP:6Y!/ef1_$[E]qE&o?Af$T6amT59ulVBP#%h3jF2MI+sd^J>4E=U(0PUrjD_gmS/LUIkF4,#aXR]iY^50`"KRlYE#$1'E0WkBbCYP'g$8CCqU_X0HsYW_;:<eho]J@;H<f!4r6!0B)fT.C#%.__RHthK;7's5,$oP+^s0J/fCH]h`MP.G=pVn5252PI:CPM&nNH21H')lnG2Llk at u]DF;kJ:Z"`H[Is'@kgA1K4U_F\1^LUulPdO68I;&$QL(nk'lbh;N'aVlKl$Z#VU&H:LR>?A;^7^XVX'mjTMTftQ6C)[@3:S$RQrFWC#1(_`/#l`dYopNSck!L#:^oQ+-Y;Xj;dO)0_mcDe7,"n2`^q#Ju-=n3OeGc<F`P)PfQ8ca4chKG=4OoF%Pr,F</MO-YdmNiEWa.'R(PA^]B"Y7HS`i(EV*R$;f1n1#a=GqMib2MO:os5fL_c232Ecc(#Y=CgTUBsVps,PBd&0CO_njc2D+0*q%`(-2'."jP9>FcBp62NAlHU.b/K4j`CMUj$=!ulmPuY6:]sWPa06'2?AJC/lA,Lu^'7XN4;i*ks[db3Qb-F3H,?lZ,i`nFWTEp1F%=a!D.J`C<Zh`^^QiaG8EfcDGdGFlR'2O60E9cCF_NO<NjG4i]3W,*U)(>n]#VC:_F^;F\5/(jBpCFI/&`E5@%50_Wh;];@rK8E2-,th(]AWYh_PjF.j3u==Rm$a)#oTps6l)[V0b^">A7Y.5:Lc(gMcPQMM=UJZ&;1u=5,fJhSP'MQ$#/iR3t!sOBd0/DF\`B;MGu,+lSL\oc-B`U(s/42h. at Jt#fF0=aBGEL8tM26?]Af&ohhh*^C;Plj1^#kVRmMlNh8</=39p'dJ?&l9*;4;1o!4*@h$9eg5D<#)1q)+i7i-r^pMA]I,O#oX:V+XkbjJr`h;S/@[iPL]Jh.]A#"r02]o!N&`;qFL6;Om"SdGK,f:G,F`_O<c<M'\/fTiZ-B+Z:f=-Qq"'jMuarA*sBk19CaHUjV at 0AMsiFYFq3Q\(*AqQ9r%E^H(rKBg&1nq.CmA>-,iFD71`7hZV$7:,?]QcQu3$`2MgCiiElCr%R,UW"n05??WrKC#K"(b!0]dl^)+mg5o]h3Ja)b6A59<UdJd'3A]qd:LXBkgRn=Ge>#3h(W2^2gD:+b?unIVCGRcK=0#n-ut=0-kPEYj)(*C#:b<c1dd9(166Br3.0Y/OY[V">`RC5=HLuQ:nRM/PY8=2ZNVu'*hUqAg,8?Hb.<%(N-RLUoD$9(N?>"q`_$(4]k,.=h9c*U-\2MBbD8VjZ>j8d<s;_*X=`TWIs3q4$8HhH[a^dY.2Ir85.IQ?E#2'T^L9lX!%i8$6]pR)Q9g]G6@@od7Qes\_+D%&a=GVX"D2eX'RHs1epkM<cZ4,)KDh+,mBf][5sK9;[af]O$`q'!ZNt=`uCsW&ZP4$s)S:]7;gVP`/:=Aj?X>Fl>5uLBd3lI&?I-F#USTj<sZEVlJi*W7mFl#Y;U'Aimt`B_uHAOKW+b<f1'TsR8HuEgX]g%q9Z+X#mk?uQUQ)\eUO/nqA1P,RSE1JH1W.nH*6U.&?dphKA[2S[YK(qfo.)Q?[F\0W8"ELK;n9BfaN`"jjP)G&lWPK<ImAp$^)qFo[#bffpj#r5B2h<jIV\2n&m=[^U7I*%eK'X at 7FAp\JjdtU%o[%E&ib,+I8kRX06Cs%)Q]m/_rA86\l;ZFJ[@dXoW1W[+Se%2G4+tb-_iXgir<Q.[T0@\N[t at K7nn7YnnkDKQO;YoW[C0WbnHFYrSc!_4_X7L6 at MLgFW41e.[PRQT;eZ\g8UnDQfFD]i;eCa_]e=JYOcN at b8BDP'LP.%&1fXWo;,N7`J9&6&jXqaR*=e.\BTG)/F9+p1_tL(S(`=L_1=9M8?4SOTtU8SN#J(<9ftH;O3EcZk*JXe"lIYd7HVPAE+G.gsG:i0Y40NQr_NRgd!GjK9'D2ZK)u[0MOp(]Y<kMQQ*lJQ)Z:_==u'/Y4?`d>-:aCL$RHt9fdgKX0ak[7t$ULZ:-W:NK`(,Y`eE<;F<i^GJ4#;$_o5U1GDC8:IhP<UnGW]bN2WXJB45p2N8l#l.+!$1]kQ<dUVWR,7_"911V5C3nq4sq,Xs:2!upUU$`Kj?$@d;Q:]q^s1C7'Fl@(#<39\mXtKB2Bf^>d/bs5/p?4`VAQ7,EWd<`MV5SigKFOd1/r&.!"g<o\r;%V;TWpX%)*%b5nX)5W_dWZLf4%S/Pk<GB7"[KF]c/Cj5_pl$2^i"4<kODTYZGJoL9&ocKDA:p.Xh(>S>_/iV9=hka1l^e:K`duqPeuCEp7LI#trhj\:-]2Y[?S9nOD[i70VJF^9K5S#6Qhg<Ep.qeYZCh:CdH&^P]V/qZ!n2K!%LAmUdosM$'\9A"-hQ355;ck>*32Ep<D5TB94%Ihp_dEGmTL?R5MF0rXTIq^6g/D3MQX<kr%F2rPBRKHY$dPpMm0j6a8e)dMQ.(:5Ju44!5fc>$EOoFC;f!1-H^H/[2I>qlJ,6>+tg'L;_QX(0Mn?h#:pBUPbpAcICJ at ODp122W#7\h)BrFQsL8,b"R;,G`:_)\aeq".1?.s4D;V8$O9C[e?uIR"G(\Y%)+[&AF;6a at kG\&ot4b`bFVr4"OF?]<Ib_g\a$a7:;A4^:079Ke_(1EIThU!br!-7bpT;X"6l&H./]]U]U9-cq^NiY!mk]_DsJNNS597.:q at 1]a]u$Hagg=7Nl+dru!Q&n#:gHa!12=HE2\(_R275SKWQn]^Z3^0Ir(lV`$"N&HqFHC=u?AVL,n!OqQE?`_Mu=\<P%o4X"b\%2%=K0ZZ!3dX6U$U"W)MqBH:<g\B&V+fr.b_m+;k7h;N/D8iAo(tJ`.0J\(Q at 0t8U7ifd\FdV=2<"FE>XMWQK&anuV;@LnJLHfSM4BCL85$;f?gC"]R06Z&$"&=FDnh&RF$pZsRNTCbJSo?>8<f5:`_M9j.KPD\Q5=.V2'N5;;.cFKH3r/=CF;R<kT4Z at V@Lel2YD33hI-_dPAqj>eYAr:ZL[f;qWR3AY),H<EZSeLX'IVIe&o.;86=Q$P0#nCb at D^t05Sj#3#F)g>:\`B>>@X>H8RqT[]J$)-pJ;-hjY-u3<'I!LfLNHhR*6EfUr'bF&!]&Afc]]6,IE;Z#'W80%,>=dh4]9YERqXY/99Y\;1I7dD!XA,h69c\J%T[FS]ta5dI>pb7:E:Y\A9]s1Jnq\"'Uq3fm+[?(=Lb^J7LIB[MRJ;GkIFf..VNeJ9Gh6)Zq'hC;9[lOW=FABeYie(I"%i5%DNNHnHO91'gmp?bdom8<iu<1.JnuT5T0!4r.-?M,K.(:r`7%*l47K212gHq:j.)cd'"qe9mDOX^V+`;K,q6h9=EID]Gq6&nf[G9Bd:3VQ"\Z-;mIq73;;W5?K3dTpc3))FFH-i/0\-~>
+endstream
+endobj
+327 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 326 0 R
+/Annots 328 0 R
+>>
+endobj
+328 0 obj
+[
+329 0 R
+]
+endobj
+329 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.914 208.596 105.454 198.596 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 330 0 R
+/H /I
+>>
+endobj
+331 0 obj
+<< /Length 3233 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%&D/\2f')q<+Z1++B!*bSmg:*fCK@;)_$="'roA+i9'a7[^ob,j!QB^`PJ,N67+_RUIm5bFQc6I?hS08saaaJYcnb1F at QDI/6]A6hiZb)-3QJ0)i[`U219(O<4c#2k#f/N`Qo>P'K^Wp_HZ#,f#NN^*':$SdV<'/cTU'e"<nQ*hU(0Z,uXfgj?4=Ol\p/6"GQA,sE,nl7%CUk[_Bfcs=QIXdZA]_Z'HW@=o8)<V0ZK(nfb+bmKP&>Lr.[Fp]jR9cu8pSBl363I/2(-kpRcIYB8Ec%$kD^Lj8qY#XGHj`j<gfnSZr\!/>"q=2oUUYt!q:GJ%BCJ-7(l)nWkBlNVqQm`S[&aU9M=,>-^%HHb<2q@&]Q[OkiV4^ZhXU[!6KPudr!&b(K"6c2SiC)>9Bt?oQNZtHne=62ig9aWjs at IOq4iB;6d]L,>"!S7")-Rd-dkaQp,XGSQ!0fmKgaMW(D(2o5tncQaXFG4*$Iip4a,`+=PS<!<C[RILKunj:HSJrL15?aKX5Tqp5c;>\4(5335Xa%Y-7lU>8Qk>f85i._(20 at D5hk$_2HDDPfTbSG<R*n/2SR8sIV4&XC_8e]/hM^"@'W;TR!BBhGM9:T:u0s02JkG;,@/De7H_-7");io at ino=(Z^Z=S"'YEK<Rh\Vd$X8&7;[km%mmR/uBl$7_bXGYBi'Bepqi&J2`YhU65qf8m/*D)jo$`*(7H"bu2GpeZYYotb8dL3k"80K*)R+3T=1B\G.!A&t2pa?:T<$#X*qpZRXQ#i3FgB[(+(;e%2*df>XG63]Sac^f^-d]$U7+bKJ!MZpkZ""'NbE[E!T?unJ'T`MT#:g(bPHUBViPuE+2QSZgg6ED^KnkSoA`]]6?!ItX$PC]:-l9]Jk3`=@0d5J=@k&0l at lf2<2aTJpPQWMGa%k1M%p7B_a`!IOHEi1;!Hf;1lQJKsdFkc7E+]3F2ndHn:98fiFA.8NfMGa$DjcVX2>>n)8(AWiea^1N:`dW2jnH$^()iMQ@^h-L/Kkha`'Gm*S5DS\=XKW_W08=MI?*FH4[UIig876t[Zhh$G%t2idleFZ02GqFH`[3Q9DK4Z'cTb+rn\PPETbeV#EaX`O<b-5<AgddT8[<,?iaZ)b&.YR-3-/ab0I4A<hj)19/h at 6*_b3OlGUBshkG9']N3-GDp3%Rek@;$DIa#&Y5V0ZaQSXkX=4bPCmT'tA=]T3504Y)n[D:HAfU>\\/N8&a at ldfj:s5?a3_YKGG5:H4KA!,;.OL3W?E?,&-=f1SH$)]Yu&sabn+[q85UEPrOcP/p.T<[-n at p-K\i`SEWf$Y9rIAp@>ob24%c1aK)i;JeoPVcg at B&!L_%Yb]@\KVertZlHr*FFGj"3gDrLJA^eWSu`u34%]!(I$+PYaPVsg7O2K2*i9\'Rs2Gj,8bD2/Is8CDR1TPVc3i2i!cStn#mDj^(q=OK\hgQW\5=m8`YR6l@'oP:P=M4XKZ#0+'.=?#S45]0)en1ApES:X<*+^KS![/j6=o=+7JL-o;Jk(+gL0`<kgq/E;G1-3V.#"7kDOr^>,Z4c9;%*9pd8%.!eCNbCm]bYCC_b4H7<&2H\S at P<Wt,7AE2Wb&:si#gdC];iJ[!-[6l2VoQkGncm7?fIc<1AcI;l\(b+CJXG6W%T_3*uW19<+>)NuD]V"1=>qVh_5X=iqreN>hCVL<FY?Y;_>S4'dWq3=<%)9f$4.,u^AY[5d`<S3F)ZVC!'6GD;Q)-t28ZhOP4r/HH8]!t1`Y"qjG\6%BHXg(d$PIkI^)KFjoVg6G*i#/o'KVf1qd-GHsf.CWM4RMt#TJFq9AQ_s/qb]aWY]H9H^4mMNICf[4ddBrnMpuG3^Hdd29m0,\B"Yg47U?+O72CCb#7qWNMou2*d<BGE]ik3\!7l)2Wo$,'4 at 8-`%t.eg_<Jd]0qg7->$[1(MmHh'J9`>2GOc%]9/j[_Fq=$11*fL.)uIrgMZqN#>I8=-qob5Q)"uHI#b3%U&7!DDdH+1)0hGp^/t?QS"`bO!gX?P16;4n42t!_$>"Q!jQ]\)HSN(WK"C\%0a>`G;7(4=EL4*q"J&4_TB at T*"QXO&#(j?#_8uXm7D\G[@/R`U.8hrGfW=JZs*5.c-'d"F(]c*Yp%M>FH,p1E;0K;5T;u=?(WK/fHUGeC%*Qqt^odERoh<^;5.q3fr>di?-7ZM>l)r3qY('kJF%o2b-RkJ-8..[5PQ/bM2Qktu4hI="GK3:TWCUsq0ZCiC`i?cc)CNf$%o-DmH+`Z$1=Ku<B3\Bm%c"gi3D=B-n4toF0g9AeJ(b^cQ62i'CHu;4mCh;D;aHW,0dk0+H1kiOd1K4iu=om5i]6H2[!,G9i7uW^o_gR?37if<3!5)lST>;9?/eQ(l6A9GN&RT at r%9(M=HdAhb*/ldREHJn^Tm1IAkEO`skX61TR_N`;YklM6:fXL+QPN'!VS(nQJa4*;1"VO]H9"$3Pjg&bb.g&9oAM\sm8%6AF4+#p1.M3c492./pmN:`QoJWh'-eiI at eN+g4/?jHgTg[TiLYrnQTlUf^:Po=bH"b/ZPDS4gYSJ2/XM0\$l$qDk7btO0,-&Eoa/a4.4U.Xo-sa"W8[R_6rCdA(eD9Iq2R>0j!Vp*=[p>iJ:$gsigRJHgYX"W_2ETr*[b+S3r45k/N/QlHh73_U4=UMe\&<MJ"%\iJT0c^jn<q8JTVNSj#+6a+C1`XVWJZI%n0tu;K5.'@n:CK5#sg/,NjL`^uAZa18V[rf*\/67PA5RG\GV[lC`b"V"8B!#+e'W2I-W1E&Z_<,a7>j=-3op5<MWK`m)^D==0m3qF>:B4ku*2A,60n$r7K70u5#tC(Q-'#d/QQg]#8N!-(:BT7?b`!.b(=`!Mr*ciP]F);0it[/iO\BX9HTd-,qoY-<`VCigduri\OO"9c%dT6(7,?E4q\%LiFNA's3:D?,djK1lN$!0KpX`ZI[FAk)81Jdg%jC,T/X[BZ,/rq%=\OPc'VGE<Ig>WVE9HsPgVA at YrcmttE#s6LeBp[#M2Q53&\Y'C-)(7+Gg%nQhJc&(cr&s89$K>dEG^-Ym]&ML[\fYd#1oiRERp/GqjE-3^:_X4VeLD]%O5ue<iq`F.tLW^k.K at JUmhor+/p<NS\Hh"`F'c-`DWj%8k=g8qZaOHN_SF&!/H1ClWnft8g*_&>,Yob<$[T[91j#8'U4c<><>$FXd?'TG0%GF70YR/t[=W?L;2E[,T6k!o\E`2OZPXo(&~>
+endstream
+endobj
+332 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 331 0 R
+/Annots 333 0 R
+>>
+endobj
+333 0 obj
+[
+334 0 R
+336 0 R
+]
+endobj
+334 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 365.736 581.0 411.006 571.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 335 0 R
+/H /I
+>>
+endobj
+336 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 365.13 327.28 419.85 317.28 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 337 0 R
+/H /I
+>>
+endobj
+338 0 obj
+<< /Length 2611 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatTJ9lo@'m[ddZaX'O!dHXs,hKHNeRJ,-*4hK2-p-;h]_RG],MGh+dpC at lc!L..CDr16jJ0OMT!/*T)DVff%*T(p$B33l5cI7dAGjt<q/-T5B"g4IY]?9sH^6(:V48%Mo#4_3]]ds^YaJt at pF<!jUB3jD8Z9ctG1BdHc.!%eG<]7VX:.S6pF!$p%SDA+iFD1^_8`n at II1(YZI.QcI12CE76bgrm_s<iELXWmd^9B-Xk$>U^;8I,5`m4Mj.slk_F(gr451,<PO<DUKL1&'U-f-$'nq+>i'R,]5opOEfonqpcO),CGD(FnLFYO3SMMZX._hJ`ZXSChm;qcuR(?:3Q`ekHC-mWK;(03GP%n7=;Sr6 at bR[$E2gFn1KM\9R,.%doHZH2^0HiAXt:!#=bZ+[)M1o`EeQ)-Seg.?rta7P?F9@'\,X;(Pt[H-N^9?r3IXKQI<k`S:Ij[Y\jb^J.Vm>_`Fr.PdlY^4i-IQAF,2,,M0CbRkc$U'"/q,*A&@\p$<,;r`C^`PH?Msf#B<\!p2dmg/Cr+EnXU,_BsT at V,H$=V,UL,K8*,UAM7DA1!6$]3M).kAI]cS)OFUg>dVQcs&!N\]9_p?dE<aKlsh'4IEN(t3,3G7$EQA`uR`\H(J<\V_u:bE=E5qB3Rm*PH7>@0a:K_aV8+KEG%59e:#Q9^sV>3:nsbhHE"<$g>mj6H>/BLi1[2!NC[d\#_=jS#5U39-E"SnO(E%'?h7]ct<Nd.J9eeTTt8Ds&d,q,"=RcB/sOVk3R=sYf!<EpPa:KSm*tlgaoeNRb;#UVB<D. at TV<NZtAWkIZk0`aP^q8<uE2H(d1K8<AFe.hI#5!3[*4SDA(]E-f2`$L at FROiL3bWjZS3*k2uL"=O.]0Ip2l`lWUR^]*htpH[%,u,)Em>P5iF&]\LoG[Zo"_.n7\DSiDc1k_?H6b2a.Pp7&rKMnp@@J4;"iT6r5j5e1R5H16i:6")?,2[FL/gF1HR5#,DAE'IhsEpg]H<j8jhI)W6Sib!X)lj?6nUp&;3M`u$2'V4&:r9[es.0$3Omg$U&,^hs9bRd`@q9`nR'>BBn0\6&(_cED28VNFu1<e@):Z'8$ElX8IM0+i=A_Tbs.U:B'jID_V$qgM&_2/"+9nks"@6$0KeaDX92Dm36js%;s2(57ISRd4/eolZf=\\V<F%X^l6+`m[7.Fm1SfB3!2<m=:\gHa?"jTf\htKoB:n0It[J%p^>=!^i[:d1T[\Xe6/I+H6=Se`@%IVNPMs0%(IZ^JN:CIPeSOS#9HM\Lk)aobb/k<#*S7&3E)W;#1o[KDq7I;^[M=++^`i,OIQ\L053IP3IVE%]_8;CaOH0g,q[erO:dUURp#br8)GX0Jb*9nir8,]3)m)<^m)g6btd).5%S(,s?*;L7V%WR-eN_dR#X<2"0^EO)O"MUQH,pmp"l^(PMp4^M`r%lMM"t_iS]\-*Wd]E.b at 2=sK#*#l_?C@:!\(fkr9,g+d"jZDFc6auC/NuM3#Z9*u(5e-gZh*!T!>O2L?,n*W%N3<p^]&@)ef!5.=1m8Q:(sTfA163O[\IZRX/0>brl*bG272nk\Iik-=HC;J7sjuqDYN<$9&$\(G/dkjpXVe*X+&Ag>qr,Xde<>C_Fi72nF=t/dM2WNC at r"1aGi at 3(&q$`-?B3)Gp-q*e[SpP_n^K61t6/4_hBA'm)<cT-PT+ at g'sht5TV^\5b].a#[L;h/f&]Ts+Lj8ko;r7d>=@6@`m)@l%\4d]4<tY"[Z at 0e?s6ire4aS]<9MBZM at CAC#ao7)_Kf+i3V)up03ZC#c6uXgWh-t,mcq-]7([Be&7%FoZdel3#\BdFKA!j=5SO:i43i>X)pPqHW/up?Jq\bq^<+"kCN^::pZl:nt%N<X&=iarMs+C7?DDLR6T?F2d:`>LZ^Jj'+T-ZC&-,oAq%Rs<!ejp/O"<UFeigW1d(E(^,f5!<A;]p_14$1C[qFF,EmedcagWq_1'+[Bec0s(t(O-4MM+Yc*6n\_c6C?eVXi/<a;T%f.-U5o at G'E!MiaLag=?`Q8K[bcC(,-fB\jYLI^hlN:_+>63?JkR)HiEDLptr!B,3o!F(JJmE<J(\lh=HR-pM]&ghTb1_Er[^B;Q7XHs1Ugd7F]kkK<N`*pJ_<dP+OWKeb<M?Rn;=+l78FR=e.92YJFeLnY`&iB,@'+Vq,%Aq1_KG4\&*OI5?X,o.qV&G!,"<oo,)FPub\l4SE"<.Y1AZ=.\+WX]iRo/4HCs7NIqG8B;qPIu/F2rA^Z"6O14IDsY`RYE^T>kQT;Wr>T2BFsJAf?/5>j!^KMp=cPY>Kb$*+c=Gn/AE?8(LA_H at F]n4]sMKqK4fq?o$s4;'OiU!ZQShZ.65W?NH.XW)f-q^)RVu6REB`nisgnqG>aG[@%D#^"'+MfFOFVY)V!0?m,5Qj<f=t<f:$KBt'R96rlL"GZYoEh7d7PFZn,h,<(Q+l[P@;e:mqOXAgE(*tfT^@^8-BC/S02O?+JX.9XC;%DlYg?ZnC.NrP-"U8?6k%u>u9VZYb6drM at rq;^VtcIO+tn=QRR/Lq#QqJ"rM_h:f*nnLb,c2[B<TBUbS69p3W=(N6JIINad*/8O0$rMfcr>4(+5G.~>
+endstream
+endobj
+339 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 338 0 R
+>>
+endobj
+340 0 obj
+<< /Length 1693 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<95iQE&AJ$C(qj_efTN22Pq@#)\cLO&!k[s(.2K9Y=`!bM8NF&6rqIccarJR2irp2!%.Q4Qk*m/7+4`7B. at h^0n`K.Hk0:@k2#"p1RO>h:Mc8M97ItXbs)LU>jF4h%4h:<i,ZWC[iPT3Fa`]c3lMI`$.o*[rA!&pecOP`)_H[#LbULT%MC`s'D7YUD^3mo$U!6U[rV_3EFh[i+!(SEP-J6sp63VO<9!EcoTB+%i_Zr?E'lW'0C0s!R9jS+CQ(HX5G"5Y)$.qWbrS><%ZF7kh8)%XLkDGSi!BK(a=-89%2X(B^!oH;[s%.X^+9,S!:);Jo_?(Hh^-D/uG;QW\*R%C?po?2i;&VHg5B;b:Q?6$B,]V6<Kn>nd1`\.r at GI6j9l>n-.0q.m-E1!H`caBena!)dHD at dcl+/B/JjRci6;nF!-J`a+"/>o.&^oDDfGK6X4VC7\>]i0Oh_]Zo+t$)!]KuCWk1V`:8,`B;?1T#WbT4IjV`N_nRTS/L.RMEcID/bg:UEQqKI+;D.9O at a",*1"Z.cKnIufgXY.Si3G8Hnj!!ZVS at C8Y^Dn?YQZGTs^'nUf\853trm;J0Iq+_VP.2E,+OV*J`)NRoW.=+q>`V^O0r9',-f-U(V/]2^j5o)LSH>O,hQ;jXq&]O.rYQ6fhnoid7T.k@@3(KpgNm(*]J2GtmhiG]!KMECd)Ai[grdMT!@&5[Om*!Gd:t*MG;lPiZi=KDaPtJnhM\YC9o=\X66l=sI,0HQN8m=t&#L"o*Kc-ZuQC)L77%+855N>qY*b<76;-dn?1q???!kR"Y#k-$<I84ZY5$4WtQ,h6G[egF.T*2oZg.V''q$d=W2nZ9d:q6n7m*Z4cQ)JLPOI#Ua++?#_@*^UL9\!`W<cbnDnHoD(06n9mWDoc?XJQHS;sKK!$lBl=(W30u=M8h+"P02J8[@f23;C'GL3"K#(Ace,O(rPTe:NDC81$tWfK56UN6$S at N\:CF-9#HmFqcg2?q#G#0UAtO at 5LS5US\EgQ5r5A])-#`@fZg]_%k0;ds*Q%5u"g7=PLLe<X\h-5%k/Q^%Ka>_jAgbVoLq`l<=MgR./.,AKaXXah4m;<HR8=e=-ufX7KP<k^fIH($c1oa1CDNg6Qr#<si#o]V.#A(TeA9WMIFAmqfK.C#T8jL##Xk*Ht`11RgP0EjoNX#`T[58(ZR*`X)Wo/!nDRZV+i?:PmndIN7[_fAD#3A,&s2]I?_EKV<\\lu?e4(.'HdA at dB#op$F!'4J']lqEX'kk]]Jd)0dK%Rqq30;*B!=?LsQXJQ=KXjn]+If`M>]dkh8*9KsOG*Q*9?0)V7NGt/6:sWk'2[O*DDmnGiPC4/%"FBnEJq]o:Y[i]<m&!BiGrC`td#6-X=p6ha=c%oGR\hU^-XH+XKW(/S$<%,g,\V"7oZWu<*Y6Y>1ahg(:L>FrEdHAragl#(RsJe!*Vn&7$[Wk3!0S!jfi/-]6.b_.mfjVo=&)USk2[n*g-t#q`+t2=B/a;4Du/=l):Dc0A2Y[JbdJk6dLL_WaVV<_N;V<A/eZFW+ at iP_[H],C]OWQDf?YD,afp5!hU8,@%s21q8p2lHO7hj0s6loc=<a3n8G"hkna2/d7cq\VYM"]=.6Ru=%S?ra*uQ],X\f]UH2-ePl*.+6+RMG&osWhL"[j=k_,UnpLE+tr4/'M&L0Ds=Ce(q@~>
+endstream
+endobj
+341 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 340 0 R
+>>
+endobj
+342 0 obj
+<< /Length 3382 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%&>Hcek&UlsZ_J_F8]S^j:AZ(Fi)J#%D*u]6:?ls^k5g,Bd7$b3SFO"lUI4<H<1Sj-.9n7ccRH.U4S-tSmqhKBfG)LS[XVUg)@C8'X`/BoV)_^2-0jq^fU-)cK08k<Cb#eC^n^D)-:4=a_9<0Pq&b>qpa/EZU67[3*mu#;n;RLoHF49jJUAcB`e^V at t<YTBA^V!kMHa3UqaL7[NF)pB;=<$jM[Ka!CR\;d2[E1IieiWKDn/$_C51H2,i)t6WYkGo1S2ftT360c5b-rF1eE/jP-HRT,FrP at b0gmD#lS at B-#*FHhA^gI*[8jH>Dg_Bm-u4M6(2g2Th;tsO&67$.n?.&BCh$]rna/,Xa^#![]0&[uhlOiHMP1iAb45'6IhPU6Q*ql?Y;m!u*PmmlW]q09h2P6D>YF9]b%!8bRP'b'Pc(!Tk=ah`NHZM\B3EDQoM)6]L%uq<k'V>?ERc/*X&XTEOdiOuEO<V0HZWXGWiD'>QTuF+MuLpL/W9L)/+lV;=15JE-=o</Tg+E at 1(0#/&Jq8o.?6luB^X6uq2/,h3M]4fD2_\9a)FoA^)MsdLP8N1K_8H%oV+Fh?kJtk6V[t.RmCoC['K"_e372^c,E1p1N\?#9-7.7;\eZJaZg$\=]9<[6a]!im.jqXO0Y&D;:`]Dd&@[qTI.0(B6P-ilq+:&dn-3,PC+%?X48\>2I61;b?5SC!)chY,GNVGO/TXgL8,0S=]a)Rf3m\`=O[e&j<Jmi3;ZY'RDZf70]$aMXOZ^oo)o?.o.84,B6gYW%[ZIT;hso<B<7_B-gRC9-g*. at 3CWu)VlMcq[2J8)\B)5t'nPND'XI*4:_\gG1Kc8ide22OEH4A3#Dk"hq<K6aq5'mlZ'oA!:`8`QK_AZ5]"roMFMjEV3:>?T%9"$O%T at JTJnQ<9coTK at cf9_ga6n,FTpEAFb06!dRn7Hs[mP)[Hkg5\b%LiUNW*`C5ssR_KN6]bLOO-a,p=n1iC;'\&k1b1,4ICZWImm].*b`:MDcbV'EF*[k-6d4eS*/C[m.<\f#jN"qcOT8emq*_n8o\1+hR!QBd0&#md>Nd6gt9eI0^.$%%mr)qcbf_Ero0JE0_CT)+&d9!:7fr<$:;'\?qO']+DO:kCTt:HC+h]e)(n^;lc*Hbo&(eAWsr$k%(fV[OuAS(&AVq&<;Q1'ueYVV2o'I-:"2/'ht(#b&OXs3<P6]MB7eMa`.f&BlOFjG"J&<q?QmW2^H<^M_C5T)K(;XVa!"DA^l/BYdB[8GGFs2H#1so4@[Mu,"`i9C5cga0"^,kp]I#Ff:ti](f%C at h3-+u^Va0r9a?B2:"F`=4.A[E9eqS&fbHfX\Utar@#2&u#RJ=%SsVn<"!Co8+G+E_>I<E?%.4*]R)TRR)LHVaNF5`Ah9*a7SUA]YCFbgcmcr-DV/*i9[GRFQDc[fgWE6&2M.S"5`$H<T5ie\e>GQQ1\GZ[;)\R""N?/1!N8VV(Vn8Z!?I+qW8X-;t:K9IML`Ok at rlp,#bqAUr^a.0h#Ibklo]O%)?G?YicQ#YKh#o7;W,8N&(Z*9QVT7KKZr^CHfPIgVr26X9/dVnQ;rat>C^QC?h21u439OFQiBbiT[O]#>iha7eZsMc#bHCuim*3\bJ4mbP>_fSB3J9ZNJR`nP*,R<_AgB at -gQmgBOWo?:J4X\qc]ZDspVuno0CS9Zb0lYWF&n52D-Nu+*)rd2lb&Oc0K6?m`FLpj#\h!to4_\EHZ^NQL&JR0XGNM/jfuFeY?+V#W_[u^j.8!.pmq8n`!"b88fJI>p^^=#7$-AQDfIK$TUX*FM^`keCME@#(0ppPjHp(0%09d1 at IopQAlGj#54g:/j!EQD6'sr^etd"T-KSs$=pDWFmMUYJSLJ**@.fi/YC9r&IL=TN==X:/D'G>`YaujI4Hf#HE_T7m0PQ\hkP3bcKg=Q5.'@Uu<re2=.<ed!G8=#P;IE<a]/h`$>(Xirf8,>r9E&)UP3n^&Ri2T;3b=C6RC*TW8=@"4@'W'6k$#VSi_"mg#`54@!sGFA%/-of/j%1(D)uU73kCd at L3Z2Fe)OdcP:"*&10<>VkF3aCa<6&/S]1m<rdZo<jquWpG(,.%m(R+"3H1m<9 at bQ^qr<VGZWWN]L#(9r"E["@?;MdjfM$VF5la'l&uFkM>A'CaQ7.,6]O at aUdU_.k;$[HZ$ka1t1%7Ve]p4C4C7Yck`bH#U]MgW[bS%4ZpH#cm76c88S8a;6*:QN_*3f,]$u/#$]p<`"A`Wm,+-ejHWKeV[nj^:7puCl_#\hU6j?L$1p;(&=S1!3m(WEj$"3m2qNQL8Pe_]I6kddr?'MNN at V=nV)d4B]JQ,0j(l3$(+CG`cn&:F&n38p(K-H*7:KVElAg=_8V3r at 8nUO<46D^I=YbPj^8Ak\`!g(F:*Pt)d'YuBJOLBI&<\GuEql[&\nZEt^V*:4%4&2CXkb/*L3dLp+IeAo*GKR&.U',"%tQV>bF/?Y=-\d[hF at XIfRL3g?LjD8t+XB9TNQdS:Z`61r4pt+D3;O^?H!.9<IZ$3+`4X'ql.Dr'h+8ZW>N<GX7;h7!1dogG*GdIlVBMfn^lN2\,<_*YWCq%E at GHAG7U6"smqg*=uD2RpE9!SmWr-bO0YT`l#]:[`?fQ!GVH#B*AH'g)^_l=R[VtcDtM>\)aMQQ4L[P_SL(pc^bj?^[U5t1tahJ6O.T5K[*9BtpWfq19SJ#eJf?Uh?i,i3DI^n-FO at HKgLEBP0Qb,Oo)P3Jr+&,d7egDV]$502sj3WT.^!&f8=EgrR:iSOV(-h]fC!Pue);g.RMqjA_ZIcG?b1`+Wjpo52mJe\*m<3MC&OFDNRHdg;bHEi=:PNCFqkf215XXmFs-"(J,/VUkf9LW6;.SMk+M0r_rM4u*3W5*is2;;*Ep75S2=g at 1p0-uVVT$B[!:_i\t+=>jVPPrkY9JjS-OI*CgEfH+&\:1#fm_F^WL7YK&<Sa*="iaZS,DEPd3hg'cWAda-qh@@U&dmMdDjS?h*Wki[mJLd%BW``_BB&ViW1&OKEQ:[@"FOW6h<3+PFfic36sZ7V.MZ!ll^Q\IKUjjf.O,T_'3UaCGeSG#>Os%u+dRce)L at DF&0)1=0kfLNYr`"A!<E#5fIClPPA<XHqO"&Cq;S%P#1+,P0+(#T5knd+D9M>R+ at bNskM)j""qMN:P1!S3!X?+G``"i$nu-ZX4N#VL+R[62MQM#noMQH;-`1F-qgp6 at 3L?SA9l%0`5!1p+4[EBW>Dk/7DHXlq[uLBge[>cec"g,Fo!i/efDWUZp4%kN<I&1KqaIsHR^&hW(S+fq&-$nLYkL*&a5ii0jrZZ^NfqHY-6<sfI[%O&;#Il#P?)msMeO*2Rh9*cG'r22 at JlY->*qc?6Q*0eD=h3./#9u~>
+endstream
+endobj
+343 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 342 0 R
+>>
+endobj
+344 0 obj
+<< /Length 2811 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5D3*_c&cTMZ_H<JP(3!6d=L+31G>/RWU'Oq5K755+JsL)>4djf^dVdiI?V3\#L9thW5dA+VcXV!-3#iE`eApa-5CG"?=dl.UkL2f03Bq&DeGa$KI;ZTDRO?d;o6fBloBDIeJ)#FDmjlRGZ*$GJ0R`)9+iK'DUp&ndUa!RP'=Kdu3c[%GQAE*Egh[S;&ikTY&YQAa./CaQ5`OaSord1K8MlGsa>94j2@[-QaM9.pLt2("c1>;DGO*5[hQpco-M8POXd/Rm)\Mk[WjAO_)>)PiMqmkuDO)?<+j"7lR3m\G:%QWYo0o%.M/fRAO*\kY/)>4d;W(HkB'ajJ.mQ.0-I#-H.iX/!A=@3QAA]X%?8#PRekF97`LIih'6,B3pYrs\9Xa((bIJ'&eqIYT#-O0?eN'F`X+0)7i>clr at kG94A([4IHr:kKb6K at TP:R)GCpJJP+6^k![PCVg<U&%V]GZ*9mZY6+G*B#!bLX8q(=6^=qTBh/"6/o5fbYN^s)8mdhsD07m1u5&Zq_O(2Pe6r`@]H3g`d at 5Bp0^'2j7U7D-W4:=\Vh/6q`3I?:8j#\7CV7MRR11FW.6E6GBC1M)?YJclP\$I:-DAl,\[O-Qs?FV7 at JU+[P,*YSnG5!PN2'OR6Bh2HjoRW%44P('td.%ad2q8dD5qR3;DYD;o"VOX#U'.F!Q*?fi?k#eR:A72cJ7?3`f83c\AEU4PGYELIE5Q;gp>Fi1A0eQM..3,:]OE.;uH$jjeC[&1HjmPA:q#e:qZRV)@F%"EbFQ$+PDnd6rCRo[3c6,Ge'gAd+DR$R0RNDu3E7 at f(4O1\nrJOli*XKHF"-W<F9UX?ZWDSn$X-4?u[6FnCWiK(H=_^/3+*(:['0fL%;f57=&GhW4.UN[8N*mrqY7Pe#"_20>eK=?P!ktuTaMrj"+jkkhl\Z9ZM?k;Yq,2#7C5AJKXKG82KcVH!WZ;C!$K)`inI5dJtKGCBr:I3%91Q_mPVD0.5,#d=#j0>g"?>LP<3jQo4>=^l^J+lVUH]hYU\$9r?RgPG`Q>gfYY5#^ZdJ&\QC&7gK8cWRr*&*42-tLedm6!PP3$1+:.G9m3*8=PN,EH[;7Pl.F2k*h1_pONFq?nK:<6jgmq8GkbGLG(r85&,2XX at .7ZLb"0g7Ho2g)qn at bBN/,>4n\?6ULZMN?-,Z8(*B#k'N$FU.-o.aVt:;*ab9M9Fb[B[OKZ,D>LTePPI2L-RmIM-i)/2%?p,/Otq+$e$>a#I-KTtf-)7Q%JMAq<F^6]otZke;N\4#dZsKK"q1hG0A9D+r[dkRbptmQJ+6,h-&g%WprA'u%gt,$6r8T>SQrW$L[%(-Sd,HP.H<SS11S7*dR[cue786T6M.B;>n)p%R at uG-<G,i6Z$CX-H5Kpf4VQn4T<WIVgpY\=IDp]L-X_J::BF_^E&ZEMSjX2rceL0pAO7[U&PIrccqrJid"F:u<=+g1"tGmA at g6<5K;#*9?b at 8dqS;d8]*QuoYBMGl3ke'82sHSZj#.&RF>`9Z>$ka.]b\#JB75P@;SsC!0JFIaYQF at H;*!IRq4tb7BrOE=jqFaOZJmEA+tKrUrBiCIo,!Qdahq"#q`1)H`[Z!eR at D9$c/\',G$gV!a1d)0NF6+i+_@^]eX(i]52aTY3j,X`q2Cn8NZ>N]Ff$Bl37ITHE&TbpO3(lW7n+^-QNY#S_\j/O4W?$$A8KrGnQ=O+VZ*d`q(q5Y(q['h#?((fp<PHnfqSUI+Wu^j^cmn]3ElNoJCu.<b.h]u at Zh"K8fQKe)KH*.!AJZFrR`>4$(dk9Z0dk7#mfZa]<SdZ;kekkZT at 7uCfXfP-T+#CUk1-+VK)V<%As7o#n[ATJNiWh at 5J^CO]6S75W]=GaJ)ZZ[KL>fAB-"K$E2F0.=oN9KF,6ZFf/68pkD*r43SLZ"gobO?C=qbK%.!0ZhLp\&i^=b#^kkJlg1n)hN5648IYZO_fmCk\,mP`ai4 at dO`u1u)"G9C),&`P@:Ydd&]]oql2793(bY`%#@LFZYILe^V)[835]<7\XWK4!!dE;O0nU^k[W<PTl;lT3GuHbRcNLn^5T:_"6g#<7pN3;=M.N5Y%Al&;<?_Vu=#6c((opTf;W:/:D,5PclF't1CtC[Lo=5JLVj"g at aG+Y(5.kpFV.YCM<]Sr7!oQ$#%/o>,8"KV743[>5;cTMk5?eje]^^/DfF(LR`^H++ at RdP[!(`d0G3L#t59sYYk&(f&/?-ej9LUl)g=l^+#L%Kk:lt"beU'$?euf[*jT5Qr.^WOc,Co*T/M40I"PRKXofd^^!X_;.]Ah<4F?@g,ZJi,Ype`Ir,ThHZ"/LFAou`V^3C%hM_CW?hAjifSM_KXIG5[7?eZ=*O-[2"keA($L5-Jh]*8G1WkMS-$]TW(<`5^Zspj93"q*%L_AHC5.Q2Y8dAn1G3Z*%J$&jf/L/^+u%7QRciQA5?g`,\)AV_bR=LtoHNO:.A#kUL-hQ:k)gqI+%!iL!<#pb\g)@cp!V^`*qaiG\G8JA,O<HH+7R)BItddR+>EqTEp\&E1s4kDb"5('k4B2 at d:bj$[1o0./U]^Yoo9`m]i',!ki?)kO]:OSJ/6D.uWOFHm?/k\1aPi1m,)^ji^r1#,"MXZ13B5fZSCAq/]&Wrrq\e#V'n>JEn=,JU?Cj<LDF+80`X"b-iM/0k6jVe#9Pin';Tk4DhZ?]m-bq+UFCbOW$cbJsPGq;LZ;i>Xt*n$8bEm&K;CC2-tADb^gmJ,&dYI2BB,o3_KGeEf"d/DF7Z2#-=Uq26;bNTPHi at Q,.5 at RRW1A_pWL'PTJ?[3dtJ_lc<lrr\*g^$u~>
+endstream
+endobj
+345 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 344 0 R
+/Annots 346 0 R
+>>
+endobj
+346 0 obj
+[
+347 0 R
+]
+endobj
+347 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 88.94 687.0 139.77 677.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://groups.yahoo.com/group/jamboost/message/1667)
+/S /URI >>
+/H /I
+>>
+endobj
+348 0 obj
+<< /Length 2355 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`U>Ar7S'RnB3&GkB#E#;l^><?Y7d1o<*@45`(%n/5"&nSD37$XM+qVR>H.Ig6#PIB[/jFubQ08JGq;L,sh\pYMWrWXZ?i,"<%f at aMVN[t,l-h`\g6qN91:$c[HkJQss:-Nlt(?OekF5t:q8eX.CSEj8D4iqR)I7II,=ku8c5!%GBl51>V6.?ud*ta7Kh'D9A]2^.9$N16aIZQVBHQiTppD3Jh:"PUd_h)!0N at PrUKdG_PFL\\#J[mo$RF]d:.e$:$qarBU3TFec at I-IgF8bh6$QI2*Bl/OKAlJob^J'T>Np"QKcM2?gWLfu7HQ^3A#n#d7ed<XeoU]_h%!%),0UK4[/4NVEl,:.J#;ZNJ.>C?\JN[/dck9*.qQu-"/J[ut,L+<`a@@]i7`)!MQa:PFb$>6!k-QNB\+FMsCC%[X11HV?L.Xa'44l7R=hfF/\.Qdu>W!gQ1"dmZ[S7T-aER<3j at c[uj:47Z1OK4"PVp_F00diF/%_>LI+u(,[U^7.D`)&P]j/3L(nk?DUr2V9FEmVGs+PoXdZ*XDMC#oF%mXrHg,)27TMH)_Wut5p3&2^,gWBA%+QZs4B8R9A!`tFaKDMXV6&l2=*Tjtc`O-$[-.*WIV>4C78GS9*!PeD.c2s=HO8ui/ZCcC]6eQQNi't^N`Q95iD!H#Val)MhI*H2,T[t29Es$$a?3qkE8PQ_;IMu'?COtk:O\EP8A7,J$ecO'M7[YAO2dfn2Mam`F_0H9)30Ot6iW7Xk\.BCUG*+O=0U1\/h at n0qkW*JI-'sQg=?kL$B9k,fDToW-V]GP(-:R.=\:hI61%a-h2&k$"7??%afJ at kLasQXEk^deY<^'X[Vgp8N[N/LX\4]OqBg1-3-Q11FVR3kOBmX5n$$Lm<Ba4-$SAQm>e:cqALRu&df6a'df5-M/dJ]<sf?iIMn4F_1pr's93aaC1A=-_E^V3l7<]AIcI_LR]s*q'g8dA.81spO!NUPEV@\!f<%gA^l5.(-Vo#)A6BppBslnYL*Fj2l/BS?b[fknUj9Wjef!?$o^j'AY?A\niB]G$smK\?&TD-(sn"#;%FB'a+c<$,jb#Q-8;BM>c5C0AT`q0btg1fka)J6CRHn1WqSCiGU]G)]pD[M0Q$Y$07]?&e36%<ET74/sJu;0i?[>4M)m1^+hTNnHab45dIF=Q4fM;*j+a0DU@$[^CH;6MrZ/n[O'VA]:iKMP^tmW"-,>\<J/=,c>sG91KD\/Jf:?QO;2[1:H?n4UY,E2N)irRH4rkpjKmHn]/1s^-O.hd>P2_jimTHDt(,tH)Z);]^!`T%1Dohj[T*Jht%%L=Z+VZq8inc$`h+KL"0Y1SuRojDCQd.k!+ISUP.n)TuBKu,Ffb[ci\KD<Ur#0p&,gbp_N9BQcW36/`1+*"LMcHT1I;_(#M^oB,0:h,afcNE\[5ZK;dZq#/GLZHR<mR$lJB48gX@&4E at Om5.!uRKhaL"m82s^O.0=G5rt+5!N1I=&%F1+.PMng<[iRR1"iVV%V+FhmAR)73E]Z,)mZ>^Q/@\RKsn:PkDULOFM#]8%cBIS*'(?TP>f;]m`qglmD(Vn91M0g4'03C#Z;OXmu8G1QnM7Y9$CuM'XrG^>0)&M7b/,1]n9,8JUR1_(Gme&OW-eOKJV9m[,Vscl-g<F+/i_LdZ5"3_h1ptmsWof&r!gb;3H1hPi$ID>Z"NM:U/:cEUl[Ip)g;nUpulE).BD9!eGM>V"djJGISPt[qc*1VG6NY)Rf>0nJSA2B-ko(B(aP2$;lp?DC,Y at EBE#na78_u-SOrt>N;'J-pa$d]@r2oc(gF+K,[[SC*i5&&Ba1#/>$jWI[)<H**<S:W3&CN[M5;uCUbFeDQ+a;P+R?od3i1e+*tNM7`8]@S7PuE4k4:2E<)?mB1!G!%=$=G-gFmgG756),!lI at 0Ct%d9)a<M8+Jq?g.$3P507<7R"3:a%>7CMkg*$_347\2\!f=Zq8%)V"1Mf!YA<:SO3)-'`qRUY8 at q!GR\$(Ldu_,)c<*pAlL?/.qCS/W9nA/HIDp;bn-oiH7oGYG.CE&mf34Sk:@S><oW%>BmLN\0X<uB(XfT$Qro2Ob,VbW__3qk_4mQVmpm8`R!l6?n.nO at u"/sGI`n1^YP=Zqrs"<"0lUG/5W55IenW[E/`<"+Q6#-N;:iMJ at Aj+U;<^ar]]tF)uF/id,R&I;_n at iEpp^!7)"R<4-_`3eS)*UQl$9OKTYI$E21X:O"Bd;7`*nY)K^5,pa&m8ACUZHnAbGWZJ^M^5=&-!hP<,=Z23h*):n6J'6`$qkG?bP=A(u*.*89[::3%i..f$I&8iKn007n+F34F1JpHLeO!5i_0T':Y!\"YmBr&-~>
+endstream
+endobj
+349 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 348 0 R
+/Annots 350 0 R
+>>
+endobj
+350 0 obj
+[
+351 0 R
+352 0 R
+]
+endobj
+351 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 515.032 138.711 543.352 128.711 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+352 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 127.711 100.33 117.711 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+353 0 obj
+<< /Length 2600 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=D/\Gm')nJ0 at 0DAQ#5,!ZojYJ`lXA7Xcn/Gnc2CI\Mh77oR#!#fUu]JglYe%HR\?h$h-T%nI"p^$1n7YDG'io(h. at 8oT"iq?=8q4Y.TlK8$Pr%Cd#uYr9B4"">l=G%PdOK8c/MIWGKX?[Eo.X;,N57RMr,<)Y9t=<Q+,E`%Y`,/Ja7g^mb9CEs5r/)O)KOGjnJ6$DSO&fJ)TnKZP1$@o*;(?qPQ=PG"Ku%kQRZBP<X%lc"9a\?<5[a1S9LR/)!/dr#bCRj`u>s0#f8_iF:nqlS.S+^_J=-]m.o\=7Qq]YL[K-ZhBUUicQJOSB7d.Z>bZ.Ou6=#kV%h?V:p"`mnna_ZiO5.J)`tHA-BE+WoF]cdYk-aWp6e:;A<bI<dKUe>:F^Th6s'1,>j(*BnWQ1/=HZ2i(?27Xq,?h)Zb[mS33=o*X#VHE`QnsQ8M)$*60G[,'[(]iLc,[g!$KB?>hqjNW)[Gg!.mrS=r&d96$JJaWM5[Y_'Q^+*d=K;%#-^QE8dbTb%s,IMC$-;(e)N&=0tDKRAgO27l=c562(;Tm5-ZF]p!6Oi*I[H?W(!ntZ(FZFrI^4&:O/,,a^pB-J.>:F2KOrA[tBlKd%L?3F#$f2 at 5u&5)+D*o_AYN_=($et\1<Y*Xqb`i\A1d9^j!IH9`pS/cS(OuY*eYlD$'ME08$KEUEs[MM<-P&r/B+V=U5XREf<7Y>-$)Dl_k<DDqRC$Gk[+`nR:T3,54I#/QtP%H7lPI(>^U_3!)DkIm!?t$he++K6BO#mUTYu=>eOC2mCNm77"g\OCWMOf.+`ejGUMkKW_jtr%k@&J^[4#_G7Z^b%D.R*UT0J^IdoGBroR;kZJEcXkX3"dFGClRs&"J/AuorbqQ/9o0"ZUiHgncNN46CRCU-Ns"]PnI%u\1p^m"iob+/25`WEGlLHC'l.aPA[]/#3aI2L29,\9'>Ot)sL;OYU:(V8Nm-t5/J-&0?3i:NP$t@>@TgConnG"MkN:k6Z4bOYjG-W=c#(f at s>hk="j%Rr5adD)t^,bab$H`o9q,ZOL0CG78$Rb,jCOnBBf:]n#P/<DCe"8Q_g6N@#/MQ7lot5Z>%Aq[.`-4jTUD^I,oWP7JoKqJNfKlgLh5&:g\$g'UkL)+N*ug^DcAm`5^?kJtZ9a.62$8X!Z##<Ld=:UPTm!X6HKY<Ck8<4=R@$3YZPPoYcnM;!1uZ)l^_DNeC"_P8+bfb_8ln6<Y0:/6t;AQtiqXU^e[MX at 7:#P!h*Q3FRH)!te\,5\5i.H7A7m`6'QYcPchHS(Jn-F/W,qTl:/9(^d1BbK6)Cp'<.-1^sDVP24tD&kE(n'^uc6jl2m_nT;%S%q0l!VFKM4H4CKX0JOKmZ$K?)#=@^7#aAsS`fTga2nUuu1;dW:fg%h5HTVQIkq/Y73+n&<jD.;`ef32(>&WKC.sfcD4ufi/P!L8hi.si4''5TC;[\clok#_Grkj<TD`4)Lk#k;=\TlGAeeZ`:<]VM!KLd&^,G`uO#miK<HHOoAcnD"\oM*FSK+l]-E.HL)L\!;;nA7B1RSkU#NoW"Hr0>2T?AUPI,k/C\.864F:]U_0,3+l!bfCu)3$P;HV",)S[Ap9nQ\:>-l3?YNJK9G\M%"K0k)HW@"'_6^c35\cEB1Y5i`*]J.bIn*bUeIDF$n$6/BQLEIECs&l8"5nQTn')`G#E0'N`OL"B at SE>$KBjQBjLb@%*46CgB!s;qZW,UNr8/+j)omHrrao$uub7BVE@!CE$D3qm(`_W2/b1e3A-&JH.R''*H;Cd,HW_>:WP\;;>u*$Sj<4>db?P1HCJ0.PP>ln at FM_f.X5]/Y14TD2,r9KfVU3+V]is3R&&99+;PWc'^n7?OA"2T([]K61fj#%AH?S%d(UllpQGrLZ<;Z&5QtcAu3<s'IUrp=)Z-f(U=:io6?#F=-6L8">7\Hg+8iI1/nRTQA8-:H+W[N(>M8%_3htT1I>,%[Y`Lm)mWQ85?ab*f9C"\a]jU3r_s[X'908B.g)+"L>YU91YQe7_7Fh6I1S7JXs-Lo<^!eB at J^p9I?)ZT`'im'qSb'[O/f!O$b#-*D[%"=LKkUKHlT.[)f$oAj+\7'[%]of5OCjQW#NEZlp%Ro&"#mg4X1h*%$BjbkIO950+?3eDa(7DSS:r,p)lsAs(1o21%)4C6TX5WWp=_)dLhP.KU(??]on=<+$<0gT]q`*S'c1Nfmu5"[]*k1moEcEI#r6=0pknaIkN3-=Dtio4h%ccmIFM-;a"GN!TnuUjuq`QpgYDSc8e[u*+<GSI%`P-684mND9i0UNsfA9H@[/*\+7g1pUkLMCn&#,OE(TsVsti8,_?K\.on^<^,I at b5tAHVg#=dVf3XOA[dW)gP9*FlH8"EtY?@9OJm[la\pqnd`;\Y'M`#9sJm(*m1@@j1ZqUKSd16KmVB7s6Tir(XkUR-?._b4NNR#9'YToEr\gM#\k]7:CEf=!/'"VlBPWZ'0&!IS'0S[Ft[o\(OIphtr>Y!V&J!?`_p0jcl,/=!5l?;KnHQAqh at .!JKMWLCR5oag+Nr*+K4s>'sa+:_rJHgrQ>- at bp8,$.U1K#N](VV:s<u5u)l!@nSMGe!W5@,cU3W~>
+endstream
+endobj
+354 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 353 0 R
+>>
+endobj
+355 0 obj
+<< /Length 2422 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E>Hcg?%XpXW at ZZp%fSjS at m^/HPZ>$Qqd%p&(YUJ5"eTg-mj_-3cQV8a at IVDH`.*q8pBQ8P)Oci7mUcsp4=0&qd^<%/?,Mlm0gj+hF*F3pZ7i.!m]K#LS)D,"e`@k#_b*dXg=N4[^qT61Zs':l"lo)M]gje&:06[->]/RM)qsF.8^O5Y,&[9JZ=bs3ArFUgl5$e)p=FCGJ7?`/&D=BbH[_41!<OZ8U=tYl^5Y+-r&hKW]44..;O%\#,U/F]1erj5ICU"F-Yuc9Y[_ss#UCR2HYE;^[>hE9PVNXQT647kBhm7?UUm)t;iN5r<q#e"HNn6fnf5O4e3g9*4lc#5d?F2Wcd1CprLD`$iE'0oV1J9d at NiIG2UU:>,hhuMj)8hT\pg#=4+[OghL+&:NlJQLGA[,E]=Pr$O1EIc4VX2E"ZR>.d*Df')I;UA86TGR3q2Zis`c at Y8@-G+dqJi^VVo2B<Nj&"?Z>K3md3$p;p*B*n90I]<`#k&cMl%%DC.+!Nrjm%tediD\%2n,%&t+]gGmU5[gh7IQgS_BM,p_tBcQD_nAO("A$kmL$GVn.JBXX#Q>Mcs(+ghp<W34EkoB\k6Gsc:GX,>N2(iTlkXEZ?)0jH*EAo%'Z-K-)CF?/[?$F\X3jljm1`NF>2jQ<bIVft-n]I=[BQ6^ms!MITD at o=@"ce*%^<`P[?Q8Z78fK3dQN)KgGMNSWGp at nC&C.gEGNfAS<5l_k\>gU/rq0adaHSkbr;lp7[E=Fs<h3H0iIYtGQ:SiW/,UCbO"%*(.=is""-G%4M-JHHPWb\Z<[IeKRa+p5,GA(?9Vc`g5dI=5pRNn at aha]aGdZCeI#_=.#4'(2sp`+JTR[&K";gl^[*%ckGe.U#deMHZ%K3<?R\R at NZ(BVbMS]0SriHlgVi_p\fJB9Xs]AQ*uZm6ni]Ju;h0[U(3ciOlhM#iLko=SA[9$NYoo;MZS(:&Ws5Z0hr-N1$>/<1"\Z7L\b5\tYHb;ukJ`mJs6g>F&VYa[ACII[toW"Z=NRig8-Lm][,jP&]\"r'DpL:HU#bkB;?(@AFAacAA5X5nYLh'3l1930A7_qL[)JJYG&#PXhP>F>7F:'+E2j&&NZJ6YM!Zi0K2"i;B at nk%m[\\1R-CW6(3Y29.s[N$Dc+'usAJPYL.k at N%]A9<=GkJbh;X(gLS^j"lL#%#eT6#8U:nIb1Oe"s:rRPX$S24?4ak#d>2<II/\[%p9u#N.iQ[7?Mc&&a#=J8RH\q=*BC6;Elg:5ni\Af7tF(oj)tlcm/#'EP:2Oq\]uBh5<b:%Y/2[I9R8;JS+a&"l(d3<u8HK;OC'A8&nN/QI:&?2&#m.D.Jl?:%A#([<aT<(W41G,P`V%p_`Nk_"@>j[*@.=laloXl!LU=9s%n&Gkf1>M^6)l+e."c!,D;NTO(Z(\7,:63M:E<>c4RpBsi^'rMqO_;t1CK.\XIXsX.)?b:Xb>Q/Go\uGhg,IjPp#,pjkW:4LdU=g$)`gbm&">P"Pp`LfQZ*Su$87#;^>bC#J.is#(.)Yk$Ag\5+G/^5EYPRVCMpK:pJ"_bZ:EXT6`ULY[/)D$InK?ID:!A#H",BW0.7c_u`A+b]JoHq,"suR>I>+BGl*lH9j#C\-*8<J="d3Q'i+ at B8,U-sn\&HsSPk4*G&ms*G0=QETY^RFOGZ=_7`S`K(W!f;PVg]k:=)+D!#P:>F$YXEm7n?i7Grlj",(B7["iH6h)#P\r(lEsOI8P(-U$$\"T\F\\Z):FVAY/]]o"SJ&lI=#Rb_]ghjmWU##-ND'4X8GeiBF0BfSu+g>u+e3-AYUi:uq$aSsF0W66CLh5BD$7bI#CAL7`=BBF#nq8mTW/X/=9$"'4>tFVE/'/!.V:-Z at Qd'Ul-HNO>ipTj?0?'qt7$06>4fUF#FE![,D.h]VT:D#DQ3A(1!3q=Wu&%Te><$!&qhDVE61apu[Gk]eo61PR9fmYhTXo:5'k#"GC/(AqQs8r9iBqq,']IJIP#`(GM/2-Rr0B(bu8H&;3]0YL?e:VQ";FReG,UEme,dRL=*fHUAj$r]tuoMefE'h=U.qWcemd_oZr?ct0.$/-h\:mR]EWDd;>>PlQAq[>20aHpCS4shGer\7gY>!'"00=irN-_&HX*U`pfp at 7_k-15c0jdJk$P]=)X[P_]pd+&OQFR(!c/B:W7W`H`6PE#?r-?VP%@S)2Gq:9r:0oO7KUFGhN_kbP;]4tQV%6c9t at nJRP:Tcg&>oHkt*R$Ih1S<<^q5EdO%igekV@>"B7,J,?BMaNHI3Zlu+&JM</_.3BV>D4I`NHLSJ/n77.t51Cq_7q!2&n(P.>\gKgjd-6?rZ_dEVJMLX-J&*V#LR/!;Uc^MEZT*'_O*cfNN at 3R*m74f(lV^a2\*<@M%C/"J)eI%S:WiW#f?Z721j1(_pX`d/O+g at Y+4~>
+endstream
+endobj
+356 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 355 0 R
+/Annots 357 0 R
+>>
+endobj
+357 0 obj
+[
+358 0 R
+]
+endobj
+358 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 142.54 252.448 230.03 242.448 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+359 0 obj
+<< /Length 3146 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%&D/UB(&cV3*Taq<q!;9UM2b at _&5_<6[G6lpXe]"4q$A6c)''%M?[kCXD?XGEua;M-]p(dSDB9kmpL\".6rPQnYa)!N#7aoJsk%6[-hTR<Fo/E/_ at mc_]j(L?C4R=HqH1d at baePqU?Vg+L`?LaF?F;jdT\50*(5,>gW^V=__S0eh67^'ed9X^N:HM]bfgHeiV-8dXBf8=99Sum#XXkZj4E1;Z>`$-tF"+.;=gPeA=gHSRW7O,>'AHNkC$4XHp#NlOLL3C8jia(D?7YboL"rWLl6nA*O8Ib88eC4rN=Vc>27ID!(5rcGiYQTl7Y7Ske64cA4N]1ec$@(PAJ5[;pRST;7_"eZC,iP-!hXVUQJ1T+A/e0QG,bkPGG<e$jVZCu at d8)JoGX_]c=^aH<SK+AXZD'M!*l(/9Ujge>^A2M)og>X9&a7%:ELWBrVZZ(GJF+RnajAJT0.1<ah4-6b9UJ]ePXl.g<6KB&WWSd at T?#IYc_]A.V#blF%g+*Bn*Ta2XJ&QZ(N9(MK.qS\4u*Y0<b$nlRL('8pXP><s#`E'`i8T(oqDR/#.-=k6.gV>!RcJ'r=*mC3rUl`c/5+n>$&9P6/kE'*=G2H^uGb[1pTJXfAQrD&"W1-4kEZ4)`f[XfRN'UO(*!"2!n[Zed+G=U?Q92M"R\WpU<=,3l(DrM7U-/Q!X^_>%B&qF7FX,5G<KUbJeKcU,K?S>/rDPIVM**SaBCc^3PM\ncYTLup<O"e.?[.+hTe6O[+RCrgX\MF-t?,t^AU-NP at b\;'d3iPn.l^OT?Y":2sX"l.^hY5&KU.r;8BYda%b0$,PQgf<@hlYeA7ku`"&@`,NW/f/rmW^?hkI3/H,__3ON(0r.P,)0PbX&BQrM<%IOBMXmW2(pNBCm*,l+bm5=#i#[\]P8Q&(^hRM_1X$"LXSQuL,c at 5=[liB==U*p;iT#uM\N:9#fMG",U&+6Ln7BBZc,&Li[ia,PVL-\(\4^Wb<+551J(sdAQ^!(Y`Y[IC*q>'1k/Q!,bIQL1^V`KlV9Vg6=S6ES-L$(;0FkTGa2Z3#H3C:GX]c7kfT3jqY)M_%. at r";@<'$KgdP")B]7!`aB[;AKUI[F/pI7>R&eHD)N_#<paSqb8,pNlQ<1&dTmN>>e`(W_T4\h4=26Pc<.73!m!hb2WYR0g+6:/l*]StiX8_h=3W$cXQK=Mc'c#dR7j"3;'*$m*C$b*esG$h/^I\Lirs<YO$bS.rk4+'007s+(+!Z9/F`["?5uI\Op2:J`rd2aHq&[[F9Q34L;q_,?X=D&of#FXqA+ShH5="er[3_p-:Yj'4K:L%F8'2t-r"&.+@^H72X,GXMXhX+::T#Yf")YtB3aH?9^ng[\S[0$Tp0Je3A,-:9VY#l)!"sd^$n'.]qJlehd(\\lSS at RIFm!C-=P^hQ$=4%V)[r8H5;uX\caJ=RX3U=$]HUTf)OJ\f)WiGo.jRl<@Ct-Q)-ZM$!`*hoeISUY(jo\TE*!d.E.a2Vk3^11G`B-kou43<(E]D,Ys0-UEMKPHajAH6g;(aosf,Y"K\@!6<Mqp=HRLAJqfQYH)neM!lhB7M9&Q!cdqOK$]V^)"/RrHgFH0?-(DDgKr%58gM(HJ%]#.^IU>5Z-JT1:k)2l*Re?&%k!V9hd03i1!5>3OX/CLK"ZVI3oi]Xt4[W5"i#)X:K!A-V".M$a"!nZ7A\niN<@&!IU=Q-KnpL+45;U^W.NH&Z+F\(g)K8_?WnqR[eI0'qH_5;k0g,<:K)l--$:(;!N+^(37DW-P"K8HEq4lL8p7g3?b-Y$RB^mAkG^9Fu'1]Ka1IscEO:b?='[T;1_l#G(&F?JK[Z[X[o6Qkf?B9e$Wkr?O$:N]Y>Dj](f`[@I,)D?q#?bjNj!a!;Yp`dI(16T>j0:&Y]ZfdU.ph:bh.e46[GVaH1:6),`-9<CC>a`G$MG?E)XZ0WE.AkWG4^Fh1b`Y]]9c.u!ZOV6CA,?,V-2!+KP.`ENJ/[c2i\2O8hIi*Fm#E;mqV44R1#kVd6]"IV-\WV;7H6b0qCdZG_<In2WnS6kku$r'aMcAl$H=4&6m16]RZQZ7RXOS`\H%X!75FBBA4!GN%&F^J`M/'J6;2E*X+A^U:t@$eYaq1`EAF8 at m@ccO?A6]pbr$O)3"(AjROWC26m8g+qeEg[L*2glUqbV6jO%^R6D=bQ>>*M1%o?9%g+5P&Rq?<M<a[jO\5:'4Rc)Uf,BWcaYK_5d9!Z//&gd^V2l$'Ma#g<#K36-dkpRYAYTR"9YnGO[t/5IWBuoNZM0)1BMK-6:6t9brLb%R+`'<_Dl;73=uHV,+&$eO&HooT\Pg-#7s&7JkB%BYljD0En'm4R&=<V5">>;X55UsK=N>D5Du<P#`\#ku at mW$.G)INujU2YCa[@%jn"Mq$1L#f&7::Oq<H9iLmDD'.0=l_Q<$80hdY"Jmj_,I#p[9fbI.$8M_Br.$4-R$1C)_R9qj6#r,b at N'K>B=t2Q[9J at 5g%:ccSY-DU<f<Q]PR9^`4.>5nF0^3!rZ?Mq[gd51 at mWk2KFN`YoHJF4[ko-/ArA'f?]PQ!s*2D#B4DD\SOkTAGlF,PF4B8TUcJ%uQ[Tf">D\5=T$pTeB"PXK=-kP*&cS1GOD)e0kej"OC5^m)#&b?$S%`FR>@l2nEoh6+nM%"*9B,lIOua(+iJ7RbAj*h/A7sZ#TTC-C2<Yka'+4k'8dhi"F*DR3K+?U/^#Qqu<!9Y9"e_DWL?8^:cY at BPq]D%MpE,G060&ampj"<akEVVLK-'S'g3L?J6L8?g_paIq)E60&;!EndVQ/L.:*QE$*a=fuJc#0EuYfHX4.*3r#]mkIP5T0tF>-8g"W[KB(t`0$]b\`VA;`P]TVjp_(Vg[KucIr6sXG(VF3=:qJW+\#*p5\dib;n]9XfFr9J3TD(RJSQ$i;q<Z+#CG!_<?;D>bm<CD'^rq52 at pWo&+PZ&Iq at ri5-j08OS8)R$00["m(29!p8!`&"g[1fAX\n\u?_[5P5brbh>5.cbO1]0(ZTO4V+&(<!Jk?&r]*h=t52?'Es7lfskp/,dLj^a-l^C[&-_$T4Dr*\er\l."?XuCN at ae]$/Ba?iIC?6=+!&$ZfM16\:]/prm7\7G&`<3=66fBrF!]->PtYiakqbq/W,,'6r=;%OW>t~>
+endstream
+endobj
+360 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 359 0 R
+>>
+endobj
+361 0 obj
+<< /Length 2580 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%=c_UQ&Us1U at JFEGJMpU(Ogc4pJLh?X!K=[epOSVZRkqA6V'LDY?_?=$YpdfO]fj.ropJf*lhFSH^2BQlr$>Z<#q:aV[B6'Qe_qr^"n40MjUhf"=](>5a]I6GlG(YPc=b_rq4B=@9bc_-8V:jPr.TCT=!>/HHl[I<p[CiJZMK!WrG?.1$V?Xr`]TO:OnYsB#Kc>jT=7UG49_P%i"),355k>Ba%AFEs2/<2A/Rq-=CIApG#/-eqRX)GTX?I31aD>^8A1mne0EM23*dSm`oSR<R`Xs4V9+5b-!c3*5iDXh2ha#QKd@%`_Y at _ijIPjSW^]2 at 75^T;gH,Q<H56#JL:7XP96$&pl\L1B'($3#Sc*g<^H;6J<(A=d;Ol*5B\\U?`.gl3;F'e4_`Q6e:"B9C9qm,DR(RB]S^d):Dj6D)U)f6JLQ'm(6(oXu;p9iYfV9VD*VR&0je-Z%NRlskca=UcPP2YlR5DXK9V9V)"fV<f"4uFuCg")n7F9D&+5!PMXrTc3["`]V7+88p6bH^U>]scmrDbB`:`<ul92sHd-7X&!XI^_RB[8?5\N+J>H/$7)\t6Bd=,2":4^ZkQ:#j/1;QY#7B\d`ZoVO]I%d"933`@Yf'=W4rF,^>M-R4$g/pu!llr?Eb%Ke;`+KqcW/c$edSSrh^`Afg<_n_B-Pm)I`&$55+nIY3=M770FouM8Q=:nSXB!UTG3>Uq@@PCAfj;h,?3ei*_KgaB3)+UEEN=Cu'CuR#0<g(ke\D:<*qbWO%g1o;. at H'CkOS!qMfa+P"7O-PrFT at GgKi#E5!dg6&$h*kn6+6'PXa2U'g at 5)r-N#s2Fb17XR;6Bf1uaBDRrFg/'M\aP5\@[kPs`9,j$4iG)GNU7(G*'CLf*`Qr34+P!]&3o[".\u$g#n)fco-u8:O=1;#tH"!"jM2]UAE]D^bBU(U)!cJ&K>TJ&L"H**db/@eu)TS<S;\jYfPUW1c-s59fbG.7kFjT%2=:]b at NU;*7`u^3pq]F9GbC*Y0mg*ILi[89(t%"'JE:=<7219QtG\:j`u26#SD)H5A42JMq_)d#\?FRA at NXh1MMCr'?Y>0*r$LWOF9J5r/q/l9G3S(D2MRg,m<E30LT`eoinG7Sde)T>Z1lf\;<O,Wip.0X at p;W'(UXXm53.ZPlqdmncjCQ5(u,jgl$Sg,`Ytm&:]_M3GF*(0&*#1Jbh1!1jO<k:'M^XW,bLb")e;^^i$#D[tul[)WeH^[5l:A47oLVEmFJ6HTd/DiaOEH`hX(\Bfslfg`lj&1pNoaDd5d*clh"pQ#?8kgr>J1_-koUsXXi(n/W*0_`;=bKTd^@lhgo,ar#"IF^J':7gR:!A.k#5nfC&!X"BDAYe5IC%T]6FsH4BmEpSO;j/n);NX3-koF at B_&AeVVnAdq,S!CKqAZoOakgI,"L9Z+;dU%NEYR at WF^d#6)&i9A$b,7'BZL`Ld5sBS9Pq\R9H>VFaR19>_DI*OdQ8c#Wi,\U0u[;dOI6#'/L(Io:P'^Fn59fWZ5"F)S,mE;X3HU:ck+-'#ZZT$VFj95L_")#^-7sn!=sdnSZR?U"jrj;-loO]fcJFc>9X>P,dEFpBoJ3Mi7"jDSU"d\BoK-qeqHr>dDJfZ$b*=n;@.hZ-Xm('g)B&>\YU\Il at To,%/))hTXk/GZ[oPFEuAWKh9D9`MAeaN2RB6g1E4\f<g)oJ6Y,\]\:.h5<\AQl at lKI83E($4QG\r&QfB!</fqauB.[KrN<??*TtBda*`?<HL*ZL@)qeet8`_,]79Kh-Xf&/%>g(e8":qj)=5<bmEM4<Xe"RetQC\],mMi3Q1j#`N,=2W.ceZr]b+:/_NnT?P\=JT9S7F/!r^=LG)q7#/gt]@*MJDn at 6%`;`--*EWc&(A[=[P;@Qk&?WI#&-Z%Cb^#nlPVAHRAnW4tQsf8rM"QgosIpQ$*.GX(L#E%#)U&o5^(deJjX)8L)`IKrR1#X0[N&B\8$4S_4f<UBKB'I6Q$\!`p(S\kej`;%et"VWNn^1U1YLmS7J?CN.pkpZNsUM%fKnqVG?n"fT%h4 at bf9Ab#`##(ue3&=j,g6$fVAHUu$t#4c)&=DV6S;rWt>2iD at .V-.SEH3(?3.28cL>K:(SXSHOSHYGfBgJjj/Uf'3%/5\3Wj'i?/?b5k1s1-Y$,#UhCD0KP9Q"\EX_tVRbR_3lW at XPSg'^RMDNDkdgrC*h,XHi#'kTG1POd"S)T*9!m at _@t?@B+)fqGB0g8'`2kJ9r0^Yjo.h<@0j#@[r,tbY!A#EbOA#=q$C5&/Dp:X1nH7.RpY/!s<B0DWdIOon.(C3aGFY$oM.Qq%jD<0afX&2aP,XEaQs\OH=_D&0oPlNX.=#d=K-F at OBtM(M=g,knZRBEet<Dc&qhYJtOGCO at f$YnTMXD*VATgf^TpUpYD<CQBSU&I*\N;_7[`BOc;_5con(f)UJHXhLQ7'GGUn2lX]1&YM!b!;i]]/dZ&$iVi0HFKfO]NR(jgq',$;nh7SY)qB.\FWlbuW1,qmS+b41kK<ImJV')K1'_ at Naopg'OY^j$)1hu`\$t?b,qc)p5qUPhZRILYo)EL7c#CCOWKE~>
+endstream
+endobj
+362 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 361 0 R
+>>
+endobj
+363 0 obj
+<< /Length 3423 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat<C?'F<Wm<sJ<a"P!IXEFBJI*H3!fArfqBp3_GD'+(PTI&=CXs?&m[!UP7?W$km:eU3;3dr5;&cb4F;LX+>oCbP[M8CCjgmr?"c1r^?K^'@jp9DL%_`3JGS%Ek8ml,G,0);uG?(;qbbSs$&Sj.8;)N-!_f(ZhdLl0CPO]N<<P+oA2Q6#igZ?"S,9V2'a%IBTo9GY(<m`_C/57:)4Q+Z;95]D at cmM[B!O]'XP$RVUW"JH_5B63g2X-EMnbt?YqV7>\hCpc9[o,pp,.4=6`2>%'\:artAZ0'K/:4`JIBe4d$+p<;i>I(c>/?h:C^+NbbA+YC]9ubBeeRlP,B3iC'.$^gn;Fn"ZMK%/&n9j>Gi*E2ODcZg?GGQ')%>u>8__Br[iN0]%(t9/6(_J1!A;`kmp:)5^%@J>A1N;$P5oK0fG\:crQ<MrX`">LV3W4Q&>Y&s$p<-q_lWFQ>q2%aIGNYen?6,qt[:76\"5X_QIM#buYV>os?noYg at C`sM$e7D.\M-X13.Y_Ij620J#=19;c`Ff<r75?&lB8`&Gi6%Q%WcH-%j11k,(me>VIl98*_lj**WEmU[r<E/%^<@?O5>lb#W=*7=7=@WK+Lc'L[WQ#q3!*7b7=QRfEW;bJ!q("aFb1EqFQW?jeC,?#tB#aVl\B:c at OB;lE23Gp`A7>Eaa8g]?)h:[gSl^p#N7i<At:tBFHO>rP(ahDUarnGE^]DT/?p at 1elsP2gc2[4O*N?Njm.6>Y]j@"Lg'8cWo-a)u/"D>!?1Z[6f/$kR_%iZEC(CM?ot`%uGl.-UGtWN'*Spd9hhQJPR;C5E at t2LqA5pN(65l1_*1iN&X,@$4RoMO=F[G79;eM1'%E at n')JJRa*,W#Ur&.]\r9'BY+q>qoHXn[(UC0S^b6bBhjp/AIBQ2`1i#pgk6]XP at -XkWroA0b$"4f/2jO at jD[trm_+KPP$,&-bVhm3!6l1(-5$,4Z`00b^%:em'rKs_.?63l-&Q*V%p[puX"qW36`l at YLI7ae*^m:N<J4Yg*9uWX/!7f%<#4$hm:)a8Tj,OJ0m799BYOZN\)JV#0(hOZ<R3L3[1p"\io('!jZ+XeD<1Z"'\FK,G+iB1/&G#\l;aTg9qdlceYVf))im-DPH1H_LaSgn+V;-O`@/op\h;foCR>!+laVG8VO(h>=<mVhd9akE3s>oib%&`=lcUW([2fe%Z1>`7Kt*L=G,cEM4C+*^3J;eL.plj_eN&WNhuq?G=q2c'5b"7R>esjhT1J?^Efpah1BS91Bq_E!5-Ol3%;i5!2.GMh=tDWL8 at Z"AOmK5nc)34PPLVNnbdqEpW$"OMO>5us!C;$25aWT-Km#fU/Km.b(;QXJJGuRsor0PmO.B'FahcOPZOk8t8K3EB[DALD+PI5V<B at rS*"Z")A9t_kj/jr_/#U+9M*$[!?KN&T:?l8j6CRHe,.M=i!5^4&)P:aoQL7Pmpdjm(XAra:/Jk-8:8)LHn at UJ!.5I($LehHr'U"i%X-b_=O:X6cXa'$B3-m/?a\u[=:hle'O@,[Y3U7G/bc_/e>`b>76YTqL?Ue+Xa12s/X!\^V4<?ps\Yucg!('MB]'/RY`(^oTQp6KV?#n^Qcam)s'!Cl=:!(2U.0k:i*c5Nrl%QjF`Q96pSUa7LPrH*#.hn>XF>Gs4Im!Gs3=FCK.u)FY*LQc5Ok<RpB0j)?7@&@Fo(B1`S-MpZ&=_sK\+h]mgp?^>*\pL-+Et:6Dfj]RH<*qNs5U;4+l6)&ZXiH<[VY:$Kq.JGRqj^9Q>BM2*Z$L+gEauW)LM(*g,-6>D0Hblo*a3;qW,._ohcL<TVDT at +^u"k!?m@().0lWPY\XteBK8'dKZR#D`/su!02`XGce?T#8Vr?$pp#(Z%!!iAZk^:j5_n9ji#c?LZ3_m[:\^O0SlV#bSo1oJ0C>rR.fWlJS5SS0A*T<enLM`S.2fI1QKp,$MWtka\)`Z(eY at Rr6sY0H3PS`-p'1Q>lol9 at 8loQs4gGY&utZi(,8SC51B5G\i:4WIRs"K>2m6&1-FDlhmDRefg_4%V#6*:Q[e/Z338?lEH89mrX3m8QC#o5\1h'J.:L8fc5RNM<>dn1.]Q%[WceH'iUmt?)R/nVWo`IT.Z[kldGoDq$b"@]'E(=i,joPcJAC&e1S.$7j<RdbjIkQR["=@[bJ.-CWhYr8R/;sjbqO1G'GBI%ilo.!SBAO.]h at 6_;'>[;H%<W8F^7FU:rJbpjtq7F7G_3NN(OY_<<&"$;#jIcm$Nn[fK';ZeALj-#3`m+&CR_fm$L)2.Q,J&@e7.]/\>p3kY-s/8(5^`j9b^Yo*XWmM6id;B(O>@[;HkgG`/JZR,g;GXnZJ',/<fo$_KU3KnnS?J'.l.RN3SgVDQIB[fG"Ce!$HXE8f+nX1'Pa.H:#MH%f%"'A=/C!6ms<+U@,k9\]^%+sVbP$psf.f7Yd8@=S]u&p/8:R^Ikr5b8.u7&*bOHAaL:$'5Uh!$B<h3Hc1R-T(nJM]Pt.i62QA5]g7>YDF6jW at Y5uFctlQS>>T;(2c:me16!=*gC"R@[E,BiphCHRbakLc)uq.j?^&sh&VU%I[?:&\h&]or?,Zie3#tH,B0Yo5?Ml*H9N&G-,43'c*PC_p&#g;&1Wu'K]#+ppUnF*'B"ml!jSc*p#.%e"-.k3D81PD<bM, at 1JdAjnC:VUb^7B*&HcC(@>lK66KfZpbbjU]3BW.hb.VGn6cB*A-RYH/k(?^p/R`%BEbrft'=*`Y4TN+Z#V0[=!t^;X%mlo4[qPj4US([a)/0GdkHYM</5S:5rUfIk8;m;/[Wc/)j`5>f&$0Z;5"<+3dk&cM';u0D9:3SE=N84PYV40-8uPX>l*82N(sste4>Nbf at q-/,N5pE!&Bsj7^YO>9jl^![$UOc:)R*`sVdtE=ZUSZ9%&ca\@Sgt4Y7,sF#Q0gG0]WKV&+"j7jT)Nkd@?"d9*4=+I]*MM1/'+g_N)[./;GlC0Lc3WRC^,8aPsBbd8 at l6eo.HXp`f2%SqYR</OE]bN:=Tr7j0<]h[@gB_=[#qG8JZ&VlJ_jZpWC&8hsm=holE_V'BDsH?T"^mPqG,O2EoiKf\a7JZDV,/)6\N2B,ZVXeK3;JhNcs1f[8f5c?Y"R>29l'Q4A,+ at RaaSJWCiVk2Ui+@,!U(<<a3"W$h5s"so7MuC6h at _So<EBN^dkOp<mrd3&G.J#:OE3BPOh4;$():/Ec+SP(m80lQU=,c!#lP--%L<h*F:MS&!kDY3cE^bjrI/-..&SH>OGtEdEAEWt=FM$cW<8nu*6b;@$,Unmj;sZKm(B8tPs8"K6#93^=na>PKl!JH"D`AKEZ;$c(C)j79jI=WChf%B//cIRsr`SiFA1&s#PjS4oe'#Vsn7t`loHqaSXW*mP$<m$jUuW+<:XqVB-<1[JJc;YgUaT4Y>=/>l^e2s_~>
+endstream
+endobj
+364 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 363 0 R
+>>
+endobj
+365 0 obj
+<< /Length 3257 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0Fh36U%&V%R16;\ii9[4'],a.R_a,\IZBA2"?Q"aji4?sVK"IgTHP.J"!q_#,]mQsG.4It`l$[t`VZ.N at K#B[.M=$OE%bb?csB<0dfE-?F?bsM2`Am#PL/<#30S#pk?5G%i-o_SI<o6;u`Ib&F;0+iU.F11oKfG,Vma!ut56+$9OXUh;_r-3/6rh-:S]k["XhZ]Y%DIg(u`$We#@-P#.23j9&D!G>p\mpVtH2QD]s1r)Qe6P0&jp2K%;f3K at bhZ<iDl]pe5b`N2>3=3\bfb-MYHMA3Oqp=f/2`K(:u6pMBogV9pPMqc7+I1VK=]!Q#LdV19HJ@\b\D$@]Pj:QDL8.jJ;GdP$?*$YP-fPml;#sf$%*=;gHWq!6'3f`AW]6ukEB)o_Ju:bl`<kr8WY:0\"Kg%8#K%44:K,Pp?ZAXA$aoKD6N6]-gr!q8g6]_GdQ6sfrB?sRJP4,P4G"uS_'c_cK$4H<%"Esl'))6FaLtoJ)0G%1\^b,e8LfL.H+L5\u*48M<)/khPnhIdS,RNc#c4#NO*$7)^2d]3=ok8mhm9h3WuB;*.N?:Wu^%D,i#HcTKdnOKY9-X-Pk=a;5-\n)2$\^MktWJd31/)>dDS+71sr?+ln/,Q/_^2#ZcP;iT^P>=^A`nb:G'!s%,2W8t(h,%\:%k/=+,H.#NEAPob at m-^S3UnmNl.h3ak8asRTqWSW^A0th at M]PG+8V`Zg'B:iX.,ZXSufoY'XH<GHEFi$97F<G]BTJ8'tE/7Mug>d-%R>lB]U/]f)_l]H=,>#o.l;3h"ZHd'QDVH/2%HFieDI?*,V/JcUUGFpsgem,uHaCF8=2tJX0_<6^esc^'?2,pU.&JlD/.R:`=[%#^0FPan^dZhkcf5FO5o)).jO,kbkE at B<eEp0N@?JSrSu0U%5HU&/g?J't(2L12K.KVc/=3$%fJJ?X&EQkH]j'=*J5&s5:CH[JTAP**o\nr1e_>;_1-pABPmhPZIh-U=?40NsGl6i]a8`l!q>*0-D6%MQ-E&3R*uY at A>j_-0e!Y>)VL1;pVIO;1aK6N,'dB#kb52uP`nG[f5SOK1%@(:.bm=[\Oq^=SSfu6I@'8'dhnnKD1[SZlB8jWoO,V5YKh>q6e/L-;Og?4NFc86t4LEXJp0)DSP]G"[UEK[:<UKLF(8'QOI*uRZ\19"_ri4./YH31#oFro\:I at up$^eF0K4<sq"G2&;G01R#7-H(;'3+;[cqB0%'_AHg(u*t,nl#$Os&\`-hfR.,h!Bd9Xo<@fS_RhXGLKLBJq\%D(fF5qA/C^cW*RRK(lN+:+R#]0R2-1]-AK79(n at sKG++P#',0m?b7d3RZWio&\Y+pMacUj&D5WD'Jl!CaN^i&s&T5h[/_ndc(LlZYH8c-%'r/T at Y3"Ve/Bs1h2EPd19PQ1U=`_rrE5:8/HP&FV%l^B9V3o>J:h*)X;B=F+On8)L&XE`]n-8d%,[@S>G1TEmAoV1e@]F8KgS:-.r=jgcCJ(A#UHt at 7BLW2f=*q2a]U"4XCT+h"6QVX"4lq.IM)AC$dAC^os$5aXkk;SE\#,Zp'BH#f9qE.J at I=JHGNP"fVZI_GV*"JIiO3TH-PWKTOlEroTDDci>G&3$-XtSbNuq+EoHt<lMWS.(\N\][H-l;`,+8F@"73=\J>tg0`:d#uC(qoRKK7J:c*7;aTo`I]/39L(\/0t,$A,E at Zr"5;1PKiTJI:j*+t)1\,Oi%N"3SpN#"r7fr^#lHXC.e^&ck?1NkI-c#GF7kn]GDRMbH;#:SDhr at 7eNIUF&&@RNnhR$(77&U[u'/gJTue2+3nHL=_Aa-g,]U=eFH$Jd?sR%G_Z7:>>&^*\cgh*`f0;r-*mFNeLs9\AsDhTi1S`0YFR%\C?k at b9/J92(gqQki)aP:Ygo3(sM(j-YsD1be-l=.k+ls=SN189[2U)n50W\#Ham&Rom39/1]9F\eSGViZg>*9V;CI&39.rJ^=q*pS98BZ'V"5AHsMJh$9:J#Q8oda1f!R1`t3u=aIAerat.,o1@,Yq8mK1F8M2pGW6t"L71N+e7?F$]YY5)TY!fe9ImBi-U]Vp9FsdG-uT86,K@?m'l4D"8)'^jh'g]1d]q`-3KQiepsHR'@#%m=J:68d#7$R,(DB\2emq[7N^Pi:'ef-oGRl^7HNX+(1/YL at oDQ+sO7R-a(Y,6MpZa- at 20muqX'0<p\@6:DTo4g"8$-A)SQG13;m.+ESamssi<I/UC)\fZ\#i4/*I(UYn4K"/9hciW8&:jX at g\\2^`JTU`)h?<_so>NPWg&MUJ-LN)C]/a2jar/>a`oIPPJQZ>ul`?SdQE_\DG-r'mjG0a72qir"(Pc8XWdGq%0)B9306&"-gBW]sADZ.KlmRUOec"g^=XnEI<Tk\#M?WpalOkiJU9ATI_(ZJNe;Z9;2^DHoUJJ-gfk\;.R9@/3OTdlqJa>:o(&TY%aR0h-l.q7*q?h at D/#Cn+QJi!n88&!_r at ao'T#HcbH'6Q7Ud]fm#'k`)9B6&-TjQ>bnI&WbFYD>!MA!9\YD^H+l?X](pCoGe#_tl*3)^:CfGQ.'s]Vfg:(\0TBbIame%]b@:CGQ"K3:/pojVZL?2A"KdGX97CR"afRZ+fCD;8gV_5E;oV!A?W"Jad#pqrPBL*KXMMU8[q?BaQ-)*U^UNTj]P+uBH!$=BShcmn).N<1Y(q5fDfgOir;TCO8tCmGH0HI]dROm4aqoV%%NHI)B#p;N5A*"C^I'u\N)q6d"3"2Q,m%T>P\a]R)s!pE&1Ji>6)(s;!mm4dGDBoa%P<rPmHh>co.sX33PDHRjLO(].ZJ_h`:oNtS_0jh!k8lkJk]/bL*XQq6FfVi at Z/?]&hThT+X"[-jFLoaO?[?(RDm]SUK8mCF\fV7]F9ZCEkbA1d:kE_]o>Woqqq2u*[eIh@!!So^lC31?87ciA3K0+ at 2^\<-S'Ar=^^t\)b+T?N?'ae;%aN'4Ak<R_2]t)$"c;q1l(#?S(0`j;JnM/d9,Jk2Nl/c^JQP>EXpi:H*FJrOOHWN2GC[o7+kF?/pKXqj!l-:^MV>s&Y]?.j,+R(mTZn2e&S3e9QP."W at 5EI?okhW]`oV::J/jc1f at kaP7bTAD&sP:r.bCd=0/5GMNiI32pWf#Pe*/P4m"Kb&NTr:UMa+6?gL"pi'5$dD`c>>%9IoOXeXFQgT,g0]iq!)YDi7qn9(dLLI4Lg/6ggMC&#.J^;ouQXSL#@)3P1&N]o'@:(q(gdic1L<>%d=:CBaUP#R?m)>t at aCW9'~>
+endstream
+endobj
+366 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 365 0 R
+>>
+endobj
+367 0 obj
+<< /Length 2911 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=.h2gSS%Y(+c,++_Q5nhjnm!L?"$ZrRR@/&X,U&j[jV["WY'!#ePWBV`#6iZpR,%XUmAa\:*(]Pn?UaV+rR/M9>qt>emOi1,031TEr`VD,h`9L^8fVXP7NRK<//e6.cbM,D'*u:n6f5ojCZ5s5o>=T:dqkKDS&:GNe?'5LW=[$q$S;3<pY,j,u2t69n'0aWg5)F.o=mZIslcsk`ZS,kd`4LR6l%=*8a'VtjS'e!oV$-h(3.+cHfh]VmL<6lD[*(V]TQ2R%C5"0$1N)p.1fqeV=J;XNs7/`Tr^';AYG6K/H>=H`<3gn!==S1>q'J]MDm.rEpD7.le$C8-'cel.g[`W%jRH;X$tQeghaatkm(#,#KEoYam)5&P8YVoWCPRe-Z[p=Q`Tb<&h@;i`mG_jKTgL%pY$B'L_K>?.fR4hFjlH;1c?Db4FM!Ab:CIf;@]17JK8Y=X-6jadFkhP&Pm!BM_V5^2";4rf.bbaka5M`R-(.YfU:ST8OH$L at b+8ooF+L@tPXD;1#E4r8-=[pR=e$G+bEb5#_?#*%X=#7NPSR at 9m4uOt]TcGCU`ASr1G%7dUF9c.OG"H6&(-N at AUQ3>_&u'<Zd$nS:s<&a$,l[@!$)iQT^C=ba`b?;]7Sp\iLs`!H`*E;glY]$aK_[g\Ko)cMa0kp4JqAo+m[P42'K'Td[uFMLsm*71&a_n;F.f/V7MCl>V3Bs)DFplR>g`iZ,KmlU0>NcB?d:891MkB2`BH"ZkfB_()<1Z]d"At_XBfL(Ju-JOE,^qN3;`je;gV"CE]El`enMhH7Xnf(H,6TK:dlWKH7+?:YnN:`C-aoEkkMo`LI`%`9*f]#Oh.t=YT5(,fP3VIPd!h9Dh80Eel?=/B<>`hl2eb"tML1/:1 at oRsW$0WtT<./"RdKgp%6,3P;2P_X]3Ci[]NQ8hN$aaL at R4aMo2Nde;J7R*"4r;V!uQ5+IPjnNi-[.1EmsXWHm*5!H&KDNXH0aoeh8 at b)cHV>e18*DO8iUAb(6?(1blTZmDH0'QW-5D$K-b"^GfQPh1C'Q^iV<:9Ks(oNe"(fH4#^u$Y7\&8]b!R8ti385:0ZTLk-Z2YK/Z-K*qJJn&RVoCgh1lq4L)mk5iPC6b=J,9%So!\38a]'=OHX!B4Yr"obIdH,!Zi)f9ml$$rpjl5gHD8R2C_C%^!=?Qdo9Z#Y1)?`97m/:kR0o?Ym0JSeG0rKLD"19dj,X-tMN0W%Klg9/^fN:jPZJbP8GtZt)h*rm/[(7kD3Ssa\B`5rqO:GV,'+h\.%O&a;l-Y"@a#bk&R5b&O!GY$%7)GmEK$rQ5bkP,aHO*G\mKcaa^?PY_HA%)R^.8e]KJ9YaOH?ELk/67!>06#%D-&]QCdpG`dI$jREt4df,MliPPosFF7kQg5gA=Cod<'aLJ+j+_K%O>:5(HYMO[M?Ee)M/d22Aq>S<Zu:I+6jKS%GS@<t+6D-pK+aAjrPRmnAH at +ln#9WS+BkecY6jsHtTKn!--YkMTCa0C(6eW"k\cY9iWG-mV)AK7r;24O'$FI"=fJp_fm'^`S0R[e`he&>!lYKB5dEOODH]Nc_-Ea'i%8mZdK7m?09`+P=6Q!ef:n^*]+GADC:3jGna(`R;_BWXZEQ.ml2rlc9$3#r%<^ph#N#TIcd"pZNZZ`M8B7bPSn&>AM\AtX@>-s:n8j=llq!.9K;V$-#'?h,e*.eD(#Co3`Tq755O\&9lXJ4iT))I'>k-IC\9DA at Nh?6qGc'XDMJ9+]5hY"B,[\LaGBb_4Wn)XPq at qh<DCCIi8$CO6<R;ZW!)21Tf:mMaJ^[]rcp!ZPr(oAqQQ-TON?#:Nc:O,br:.G5N+d]+i)O22fXcqNcXR0c5ukWrn.=O>)9D;VltAmYThPP)j=e8qtklD8msmE/Qtl?cM?]F1^.me<n""3s[r[9H4I-)NUlFW]Ios+1_@[amI3f62?__S<)ekuH"jMDh5V8eX at b+;&o2d3l>GbsQVVE6#dVQ"Hg+qa[b0eBl4hR$ZuKkd:Gi+G^+ZW['I'^s52*YsP;;!PJeRi!o`>;F$cZnF8(mV%C3lD$?$3H:MlZhc>n+hTGA)hUY6mjNXf/<t\9VI1+k*Yf3d\`#\&XoEX%?L:)Xl:V_p);NeTaa?&0I3>r9C4V0;?7ZN([%KNl`!>GeHn6KE;7Q<Y1MEm>MqK=nJ:1TeDP`_VEQ"Vk^.cMo4U&M at V=3ZB%-ekE"rID"J;Ic+AJD"VAf1WA07Sm"@5.th8dU;8-/\nXl0Mqh[FRlBUS4r;V$]OS*a=.1akH$K6dk5M%pJgd[+C"JBesnM$NasRJ,<Io+O08ulQB3Gh!7a$`>_%5BD6,N:+O5WSB[@r"oo]D8FT\?_Y4DpDMH'YiL]f!XOTKW3N_T+m:IK2'@ac5$-`V:gg^iP7_W"2@^):gfrN]*"K>jW[CtTqEQ(gr=>$(`5_q:q-5a)=&GUDr?`9@)d7Ug=9.cscr%YSr.:jDN,B)5T8L*Rge*t\^#8FiOBnVujhHa1[Foh$jHn[l_=^D((n'L9ceEGcdL.Oh%0N<D4V"=-#0JOW/&r2_>1&U,PY[R`a9\g]t1`%I:.&7/2;*a at J<`8Uq4=:YF9/GQ8:Z6_ at XS7#;J?TmQsl&#7R>e"mo0u*bGD,gE6-d9;D#p'B/O(h\1M>oM<Y_fC,2sVaACG]n9%h?@`%Fl!?9Fn9Zqdg,C3*XGPG7Kq\P(8dKoe3Xm8ToD&8X+i#@, at 5a8?-P+&M8"R4HUd_rS-c^H%)GWMlVh=:Kl$Y1F?$:/DDA,j8WaH:NmfUi]dCVkq]<u57_tQRK!Ej^](94btT9Wl)hZ\^,XsIFSG<E]BQgO57W/"Z'12i8\X"uFA`MG[t(B at pq>*_kk=7S6HleJ3<`C;AEmWY1pgGgj!<&i at qBK'.aK*0566X*qG7~>
+endstream
+endobj
+368 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 367 0 R
+>>
+endobj
+369 0 obj
+<< /Length 2511 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5D/U at P%/ui*@H:@F-*$Fa^7a]:Cb(SK)`B8"5-u=QT4OYGH^gg(C1'8T3k\E-\a?g>-q#+FOUimuP&KeB?G%^faVq9_pP4\"l?JGmf(*1Rg8'm5DGud9<qkG8h6X`mq<C!mB$k7cU"iR(k2a[KDfHRap)ei:DHfmn"RcXa%1pSH8-BK:`"W(L^+b.C/BAlXepRXR)*KlCHr!5[mn$lY4R^A\#hJF\)*;m1I.^ojs&MHc3J^"HM?Ic(%1br$36Kq9>0XdIIqH9_P%8<&StN+3F5FZ],-mb.UgT at V'?TiK,Y_-N!qU/5l]k^98bLdjpZX1.X^tk/^K98a,B\m5OeaC$oGTCDSD<=RG9f=[1\P,emJV:%IY`?b:/OkJI=[''Z`$c$)JF;,iIhLV:7)!YB)9<W'Y at h7_rbe%+A+;4NI0o1&ju=4-^`GDQQEDFD?(Ts'ncc(fb12>ST-=Fn/L0_?:lVQME1M;anHGF\t/PJ^OI;+-c;;h=FOHYAujG+JMHuos)U]0bi_e at FT6d'BZ"moI's675F)rJGo,NsP1A1DOI$hg=)h>B7c[!mdd1fH`A/XQb'\R!L]9Lpndf*Mp0?aqel\s\?acr\B(bLU)&Jm_XWX^cJj'1&8'F+NE>9?QIGR#Ni'R`]$/-!Pa^EY]%D.pJT$[t-jFI;:PhuHC)@UF=OTX;_:r#ES$r[OMglZ[/5;o<u`\pC.=t4^&5L(Q,a\Yl8e^g?]hhGt7,[bRh&,e]QKc#FQ)J;$V3Z\UZ>61sPVi^li$P at DcZ]5DOoLBVdmhTrgP8.e%>DcS)-&2T%`Qc8ZrPC+6)Y5AM1/TWrNt#)lSsGX+C-=`PIN0r9k1_-2]n*&"bD3:N#tc!(m+Y*VU)tGm6H"p(quA/8#hPjb,Y!*Q`j[>HAC8?BagRI%8*eB0NQp&?FW0NKCkE/2$JAOl%2bfW3*EJ%S01b1$Q2#=>B$:,p9mm4m0SL(b_Gj#Yj";l3/"Z>8&2%,- at s\`52_3Im`GGXMXb<E\+BY^:='0Uh<N]i\?]P[?C#c0oLO:(^atm:-u))R=k6u+qJ?\SG%o$eG1V]N2,U7%i8IbKTS4hXJE$b!RIGHTZ9q/imV%(fZM)_,=q'a3Z?=V*(l_5+G,ZQ:b]kCMMaH"^0Q;S\-e^38.[6:uZ%b(g*MaGp(X%hFj%0ZMN*d$'3m'S'FTZL_^T1k[h+rcCPVl9;I)GgKRr:E/TIo,8&kK%*$&8i(Dk_D&KsNj,WcO&&8ifZ)/S]:Y&Km!;9nb48S=GT4e;gp,C^A5fU;PLLUC!Gk\[+>N<kh\33(l3/PWN%m_E;P&0GI&L__>5/.H1YF#gh=YDn>:SpskF"7KP0_e+^9nC(`?:kO%rL"Zj)Tm4HP[jZuut#e(["6PG[:!q*q*R<#8p\2d8Widr"1i-']DW2cd6?i%t3-&=%e at Zi5$JLu:oQotn[]bHt7:Z9I%Kn>ZZ`TGO((@3=Z'OMl=YKD'9i*4HT$qjdj,sZW'n=)C=rd?EO(s']P%Tqj4`7G5[(t;+&Cok=o?k@,jV?"rXE4Z4Rc_iRRgR at 7bjO;aR1niYZTcWDOEHP)J>Y9C%p<t.Kp._6I;HqXIo\db,#e=V_>&FQ4W?=NrV0am=F'qAu.9f4LBi>*dG'2*KR'<LEot\p9i9C^iXf6,KJG_rQHD&XY-[T&@.,/-b at -dnc`b6VkSA<6f#P6]=oeaL/7"dQ)1:X.cGUN^J#FYmZGe48UTO>tMl+lZD!DQnG6<E;M/j*:qjrG>Bj[TqX[06,2Dd^h:El=NgTZYrXYeFSNU-,3%O)iDK<<j;\kV`[hF;#J\3(2Lag_8<.]m,aCOrWRZmb^SZlb7e=pfSnp8uE,u[Uh31"!MG1eJAt at eQ)dGY[Y*QDX1Co\DNgD0$^)=.7du`.l1]"YL>J"&m]AIF$U249D'!Bko'1l,nOd at JA.Wm@Q0)IHt#?^i.-qRq6>3ZYVR#7a>7Z2dZc<nR]9T9\P?ARpesCBCI2Bam6lB;1J8(&<6(nJgdRhFP'$*MZ^7(Zp9Kr\iQ8;nBV'Q]Nfn^,lg`9mabDXf)F=H+KO'(@$umT?kQ4eiW<\;_@';+Jh0c.Dcb'A.rq[?%f,RrE`+VN1X=FgRGG541UF+&0;G[!P?aK0H.O]2he!9+hK\E/o))d&J(<Qdco(m+"a4B*f;)A[`=Cs%Z=i!"dL47CnW0H,je-`Fia[Ak5h\V7Cnc\/G^_":Zg$_GYP_n\@*.o2\ID^4smP)GrULpf;$jrrg`j!+m[RB"2YcV6:DXDsg)a+O=D/pD\]2.[`*/8XB>"eAI&CUF/BRWE#_oDdCCV2b]/$SYk0kig0jqVkTo#%S5#*0sdFg,]fbK,;DP[b)>VfD0STdml/b0lECN6TCs).^\0"@-Dn_u7P]lM!:JEh8q5Q'_*Sp0*In=WK,D\[]=[`$4*MTC9L,=LAl8Z.Y@^b2RGZRt;?M"KNJ&+(CFSbY9p_,%d*#b!'T@[SG3I!scu.<CPj]r<'lmisu~>
+endstream
+endobj
+370 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 369 0 R
+>>
+endobj
+371 0 obj
+<< /Length 3057 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=.?]WsO&V&\6 at H:u5e>l]WAD)a45^'=sEt8G3o-"W=+)$M>fZ9d;9']]S+2/G%8.N1NP&'X*q3d`j%YsY2g;j0JqiA]?>pZPjrcknUSF4hE9)h['AYu_QPpL.TfUiu[I!aehQ1OG"iZThLq/6e=BPUDDJXs=AZli<Ic-DpUP%CJfY)T at u_F:',V_24\>!c;r;kiEf8!kBiUa546NTa-HKHA.L';+]LEh+JjYUf$rFEo,rFYACg*sSa0P3k47fd6)&s'"c=$#R9,VTu'2^d`$9Y#_T&9Bbd**&P`u*]lMRgUaG\Gmt:8SuX$oIZ0U!'dAN:PMXIoI?A"FOSof3/CMT[V*eu]0[W?Ffg1X\U=NVk_ at +umm])UE7)c`4T6$e^He)ZY at Ifp+qj/gGIl7E>6bKlCh:HiY1Rp\KI-8"eDKs3o_'%K<;P7+.E+&X$&"WtK0HMl))gK'gaJ4u78:H-g"/O7?mujabK\K?:WM6HIZ0!P+ckErDW)#c<3;)Xd&G_ST7]hdX%U=qMA7sip8/Q7gm*'U?1"L[:N7F!W>.jmFF.jtO^FGFa!V8Nhm[KJ%L^3_L(QU\45LNo%9.qMqdac:KfTjQr#L))OBj5D][VM9"8-S51%n2NV+0;k-Qu8H)7"q8h2N.BJ(.FXU<fe;u.(J+La_&$:D&6gEKS0_/JB*affJ=&#i6i0AFs6hV*C7MB$2t*<%Y7f<J`-j`&.q![]ED&j]QRZ=,pE+8Mtke3&!<Gk-8cZ_k'6KWZhfsE5Ec(3oRbO+,"^oO(W4]DQ8EX/[.jln4OJOC;s at Ca>cHc9[P./c1 at 8d61)3sNp':C^4$;5.BHZ;[Ugf37j%2?9'TX"q,4RM[NrTXRViX$!;\S]7o!Su>oP1CF_n$MbP7[[4c)P>G at p8WB6/OU,Me(kq,+YlY4q+\hcRY\KS.!a"<\\YbR5q$!-U)5'CT`<=>5LTkRj1DNKQeF1r%+IKkD4NNe,X2!JLf^?SBZ*Bm$84pS\D-FCH^+fROmt&rZNLQpYbEp&gr&!B at .=T$4^]KYk_bJ,-/,XLq`YZW at ZYj*6Kcrf'1'ck.kpE\Wm$C:r4L:_ulV;QQn;Am++I1!p[uIPm=oel:M1aGd$`"f`S?=M9;%E``RM\=+lR4RgI\9["MuW<*6hYJH*nF?!P[q[X=Ee.o(J),=Gk8DUsRf#4-K(XEF3#dB$).-o;2p]d$^!r0[Q102/30I^hi\[IaEs&3+u&2\E5oJ<;trBAi"bpF=`-1=`$A4Y\7/^n$mK,5lWVnM"bUc-"_Rik1#/F(]@q)38NCD;sg;3dh"GfP).??^;bJE^/,Tir.e,#_=\<c%.#P3tpm/L5&BDeLJq,7$c865o87VB.,Li'D62YAVaumKWT7qH+GT3QM_MjYFW>ORT,X5-)oM%WID1OWB=SR*ZU(]n\hVOkm=RBN56SfiJ5I>SNI'i"3+,iO\H-A9BS4-%-Do;%9^]l/?&M/9Qu#87_8b6N/O5Z+N+Cj>d?B^K=P7n,$(1=<:cM.f;6,;G#5M5=4MKg!]%@SP=`TCM/K1aZJLIuQm,6CD8@=_8\aDf9O[di)9#N]D#[eh.ZCbb&5J]]OsAcb5tt]HJd6n,iuQ(+rf/QOh5F#'eQtCPKPbDPpqf,5e?f,G]cLq%/X&<9K1`!MDW[B%Q;j2DgaD2^VHK6s;A>FJSjhB6a(o.LAsQNYJ,8^O?2)OSLjc]hqJE*%ag,hsR6SX$#5h9.lg?.\^64RrN!.sCD=PRE4$OtAX^F.R"-#!WY0Mp%V6gU-q;KBorTS[2i*(?;--H%Q/dT^m/Tn)?/e>-15j74:DXk<ucUU3C(*O'-otYq9JI5aqJC=EK4`tJl9B&NV[?.We![p#8,l$j)NY2p/Wj,AZ[R(_LdL at XpP(:t8n:G42C-jb+ at h.VFEpgq[]8a-G[V4u9PAJLD``%F9^%"'oID<_r.%,_h%On>U@=2\c=):P2^_-t[',U0"at>U'\Y5b09N8HRKRZ?KA.8Z*cT]Q`\n/;sZE9G,p+ at E((p]7$-f*X(nd#CL;@Eq*,]-fe'Xk5=O'#aDKW?f>*)F7/-H$im"E[%K0H&8l.4$M'mRIQiC1sQSb?M!i%XL=3/lKr[G?L=qK.:l6Dq?h`H&Dak/;d$\(d'1\nib1Df1qEDg$?R4RgZQ3mBkZ$gZ\!kS%%$_6JCUG2DkUYDP?5]$7^$4f2H`1bdB#9:fi)Vf*+]X"tQ:HZ[9#/r>R72GW\NZVc6&FU=\)39B"SLePN4!ElDi0Pi\;hi9M"AP-`W6P^i*PF]On:r`Q[(2WY,bP?Hf=md=](aB"e+Y\Ws>@-[QUM(Y_UB[mgI(U=t*]&OqKNs_,LV,0=?+ua8F6_FH)ZY2A<g6NF;q`pG$V5!,(pZC"]C?*@TE>X&jc+IAYfo4&$m5c]#iqR1sf%+1Rof\eB;peuirW/OdJ;4Y8p#<c&&"/oooJ?bDUms[X<3i.eS:lX9cB at .4qNJTnL4ZT5O8(jJ_)(DS%s!LsIT*no=*2H?-OuY]UZ6=N7JdsXGWW)^7TuVE7"1J*\Zq,K*1Wp^VWU'pY3\UU'LCCDGXR=UQM%[#Ej/2+?@[rs"FI[u[JW6X%,)NJo\.4<f+7m+q+CL#ES*C%>Q/H!8b3\%Z$BKg3b+^-42V>2?jpa4%k&OWE&,ut5TRp>>msb963-LpL6;$,7WKWUVj_%pIB1iY*;GiM!PX!?;L!Xo&lIlZ5g`Y&KUV.6^sAVHb\S)Bk'YOn)MQ*Yr&/&[N<li$p[OZ,I.Di)VHjo!9?X6sHRl>rXj"1ul[5&[7C]U8d17I;+7'2M#./b`,eIa[=k7(%`mNHn3;"bh9g+\UIkPbYFU;e!9V8^"*HnpG`sZNSK"/-1)#+jI%ah#7GimBfp0,fuK^9'UJXge\GUeVNH6!1gLq`4rC#Li[ALSk8iNN!;K[ASdaC"[cs"T#>!IqYBVb*T:gaU"?oVgr2j4urf*r"&(Gi\kIm*EAJ4#Qc>.!5qJij=;$q4(<#Xr9$C,8lJF]7n=?7]fCfZcBP^>-E#L=m5]=8$.Z.BCnDD#t6T~>
+endstream
+endobj
+372 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 371 0 R
+/Annots 373 0 R
+>>
+endobj
+373 0 obj
+[
+374 0 R
+]
+endobj
+374 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 677.0 114.23 667.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://public.perforce.com:8080/@md=d&cd=//public/jam/src/&ra=s&c=kVu@//2614?ac=10)
+/S /URI >>
+/H /I
+>>
+endobj
+375 0 obj
+<< /Length 1427 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`S9on$e&A at sB#WZ`%RkaT<7?F1#AqBSNTWN-j76sS2`C;%O8m9:6od*%!*::no1%9m8baE_rc4!2RLWtUpbene7pC?:sn!uAhgT)Fi&mr`nlm&$FLW4\PlRshYP+Ge-;u,9sp("hdj_.\d'QN3//;P(QEiA5LDs(a6MS-QQju&:.EtV6o%VS?QEqkb_Ac8f"3T1I0\e>Po_)B_am)3T=,];9a,FloYPFO.h<t7"$FQfB_*r%6'#QM$*X]`qq)lR=IpNV]l6!MJ>b&_1@*9hG!rC*[fn)d=\-QH8FIX:0F:Ms;krp@%EcYe$([5arWrW3W-bPN5-`^u&,)B+V@,#>St-BqJtBLuQR2_r0NLgh(Q6QX6$V1DZ"<;n<""7%EalphSW'-%6X(Cm$>?U5?:8L<K3'=C`F<;%et>@=k5(Pbu0Jc,[IB)JOnJk;F*6;BIMUjoD/#)#VmJHf+#dP-)4M_jePZ69^Q3D_WXk,)s^-YW;pE+1Jb^Uhql<U2W7X^b'I>ErR\g?F7bY;g<5P+/O3GYkq!*Lu*kOu!nPeTWNg at 7+GY#dCJ)#:]XL2Or]1;93.VaVAh"<J<pN[!)48e`([q+!1Ch1%h*U-rf"mE!K!,l1W8L9U2S,_k, at QAi&o8,WS^r_Ee53OJ6,G'-%p`2/R0D)1dX-=Wclpg"aI!D)Ras\8jG8<?<:g%i+>1]J$"GNR:Dt3I2FfaUnZ&KX34&-]^Nc$D<f66MC+Q#\0*2n\XM1P*19UFN6s?5OE(X6L',N]$XoEgN6lJ'HeMDUe3g+AgO6eI(VKLdB39qpFqEM5.JK.LL_Vo77".EFsZ,ST!u37ABK#1(Jhuun"L&05`T:RRrcuaU18/_FS+bh>#Cb9hZ9gDYGI7ZN);:d\cLWSA/5HTCFUJ89aOt,-m:*^bo?!OCY4h`(S^^CZtu$/[k"p)A90"^@nTabc>Ut;T#V6AD%R`6&@g2SoX'k`UtSOe`QW*d"ub2\\TJPEQ7\4aD%,Hnr?#!ekkce#j$cN2ao432Fs"cI^K!B^J-$]C%'XV,lDi(**E/jEU3,gfe(UUT"]KLo[[kjP8_uA1/4P)sE2AK^rl+tdXGGnjb#dNk/;>&s4T]Yoj`LG0]!cB3 at al4`^EiV6#Bd0O"IbpEkYZU5r!kju&VE1"Q4hlQ1HDTS!)D[o)Qqs`TAj7Ahu^8:qRr6\0ri&_cRCHK]^9.mk0$7<Tc'S1DS\"-RUF$.(%>@gQfXU^_5Tg5 at .uV.gCR57Y56qYe,42FI1U8A)YP9#0E"Y1jXP]O*ekQ^dWMh$F[<+OQc%tCnZ0l]2hY:]>(j.%_Y7dkWE4!:fK:.V:Z4m4cCZ#i8lFrLj![cC^\UEF&>JL<__c+t6biD8d)mm3K]G1>TVAj$688sM at pEM'5MbVZ8%2#'>#nM[%/g^'\;?=~>
+endstream
+endobj
+376 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 375 0 R
+>>
+endobj
+379 0 obj
+<<
+ /Title (\376\377\0\120\0\141\0\162\0\164\0\240\0\111\0\56\0\240\0\102\0\157\0\157\0\163\0\164\0\56\0\102\0\165\0\151\0\154\0\144\0\40\0\166\0\62\0\40\0\125\0\163\0\145\0\162\0\40\0\115\0\141\0\156\0\165\0\141\0\154)
+ /Parent 377 0 R
+ /Next 381 0 R
+ /A 378 0 R
+>> endobj
+381 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 377 0 R
+ /Prev 379 0 R
+ /Next 382 0 R
+ /A 380 0 R
+>> endobj
+382 0 obj
+<<
+ /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\165\0\163\0\145\0\40\0\164\0\150\0\151\0\163\0\40\0\144\0\157\0\143\0\165\0\155\0\145\0\156\0\164)
+ /Parent 377 0 R
+ /Prev 381 0 R
+ /Next 383 0 R
+ /A 11 0 R
+>> endobj
+383 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\163\0\164\0\141\0\154\0\154\0\141\0\164\0\151\0\157\0\156)
+ /Parent 377 0 R
+ /Prev 382 0 R
+ /Next 384 0 R
+ /A 13 0 R
+>> endobj
+384 0 obj
+<<
+ /Title (\376\377\0\124\0\165\0\164\0\157\0\162\0\151\0\141\0\154)
+ /Parent 377 0 R
+ /First 385 0 R
+ /Last 395 0 R
+ /Prev 383 0 R
+ /Next 396 0 R
+ /Count -9
+ /A 15 0 R
+>> endobj
+385 0 obj
+<<
+ /Title (\376\377\0\110\0\145\0\154\0\154\0\157\0\54\0\40\0\167\0\157\0\162\0\154\0\144)
+ /Parent 384 0 R
+ /Next 386 0 R
+ /A 17 0 R
+>> endobj
+386 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 384 0 R
+ /First 388 0 R
+ /Last 390 0 R
+ /Prev 385 0 R
+ /Next 391 0 R
+ /Count -2
+ /A 19 0 R
+>> endobj
+388 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\163\0\40\0\141\0\156\0\144\0\40\0\124\0\141\0\162\0\147\0\145\0\164\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 386 0 R
+ /Next 390 0 R
+ /A 387 0 R
+>> endobj
+390 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\152\0\145\0\143\0\164\0\40\0\101\0\164\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\163)
+ /Parent 386 0 R
+ /Prev 388 0 R
+ /A 389 0 R
+>> endobj
+391 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\152\0\145\0\143\0\164\0\40\0\110\0\151\0\145\0\162\0\141\0\162\0\143\0\150\0\151\0\145\0\163)
+ /Parent 384 0 R
+ /Prev 386 0 R
+ /Next 392 0 R
+ /A 21 0 R
+>> endobj
+392 0 obj
+<<
+ /Title (\376\377\0\104\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\164\0\40\0\124\0\141\0\162\0\147\0\145\0\164\0\163)
+ /Parent 384 0 R
+ /Prev 391 0 R
+ /Next 393 0 R
+ /A 23 0 R
+>> endobj
+393 0 obj
+<<
+ /Title (\376\377\0\123\0\164\0\141\0\164\0\151\0\143\0\40\0\141\0\156\0\144\0\40\0\163\0\150\0\141\0\162\0\145\0\144\0\40\0\154\0\151\0\142\0\141\0\162\0\151\0\145\0\163)
+ /Parent 384 0 R
+ /Prev 392 0 R
+ /Next 394 0 R
+ /A 25 0 R
+>> endobj
+394 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163\0\40\0\141\0\156\0\144\0\40\0\141\0\154\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\166\0\145\0\163)
+ /Parent 384 0 R
+ /Prev 393 0 R
+ /Next 395 0 R
+ /A 27 0 R
+>> endobj
+395 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\145\0\142\0\165\0\151\0\154\0\164\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\163)
+ /Parent 384 0 R
+ /Prev 394 0 R
+ /A 29 0 R
+>> endobj
+396 0 obj
+<<
+ /Title (\376\377\0\125\0\163\0\145\0\162\0\40\0\144\0\157\0\143\0\165\0\155\0\145\0\156\0\164\0\141\0\164\0\151\0\157\0\156)
+ /Parent 377 0 R
+ /First 397 0 R
+ /Last 421 0 R
+ /Prev 384 0 R
+ /Next 428 0 R
+ /Count -21
+ /A 31 0 R
+>> endobj
+397 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156)
+ /Parent 396 0 R
+ /Next 398 0 R
+ /A 33 0 R
+>> endobj
+398 0 obj
+<<
+ /Title (\376\377\0\127\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\163)
+ /Parent 396 0 R
+ /First 400 0 R
+ /Last 403 0 R
+ /Prev 397 0 R
+ /Next 404 0 R
+ /Count -4
+ /A 35 0 R
+>> endobj
+400 0 obj
+<<
+ /Title (\376\377\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167)
+ /Parent 398 0 R
+ /Next 401 0 R
+ /A 399 0 R
+>> endobj
+401 0 obj
+<<
+ /Title (\376\377\0\115\0\141\0\151\0\156\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\163)
+ /Parent 398 0 R
+ /Prev 400 0 R
+ /Next 402 0 R
+ /A 185 0 R
+>> endobj
+402 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\152\0\145\0\143\0\164\0\163)
+ /Parent 398 0 R
+ /Prev 401 0 R
+ /Next 403 0 R
+ /A 144 0 R
+>> endobj
+403 0 obj
+<<
+ /Title (\376\377\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\40\0\125\0\164\0\151\0\154\0\151\0\164\0\171\0\40\0\122\0\165\0\154\0\145\0\163)
+ /Parent 398 0 R
+ /Prev 402 0 R
+ /A 188 0 R
+>> endobj
+404 0 obj
+<<
+ /Title (\376\377\0\124\0\150\0\145\0\40\0\102\0\165\0\151\0\154\0\144\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163)
+ /Parent 396 0 R
+ /First 406 0 R
+ /Last 410 0 R
+ /Prev 398 0 R
+ /Next 411 0 R
+ /Count -3
+ /A 37 0 R
+>> endobj
+406 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\162\0\145\0\161\0\165\0\145\0\163\0\164)
+ /Parent 404 0 R
+ /Next 408 0 R
+ /A 405 0 R
+>> endobj
+408 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\151\0\156\0\147\0\40\0\141\0\40\0\155\0\141\0\151\0\156\0\40\0\164\0\141\0\162\0\147\0\145\0\164)
+ /Parent 404 0 R
+ /Prev 406 0 R
+ /Next 410 0 R
+ /A 407 0 R
+>> endobj
+410 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\151\0\156\0\147\0\40\0\141\0\40\0\160\0\162\0\157\0\152\0\145\0\143\0\164)
+ /Parent 404 0 R
+ /Prev 408 0 R
+ /A 409 0 R
+>> endobj
+411 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\164\0\151\0\156\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\40\0\164\0\171\0\160\0\145\0\163)
+ /Parent 396 0 R
+ /First 413 0 R
+ /Last 419 0 R
+ /Prev 404 0 R
+ /Next 420 0 R
+ /Count -5
+ /A 39 0 R
+>> endobj
+413 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\147\0\162\0\141\0\155\0\163)
+ /Parent 411 0 R
+ /Next 415 0 R
+ /A 412 0 R
+>> endobj
+415 0 obj
+<<
+ /Title (\376\377\0\114\0\151\0\142\0\162\0\141\0\162\0\151\0\145\0\163)
+ /Parent 411 0 R
+ /Prev 413 0 R
+ /Next 416 0 R
+ /A 414 0 R
+>> endobj
+416 0 obj
+<<
+ /Title (\376\377\0\101\0\154\0\151\0\141\0\163)
+ /Parent 411 0 R
+ /Prev 415 0 R
+ /Next 417 0 R
+ /A 158 0 R
+>> endobj
+417 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\163\0\164\0\141\0\154\0\154\0\151\0\156\0\147)
+ /Parent 411 0 R
+ /Prev 416 0 R
+ /Next 419 0 R
+ /A 242 0 R
+>> endobj
+419 0 obj
+<<
+ /Title (\376\377\0\124\0\145\0\163\0\164\0\151\0\156\0\147)
+ /Parent 411 0 R
+ /Prev 417 0 R
+ /A 418 0 R
+>> endobj
+420 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\164\0\151\0\156\0\40\0\146\0\145\0\141\0\164\0\165\0\162\0\145\0\163)
+ /Parent 396 0 R
+ /Prev 411 0 R
+ /Next 421 0 R
+ /A 41 0 R
+>> endobj
+421 0 obj
+<<
+ /Title (\376\377\0\104\0\151\0\146\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163\0\40\0\164\0\157\0\40\0\102\0\157\0\157\0\163\0\164\0\56\0\102\0\165\0\151\0\154\0\144\0\40\0\126\0\61)
+ /Parent 396 0 R
+ /First 423 0 R
+ /Last 427 0 R
+ /Prev 420 0 R
+ /Count -3
+ /A 43 0 R
+>> endobj
+423 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156)
+ /Parent 421 0 R
+ /Next 425 0 R
+ /A 422 0 R
+>> endobj
+425 0 obj
+<<
+ /Title (\376\377\0\127\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\163)
+ /Parent 421 0 R
+ /Prev 423 0 R
+ /Next 427 0 R
+ /A 424 0 R
+>> endobj
+427 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\160\0\162\0\157\0\143\0\145\0\163\0\163)
+ /Parent 421 0 R
+ /Prev 425 0 R
+ /A 426 0 R
+>> endobj
+428 0 obj
+<<
+ /Title (\376\377\0\105\0\170\0\164\0\145\0\156\0\144\0\145\0\162\0\40\0\115\0\141\0\156\0\165\0\141\0\154)
+ /Parent 377 0 R
+ /First 429 0 R
+ /Last 436 0 R
+ /Prev 396 0 R
+ /Next 437 0 R
+ /Count -7
+ /A 45 0 R
+>> endobj
+429 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 428 0 R
+ /Next 430 0 R
+ /A 47 0 R
+>> endobj
+430 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\40\0\164\0\171\0\160\0\145\0\163)
+ /Parent 428 0 R
+ /First 432 0 R
+ /Last 432 0 R
+ /Prev 429 0 R
+ /Next 433 0 R
+ /Count -1
+ /A 49 0 R
+>> endobj
+432 0 obj
+<<
+ /Title (\376\377\0\123\0\143\0\141\0\156\0\156\0\145\0\162\0\163)
+ /Parent 430 0 R
+ /A 431 0 R
+>> endobj
+433 0 obj
+<<
+ /Title (\376\377\0\124\0\157\0\157\0\154\0\163\0\40\0\141\0\156\0\144\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162\0\163)
+ /Parent 428 0 R
+ /Prev 430 0 R
+ /Next 434 0 R
+ /A 51 0 R
+>> endobj
+434 0 obj
+<<
+ /Title (\376\377\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\163)
+ /Parent 428 0 R
+ /Prev 433 0 R
+ /Next 435 0 R
+ /A 53 0 R
+>> endobj
+435 0 obj
+<<
+ /Title (\376\377\0\115\0\141\0\151\0\156\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\40\0\162\0\165\0\154\0\145\0\163)
+ /Parent 428 0 R
+ /Prev 434 0 R
+ /Next 436 0 R
+ /A 55 0 R
+>> endobj
+436 0 obj
+<<
+ /Title (\376\377\0\124\0\157\0\157\0\154\0\163\0\145\0\164\0\40\0\155\0\157\0\144\0\165\0\154\0\145\0\163)
+ /Parent 428 0 R
+ /Prev 435 0 R
+ /A 57 0 R
+>> endobj
+437 0 obj
+<<
+ /Title (\376\377\0\104\0\145\0\164\0\141\0\151\0\154\0\145\0\144\0\40\0\162\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145)
+ /Parent 377 0 R
+ /First 438 0 R
+ /Last 463 0 R
+ /Prev 428 0 R
+ /Next 474 0 R
+ /Count -25
+ /A 59 0 R
+>> endobj
+438 0 obj
+<<
+ /Title (\376\377\0\107\0\145\0\156\0\145\0\162\0\141\0\154\0\40\0\151\0\156\0\146\0\157\0\162\0\155\0\141\0\164\0\151\0\157\0\156)
+ /Parent 437 0 R
+ /First 439 0 R
+ /Last 440 0 R
+ /Next 444 0 R
+ /Count -4
+ /A 61 0 R
+>> endobj
+439 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156)
+ /Parent 438 0 R
+ /Next 440 0 R
+ /A 170 0 R
+>> endobj
+440 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\155\0\155\0\141\0\156\0\144\0\40\0\154\0\151\0\156\0\145)
+ /Parent 438 0 R
+ /First 442 0 R
+ /Last 443 0 R
+ /Prev 439 0 R
+ /Count -2
+ /A 110 0 R
+>> endobj
+442 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\155\0\155\0\141\0\156\0\144\0\40\0\154\0\151\0\156\0\145\0\40\0\141\0\162\0\147\0\165\0\155\0\145\0\156\0\164\0\163)
+ /Parent 440 0 R
+ /Next 443 0 R
+ /A 441 0 R
+>> endobj
+443 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\155\0\155\0\141\0\156\0\144\0\40\0\154\0\151\0\156\0\145\0\40\0\157\0\160\0\164\0\151\0\157\0\156\0\163)
+ /Parent 440 0 R
+ /Prev 442 0 R
+ /A 318 0 R
+>> endobj
+444 0 obj
+<<
+ /Title (\376\377\0\127\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\163)
+ /Parent 437 0 R
+ /First 446 0 R
+ /Last 446 0 R
+ /Prev 438 0 R
+ /Next 447 0 R
+ /Count -1
+ /A 63 0 R
+>> endobj
+446 0 obj
+<<
+ /Title (\376\377\0\107\0\145\0\156\0\145\0\162\0\141\0\164\0\145\0\144\0\40\0\150\0\145\0\141\0\144\0\145\0\162\0\163)
+ /Parent 444 0 R
+ /A 445 0 R
+>> endobj
+447 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\160\0\162\0\157\0\143\0\145\0\163\0\163)
+ /Parent 437 0 R
+ /First 449 0 R
+ /Last 451 0 R
+ /Prev 444 0 R
+ /Next 452 0 R
+ /Count -2
+ /A 65 0 R
+>> endobj
+449 0 obj
+<<
+ /Title (\376\377\0\101\0\154\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\166\0\145\0\40\0\163\0\145\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 447 0 R
+ /Next 451 0 R
+ /A 448 0 R
+>> endobj
+451 0 obj
+<<
+ /Title (\376\377\0\104\0\145\0\164\0\145\0\162\0\155\0\151\0\156\0\151\0\156\0\147\0\40\0\143\0\157\0\155\0\155\0\157\0\156\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 447 0 R
+ /Prev 449 0 R
+ /A 450 0 R
+>> endobj
+452 0 obj
+<<
+ /Title (\376\377\0\104\0\145\0\146\0\151\0\156\0\151\0\164\0\151\0\157\0\156\0\163)
+ /Parent 437 0 R
+ /First 453 0 R
+ /Last 462 0 R
+ /Prev 447 0 R
+ /Next 463 0 R
+ /Count -8
+ /A 67 0 R
+>> endobj
+453 0 obj
+<<
+ /Title (\376\377\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 452 0 R
+ /First 455 0 R
+ /Last 458 0 R
+ /Next 459 0 R
+ /Count -3
+ /A 136 0 R
+>> endobj
+455 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\151\0\144\0\151\0\164\0\171)
+ /Parent 453 0 R
+ /Next 456 0 R
+ /A 454 0 R
+>> endobj
+456 0 obj
+<<
+ /Title (\376\377\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\40\0\101\0\164\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\163)
+ /Parent 453 0 R
+ /Prev 455 0 R
+ /Next 458 0 R
+ /A 139 0 R
+>> endobj
+458 0 obj
+<<
+ /Title (\376\377\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\40\0\104\0\145\0\143\0\154\0\141\0\162\0\141\0\164\0\151\0\157\0\156)
+ /Parent 453 0 R
+ /Prev 456 0 R
+ /A 457 0 R
+>> endobj
+459 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\126\0\141\0\162\0\151\0\141\0\156\0\164\0\163)
+ /Parent 452 0 R
+ /Prev 453 0 R
+ /Next 460 0 R
+ /A 337 0 R
+>> endobj
+460 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\162\0\145\0\146\0\151\0\156\0\145\0\155\0\145\0\156\0\164)
+ /Parent 452 0 R
+ /Prev 459 0 R
+ /Next 461 0 R
+ /A 232 0 R
+>> endobj
+461 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 452 0 R
+ /Prev 460 0 R
+ /Next 462 0 R
+ /A 203 0 R
+>> endobj
+462 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\40\0\151\0\144\0\145\0\156\0\164\0\151\0\146\0\151\0\145\0\162\0\163\0\40\0\141\0\156\0\144\0\40\0\162\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 452 0 R
+ /Prev 461 0 R
+ /A 200 0 R
+>> endobj
+463 0 obj
+<<
+ /Title (\376\377\0\107\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162\0\163)
+ /Parent 437 0 R
+ /First 465 0 R
+ /Last 473 0 R
+ /Prev 452 0 R
+ /Count -5
+ /A 69 0 R
+>> endobj
+465 0 obj
+<<
+ /Title (\376\377\0\123\0\145\0\154\0\145\0\143\0\164\0\151\0\156\0\147\0\40\0\141\0\156\0\144\0\40\0\162\0\141\0\156\0\153\0\151\0\156\0\147\0\40\0\166\0\151\0\141\0\142\0\154\0\145\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162\0\163)
+ /Parent 463 0 R
+ /Next 467 0 R
+ /A 464 0 R
+>> endobj
+467 0 obj
+<<
+ /Title (\376\377\0\122\0\165\0\156\0\156\0\151\0\156\0\147\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162\0\163)
+ /Parent 463 0 R
+ /Prev 465 0 R
+ /Next 469 0 R
+ /A 466 0 R
+>> endobj
+469 0 obj
+<<
+ /Title (\376\377\0\123\0\145\0\154\0\145\0\143\0\164\0\151\0\156\0\147\0\40\0\144\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\171\0\40\0\147\0\162\0\141\0\160\0\150)
+ /Parent 463 0 R
+ /Prev 467 0 R
+ /Next 471 0 R
+ /A 468 0 R
+>> endobj
+471 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\144\0\152\0\165\0\163\0\164\0\155\0\145\0\156\0\164)
+ /Parent 463 0 R
+ /Prev 469 0 R
+ /Next 473 0 R
+ /A 470 0 R
+>> endobj
+473 0 obj
+<<
+ /Title (\376\377\0\124\0\162\0\141\0\156\0\163\0\146\0\157\0\162\0\155\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\143\0\141\0\143\0\150\0\145)
+ /Parent 463 0 R
+ /Prev 471 0 R
+ /A 472 0 R
+>> endobj
+474 0 obj
+<<
+ /Title (\376\377\0\106\0\162\0\145\0\161\0\165\0\145\0\156\0\164\0\154\0\171\0\40\0\101\0\163\0\153\0\145\0\144\0\40\0\121\0\165\0\145\0\163\0\164\0\151\0\157\0\156\0\163)
+ /Parent 377 0 R
+ /First 475 0 R
+ /Last 483 0 R
+ /Prev 437 0 R
+ /Next 484 0 R
+ /Count -9
+ /A 71 0 R
+>> endobj
+475 0 obj
+<<
+ /Title (\376\377\0\111\0\47\0\155\0\40\0\147\0\145\0\164\0\164\0\151\0\156\0\147\0\40\0\42\0\104\0\165\0\160\0\154\0\151\0\143\0\141\0\164\0\145\0\40\0\156\0\141\0\155\0\145\0\40\0\157\0\146\0\40\0\141\0\143\0\164\0\165\0\141\0\154\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\42\0\40\0\145\0\162\0\162\0\157\0\162\0\56\0\40\0\127\0\150\0\141\0\164\0\40\0\144\0\157\0\145\0\163\0\40\0\151\0\164\0\40\0\155\0\145\0\141\0\156\0\77)
+ /Parent 474 0 R
+ /Next 476 0 R
+ /A 73 0 R
+>> endobj
+476 0 obj
+<<
+ /Title (\376\377\0\101\0\143\0\143\0\145\0\163\0\163\0\151\0\156\0\147\0\40\0\145\0\156\0\166\0\151\0\162\0\157\0\156\0\155\0\145\0\156\0\164\0\40\0\166\0\141\0\162\0\151\0\141\0\142\0\154\0\145\0\163)
+ /Parent 474 0 R
+ /Prev 475 0 R
+ /Next 477 0 R
+ /A 75 0 R
+>> endobj
+477 0 obj
+<<
+ /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\40\0\157\0\162\0\144\0\145\0\162\0\77)
+ /Parent 474 0 R
+ /Prev 476 0 R
+ /Next 478 0 R
+ /A 77 0 R
+>> endobj
+478 0 obj
+<<
+ /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\164\0\150\0\145\0\40\0\154\0\151\0\142\0\162\0\141\0\162\0\171\0\40\0\157\0\162\0\144\0\145\0\162\0\40\0\157\0\156\0\40\0\125\0\156\0\151\0\170\0\77)
+ /Parent 474 0 R
+ /Prev 477 0 R
+ /Next 479 0 R
+ /A 79 0 R
+>> endobj
+479 0 obj
+<<
+ /Title (\376\377\0\103\0\141\0\156\0\40\0\111\0\40\0\147\0\145\0\164\0\40\0\157\0\165\0\164\0\160\0\165\0\164\0\40\0\157\0\146\0\40\0\145\0\170\0\164\0\145\0\162\0\156\0\141\0\154\0\40\0\160\0\162\0\157\0\147\0\162\0\141\0\155\0\40\0\141\0\163\0\40\0\141\0\40\0\166\0\141\0\162\0\151\0\141\0\142\0\154\0\145\0\40\0\151\0\156\0\40\0\141\0\40\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\77)
+ /Parent 474 0 R
+ /Prev 478 0 R
+ /Next 480 0 R
+ /A 81 0 R
+>> endobj
+480 0 obj
+<<
+ /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\147\0\145\0\164\0\40\0\164\0\150\0\145\0\40\0\160\0\162\0\157\0\152\0\145\0\143\0\164\0\55\0\162\0\157\0\157\0\164\0\40\0\154\0\157\0\143\0\141\0\164\0\151\0\157\0\156\0\77)
+ /Parent 474 0 R
+ /Prev 479 0 R
+ /Next 481 0 R
+ /A 83 0 R
+>> endobj
+481 0 obj
+<<
+ /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\143\0\150\0\141\0\156\0\147\0\145\0\40\0\143\0\157\0\155\0\160\0\151\0\154\0\141\0\164\0\151\0\157\0\156\0\40\0\146\0\154\0\141\0\147\0\163\0\40\0\146\0\157\0\162\0\40\0\157\0\156\0\145\0\40\0\146\0\151\0\154\0\145\0\77)
+ /Parent 474 0 R
+ /Prev 480 0 R
+ /Next 482 0 R
+ /A 85 0 R
+>> endobj
+482 0 obj
+<<
+ /Title (\376\377\0\127\0\150\0\171\0\40\0\141\0\162\0\145\0\40\0\164\0\150\0\145\0\40\0\144\0\154\0\154\0\55\0\160\0\141\0\164\0\150\0\40\0\141\0\156\0\144\0\40\0\150\0\141\0\162\0\144\0\143\0\157\0\144\0\145\0\55\0\144\0\154\0\154\0\55\0\160\0\141\0\164\0\150\0\163\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\40\0\165\0\163\0\145\0\146\0\165\0\154\0\77)
+ /Parent 474 0 R
+ /Prev 481 0 R
+ /Next 483 0 R
+ /A 87 0 R
+>> endobj
+483 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\163\0\40\0\151\0\156\0\40\0\163\0\151\0\164\0\145\0\55\0\143\0\157\0\156\0\146\0\151\0\147\0\56\0\152\0\141\0\155)
+ /Parent 474 0 R
+ /Prev 482 0 R
+ /A 89 0 R
+>> endobj
+484 0 obj
+<<
+ /Title (\376\377\0\101\0\160\0\160\0\145\0\156\0\144\0\151\0\170\0\240\0\101\0\56\0\240\0\102\0\157\0\157\0\163\0\164\0\56\0\102\0\165\0\151\0\154\0\144\0\40\0\166\0\62\0\40\0\141\0\162\0\143\0\150\0\151\0\164\0\145\0\143\0\164\0\165\0\162\0\145)
+ /Parent 377 0 R
+ /First 485 0 R
+ /Last 494 0 R
+ /Prev 474 0 R
+ /Count -15
+ /A 91 0 R
+>> endobj
+485 0 obj
+<<
+ /Title (\376\377\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167)
+ /Parent 484 0 R
+ /Next 486 0 R
+ /A 93 0 R
+>> endobj
+486 0 obj
+<<
+ /Title (\376\377\0\124\0\150\0\145\0\40\0\142\0\165\0\151\0\154\0\144\0\40\0\154\0\141\0\171\0\145\0\162)
+ /Parent 484 0 R
+ /First 488 0 R
+ /Last 492 0 R
+ /Prev 485 0 R
+ /Next 493 0 R
+ /Count -3
+ /A 95 0 R
+>> endobj
+488 0 obj
+<<
+ /Title (\376\377\0\115\0\145\0\164\0\141\0\164\0\141\0\162\0\147\0\145\0\164\0\163)
+ /Parent 486 0 R
+ /Next 490 0 R
+ /A 487 0 R
+>> endobj
+490 0 obj
+<<
+ /Title (\376\377\0\126\0\151\0\162\0\164\0\165\0\141\0\154\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\163)
+ /Parent 486 0 R
+ /Prev 488 0 R
+ /Next 492 0 R
+ /A 489 0 R
+>> endobj
+492 0 obj
+<<
+ /Title ()
+ /Parent 486 0 R
+ /Prev 490 0 R
+ /A 491 0 R
+>> endobj
+493 0 obj
+<<
+ /Title (\376\377\0\124\0\150\0\145\0\40\0\164\0\157\0\157\0\154\0\163\0\40\0\154\0\141\0\171\0\145\0\162)
+ /Parent 484 0 R
+ /Prev 486 0 R
+ /Next 494 0 R
+ /A 97 0 R
+>> endobj
+494 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\163)
+ /Parent 484 0 R
+ /First 496 0 R
+ /Last 496 0 R
+ /Prev 493 0 R
+ /Count -8
+ /A 99 0 R
+>> endobj
+496 0 obj
+<<
+ /Title (\376\377\0\104\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\171\0\40\0\163\0\143\0\141\0\156\0\156\0\151\0\156\0\147)
+ /Parent 494 0 R
+ /First 498 0 R
+ /Last 504 0 R
+ /Count -7
+ /A 495 0 R
+>> endobj
+498 0 obj
+<<
+ /Title (\376\377\0\123\0\165\0\160\0\160\0\157\0\162\0\164\0\40\0\146\0\157\0\162\0\40\0\144\0\151\0\146\0\146\0\145\0\162\0\145\0\156\0\164\0\40\0\163\0\143\0\141\0\156\0\156\0\151\0\156\0\147\0\40\0\141\0\154\0\147\0\157\0\162\0\151\0\164\0\150\0\155\0\163)
+ /Parent 496 0 R
+ /Next 500 0 R
+ /A 497 0 R
+>> endobj
+500 0 obj
+<<
+ /Title (\376\377\0\101\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\164\0\157\0\40\0\163\0\143\0\141\0\156\0\40\0\164\0\150\0\145\0\40\0\163\0\141\0\155\0\145\0\40\0\146\0\151\0\154\0\145\0\40\0\163\0\145\0\166\0\145\0\162\0\141\0\154\0\40\0\164\0\151\0\155\0\145\0\163)
+ /Parent 496 0 R
+ /Prev 498 0 R
+ /Next 502 0 R
+ /A 499 0 R
+>> endobj
+502 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\40\0\144\0\145\0\164\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\144\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\151\0\145\0\163\0\40\0\157\0\156\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\145\0\144\0\40\0\146\0\151\0\154\0\145\0\163\0\56)
+ /Parent 496 0 R
+ /Prev 500 0 R
+ /Next 504 0 R
+ /A 501 0 R
+>> endobj
+504 0 obj
+<<
+ /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\40\0\144\0\145\0\164\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\144\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\151\0\145\0\163\0\40\0\146\0\162\0\157\0\155\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\145\0\144\0\40\0\146\0\151\0\154\0\145\0\163)
+ /Parent 496 0 R
+ /First 506 0 R
+ /Last 510 0 R
+ /Prev 502 0 R
+ /Count -3
+ /A 503 0 R
+>> endobj
+506 0 obj
+<<
+ /Title (\376\377\0\106\0\151\0\154\0\145\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\163)
+ /Parent 504 0 R
+ /First 508 0 R
+ /Last 508 0 R
+ /Next 510 0 R
+ /Count -1
+ /A 505 0 R
+>> endobj
+508 0 obj
+<<
+ /Title (\376\377\0\124\0\171\0\160\0\145\0\163)
+ /Parent 506 0 R
+ /A 507 0 R
+>> endobj
+510 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\40\0\160\0\141\0\164\0\150\0\163)
+ /Parent 504 0 R
+ /Prev 506 0 R
+ /A 509 0 R
+>> endobj
+511 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F3
+/BaseFont /Helvetica-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+512 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+513 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F10
+/BaseFont /Courier-Oblique
+/Encoding /WinAnsiEncoding >>
+endobj
+514 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+515 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding >>
+endobj
+516 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F11
+/BaseFont /Courier-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+517 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+518 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 57
+/Kids [6 0 R 8 0 R 101 0 R 114 0 R 127 0 R 131 0 R 133 0 R 141 0 R 147 0 R 149 0 R 155 0 R 160 0 R 164 0 R 180 0 R 182 0 R 192 0 R 205 0 R 210 0 R 216 0 R 227 0 R 237 0 R 245 0 R 249 0 R 257 0 R 265 0 R 272 0 R 281 0 R 283 0 R 290 0 R 294 0 R 296 0 R 298 0 R 303 0 R 307 0 R 309 0 R 311 0 R 313 0 R 315 0 R 321 0 R 323 0 R 327 0 R 332 0 R 339 0 R 341 0 R 343 0 R 345 0 R 349 0 R 354 0 R 356 0 R 360 0 R 362 0 R 364 0 R 366 0 R 368 0 R 370 0 R 372 0 R 376 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 377 0 R
+ /PageMode /UseOutlines
+ >>
+endobj
+3 0 obj
+<< 
+/Font << /F3 511 0 R /F5 512 0 R /F10 513 0 R /F1 515 0 R /F6 514 0 R /F9 517 0 R /F11 516 0 R /F7 518 0 R >> 
+/ProcSet [ /PDF /ImageC /Text ] >> 
+endobj
+11 0 obj
+<<
+/S /GoTo
+/D [101 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+13 0 obj
+<<
+/S /GoTo
+/D [114 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [131 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [131 0 R /XYZ 67.0 687.009 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [131 0 R /XYZ 67.0 241.503 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [141 0 R /XYZ 67.0 684.14 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [147 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [149 0 R /XYZ 67.0 502.846 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [155 0 R /XYZ 67.0 434.852 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [155 0 R /XYZ 67.0 142.786 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [164 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [164 0 R /XYZ 67.0 328.009 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [182 0 R /XYZ 67.0 652.28 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [216 0 R /XYZ 67.0 401.548 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [227 0 R /XYZ 67.0 114.542 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [257 0 R /XYZ 67.0 378.267 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [265 0 R /XYZ 67.0 138.42 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [281 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+47 0 obj
+<<
+/S /GoTo
+/D [281 0 R /XYZ 67.0 687.009 null]
+>>
+endobj
+49 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 632.28 null]
+>>
+endobj
+51 0 obj
+<<
+/S /GoTo
+/D [290 0 R /XYZ 67.0 436.4 null]
+>>
+endobj
+53 0 obj
+<<
+/S /GoTo
+/D [298 0 R /XYZ 67.0 714.0 null]
+>>
+endobj
+55 0 obj
+<<
+/S /GoTo
+/D [307 0 R /XYZ 67.0 328.521 null]
+>>
+endobj
+57 0 obj
+<<
+/S /GoTo
+/D [309 0 R /XYZ 67.0 479.26 null]
+>>
+endobj
+59 0 obj
+<<
+/S /GoTo
+/D [313 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+61 0 obj
+<<
+/S /GoTo
+/D [313 0 R /XYZ 67.0 687.009 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [321 0 R /XYZ 67.0 426.069 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [321 0 R /XYZ 67.0 120.724 null]
+>>
+endobj
+67 0 obj
+<<
+/S /GoTo
+/D [327 0 R /XYZ 67.0 580.56 null]
+>>
+endobj
+69 0 obj
+<<
+/S /GoTo
+/D [343 0 R /XYZ 67.0 663.28 null]
+>>
+endobj
+71 0 obj
+<<
+/S /GoTo
+/D [349 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+73 0 obj
+<<
+/S /GoTo
+/D [349 0 R /XYZ 67.0 687.009 null]
+>>
+endobj
+75 0 obj
+<<
+/S /GoTo
+/D [349 0 R /XYZ 67.0 199.037 null]
+>>
+endobj
+77 0 obj
+<<
+/S /GoTo
+/D [354 0 R /XYZ 67.0 665.56 null]
+>>
+endobj
+79 0 obj
+<<
+/S /GoTo
+/D [354 0 R /XYZ 67.0 433.794 null]
+>>
+endobj
+81 0 obj
+<<
+/S /GoTo
+/D [354 0 R /XYZ 67.0 162.448 null]
+>>
+endobj
+83 0 obj
+<<
+/S /GoTo
+/D [356 0 R /XYZ 67.0 549.98 null]
+>>
+endobj
+85 0 obj
+<<
+/S /GoTo
+/D [356 0 R /XYZ 67.0 433.934 null]
+>>
+endobj
+87 0 obj
+<<
+/S /GoTo
+/D [356 0 R /XYZ 67.0 197.868 null]
+>>
+endobj
+89 0 obj
+<<
+/S /GoTo
+/D [360 0 R /XYZ 67.0 383.42 null]
+>>
+endobj
+91 0 obj
+<<
+/S /GoTo
+/D [362 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+93 0 obj
+<<
+/S /GoTo
+/D [362 0 R /XYZ 67.0 604.018 null]
+>>
+endobj
+95 0 obj
+<<
+/S /GoTo
+/D [362 0 R /XYZ 67.0 505.692 null]
+>>
+endobj
+97 0 obj
+<<
+/S /GoTo
+/D [366 0 R /XYZ 67.0 639.0 null]
+>>
+endobj
+99 0 obj
+<<
+/S /GoTo
+/D [366 0 R /XYZ 67.0 584.674 null]
+>>
+endobj
+110 0 obj
+<<
+/S /GoTo
+/D [315 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+136 0 obj
+<<
+/S /GoTo
+/D [327 0 R /XYZ 67.0 547.234 null]
+>>
+endobj
+139 0 obj
+<<
+/S /GoTo
+/D [327 0 R /XYZ 67.0 170.596 null]
+>>
+endobj
+144 0 obj
+<<
+/S /GoTo
+/D [205 0 R /XYZ 67.0 371.12 null]
+>>
+endobj
+152 0 obj
+<<
+/S /GoTo
+/D [341 0 R /XYZ 67.0 196.801 null]
+>>
+endobj
+158 0 obj
+<<
+/S /GoTo
+/D [245 0 R /XYZ 67.0 251.692 null]
+>>
+endobj
+168 0 obj
+<<
+/S /GoTo
+/D [321 0 R /XYZ 67.0 582.819 null]
+>>
+endobj
+170 0 obj
+<<
+/S /GoTo
+/D [313 0 R /XYZ 67.0 653.683 null]
+>>
+endobj
+178 0 obj
+<<
+/S /GoTo
+/D [313 0 R /XYZ 67.0 340.804 null]
+>>
+endobj
+185 0 obj
+<<
+/S /GoTo
+/D [182 0 R /XYZ 67.0 442.515 null]
+>>
+endobj
+188 0 obj
+<<
+/S /GoTo
+/D [210 0 R /XYZ 67.0 111.824 null]
+>>
+endobj
+195 0 obj
+<<
+/S /GoTo
+/D [210 0 R /XYZ 67.0 652.0 null]
+>>
+endobj
+200 0 obj
+<<
+/S /GoTo
+/D [341 0 R /XYZ 67.0 624.56 null]
+>>
+endobj
+203 0 obj
+<<
+/S /GoTo
+/D [339 0 R /XYZ 67.0 250.203 null]
+>>
+endobj
+214 0 obj
+<<
+/S /GoTo
+/D [null /XYZ 0.0 0.0 null]
+>>
+endobj
+221 0 obj
+<<
+/S /GoTo
+/D [null /XYZ 0.0 0.0 null]
+>>
+endobj
+223 0 obj
+<<
+/S /GoTo
+/D [null /XYZ 0.0 0.0 null]
+>>
+endobj
+232 0 obj
+<<
+/S /GoTo
+/D [339 0 R /XYZ 67.0 373.642 null]
+>>
+endobj
+235 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 608.0 null]
+>>
+endobj
+240 0 obj
+<<
+/S /GoTo
+/D [182 0 R /XYZ 67.0 349.076 null]
+>>
+endobj
+242 0 obj
+<<
+/S /GoTo
+/D [249 0 R /XYZ 67.0 521.12 null]
+>>
+endobj
+255 0 obj
+<<
+/S /GoTo
+/D [265 0 R /XYZ 67.0 419.42 null]
+>>
+endobj
+262 0 obj
+<<
+/S /GoTo
+/D [265 0 R /XYZ 67.0 484.42 null]
+>>
+endobj
+278 0 obj
+<<
+/S /GoTo
+/D [265 0 R /XYZ 67.0 612.42 null]
+>>
+endobj
+288 0 obj
+<<
+/S /GoTo
+/D [307 0 R /XYZ 67.0 253.195 null]
+>>
+endobj
+318 0 obj
+<<
+/S /GoTo
+/D [321 0 R /XYZ 67.0 714.0 null]
+>>
+endobj
+330 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 533.0 null]
+>>
+endobj
+335 0 obj
+<<
+/S /GoTo
+/D [182 0 R /XYZ 67.0 403.076 null]
+>>
+endobj
+337 0 obj
+<<
+/S /GoTo
+/D [339 0 R /XYZ 67.0 479.081 null]
+>>
+endobj
+377 0 obj
+<<
+ /First 379 0 R
+ /Last 484 0 R
+>> endobj
+378 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+380 0 obj
+<<
+/S /GoTo
+/D [8 0 R /XYZ 67.0 715.0 null]
+>>
+endobj
+387 0 obj
+<<
+/S /GoTo
+/D [133 0 R /XYZ 67.0 519.56 null]
+>>
+endobj
+389 0 obj
+<<
+/S /GoTo
+/D [133 0 R /XYZ 67.0 243.687 null]
+>>
+endobj
+399 0 obj
+<<
+/S /GoTo
+/D [182 0 R /XYZ 67.0 618.954 null]
+>>
+endobj
+405 0 obj
+<<
+/S /GoTo
+/D [216 0 R /XYZ 67.0 224.088 null]
+>>
+endobj
+407 0 obj
+<<
+/S /GoTo
+/D [227 0 R /XYZ 67.0 684.14 null]
+>>
+endobj
+409 0 obj
+<<
+/S /GoTo
+/D [227 0 R /XYZ 67.0 290.701 null]
+>>
+endobj
+412 0 obj
+<<
+/S /GoTo
+/D [237 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+414 0 obj
+<<
+/S /GoTo
+/D [237 0 R /XYZ 67.0 522.987 null]
+>>
+endobj
+418 0 obj
+<<
+/S /GoTo
+/D [257 0 R /XYZ 67.0 554.426 null]
+>>
+endobj
+422 0 obj
+<<
+/S /GoTo
+/D [272 0 R /XYZ 67.0 704.0 null]
+>>
+endobj
+424 0 obj
+<<
+/S /GoTo
+/D [272 0 R /XYZ 67.0 620.561 null]
+>>
+endobj
+426 0 obj
+<<
+/S /GoTo
+/D [272 0 R /XYZ 67.0 317.682 null]
+>>
+endobj
+431 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 210.934 null]
+>>
+endobj
+441 0 obj
+<<
+/S /GoTo
+/D [315 0 R /XYZ 67.0 601.561 null]
+>>
+endobj
+445 0 obj
+<<
+/S /GoTo
+/D [321 0 R /XYZ 67.0 371.743 null]
+>>
+endobj
+448 0 obj
+<<
+/S /GoTo
+/D [323 0 R /XYZ 67.0 505.0 null]
+>>
+endobj
+450 0 obj
+<<
+/S /GoTo
+/D [323 0 R /XYZ 67.0 327.561 null]
+>>
+endobj
+454 0 obj
+<<
+/S /GoTo
+/D [327 0 R /XYZ 67.0 250.795 null]
+>>
+endobj
+457 0 obj
+<<
+/S /GoTo
+/D [339 0 R /XYZ 67.0 577.0 null]
+>>
+endobj
+464 0 obj
+<<
+/S /GoTo
+/D [343 0 R /XYZ 67.0 442.82 null]
+>>
+endobj
+466 0 obj
+<<
+/S /GoTo
+/D [343 0 R /XYZ 67.0 200.381 null]
+>>
+endobj
+468 0 obj
+<<
+/S /GoTo
+/D [345 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+470 0 obj
+<<
+/S /GoTo
+/D [345 0 R /XYZ 67.0 609.561 null]
+>>
+endobj
+472 0 obj
+<<
+/S /GoTo
+/D [345 0 R /XYZ 67.0 323.122 null]
+>>
+endobj
+487 0 obj
+<<
+/S /GoTo
+/D [362 0 R /XYZ 67.0 123.366 null]
+>>
+endobj
+489 0 obj
+<<
+/S /GoTo
+/D [364 0 R /XYZ 67.0 334.42 null]
+>>
+endobj
+491 0 obj
+<<
+/S /GoTo
+/D [366 0 R /XYZ 67.0 704.0 null]
+>>
+endobj
+495 0 obj
+<<
+/S /GoTo
+/D [366 0 R /XYZ 67.0 399.348 null]
+>>
+endobj
+497 0 obj
+<<
+/S /GoTo
+/D [366 0 R /XYZ 67.0 211.909 null]
+>>
+endobj
+499 0 obj
+<<
+/S /GoTo
+/D [366 0 R /XYZ 67.0 153.71 null]
+>>
+endobj
+501 0 obj
+<<
+/S /GoTo
+/D [368 0 R /XYZ 67.0 517.98 null]
+>>
+endobj
+503 0 obj
+<<
+/S /GoTo
+/D [370 0 R /XYZ 67.0 180.66 null]
+>>
+endobj
+505 0 obj
+<<
+/S /GoTo
+/D [372 0 R /XYZ 67.0 208.406 null]
+>>
+endobj
+507 0 obj
+<<
+/S /GoTo
+/D [372 0 R /XYZ 67.0 130.906 null]
+>>
+endobj
+509 0 obj
+<<
+/S /GoTo
+/D [376 0 R /XYZ 67.0 703.0 null]
+>>
+endobj
+xref
+0 519
+0000000000 65535 f 
+0000206879 00000 n 
+0000207384 00000 n 
+0000207477 00000 n 
+0000000015 00000 n 
+0000000071 00000 n 
+0000000399 00000 n 
+0000000505 00000 n 
+0000002747 00000 n 
+0000002867 00000 n 
+0000003201 00000 n 
+0000207643 00000 n 
+0000003336 00000 n 
+0000207708 00000 n 
+0000003470 00000 n 
+0000207773 00000 n 
+0000003605 00000 n 
+0000207838 00000 n 
+0000003740 00000 n 
+0000207905 00000 n 
+0000003875 00000 n 
+0000207972 00000 n 
+0000004010 00000 n 
+0000208038 00000 n 
+0000004145 00000 n 
+0000208103 00000 n 
+0000004280 00000 n 
+0000208170 00000 n 
+0000004415 00000 n 
+0000208237 00000 n 
+0000004550 00000 n 
+0000208304 00000 n 
+0000004685 00000 n 
+0000208369 00000 n 
+0000004820 00000 n 
+0000208436 00000 n 
+0000004955 00000 n 
+0000208502 00000 n 
+0000005090 00000 n 
+0000208569 00000 n 
+0000005225 00000 n 
+0000208636 00000 n 
+0000005360 00000 n 
+0000208703 00000 n 
+0000005495 00000 n 
+0000208769 00000 n 
+0000005630 00000 n 
+0000208834 00000 n 
+0000005765 00000 n 
+0000208901 00000 n 
+0000005900 00000 n 
+0000208967 00000 n 
+0000006035 00000 n 
+0000209032 00000 n 
+0000006170 00000 n 
+0000209097 00000 n 
+0000006305 00000 n 
+0000209164 00000 n 
+0000006440 00000 n 
+0000209230 00000 n 
+0000006575 00000 n 
+0000209295 00000 n 
+0000006710 00000 n 
+0000209362 00000 n 
+0000006845 00000 n 
+0000209429 00000 n 
+0000006980 00000 n 
+0000209496 00000 n 
+0000007114 00000 n 
+0000209562 00000 n 
+0000007249 00000 n 
+0000209628 00000 n 
+0000007384 00000 n 
+0000209693 00000 n 
+0000007519 00000 n 
+0000209760 00000 n 
+0000007654 00000 n 
+0000209827 00000 n 
+0000007789 00000 n 
+0000209893 00000 n 
+0000007924 00000 n 
+0000209960 00000 n 
+0000008059 00000 n 
+0000210027 00000 n 
+0000008194 00000 n 
+0000210093 00000 n 
+0000008329 00000 n 
+0000210160 00000 n 
+0000008464 00000 n 
+0000210227 00000 n 
+0000008599 00000 n 
+0000210293 00000 n 
+0000008734 00000 n 
+0000210358 00000 n 
+0000008869 00000 n 
+0000210425 00000 n 
+0000009003 00000 n 
+0000210492 00000 n 
+0000009138 00000 n 
+0000210557 00000 n 
+0000009273 00000 n 
+0000010375 00000 n 
+0000010501 00000 n 
+0000010594 00000 n 
+0000010732 00000 n 
+0000010870 00000 n 
+0000011008 00000 n 
+0000011146 00000 n 
+0000011281 00000 n 
+0000011421 00000 n 
+0000210624 00000 n 
+0000011562 00000 n 
+0000011699 00000 n 
+0000011902 00000 n 
+0000015314 00000 n 
+0000015440 00000 n 
+0000015541 00000 n 
+0000015768 00000 n 
+0000015964 00000 n 
+0000016187 00000 n 
+0000016414 00000 n 
+0000016637 00000 n 
+0000016828 00000 n 
+0000017019 00000 n 
+0000017249 00000 n 
+0000017454 00000 n 
+0000017655 00000 n 
+0000018314 00000 n 
+0000018440 00000 n 
+0000018469 00000 n 
+0000018637 00000 n 
+0000021291 00000 n 
+0000021401 00000 n 
+0000024426 00000 n 
+0000024552 00000 n 
+0000024597 00000 n 
+0000210690 00000 n 
+0000024734 00000 n 
+0000024874 00000 n 
+0000210758 00000 n 
+0000025008 00000 n 
+0000028010 00000 n 
+0000028136 00000 n 
+0000028173 00000 n 
+0000210826 00000 n 
+0000028308 00000 n 
+0000028443 00000 n 
+0000031575 00000 n 
+0000031685 00000 n 
+0000034542 00000 n 
+0000034668 00000 n 
+0000034705 00000 n 
+0000210893 00000 n 
+0000034841 00000 n 
+0000034976 00000 n 
+0000038333 00000 n 
+0000038459 00000 n 
+0000038488 00000 n 
+0000210961 00000 n 
+0000038624 00000 n 
+0000040663 00000 n 
+0000040789 00000 n 
+0000040818 00000 n 
+0000040952 00000 n 
+0000043981 00000 n 
+0000044107 00000 n 
+0000044208 00000 n 
+0000044348 00000 n 
+0000211029 00000 n 
+0000044487 00000 n 
+0000211097 00000 n 
+0000044628 00000 n 
+0000044765 00000 n 
+0000044901 00000 n 
+0000045036 00000 n 
+0000045172 00000 n 
+0000045393 00000 n 
+0000045595 00000 n 
+0000211165 00000 n 
+0000045736 00000 n 
+0000048550 00000 n 
+0000048660 00000 n 
+0000051127 00000 n 
+0000051253 00000 n 
+0000051314 00000 n 
+0000211233 00000 n 
+0000051451 00000 n 
+0000051588 00000 n 
+0000211301 00000 n 
+0000051725 00000 n 
+0000051865 00000 n 
+0000052003 00000 n 
+0000055027 00000 n 
+0000055153 00000 n 
+0000055230 00000 n 
+0000211369 00000 n 
+0000055367 00000 n 
+0000055506 00000 n 
+0000055673 00000 n 
+0000055811 00000 n 
+0000211435 00000 n 
+0000055950 00000 n 
+0000056085 00000 n 
+0000211502 00000 n 
+0000056222 00000 n 
+0000059184 00000 n 
+0000059310 00000 n 
+0000059347 00000 n 
+0000059481 00000 n 
+0000059618 00000 n 
+0000063153 00000 n 
+0000063279 00000 n 
+0000063316 00000 n 
+0000063457 00000 n 
+0000211570 00000 n 
+0000063596 00000 n 
+0000066530 00000 n 
+0000066656 00000 n 
+0000066725 00000 n 
+0000066862 00000 n 
+0000066999 00000 n 
+0000211630 00000 n 
+0000067136 00000 n 
+0000211690 00000 n 
+0000067272 00000 n 
+0000067411 00000 n 
+0000067546 00000 n 
+0000070645 00000 n 
+0000070771 00000 n 
+0000070832 00000 n 
+0000070969 00000 n 
+0000071107 00000 n 
+0000211750 00000 n 
+0000071248 00000 n 
+0000071389 00000 n 
+0000211818 00000 n 
+0000071530 00000 n 
+0000074700 00000 n 
+0000074826 00000 n 
+0000074871 00000 n 
+0000211884 00000 n 
+0000075010 00000 n 
+0000211952 00000 n 
+0000075148 00000 n 
+0000075287 00000 n 
+0000078032 00000 n 
+0000078158 00000 n 
+0000078187 00000 n 
+0000078326 00000 n 
+0000080936 00000 n 
+0000081062 00000 n 
+0000081115 00000 n 
+0000081253 00000 n 
+0000081392 00000 n 
+0000081530 00000 n 
+0000212019 00000 n 
+0000081671 00000 n 
+0000084262 00000 n 
+0000084388 00000 n 
+0000084441 00000 n 
+0000084575 00000 n 
+0000084710 00000 n 
+0000212086 00000 n 
+0000084847 00000 n 
+0000084985 00000 n 
+0000088281 00000 n 
+0000088407 00000 n 
+0000088460 00000 n 
+0000088598 00000 n 
+0000088733 00000 n 
+0000088869 00000 n 
+0000089007 00000 n 
+0000091786 00000 n 
+0000091912 00000 n 
+0000091973 00000 n 
+0000092111 00000 n 
+0000092250 00000 n 
+0000092385 00000 n 
+0000212153 00000 n 
+0000092526 00000 n 
+0000092664 00000 n 
+0000095418 00000 n 
+0000095528 00000 n 
+0000098390 00000 n 
+0000098516 00000 n 
+0000098561 00000 n 
+0000098754 00000 n 
+0000098892 00000 n 
+0000212220 00000 n 
+0000099031 00000 n 
+0000102230 00000 n 
+0000102356 00000 n 
+0000102385 00000 n 
+0000102523 00000 n 
+0000105782 00000 n 
+0000105892 00000 n 
+0000108324 00000 n 
+0000108434 00000 n 
+0000111669 00000 n 
+0000111795 00000 n 
+0000111832 00000 n 
+0000111972 00000 n 
+0000112108 00000 n 
+0000114554 00000 n 
+0000114680 00000 n 
+0000114709 00000 n 
+0000114842 00000 n 
+0000117501 00000 n 
+0000117611 00000 n 
+0000120708 00000 n 
+0000120818 00000 n 
+0000121917 00000 n 
+0000122027 00000 n 
+0000124356 00000 n 
+0000124466 00000 n 
+0000126512 00000 n 
+0000126638 00000 n 
+0000126675 00000 n 
+0000212288 00000 n 
+0000126814 00000 n 
+0000126953 00000 n 
+0000129743 00000 n 
+0000129853 00000 n 
+0000132204 00000 n 
+0000132330 00000 n 
+0000132359 00000 n 
+0000132495 00000 n 
+0000136017 00000 n 
+0000136143 00000 n 
+0000136172 00000 n 
+0000212354 00000 n 
+0000136312 00000 n 
+0000139639 00000 n 
+0000139765 00000 n 
+0000139802 00000 n 
+0000212420 00000 n 
+0000139939 00000 n 
+0000212488 00000 n 
+0000140076 00000 n 
+0000142781 00000 n 
+0000142891 00000 n 
+0000144678 00000 n 
+0000144788 00000 n 
+0000148264 00000 n 
+0000148374 00000 n 
+0000151279 00000 n 
+0000151405 00000 n 
+0000151434 00000 n 
+0000151633 00000 n 
+0000154082 00000 n 
+0000154208 00000 n 
+0000154245 00000 n 
+0000154385 00000 n 
+0000154521 00000 n 
+0000157215 00000 n 
+0000157325 00000 n 
+0000159841 00000 n 
+0000159967 00000 n 
+0000159996 00000 n 
+0000160134 00000 n 
+0000163374 00000 n 
+0000163484 00000 n 
+0000166158 00000 n 
+0000166268 00000 n 
+0000169785 00000 n 
+0000169895 00000 n 
+0000173246 00000 n 
+0000173356 00000 n 
+0000176361 00000 n 
+0000176471 00000 n 
+0000179076 00000 n 
+0000179186 00000 n 
+0000182337 00000 n 
+0000182463 00000 n 
+0000182492 00000 n 
+0000182721 00000 n 
+0000184242 00000 n 
+0000212556 00000 n 
+0000212610 00000 n 
+0000184352 00000 n 
+0000212674 00000 n 
+0000184636 00000 n 
+0000184837 00000 n 
+0000185077 00000 n 
+0000185249 00000 n 
+0000185439 00000 n 
+0000185594 00000 n 
+0000212738 00000 n 
+0000185796 00000 n 
+0000212805 00000 n 
+0000186106 00000 n 
+0000186299 00000 n 
+0000186512 00000 n 
+0000186713 00000 n 
+0000186966 00000 n 
+0000187226 00000 n 
+0000187406 00000 n 
+0000187656 00000 n 
+0000187819 00000 n 
+0000212873 00000 n 
+0000188056 00000 n 
+0000188190 00000 n 
+0000188362 00000 n 
+0000188511 00000 n 
+0000188721 00000 n 
+0000212941 00000 n 
+0000188963 00000 n 
+0000213009 00000 n 
+0000189126 00000 n 
+0000213076 00000 n 
+0000189356 00000 n 
+0000189548 00000 n 
+0000213144 00000 n 
+0000189808 00000 n 
+0000213210 00000 n 
+0000189942 00000 n 
+0000190097 00000 n 
+0000190228 00000 n 
+0000213278 00000 n 
+0000190389 00000 n 
+0000190517 00000 n 
+0000190712 00000 n 
+0000213346 00000 n 
+0000191008 00000 n 
+0000213412 00000 n 
+0000191172 00000 n 
+0000213480 00000 n 
+0000191368 00000 n 
+0000191531 00000 n 
+0000191762 00000 n 
+0000191919 00000 n 
+0000213548 00000 n 
+0000192132 00000 n 
+0000192251 00000 n 
+0000192469 00000 n 
+0000192617 00000 n 
+0000192817 00000 n 
+0000192991 00000 n 
+0000193241 00000 n 
+0000193481 00000 n 
+0000193651 00000 n 
+0000213616 00000 n 
+0000193850 00000 n 
+0000194066 00000 n 
+0000194270 00000 n 
+0000213684 00000 n 
+0000194507 00000 n 
+0000194679 00000 n 
+0000213752 00000 n 
+0000194898 00000 n 
+0000213818 00000 n 
+0000195109 00000 n 
+0000195367 00000 n 
+0000195575 00000 n 
+0000213886 00000 n 
+0000195839 00000 n 
+0000196026 00000 n 
+0000213954 00000 n 
+0000196234 00000 n 
+0000196433 00000 n 
+0000196617 00000 n 
+0000196831 00000 n 
+0000197063 00000 n 
+0000197344 00000 n 
+0000214020 00000 n 
+0000197531 00000 n 
+0000214087 00000 n 
+0000197847 00000 n 
+0000214155 00000 n 
+0000198055 00000 n 
+0000214221 00000 n 
+0000198310 00000 n 
+0000214289 00000 n 
+0000198524 00000 n 
+0000198735 00000 n 
+0000199031 00000 n 
+0000199526 00000 n 
+0000199810 00000 n 
+0000200097 00000 n 
+0000200435 00000 n 
+0000200906 00000 n 
+0000201221 00000 n 
+0000201583 00000 n 
+0000202044 00000 n 
+0000202281 00000 n 
+0000202638 00000 n 
+0000202771 00000 n 
+0000214357 00000 n 
+0000203001 00000 n 
+0000214425 00000 n 
+0000203153 00000 n 
+0000214492 00000 n 
+0000203343 00000 n 
+0000203421 00000 n 
+0000203609 00000 n 
+0000214558 00000 n 
+0000203778 00000 n 
+0000214626 00000 n 
+0000204004 00000 n 
+0000214694 00000 n 
+0000204332 00000 n 
+0000214761 00000 n 
+0000204684 00000 n 
+0000214828 00000 n 
+0000205090 00000 n 
+0000214895 00000 n 
+0000205530 00000 n 
+0000214963 00000 n 
+0000205729 00000 n 
+0000215031 00000 n 
+0000205830 00000 n 
+0000205987 00000 n 
+0000206101 00000 n 
+0000206212 00000 n 
+0000206328 00000 n 
+0000206440 00000 n 
+0000206549 00000 n 
+0000206662 00000 n 
+0000206769 00000 n 
+trailer
+<<
+/Size 519
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+215097
+%%EOF


Property changes on: boost-build/branches/upstream/current/example/customization/inline_file.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/example/gettext/Jamfile
===================================================================
--- boost-build/branches/upstream/current/example/gettext/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/gettext/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -17,6 +17,6 @@
 # location gettext expects.
 stage messages-russian : russian
     : <location>messages/ru_RU.KOI8-R/LC_MESSAGES 
-      <name>main
+      <name>main.mo
     ;
 

Deleted: boost-build/branches/upstream/current/example/hello/Jamfile
===================================================================
--- boost-build/branches/upstream/current/example/hello/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/hello/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,2 +0,0 @@
-
-exe hello : hello.cpp ;

Added: boost-build/branches/upstream/current/example/hello/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/hello/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/hello/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,2 @@
+
+exe hello : hello.cpp ;

Deleted: boost-build/branches/upstream/current/example/hello/project-root.jam
===================================================================
--- boost-build/branches/upstream/current/example/hello/project-root.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/hello/project-root.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,2 +0,0 @@
-
-

Deleted: boost-build/branches/upstream/current/example/libraries/Jamfile
===================================================================
--- boost-build/branches/upstream/current/example/libraries/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/libraries/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,2 +0,0 @@
-
-build-project app ;
\ No newline at end of file

Added: boost-build/branches/upstream/current/example/libraries/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/libraries/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/libraries/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,4 @@
+
+use-project /library-example/foo : util/foo ;
+
+build-project app ;

Modified: boost-build/branches/upstream/current/example/libraries/app/Jamfile
===================================================================
--- boost-build/branches/upstream/current/example/libraries/app/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/libraries/app/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -2,4 +2,4 @@
 # Declare a executable file, which uses a library. Note that
 # includes that for library will be automatically used
 # when compiling 'app.cpp'
-exe app : app.cpp ../lib1//lib1 ; 
\ No newline at end of file
+exe app : app.cpp /library-example/foo//bar ;
\ No newline at end of file

Deleted: boost-build/branches/upstream/current/example/libraries/project-root.jam
===================================================================

Added: boost-build/branches/upstream/current/example/libraries/util/foo/Jamfile
===================================================================
--- boost-build/branches/upstream/current/example/libraries/util/foo/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/libraries/util/foo/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,5 @@
+
+project 
+    : usage-requirements <include>include ;
+
+lib bar : bar.cpp ;
\ No newline at end of file

Added: boost-build/branches/upstream/current/example/libraries/util/foo/bar.cpp
===================================================================
--- boost-build/branches/upstream/current/example/libraries/util/foo/bar.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/libraries/util/foo/bar.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,13 @@
+//  Copyright (c) 2003 Vladimir Prus
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  http://www.boost.org
+// 
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+void foo() {}

Added: boost-build/branches/upstream/current/example/libraries/util/foo/include/lib1.h
===================================================================
--- boost-build/branches/upstream/current/example/libraries/util/foo/include/lib1.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/libraries/util/foo/include/lib1.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,10 @@
+//  Copyright (c) 2003 Vladimir Prus
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  http://www.boost.org
+// 
+
+void foo();

Added: boost-build/branches/upstream/current/example/make/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/make/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/make/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,23 @@
+
+import notfile ;
+import common ;
+
+exe main : main.cpp ;
+
+# Create 'main.cpp' from 'main.cpp.pro' using action
+# 'do-something' defined below. 
+#
+make main.cpp : main.cpp.pro : @do-something ;
+
+# In this example, we'll just copy a file.
+# Need to find out the name of a command to copy a file.
+CP = [ common.copy-command ] ;
+
+# The action itself.
+# The 'CP' variable is defined below
+# $(>) is source 
+# $(<) is target
+actions do-something
+{
+    $(CP) $(>) $(<)
+}

Added: boost-build/branches/upstream/current/example/make/main.cpp.pro
===================================================================
--- boost-build/branches/upstream/current/example/make/main.cpp.pro	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/make/main.cpp.pro	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,2 @@
+
+int main() { return 0; }

Added: boost-build/branches/upstream/current/example/make/readme.txt
===================================================================
--- boost-build/branches/upstream/current/example/make/readme.txt	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/make/readme.txt	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,3 @@
+
+Example of using custom command to create one file from
+another, using the builtin 'make' rule.

Added: boost-build/branches/upstream/current/example/python_modules/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/python_modules/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/python_modules/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,5 @@
+
+import python_helpers ;
+
+ECHO "test1:" [ python_helpers.test1 ] ;
+ECHO "test2:" [ python_helpers.test2 1234 : 5678 ] ;
\ No newline at end of file

Added: boost-build/branches/upstream/current/example/python_modules/python_helpers.jam
===================================================================
--- boost-build/branches/upstream/current/example/python_modules/python_helpers.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/python_modules/python_helpers.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,7 @@
+
+# Import the Python rules to Boost.Build
+PYTHON_IMPORT_RULE python_helpers : test1 : python_helpers : test1 ;
+PYTHON_IMPORT_RULE python_helpers : test2 : python_helpers : test2 ;
+
+# Make the new rules accessible to everybody who imports us.
+EXPORT python_helpers : test1 test2 ;

Added: boost-build/branches/upstream/current/example/python_modules/python_helpers.py
===================================================================
--- boost-build/branches/upstream/current/example/python_modules/python_helpers.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/python_modules/python_helpers.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,15 @@
+
+# Declare a couple of functions called from Boost.Build
+#
+# Each function will receive as many arguments as there ":"-separated
+# arguments in bjam call. Each argument is a list of strings.
+# As a special exception (aka bug), if no arguments are passed in bjam,
+# Python function will be passed a single empty list.
+#
+# All Python functions must return a list of strings, which may be empty.
+
+def test1(l):
+    return ["foo", "bar"]
+    
+def test2(l, l2):
+    return [l[0], l2[0]]
\ No newline at end of file

Added: boost-build/branches/upstream/current/example/python_modules/readme.txt
===================================================================
--- boost-build/branches/upstream/current/example/python_modules/readme.txt	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/python_modules/readme.txt	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,11 @@
+
+This example shows how you can use Python modules from Boost.Build.
+
+In order to do this, you need to build bjam with Python support, by running:
+
+   ./build.sh --with-python=/usr
+   
+in jam directory. (Replace /usr with the root of your Python installation.)
+
+The integration between Python and bjam is very basic now, but enough to
+be useful.
\ No newline at end of file

Deleted: boost-build/branches/upstream/current/example/qt/Jamfile
===================================================================
--- boost-build/branches/upstream/current/example/qt/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,11 +0,0 @@
-# Copyright Vladimir Prus 2004.
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt
-# or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-project
-    # built MT version, unless asked otherwise.
-    : default-build <threading>multi 
-    ;
-
-exe canvas : main.cpp canvas.cpp canvas.h : <library>/qt//qt ;
\ No newline at end of file

Added: boost-build/branches/upstream/current/example/qt/README.txt
===================================================================
--- boost-build/branches/upstream/current/example/qt/README.txt	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/README.txt	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,17 @@
+
+This directory contains Boost.Build examples for the Qt library
+(http://www.trolltech.com/products/qt/index.html).
+
+The current examples are:
+1. Basic setup -- application with several sources and moccable header.
+2. Using of .ui source file.
+3. Running .cpp files via the moc tool.
+
+For convenience, there are examples both for 3.* and 4.* version of Qt,
+they are mostly identical and differ only in source code.
+
+All examples assumes that you just installed Boost.Build and that QTDIR
+environment variables is set (typical values can be /usr/share/qt3 and
+/usr/share/qt4). After adding "using qt ..." to your user-config.jam, you'd
+have to removing "using qt ; " statements from Jamroot file of examples.
+

Deleted: boost-build/branches/upstream/current/example/qt/canvas.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/canvas.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/canvas.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,73 +0,0 @@
-// Copyright Vladimir Prus 2004.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt
-// or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#include "canvas.h"
-
-#include <qlabel.h>
-#include <qcanvas.h>
-#include <qlayout.h>
-
-Canvas::Canvas(QWidget* parent)
-: QWidget(parent)
-{
-    m_pen = QPen(QColor(255, 128, 128));
-    m_brushes = new QBrush[2];
-    m_brushes[0] = QBrush(QColor(255, 0, 0));
-    m_brushes[1] = QBrush(QColor(0, 255, 0));
-    m_current_brush = 0;
-    
-    m_canvas = new QCanvas(this);
-    m_canvas->resize(4*1600, 600);
-    
-    redraw();   
-    
-    QVBoxLayout* l = new QVBoxLayout(this); 
-    
-    m_canvas_view = new QCanvasView(m_canvas, this);
-    l->addWidget(m_canvas_view);    
-    m_canvas_view->resize(rect().size());
-    m_canvas_view->show();    
-}
-
-Canvas::~Canvas()
-{
-    delete m_brushes;
-}
-
-void Canvas::redraw()
-{
-    QCanvasItemList l = m_canvas->allItems();    
-    for(QCanvasItemList::iterator i = l.begin(),
-            e = l.end(); i != e; ++i)
-    {
-        delete *i;
-    }
-    
-    unsigned count = 0;
-    for (unsigned x = 10; x < 4*1600; x += 20)
-        for (unsigned y = 10; y < 600; y += 20) {
-            QCanvasRectangle* r = new QCanvasRectangle(x, y, 10, 10, m_canvas);
-            r->setPen(m_pen);
-            r->setBrush(m_brushes[m_current_brush]);
-            r->show();  
-            ++count;  
-            QCanvasText* t = new QCanvasText("D", m_canvas);
-            t->move(x, y);
-            t->show();
-            ++count;
-        }
-    
-    (new QCanvasText(QString::number(count), m_canvas))->show();
-    m_canvas->setAllChanged();
-
-}
-
-void Canvas::change_color()
-{
-    m_current_brush = (m_current_brush + 1)%2;
-    redraw();
-    m_canvas->update();
-}
-

Deleted: boost-build/branches/upstream/current/example/qt/canvas.h
===================================================================
--- boost-build/branches/upstream/current/example/qt/canvas.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/canvas.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,35 +0,0 @@
-// Copyright Vladimir Prus 2004.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt
-// or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-
-#ifndef CANVAS_VP_2004_08_31
-#define CANVAS_VP_2004_08_31
-
-#include <qmainwindow.h>
-#include <qpen.h>
-#include <qbrush.h>
-
-class Canvas : public QWidget
-{
-    Q_OBJECT
-public:
-    Canvas(QWidget* parent);
-
-    virtual ~Canvas();
-    
-public slots:
-    void change_color();    
-    
-private:
-    void redraw();
-    class QCanvas* m_canvas;
-    class QCanvasView* m_canvas_view;
-    class QPen m_pen;
-    class QBrush* m_brushes;    
-    int m_current_brush;
-};
-
-#endif
-

Deleted: boost-build/branches/upstream/current/example/qt/main.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/main.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/main.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,36 +0,0 @@
-// Copyright Vladimir Prus 2004.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt
-// or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#include "canvas.h"
-#include <qapplication.h>
-#include <qvbox.h>
-#include <qpushbutton.h>
-
-class Window : public QMainWindow
-{
-public:
-    Window()
-    {
-        setCaption("QCanvas test");
-        QVBox* vb = new QVBox(this);
-        setCentralWidget(vb);   
-    
-        Canvas* c = new Canvas(vb); 
-        QPushButton* b = new QPushButton("Change color", vb);
-        connect(b, SIGNAL(clicked()), c, SLOT(change_color())); 
-    }        
-};
-
-int main(int argc, char **argv)
-{
-    QApplication app(argc, argv);
-    Window *w = new Window();
-
-    app.setMainWidget(w);
-    w->show();
-    
-    return app.exec();
-}
-

Deleted: boost-build/branches/upstream/current/example/qt/project-root.jam
===================================================================
--- boost-build/branches/upstream/current/example/qt/project-root.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/project-root.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,9 +0,0 @@
-
-import toolset ;
-
-# Tell that QT should be used. QTDIR will give installation
-# prefix. 
-toolset.using qt ;
-
-#Alternatively, the prefix can be given as second argument
-#toolset.using qt : /usr/share/qt ;
\ No newline at end of file

Added: boost-build/branches/upstream/current/example/qt/qt3/hello/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt3/hello/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt3/hello/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,13 @@
+# Copyright Vladimir Prus 2004.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt
+# or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+using qt ;
+
+project
+    # built MT version, unless asked otherwise.
+    : default-build <threading>multi 
+    ;
+
+exe canvas : main.cpp canvas.cpp canvas.h : <library>/qt//qt ;
\ No newline at end of file

Added: boost-build/branches/upstream/current/example/qt/qt3/hello/canvas.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt3/hello/canvas.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt3/hello/canvas.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,73 @@
+// Copyright Vladimir Prus 2004.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include "canvas.h"
+
+#include <qlabel.h>
+#include <qcanvas.h>
+#include <qlayout.h>
+
+Canvas::Canvas(QWidget* parent)
+: QWidget(parent)
+{
+    m_pen = QPen(QColor(255, 128, 128));
+    m_brushes = new QBrush[2];
+    m_brushes[0] = QBrush(QColor(255, 0, 0));
+    m_brushes[1] = QBrush(QColor(0, 255, 0));
+    m_current_brush = 0;
+    
+    m_canvas = new QCanvas(this);
+    m_canvas->resize(4*1600, 600);
+    
+    redraw();   
+    
+    QVBoxLayout* l = new QVBoxLayout(this); 
+    
+    m_canvas_view = new QCanvasView(m_canvas, this);
+    l->addWidget(m_canvas_view);    
+    m_canvas_view->resize(rect().size());
+    m_canvas_view->show();    
+}
+
+Canvas::~Canvas()
+{
+    delete m_brushes;
+}
+
+void Canvas::redraw()
+{
+    QCanvasItemList l = m_canvas->allItems();    
+    for(QCanvasItemList::iterator i = l.begin(),
+            e = l.end(); i != e; ++i)
+    {
+        delete *i;
+    }
+    
+    unsigned count = 0;
+    for (unsigned x = 10; x < 4*1600; x += 20)
+        for (unsigned y = 10; y < 600; y += 20) {
+            QCanvasRectangle* r = new QCanvasRectangle(x, y, 10, 10, m_canvas);
+            r->setPen(m_pen);
+            r->setBrush(m_brushes[m_current_brush]);
+            r->show();  
+            ++count;  
+            QCanvasText* t = new QCanvasText("D", m_canvas);
+            t->move(x, y);
+            t->show();
+            ++count;
+        }
+    
+    (new QCanvasText(QString::number(count), m_canvas))->show();
+    m_canvas->setAllChanged();
+
+}
+
+void Canvas::change_color()
+{
+    m_current_brush = (m_current_brush + 1)%2;
+    redraw();
+    m_canvas->update();
+}
+

Added: boost-build/branches/upstream/current/example/qt/qt3/hello/canvas.h
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt3/hello/canvas.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt3/hello/canvas.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,35 @@
+// Copyright Vladimir Prus 2004.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef CANVAS_VP_2004_08_31
+#define CANVAS_VP_2004_08_31
+
+#include <qmainwindow.h>
+#include <qpen.h>
+#include <qbrush.h>
+
+class Canvas : public QWidget
+{
+    Q_OBJECT
+public:
+    Canvas(QWidget* parent);
+
+    virtual ~Canvas();
+    
+public slots:
+    void change_color();    
+    
+private:
+    void redraw();
+    class QCanvas* m_canvas;
+    class QCanvasView* m_canvas_view;
+    class QPen m_pen;
+    class QBrush* m_brushes;    
+    int m_current_brush;
+};
+
+#endif
+

Added: boost-build/branches/upstream/current/example/qt/qt3/hello/main.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt3/hello/main.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt3/hello/main.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,36 @@
+// Copyright Vladimir Prus 2004.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include "canvas.h"
+#include <qapplication.h>
+#include <qvbox.h>
+#include <qpushbutton.h>
+
+class Window : public QMainWindow
+{
+public:
+    Window()
+    {
+        setCaption("QCanvas test");
+        QVBox* vb = new QVBox(this);
+        setCentralWidget(vb);   
+    
+        Canvas* c = new Canvas(vb); 
+        QPushButton* b = new QPushButton("Change color", vb);
+        connect(b, SIGNAL(clicked()), c, SLOT(change_color())); 
+    }        
+};
+
+int main(int argc, char **argv)
+{
+    QApplication app(argc, argv);
+    Window *w = new Window();
+
+    app.setMainWidget(w);
+    w->show();
+    
+    return app.exec();
+}
+

Added: boost-build/branches/upstream/current/example/qt/qt3/moccable-cpp/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt3/moccable-cpp/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt3/moccable-cpp/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,11 @@
+
+using qt ;
+import cast ;
+
+project 
+    : default-build <threading>multi 
+    ;
+
+exe main : main.cpp [ cast _ moccable-cpp : main.cpp ]
+           /qt//qt 
+    ;

Added: boost-build/branches/upstream/current/example/qt/qt3/moccable-cpp/main.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt3/moccable-cpp/main.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt3/moccable-cpp/main.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,41 @@
+// Copyright Vladimir Prus 2005.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include <qwidget.h>
+#include <qpushbutton.h>
+#include <qapplication.h>
+
+#include <iostream>
+
+class My_widget : public QWidget
+{
+    Q_OBJECT
+public:
+    My_widget() : QWidget() 
+    {
+        QPushButton* b = new QPushButton("Push me", this);
+    
+        connect(b, SIGNAL(clicked()), this, SLOT(theSlot()));
+    }
+
+private slots:
+    void theSlot()
+    {
+        std::cout << "Clicked\n";
+    }    
+    
+};
+
+int main(int ac, char* av[])
+{
+    QApplication app(ac, av);
+    My_widget mw;
+    mw.show();
+    app.setMainWidget(&mw);
+    app.exec();
+}
+
+#include "main.moc"

Added: boost-build/branches/upstream/current/example/qt/qt3/uic/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt3/uic/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt3/uic/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,15 @@
+# Copyright Felix E. Klee, 2003
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt
+# or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+# Tell that QT should be used. QTDIR will give installation
+# prefix. 
+using qt ;
+
+project
+    : default-build <threading>multi
+    ;
+
+exe hello : main.cpp hello_world_widget.ui : <library>/qt//qt ;
+

Added: boost-build/branches/upstream/current/example/qt/qt3/uic/hello_world_widget.ui
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt3/uic/hello_world_widget.ui	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt3/uic/hello_world_widget.ui	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,58 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>HelloWorldWidget</class>
+<comment>
+<!--
+    Copyright Felix E. Klee, 2003
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt
+    or copy at http://www.boost.org/LICENSE_1_0.txt)
+-->
+</comment>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>HelloWorldWidget</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>124</width>
+            <height>63</height>
+        </rect>
+    </property>
+    <property name="caption">
+        <string>Hello World!</string>
+    </property>
+    <vbox>
+        <property name="name">
+            <cstring>unnamed</cstring>
+        </property>
+        <property name="margin">
+            <number>11</number>
+        </property>
+        <property name="spacing">
+            <number>6</number>
+        </property>
+        <widget class="QLabel">
+            <property name="name">
+                <cstring>TextLabel2</cstring>
+            </property>
+            <property name="text">
+                <string>Hello World!</string>
+            </property>
+            <property name="alignment">
+                <set>AlignCenter</set>
+            </property>
+        </widget>
+        <widget class="QPushButton">
+            <property name="name">
+                <cstring>OkButton</cstring>
+            </property>
+            <property name="text">
+                <string>OK</string>
+            </property>
+        </widget>
+    </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>

Added: boost-build/branches/upstream/current/example/qt/qt3/uic/main.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt3/uic/main.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt3/uic/main.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,18 @@
+// Copyright Felix E. Klee, 2003
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include "hello_world_widget.h"
+#include <qapplication.h>
+
+#include <qpushbutton.h>
+
+int main(int argc, char **argv) {
+    QApplication a(argc, argv);
+    HelloWorldWidget w;
+    QObject::connect(static_cast<QObject*>(w.OkButton), SIGNAL(clicked()), &w, SLOT(close()));
+    a.setMainWidget(&w);
+    w.show();
+    return a.exec();
+}

Added: boost-build/branches/upstream/current/example/qt/qt4/hello/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt4/hello/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt4/hello/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,14 @@
+
+import qt4 ;
+
+if ! [ qt4.initialized ]
+{
+    ECHO "Warning: Qt4 not initialized in user-config.jam" ;
+    ECHO "Assuming /space/p2/ghost/build/Qt4 as location." ;
+    ECHO "This is very likely won't work for you. " ;
+    using qt4 : /space/p2/ghost/build/Qt4 ;
+}
+
+project : requirements <threading>multi ;
+
+exe arrow : main.cpp arrow.cpp arrow.h /qt//QtGui ;
\ No newline at end of file

Added: boost-build/branches/upstream/current/example/qt/qt4/hello/arrow.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt4/hello/arrow.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt4/hello/arrow.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,158 @@
+// Copyright Vladimir Prus 2005.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include "arrow.h"
+
+#include <QtGui/qapplication.h>
+
+#include <QtGui/qwidget.h>
+#include <QtGui/qpainter.h>
+#include <QtGui/qpainterpath.h>
+
+#include <stdlib.h>
+#include <math.h>
+
+Arrow_widget::Arrow_widget(QWidget* parent) : QWidget(parent), color_(0)
+{
+    QPalette pal = palette();
+    pal.setBrush(backgroundRole(), QBrush(Qt::white));
+    setPalette(pal);
+}
+
+void Arrow_widget::slotChangeColor()
+{
+    color_ = (color_ + 1) % 3;
+    update();
+}
+
+void 
+Arrow_widget::draw_arrow(int x1, int y1, int x2, int y2, QPainter& painter)
+{
+    // The length of the from the tip of the arrow to the point
+    // where line starts.
+    const int arrowhead_length = 16;
+    
+    QPainterPath arrow;
+    arrow.moveTo(x1, y1);
+    
+    // Determine the angle of the straight line.
+    double a1 = (x2-x1);
+    double a2 = (y2-y1);
+    double b1 = 1;
+    double b2 = 0;
+    
+    double straight_length = sqrt(a1*a1 + a2*a2);
+    
+    double dot_product = a1*b1 + a2*b2;
+    double cosine = dot_product/
+        (sqrt(pow(a1, 2) + pow(a2, 2))*sqrt(b1 + b2));
+    double angle = acos(cosine);
+    if (y1 < y2)
+    {
+        angle = -angle;
+    }
+    double straight_angle = angle*180/M_PI;
+    
+    double limit = 10;
+    
+    double angle_to_vertical;
+    if (fabs(straight_angle) < 90)
+        angle_to_vertical = fabs(straight_angle);
+    else if (straight_angle > 0)
+        angle_to_vertical = 180-straight_angle;
+    else
+        angle_to_vertical = 180-(-straight_angle);
+    
+    double angle_delta = 0;
+    if (angle_to_vertical > limit)
+        angle_delta = 30 * (angle_to_vertical - limit)/90;
+    double start_angle = straight_angle > 0 
+        ? straight_angle - angle_delta :
+        straight_angle + angle_delta;
+    
+    
+    QMatrix m1;
+    m1.translate(x1, y1);
+    m1.rotate(-start_angle);
+    
+    double end_angle = straight_angle > 0 
+        ? (straight_angle + 180 + angle_delta) :
+        (straight_angle + 180 - angle_delta);
+    
+    QMatrix m2;
+    m2.reset();
+    m2.translate(x2, y2);        
+    m2.rotate(-end_angle);
+    
+    arrow.cubicTo(m1.map(QPointF(straight_length/2, 0)),              
+                  m2.map(QPointF(straight_length/2, 0)),
+                  m2.map(QPointF(arrowhead_length, 0)));
+    
+    painter.save();
+    painter.setBrush(Qt::NoBrush);
+    painter.drawPath(arrow);    
+    painter.restore();
+    
+    painter.save();
+    painter.translate(x2, y2);
+    
+    painter.rotate(-90);
+    painter.rotate(-end_angle);
+    painter.rotate(180);
+    
+    QPolygon arrowhead(4);
+    arrowhead.setPoint(0, 0, 0);
+    arrowhead.setPoint(1, arrowhead_length/3, -arrowhead_length*5/4);
+    arrowhead.setPoint(2, 0, -arrowhead_length);
+    arrowhead.setPoint(3, -arrowhead_length/3, -arrowhead_length*5/4);
+    
+    painter.drawPolygon(arrowhead);
+    
+    painter.restore();            
+    
+}
+
+
+void Arrow_widget::paintEvent(QPaintEvent*)
+{
+    QPainter p(this);
+    
+    p.setRenderHint(QPainter::Antialiasing);
+    
+    int base_x = 550;
+    int base_y = 200;
+
+    if (color_ == 0)   
+        p.setBrush(Qt::black);
+    else if (color_ == 1)
+        p.setBrush(Qt::green);
+    else if (color_ == 2)
+        p.setBrush(Qt::yellow);
+    else
+        p.setBrush(Qt::black);
+    
+    for (int x_step = 0; x_step < 6; ++x_step)
+    {
+        for (int y_step = 1; y_step <= 3; ++y_step)
+        {
+            draw_arrow(base_x, base_y, base_x+x_step*100, 
+                       base_y - y_step*50, p);
+            
+            draw_arrow(base_x, base_y, base_x+x_step*100, 
+                       base_y + y_step*50, p);
+            
+            draw_arrow(base_x, base_y, base_x-x_step*100, 
+                       base_y + y_step*50, p);
+            
+            draw_arrow(base_x, base_y, base_x-x_step*100, 
+                       base_y - y_step*50, p);
+        }
+    }
+
+    draw_arrow(50, 400, 1000, 450, p);
+    draw_arrow(1000, 400, 50, 450, p);
+    
+}
+

Added: boost-build/branches/upstream/current/example/qt/qt4/hello/arrow.h
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt4/hello/arrow.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt4/hello/arrow.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,30 @@
+// Copyright Vladimir Prus 2005.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <QtGui/qapplication.h>
+
+#include <QtGui/qwidget.h>
+#include <QtGui/qpainter.h>
+#include <QtGui/qpainterpath.h>
+
+#include <stdlib.h>
+#include <math.h>
+
+class Arrow_widget : public QWidget
+{
+    Q_OBJECT
+public:
+    Arrow_widget(QWidget* parent = 0);
+
+public slots:
+    void slotChangeColor();
+
+private:
+    void draw_arrow(int x1, int y1, int x2, int y2, QPainter& painter);
+    void paintEvent(QPaintEvent*);
+
+private:
+    int color_;
+};

Added: boost-build/branches/upstream/current/example/qt/qt4/hello/main.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt4/hello/main.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt4/hello/main.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,27 @@
+// Copyright Vladimir Prus 2005.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include "arrow.h"
+
+#include <QApplication>
+#include <QTimer>
+
+int main(int ac, char* av[])
+{
+    QApplication app(ac, av);
+    Arrow_widget* w = new Arrow_widget;
+    w->resize(1100, 480);
+
+    QTimer timer;
+    QObject::connect(&timer, SIGNAL(timeout()),
+                     w, SLOT(slotChangeColor()));
+
+    timer.start(2000);
+
+    w->show();
+    app.exec();
+    return 0;
+}
+

Added: boost-build/branches/upstream/current/example/qt/qt4/moccable-cpp/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt4/moccable-cpp/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt4/moccable-cpp/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,18 @@
+
+import qt4 ;
+if ! [ qt4.initialized ]
+{
+    ECHO "Warning: Qt4 not initialized in user-config.jam" ;
+    ECHO "Assuming /space/p2/ghost/build/Qt4 as location." ;
+    ECHO "This is very likely won't work for you. " ;
+    using qt4 : /space/p2/ghost/build/Qt4 ;
+}
+
+import cast ;
+exe main : main.cpp 
+           [ cast _ moccable-cpp : main.cpp ]
+           /qt//QtGui 
+	 : <threading>multi   
+         ;
+
+

Added: boost-build/branches/upstream/current/example/qt/qt4/moccable-cpp/main.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt4/moccable-cpp/main.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt4/moccable-cpp/main.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,39 @@
+// Copyright Vladimir Prus 2005.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <qwidget.h>
+#include <qpushbutton.h>
+#include <qapplication.h>
+
+#include <iostream>
+
+class My_widget : public QWidget
+{
+    Q_OBJECT
+public:
+    My_widget() : QWidget() 
+    {
+        QPushButton* b = new QPushButton("Push me", this);
+    
+        connect(b, SIGNAL(clicked()), this, SLOT(theSlot()));
+    }
+
+private slots:
+    void theSlot()
+    {
+        std::cout << "Clicked\n";
+    }    
+    
+};
+
+int main(int ac, char* av[])
+{
+    QApplication app(ac, av);
+    My_widget mw;
+    mw.show();
+    app.exec();
+}
+
+#include "main.moc"

Added: boost-build/branches/upstream/current/example/qt/qt4/uic/Jamroot
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt4/uic/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt4/uic/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,18 @@
+# Copyright Felix E. Klee, 2003
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt
+# or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import qt4 ;
+if ! [ qt4.initialized ]
+{
+    ECHO "Warning: Qt4 not initialized in user-config.jam" ;
+    ECHO "Assuming /space/p2/ghost/build/Qt4 as location." ;
+    ECHO "This is very likely won't work for you. " ;
+    using qt4 : /space/p2/ghost/build/Qt4 ;
+}
+
+project : requirements <threading>multi
+    ;
+
+exe hello : main.cpp hello_world_widget.ui : <library>/qt//QtGui ;

Added: boost-build/branches/upstream/current/example/qt/qt4/uic/hello_world_widget.ui
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt4/uic/hello_world_widget.ui	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt4/uic/hello_world_widget.ui	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,55 @@
+<ui version="4.0" >
+ <author></author>
+ <comment>
+<!--
+    Copyright Felix E. Klee, 2003
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt
+    or copy at http://www.boost.org/LICENSE_1_0.txt)
+-->
+ </comment>
+ <exportmacro></exportmacro>
+ <class>HelloWorldWidget</class>
+ <widget class="QWidget" name="HelloWorldWidget" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>124</width>
+    <height>63</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Hello World!</string>
+  </property>
+  <layout class="QVBoxLayout" >
+   <property name="margin" >
+    <number>11</number>
+   </property>
+   <property name="spacing" >
+    <number>6</number>
+   </property>
+   <item>
+    <widget class="QLabel" name="TextLabel2" >
+     <property name="text" >
+      <string>Hello World!</string>
+     </property>
+     <property name="alignment" >
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QPushButton" name="OkButton" >
+     <property name="text" >
+      <string>OK</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>

Added: boost-build/branches/upstream/current/example/qt/qt4/uic/main.cpp
===================================================================
--- boost-build/branches/upstream/current/example/qt/qt4/uic/main.cpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/example/qt/qt4/uic/main.cpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,23 @@
+// Copyright Felix E. Klee, 2003
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include "ui_hello_world_widget.h"
+#include <qapplication.h>
+#include <qwidget.h>
+
+#include <qpushbutton.h>
+
+int main(int argc, char **argv) {
+    QApplication a(argc, argv);
+
+    QWidget w;
+    Ui::HelloWorldWidget wm;
+    wm.setupUi(&w);
+
+    QObject::connect(wm.OkButton, SIGNAL(clicked()), &w, SLOT(close()));
+
+    w.show();
+    return a.exec();
+}

Modified: boost-build/branches/upstream/current/hacking.txt
===================================================================
--- boost-build/branches/upstream/current/hacking.txt	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/hacking.txt	2006-11-09 09:53:31 UTC (rev 14016)
@@ -14,15 +14,12 @@
 
 Before contributing, make sure you are subscribed to our mailing list
 
-   jamboost at yahoogroups.com
+   boost-build at lists.boost.org
 
 Additional resources include
 
-   - brief issues list
-     http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Boost.Build/Issues
-     
-   - the issue tracker
-     http://zigzag.cs.msu.su:7814
+   - The issue tracker
+     http://zigzag.cs.msu.su/boost.build
 
    - commits mailing list: 
      boost-build at lists.sourceforge.net
@@ -90,8 +87,8 @@
 2. Documentation.
 
 It turns out that it's hard to have too much comments, but it's easy to have
-too little. Please predend each rule with a comment saying what the rule does
-and what arguments means. Stop for a minute and consider if the comment makes
+too little. Please prepend each rule with a comment saying what the rule does
+and what arguments mean. Stop for a minute and consider if the comment makes
 sense for anybody else, and completely describes what the rules does. Generic
 phrases like "adjusts properties" are really not enough.
 

Modified: boost-build/branches/upstream/current/index.html
===================================================================
--- boost-build/branches/upstream/current/index.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/index.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -36,24 +36,31 @@
         <b>Quick access</b>
         <ul>
         <li>Download: <a href=
-    "http://prdownloads.sourceforge.net/boost/boost-build-2.0-m10.zip">[zip]
+    "http://prdownloads.sourceforge.net/boost/boost-build-2.0-m11.zip">[zip]
           </a>, <a href=
-    "http://prdownloads.sourceforge.net/boost/boost-build-2.0-m10.tar.bz2">[tar.bz2]
+    "http://prdownloads.sourceforge.net/boost/boost-build-2.0-m11.tar.bz2">[tar.bz2]
           </a>
         <li>Nightly build: <a href="http://boost.org/boost-build2/boost-build.zip">[zip]</a>, 
           <a href="http://boost.org/boost-build2/boost-build.tar.bz2">[tar.bz2]</a>
         <li><a href="doc/html/index.html">Documentation</a> 
-          (<a href="userman.pdf">PDF</a>)
+          (<a href="doc/userman.pdf">PDF</a>)
         <li><a
           href="http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Boost.Build_V2">Wiki
           (User-contibuted documentation)</a>
         <li>Feedback: <a
-    href="http://groups.yahoo.com/group/jamboost/">[mailing list]</a>,
+    href="http://lists.boost.org/mailman/listinfo.cgi/boost-build">[mailing list]</a>,
           <a
             href="news://news.gmane.org/gmane.comp.lib.boost.build">[newsgroup]</a>
           <ul>
             <li>Before posting, <a href="mailto:jamboost-subscribe at yahoogroups.com">subscribe</a>
+	    <!--
+	    <li><form method="get" action="http://search.gmane.org/">
+	        <input type="text" name="query">
+		<input type="hidden" name="group" value="gmane.comp.lib.boost.build">
+		<input type="submit" value="Search">
+		</form> -->
           </ul>
+	<li><a href="http://zigzag.cs.msu.su/boost.build">Bug tracker</a>  
 <!--        <li>Rate Boost.Build: <a href="http://freshmeat.net/rate/38012/">Freshmeat</a>    -->
       </ul>
     </p>
@@ -94,7 +101,7 @@
 
     <h2>Documentation</h2>
 
-    <p>The user manual, which includes installation instructions, tuturial
+    <p>The user manual, which includes installation instructions, tutorial
     and initial reference is available <a href=
     "doc/html/index.html">here</a>.</p>
 
@@ -112,19 +119,19 @@
     full list is available <a href="doc/tools.html">here</a>. 
     The list of features
     still to be implemented is outlined in the <a href=
-    "doc/development_plan.html">develepment plan</a>.</p>
+    "doc/development_plan.html">development plan</a>.</p>
 
     <h2 id="download">Downloading</h2>
 
     <p>The most up-to-date sources are available in <tt>tools/build</tt>
-    directory of Boost CVS. Please use "Boost CVS Repository" section in the
-    <a href="http://www.boost.org/more/download.html">download
-    instructions</a>.</p>
+    directory of Boost CVS. Please see the 
+    <a href="http://www.boost.org/more/getting_started.html#CVS">Boost CVS Repository
+    </a> section of the Boost getting started docs.</p>
 
     <p>Boost.Build releases are also available. There's <a href=
-    "http://prdownloads.sourceforge.net/boost/boost-build-2.0-m9.1.zip">zip
+    "http://prdownloads.sourceforge.net/boost/boost-build-2.0-m11.zip">zip
     archive</a>, and <a href=
-    "http://prdownloads.sourceforge.net/boost/boost-build-2.0-m9.1.tar.bz2">tar.bz2
+    "http://prdownloads.sourceforge.net/boost/boost-build-2.0-m11.tar.bz2">tar.bz2
     archive</a> of the current release. Older releases are available from the
     <a href=
     "http://sourceforge.net/project/showfiles.php?group_id=7586">SourceForce
@@ -137,17 +144,13 @@
     <h2>Feedback</h2>
 
     <p>Should you have any questions or comments, we'd be glad to hear them.
-    Post everything to the <a href=
-    "http://groups.yahoo.com/group/jamboost">jamboost</a> mailing list.</p>
+    Post everything to the <a href="http://lists.boost.org/mailman/listinfo.cgi/boost-build">mailing list</a>.</p>
 
-    <p>We have an online tracker for all Boost.Build bugs and features. Usage
-    instructions are available <a href="doc/tracker.html">here</a>.</p>
-
     <p>If you'd like to help with development, there's a separate <a href=
     "hacking.txt">guidelines document</a>.</p>
     <hr>
 
-    <p>&copy; Copyright David Abrahams and Vladimir Prus 2002-2003.
+    <p>&copy; Copyright David Abrahams and Vladimir Prus 2002-2006.
     Permission to copy, use, modify, sell and distribute this document is
     granted provided this copyright notice appears in all copies. This
     document is provided "as is" without express or implied warranty, and
@@ -155,7 +158,7 @@
 
     <p>Revised 
     <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan
-                                            -->Oct 29, 2004 
+                                            -->Jul 20, 2006 
     <!--webbot bot="Timestamp" endspan i-checksum="13972"
                                             -->
     </p>

Deleted: boost-build/branches/upstream/current/jam_src/Jam.html
===================================================================
--- boost-build/branches/upstream/current/jam_src/Jam.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/Jam.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,1356 +0,0 @@
-<HTML>
-
-<TITLE> Jam/MR - Make(1) Redux </TITLE>
-
-<BODY>
-
-<CENTER>
-
-<H1> Jam/MR - Make(1) Redux </H1>
-
-<P> The <a href=http://www.perforce.com/jam/jam.html>Jam/MR</a> Executable
-
-</CENTER>
-
-<DL>
-
-<DT> <P> <H2> USAGE </H2> <DD>
-
-<PRE>
-jam [ -a ] [ -n ] [ -v ] [ -q ]
-    [ -d <I>debug</I> ] 
-    [ -f <I>jambase</I> ] 
-    [ -j <I>jobs</I> ] 
-    [ -o <I>actionsfile</I> ] 
-    [ -s <I>var</I>=<I>value</I> ] 
-    [ -t <I>target</I> ] 
-    [ <I>target</I> ... ]
-</PRE>
-
-<DT> <P> <H2> DESCRIPTION </H2> <DD>
-
-	<P>
-
-	<B>Jam</B> is a program construction tool, like <B>make</B>(1).
-
-	<P>
-
-	<B>Jam</B> recursively builds target files from source files,
-	using dependency information and updating actions expressed in
-	the Jambase file, which is written in <B>jam</B>'s own interpreted
-	language.  The default Jambase is compiled into <B>jam</B> and
-	provides a boilerplate for common use, relying on a user-provide
-	file "Jamfile" to enumerate actual targets and sources.
-
-	<P>
-
-	The Jambase is described in the <a href="Jambase.html">Jambase
-	Reference</a> and the document <a href="Jamfile.html">Using
-	Jamfiles and Jambase</A>.
-
-<DT> <P> <H2> OPTIONS </H2> <DD>
-
-	<P>
-
-	If <I>target</I> is provided on the command line, <B>jam</B>
-	builds <I>target;</I> otherwise <B>jam</B> builds the target
-	'all'.
-
-	<P>
-
-	<B>Jam</b> may be invoked with the following options:
-
-	<P> <TABLE WIDTH=75% ALIGN=CENTER>
-
-	    <TR><TD VALIGN=TOP><CODE> -a </CODE>
-	    <TD> Build all targets anyway, even if they are up-to-date.
-
-	    <TR><TD VALIGN=TOP><CODE> -d <I>n</I>  </CODE>
-	    <TD> Enable cummulative debugging levels from 1 to <I>n</I>.  
-	    Interesting values are:
-
-	    <DL COMPACT>
-	    <DT> 1 <DD> Show actions (the default) 
-	    <DT> 2 <DD> Show "quiet" actions and display all action text 
-	    <DT> 3 <DD> Show dependency analysis, and target/source 
-		    timestamps/paths  
-	    <DT> 4 <DD> Show shell arguments 
-	    <DT> 5 <DD> Show rule invocations and variable expansions 
-	    <DT> 6 <DD> Show directory/header file/archive scans 
-	    <DT> 7 <DD> Show variable settings 
-	    <DT> 8 <DD> Show variable fetches 
-	    <DT> 9 <DD> Show variable manipulation, scanner tokens 
-	    </DL>
-
-	    <TR><TD VALIGN=TOP><CODE> -d +<I>n</I> </CODE>
-	    <TD> Enable debugging level <I>n</I>.
-
-	    <TR><TD VALIGN=TOP><CODE> -d 0 </CODE>
-	    <TD> Turn off all debugging levels.  Only errors are not suppressed.
-
-	    <TR><TD VALIGN=TOP><CODE> -f <I>jambase</I></CODE>
-	    <TD>Read <I>jambase</I> instead of using the built-in Jambase.
-	    Only one -f flag is permitted, but the <i>jambase</i> may 
-	    explicitly include other files.
-
-	    <TR><TD VALIGN=TOP><CODE> -j <I>n</I></CODE>
-	    <TD> Run up to <I>n</I> shell commands concurrently (UNIX 
-	    and NT only).  The default is 1.
-
-	    <TR><TD VALIGN=TOP><CODE> -n</CODE>
-	    <TD> Don't actually execute the updating actions, but do
-	    everything else.  This changes the debug level default to -d2.
-
-	    <TR><TD VALIGN=TOP><CODE> -o <I>file</I></CODE>
-	    <TD> Write the updating actions to the specified file instead
-	    of running them (or outputting them, as on the Mac).
-
-	    <TR><TD VALIGN=TOP><CODE> -q </CODE>
-	    <TD> Quit quickly (as if an interrupt was received)
-	    as soon as any target fails.
-
-	    <TR><TD VALIGN=TOP><CODE> -s <I>var</I>=<I>value</I></CODE>
-	    <TD> Set the variable <I>var</I> to <I>value</I>, overriding
-	    both internal variables and variables imported from the
-	    environment.
-
-	    <TR><TD VALIGN=TOP><CODE> -t <I>target</I></CODE>
-	    <TD> Rebuild <I>target</I> and everything that depends on it, 
-	     even if it is up-to-date.
-
-	    <TR><TD VALIGN=TOP><CODE> -v</CODE>
-	    <TD> Print the version of <B>jam</B> and exit.
-
-	</TABLE>
-
-<DT> <P> <H2> OPERATION </H2> <DD>
-
-	<P>
-
-	<b>Jam</b> has four phases of operation: start-up, parsing, 
-	binding, and updating.
-
-<DT> <P> <H3> Start-up </H3> <DD>
-
-	<P>
-
-	Upon start-up, <b>jam</b> imports environment variable settings
-	into <b>jam</b> variables.  Environment variables are split at
-	blanks with each word becoming an element in the variable's list
-	of values.  Environment variables whose names end in PATH are
-	split at $(SPLITPATH) characters (e.g., ":" for Unix).
-
-	<P>
-
-	To set a variable's value on the command line, overriding the
-	variable's environment value, use the -s option.  To see variable
-	assignments made during <b>jam</b>'s execution, use the -d+7
-	option.
-
-<DT> <P> <H3> Parsing </H3> <DD>
-
-	<P>
-
-	In the parsing phase, <b>jam</b> reads and parses the Jambase
-	file, by default the built-in one.  It is written in the <b>jam</b>
-	language.  See <a href="#language"> Language</a> below.  The
-	last action of the Jambase is to read (via the "include" rule)
-	a user-provided file called "Jamfile".
-
-	<P>
-
-	Collectively, the purpose of the Jambase and the Jamfile is to
-	name built target and source files, construct the dependency
-	graph among them, and associate build actions with targets.
-	The Jambase defines boilerplate rules and variable assignments,
-	and the Jamfile uses these to specify the actual relationship
-	among the target and source files.  See the <a
-	href="Jambase.html">Jambase Reference</a> and the document <a
-	href="Jamfile.html">Using Jamfiles and Jambase</A> for information.
-
-<A NAME="binding">
-<DT> <P> <H3> Binding </H3> <DD>
-</A>
-
-	<P>
-
-	<P> <H5> Binding </H5>
-
-	After parsing, <B>jam</B> recursively descends the dependency
-	graph and binds every file target with a location in the
-	filesystem.  If <B>jam</B> detects a circular dependency in the
-	graph, it issues a warning.
-
-	<P>
-
-	File target names are given as absolute or relative path names
-	in the filesystem.  If the path name is absolute, it is bound
-	as is.  If the path name is relative, it is normally bound as
-	is, and thus relative to the current directory.  This can be
-	modified by the settings of the $(SEARCH) and $(LOCATE) variables,
-	which enable <b>jam</b> to find and build targets spread across
-	a directory tree.  See <A HREF="#search">SEARCH and LOCATE
-	Variables</a> below.
-
-	<P> <H5> Update Determination </H5>
-
-	After binding each target, <B>jam</B> determines whether the
-	target needs updating, and if so marks the target for the updating
-	phase.  A target is normally so marked if it is missing, it is
-	older than any of its sources, or any of its sources are marked
-	for updating.  This behavior can be modified by the application
-	of special built-in rules, ALWAYS, LEAVES, NOCARE, NOTFILE,
-	NOUPDATE, and TEMPORARY.  See <A HREF="#bindingmods">Modifying
-	Binding</A> below.
-
-	<P> <H5> Header File Scanning </H5>
-
-	<P>
-
-	During the binding phase, <b>jam</b> also performs header file
-	scanning, where it looks inside source files for the implicit
-	dependencies on other files caused by C's #include syntax.  This
-	is controlled by the special variables $(HDRSCAN) and $(HDRRULE).
-	The result of the scan is formed into a rule invocation, with
-	the scanned file as the target and the found included file names
-	as the sources.  Note that this is the only case where rules
-	are invoked outside the parsing phase.  See <A
-	HREF="#hdrscan">HDRSCAN and HDRRULE Variables</A> below.
-
-<DT> <P> <H3> Updating </H3> <DD>
-
-	<P>
-
-	After binding, <B>jam</B> again recursively descends the dependency
-	graph,  this time executing the update actions for each target
-	marked for update during the binding phase.  If a  target's
-	updating actions fail, then all other targets which depend on
-	that target are skipped.
-
-	<P>
-
-	The -j flag instructs <B>jam</B> to build more than one target
-	at a time.  If there are multiple actions on a single target,
-	they are run sequentially.  
-
-<A NAME="language">
-<DT> <P> <H2> LANGUAGE </H2> <DD>
-</A>
-
-<DT> <P> <H3> Overview </H3> <DD>
-
-	<B>Jam</b> has an interpreted, procedural language.  Statements
-	in <b>jam</b> are rule (procedure) definitions, rule invocations,
-	flow-of-control structures, variable assignments, and sundry
-	language support.
-
-<DT> <P> <H3> Lexical Features </H3> <DD>
-
-	<P>
-
-	<B>Jam</b> treats its input files as whitespace-separated tokens,
-	with two exceptions: double quotes (") can enclose whitespace
-	to embed it into a token, and everything between the matching
-	curly braces ({}) in the definition of a  rule action is treated
-	as a single string.  A backslash (\) can escape a double quote,
-	or any single whitespace character.
-
-	<P>
-
-	<B>Jam</b> requires whitespace (blanks, tabs, or newlines) to
-	surround all tokens, <i>including the colon (:) and semicolon
-	(;) tokens</i>.
-
-	<P>
-
-	<B>Jam</b> keywords (an mentioned in this document) are reserved
-	and generally must be quoted with double quotes (") to be used
-	as arbitrary tokens, such as variable or target names.
-
-<DT> <P> <H3> Targets </H3> <DD>
-
-	<P>
-
-	The essential <b>jam</b> data entity is a target.  Built targets
-	are files to be updated.  Source targets are the files used in
-	updating built targets.  Built targets and source targets are
-	collectively referred to as file targets, and frequently built
-	targets are source targets for other built targets.  Pseudotargets
-	are symbols which represent dependencies on other targets, but
-	which are not themselves associated with any real file.
-
-	<P>
-
-	A file target's identifier is generally the file's name, which
-	can be absolutely rooted, relative to the directory of <b>jam</b>'s
-	invocation, or simply local (no directory).  Most often it is
-	the last case, and the actual file path is bound using the
-	$(SEARCH) and $(LOCATE) special variables.  See <A HREF="#search">
-	SEARCH and LOCATE Variables</A> below.  A local filename is
-	optionally qualified with grist, a string value used to assure
-	uniqueness.  A file target with an identifier of the form
-	<I>file(member)</I> is a library member (usually an ar(1) archive
-	on UNIX).
-
-<DT> <P> <H3> Rules </H3> <DD>
-
-	<P>
-
-	The basic <B>jam</b> language entity is called a rule.  A rule
-	is defined in two parts: the procedure and the actions.  The
-	procedure is a body of <b>jam</b> statements to be run when the
-	rule is invoked; the actions are the OS shell commands to execute
-	when updating the built targets of the rule.
-
-	<P>
-
-	Rules can return values, which can be expanded into a list with
-        "[ <i>rule</i> <i>args</i> ... ]". A rule's value is the value
-	of its last statement, though only the following statements
-	have values: 'if' (value of the leg chosen), 'switch' (value of the case
-	chosen), set (value of the resulting variable), and 'return' (value
-        of its arguments). Note that 'return' doesn't actually cause a
-        return, i.e., is a no-op unless it is the last statement
-        of the last block executed within rule body.
-
-	<P>
-
-	The <b>jam</b> statements for defining and invoking rules are
-	as follows:
-
-	<P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-	    <P> <DT> <CODE>
-	    rule <I>rulename</I> { <I>statements</I> }
-	    </CODE>
-
-	    <DD> Define a rule's procedure, replacing any previous
-	    definition.
-
-	    <P> <DT> <CODE>
-	    actions [ <I>modifiers</I> ] <I>rulename</I> { <I>commands</I> }
-	    </CODE>
-
-	    <DD> Define a rule's updating actions, replacing any
-	    previous definition.
-
-	    <P> <DT> <CODE>
-	    <I>rulename field1</I> : <I>field2</I> : <I>...</I> 
-	    : <I>fieldN</I> ;
-	    </CODE>
-
-	    <DD> Invoke a rule.
-
-	    <P> <DT> <CODE>
-	    on <I>target</I> <I>rulename field1</I> : <I>field2</I> : <I>...</I> 
-	    : <I>fieldN</I> ;
-	    </CODE>
-
-	    <DD> Invoke a rule under the influence of <I>target</I>'s specific
-            variables..
-
-	    <P> <DT> <CODE>
-	    [ <I>rulename field1</I> : <I>field2</I> : <I>...</I>
-            : <I>fieldN</I> ] <br>
-	    [  on <I>target</I> <I>rulename field1</I> : <I>field2</I> : <I>...</I>
-            : <I>fieldN</I> ] <br>
-
-	    </CODE>
-
-	    <DD> Used as an argument, expands to the return value of the rule invoked.
-
-	</DL></TABLE>
-
-	<P>
-
-	A rule is invoked with values in <I>field1</I> through
-	<I>fieldN</I>.  They may be referenced in the procedure's
-	<I>statements</I> as $(1) through $(<I>N</I>) (9 max), and the
-	first two only may be referenced in the action's <I>commands</I>
-	as $(1) and $(2).  $(&lt;) and $(&gt;) are synonymous with $(1)
-	and $(2).
-
-	<P>
-
-	Rules fall into two categories: updating rules (with actions),
-	and pure procedure rules (without actions).  Updating rules
-	treat arguments $(1) and $(2) as built targets and sources,
-	respectively, while pure procedure rules can take arbitrary
-	arguments.
-
-	<P>
-
-	When an updating rule is invoked, its updating actions are added
-	to those associated with its built targets ($(1)) before the
-	rule's procedure is run.  Later, to build the targets in the
-	updating phase, <I>commands</I> are passed to the OS command
-	shell, with $(1) and $(2) replaced by bound versions of the
-	target names.  See <A HREF="#binding"> Binding</A> above.
-
-	<P>
-
-	Rule invokation may be indirected through a variable:
-
-	<P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-	    <P> <DT> <CODE>
-	    $(<I>var</I>) <I>field1</I> : <I>field2</I> : <I>...</I> 
-	    : <I>fieldN</I> ;
-	    </CODE>
-
-	    <P> <DT> <CODE>
-	    on <I>target</I> $(<I>var</I>) <I>field1</I> : <I>field2</I> : <I>...</I> 
-	    : <I>fieldN</I> ;
-	    </CODE>
-
-	    <P> <DT> <CODE>
-	    [ $(<I>var</I>) <I>field1</I> : <I>field2</I> : <I>...</I>
-	
-            : <I>fieldN</I> ] <br>
-	    [  on <I>target</I> $(<I>var</I>) <I>field1</I> : <I>field2</I> : <I>...</I>
-            : <I>fieldN</I> ] <br>
-
-	    </CODE>
-
-	</DL></TABLE>
-
- 	The variable's value names the rule (or rules) to be invoked.
-	A rule is invoked for each element in the list of
-	<TT>$(<I>var</I>)</TT>'s values. The fields
-	<I>field1</I> : <I>field2</I> : <I>...</I> are passed as
-	arguments for each invokation. For the <TT> [ ... ] </TT> forms,
-	the return value is the concatenation of the return values for
-	all of the invokations.
-
-	<A NAME="actionmods">
-	<P> <H4> Action Modifiers </H4>
-	</A>
-
-	<P>
-
-	The following action <i>modifiers</i> are understood:
-
-	<P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-	    <P><DT><CODE> actions bind <I>vars</I> </CODE>
-	    <DD> $(vars) will be replaced with bound values.
-
-	    <P><DT><CODE> actions existing </CODE>
-	    <DD> $(>) includes only source targets currently existing.
-
-	    <P><DT><CODE> actions ignore </CODE>
-	    <DD> The return status of the <I>commands</I> is ignored.
-
-	    <P><DT><CODE> actions piecemeal </CODE>
-	    <DD> <I>commands</I>  are repeatedly invoked with a subset
-	    of $(>) small enough to fit in the command buffer on this
-	    OS.
-
-	    <P><DT><CODE> actions quietly </CODE>
-	    <DD> The action is not echoed to the standard output.
-
-	    <P><DT><CODE> actions together </CODE>
-	    <DD> The $(>) from multiple invocations of the same action
-	    on the same built target are glommed together.
-
-	    <P><DT><CODE> actions updated </CODE>
-	    <DD> $(>) includes only source targets themselves marked
-	    for updating.
-
-	</DL></TABLE>
-
-
-<DT> <P> <H3> Built-in Rules </H3> <DD>
-
-	<P>
-	<B>Jam</b> has eleven built-in rules, all of which are pure
-	procedure rules without updating actions.  They are in
-	three groups:  the first builds the dependency graph;
-	the second modifies it; and the third are just utility
-	rules.
-
-	<P>
-
-	<P> <H5> Dependency Building </H5> 
-
-	<P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-	<P><DT><CODE> 
-	DEPENDS <I>targets1</I> : <I>targets2</I> ; 
-	</CODE>
-
-	<DD> Builds a direct dependency: makes each of <I>targets1</I>
-	depend on each of <I>targets2</I>.  Generally, <I>targets1</I>
-	will be rebuilt if <I>targets2</I> are themselves rebuilt are
-	or are newer than <I>targets1</I>.
-
-	<P><DT><CODE>
-	INCLUDES <I>targets1</I> : <I>targets2</I> ;
-	</CODE>
-
-	<DD> Builds a sibling dependency: makes any target that depends
-	on any of <I>targets1</I> also depend on each of <I>targets2</I>.
-	This reflects the dependencies that arise when one source file
-	includes another:  the object built from the source file depends
-	both on the original and included source file,  but the two
-	sources files don't depend on each other.  For example:
-
-	<CODE>
-	<P>DEPENDS foo.o : foo.c ;
-	<BR>INCLUDES foo.c : foo.h ;
-	</CODE>
-
-	<P>
-
-	"foo.o" depends on "foo.c" and "foo.h" in this example.
-
-	</DL></TABLE>
-
-	<A NAME="bindingmods">
-	<P> <H5> Modifying Binding </H5> 
-	</A>
-
-	<P>
-
-	The six rules ALWAYS, LEAVES, NOCARE, NOTFILE, NOUPDATE, and
-	TEMPORARY modify the dependency graph so that <b>jam</b> treats
-	the targets differently during its target binding phase.  See
-	<A HREF="#binding">Binding</A> above.  Normally, <b>jam</b>
-	updates a target if it is missing, if its filesystem modification
-	time is older than any of its dependencies (recursively), or if
-	any of its dependencies are being updated.  This basic behavior
-	can be changed by invoking the following rules:
-
-	<P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-	<P><DT><CODE>
-	ALWAYS <I>targets</I> ;
-	</CODE>
-
-	<DD> Causes <I>targets</I> to be rebuilt regardless of whether
-	they are up-to-date (they must still be in the dependency graph).
-	This is used for the clean and uninstall targets, as they have
-	no dependencies and would otherwise appear never to need building.
-	It is best applied to targets that are also NOTFILE targets,
-	but it can also be used to force a real file to be updated as
-	well.
-
-	<P><DT><CODE>
-	LEAVES <I>targets</I> ;
-	</CODE>
-
-	<DD> Makes each of <I>targets</I> depend only on its leaf sources,
-	and not on any intermediate targets.  This makes it immune to
-	its dependencies being updated, as the "leaf" dependencies are
-	those without their own dependencies and without updating actions.
-	This allows a target to be updated only if original source files
-	change.
-
-	<P><DT><CODE>
-	NOCARE <I>targets</I> ;
-	</CODE>
-
-	<DD> Causes <b>jam</b> to ignore <I>targets</I> that neither
-	can be found nor have updating actions to build them.  Normally
-	for such targets <B>jam</B> issues a warning and then skips
-	other targets that depend on these missing targets.  The HdrRule
-	in Jambase uses NOCARE on the header file names found during
-	header file scanning, to let <b>jam</b> know that the included
-	files may not exist.   For example,  if a #include is within an
-	#ifdef, the included file may not actually be around.
-
-	<P><DT><CODE>
-	NOTFILE <I>targets</I> ;
-	</CODE>
-
-	<DD> Marks <I>targets</I> as pseudotargets and not real files.
-	No timestamp is checked, and so the actions on such a target
-	are only executed if the target's dependencies are updated, or
-	if the target is also marked with ALWAYS.  The default <b>jam</b>
-	target "all" is a pseudotarget. In Jambase, NOTFILE is used to
-	define several addition convenient pseudotargets.
-
-	<P><DT><CODE>
-	NOUPDATE <I>targets</I> ;
-	</CODE>
-
-	<DD> Causes the timestamps on <I>targets</I> to be ignored.
-	This has two effects:  first,  once the target has been created
-	it will never be updated; second, manually updating target will
-	not cause other targets to be updated.  In Jambase, for example,
-	this rule is applied to directories by the MkDir rule, because
-	MkDir only cares that the target directory exists, not when it
-	has last been updated.
-
-	<P><DT><CODE>
-	TEMPORARY <I>targets</I> ;
-	</CODE>
-
-	<DD> Marks <I>targets</I> as temporary, allowing them to be
-	removed after other targets that depend upon them have been
-	updated.  If a TEMPORARY target is missing, <b>jam</b> uses the
-	timestamp of the target's parent.  Jambase uses TEMPORARY to
-	mark object files that are archived in a library after they are
-	built, so that they can be deleted after they are archived.
-
-	</DL></TABLE>
-
-	<P> <H5> Utility Rules </H5> 
-
-	<P>
-
-	The two rules ECHO and EXIT are utility rules, used only in
-	<b>jam</b>'s parsing phase.
-
-	<P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-	<P><DT><CODE>
-	ECHO <i>args</I> ;
-	</CODE>
-
-	<DD> Blurts out the message <i>args</I> to stdout.
-
-	<P><DT><CODE>
-	EXIT <i>args</I> ;
-	</CODE>
-
-	<DD> Blurts out the message <i>args</I> to stdout and then exits
-	with a failure status.
-
-	<P>
-
-	"Echo", "echo", "Exit", and "exit" are accepted as aliases for ECHO
-	and EXIT, since it is hard to tell that these are built-in
-	rules and not part of the language, like "include".
-
-	</DL></TABLE>
-
-	<P>
-
-	The GLOB rule does filename globbing.
-
-	<P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-	<P><DT><CODE>
-	GLOB <i>directories</I> : <I>patterns</I> : <I>downcase-opt</I>
-	</CODE>
-
-	<DD>  Using the same wildcards as for the patterns in the <A
-	HREF="#switch">switch</A> statement).  It is invoked by being
-	used as an argument to a rule invocation inside of `[ ]`. For
-	example: "<TT>FILES = [ GLOB dir1 dir2 : *.c *.h ]</TT>" sets
-	A to the list of C source and header files in dir1 or dir2.
-	The resulting filenames are the full pathnames, including the
-	directory, but the pattern is applied only to the file name
-	without the directory.  
-
-    <p>If <I>downcase-opt</I> is supplied, filenames are converted to
-	all-lowercase before matching against the pattern; you can use
-	this to do case-insensitive matching using lowercase patterns.
-	The paths returned will still have mixed case if the OS supplies
-	them.  On Windows NT and Cygwin, filenames are always downcased
-	before matching.
-
-	</DL></TABLE>
-
-	<P>
-
-	The MATCH rule does pattern matching.
-
-	<P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-	<P><DT><CODE>
-	MATCH <i>regexps</I> : <I>list</I>
-	</CODE>
-
-	<DD> Matches the <b>egrep</b>(1) style regular expressions
-	<I>regexps</I> against the strings in <I>list</I>.  The result
-	is the concatenation of matching <tt>()</tt> subexpressions for
-	each string in <I>list</I>, and for each regular expression in    
-	<I>regexps</I>.  Only useful within the <tt>[ ]</tt> construct,
-	to change the result into a list.
-
-	</DL></TABLE>
-
-<DT> <P> <H3> Flow-of-Control </H3> <DD>
-
-	<P>
-
-	Jam has several simple flow-of-control statements:
-
-	<P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-	    <P><DT><CODE> 
-
-		for <I>var</I> in <I>list</I> { <I>statements</I> }
-
-	    </CODE>
-
-	    <P><DD> Executes <i>statements</i> for each element in
-	    <i>list</i>, setting the variable <i>var</i> to the element
-	    value.
-
-	    <A name=if>
-	    <P><DT><CODE>
-	    </A>
-
-		if <I>cond</I> { <I>statements</I> } 
-		<BR> [ else <I>statements</I> ]
-
-	    </CODE>
-
-	    <P><DD> Does the obvious;  the else clause is optional.
-	    <i>cond</i> is built of:
-
-	    <TABLE> 
-
-		<TR><TD> <CODE><I>a</I></CODE></TD>
-		<TD> true if any <I>a</I> element is a non-zero-length 
-		string</TD>
-		<TR><TD> <CODE><I>a</I> = <I>b</I></CODE> </TD>
-		<TD> list <I>a</I> matches list <I>b</I> 
-		string-for-string</TD>
-		<TR><TD> <CODE><I>a</I> != <I>b</I> </CODE></TD>
-		<TD> list <I>a</I> does not match list <I>b</I></TD>
-		<TR><TD> <CODE><I>a</I> &lt; <I>b</I> </CODE></TD>
-		<TD> <I>a[i]</I> string is less than <I>b[i]</I>
-		string, where <i>i</i> is first mismatched element
-		in lists <I>a</I> and <I>b</I></TD>
-		<TR><TD> <CODE><I>a</I> &lt;= <I>b</I> </CODE></TD>
-		<TD> every <I>a</I> string is less than or equal to
-		its <I>b</I> counterpart</TD>
-		<TR><TD> <CODE><I>a</I> &gt; <I>b</I> </CODE></TD>
-		<TD> <I>a[i]</I> string is greater than <I>b[i]</I>
-		string, where <i>i</i> is first mismatched element</TD>
-		<TR><TD> <CODE><I>a</I> &gt;= <I>b</I> </CODE></TD>
-		<TD> every <I>a</I> string is greater than or equal to
-		its <I>b</I> counterpart</TD>
-		<TR><TD> <CODE><I>a</I> in <I>b</I> </CODE></TD>
-		<TD> true if all elements of <I>a</I> can be found
-		in <I>b</I>, or if <I>a</I> has no elements</TD>
-		<TR><TD> <CODE>! <I>cond</I> </CODE></TD>
-		<TD> condition not true</TD>
-		<TR><TD> <CODE><I>cond</I> && <I>cond</I> </CODE></TD>
-		<TD> conjunction</TD>
-		<TR><TD> <CODE><I>cond</I> || <I>cond</I> </CODE></TD>
-		<TD> disjunction</TD>
-		<TR><TD> <CODE>( <I>cond</I> ) </CODE></TD>
-		<TD> precedence grouping</TD>
-
-	    </TABLE>
-
-	    <P><DT> <CODE>
-
-		include <I>file</I> ;
-
-	    </CODE>
-
-	    <P><DD> Causes <b>jam</b> to read the named <i>file</i>.
-	    The file is bound like a regular target (see <A
-	    HREF="#binding"> Binding</A> above) but unlike a regular
-	    target the include file cannot be built.
-
-	    <P>
-
-	    The include file is inserted into the input stream during
-	    the parsing phase. The primary input file and all the included
-	    file(s) are treated as a single file; that is, <b>jam</b>
-	    infers no scope boundaries from included files.
-
-	    <P><DT> <CODE>
-
-		local <i>vars</I> [ = <i>values</i> ] ;
-
-	    </CODE>
-
-	    <P><DD> Creates new <i>vars</i> inside to the enclosing {}
-	    block, obscuring any previous values they might have.  The
-	    previous values for <i>vars</i> are restored when the current
-	    block ends.  Any rule called or file included will see the
-	    local and not the previous value (this is sometimes called
-	    Dynamic Scoping).  The local statement may appear anywhere,
-	    even outside of a block (in which case the previous value
-	    is restored when the input ends).  The <i>vars</i> are
-	    initialized to <i>values</i> if present, or left uninitialized
-	    otherwise.
-
-	    <P><DT> <CODE>
-
-		return <I>values</I> ; 
-
-	    </CODE>
-
-	    <P><DD> Within a rule body, the return statement sets the return
-            value for an invocation of the rule. It does <i>not</i> cause the
-            rule to return; a rule's value is actually the value of the
-            last statement executed, so a return should be the
-	    last statement executed before the rule "naturally" returns.
-
-	    <P><DT> <CODE>
-
-		<A NAME="switch">
-		switch <I>value</I> 
-		</A>
-		<BR> { 
-		<BR> case <I>pattern1</I> : <I>statements</I> ; 
-		<BR> case <I>pattern2</I> : <I>statements</I> ; 
-		<BR> ... 
-		<BR> }
-
-	    </CODE>
-
-	    <P><DD> The switch statement executes zero or one of the
-	    enclosed <i>statements</i>, depending on which, if any, is
-	    the first case whose <i>pattern</I> matches <i>value</i>.
-	    The <i>pattern</I> values are not variable-expanded.  The
-	    <i>pattern</I>  values may include the following wildcards:
-
-	    <TABLE>
-
-		<TR><TD><CODE> ? </CODE></TD>
-		<TD> match any single character </TD>
-		<TR><TD><CODE> * </CODE></TD>
-		<TD> match zero or more characters </TD>
-		<TR><TD><CODE> [<i>chars</i>] </CODE></TD>
-		<TD> match any single character in <i>chars</i> </TD>
-		<TR><TD><CODE> [^<i>chars</i>] </CODE></TD>
-		<TD> match any single character not in <i>chars</i> </TD>
-		<TR><TD><CODE> \<i>x</i> </CODE></TD>
-		<TD> match <i>x</i> (escapes the other wildcards)</i> </TD>
-
-	    </TABLE>
-
-	    <P><DT> <CODE>
-
-		while <I>cond</I> { <I>statements</I> }
-
-	    </CODE>
-
-	    <P><DD> Repeatedly execute <I>statements</I> while <I>cond</I>
-	    remains true upon entry. (See the description of <I>cond</I>
-	    expression syntax under <a href="#if">if</a>, above).
-	</DL></TABLE>
-
-<DT> <P> <H3> Variables </H3> <DD>
-
-	<P>
-
-	<B>Jam</b> variables are lists of zero or more elements, with
-	each element being a string value.  An undefined variable is
-	indistinguishable from a variable with an empty list, however,
-	a defined variable may have one more elements which are null
-	strings.  All variables are referenced as $(<I>variable</I>).
-
-	<P>
-
-	Variables are either global or target-specific.  In the latter
-	case, the variable takes on the given value only during the
-	updating of the specific target.
-
-	<P>
-
-	A variable is defined with:
-
-	<P> <TABLE WIDTH=75% ALIGN=CENTER> <TR><TD> <DL>
-
-	    <DT><CODE> 
-	    <I>variable</I> = <I>elements</I> ; </CODE>
-	    <DT><CODE> 
-	    <I>variable</I> += <I>elements</I> ; </CODE>
-	    <DT><CODE> 
-	    <I>variable</I> on <I>targets</I> = <I>elements</I> ; </CODE>
-	    <DT><CODE> 
-	    <I>variable</I> on <I>targets</I> += <I>elements</I> ; </CODE>
-	    <DT><CODE> 
-	    <I>variable</I> default = <I>elements</I> ; </CODE>
-	    <DT><CODE> 
-	    <I>variable</I> ?= <I>elements</I> ; </CODE>
-
-	</DL></TABLE>
-
-	<P>
-
-	The first two forms set <I>variable</I> globally.  The third
-	and forth forms set a target-specific variable.  The = operator
-	replaces any previous elements of <I>variable</I> with
-	<I>elements</I>; the += operation adds <I>elements</I> to
-	<I>variable</I>'s list of elements.  The final two forms are
-	synonymous: they set <I>variable</I> globally, but only if it
-	was previously unset.
-
-	<P>
-
-	Variables referenced in updating commands will be replaced with
-	their values; target-specific values take precedence over global
-	values.  Variables passed as arguments ($(1) and $(2)) to actions
-	are replaced with their bound values; the "bind" modifier can
-	be used on actions to cause other variables to be replaced with
-	bound values.  See <A HREF="#actionmods">Action Modifiers</A>
-	above.
-
-	<P>
-
-	<B>Jam</b> variables are not re-exported to the environment of
-	the shell that executes the updating actions, but the updating
-	actions can reference <b>jam</b> variables with $(<I>variable</I>).
-
-	<P> <H4> Variable Expansion </H4>
-
-	<P>
-
-	During parsing, <b>jam</b> performs variable expansion on each
-	token that is not a keyword or rule name.  Such tokens with
-	embedded variable references are replaced with zero or more
-	tokens.  Variable references are of the form $(<I>v</I>) or
-	$(<I>vm</I>), where <i>v</i> is the variable name,  and  <I>m</I>
-	are optional modifiers.
-
-	<P>
-
-	Variable expansion in a rule's actions is similar to variable
-	expansion in statements,  except that the action string is
-	tokenized at whitespace regardless of quoting.
-
-	<P>
-
-	The result of a token after variable expansion is the
-	<i>product</i> of the components of the token, where each
-	component is a literal substring or a list substituting a variable
-	reference.  For example:
-
-	<P> <TABLE WIDTH=75% ALIGN=CENTER><TR><TD><CODE>
-
-	    <BR>$(X)      -> a b c
-	    <BR>t$(X)     -> ta tb tc
-	    <BR>$(X)z     -> az bz cz
-	    <BR>$(X)-$(X) -> a-a a-b a-c b-a b-b b-c c-a c-b c-c
-
-	</CODE></TABLE>
-
-	<P>
-
-	The variable name and modifiers can themselves contain
-	a variable reference,  and this partakes of the product
-	as well:
-
-	<P> <TABLE WIDTH=75% ALIGN=CENTER><TR><TD><CODE>
-
-	    <BR>$(X)      -> a b c
-	    <BR>$(Y)      -> 1 2
-	    <BR>$(Z)      -> X Y
-	    <BR>$($(Z))   -> a b c 1 2
-
-	</CODE></TABLE>
-
-	<P>
-
-	Because of this product expansion, if any variable reference in
-	a token is undefined, the result of the expansion is an empty
-	list.  If any variable element is a null string, the result
-	propagates the non-null elements:
-
-	<P> <TABLE WIDTH=75% ALIGN=CENTER><TR><TD><CODE>
-
-	    <BR>$(X)        -> a ""
-	    <BR>$(Y)        -> "" 1
-	    <BR>$(Z)	  -> 
-	    <BR>*$(X)$(Y)*  -> *a* *a1* ** *1*
-	    <BR>*$(X)$(Z)*  ->
-
-	</CODE></TABLE>
-
-	<P>
-
-	A variable element's string value can be parsed into grist and
-	filename-related components.  Modifiers to a variable are used
-	to select elements, select components, and replace components.
-	The modifiers are:
-
-	<P> <TABLE WIDTH=75% ALIGN=CENTER>
-
-	    <TR><TD><CODE> [<I>n</I>] </CODE>
-	    <TD>Select element number <I>n</I> (starting at 1).  If
-	    the variable contains fewer than <I>n</I> elements,
-	    the result is a zero-element list.
-
-	    <TR><TD><CODE> [<I>n</I>-<I>m</I>] </CODE>
-	    <TD>Select elements number <I>n</I> through <I>m</I>.
-
-	    <TR><TD><CODE> [<I>n</I>-] </CODE>
-	    <TD>Select elements number <I>n</I> through the last.
-
-	    <TR><TD><CODE> :B </CODE>
-	    <TD>Select filename base.
-
-	    <TR><TD><CODE> :S </CODE>
-	    <TD>Select (last) filename suffix.
-
-	    <TR><TD><CODE> :M </CODE>
-	    <TD>Select archive member name.
-
-	    <TR><TD><CODE> :D </CODE>
-	    <TD>Select directory path.
-
-	    <TR><TD><CODE> :P </CODE>
-	    <TD>Select parent directory.
-
-	    <TR><TD><CODE> :G </CODE>
-	    <TD>Select grist.
-
-	    <TR><TD><CODE> :U </CODE>
-	    <TD>Replace lowercase characters with uppercase.
-
-	    <TR><TD><CODE> :L </CODE>
-	    <TD>Replace uppercase characters with lowercase.
-
-	    <TR><TD><CODE> :<i>chars</I> </CODE>
-	    <TD>Select the components listed in <i>chars</i>.
-
-	    <TR><TD><CODE> :G=<I>grist</I> </CODE>
-	    <TD>Replace grist with <I>grist</I>.
-
-	    <TR><TD><CODE> :D=<I>path</I> </CODE>
-	    <TD>Replace directory with <I>path</I>.
-
-	    <TR><TD><CODE> :B=<I>base</I> </CODE>
-	    <TD>Replace the base part of file name with <I>base</I>.
-
-	    <TR><TD><CODE> :S=<I>suf</I> </CODE>
-	    <TD>Replace the suffix of file name with <I>suf</I>.
-
-	    <TR><TD><CODE> :M=<I>mem</I> </CODE>
-	    <TD>Replace the archive member name with <I>mem</I>.
-
-	    <TR><TD><CODE> :R=<I>root</I> </CODE>
-	    <TD>Prepend <I>root</I> to the whole file name,  if not
-	    already rooted.
-
-	    <TR><TD><CODE> :E=<I>value</I> </CODE>
-	    <TD>Assign <I>value</I> to the variable if it is unset.
-
-	    <TR><TD><CODE> :J=<I>joinval</I> </CODE>
-	    <TD>Concatentate list elements into single
-            element, separated by <I>joinval</I>.
-
-	</TABLE>
-
-	<P>
-
-	On VMS, $(var:P) is the parent directory of $(var:D).
-
-<DT> <P> <H3> Built-in Variables </H3> <DD>
-
-	<P>
-
-	This section discusses variables that have special meaning to
-	<b>jam</b>.
-
-	<A NAME="search">
-	<P> <H4> SEARCH and LOCATE Variables </H4>
-	</A>
-
-	<P>
-
-	These two variables control the binding of file target names to
-	locations in the file system.  Generally, $(SEARCH) is used to
-	find existing sources while $(LOCATE) is used to fix the location
-	for built targets.
-
-	<P>
-
-	Rooted (absolute path) file targets are bound as is.  Unrooted
-	file target names are also normally bound as is, and thus relative
-	to the current directory, but the settings of $(LOCATE) and
-	$(SEARCH) alter this:
-
-	<P>
-
-	<UL>
-
-	<LI> If $(LOCATE) is set then the target is bound relative to
-	the first directory in $(LOCATE).  Only the first element is
-	used for binding.
-
-	<LI> If $(SEARCH) is set then the target is bound to the first
-	directory in $(SEARCH) where the target file already exists.
-
-	<LI> If the $(SEARCH) search fails, the target is bound relative
-	to the current directory anyhow.
-
-	</UL>
-
-	<P>
-
-	Both $(SEARCH) and $(LOCATE) should be set target-specific and
-	not globally.  If they were set globally,  <b>jam</b> would use
-	the same paths for all file binding, which is not likely to
-	produce sane results.  When writing your own rules,  especially
-	ones not built upon those in Jambase, you may need to set
-	$(SEARCH) or $(LOCATE) directly.  Almost all of the rules defined
-	in Jambase set $(SEARCH) and $(LOCATE) to sensible values for
-	sources they are looking for and targets they create, respectively.
-
-	<A NAME="hdrscan">
-	<P> <H4> HDRSCAN and HDRRULE Variables </H4>
-	</A>
-
-	<P>
-
-	These two variable control header file scanning.  $(HDRSCAN) is
-	an <b>egrep</b>(1) pattern, with ()'s surrounding the file name,
-	used to find file inclusion statements in source files.  Jambase
-	uses $(HDRPATTERN) as the pattern for $(HDRSCAN).  $(HDRRULE)
-	is the name of a rule to invoke with the results of the scan:
-	the scanned file is the target, the found files are the sources.
-	This is the only place where <b>jam</b> invokes a rule through
-	a variable setting.
-
-	<P>
-
-	Both $(HDRSCAN) and $(HDRRULE) must be set for header file
-	scanning to take place, and they should be set target-specific
-	and not globally.  If they were set globally, all files, including
-	executables and libraries, would be scanned for header file
-	include statements.
-
-	<P>
-
-	The scanning for header file inclusions is not exact, but it is
-	at least dynamic, so there is no need to run something like
-	<b>makedepend</b>(GNU) to create a static dependency file. The
-	scanning mechanism errs on the side of inclusion (i.e., it is
-	more likely to return filenames that are not actually used by
-	the compiler than to miss include files) because it can't tell
-	if #include lines are inside #ifdefs or other conditional logic.
-	In Jambase, HdrRule applies the NOCARE rule to each header file
-	found during scanning so that if the file isn't present yet
-	doesn't cause the compilation to fail, <b>jam</b> won't care.
-
-	<P>
-
-	Also, scanning for regular expressions only works where the
-	included file name is literally in the source file.  It can't
-	handle languages that allow including files using variable names
-	(as the Jam language itself does).
-
-	<P> <H4> Platform Identifier Variables </H4>
-
-	<P>
-
-	A number of Jam built-in variables can be used to identify
-	runtime platform:
-
-	<P>
-
-	<TABLE WIDTH=75% ALIGN=CENTER>
-
-	    <TR><TD>OS<TD>OS identifier string 
-	    <TR><TD>OSPLAT<TD>Underlying architecture, when applicable
-	    <TR><TD>MAC<TD>true on MAC platform
-	    <TR><TD>NT<TD>true on NT platform
-	    <TR><TD>OS2<TD>true on OS2 platform
-	    <TR><TD>UNIX<TD>true on Unix platforms
-	    <TR><TD>VMS<TD>true on VMS platform
-
-	</TABLE>
-
-	<P> <H4> Jam Version Variables </H4>
-
-	<P>
-
-	<TABLE WIDTH=75% ALIGN=CENTER>
-
-	    <TR><TD>JAMDATE<TD>Time and date at <b>jam</b> start-up.
-	    <TR><TD>JAMUNAME<TD>Ouput of <b>uname</b>(1) command (Unix only)
-	    <TR><TD>JAMVERSION<TD><b>jam</b> version, currently "2.3"
-
-	</TABLE>
-
-	<P> <H4> JAMSHELL Variable </H4>
-
-	<P>
-
-	When  <b>jam</b>  executes a  rule's action block, it forks and
-	execs a shell, passing the action block as an argument to the
-	shell.   The invocation of the shell can be controlled by
-	$(JAMSHELL).  The default on Unix is, for example:
-
-	<P>
-
-	<CODE>JAMSHELL = /bin/sh -c % ;</CODE>
-
-	<P>
-
-	The % is replaced with the text of the action block.
-
-	<P>
-
-	<B>Jam</b>  does not directly support building in parallel across
-	multiple hosts, since that is heavily dependent on the local
-	environment.   To build in parallel across multiple hosts, you
-	need to write your own shell that provides access to the multiple
-	hosts.  You then reset $(JAMSHELL) to reference it.
-
-	<P>
-
-	Just as <b>jam</b> expands a % to be the text of the rule's
-	action block, it expands a ! to be the multi-process slot number.
-	The slot number varies between 1 and the number of concurrent
-	jobs permitted by the -j flag given on the command line.  Armed
-	with this, it is possible to write a multiple host shell.  For
-	example:
-
-	<P>
-
-	<TABLE WIDTH=75% ALIGN=CENTER><TR><TD><CODE>
-
-	    <BR>#!/bin/sh
-	    <BR>
-	    <BR># This sample JAMSHELL uses the SunOS on(1) command to execute a
-	    <BR># command string with an identical environment on another host.
-	    <BR>
-	    <BR># Set JAMSHELL = jamshell ! %
-	    <BR>#
-	    <BR># where jamshell is the name of this shell file.
-	    <BR>#
-	    <BR># This version handles up to -j6; after that they get executed
-	    <BR># locally.
-	    <BR>
-	    <BR>case $1 in
-	    <BR>1|4) on winken sh -c "$2";;
-	    <BR>2|5) on blinken sh -c "$2";;
-	    <BR>3|6) on nod sh -c "$2";;
-	    <BR>*)   eval "$2";;
-	    <BR>esac
-
-	</CODE></TABLE>
-
-
-<DT> <P> <H2> DIAGNOSTICS </H2>  <DD>
-
-	<P>
-
-       In addition to generic error messages, <B>jam</B> may emit one of
-       the following:
-
-       <P><TABLE WIDTH=75% ALIGN=CENTER><TR><TD><DL>
-
-       <P><DT><CODE> warning: unknown rule X </CODE> <DD>
-
-              A rule was invoked that has not been defined with
-              an "actions" or "rule" statement.
-
-       <P><DT><CODE> using N temp target(s) </CODE> <DD>
-
-              Targets marked as being temporary (but nonetheless
-              present) have been found.
-
-       <P><DT><CODE> updating N target(s) </CODE> <DD>
-
-              Targets are out-of-date and will be updated.
-
-       <P><DT><CODE> can't find N target(s) </CODE> <DD>
-
-              Source files can't be found and there are no
-              actions to create them.
-
-       <P><DT><CODE> can't make N target(s) </CODE> <DD>
-
-              Due to sources not being found, other targets cannot be made.
-
-       <P><DT><CODE> warning: X depends on itself </CODE> <DD>
-
-              A target depends on itself either directly or
-              through its sources.
-
-       <P><DT><CODE> don't know how to make X </CODE> <DD>
-
-              A target is not present and no actions have been
-              defined to create it.
-
-       <P><DT><CODE> X skipped for lack of Y </CODE> <DD>
-
-              A source failed to build, and thus a target cannot
-              be built.
-
-       <P><DT><CODE> warning: using independent target X </CODE> <DD>
-
-              A target that is not a dependency of any other
-              target is being referenced with $(&lt;) or $(&gt;).
-
-       <P><DT><CODE> X removed </CODE> <DD>
-
-              <b>Jam</b>  removed a  partially built target after being
-              interrupted.
-
-	</DL></TABLE>
-
-<DT> <P> <H2> BUGS, LIMITATIONS </H2> <DD>
-
-	<P>
-
-	The -j flag can cause <B>jam</B> to get confused when single
-	actions update more than one target at a time. <B>jam</B> may
-	proceed as if the targets were built even though they are still
-	under construction.
-
-	<P>
-
-	For parallel building to be successful, the dependencies among
-	files must be properly spelled out, as targets tend to get built
-	in a quickest-first ordering.  Also, beware of un-parallelizable
-	commands that drop fixed-named files into the current directory,
-	like <b>yacc</b>(1) does.
-
-	<P>
-
-	With the -j flag, errors from failed commands can get staggeringly
-	mixed up.  
-
-	<P>
-
-	A poorly set $(JAMSHELL) is likely to result in silent failure.
-
-<DT> <P> <H2> SEE ALSO </H2> <DD>
-
-	<P>
-
-	<UL>
-
-	<LI> <a href="Jambase.html">Jambase Reference</a>
-
-	<LI> <a href="Jamfile.html">Using Jamfiles and Jambase</a>
-
-	</UL>
-
-	<P>
-
-	Jam documentation and source are available from the <A
-	HREF="http://public.perforce.com/public/index.html">Perforce
-	Public Depot</a>.
-
-<DT> <P> <H2> AUTHOR </H2>   <DD>
-
-	<P>
-	Jam's author is Christopher Seiwald (<a 
-	href="mailto:seiwald at perforce.com">seiwald at perforce.com</A>).
-	Documentation is provided by 
-	<A HREF="http://www.perforce.com">Perforce Software, Inc.</A>
-
-</DL>
-
-<P> <HR>   
-
-	<P>
-
-        Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.
-        <BR>
-        Comments to <A HREF="mailto:info at perforce.com">info at perforce.com</A>
-        <BR>
-        Last updated: April 1, 2002
-	<BR>
-	$Id: Jam.html,v 1.6 2003/09/01 08:04:33 vladimir_prus Exp $
-
-</BODY> 
-</HTML>
-

Modified: boost-build/branches/upstream/current/jam_src/Jambase
===================================================================
--- boost-build/branches/upstream/current/jam_src/Jambase	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/Jambase	2006-11-09 09:53:31 UTC (rev 14016)
@@ -51,8 +51,15 @@
     BOOST_BUILD_PATH = /usr/share/boost-build ;
 }
 
+    
+rule _poke ( module-name ? : variables + : value * )
+{
+    module $(<)
+    {
+        $(>) = $(3) ;
+    }
+}
 
-
 # This rule can be invoked from an optional user's boost-build.jam
 # file to both indicate where to find the build system files, and to
 # load them. The path indicated is relative to the location of the
@@ -72,8 +79,14 @@
     # Add the given directory to the path so we can find the build
     # system. If dir is empty, has no effect.
     #
-    BOOST_BUILD_PATH = $(dir:R=$(.boost-build-file:D)) $(BOOST_BUILD_PATH) ;
+    BOOST_BUILD_PATH = $(BOOST_BUILD_PATH) $(dir:R=$(.boost-build-file:D)) ;
     
+    # We might have just modified the *global* value of BOOST_BUILD_PATH.
+    # The code that loads the rest of Boost.Build, in particular the 
+    # site-config.jam and user-config.jam files uses os.environ, so we need to
+    # update the value there.    
+    _poke .ENVIRON : BOOST_BUILD_PATH : $(BOOST_BUILD_PATH) ;
+            
     # Try to find the build system bootstrap file 'bootstrap.jam'.
     #
     local bootstrap-file =
@@ -101,8 +114,7 @@
         ECHO "notice: loading Boost.Build from" 
           [ NORMALIZE_PATH $(.bootstrap-file:D) ] ;
     }
-    
-    
+           
     # Load the build system, now that we know where to start from.
     #
     include $(.bootstrap-file) ;
@@ -126,13 +138,7 @@
         [ GLOB $(search-path) : boost-build.jam ] ;
     
     .boost-build-file = $(boost-build-files[1]) ;
-    
-    if [ MATCH .*(--debug-configuration).* : $(ARGV) ]
-    {
-        ECHO "notice: found boost-build.jam at" 
-          [ NORMALIZE_PATH $(.boost-build-file) ] ;
-    }
-        
+            
     # There is no boost-build.jam we can find, exit with an error, and information.
     #
     if ! $(.boost-build-file)
@@ -153,6 +159,12 @@
         EXIT "Please consult the documentation at 'http://www.boost.org'." ;
     }
     
+    if [ MATCH .*(--debug-configuration).* : $(ARGV) ]      
+    {
+        ECHO "notice: found boost-build.jam at" 
+             [ NORMALIZE_PATH $(.boost-build-file) ] ;
+    }
+    
     # Now load the boost-build.jam to get the build system loaded. This
     # incidentaly loads the users jamfile and attempts to build targets.
     #

Deleted: boost-build/branches/upstream/current/jam_src/Jambase.html
===================================================================
--- boost-build/branches/upstream/current/jam_src/Jambase.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/Jambase.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,931 +0,0 @@
-<HTML>
-<TITLE>
-Jambase Reference
-</TITLE>
-<BODY>
-<CENTER>
-<a href=http://www.perforce.com/jam/jam.html>
-Jam/MR
-</a>
-<H1>
-<A NAME="TOP">
-Jambase Reference
-</A>
-</H1>
-</CENTER>
-<P>
-       Jambase is a base set of Jam/MR rules which
-       provide roughly make(1)-like functionality for 
-       <a href="Jam.html"><b>jam</b></A>, the Jam/MR executable program.
-       This document, which started out as the Jambase(5) man page, 
-       is a reference guide to the 
-       <A href="#RULES">rules</A>,
-       <A href="#PSEUDOTARGETS">pseudotargets</A>,
-       and <A href="#VARS">variables</A> 
-       defined in Jambase for use in Jamfiles.
-<P>
-	For further information see:
-<UL>
-<LI>
-	<a href="Jamfile.html">Using Jamfiles and Jambase</A>
-<LI>
-	<a href="Jam.html">The Jam/MR Executable Program</A>
-</UL>
-<P>
-Jam/MR documentation and source are available from the
-<A HREF=http://public.perforce.com/public/index.html>Perforce Public Depot</a>.
-For detailed information about any of the rules summarized below,
-see the 
-<A HREF=http://public.perforce.com/public/jam/src/Jambase>Jambase</a> 
-file itself.
-<HR>
-<H2>
-<A NAME="RULES">
-Jambase Rules
-</A>
-</H2>
-<P>
-       <B>As</B> <I>obj.o</I> : <I>source.s</I> ;
-<BLOCKQUOTE>
-              Assemble the file <I>source.s.</I>  Called by  the  Object
-              rule.
-</BLOCKQUOTE>
-       <B>Bulk</B> <I>directory</I> : <I>sources</I> ;
-<BLOCKQUOTE>
-              Copies  <I>sources</I>  into  <I>directory.</I>
-</BLOCKQUOTE>
-       <B>Cc</B> <I>object</I> : <I>source</I> ;
-<BLOCKQUOTE>
-              Compile the file <I>source</I> into <I>object,</I>  using  the  C
-              compiler  $(CC), its flags $(CCFLAGS) and $(OPTIM),
-              and the header file directories $(HDRS).  Called by
-              the Object rule.
-</BLOCKQUOTE>
-       <B>C++</B> <I>obj.o</I> : <I>source.cc</I> ;
-<BLOCKQUOTE>
-              Compile  the  C++ source file <I>source.cc.</I>  Called by
-              the Object rule.
-</BLOCKQUOTE>
-	<B>Chmod</B> <I>target</I> ;
-<BLOCKQUOTE>
-		<I>(Unix and VMS only.)</I>
-		Change file permissions on <I>target</I> to
-		target-specific $(MODE) value set by Link, File,
-		Install*, and Shell rules.
-</BLOCKQUOTE>
-
-       <B>Clean</B> <I>clean</I> : <I>targets</I> ;
-<BLOCKQUOTE>
-              Removes  existing  <I>targets</I>  when  <I>clean</I>  is  built.
-              clean is not a dependency of all, and must be built
-              explicitly for targets to be removed.
-</BLOCKQUOTE>
-       <B>FDefines</B> <I>defines</I> ; <BLOCKQUOTE>
-              Expands a list of definitions into a list of compiler
-              (or preprocessor) switches (such as
-               -D<I>symbol</I>=<I>val</I> on Unix)
-              to pass the definitions.
-</BLOCKQUOTE>
-       <B>File</B> <I>target</I> : <I>source</I> ;
-<BLOCKQUOTE>
-              Copies <I>source</I> into <I>target.</I>
-</BLOCKQUOTE>
-       <B>FIncludes</B> <I>dirs</I> ; <BLOCKQUOTE>
-              Expands a list of directories into a list of compiler
-              (or preprocessor) switches (such as -I<I>dir</I> on Unix)
-              to add the directories to the header inclusion search path.
-</BLOCKQUOTE>
-       <B>Fortran</B> <I>obj.o</I> : <I>source.f</I> ;
-<BLOCKQUOTE>
-              Compile the Fortran source file  <I>source.f.</I>   Called
-              by the Object rule.
-</BLOCKQUOTE>
-       <B>FQuote</B> <I>files</I> ; <BLOCKQUOTE>
-              Returns each of <I>files</I> suitably quoted so as to hide shell
-              metacharacters (such as whitespace and filename matching wildcards)
-              from the shell.
-</BLOCKQUOTE>
-<P>
-	<B>GenFile</B> <I>target</I> : <I>image</I> <I>sources</I> ;
-<BLOCKQUOTE>
-		Runs the command "<I>image</I> <I>target</I> <I>sources</I>"
-		to create <I>target</I> from <I>sources</I> and
-		<I>image</I>. (where <I>image</I> is an
-		executable built by the Main rule.)
-</BLOCKQUOTE>
-       <B>HardLink</B> <I>target</I> : <I>source</I> ;
-<BLOCKQUOTE>
-              Makes <I>target</I> a hard link to <I>source,</I> if it isn't one
-              already. (Unix only.)
-</BLOCKQUOTE>
-       <B>HdrRule</B> <I>source</I> : <I>headers</I> ;
-<BLOCKQUOTE>
-              Arranges the  proper  dependencies  when  the  file
-              <I>source</I>  includes  the  files  <I>headers</I>  through  the
-              "#include" C preprocessor  directive.   
-	      <P>
-	      This rule is not intended to be called explicitly.
-	      It is called automatically during header scanning on
-	      sources handled by the Object rule (e.g., sources in
-	      Main or Library rules).
-</BLOCKQUOTE>
-       <B>InstallBin</B> <I>dir</I> : <I>sources</I> ; <BLOCKQUOTE>
-	      Copy <I>sources</I> into <I>dir</I> with mode
-	      $(EXEMODE).  
-</BLOCKQUOTE>
-       <B>InstallLib</B> <I>dir</I> : <I>sources</I> ; <BLOCKQUOTE>
-	      Copy  <I>sources</I>  into  <I>dir</I>  with  mode
-	      $(FILEMODE).  
-</BLOCKQUOTE>
-       <B>InstallMan</B> <I>dir</I> : <I>sources</I> ; <BLOCKQUOTE>
-	      Copy  <I>sources</I>  into the appropriate subdirectory
-	      of <I>dir</I> with mode  $(FILEMODE).   The  subdirectory
-	      is man<I>s,</I>  where  <I>s</I>  is  the suffix of
-	      each of sources.  
-</BLOCKQUOTE>
-       <B>InstallShell</B> <I>dir</I> : <I>sources</I> ; <BLOCKQUOTE>
-	      Copy  <I>sources</I>  into  <I>dir</I>  with  mode
-	      $(SHELLMODE).  
-</BLOCKQUOTE>
-       <B>Lex</B> <I>source.c</I> : <I>source.l</I> ; <BLOCKQUOTE>
-	      Process  the lex(1) source file <I>source.l</I> and
-	      rename the lex.yy.c to <I>source.c.</I>   Called  by
-	      the  Object rule.
-</BLOCKQUOTE>
-       <B>Library</B> <I>library</I> : <I>sources</I> ; <BLOCKQUOTE>
-	      Compiles  <I>sources</I>  and  archives them into
-	      <I>library.</I> The  intermediate  <I>objects</I>
-	      are   deleted.    Calls Objects and LibraryFromObjects.
-	      <P>
-	      If Library is invoked with no suffix on <I>library</I>,
-	      the $(SUFLIB) suffix is used.
-</BLOCKQUOTE>
-       <B>LibraryFromObjects</B> <I>library</I> : <I>objects</I> ; 
-<BLOCKQUOTE>
-	      Archives <I>objects</I> into  <I>library.</I>   The
-	      <I>objects</I>  are then deleted.  
-	      <P>
-	      If <I>library</I> has no suffix, the $(SUFLIB) suffix is used.
-</BLOCKQUOTE>
-	<B>Link</B> <I>image</I> : <I>objects</I> ;
-<BLOCKQUOTE>
-		Links <I>image</I> from <I>objects</I> and sets
-		permissions on <I>image</I> to $(EXEMODE). 
-		 <I>Image</I> must be actual filename; suffix is not
-		 supplied.
-		Called by Main.
-	
-</BLOCKQUOTE>
-       <B>LinkLibraries</B> <I>image</I> : <I>libraries</I> ;
-<BLOCKQUOTE>
-	      Makes  <I>image</I>  depend on <I>libraries</I> and
-	      includes them during the linking.
-	      <P>
-	      <I>Image</I> may be referenced without a suffix in this
-	      rule invocation; LinkLibraries supplies the suffix.
-</BLOCKQUOTE>
-       <B>Main</B> <I>image</I> : <I>sources</I> ; 
-<BLOCKQUOTE>
-	      Compiles <I>sources</I> and links them into <I>image.</I>
-	      Calls Objects and MainFromObjects.  
-	      <P>
-	      <I>Image</I> may be referenced without a suffix in this
-	      rule invocation; Main supplies the suffix.
-</BLOCKQUOTE>
-       <B>MainFromObjects</B> <I>image</I> : <I>objects</I> ;
-<BLOCKQUOTE>
-	      Links <I>objects</I> into <I>image.</I>  Dependency
-	      of exe. MainFromObjects supplies the suffix on <I>image</I>
-	      filename.
-</BLOCKQUOTE>
-	<B>MakeLocate</B> <I>target</I> : <I>dir</I> ;
-<BLOCKQUOTE>
-	Creates <I>dir</I> and causes <I>target</I> to be built
-	into <I>dir</I>.
-</BLOCKQUOTE>
-	<B>MkDir</B> <I>dir</I> ;
-<BLOCKQUOTE>
-	Creates <I>dir</I> and its parent directories.
-</BLOCKQUOTE>
-       <B>Object</B> <I>object</I> : <I>source</I> ; 
-<BLOCKQUOTE>
-	      Compiles  a  <I>single</I> source file source into
-	      <I>object.</I> The Main and Library rules use
-	      this rule to compile source files.
-	      <P>
-	      Causes <I>source</I> to be scanned for "#include" 
-	      directives and calls HdrRule to make all included
-	      files dependedencies of <I>object</I>.
-<P>
-	      Calls one of the following rules to do the actual
-	      compiling, depending on the suffix of source:
-<PRE>
-		     *.c:   Cc 
-		     *.cc:  C++ 
-		     *.cpp: C++
-		     *.C:   C++ 
-		     *.l:   Lex 
-		     *.y:   Yacc
-		     *.*:   UserObject
-</PRE>
-</BLOCKQUOTE>
-       <B>ObjectC++Flags</B> <I>source</I> : <I>flags</I> ; 
-       <BR>
-       <B>ObjectCcFlags</B> <I>source</I> : <I>flags</I> ; 
-<BLOCKQUOTE>
-	      Add   <I>flags</I>   to   the   source-specific
-	      value  of $(CCFLAGS) or $(C++FLAGS) when compiling <I>source.</I>
-	      Any file  suffix on <I>source</I> is ignored.
-</BLOCKQUOTE>
-       <B>ObjectDefines</B> <I>object</I> : <I>defines</I> ; <BLOCKQUOTE>
-              Adds preprocessor symbol definitions to the (gristed)
-              target-specific $(CCDEFS) for the <I>object</i>.
-</BLOCKQUOTE>              	      
-       <B>ObjectHdrs</B> <I>source</I> : <I>dirs</I> ; <BLOCKQUOTE>
-	      Add  <I>dirs</I>  to  the source-specific value of
-	      $(HDRS) when scanning and compiling <I>source.</I>
-	      Any file  suffix on <I>source</I> is ignored.
-</BLOCKQUOTE>
-       <B>Objects</B> <I>sources</I> ; <BLOCKQUOTE>
-	      For  each  source  file in <I>sources,</I> calls
-	      Object to compile the source  file  into  a  similarly
-	      named object file.
-</BLOCKQUOTE>
-       <B>RmTemps</B> <I>targets</I> : <I>sources</I> ; <BLOCKQUOTE>
-	      Marks <I>sources</I> as temporary with the TEMPORARY
-	      rule, and deletes <I>sources</I> once <I>targets</I>
-	      are  built.  Must be  the  last rule invoked on
-	      <I>targets.</I>  Used internally by LibraryFromObjects rule.
-</BLOCKQUOTE>
-       <B>Setuid</B> <I>images</I> ; <BLOCKQUOTE>
-	      Sets the setuid bit on each of <I>images</I>  after
-	      linking. (Unix only.)
-
-</BLOCKQUOTE>
-       <B>SoftLink</B> <I>target</I> : <I>source</I> ;
-<BLOCKQUOTE>
-              Makes <I>target</I> a symbolic link to <I>source,</I> if it isn't one
-              already. (Unix only.)
-</BLOCKQUOTE>
-	<B>SubDir</B> <I>VAR d1 ... dn</I> ;
-<BLOCKQUOTE>
-		Sets up housekeeping for the source files located
-		in <I><CODE>$(VAR)/d1/.../dn</CODE></I>:
-		<UL>
-		<LI>Reads in rules file associated with <I>VAR</I>,
-		    if it hasn't already been read.
-		<LI>Initializes variables for search paths, 
-		    output directories, compiler
-		    flags, and grist, using <I>d1 ... dn</I> tokens.
-		</UL>
-		<P>
-		<I>VAR</I> is the name of a variable; 
-		<I>d1</I> thru <I>dn</I> are elements
-		of a directory path.
-</BLOCKQUOTE>
-	<B>SubDirC++Flags</B> <I>flags</I> ;
-	<BR>
-	<B>SubDirCcFlags</B> <I>flags</I> ;
-<BLOCKQUOTE>
-	Adds <I>flags</I> to the compiler flags for source files
-	in SubDir's directory.
-</BLOCKQUOTE>
-	<B>SubDirHdrs</B> <I>d1 ... dn</I> ;
-<BLOCKQUOTE>
-	Adds the path <I>d1/.../dn/</I> to the header search paths for
-	source files in SubDir's directory. <I>d1</I> through <I>dn</I>
-	are elements of a directory path.
-</BLOCKQUOTE>
-	<B>SubInclude</B> <I>VAR d1 ... dn</I> ;
-<BLOCKQUOTE>
-	Reads the Jamfile in <I><CODE>$(VAR)/d1/.../dn/</CODE></I>. 
-</BLOCKQUOTE>
-       <B>Shell</B> <I>image</I> : <I>source</I> ; <BLOCKQUOTE>
-	      Copies  <I>source</I>  into  the  executable  sh(1)
-	      script <I>image.</I>  Ensures that the first line of
-	      the  script is  $(SHELLHEADER) (default #!/bin/sh).
-</BLOCKQUOTE>
-       <B>Undefines</B> <I>images</I> : <I>symbols</I> ; <BLOCKQUOTE>
-		Adds flags to mark <I>symbols</I> as undefined
-		on link command for <I>images</I>.
-		<I>Images</I> may be referenced unsuffixed; the
-		Undefines rule supplies the suffix.
-</BLOCKQUOTE>
-       <B>UserObject</B> <I>object</I> : <I>source</I> ; <BLOCKQUOTE>
-	      This rule is called by Object for source
-	      files with unknown  suffixes,  and  should  be defined
-	      in Jamrules
-	      with a user-provided rule to handle the source file
-	      types not handled by the Object rule.
-	      The Jambase UserObject rule merely issues a
-	      complaint when it encounters <I>source</I> with
-	      files suffixes it does not recognize.
-</BLOCKQUOTE>
-       <B>Yacc</B> <I>source.c</I> : <I>source.y</I> ; <BLOCKQUOTE>
-	      Process  the  yacc(1) file <I>source.y</I> and renamed
-	      the resulting y.tab.c and y.tab.h  to  <I>source.c.</I>
-	      Produces a y.tab.h and renames it to <I>source.h.</I>
-	      Called by the <B>Object</B> rule.
-</BLOCKQUOTE> 
-<P> 
-<HR>   
-<A NAME="PSEUDOTARGETS">
-<H3>
-Jambase Pseudotargets
-</H3>
-</A>
-<P>
-There are two kinds of Jam targets: file targets and pseudotargets.
-File targets are objects that can be found in the filesystem.
-Pseudotargets are symbolic, and usually represent other targets.
-Most Jambase rules that define file targets also define pseudotargets
-which are dependent on types of file targets. The Jambase pseudotargets
-are:
-<CENTER>
-<TABLE CELLPADDING=5%>
-<TR><TD>exe
-	<TD>Executables linked by the Main or MainFromObjects rules
-
-<TR><TD>lib
-	<TD>Libraries created by the Library or LibraryFromObjects rules
-
-<TR><TD>obj
-	<TD>Compiled objects used to create Main or Library targets
-
-<TR><TD>dirs
-	<TD>Directories where target files are written
-
-<TR><TD>file
-	<TD>Files copied by File and Bulk rules
-
-<TR><TD>shell
-	<TD>Files copied by Shell rule
-
-<TR><TD>clean
-	<TD>Removal of built targets (except files copied by Install* rules)
-
-<TR><TD>install
-	<TD>Files copied by Install* rules
-
-<TR><TD>uninstall
-	<TD>Removal of targets copied by Install* rules
-
-</TABLE>
-</CENTER>
-<P> 
-In addition, Jambase makes the <b>jam</b> default target "all"
-depend on "exe", "lib", "obj", "files", and "shell".
-<P> 
-
-<HR>
-<A NAME="VARS">
-<H3>
-Jambase Variables 
-</H3> 
-</A>
-<P>
-	Most of the following variables have default values for
-	each platform; refer to the Jambase file to see what those
-	defaults are.
-<P>
-	ALL_LOCATE_TARGET
-<BLOCKQUOTE>
-		Alternative location of built targets. By default,
-		Jambase rules locate built targets in the source
-		tree. By setting $(ALL_LOCATE_TARGET)
-		in Jamrules, you can cause <b>jam</b>
-		to write built targets to a location outside
-		the source tree.
-</BLOCKQUOTE>
-
-       AR
-
-<BLOCKQUOTE>
-              The archive command used to update Library
-	      and LibraryFromObjects targets.
-</BLOCKQUOTE>
-       AS
-<BLOCKQUOTE>
-              The assembler for As rule targets.
-</BLOCKQUOTE>
-
-       ASFLAGS
-
-<BLOCKQUOTE>
-              Flags handed to the assembler for As.
-</BLOCKQUOTE>
-
-       AWK
-
-<BLOCKQUOTE>
-              The  name  of  awk interpreter, used when copying a
-              shell script for the Shell rule.
-</BLOCKQUOTE>
-
-	BCCROOT
-<BLOCKQUOTE>
-		Selects Borland compile and link actions on NT.
-</BLOCKQUOTE>
-
-
-       BINDIR
-
-<BLOCKQUOTE>
-              Not longer used. 
-	      (I.e., used only for backward compatibility with the
-	      obsolete INSTALLBIN rule.)
-</BLOCKQUOTE>
-
-       CC
-
-<BLOCKQUOTE>
-              C compiler used for Cc rule targets.
-</BLOCKQUOTE>
-
-       CCFLAGS
-
-<BLOCKQUOTE>
-		Compile flags for Cc rule targets.
-		The Cc rule sets target-specific $(CCFLAGS)
-		values on its targets.
-</BLOCKQUOTE>
-
-       C++
-
-<BLOCKQUOTE>
-              C++ compiler used for C++ rule targets.
-</BLOCKQUOTE>
-
-       C++FLAGS
-
-<BLOCKQUOTE>
-		Compile flags for C++ rule targets.
-		The C++ rule sets target-specific $(C++FLAGS)
-		values on its targets.
-</BLOCKQUOTE>
-
-       CHMOD
-
-<BLOCKQUOTE>
-		Program (usually chmod(1)) used to set file
-		permissions for Chmod rule.
-</BLOCKQUOTE>
-
-       CP
-
-<BLOCKQUOTE>
-              The file copy program, used by File and Install* rules.
-</BLOCKQUOTE>
-
-       CRELIB
-
-<BLOCKQUOTE>
-	      If set, causes the Library rule to invoke the CreLib
-	      rule on the target library before attempting to archive
-	      any members, so that the library can be created if
-	      needed.
-</BLOCKQUOTE>
-
-       CW
-
-<BLOCKQUOTE>
-	      On Macintosh, the root of the Code Warrior Pro 5 directory.
-</BLOCKQUOTE>
-
-       DEFINES
-
-<BLOCKQUOTE>
-	      Preprocessor symbol definitions for Cc and C++ rule targets.
-	      The Cc and C++ rules set target-specific $(CCDEFS)
-	      values on their targets, based on $(DEFINES). (The
-	      "indirection" here is required to support compilers,
-	      like VMS, with baroque command line syntax for
-	      setting symbols).
-</BLOCKQUOTE>
-
-       DOT
-
-<BLOCKQUOTE>
-	      The operating system-specific name for the current directory.
-</BLOCKQUOTE>
-
-       DOTDOT
-
-<BLOCKQUOTE>
-	      The operating system-specific name for the parent directory.
-</BLOCKQUOTE>
-
-       EXEMODE
-
-<BLOCKQUOTE>
-              Permissions for executables linked with Link, Main,
-	      and MainFromObjects, on platforms with a Chmod action.
-</BLOCKQUOTE>
-
-       FILEMODE
-
-<BLOCKQUOTE>
-              Permissions for files copied by File or Bulk,
-	      on platforms with a Chmod action.
-</BLOCKQUOTE>
-
-       FORTRAN
-
-<BLOCKQUOTE>
-              The Fortran compiler used by Fortran rule.
-</BLOCKQUOTE>
-
-       FORTRANFLAGS
-
-<BLOCKQUOTE>
-              Fortran compiler flags for Fortran rule targets.
-</BLOCKQUOTE>
-
-       GROUP
-
-<BLOCKQUOTE>
-		<I>(Unix only.)</I>
-              The  group  owner  for Install* rule targets.
-</BLOCKQUOTE>
-
-       HDRGRIST
-
-<BLOCKQUOTE>
-	      If set, used by the HdrRule to distinguish header files
-	      with the same name in diffrent directories.
-</BLOCKQUOTE>
-
-       HDRPATTERN
-
-<BLOCKQUOTE>
-              A  regular expression  pattern that matches
-	      C preprocessor "#include" directives in source files
-	      and returns the name of the included file.
-</BLOCKQUOTE>
-
-       HDRRULE
-
-<BLOCKQUOTE>
-              Name of the rule to invoke with the results of header file
-              scanning. Default is "HdrRule".
-	      <P>
-	      This is a jam-special variable. If both HDRRULE and HDRSCAN
-	      are set on a target,
-	      that target will be scanned for lines
-	      matching $(HDRSCAN), and $(HDDRULE) will be
-	      invoked on included files found in the matching $(HDRSCAN) lines.
-</BLOCKQUOTE>
-
-       HDRS
-
-<BLOCKQUOTE>
-              Directories to be  searched  for  header  files.
-	      This is used by the Object rule to:
-	      <UL>
-	      <LI>set up search paths for finding files returned
-		  by header scans
-	      <LI>add -I flags on compile commands
-	      </UL>
-	      (See STDHDRS.)
-</BLOCKQUOTE>
-
-       HDRSCAN
-
-<BLOCKQUOTE>
-		Regular expression pattern to use for header file
-		scanning. The Object rule sets this to $(HDRPATTERN).
-              This is a jam-special variable; see HDRRULE.
-</BLOCKQUOTE>
-
-       HDRSEARCH
-
-<BLOCKQUOTE>
-		Used by the HdrRule to fix the list of directories where
-		header files can be found for a given source file.
-</BLOCKQUOTE>
-
-       INSTALLGRIST
-
-<BLOCKQUOTE>
-		Used by the Install* rules to grist paths to installed
-		files; defaults to "installed".
-</BLOCKQUOTE>
-
-       JAMFILE
-
-<BLOCKQUOTE>
-		Default is "Jamfile"; the name of the user-written
-		rules file found in each source directory.
-</BLOCKQUOTE>
-
-       JAMRULES
-
-<BLOCKQUOTE>
-		Default is "Jamrules"; the name of a rule definition
-		file to be read in at the first SubDir rule invocation.
-</BLOCKQUOTE>
-
-       KEEPOBJS
-
-<BLOCKQUOTE>
-	      If set, tells the LibraryFromObjects rule not to delete
-	      object files once they are archived.  
-</BLOCKQUOTE>
-
-       LEX
-
-<BLOCKQUOTE>
-              The lex(1) command and flags.
-</BLOCKQUOTE>
-
-       LIBDIR
-
-<BLOCKQUOTE>
-              Not longer used. 
-	      (I.e., used only for backward compatibility with the
-	      obsolete INSTALLLIB rule.)
-</BLOCKQUOTE>
-
-       LINK
-
-<BLOCKQUOTE>
-              The linker. Defaults to $(CC).
-</BLOCKQUOTE>
-
-       LINKFLAGS
-
-<BLOCKQUOTE>
-              Flags handed to the linker. Defaults to $(CCFLAGS).
-</BLOCKQUOTE>
-
-       LINKLIBS
-
-<BLOCKQUOTE>
-              List of external libraries to link with.  The target  image
-              does not depend on these libraries.
-</BLOCKQUOTE>
-       
-       LN
-
-<BLOCKQUOTE>
-              The hard link command for HardLink rule.
-</BLOCKQUOTE>
-
-	LOCATE_SOURCE
-<BLOCKQUOTE>
-		Used to set the  location of generated source files.
-		The Yacc, Lex, and GenFile rules set LOCATE on
-		their targets to $(LOCATE_SOURCE).
-		$(LOCATE_SOURCE) is initialized by the SubDir rule
-		to the source directory itself.
-		(Also, see ALL_LOCATE_TARGET.)
-</BLOCKQUOTE>
-
-       LOCATE_TARGET
-<BLOCKQUOTE>
-		Used to set the  location of built binary targets. 
-	      The Object rule, and hence the Main and Library rules,
-	      set LOCATE on their targets to $(LOCATE_TARGET).
-		$(LOCATE_TARGET) is initialized by the
-		SubDir rule to the source directory itself.
-		(See ALL_LOCATE_TARGET.)
-</BLOCKQUOTE>
-
-
-       MANDIR
-
-<BLOCKQUOTE>
-              Not longer used. 
-	      (I.e., used only for backward compatibility with the
-	      obsolete INSTALLMAN rule.)
-</BLOCKQUOTE>
-
-       MKDIR
-
-<BLOCKQUOTE>
-              The  'create directory' command used for the MkDir
-              rule.
-</BLOCKQUOTE>
-
-       MODE
-
-<BLOCKQUOTE>
-              The target-specific file mode (permissions) for targets 
-	      of the Shell, Setuid, Link, and Install* rules.
-	      Used by the Chmod action; hence relevant to NT and VMS
-	      only.
-</BLOCKQUOTE>
-	
-	MSVC
-<BLOCKQUOTE>
-		Selects Microsoft Visual C 16-bit compile & link
-		actions on NT.
-</BLOCKQUOTE>
-
-	MSVCNT
-<BLOCKQUOTE>
-		Selects Microsoft Visual C NT compile & link
-		actions on NT.
-</BLOCKQUOTE>
-
-
-       MV
-
-<BLOCKQUOTE>
-              The file rename command and options.
-</BLOCKQUOTE>
-
-       NEEDLIBS
-
-<BLOCKQUOTE>
-	      The list of libraries used when linking an executable.
-	      Used by the Link rule.
-</BLOCKQUOTE>
-
-       NOARSCAN
-
-<BLOCKQUOTE>
-	      If set, indicates that library members' timestamps can't
-	      be found, and prevents the individual objects from being
-	      deleted, so that their timestamps can be used instead.
-</BLOCKQUOTE>
-
-       NOARUPDATE
-
-<BLOCKQUOTE>
-	      If set, indicates that libraries can't be updated, but only
-	      created whole.
-</BLOCKQUOTE>
-
-       OPTIM
-
-<BLOCKQUOTE>
-              The C compiler flag for optimization, used by Cc and C++
-	      rules.
-</BLOCKQUOTE>
-
-       OSFULL
-
-<BLOCKQUOTE>
-              The concatenation of $(OS)$(OSVER)$(OSPLAT), used when jam
-	      builds itself to determine the target binary directory.
-	      $(OS) and $(OSPLAT) are determined by jam at its compile
-	      time (in jam.h).  $(OSVER) can optionally be set by the user.
-
-</BLOCKQUOTE>
-
-       OWNER
-
-<BLOCKQUOTE>
-              The owner of installed files.  Used by Install* rules.
-</BLOCKQUOTE>
-
-       RANLIB
-
-<BLOCKQUOTE>
-		The name of the ranlib command. If set, causes
-		the Ranlib action to be applied after the
-		Archive action to targets of the Library rule.
-</BLOCKQUOTE>
-
-       RELOCATE
-
-<BLOCKQUOTE>
-              If set, tells the Cc rule to move the output object
-              file to its target directory because the cc command
-              has a broken -o option.
-</BLOCKQUOTE>
-
-       RM
-
-<BLOCKQUOTE>
-              The command and options to remove a file.
-</BLOCKQUOTE>
-
-       SEARCH_SOURCE
-
-<BLOCKQUOTE>
-              The  directory  to  find  sources listed with Main,
-              Library, Object,  Bulk,  File,  Shell,  InstallBin,
-              InstallLib,  and  InstallMan  rules.  This works by
-              setting the  jam-special  variable  SEARCH  to  the
-              value  of  $(SEARCH_SOURCE)  for each of the rules'
-              sources. The SubDir rule initializes SEARCH_SOURCE
-	      for each directory.
-</BLOCKQUOTE>
-
-       SHELLHEADER
-
-<BLOCKQUOTE>
-              A string inserted to the first line of  every  file
-              created by the Shell rule.
-</BLOCKQUOTE>
-
-       SHELLMODE
-
-<BLOCKQUOTE>
-              Permissions for files installed by Shell rule.
-</BLOCKQUOTE>
-
-      SOURCE_GRIST
-              
-<BLOCKQUOTE>
-	      Set by the SubDir  to  a  value  derived  from  the
-              directory  name,  and  used  by Objects and related
-              rules as 'grist' to perturb file names.
-</BLOCKQUOTE>
-
-       STDHDRS
-
-<BLOCKQUOTE>
-              Directories where  headers  can  be  found  without
-              resorting to using the flag to the C compiler.
-	      The $(STDHDRS) directories are used to find
-	      headers during scanning, but are not passed to the
-	      compiler commands as -I paths.
-</BLOCKQUOTE>
-
-       SUBDIR
-
-<BLOCKQUOTE>
-	      The path from the current directory to the directory
-	      last named by the SubDir rule.
-</BLOCKQUOTE>
-
-       TOP
-
-<BLOCKQUOTE>
-	      The path from the current directory to the directory
-	      that has the Jamrules file.  Used by the SubDir rule.
-</BLOCKQUOTE>
-
-       SUFEXE
-
-<BLOCKQUOTE>
-              The  suffix for executable files, if none provided.
-              Used by the Main rule.
-</BLOCKQUOTE>
-
-       SUFLIB
-
-<BLOCKQUOTE>
-              The suffix for libraries.  Used by the Library  and
-              related rules.
-</BLOCKQUOTE>
-
-       SUFOBJ
-
-<BLOCKQUOTE>
-              The  suffix  for object files.  Used by the Objects
-              and related rules.
-</BLOCKQUOTE>
-
-       UNDEFFLAG
-
-<BLOCKQUOTE>
-              The flag prefixed to each symbol for the  Undefines
-              rule (i.e., the compiler flag for undefined symbols).
-</BLOCKQUOTE>
-
-	WATCOM
-<BLOCKQUOTE>
-		Selects Watcom compile and link actions on OS2.
-</BLOCKQUOTE>
-
-       YACC
-
-<BLOCKQUOTE>
-              The yacc(1) command.
-</BLOCKQUOTE>
-
-       YACCFILES
-
-<BLOCKQUOTE>
-              The base filename generated by yacc(1).
-</BLOCKQUOTE>
-
-       YACCFLAGS
-
-<BLOCKQUOTE>
-              The yacc(1) command flags.
-</BLOCKQUOTE>
-
-       YACCGEN
-
-<BLOCKQUOTE>
-              The suffix used on generated yacc(1) output.
-</BLOCKQUOTE>
-
-<P>
-<HR>
-<A HREF="#TOP">Back to top.</A>
-<P>
-	Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.
-	<BR>
-	Comments to <A HREF="mailto:info at perforce.com">info at perforce.com</A>
-	<BR>
-	Last updated: Dec 31, 2000
-	<BR>
-	$Id: Jambase.html,v 1.4 2002/04/07 00:22:45 david_abrahams Exp $
-</BODY>
-</HTML>

Deleted: boost-build/branches/upstream/current/jam_src/Jamfile.html
===================================================================
--- boost-build/branches/upstream/current/jam_src/Jamfile.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/Jamfile.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,1450 +0,0 @@
-<HTML>
-<TITLE>
-Jamfiles and Jambase
-</TITLE>
-<BODY>
-<CENTER>
-<A HREF=http://www.perforce.com/jam/jam.html>
-Jam/MR
-</a>
-<A NAME="TOP">
-<H2>
-Using Jamfiles and Jambase
-</H2>
-</A>
-</CENTER>
-<P>
-This document describes how to write Jamfiles using the Jam/MR Jambase 
-rules to build software products. 
-Related documents of interest are:
-<UL>
-<LI>
-	<a href="Jam.html">The Jam/MR Executable Program</A>,
-	which describes using the <b>jam</b> command and the 
-	langauge used in Jambase
-<LI>
-	<A href="Jambase.html">Jambase Reference</A>,
-	which summarizes the Jambase rules and variables
-</UL>
-<P>
-Jam/MR documentation and source are available from the
-<A HREF=http://public.perforce.com/public/index.html>Perforce Public Depot</a>.
-<HR>
-<P>
-<H2>
-Overview
-</H2>
-<P>
-        <B>jam,</B> the Jam executable program,
-       recursively  builds  target files  from source files
-       using dependency and build specifications defined
-       in Jam rules files.
-        <B>jam</B> parses the rules files to identify targets
-        and sources,
-        examines the filesystem to determine which
-        targets need updating, and issues OS commands to update
-        targets.
-<P>
-        A base rules file called "Jambase" is provided with the 
-	Jam distribution. 
-	The Jambase file defines rules and variables which support
-	standard software build operations, like compiling, linking,
-	etc.
-<P>
-	When the Jambase rules are used,
-	<B>jam</B> reads Jambase, then reads a file called
-	"Jamfile" in the current directory.
-	The Jamfile describes what to do with the source files in 
-	its directory. It may also cause
-	Jamfiles in other directories to be read. 
-	<P>
-	Under certain circumstances, the first Jamfile read
-	also causes a site-specific "Jamrules" file to be read.
-	The Jamrules file is an optional set of rule and variable
-	definitions used to define site-specific processing.
-<P>
-<H4>
-The Basic Jamfile
-</H4>
-<P>
-Jamfiles contain rule invocations, which usually look like:
-<PRE>
-	<I>RuleName</I> <I>targets</I> : <I>targets</I> ;
-</PRE>
-The target(s) to the left of the colon usually indicate
-what gets built, and the target(s) to the right of the
-colon usually indicate what it is built from.
-<P>
-<P>
-A Jamfile can be as simple as this:
-<PRE>
-	Main myprog : main.c util.c ;
-</PRE>
-This specifies that there is a main.c and util.c file in the same
-directory as the Jamfile, and that those source files should be
-compiled and linked into an executable called myprog.
-If you cd to the directory where this Jamfile lives,
-you can see the exactly how <b>jam</b> would 
-build myprog with:
-<PRE>
-	jam -n
-</PRE>
-Or, you can actually build myprog with the command:
-<PRE>
-	jam
-</PRE>
-
-<P>
-<H4>
-Whitespace
-</H4>
-Jamfile elements are delimited by whitespace (blanks, tabs, or
-newlines). Elements to be delimited include rule names, targets,
-colons, and semicolons. A common mistake users make is to forget the
-whitespace, e.g.,
-<PRE>
-	Main myprog: main.c util.c ; #<I>WRONG!</I>
-</PRE>
-Jam doesn't distinguish between a typo and a target called "myprog:", 
-so if you get strange results, the first thing
-you should check for in your Jamfile is missing whitespace.
-<P>
-<H4>
-Filenames, Target Identifiers, and Buildable Targets
-</H4>
-<P>
-Consider this Jamfile:
-<PRE>
-	Main myprog : main.c util.c ;                   
-	LinkLibraries myprog : libtree ;     
-	Library libtree : treemake.c treetrav.c ;    
-</PRE>
-<P>
-The Main rule specifies that an executable called myprog will be built.
-The compiled main.c and util.c objects will be linked to produce
-myprog. 
-The LinkLibraries rule specifies that libtree will
-be linked into myprog as well.
-The Library rule specifies which source files will be compiled and
-archived into the libtree library.
-<P>
-The Jamfile above refers to targets like "myprog" and "libtree". 
-However, depending on the platform you're building on, the actual
-filenames of those targets could be "myprog.exe" and "libtree.lib".
-Most Jambase rules supply the actual filenames of targets,
-so that Jamfiles themselves need not make any
-platform-specific filename references.
-<P>
-The <b>jam</b> program builds up a list of unique target identifiers.
-Unless you are using the SubDir rules (described later),
-the default identifier for a file target is its filename. In the above
-example, the target identifiers are the filenames: myprog.exe,
-libtree.lib, main.obj, etc.
-<P>
-While all Jambase rules refer to "targets",
-not all targets are buildable.
-There are two kinds of buildable targets: 
-file targets and pseudotargets.
-File targets are objects that can be found in the filesystem.
-Pseudotargets are symbolic, and represent other targets.
-<P>
-You can use any buildable target on the <b>jam</b> command line to
-build a subset of defined targets. For example:
-<PRE>
-        jam libtree.a 
-</PRE>
-on Unix builds the libtree library and all the compiled objects
-that go in it.
-<P>
-<H4>
-Pseudotargets
-</H4>
-<P>
-Most Jambase rules that define file targets also define pseudotargets
-which are dependent on types of file targets.
-For example, Jambase defines a pseudotarget called "lib", which 
-is dependent on file targets created by the Library rule. So 
-the command:  
-<PRE>
-        jam lib
-</PRE> 
-used with the above example would cause the libtree library to be built.
-Also, there is one pseudotarget built into <b>jam</b> itself, called
-"all". Jambase sets "all" dependent on (almost) all other targets.
-<P>
-In the unfortunate case where you have a buildable target whose name
-is the same as one of the Jambase pseudotargets, you'll have problems
-with the conflicting target name.
-Your workaround choices are:
-<P>
-<ol>
-<lI>Change the name of your buildable file or directory that conflicts.
-<p>
-<li>Modify your Jambase and change the name of the conflicting pseudotarget.
-(Pseudotargets are defined in Jambase using the NOTFILE rule.)
-<p>
-<li>Use grist on the conflicting target name in your Jamfile. E.g., instead
-    of
-    <PRE>
-    File lib : libfoo.a ;
-    </PRE>
-    try
-    <PRE>
-    File &lt;dir&gt;lib : libfoo.a ;
-    </PRE>
-</ol>
-<P>
-
-<H4>
-Dependencies
-</H4>
-<P>
-Jambase rules set dependencies on targets, so that if you update a
-source file, all the file targets that depend on that source
-file, and only the ones that depend on that source file, 
-will be updated (rebuilt) the next time you run <b>jam</b>. 
-<P>
-Here are some of the dependencies 
-that get set when <b>jam</b> runs on NT using the example Jamfile above:
-<CENTER>
-<TABLE> 
-<TR><TD><B>Target</B><TD>&nbsp;&nbsp;&nbsp;<TD><B>Depends on</B></TD>
-<TR><TD>myprog.exe<TD><TD>main.obj, util.obj, libtree.lib
-<TR><TD>libtree.lib<TD><TD>treemake.obj, treetrav.obj
-<TR><TD>treetrav.obj<TD><TD>treetrav.c
-</TABLE>
-</CENTER>
-<P>
-Furthermore, the Main and Library rules set up recursive
-header scanning on their source targets.
-So after <b>jam</b> has finished parsing the Jamfile and
-setting the rule-driven dependencies, it scans the source 
-files for "#include" lines. All #include files found during
-this scan become dependencies of the compiled object.
-E.g., all header files used to compile treetrav.c would
-be made dependencies of treetrav.obj.
-<P>
-As a result, when you run <b>jam</b>, it will rebuild targets
-if either the source files change or the 
-header files change. You can't tell by looking at a Jamfile
-which header files are dependencies, but you can easily
-display those dependencies with:
-<PRE>
-	jam -nd+3
-</PRE>
-<H4>
-Rule Ordering
-</H4>
-<P>
-Rules which specify dependencies, like the Main, Library, and
-LinkLibrary rules, can be invoked in any order. <b>jam</b>
-figures out the order in which targets are built from 
-their dependencies.
-<P>
-Some rules, however, set variables which are used by subsequent
-rule invocations, and their ordering is important. 
-For example, the SubDir* rules (discussed
-later) must be invoked in a particular order.
-
-<P>
-<H4>
-Detailed Jambase Specifications
-</H4>
-<P>
-This document describes how to use various Jambase rules
-from a functional point of view.
-You can see the summary of available Jambase rules in the
-<a href="Jambase.html">Jambase Reference</A>.
-The detailed specifications for any Jambase rule
-can be found by reading the rule definition itself
-in the Jambase file.
-<P>
-
-<HR>
-<H2>
-Handling Directory Trees
-</H2>
-       The SubDir* rules are used to
-       define source code directory hierarchies.
-       With SubDir and SubInclude, you can use <b>jam</b>
-       to build software from source files and Jamfiles spread
-       across many directories, as is typical for large projects.
-       The SubDir* rules unify an entire
-       source code tree so that <b>jam</b> can read in
-       all the Jamfiles in one pass and 
-       compute dependencies across the entire project.
-<P>
-	To use the SubDir* rules, you must:
-<P>
-<OL>
-       <LI>     Preface the Jamfile in each directory with an invocation 
-       of the SubDir rule.
-<P>
-       <LI>     Place  at  the  root  of the tree a file named Jamrules.  
-	      This file could be empty,  but  in
-              practice  it contains user-provided rules and variable 
-	      definitions that  are  shared  throughout  the
-              tree.   Examples  of  such  definitions are library
-              names,  header  directories,  install  directories,
-              compiler  flags,  etc.  This file is good candidate
-              for automatic customizing with autoconf(GNU).
-<P>
-	<LI> 	Optionally, set an environment variable pointing
-		to the root directory of the srouce tree. The
-		variable's name is left up to you, but in these
-		examples, we use TOP.
-</OL>
-<P>
-<H4>
-   SubDir Rule
-</H4>
-<P>
-       The  SubDir  rule  must  be  invoked before any rules that
-       refer to the contents of the directory - it is best to put
-       it at the top of each Jamfile.  For example:
-<PRE>
-	# Jamfile in $(TOP)/src/util directory.
-
-	SubDir TOP src util ;
-
-	Main myprog : main.c util.c ;                   
-	LinkLibraries myprog : libtree ;     
-	Library libtree : treemake.c treetrav.c ;    
-</PRE>
-       This  compiles  four  files  in  $(TOP)/src/util, archives
-       two of the objects into libtree, and links  the  whole
-       thing into myprog. 
-       Outputs are placed in the $(TOP)/src/util
-       directory. 
-       <P>
-       This doesn't appear to be any different from 
-       the previous example that didn't have a SubDir rule,
-       but two things are happening behind the scenes:
-       <OL>
-       <LI>The SubDir rule causes <b>jam</b> to read
-	   in the $(TOP)/Jamrules file. 
-           (The Jamrules file can alternately be named by  the
-              variable  $(xxxRULES), where xxx is the name of the
-              root variable, e.g., $(TOPRULES)).  
-	      <P>
-	   The Jamrules file can contain variable definitions
-	   and rule definitions specific to your codeline.
-	   It allows you to completely customize your build 
-	   environment without having to rewrite Jambase.
-	   Jamrules is only read
-	   in once, at the first SubDir invocation.
-	   <P>
-	<LI>
-	   The SubDir rule initializes a set of variables
-	   that are used by Main and other rules to 
-	   uniquely identify the source files in this
-	   directory and assign locations to the targets
-	   built from files in this directory.
-	   <P>
-	   When you have set a root variable, e.g., $(TOP),
-	   SubDir constructs path names rooted with $(TOP),
-	   e.g., $(TOP)/src/util.
-	   Otherwise, SubDir constructs relative pathnames
-	   to the root directory, computed from the number
-	   of arguments to the first SubDir rule, e.g.,
-	   ../../src/util. In either case, the SubDir
-	   rule constructs the path names that locate source
-	   files.
-	   You'll see how this is useful later.
-	<P>
-       </UL>
-
-<P>
-       The SubDir rule takes  as  its  first  argument  the  root
-       variable's  name  and  takes  as  subsequent arguments the
-       directory names leading from the root to the directory  of
-       the  current Jamfile.  Note that the name of the subdirectory 
-       is given as individual  elements:   the  SubDir  rule
-       does not use system-specific directory name syntax.
-<P>
-<P>
-<H4>
-   SubInclude Rule
-</H4>
-	The SubInclude rule is used in a Jamfile to cause another
-	Jamfile to be read in.
-       Its arguments are in  the  same  format  as
-       SubDir's.
-<P>
-       The  recommended  practice is only to include one level of
-       subdirectories at a time, and let the Jamfile in each subdirectory  
-       include  its own subdirectories.  This allows a
-       user to sit in any arbitrary directory of the source  tree
-       and build that subtree.  For example:
-<PRE>
-       # This is $(TOP)/Jamfile, top level Jamfile for mondo project.
-
-       SubInclude TOP src ;
-       SubInclude TOP man ;
-       SubInclude TOP misc ;
-       SubInclude TOP util ;
-</PRE>
-       If  a directory has both subdirectories of its own as well
-       as files that need building,  the  SubIncludes  should  be
-       either before the SubDir rule or be at the end of the Jamfile 
-       - not between the SubDir and other rule  invocations.
-       For example:
-<PRE>
-	# This is $(TOP)/src/Jamfile:
-
-	SubDir TOP src ;
-
-	Main mondo : mondo.c ;
-	LinkLibraries mondo : libmisc libutil ;
-	
-	SubInclude TOP src misc ;
-	SubInclude TOP src util ;
-</PRE>
-<P>
-	(<b>jam</b> processes all the Jamfiles it reads as if
-	it were reading one single, large Jamfile. 
-	Build rules like Main and LinkLibraries rely on the
-	preceding SubDir rule to set up source file and
-	output file locations, and SubIncludes rules read in
-	Jamfiles that contain SubDir rules. So if you put
-	a SubIncludes rule between a SubDir and a Main
-	rule, <b>jam</b> will try to find the source files
-	for the Main rule in the wrong directory.)
-<P>
-<H4>
-   Variables Used to Handle Directory Trees
-</H4>
-       The  following  variables are set by the SubDir rule
-       and used by the Jambase rules that define file targets:
-<P>
-<CENTER>
-<TABLE>
-<TR><TD VALIGN=TOP>
-              SEARCH_SOURCE
-	      <TD><TD>The SubDir targets (e.g., "TOP src util")
-	      are used to construct a pathname (e.g., $(TOP)/src/util),
-	      and that pathname is assigned to $(SEARCH_SOURCE). 
-	      Rules like Main and Library use $(SEARCH_SOURCE)
-	      to set search paths on source files.
-<TR><TD VALIGN=TOP>
-              LOCATE_SOURCE
-	      <TD><TD>Initialized by the SubDir rule to the same
-	      value as $(SEARCH_SOURCE), unless ALL_LOCATE_TARGET
-	      is set.
-	      $(LOCATE_SOURCE) is used by rules that build
-	      generated source files (e.g., Yacc and Lex) to
-	      set location of output files.
-	      Thus the default location of built source files
-	      is the directory of the Jamfile that defines them.
-<TR><TD VALIGN=TOP>
-              LOCATE_TARGET
-	      <TD><TD>Initalized by the SubDir rule to the same
-	      value as $(SEARCH_SOURCE), unless ALL_LOCATE_TARGET
-	      is set.
-	      $(LOCATE_TARGET) is used by rules that build
-	      binary objects (e.g., Main and Library) to
-	      set location of output files.
-	      Thus the default location of built binaray files
-	      is the directory of the Jamfile that defines them.
-<TR><TD VALIGN=TOP>
-              ALL_LOCATE_TARGET
-	      <TD><TD>
-	      If $(ALL_LOCATE_TARGET) is set, LOCATE_SOURCE
-	      and and LOCATE_TARGET are set to  $(ALL_LOCATE_TARGET)
-	      instead of to $(SEARCH_SOURCE). This can be used to
-	      direct built files to be written to a location outside
-	      of the source tree, and enables building from read-only
-	      source trees.
-<TR><TD VALIGN=TOP>
-              SOURCE_GRIST
-	      <TD><TD>The SubDir targets are formed into a string
-	      like "src!util" and that string is assigned to 
-	      SOURCE_GRIST. Rules that define file targets
-	      use $(SOURCE_GRIST) to set the "grist" attribute
-	      on targets. This is used to assure uniqueness 
-	      of target identifiers where filenames themselves
-	      are not unique.
-	      For example, the target identifiers of 
-	      $(TOP)/src/client/main.c and $(TOP)/src/server/main.c
-	      would be &lt;src!client&gt;main.c and &lt;src!server&gt;main.c.
-</TABLE>
-</CENTER>
-<P>
-       The $(LOCATE_TARGET) and  $(SEARCH_SOURCE)  variables are used
-       extensively by rules in Jambase: most rules that  generate
-       targets  (like  Main,  Object,  etc.)  set $(LOCATE) to 
-       $(LOCATE_TARGET) for the targets they generate, and  rules
-       that  use  sources  (most all of them) set $(SEARCH) to be
-       $(SEARCH_SOURCE) for the sources they use.
-<P>
-       $(LOCATE) and $(SEARCH) are better  explained  in  
-       <A HREF="Jam.html">The Jam Executable Program</A>
-       but in brief they tell <B>jam</B> where to create new targets and
-       where to find existing ones, respectively.
-<P>
-       Note that you can reset these variables
-       after SubDir sets them. For example, this Jamfile builds
-       a program called gensrc, then runs it to create a source file
-       called new.c: 
-       <PRE>
-       SubDir TOP src util ;
-       Main gensrc : gensrc.c ;
-       LOCATE_SOURCE = $(NEWSRC) ;
-       GenFile new.c : gensrc ;
-       </PRE>
-       By default, new.c would be written into the
-       $(TOP)/src/util directory, but resetting LOCATE_SOURCE causes
-       it to be written to the $(NEWSRC) directory. ($(NEWSRC) is assumed
-       to have been set elsewhere, e.g., in Jamrules.)
-<P>
-<H4>
-   VMS Notes
-</H4>
-       On VMS, the logical name table is not imported as  is  the
-       environment on UNIX.  To use the SubDir and related rules,
-       you must set the value of the variable that names the root
-       directory.  For example:
-<PRE>
-              TOP = USR_DISK:[JONES.SRC] ;
-
-              SubInclude TOP util ;
-</PRE>
-       The variable must have a value that looks like a directory
-       or device.  If you choose, you can use a  concealed  logical.  
-       For example:
-<PRE>
-              TOP = TOP: ;
-
-              SubInclude TOP util ;
-</PRE>
-       The  :  at  the  end of TOP makes the value of $(TOP) look
-       like a device name, which jam respects as a directory name
-       and  will  use when trying to access files.  TOP must then
-       be defined from DCL:
-<PRE>
-              $ define/job/translation=concealed TOP DK100:[USERS.JONES.SRC.]
-</PRE>
-       Note three things: the concealed  translation  allows  the
-       logical  to  be  used as a device name; the device name in
-       the logical (here DK100) cannot itself be concealed  logical  
-       (VMS  rules, man); and the directory component of the
-       definition must end in a period (more VMS rules).
-<P>
-<H2>
-Building Executables and Libraries
-</H2>
-<P>
-The rules that build executables and libraries are: Main, Library,
-and LinkLibraries.
-<H4>
-   Main Rule
-</H4>
-       The Main rule compiles source files and links the  resulting 
-       objects into an executable.  For example:
-<PRE>
-              Main myprog : main.c util.c ;
-</PRE>
-       This  compiles  main.c  and  util.c  and  links main.o and
-       util.o into myprog. The object files and resulting 
-       executable are named appropriately for the platform.
-<P>
-	Main can also be used to build shared libraries and/or
-	dynamic link libraries, since those are also linked
-	objects. E.g.:
-	<PRE>
-		Main driver$(SUFSHR) : driver.c ;
-	</PRE>
-	Normally, Main uses $(SUFEXE) to determine the suffix on
-	the filename of the built target. To override it,
-	you can supply a suffix explicity.
-	In this case,
-	$(SUFSHR) is assumed to be the OS-specific shared library
-	suffix, defined in Jamrules with something
-	like:
-	<PRE>
-		if $(UNIX)      { SUFSHR = .so ; }
-		else if $(NT)   { SUFSHR = .dll ; }
-	</PRE>
-	<P>
-	Main uses the Objects rule to compile source targets. 
-
-<H4>
-   Library Rule
-</H4>
-       The Library  rule  compiles  source  files,  archives  the
-       resulting  object  files  into a library, and then deletes
-       the object files.  For example:
-<PRE>
-              Library libstring : strcmp.c strcpy.c strlen.c ;
-              Library libtree : treemake.c treetrav.c ;
-</PRE>
-       This compiles five source files,  archives  three  of  the
-       object  files into libstring and the other two into libtree.  
-       Actual library filenames are formed with the $(SUFLIB) suffix.
-       Once the objects are safely in the libraries, the
-       objects are deleted.
-       <P>
-       Library uses the Objects rule to compile source files.
-<P>
-<H4>
-   LinkLibraries Rule
-</H4>
-       To link executables with built libraries, use
-       the LinkLibraries rule.  For example:
-<PRE>
-              Main myprog : main.c util.c ;
-              LinkLibraries myprog : libstring libtree ;
-</PRE>
-       The LinkLibraries rule  does  two  things:  it  makes  the
-       libraries dependencies of the executable, so that they get
-       built first; and it makes the libraries  show  up  on  the
-       command  line  that links the executable.  The ordering of
-       the lines above is not important, because <b>jam</b> builds  targets 
-       in the order that they are needed.
-<P>
-       You  can  put multiple libraries on a single invocation of
-       the LinkLibraries rule, or you can provide them in  multiple  
-       invocations.   In both cases, the libraries appear on
-       the link command line in the  order  in  which  they  were
-       encountered.  You can also provide multiple executables to
-       the LinkLibraries rule, if they need the same libraries,
-       e.g.:
-       <PRE>
-		LinkLibraries prog1 prog2 prog3 : libstring libtree ;
-       </PRE>
-<P>
-<H4>
-   Variables Used in Building Executables and Libraries
-</H4>
-<CENTER>
-<TABLE>
-<TR><TD>
-              AR           
-	      <TD><TD>Archive command, used for Library targets.
-<TR><TD>
-              SUFEXE         
-	      <TD>*<TD>Suffix on filenames of executables referenced
-		by Main and LinkLibraries.
-<TR><TD>
-              LINK           
-	      <TD><TD>Link command, used for Main targets.
-<TR><TD>
-              LINKFLAGS       
-	      <TD><TD>Linker flags.
-<TR><TD>
-              LINKLIBS        
-	      <TD><TD>Link libraries that aren't dependencies. (See note
-		below.)
-<TR><TD>
-              EXEMODE         
-	      <TD>*<TD>File permissions on Main targets.
-<TR><TD>
-              MODE            
-	      <TD><TD>Target-specific file permissions on Main targets
-		(set from $(EXEMODE))
-<TR><TD>
-              RANLIB          
-	      <TD><TD>Name of ranlib program, if any.
-</TABLE>
-</CENTER>
-
-<P>
-	Variables above marked with "*" are used by the Main,
-	Library, and LinkLibraries rules. Their values at the 
-	time the rules are invoked are used to set target-specific
-	variables.
-	<P>
-	All other variables listed above are globally defined,
-	and are used in actions that update Main and Library
-	targets. This means that the global values of those
-	variables are used, uness target-specific values have
-	been set. 
-	(For instance, a target-specific MODE value is set by 
-	the Main rule.)
-	The target-specific values always override
-	global values.
-<P>
-	Note that there are two ways to specify link libraries for
-	executables: 
-	<UL>
-	<LI>Use the LinkLibraries rule 
-	to specify built libraries; i.e., libraries
-	that are built by Library rules. This assures that
-	these libraries are built first, and that Main targets are 
-	rebuilt when the libraries are updated.
-	<P>
-	<LI>Use the LINKLIBS variable to specify external
-	 libraries; e.g., system libraries or third-party libraries.
-	 The LINKLIBS variable must be set to the the actual
-	 link command flag that specifies the libraries.
-	 <P>
-	 </UL>
-	 <P>
-	 For example:
-<PRE>
-	<I>#In Jamrules:</I>
-              if $(UNIX) { X11LINKLIBS = -lXext -lX11 ; }
-              if $(NT)   { X11LINKLIBS = libext.lib libX11.lib ; }
-
-	<I>#In Jamfile:</I>
-              Main xprog : xprog.c ;
-              LINKLIBS on xprog$(SUFEXE) = $(X11LINKLIBS) ;
-              LinkLibraries xprog : libxutil ;
-              Library libxutil : xtop.c xbottom.c xutil.c ;
-</PRE>
-       This  example  uses the Jam syntax "variable on target" to
-       set a target-specific variable.  In this way,  only  xprog
-       will  be linked with this special $(X11LINKLIBS), 
-       even if other executables were going to  be  built
-       by  the  same Jamfile. Note that when you set a variable
-       on a target, you have to specify the target identifer
-       exactly, which in this case is the suffixed filename of
-       the executable.
-       The actual link command line on Unix, for example, would
-       look something like this:
-<PRE>
-              cc -o xprog xprog.o libxutil.a -lXext -lX11
-</PRE>
-<H2>
-Compiling
-</H2>
-       Compiling of source files occurs normally as  a  byproduct
-       of  the Main or Library rules, which call the rules 
-       described here. These rules may also be called explicitly
-       if the Main and Library behavior doesn't satisfy your
-       requirements.
-<P>
-<H4>
-   Objects Rule
-</H4>
-       The Main and Library rules call the Objects rule on source files.
-       Compiled object files built by
-       the Objects rule are a dependency of the <I>obj</i>
-       pseudotarget, so "jam obj" will build object files used in 
-       Main and Library rules.
-       <P>
-       Target identifiers created by the Objects rule have grist
-       set to $(SOURCE_GRIST). So given this Jamfile:
-       <PRE>
-		SubDir TOP src lock ;
-		Main locker : lock.c ;
-       </PRE>
-       the object file created is lock.o (or lock.obj) and
-       its target identifier is &lt;src!lock&gt;lock.o 
-       (or &lt;src!lock&gt;lock.obj).
-
-       <P>
-       You can also call  Objects  directly.  For example:
-<PRE>
-              Objects a.c b.c c.c ;
-</PRE>
-       This compiles a.c into a.o, b.c into b.o, etc. The object
-       file suffix is supplied by the Objects rule.
-<P>
-<H4>
-   Object Rule
-</H4>
-       Objects  gets  its work done by calling the Object rule on
-       each of the source files.
-       You could use the Object rule directly.
-       For example, on Unix, you could use:
-<PRE>
-              Object foo.o : foo.c ;
-</PRE>
-	However, the Object rule does not provide suffixes, and
-	it does not provide the grist needed to construct target
-	identifiers if you are using the SubDir* rules.
-	A portable and robust Jamfile would need to invoke Object thus:
-	<PRE>
-	      Object &lt;src!util&gt;foo$(SUFOBJ) : &lt;src!util&gt;foo.c ;
-	</PRE>
-	which is inelegant and clearly shows why using Objects
-	is better than using Object.
-	<P>
-	If there's any advantage to the Object rule, it's
-       that it doesn't require that the object name bear
-       any relationship to the source.  It is  thus  possible  to
-       compile  the  same file into different objects.  For example:
-
-<PRE>
-              Object a.o : foo.c ;
-              Object b.o : foo.c ;
-              Object c.o : foo.c ;
-</PRE>
-       This compiles foo.c (three times) into a.o, b.o, and  c.o.
-       Later examples show how this is useful.
-<P>
-       The Object rule looks at the suffix of the source file and
-       calls the appropriate rules to do  the  actual  preprocessing
-       (if any) and compiling needed to produce the output object file.
-       The Object rule is
-       capable of the generating of an object file from  any
-       type of source.  For example:
-<PRE>
-              Object grammar$(SUFOBJ) : grammar.y ;
-              Object scanner$(SUFOBJ) : scanner.l ;
-              Object fastf$(SUFOBJ) : fastf.f ;
-              Object util$(SUFOBJ) : util.c ;
-</PRE>
-	An even more elegant way to get the same result is to let the
-	Objects rule call Object:
-	<PRE>
-              Objects grammar.y scanner.l fastf.f util.c ;
-	</PRE>
-	<P>
-       In  addition to calling the compile rules, Object sets up
-       a bunch of variables specific to  the  source  and  target
-       files.  (See Variables Used in Compiling, below.)
-<P>
-<H4>
-   Cc, C++, Yacc, Lex, Fortran, As, etc. Rules
-</H4>
-<P>
-       The Object rule calls compile rules specific to the suffix of
-       the source file.  (You can see which suffixes are supported
-       by looking at the Object rule definition in Jambase.)
-       Because  the  extra  work  done  by  the
-       Object rule, it is not always useful to call the compile
-       rules directly.  But the adventurous  user  might  attempt
-       it.  For example:
-<PRE>
-              Yacc grammar.c : grammar.y ;
-              Lex scan.c : scan.l ;
-              Cc prog.o : prog.c ;
-</PRE>
-       These examples individually run yacc(1), lex(1), and the C
-       compiler on their sources.
-<P>
-<H4>
-   UserObject Rule
-</H4>
-       Any files with suffixes not understood by the Object  rule
-       are passed to the UserObject rule.  The default definition
-       of UserObject simply emits a warning that  the  suffix  is
-       not  understood.   This  Jambase rule definition is intended to be
-       overridden in Jamrules with one that recognizes the project-specific
-       source file suffixes. For  example:
-
-<PRE>
-	#In Jamrules:
-
-              rule UserObject
-              {
-                  switch $(&gt;)
-                  {
-                  case *.rc   : ResourceCompiler $(&lt;) : $(&gt;) ;
-                  case *      : ECHO "unknown suffix on" $(&gt;) ;
-                  }
-              }
-
-              rule ResourceCompiler
-              {
-                  DEPENDS $(&lt;) : $(&gt;) ;
-		  Clean clean : $(<) ;
-              }
-
-              actions ResourceCompiler
-              {
-                  rc /fo $(&lt;) $(RCFLAGS) $(&gt;)
-              }
-
-
-	#In Jamfile:
-
-              Library liblock : lockmgr.c ;
-	      if $(NT) { Library liblock : lock.rc ; }
-</PRE>
-<P>
-	In this example, the UserObject definition in Jamrules
-	allows *.rc files to be handle as regular Main and Library
-	sources. The lock.rc file is compiled into lock.obj
-	by the "rc" command, and lock.obj is archived into a library
-	with other compiled objects.
-<H4>
-   LibraryFromObjects Rule
-</H4>
-       Sometimes the Library rule's straightforward compiling  of
-       source  into  object modules to be archived isn't flexible
-       enough.  The LibraryFromObjects rule  does  the  archiving
-       (and  deleting)  job of the Library rule, but not the compiling.  
-       The user can make use of the  Objects  or  Object
-       rule for that.  For example:
-<PRE>
-              LibraryFromObjects libfoo.a : max.o min.o ;
-              Object max.o : maxmin.c ;
-              Object min.o : maxmin.c ;
-              ObjectCcFlags max.o : -DUSEMAX ;
-              ObjectCcFlags min.o : -DUSEMIN ;
-</PRE>
-       This  Unix-specific example compiles  the  same  source  file into 
-       two different
-       objects, with different compile flags, and archives  them.
-       (The ObjectCcFlags rule is described shortly.)
-       Unfortunately, the portable and robust implementation of the
-       above example is not as pleasant to read:
-       <PRE>
-	      SubDir TOP foo bar ;
-              LibraryFromObjects libfoo$(SUFLIB) : &lt;foo!bar&gt;max$(SUFOBJ) 
-			                           &lt;foo!bar&gt;min$(SUFOBJ) ;
-              Object &lt;foo!bar&gt;min$(SUFOBJ) : &lt;foo!bar&gt;maxmin.c ;
-              Object &lt;foo!bar&gt;max$(SUFOBJ) : &lt;foo!bar&gt;maxmin.c ;
-	      ObjectCcFlags &lt;foo!bar&gt;min$(SUFOBJ) : -DUSEMIN ;
-	      ObjectCcFlags &lt;foo!bar&gt;max$(SUFOBJ) : -DUSEMAX ;
-       </PRE>
-       Note that, among other things, you must supply the library
-       file suffix when using the LibraryFromObjects rule.
-<P>
-<H4>
-   MainFromObjects Rule
-</H4>
-       Similar  to  LibraryFromObjects,  MainFromObjects does the
-       linking part of the Main rule, but not the compiling.
-       MainFromObjects  can be used when  there  are no
-       objects at all,  and  everything  is  to  be  loaded  from
-       libraries.  For example:
-<PRE>
-              MainFromObjects testprog ;
-              LinkLibraries testprog : libprog ;
-              Library libprog : main.c util.c ;
-</PRE>
-       On Unix, say, this generates a link command that looks like:
-<PRE>
-              cc -o testprog libprog.a
-</PRE>
-       Linking  purely  from  libraries is something that doesn't
-       work everywhere: it depends on  the  symbol  "main"  being
-       undefined when the linker encounters the library that contains 
-       the definition of "main".
-<P>
-<H4>
-   Variables Used in Compiling
-</H4>
-       The following variables control the  compiling  of  source
-       files:
-<P>
-<CENTER>
-<TABLE>
-<TR><TD VALIGN=TOP>
-              C++              
-	      <TD><TD>The C++ compiler command
-<TR><TD VALIGN=TOP>
-              CC               
-	      <TD><TD>The C compiler command
-<TR><TD VALIGN=TOP>
-              C++FLAGS       
-	      <BR>
-              CCFLAGS        
-	      <TD VALIGN=TOP><TD VALIGN=TOP>Compile flags, used to
-		 create or update compiled objects
-<TR><TD>
-              SUBDIRC++FLAGS 
-	      <BR>
-              SUBDIRCCFLAGS  
-	      <TD VALIGN=TOP><TD VALIGN=TOP>Additonal compile flags
-		for source files in this directory.
-<TR><TD VALIGN=TOP>
-              OPTIM            
-	      <TD><TD>Compiler optimization flag. The Cc and C++ 
-		actions use this as well as C++FLAGS or CCFLAGS.
-<TR><TD VALIGN=TOP>
-              HDRS           
-	      <TD VALIGN=TOP><TD>Non-standard header directories; i.e.,
-		the directories the compiler will not look in 
-		by default and which therefore must be supplied
-		to the compile command. These directories are
-		also used by <b>jam</b> to scan for include files.
-<TR><TD VALIGN=TOP>
-              STDHDRS        
-	      <TD VALIGN=TOP><TD>Standard header directories, i.e., the
-		directories the compiler searches automatically.
-		These are not passed to the compiler, but they
-		are used by <b>jam</b> to scan for include files.
-<TR><TD>
-              SUBDIRHDRS     
-	      <TD><TD>Additional paths to add to HDRS for source files
-		in this directory.
-<TR><TD>
-              LEX              
-	      <TD><TD>The lex(1) command 
-<TR><TD>
-              YACC             
-	      <TD><TD>The yacc(1) command 
-</TABLE>
-</CENTER>
-<P>
-       The  Cc rule sets a target-specific $(CCFLAGS) to the current 
-       value of $(CCFLAGS) and $(SUBDIRCCFLAGS).   Similarly
-       for  the C++ rule.  The Object rule sets a target-specific
-       $(HDRS) to  the  current  value  of  $(HDRS)  and  $(SUBDDIRHDRS).
-
-<P>
-       $(CC),  $(C++),  $(CCFLAGS),  $(C++FLAGS),  $(OPTIM),  and
-       $(HDRS) all affect the  compiling  of  C  and  C++  files.
-       $(OPTIM)  is  separate  from $(CCFLAGS) and $(C++FLAGS) so
-       they can be set independently.
-<P>
-       $(HDRS) lists the directories to search for header  files,
-       and  it  is used in two ways: first, it is passed to the C
-       compiler (with the flag -I prepended); second, it is  used
-       by  HdrRule  to  locate  the header files whose names were
-       found when scanning source files.   $(STDHDRS)  lists  the
-       header  directories  that  the  C  compiler  already knows
-       about.  It does not need passing to the C compiler, but is
-       used by HdrRule.
-<P>
-       Note that these variables, if set as target-specific variables, 
-       must be set on the target,  not  the  source  file.
-       The target file in this case is the object file to be generated.  
-       For example:
-<PRE>
-              Library libximage : xtiff.c xjpeg.c xgif.c ;
-
-              HDRS on xjpeg$(SUFOBJ) = /usr/local/src/jpeg ;
-              CCFLAGS on xtiff$(SUFOBJ) = -DHAVE_TIFF ;
-</PRE>
-       This can be done more easily with the rules that follow.
-<P>
-<H4>
-   ObjectCcFlags, ObjectC++Flags, ObjectHdrs Rules
-</H4>
-       $(CCFLAGS), $(C++FLAGS) and  $(HDRS)  can  be  set on object file
-       targets
-       directly, but  there are rules that allow these variables
-       to be set by referring to the original source  file  name,
-       rather  than  to  the  derived object file name.  ObjectCcFlags 
-       adds object-specific flags to the $(CCFLAGS)  variable,  
-       ObjectC++Flags  adds  object-specific  flags to the
-       $(C++FLAGS) variable, and ObjectHdrs  add  object-specific
-       directories to the $(HDRS) variable.  For example:
-<PRE>
-	#In Jamrules:
-		if $(NT) { CCFLAGS_X = /DXVERSION ;	
-			   HDRS_X = \\\\SPARKY\\X11\\INCLUDE\\X11 ;
-		         }
-
-	#In Jamfile:
-              Main xviewer : viewer.c ;
-              ObjectCcFlags viewer.c : $(CCFLAGS_X) ;
-              ObjectHdrs viewer.c : $(HDRS_X) ;
-</PRE>
-	The ObjectCcFlags and ObjectHdrs rules take .c files
-	as targets, but actually set $(CCFLAGS) and $(HDRS) values
-	on the .obj (or .o) files. As a result, the action
-	that updates the target .obj file uses the target-specific
-	values of $(CCFLAGS) and $(HDRS).
-<P>
-<H4>
-   SubDirCcFlags, SubDirC++Flags, SubDirHdrs Rules
-</H4>
-       These rules set the  values  of  $(SUBDIRCCFLAGS),  $(SUBDIRC++FLAGS)  
-       and $(SUBDIRHDRS), which are used by the Cc,
-       C++, and Object rules  when  setting  the  target-specific
-       values  for $(CCFLAGS), $(C++FLAGS) and $(HDRS).  The SubDir 
-       rule clears these variables out, and thus they provide
-       directory-specific  values of $(CCFLAGS), $(C++FLAGS)  and
-       $(HDRS).  For example:
-<PRE>
-	#In Jamrules:
-              GZHDRS = $(TOP)/src/gz/include ;
-	      GZFLAG = -DGZ ;
-		
-	#In Jamfile:
-              SubDir TOP src gz utils ;
-
-              SubDirHdrs $(GZHDRS) ;
-              SubDirCcFlags $(GZFLAG) ;
-
-	      Library libgz : gizmo.c ;
-	      Main gizmo : main.c ;
-	      LinkLibraries gizmo : libgz ;
-</PRE>
-	All .c files in this directory files will be compiled with
-	$(GZFLAG) as well as the default $(CCFLAG), and the include
-	paths used on the compile command will be $(GZHDRS) as well
-	as the default $(HDRS).
-<H2>
-Header File Processing
-</H2>
-       One of the functions of the Object rule is set up 
-       scanning of source
-       files  for (C style) header file inclusions.  To do so, it
-       sets the special variables $(HDRSCAN)  and  $(HDRRULE)
-       as  target-specific  variables  on  the source file.  The
-       presence of these variables triggers a  special  mechanism
-       in  <B>jam</B> for scanning a file for header file inclusions and
-       invoking a  rule  with  the  results  of  the  scan.   The
-       $(HDRSCAN)  variable  is  set  to an egrep(1) pattern that
-       matches "#include" statements in C source files,  and  the
-       $(HDRRULE)  variable  is  set to the name of the rule that
-       gets invoked as such:
-<PRE>
-              $(HDRRULE) source-file : included-files ;
-</PRE>
-       This rule is supposed to set up the  dependencies  between
-       the  source  file and the included files.  The Object rule
-       uses HdrRule  to  do  the  job.   HdrRule  itself  expects
-       another  variable,  $(HDRSEARCH), to be set to the list of
-       directories where the included files can be found.  Object
-       does  this  as  well,  setting $(HDRSEARCH) to $(HDRS) and
-       $(STDHDRS).
-<P>
-       The header file scanning occurs during the "file  binding"
-       phase   of  <b>jam</b>,  which  means  that  the  target-specific
-       variables (for the source file) are in effect.  To accomodate 
-       nested includes, one of the HdrRule's jobs is to pass
-       the target-specific values of $(HDRRULE), $(HDRSCAN),  and
-       $(HDRSEARCH) onto the included files, so that they will be
-       scanned as well.
-<P>
-<H4>
-   HdrRule Rule
-</H4>
-	Normally, HdrRule is not invoked directly; the Object rule
-	(called by Main and Library) invokes it.
-	<P>
-	If there are special dependencies that need to be set,
-	and which are not set by HdrRule itself, you can define
-	another rule and let it invoke HdrRule.  For example:
-
-<PRE>
-	#In Jamrules:
-              rule BuiltHeaders
-              {
-                      DEPENDS $(&gt;) : mkhdr$(SUFEXE) ;
-                      HdrRule $(&lt;) : $(&gt;) ;
-              }
-
-	#In Jamfile:
-              Main mkhdr : mkhdr.c ;
-              Main ugly : ugly.c ;
-
-              HDRRULE on ugly.c = BuiltHeaders ;
-
-</PRE>
-       This example just says that the files included by "ugly.c"
-       are  generated  by the program "mkhdr", which can be built
-       from "mkhdr.c".  During the binding phase, <b>jam</b> will
-       scan ugly.c, and if it finds an include file, ughdr.h,
-       for example, it will automatically invoke the rule:
-       <PRE>
-              BuiltHeaders ugly.c : ughdr.h ;
-       </PRE>
-       By calling HdrRule at the end  of  BuiltHeaders,  
-       all  the gadgetry of HdrRule takes effect and it
-       doesn't need to be duplicated.
-<P>
-<H4>
-   Variables Used for Header Scanning
-</H4>
-<CENTER>
-<TABLE>
-<TR><TD VALIGN=TOP>
-              HDRPATTERN    
-	      <TD><TD>Default scan pattern for "include" lines.
-<TR><TD VALIGN=TOP>
-              HDRSCAN         
-	      <TD><TD>Scan pattern to use. 
-		This is a special variable: during binding, if
-		both HDRSCAN and HDRRULE are set, scanning is activated
-		on the target being bound.
-		The HdrRule and Object rules sets this
-		to $(HDRPATTERN) on their source targets.
-<TR><TD VALIGN=TOP>
-              HDRRULE         
-	      <TD><TD>Name of rule to invoked on files found in header
-		scan. The HdrRule and Object rules set this to "HdrRule"
-		on their source targets. This is also a special variable;
-		it's the only <b>jam</b> variable that can hold the
-		name of a rule to be invoked.
-<TR><TD VALIGN=TOP>
-              HDRSEARCH       
-	      <TD><TD>Search paths for files found during header scanning.
-		This is set from $(HDRS) and $(STDHDRS), which are 
-		described in the Compiling section.
-		<b>jam</b> will search $(HDRSEARCH) directories for
-		the files found by header scans. 
-</TABLE>
-</CENTER>
-<P>
-       The  Object rule sets HDRRULE and HDRSCAN specifically for
-       the source files to be scanned, rather than globally.   If
-       they  were  set  globally,  jam  would attempt to scan all
-       files, even library archives and executables,  for  header
-       file  inclusions.   That  would  be  slow and probably not
-       yield desirable results.
-<P>
-<H2>
-Copying Files
-</H2>
-<H4>
-   File Rule
-</H4>
-       The File rule copies one file to another.  The target name
-       needn't  be the same as the source name.  For
-       example:
-<PRE>
-	switch $(OS)
-	{
-           case NT*  : File config.h : confignt.h ;
-	   case *    : File config.h : configunix.h ;
-	}
-	LOCATE on config.h = $(LOCATE_SOURCE) ;
-</PRE>
-	This creates a config.h file from either confignt.h or
-	configunix.h, depending on the current build platform.
-<P>
-	The File rule does not
-	use the LOCATE_SOURCE variable set by the
-	SubDir rule (although it does use SEARCH_SOURCE), which
-	means you have to set the copied file's output directory
-	yourself. That's done by setting the special
-	LOCATE variable on the target, as shown above,
-	or with the MakeLocate rule described below.
-<H4>
-   Bulk Rule
-</H4>
-       The Bulk rule is a shorthand for many invocations  of  the
-       File  rule when all files are going to the same directory.
-       For example:
-<PRE>
-	#In Jamrules:
-              DISTRIB_GROB = d:\\distrib\\grob ;
-
-	#In Jamfile:
-              Bulk $(DISTRIB_GROB) : grobvals.txt grobvars.txt ;
-</PRE>
-	This causes gobvals.txt and grobvars.txt to be copied
-	into the $(DISTRIB_GROB) directory.
-<H4>
-   HardLink Rule
-</H4>
-       The Unix-only HardLink rule makes a hard link (using ln(1)) from the
-       source  to  the  target,  if there isn't one already.  For
-       example:
-<PRE>
-              HardLink config.h : configunix.h ;
-</PRE>
-<H4>
-   Shell Rule
-</H4>
-       The Shell rule is like the File rule, except that on Unix it makes
-       sure  the first line of the target is "#!/bin/sh" and sets
-       the permission to make the file executable.  For example:
-<PRE>
-              Shell /usr/local/bin/add : add.sh ;
-</PRE>
-<P>
-	You can also use $(SHELLHEADER) to dictate
-	what the first line of the copied file will be.
-       For
-       example:
-<PRE>
-              Shell /usr/local/bin/add : add.awk ;
-              SHELLHEADER on /usr/local/bin/add = "#!/bin/awk -f" ;
-</PRE>
-       This installs an awk(1) script.
-<P>
-<H4>
-   Variables Used When Copying Files
-</H4>
-<CENTER>
-<TABLE>
-<TR><TD VALIGN=TOP>
-              FILEMODE      
-	      <TD><TD>Default file permissions for copied files
-<TR><TD VALIGN=TOP>
-              SHELLMODE     
-	      <TD><TD>Default file permissions for Shell rule targets
-<TR><TD VALIGN=TOP>
-              MODE            
-	      <TD><TD>File permissions set on files copied by
-		File, Bulk, and Shell rules. 
-       		File and Shell sets a target-specific MODE to the  current
-       		value  of  $(FILEMODE) or $(SHELLMODE), respectively.  
-<TR><TD VALIGN=TOP>
-              SHELLHEADER     
-	      <TD><TD>String to write in first line of Shell targets 
-	      (default is #!/bin/sh).
-
-</TABLE>
-</CENTER>
-<P>
-
-<H2>
-Installing Files
-</H2>
-Jambase provides a set of Install* rules to copy files
-into an destination directory and set permissions on them.
-On Unix, the install(1) program is used.
-If the destination directory does not exist, <b>jam</b>
-creates it first.
-<P>
-All files copied with the Install* rules are dependencies
-of the <i>install</i> pseudotarget, which means that the
-command "jam install" will cause the installed copies to
-be updated. Also, "jam uninstall" will cause the installed
-copies to be removed.
-<P>
-The Install* rules are:
-<CENTER>
-<TABLE>
-<TR><TD VALIGN=TOP><B>InstallBin</B>
-    <TD VALIGN=TOP>Copies file and sets its permission to $(EXEMODE).
-		   You must specify the suffixed executable name. E.g.:
-    <PRE>InstallBin $(BINDIR) : thing$(SUFEXE) ;
-		   </PRE>
-
-<TR><TD VALIGN=TOP><B>InstallFile</B>
-    <TD VALIGN=TOP>Copies file and sets its permission to $(FILEMODE). E.g.:
-    <PRE>InstallFile $(DESTDIR) : readme.txt ;
-		   </PRE>
-
-<TR><TD VALIGN=TOP><B>InstallLib</B>
-    <TD VALIGN=TOP>Copies file and sets its permission to $(FILEMODE).
-		   You must specify the suffixed library name. E.g.:
-    <PRE>InstallLib $(LIBDIR) : libzoo$(SUFLIB) ;
-		   </PRE>
-
-<TR><TD VALIGN=TOP><B>InstallMan</B>
-    <TD VALIGN=TOP>Copies file into the man<i>n</i>
-		   subdirectory of the target directory
-		   and sets its permission to $(FILEMODE). E.g.,
-		   this copies foo.5 into the $(DESTDIR)/man5 directory:
-    <PRE>InstallMan $(DESTDIR) : foo.5 ;
-		   </PRE>
-
-<TR><TD VALIGN=TOP><B>InstallShell</B>
-    <TD VALIGN=TOP>Copies file and sets its permission to $(SHELLMODE). E.g.:
-    <PRE>InstallShell $(DESTDIR) : startup ;
-		   </PRE>
-
-</TABLE>
-</CENTER>
-<P>
-<P>
-<H4>
-   Variables
-</H4>
-       The following variables control the installation rules:
-<P>
-<CENTER>
-<TABLE>
-<TR><TD>
-              INSTALL        
-	      <TD><TD>The install program (Unix only)
-<TR><TD>
-              FILEMODE     
-	      <TD><TD>Default file permissions on readable files. 
-<TR><TD>
-              EXEMODE      
-	      <TD><TD>Default file permission executable files.
-<TR><TD>
-              SHELLMODE    
-	      <TD><TD>Default file permission on shell script files.
-<TR><TD>
-              MODE           
-	      <TD><TD>Target-specific file permissions
-</TABLE>
-</CENTER>
-<P>
-<P>
-       The  Install  rules set a target-specific MODE to the current 
-       value of $(FILEMODE),  $(EXEMODE),  or  $(SHELLMODE),
-       depending on which Install rule was invoked.
-<P>
-       The  directory variables are just defined for convenience:
-       they must be passed  as  the  target  to  the  appropriate
-       Install  rule.   The $(INSTALL) and mode variables must be
-       set (globally) before calling the Install rules  in  order
-       to take effect.
-<P>
-<H2>
-Miscellaneous Rules
-</H2>
-<H4>
-Clean Rule
-</H4>
-<P>
-The Clean rule defines files to be removed when you run "jam clean".
-Any site-specific build rules defined in your Jamrules should invoke
-Clean so that outputs can be removed. E.g.,
-<PRE>
-	rule ResourceCompiler
-	{
-	   DEPENDS $(<) : $(>) ;
-	   Clean clean : $(<) ;
-	}
-</PRE>
-<P>
-<P>
-Most Jambase rules invoke the Clean rule on their built targets,
-so "jam clean" will remove all compiled objects, libraries,
-executables, etc.
-<P>
-<H4>
-MakeLocate Rule
-</H4>
-      MakeLocate is a single convenient rule that creates a directory,
-      sets LOCATE on a target to that directory, and makes the directory
-      a dependency of the target. It is used by many Jambase rules,
-      and can be invoked directly, e.g.:
-      <PRE>
-		GenFile data.tbl : hxtract data.h ;
-		MakeLocate data.tbl : $(TABLEDIR) ;
-      </PRE>
-      In this example, the File rule creates data.tbl from data.h.
-      The MakeLocate causes data.tbl to be written into the $(TABLEDIR)
-      directory; and if the directory doesn't exist, it is created first.
-      <P>
-      The MakeLocate rule invokes another Jambase rule, MkDir,
-      to (recursively) create
-      directories. MkDir uses the $(MKDIR) variable to determine the
-      platform-specific command that creates directories.
-<P>
-<H4>
-RmTemps Rule
-</H4>
-	Some intermediate files are meant to be temporary. 
-	The RmTemps rule can be used to cause 
-	<b>jam</b> to delete them after they are used. 
-	<P>
-	RmTemps must be:
-	<UL>
-	<LI>
-	the last rule 
-	invoked on the permanent file that uses
-	the temporary file(s) 
-	<LI>
-	invoked with the permanent file as the output
-	target and the temporary file(s) as the input target
-	<LI>
-	invoked with the exact target identifiers of
-	the permanent file and the temporary file(s)
-	</UL>
-	For
-	example: 
-	<PRE>
-		SubDir TOP src big ;
-		GenFile big.y : joinfiles part1.y part2.y part3.y ;
-		Main bigworld : main.c big.y ;
-		RmTemps bigworld$(SUFEXE) : &lt;src!big&gt;big.y ;
-	</PRE>
-	This causes big.y to be deleted after it has been used to create
-	the bigworld executable. 
-	The exact target identifier of big.y is  &lt;src!big&gt;big.y
-	(the GenFile and Main rules tack on the grist automatically);
-	the exact target identifier of the bigworld executable
-	is bigworld$(SUFEXE).
-<P>
-<HR>   
-<A HREF="#TOP">Back to top.</A>
-<P>
-        Copyright 1997, 2000 Perforce Software, Inc.
-        <BR>
-        Comments to <A HREF="mailto:info at perforce.com">info at perforce.com</A>
-        <BR>
-        Last updated: Dec 31, 2000
-	<BR>
-	$Id: Jamfile.html,v 1.4 2002/04/07 00:22:45 david_abrahams Exp $
-</BODY> 
-</HTML>

Deleted: boost-build/branches/upstream/current/jam_src/Porting
===================================================================
--- boost-build/branches/upstream/current/jam_src/Porting	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/Porting	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,68 +0,0 @@
-Notes on porting Jam - revised 12/31/2000
-
-1) Working out system dependencies in the Jam code.
-
-    Jam's OS footprint is fairly small.  For OS independent work Jam
-    liberally uses standard libc functions like stdio, malloc, and
-    string.  The OS dependent interfaces are:
-
-	From filesys.h:
-
-	    file_parse() - split a file name into dir/base/suffix/member
-	    file_build() - build a filename given dir/base/suffix/member
-	    file_dirscan() - scan a directory for files
-	    file_archscan() - scan an archive for files
-	    file_time() - get the timestamp of a file, if not already 
-			  done by file_dirscan().
-
-	From execcmd.h:
-
-	    execcmd() - execute a shell script
-	    execwait() - wait for any outstanding execcmd()'s.
-
-    The current implementations are:
-
-	    filemac.c - mac MPW 
-	    filent.c - NT 
-	    fileos2.c - OS/2 
-	    fileunix.c - all UNIX
-	    filevms.c - VMS
-
-	    execmac.c - mac MPW
-	    execunix.c - UNIX, OS/2, NT
-	    execvms.c - VMS
-
-2) Defining OSMAJOR, OSMINOR in jam.h
-
-    So that the Jambase and Jamfile know their host, Jam defines $(OS)
-    to be something useful for each platform.  Make sure that there is
-    code in jam.h to generate a useful value for $(OS), and key it off 
-    the platform specific C-preprocessor symbol.   If the C-preprocessor 
-    doesn't itself defines such a symbol, add a define to the Makefile.
-
-    In addition to $(OS), you can also set $(OSPLAT) if the OS runs on
-    multiple platforms (like Linux or NT).
-
-3) Working out system dependencies in the Jambase
-
-    With the value of $(OS) available, the Jambase can be extended to
-    support special variables or rules for new platforms.   See the
-    current support for VMS, NT, and Mac.
-
-4) Yacc troubles
-
-    The generated files jamgram.h and jamgram.c are distributed for the 
-    poor souls without yacc.
-
-5) Known problematic systems:
-
-    - Pyramid has no malloc.h, memory.h
-
-    - Encore has no stdlib.h
-
-    - Bull DPX has sys/file.h problems
-
-6) Send the results back.
-
-    If you do porting work, the result can be integrated into future
-    releases if you send it back to the author's address in the README.

Deleted: boost-build/branches/upstream/current/jam_src/README
===================================================================
--- boost-build/branches/upstream/current/jam_src/README	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/README	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,149 +0,0 @@
-Jam/MR (aka "jam - make(1) redux") 
-
-    /+\
-    +\	Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.
-    \+/
-
-    This is Release 2.4 of Jam/MR, a make-like program.
-
-    License is hereby granted to use this software and distribute it
-    freely, as long as this copyright notice is retained and modifications 
-    are clearly marked.
-
-    ALL WARRANTIES ARE HEREBY DISCLAIMED.
-
-FEATURES
-
-   ->	Jam is a make(1) replacement that makes building simple things
-	simple and building complicated things manageable.
-
-   ->	Jam's language is expressive, making Jamfiles (c.f. Makefiles) 
-	compact.  Here's a sample:
-
-	    Main smail : main.c map.c resolve.c deliver.c
-			 misc.c parser.y alias.c pw.c headers.c
-			 scanner.l getpath.c str.c ;
-
-	This builds "smail" from a dozen source files.  Jam handles 
-	header file dependencies automatically and on-the-fly.
-
-   ->	Jam is very portable: it runs on UNIX, VMS, Mac, and NT.  
-	Most Jamfiles themselves are portable, like the sample above.
-
-   ->   Jam is unintrusive: it is small, it has negligible CPU 
-	overhead, and it doesn't create any of its own funny files
-	(c.f. Odin, nmake, SunOS make).
-
-   ->	Jam can build large projects spread across many directories
-	in one pass, without recursing, tracking the relationships
-	among all files. Jam can do this with multiple, concurrent 
-	processes.
-
-   ->   Jam isn't under the blinkin GNU copyright, so you can 
-	incorporate it into commercial products.
-
-
-INFORMATION GUIDE
-
-    Jam.html		jam and language reference.
-
-    Jambase.html	Reference for the Jambase boilerplate file.
-
-    Jamfile.html	Easy reading on creating a Jamfile and using jam.
-
-    RELNOTES		Release 2.3 release notes.
-
-    Porting		Notes on porting jam to wildcat platforms.
-
-    README		This file.  Includes installation instructions.
-
-    jam.c		Contains the jam command's main() as well as an 
-			introduction to the code, for serious hackers.
-
-
-INSTALLING
-
-    The Makefile (UNIX, NT), build.com (VMS), Build.mpw (Mac MPW) are 
-    for bootstrapping.  Once jam is built, it can rebuild itself.
-
-    UNIX
-
-	Build jam with make(1) on:
-
-	    Platform		$(OS) 
-	    -------------------------
-	    AIX			AIX		*	
-	    BSD/386 1.0		BSDI
-	    COHERENT/386	COHERENT
-	    DGUX 5.4		DGUX
-	    FreeBSD		FREEBSD
-	    HPUX 9.0		HPUX
-	    IRIX 5.0		IRIX
-	    Linux		LINUX
-	    NEXTSTEP 3.2	NEXT
-	    OSF/1		OSF
-	    PTX V2.1.0		PTX
-	    Solaris 2		SOLARIS		*
-	    SunOS4.1		SUNOS
-	    Ultrix 4.2		ULTRIX
-	    BeOS		BEOS		*
-
-	    * requires editing Makefile
-
-    Windows
-
-	Build jam with nmake on:
-
-	    Platform		$(OS)
-	    -------------------------
-	    NT			NT		*
-	    OS/2		OS2		*
-
-	The NT MAXLINE (command line length) is still set in jam.h to
-	996, which was apparently the NT 3.5 limit. On 4.0, the limit 
-	is somewhere around 10K. For now, you can increase MAXLINE in 
-	jam.h so that a jam running on 4.0 will use the full command
-	line length, but that jam.exe will fail miserably on the older OS.
-
-	On NT, a variable must be set before invoking jam to tell
-	it where the C compiler lives.  The name of this variable
-	depends on which compiler you are using:
-
-	    BCCROOT:	The Borland C compiler
-	    MSVCNT:	The Microsoft Compiler 5.0 (for NT)
-	    MSVC:	The Microsoft Compiler 1.5 (for Windows)
-
-	Only MSVCNT has really been tested and is known to work.
-
-    Macintosh
-
-	Build jam with Build.mpw on:
-
-	    Platform		$(OS)
-	    -------------------------
-	    Macintosh		MAC		
-
-	You'll need to edit Build.mpw to set CW.  
-
-    VMS
-
-    	Build jam with @build.com on:
-
-	    Platform		$(OS)
-	    -------------------------
-	    VMS 5.4		VMS
-	    OPENVMS		OPENVMS
-
-Comments to the author!
-
-November, 1993 - release 1.0
-March, 1995 - release 2.0 
-February, 1996 - release 2.1
-November, 1997 - release 2.2
-December, 2000 - release 2.3
-March, 2002 - release 2.4
-
-
-Christopher Seiwald
-
-seiwald at perforce.com

Deleted: boost-build/branches/upstream/current/jam_src/RELNOTES
===================================================================
--- boost-build/branches/upstream/current/jam_src/RELNOTES	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/RELNOTES	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,941 +0,0 @@
-Release notes for Jam/MR 2.4
-(aka Jam - make(1) redux)
-
-0.  Changes between 2.4rc1 and 2.4rc2:
-
-    THESE NOTES WILL BE REMOVED WITH THE FINAL 2.4 RELEASE, SINCE THEY
-    REFER EXCLUSIVELY TO ADJUSTMENTS IN BEHAVIORS NEW BETWEEN 2.3 and
-    2.4:
-
-	Make MATCH generate empty strings for () subexpressions that
-	match nothing, rather than generating nothing at all.
-	Thanks to David Abrahams.
-
-	GLOB now applies the pattern to the directory-less filename,
-	rather than the whole path. Thanks to Niklaus Giger.
-
-	Make Match rule do productized results, rather than
-	using just $(1[1]) as pattern and $(2[1]) as the string.
-
-1.  Release info:
-
-	Jam/MR 2.4
-	March, 21, 2002
-	VERSION 2.4
-
-2.  Compatibility
-
-	Jam 2.4 is upward compatible with Jam 2.3
-
-	The Jam 2.4 language is a superset of the 2.3 language;
-	Jamfiles, Jambase, and other rulesets used in 2.3 can be used
-	with the 2.4 language support.
-
-3.  Changes since 2.3.
-
-3.1.  Changes to Jam Language
-
-	The mechanism for calling rules that return values - "[ rule
-	args ...]", (and 'return' in the rule body), is now a
-	documented part of the language.
-
-	Add "on <target> <rulename> <field1> ..." syntax, to invoke a
-	rule under the influence of a target's specific variables.
-
-        Add "[ on targ rule ... ]" to call a rule returning a value,
-        under the influence of a target's specific variables.
-
-	New 'Glob' builtin that returns a list of files in a list of
-	directories, given a list of patterns.
-
-	New 'while expr { block }' construct.
-
-	New :E=value modifier provides default value if variable unset.
-
-	New :J=joinval modifier concatenates list elements into single
-		element, separated by joinval.
-
-	\ can now be used to escape a space (or any single whitespace
-	character), so that you don't have to resort to quotes. 
-
-	New 'Match regexp : string' rule matches regexp against string
-	and returns list of results.
-
-	Rules can now be invoked indirectly, through variable names.
-	If the variable expands to an empty list, no rule is run.
-	If the variable expands to multiple entries, each rule is
-	run with the same arguments.  The result of the rule invocation
-	is the concatenation of the results of the rules invoked.
-
-	'Echo' and 'Exit' now have aliases 'echo' and 'exit', since it
-	is really hard to tell that these are built-in rules and not
-	part of the language, like 'include'.  Real rules continue to
-	start with a capital.
-
-3.2.  Jambase Changes
-
-	Support for YACCGEN, the suffix used on generated yacc output.
-
-        Fix ups to have jam and p4 build with borland C 5.5,
-        and minor win98 jam support for jam clean
-
-	SubDirHdrs now takes directory names in the same format as
-	SubInclude : one directory element per word.
-
-	More portable support for specifying includes and #defines:
-	New ASHDRS, CCHDRS, CCDEFS, DEFINES, ObjectDefines, FQuote,
-	FIncludes, FDefines.  Ordering of cc and c++ flags grossly
-	rearranged.
-
-	Jambase has been compacted by applying the new E: and J:
-	expansion modifiers.
-
-	New SoftLink rule, courtesy of David Lindes.  It currently
-	assumes you can pass a -s flag to $(LN).
-
-3.3   'jam' Changes (See Jam.html)
-
-	Added '-q' (quit quick) option; jam will exit promptly (as if it
-	received an interrupt), as soon as any target fails.
-
-	Added experimental '-g' (build newest sources first) option:
-	all things being equal, normally targets are simply built in
-	the order they appear in the Jamfiles.  With this flag, targets
-	with the newest sources are built first.   From an idea by Arnt
-	Gulbrandsen.  Undocumented (outside this note).
-
-3.4.  Jam internal code changes
-
-	jamgram.yy now defines YYMAXDEPTH to 10000, what it is on 
-	FreeBSD, for older yaccs that left it at 150 or so.  This is
-	needed for the right-recursion now used in the grammar.
-
-	Optimize rule compilation, with right-recursion instead of left.
-
-        Split jam's built-in rules out to builtins.c from compile.c,
-        so that compile.c only deals with the language.
-
-        Split jam's pathsys.h from filesys.h, since they are really
-        two different pieces.
-
-	evaluate_if(), which evaluated the condition tree for 'if' and
-	returned an int, has been replaced with compile_eval(), which does
-	essentially the same but returns a LIST.
-
-4.  Fixed bugs
-
-	Missing TEMPORARY targets with multiple parents no longer spoil one
-	parent's time with another.  The parents' time is used for comparison
-	with dependents, but no longer taken on as the target's own time.
-
-	'actions updated', not 'actions together', now protects targets
-	from being deleted on failed/interrupted updates.
-
-	Fixed broken $(v[1-]), which always returned an empty expansion.
-	Thanks to Ian Godin <ian at sgrail.com>.
-
-	Defining a rule within another rule, and invoking the enclosing
-	rule more than once, would result in giving the first rule a
-	null definition.  Fixed.
-
-	$(d:P) now works properly on the mac, climbing up directories.
-	Thanks to Miklos Fazekas <boga at mac.com>.
-
-        No longer (sometimes) treat \ as a directory separator on
-        UNIX.  It isn't supposed to be, but was due to bungled ifdefs.
-        
-        Applying just :U or :D (or :E, :J) mods no longer causes the
-        variable value to be treated as a filename (parsed and rebuilt
-        using the OS specific pathsys routines). Previously, if _any_
-        mods were present then the value was parsed and rebuilt as if
-        a filename, and that could in certain cases munge the value.
-        Only the file modifiers (:GDBSM) treat the value as a
-        filename.
-
-	Four rules makeCommon, makeGrist, makeString, makeSubDir from
-	jam 2.2 missing in 2.3 have been re-added, with apologies to
-	dtb at cisco.com.
-
-	Return status more likely to be correct when using -d0, now that 
-	targets are could as being built even with no debugging output.
-	Thanks to Miklos Fazekas <boga at mac.com>.
-
-	yyacc now suffixes all terminals it defines with _t, so that they
-	don't conflict with other symbols (like RULE with the typedef
-	in rules.h).  Thanks to Michael Allard.
-
-	InstallInto now handles multiple sources properly, rather than
-	acting as if each installed target depended on all sources to
-	be installed.  $(INSTALLGRIST) is now the default grist for
-	installed targets, rather than the hardcoded 'installed'.  Thanks
-	to Stephen Goodson.
-
-5.  Porting
-
-	[MACINTOSH] Paths are now downshifted (internally) so as to
-	handle its case insensitivity.  Thanks to Miklos Fazekas
-	<boga at mac.com>.
-
-        [NT] MS changed the macro for the IA64 Windows NT 64bit
-        compiler.
-
-	[CYGWIN] Cygwin jam porting: dance around bison and yyacc.
-	Use bison's -y flag to use yacc's output file naming
-	conventions, and don't use yyacc on systems whose SUFEXE is
-	set.
-
-	[VMS] The Jambase itself was not formatting the CCHDRS and
-        CCDEFS properly: on VMS they can't be appended to, because
-        multiple /define or /include directives don't work.  Instead
-        now CCHDRS and CCDEFS is reformatted from HDRS and DEFINES
-        anytime those latter two change.  This requires the recent
-        change to jam to allow access to target-specific variables
-        when setting other variables.
-
-        [VMS] Remove exception call when file_dirscan() can't, for
-        some reason, scan a directory.  Use a better set of #ifdefs to
-        determine if we're on a vax, rather than relying on the C
-        compiler being a specific version: we're able to build with
-        the C++ compiler now.
-
-	[VMS] Port new jam to run with just cxx compiler.
-        (The C compiler being a extra-cost item).
-
-        [NT] Add entry for DevStudio when the settings are already in the
-        system environment.
-
-        [NT] default $(MV) to "move /y" in Jambase.
-
-	[MINGW] Mingw port by Max Blagai.
-
-===============================================================================
-===============================================================================
-
-
-======= end
-Release notes for Jam/MR 2.3
-(aka Jam - make(1) redux)
-
-0.  Bugs fixed since 2.3.1
-
-	PATCHLEVEL 2 - 3/12/2001
-
-	NOCARE changed back: it once again does not applies to targets
-	with sources and/or actions.  In 2.3 it was changed to apply to
-	such targets, but that broke header file builds: files that are
-	#included get marked with NOCARE, but if they have source or
-	actions, they still should get built.
-
-1.  Release info:
-
-	Jam/MR 2.3
-	November 16, 2000
-	VERSION 2.3
-	PATCHLEVEL 1
-
-2.  Compatibility
-
-	Jam 2.3 is upward compatible with Jam 2.2.
-
-	The Jam 2.3 language is a superset of the 2.2 language;
-	Jamfiles, Jambase, and other rulesets used in 2.2 can be used
-	with the 2.3 language support.
-
-3.  Changes since 2.2
-
-3.1.  Changes to Jam Language
-
-	Rules now can have values, which can expanded into a list with
-	the new "[ rule args ... ]" syntax.  A rule's value is the value
-	of its last statement, though only the following statements have
-	values: if (value of the leg chosen), switch (ditto), set (value
-	of the resulting variable), return (its arguments).  Note that
-	'return' doesn't actually return.  This support is EXPERIEMENTAL
-	and otherwise undocumented.  (2.3.1)
-
-	Because of the new way lists are processed, if a rule has no
-	targets a warning message is no longer issued.
-
-	NOCARE now applies to targets with sources and/or actions,
-	rather than just those without.
-
-3.2.  Jambase Changes
-
-	The HDRPATTERN variable now allows for leading blanks before
-	the #include, to keep up with ANSI.  By john at nanaon-sha.co.jp
-	(John Belmonte) (2.2.3).
-
-	HDRPATTERN has been adjusted to avoid mistaking cases like:
-
-		# include <time.h> /* could be <sys/time.h> */
-
-	MkDir now NOUPDATE's $(DOT), so that there are no dependencies
-	on the current directory's timestamp.  By john at nanaon-sha.co.jp
-	(John Belmonte).
-
-	The old mock functions like makeDirName, which assigned their
-	results to the variable named as their first argument, have
-	been replaced with real functions using the new [] synxtax.
-	E.g. "makeDirName foo : bar ola" is now "foo = [ fDirName bar ]"
-
-	Install now always does a cp/chmod/etc, rather than using
-	the system's install(1), which invariably seems broken.
-
-3.3.  Jam internal code changes
-
-	$JAMUNAME is set on UNIX.  (2.2.4).
-
-	Jam ANSI-fied (2.3.0).
-
-	jam.h now defines a bunch of symbols used by the other source
-	files, so as minimize compiler- and platform-specific ifdefs.
-
-	OSVER is no longer set by jam.h (it was only set for AIX).
-	Jam does not depend on this variable at all, except to set
-	$(OSFULL), which is used to determine jam's build directory.
-	If the user needs to distinguish between various revs of 
-	OSs, he must set OSVER in the environment.
-
-4.  Fixed bugs
-
-	Redefining a rule while it was executing could cause jam to
-	crash.  Reference counts are now used to prevent that, thanks
-	to Matt Armstrong.
-
-	Logic for computing chunk size when executing PIECEMEAL rules
-	has been reworked to be a little more accurate, without danger
-	of overflow, at the cost of being a little more compute intensive.
-	Instead of computing an estimate chunksize in the (now gone)
-	make1chunk(), make1cmds() now just goes full bore and tries to
-	use all args.  When that fails, it backs off by 10% of the source
-	args until the command fits.  It takes a little bit more compute
-	time compared to the old logic, but when you're executing actions
-	to build all of Shinola it's still pretty small in the scheme
-	of things.
-
-	The NT handle leak in execunix.c has been fixed, thanks to
-	Gurusamy Sarathy.  (2.2.1).
-
-5.  Porting
-
-	Platforms newly supported or updated:
-
-	    AmigaOS (with gcc), courtesy of Alain Penders (2.2.2).
-
-	    Beos
-
-	    CYGWIN 1.1.4, courtesy of John Belmonte <john at nanaon-sha.co.jp>.
-
-	    IBM AS400 via Visual Age on NT (primitive)
-
-	    IBM OS/390 Unix System Services
-
-	    Linux SuSE on OS390
-
-	    Linux Mips, ARM
-
-	    Lynx
-
-	    HPUX 11, IA64
-
-	    Mac OS X Server, courtesy of Jeff_Sickel at sickel.com (2.2.5).
-
-	    Mac Rhapsody
-
-	    MPE IX 6.0
-
-	    NetBSD
-
-	    QNX RTP (QNX 6.0)
-
-	    Siemens Sinix
-
-	    UNICOS
-
-	    VMS 6.2, 7.1
-
-	    Windows NT IA64
-
-5.1.  NT Porting Notes
-
-	Always create tmp .bat file for actions if JAMSHELL is set.
-	That way, if JAMSHELL is a .bat file itself, it can handle
-	single-command actions with more than 9 cmd line args.
-
-	COMSPEC is no longer examined: cmd.exe is always used
-	instead.  Only cmd.exe can execute the Jambase rules anyhow.
-
-	Jam can be built with Borland C++ 5.5.
-
-	OS2 fixes: InstallBin now works.  Filenames are now downshifted,
-	so mixed case works better there, too.  file_dirscan() can now scan 
-	the root ("c:\" or "\") directory, which it couldn't handle before.
-
-	var_defines now ignores OS=Windows_NT, because it conflicts
-	with Jam's setting of OS (to NT).
-
-5.2. Mac OS 8/9 Notes
-
-	The support for Mac is curious at best.  It runs under MPW.
-
-	It requires CodeWarrior Pro 5, but no longer requires GUSI.
-
-	Use Build.mpw to bootstrap the build.
-
-	The Mac specific definitions in the Jambase are not intended
-	to be of general purpose, but are sufficient to have Jam build
-	itself.
-
-===============================================================================
-===============================================================================
-
-
-Release Notes for Jam 2.2
-
-1.  Release info:
-
-	Jam 2.2
-	October 22, 1997
-	VERSION 2.2
-	PATCHLEVEL 1
-
-2. Compatibility
-
-	Jam 2.2 is a roll-up of 'Jam - make(1) redux' release 2.1+.
-	Most of the changes described below were available before this,
-	in the jam.2.1.plus.tar ball.
-
-	The Jam 2.2 language is a superset of the 2.1 language;
-	Jamfiles, Jambase, and other rulesets used in 2.1 can be used
-	with the 2.2 language support.
-
-	See 'Jambase Changes', below, to see if your Jamfiles need any
-	changes to work with the 2.2 Jambase.
-
-
-3. Changes Since 2.1
-
-	New product name: Jam. (Executable program is still named 'jam'.)
-
-	Documentation rewritten; HTML versions supplied.
-
-
-3.1 Changes to Jam Language 
-
-	Rules may now have more fields than just $(<) and $(>).
-
-	Local variables are now supported.
-
-	The expression 'if $(A) in $(B)' is now supported.
-
-	New variable modifiers :U and :L result in uppercased or lowercased
-	values.
-
-	New variable modifier :P reliably results in parent directory
-	of either a file or directory. (Previously, :D was used, but on VMS
-	:D of a directory name is just the directory name.)
-
-	The :S variable modifier now results in the _last_ suffix if a 
-	filename has more than one dot (.) in it.
-
-	New predefined $(JAMDATE) variable is initialized at runtime for 
-	simple date stamping.
-
-	New predefined variables $(OSVER) and $(OSPLAT) are used to 
-	distinguish among operating system versions and hardware platforms,
-	when possible.
-
-	New 'bind' qualifier on action definitions allows variables
-	other than $(<) and $(>) to be bound with SEARCH and LOCATE paths.
-
-	Action buffer size is no longer limited by MAXCMD. Instead, each 
-	line in an action is limited by MAXLINE, defined for each OS, and 
-	the entire action size is limited by CMDBUF.
-
-
-3.2 Jambase Changes (See Jamfile.html)
-
-	Jambase has been reworked to incorporate new language features.
-
-	A handful of new utility rules has been added: makeString,
-	makeDirName, etc.
-
-	New HDRGRIST variable in Jambase allows for headers with the same
-	name to be distinguished.
-
-	LOCATE_TARGET now has a new flavor, LOCATE_SOURCE, that is used by
-	rules that generate source files (e.g., Yacc and Lex).
-
-	Header file includes now happen in the proper order. The limit of
-	10 include files has been eliminated.
-
-	The old "Install" rule is no longer available.  Use InstallBin, 
-	InstallFile, InstallLib, InstallMan, or InstallShell instead.
-
-
-3.3 'jam' Changes (See Jam.html)
-
-	'jam' can now be built as a stand-alone program, with Jambase 
-	compiled into the executable. An external or alternate Jambase can 
-	still be referenced explicitly with -f.
-
-	On command failure, 'jam' now emits the text of the command that 
-	failed.  This is a compromise between the normal -d1 behavior (where 
-	commands were never seen) and -d2 (where commands are always seen).
-
-	'jam' now exits non-zero if it doesn't have a total success.  A parse
-	error, sources that can't be found, and targets that can't be built
-	all generate non-zero exit status.
-	
-	The debugging levels (-d flags) have been slightly redefined.
-
-	The supplied Jamfile now builds 'jam' into a platform specific 
-	subdirectory. This lets you use the same source directory to
-	build 'jam' for more than one platform.
-
-	The supplied Jamfile does not rebuild generated source files by 
-	default. (They are supplied with the distribution.) See Jamfile
-	for more information.
-
-
-4.  Fixed Bugs
-
-	The 'include' bug has finally been fixed, so that include
-	statements take effect exactly when they are executed,
-	rather than after the current statement block.  This also
-	corrects the problem where an 'include' within an 'if'
-	block would wind up including the file one token after the
-	'if' block's closing brace.  Credit goes to Thomas Woods
-	for suggesting that the parse tree generation and parse
-	tree execution be paired in their own loop, rather than
-	having the parser execute the tree directly.
-
-	The setting and extracting of grist has been regularized:
-	normally, if you set a component of a filename (using the
-	:DBSMG= modifiers), you are supposed to include the delimiters
-	that set off the component:  that is, you say "$(x:S=.suffix)",
-	including the ".".  But with grist it was inconsistent
-	between setting and getting: setting grist required no
-	<>'s, while getting grist included them.   Getting grist
-	continues to return the <>'s, but now setting grist can
-	either include them (the new way) or not (the old way).
-
-	'actions together' now suppresses duplicate sources from
-	showing up in $(>).
-
-	Accessing variables whose names contained ['s (as happens with
-	MkDir on VMS) wasn't working, because it treated the [ as an
-	array subscript. Now [ and ] are, like :, handled specially so 
-	that they can appear in variable values.
-
-	The 'if' statement now compares all elements in expressions;
-	previously, it only compared the first element of each list.
-
-	If a command line in an action is longer than MAXLINE (formerly
-	MAXCMD), 'jam' now issues an error and exits rather than dumping 
-	core.
-
-	If a Jamfile ended without a trailing newline, jam dumped core.
-	This has been fixed.
-
-
-5.  Porting
-
-	See jam.h for the definitive list of supported platforms.
-	Since 2.1, support has been added for:
-
-	    Macintosh MPW
-	    Alpha VMS
-	    Alpha NT
-	    NT PowerPC
-	    BeOS
-	    MVS OE
-	    UNIXWARE
-	    QNX
-	    SINIX (Nixdorf)
-	    OS/2
-	    Interactive UNIX (ISC), courtesy of Matthew Newhook
-
-
-5.1 NT Support Fixes
-
-	The NT command executor now handles multiple line actions, by writing
-	multi-line actions to a batch file and executing that.
-	
-	Targets are universally lowercased on NT. (Matthew Newhook)
-
-	Concurrent process support is fully enabled for NT.
-	(Gurusamy Sarathy <gsar at engin.umich.edu>)
-	
-	Path handling: Jam now knows that the directory component of "D:\"
-	is "D:\", just as on unix it knows that the directory component of
-	"/" is "/".  It also now successfully gets the timestamp for "D:\"
-	or just plain "\".
-
-
-5.2 VMS Support Fixes
-
-	VMS support is much, much better now.  The path name manipulation
-	routines (in pathvms.c) were more or less rewritten, and they now
-	handle the vagaries of combining directory and file names properly.
-
-	Targets are universally lowercased on VMS.
-
-	Multi-line command blocks on VMS are now executed in a single system()
-	call rather than separate ones for each line, so that actions can
-	be DCL scripts.
-
-===============================================================================
-===============================================================================
-
-
-Release notes for Jam 2.1.
-
-1.  Release info:
-	Jam 2.1
-	February 1, 1996
-	VERSION 2.1
-	PATCHLEVEL 0
-
-2.  Porting
-
-	Linux is now supported.
-
-	FREEBSD is now supported.
-
-	SCO ("M_XENIX") now supported.
-
-	NCR now supported.
-
-	NEXT support from karthy at dannug.dk (Karsten Thygesen)
-
-	DECC support from zinser at axp614.gsi.de (Martin P.J. Zinser)
-
-	I have changes for OS/2, but no way to test them.  Volunteers?
-	I have VMS multiprocess support, but no way to test it.  Volunteers?
-
-2.1.  NT Support fixes.
-
-	The NT support is considerably more real than it was in 2.0.
-	Filent.c had its syntax error corrected, it no longer skips the
-	first entry when scanning directories, and it handles string
-	tables in archives (for long object file names).
-
-	The Jambase was changed a bit to support the various C/C++
-	compilers on NT, although it has only been thorougly tested
-	with MSVC20.
-
-	You still need to set MSVCNT or BCCROOT to the root of the 
-	the compiler's directory tree, and you'll get an error if you
-	don't set it (rather than getting a pile of mysterious errors).
-
-2.2.  Other porting fixes.
-
-	SPLITPATH now set up for UNIX (:), NT (;), VMS (,)
-
-	Jambase support for Solaris works better now: the location of
-	AR is hardwired to /usr/ccs/bin/ar and it knowns "install"
-	doesn't take -c.  Solaris -- how the mighty have fallen.
-
-	To handle Linux's wacko yacc, jamgram.h is now included after
-	scan.h so that YYSTYPE is define.
-
-3.  Jambase Changes (see Jamfile.html)
-
-	SubDir now computes the root directory for the source tree, if
-	the variable naming the root directory isn't set in the environment.
-	It counts the number of directory elements leading from the root
-	to the current directory (as passed to SubDir) and uses that many
-	"../"'s to identify the root.  This means that to use SubDir you
-	no longer have to have anything special set in the environment.
-
-	InstallFile is now an alias for InstallLib.
-
-	'first' is now dependency of all pseudo-targets (all, files, 
-	exe, lib, shell), so that jamming any of these pseudo-targets
-	also builds any dependencies of 'first'.
-
-	The File rule definition in the Jambase was missing an &.
-
-	The File rule now calls the Clean rule, so that installed files
-	get cleaned.
-
-4.  Jam changes (see Jam.html)
-
-	Variables may now be set on the command line with -svar=value.
-
-	Targets marked with NOUPDATE are now immune to the -a (anyhow) 
-	flag.  Previously, the MkDir rule would try to recreate directories
-	that already exist when jam was invoked with -a.
-
-	A new variable, $(JAMVERSION), joins the small list of built-in 
-	variables.  It it set to the release of jam, currently "2.1".
-
-	If an actions fails, jam now deletes the target(s).  It won't
-	delete libraries or other targets that are composites.  This is
-	now consistent with jam's behavior on interrupts (it deletes the
-	targets).
-
-	Jam had a nasty bug when setting multiple variables to the same
-	value:  if the first two variable names were the same, the variable
-	value got trashed.  This also affected "on target" variables if
-	the first two targets were the same.  For example:
-
-		FOO on bar.c bar.c foo.c = a b c ;
-
-	This would mangle the value of FOO for bar.c and foo.c.  This has
-	been fixed.
-
-	Jam would generate bogus numbers when reporting the number of
-	targets updated after an interrupt.  It now is more careful about
-	counting.
-
-	The debugging flag -d has been extended.  In addition to supporting
-	-dx (turn on debugging for all levels up to x) there is also now
-	-d+x (turn on debugging at only level x).  The default output
-	level is -d1 (-or d2 if -n is given); this can be turned off with
-	-d0.   The debug levels are listed in jam.1 and jam.h.
-
-	The parsing debug output now uses indenting to indicate when
-	one rule invokes another.
-
-===============================================================================
-===============================================================================
-
-
-Release notes for Jam 2.0.
-
-1.  Release info:
-	Jam 2.0 
-	March 10, 1994
-	VERSION 2.0
-	PATCHLEVEL 5
-
-2.  Porting
-
-	Windows/NT is now (crudely) supported, courtesy of Brett Taylor
-	and Laura Wingerd.  
-
-	COHERENT/386 is now supported, courtesy of Fred Smith.
-
-	Solaris archive string table for long archive names is now
-	supported, thanks to Mike Matrigali.
-
-3.  Compatibility
-
-	Jam 2.0 syntax is a superset of Jam 1.0 syntax, and thus it can
-	interpret a Jam 1.0 Jambase.
-
-	The Jam 2.0 Jambase is a superset of the Jam 1.0 Jambase, and
-	thus it can include a Jamfile written for Jam 1.0.
-
-4.  Changes from Jam 1.0 to Jam 2.0
-
-4.1.  Documentation changes
-
-	New Jamfile.5 manual page, with lots of examples and easy
-	reading.  It replaces both the old "Examples" file as well as
-	the old Jambase.5 manual page.
-
-	jam.1 edited by Stephen W. Liddle and Diane Holt.
-
-4.2.  Jambase Changes (see Jamfile.5)
-
-4.2.1.  New rules:
-
-	There are new rules to make handling subdirectories easier:
-	SubDir, SubInclude, SubDirCcFlags, SubDirHdrs.
-
-	There are new rules to handle file-specific CCFLAGS and HDRS:
-	ObjectCcFlags and ObjectHdrs.
-
-	Misc new rules: HardLink, InstallShell, MkDir.
-
-	New rule "clean" that deletes exactly what jam has built, and
-	"uninstall" that deletes exactly what was installed.
-
-	New rules for handling suffixes .s, .f, .cc, .cpp, .C.
-
-4.2.2.  Old rules:
-
-	The InstallBin, Lib, Man, and the new Shell rules now take the
-	destination directory as the target and the files to be copied
-	as sources.  These rules formerly took the files to be copied
-	as targets, and used built-in destination directories of
-	$(BINDIR), $(LIBDIR), $(MANDIR), and $(BINDIR).
-
-	The InstallBin, Lib, Man, and Shell rules use the install(1)
-	program now, instead of doing their own copying.
-
-	The Cc rule now uses -o when possible, rather than moving the
-	result.  Some platforms (Pyramid?) have a broken -o.
-
-	Jambase rules taking libraries, objects, and executables now
-	all ignore the suffixes provided and use the one defined in the
-	Jambase for the platform.
-
-	Stupid yyacc support moved out of Jambase, as jam is its only
-	likely user.
-
-	Jambase now purturbs library sources with a "grist" of
-	SOURCE_GRIST.
-
-4.2.3.  Misc:
-
-	The names of the default rules defined in Jambase have been
-	lowercased and un-abbreviated, to be more imake(1) like.
-
-	The Jambase has been reorganized and sorted, with VMS and NT
-	support moved in from their own files.
-
-	The Jambase has been relocated on UNIX from /usr/local/lib/jam
-	to /usr/local/lib.
-
-4.3.  Jam changes (see jam.1)
-
-4.3.1.   Flags:
-
-	New -a (anyhow) flag: means build everything.
-
-	New -j<x> flag: run jobs in parallel.
-
-	Old -t now rebuilds the touched target, rather that just the
-	target's parents.
-
-	-n now implies -d2, so that you see what's happening.  The
-	debug level can be subsequently overridden.
-
-	New -v to dump version.
-
-4.3.2.  Rules:
-
-	New ALWAYS rule behaves like -t: always builds target.
-
-	New EXIT rule makes it possible to raise a fatal error.
-
-	New LEAVES rule which say target depends only on the update
-	times of the leaf sources.
-
-	New NOUPDATE rule says built targets only if they don't exist.
-
-	NOTIME has been renamed NOTFILE, to more accurately reflect its
-	meaning (it says a target is not to be bound to a file).
-
-4.3.3.  Variables:
-
-	New special variable JAMSHELL: argv template for command execution 
-	shell.
-
-	Variables, both normal and target-specific, can have their
-	value appended with the syntax "var += value" or "var on target
-	+= value".
-
-	"?=" is now synonymous with "default =".
-
-	Imported enviroment variable values are now split at blanks
-	(:'s if the variable name ends in PATH), so that they become
-	proper list values.
-
-4.3.4.  Misc:
-
-	Files to be sourced with "include" are now bound first, so
-	$(SEARCH) and $(LOCATE) affect them.  They still can't be
-	built, though.
-
-	New modifier on "actions": "existing" causes $(>) to expand
-	only those files that currently exist.
-
-4.3.5.  Bug fixes:
-
-	When scanning tokens known to be argument lists (such as the
-	arguments to rule invocations and variable assignment), the
-	parser now tells the scanner to ignore alphabetic keywords, as
-	all such lists terminate with punctuation keywords (like : or
-	;).  This way, alphabetic keywords don't need to be quoted when
-	they appear as arguments.
-
-	The scanner has been fixed to handle oversized tokens,
-	unterminated quotes, unterminated action blocks, and tokens
-	abutting EOF (i.e. a token with no white space before EOF).
-
-	The progress report "...on xth target..." used to count all
-	targets, rather than just those with updating actions.  Since
-	the original pronouncement of targets to be udpated included
-	only those with updating actions, the progress report has been
-	changed to match.
-
-	'If' conditionals now must be single arguments.  Previously,
-	they could be zero or more arguments, which didn't make much
-	sense, and made things like 'foo == bar' true.  The comparison
-	operator is '=', and '==' just looked like the second of three
-	arguments in the unary "non-empty argument list" conditional.
-
-	Header files indirectly including themselves were mistakenly
-	reported as being dependent on themselves.  Recursing through
-	header file dependencies is now done after determining the fate
-	of the target.
-
-	The variable expansion support was expanding $(X)$(UNDEF) as if
-	it were $(X).  It now expands to an empty list, like it
-	should.
-
-	The UNIX version of file_build() didn't handle "dir/.suffix"
-	right.  Now it does.
-
-	The VMS command buffer was assumed to be as large as 1024 bytes,
-	which isn't the case everywhere as it is related to some weird
-	quota.  It has been lowered to 256.
-
-	$(>) and $(<) wouldn't expand in action blocks if the targets
-	were marked with NOTIME.  Now they expand properly.
-
-	Malloc() return values are now checked.
-
-	The variable expansion routine var_expand() is now a little
-	faster, by taking a few often needed shortcuts.
-
-	The VMS version of file_build() used the wrong length when
-	re-rooting file names that already had directory compoents.
-	This was fixed.
-
-	Various tracing adjustments were made.
-
-5.  Limitations/Known Bugs
-
-	The new Windows/NT support has only been marginally tested.  It
-	is dependent on certain variables being set depending on which
-	compiler you are using.  You'll need to look in the file
-	Jambase and see what variables are expected to be set.
-
-	The VMS support has been tested, courtesy of the DEC guest
-	machine, but has not been hammered fully in release 2.0.  It
-	was used quite a bit in Jam 1.0.
-
-	Jam clean when there is nothing to clean claims it is updating
-	a target.
-
-	Because the include statement works by pushing a new file in
-	the input stream of the scanner rather than recursively
-	invoking the parser on the new file, multiple include
-	statements in a rule's procedure causes the files to be
-	included in reverse order.
-
-	If the include statement appears inside an if block, the
-	parser's attempt to find the else will cause the text of the
-	included file to appear after the first token following the
-	statement block.  This is rarely what is intended.
-
-	In a rule's actions, only $(<) and $(>) refer to the bound file
-	names:  all other variable references get the unbound names.
-	This is a pain for $(NEEDLIBS), because it means that library
-	path can't be bound using $(SEARCH) and $(LOCATE).
-
-	With the -j flag, errors from failed commands can get
-	staggeringly mixed up.  Also, because targets tend to get built
-	in a quickest-first ordering, dependency information must be
-	quite exact.  Finally, beware of parallelizing commands that
-	drop fixed-named files into the current directory, like yacc(1)
-	does.
-
-	A poorly set $(JAMSHELL) is likely to result in silent
-	failure.

Modified: boost-build/branches/upstream/current/jam_src/boost-jam.spec
===================================================================
--- boost-build/branches/upstream/current/jam_src/boost-jam.spec	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/boost-jam.spec	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,5 +1,5 @@
 Name: boost-jam
-Version: 3.1.10
+Version: 3.1.13
 Summary: Build tool
 Release: 1
 Source: %{name}-%{version}.tgz
@@ -31,8 +31,9 @@
     ALL WARRANTIES ARE HEREBY DISCLAIMED.
 
 Also:
-    Copyright 2001-2004 David Abrahams.
-    Copyright 2002-2004 Rene Rivera.
+    Copyright 2001-2006 David Abrahams.
+    Copyright 2002-2006 Rene Rivera.
+    Copyright 2003-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)
@@ -49,10 +50,9 @@
 mkdir -p $RPM_BUILD_ROOT%{_docdir}/%{name}-%{version}
 install -m 755 bin/bjam $RPM_BUILD_ROOT%{_bindir}/bjam-%{version}
 ln -sf bjam-%{version} $RPM_BUILD_ROOT%{_bindir}/bjam
-ln -sf bjam-%{version} $RPM_BUILD_ROOT%{_bindir}/jam
-install -m 644 *.html *.txt Porting $RPM_BUILD_ROOT%{_docdir}/%{name}-%{version}
+cp -R *.html *.png *.css LICENSE*.txt images jam $RPM_BUILD_ROOT%{_docdir}/%{name}-%{version}
 
-find $RPM_BUILD_ROOT -name CVS -type d -depth -exec rm -r {} \;
+find $RPM_BUILD_ROOT -name CVS -type d -exec rm -r {} \;
 
 %files
 %defattr(-,root,root)

Modified: boost-build/branches/upstream/current/jam_src/build.bat
===================================================================
--- boost-build/branches/upstream/current/jam_src/build.bat	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/build.bat	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,6 +1,6 @@
 @ECHO OFF
 
-REM ~ Copyright 2002-2003 Rene Rivera.
+REM ~ Copyright 2002-2005 Rene Rivera.
 REM ~ Distributed under the Boost Software License, Version 1.0.
 REM ~ (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
@@ -19,7 +19,7 @@
 ECHO ### You can specify the toolset as the argument, i.e.:
 ECHO ###     .\build.bat msvc
 ECHO ###
-ECHO ### Toolsets supported by this script are: borland, como, gcc, gcc-nocygwin, intel-win32, metrowerks, mingw, msvc, vc7
+ECHO ### Toolsets supported by this script are: borland, como, gcc, gcc-nocygwin, intel-win32, metrowerks, mingw, msvc, vc7, vc8
 ECHO ###
 set _error_=
 endlocal
@@ -41,7 +41,11 @@
 setlocal & endlocal
 setlocal
 set test=%1
-if not "-" == "%test:~0,1%" set _error_=
+set test=###%test%###
+set test=%test:"###=%
+set test=%test:###"=%
+set test=%test:###=%
+if not [-] == [%test:~0,1%] set _error_=
 endlocal
 goto :eof
 
@@ -50,16 +54,18 @@
 REM Sets BOOST_JAM_TOOLSET to the first found toolset.
 REM May also set BOOST_JAM_TOOLSET_ROOT to the
 REM location of the found toolset.
+
+if "_%ProgramFiles%_" == "__" set ProgramFiles=C:\Program Files
+
 setlocal & endlocal
-if NOT "_%CWFolder%_" == "__" (
-    set BOOST_JAM_TOOLSET=metrowerks
-    set BOOST_JAM_TOOLSET_ROOT=%CWFolder%\
-    goto :eof )
+if NOT "_%VS80COMNTOOLS%_" == "__" (
+    set BOOST_JAM_TOOLSET=vc8
+    set BOOST_JAM_TOOLSET_ROOT=%VS80COMNTOOLS%..\..\VC\
+    goto :eof)
 setlocal & endlocal
-call :Test_Path mwcc.exe
-if not errorlevel 1 (
-    set BOOST_JAM_TOOLSET=metrowerks
-    set BOOST_JAM_TOOLSET_ROOT=%FOUND_PATH%..\..\
+if EXIST "%ProgramFiles%\Microsoft Visual Studio 8\VC\bin\VCVARS32.BAT" (
+    set BOOST_JAM_TOOLSET=vc8
+    set BOOST_JAM_TOOLSET_ROOT=%ProgramFiles%\Microsoft Visual Studio 8\VC\
     goto :eof)
 setlocal & endlocal
 if NOT "_%VS71COMNTOOLS%_" == "__" (
@@ -77,21 +83,11 @@
     set BOOST_JAM_TOOLSET_ROOT=%ProgramFiles%\Microsoft Visual Studio .NET 2003\VC7\
     goto :eof)
 setlocal & endlocal
-if EXIST "C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\bin\VCVARS32.BAT" (
-    set BOOST_JAM_TOOLSET=vc7
-    set BOOST_JAM_TOOLSET_ROOT=C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\
-    goto :eof)
-setlocal & endlocal
 if EXIST "%ProgramFiles%\Microsoft Visual Studio .NET\VC7\bin\VCVARS32.BAT" (
     set BOOST_JAM_TOOLSET=vc7
     set BOOST_JAM_TOOLSET_ROOT=%ProgramFiles%\Microsoft Visual Studio .NET\VC7\
     goto :eof)
 setlocal & endlocal
-if EXIST "C:\Program Files\Microsoft Visual Studio .NET\VC7\bin\VCVARS32.BAT" (
-    set BOOST_JAM_TOOLSET=vc7
-    set BOOST_JAM_TOOLSET_ROOT=C:\Program Files\Microsoft Visual Studio .NET\VC7\
-    goto :eof)
-setlocal & endlocal
 if NOT "_%MSVCDir%_" == "__" (
     set BOOST_JAM_TOOLSET=msvc
     set BOOST_JAM_TOOLSET_ROOT=%MSVCDir%\
@@ -102,21 +98,11 @@
     set BOOST_JAM_TOOLSET_ROOT=%ProgramFiles%\Microsoft Visual Studio\VC98\
     goto :eof)
 setlocal & endlocal
-if EXIST "C:\Program Files\Microsoft Visual Studio\VC98\bin\VCVARS32.BAT" (
-    set BOOST_JAM_TOOLSET=msvc
-    set BOOST_JAM_TOOLSET_ROOT=C:\Program Files\Microsoft Visual Studio\VC98\
-    goto :eof)
-setlocal & endlocal
 if EXIST "%ProgramFiles%\Microsoft Visual C++\VC98\bin\VCVARS32.BAT" (
     set BOOST_JAM_TOOLSET=msvc
     set BOOST_JAM_TOOLSET_ROOT=%ProgramFiles%\Microsoft Visual C++\VC98\
     goto :eof)
 setlocal & endlocal
-if EXIST "C:\Program Files\Microsoft Visual C++\VC98\bin\VCVARS32.BAT" (
-    set BOOST_JAM_TOOLSET=msvc
-    set BOOST_JAM_TOOLSET_ROOT=C:\Program Files\Microsoft Visual C++\VC98\
-    goto :eof)
-setlocal & endlocal
 call :Test_Path cl.exe
 if not errorlevel 1 (
     set BOOST_JAM_TOOLSET=msvc
@@ -152,6 +138,17 @@
     set BOOST_JAM_TOOLSET_ROOT=C:\MinGW\
     goto :eof)
 setlocal & endlocal
+if NOT "_%CWFolder%_" == "__" (
+    set BOOST_JAM_TOOLSET=metrowerks
+    set BOOST_JAM_TOOLSET_ROOT=%CWFolder%\
+    goto :eof )
+setlocal & endlocal
+call :Test_Path mwcc.exe
+if not errorlevel 1 (
+    set BOOST_JAM_TOOLSET=metrowerks
+    set BOOST_JAM_TOOLSET_ROOT=%FOUND_PATH%..\..\
+    goto :eof)
+setlocal & endlocal
 call :Error_Print "Could not find a suitable toolset."
 goto :eof
 
@@ -182,7 +179,7 @@
 REM or if first argument is an option guess the toolset;
 REM otherwise the argument is the toolset to use.
 if "_%1_" == "__" (
-    call :Guess_Toolset
+    call :Guess_Toolset
     if not errorlevel 1 goto Setup_Toolset
 ) else (
     call :Test_Option %1
@@ -197,7 +194,7 @@
     )
 )
 if errorlevel 1 goto Finish
-
+
 :Setup_Toolset
 REM Setup the toolset command and options. This bit of code
 REM needs to be flexible enough to handle both when
@@ -213,10 +210,10 @@
 if "_%BOOST_JAM_TOOLSET%_" == "_metrowerks_" (
     if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (
         set PATH=%BOOST_JAM_TOOLSET_ROOT%Other Metrowerks Tools\Command Line Tools;%PATH%)
-    set BOOST_JAM_CC=mwcc -runtime ss -cwd include -DNT -ladvapi32.lib
-    set BOOST_JAM_OPT_JAM=-o bootstrap.%BOOST_JAM_TOOLSET%\jam0.exe
-    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap.%BOOST_JAM_TOOLSET%\mkjambase0.exe
-    set BOOST_JAM_OPT_YYACC=-o bootstrap.%BOOST_JAM_TOOLSET%\yyacc0.exe
+    set BOOST_JAM_CC=mwcc -runtime ss -cwd include -DNT -lkernel32.lib -ladvapi32.lib -luser32.lib
+    set BOOST_JAM_OPT_JAM=-o bootstrap\jam0.exe
+    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap\mkjambase0.exe
+    set BOOST_JAM_OPT_YYACC=-o bootstrap\yyacc0.exe
     set _known_=1
 )
 if "_%BOOST_JAM_TOOLSET%_" == "_msvc_" (
@@ -228,10 +225,10 @@
 if "_%BOOST_JAM_TOOLSET%_" == "_msvc_" (
     if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (
         set PATH=%BOOST_JAM_TOOLSET_ROOT%bin;%PATH%)
-    set BOOST_JAM_CC=cl /nologo /GZ /Zi /MLd -DNT -DYYDEBUG kernel32.lib advapi32.lib
-    set BOOST_JAM_OPT_JAM=/Febootstrap.%BOOST_JAM_TOOLSET%\jam0
-    set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap.%BOOST_JAM_TOOLSET%\mkjambase0
-    set BOOST_JAM_OPT_YYACC=/Febootstrap.%BOOST_JAM_TOOLSET%\yyacc0
+    set BOOST_JAM_CC=cl /nologo /GZ /Zi /MLd -DNT -DYYDEBUG kernel32.lib advapi32.lib user32.lib
+    set BOOST_JAM_OPT_JAM=/Febootstrap\jam0
+    set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0
+    set BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0
     set _known_=1
 )
 if "_%BOOST_JAM_TOOLSET%_" == "_vc7_" (
@@ -243,12 +240,27 @@
 if "_%BOOST_JAM_TOOLSET%_" == "_vc7_" (
     if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (
         set PATH=%BOOST_JAM_TOOLSET_ROOT%bin;%PATH%)
-    set BOOST_JAM_CC=cl /nologo /GZ /Zi /MLd -DNT -DYYDEBUG kernel32.lib advapi32.lib
-    set BOOST_JAM_OPT_JAM=/Febootstrap.%BOOST_JAM_TOOLSET%\jam0
-    set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap.%BOOST_JAM_TOOLSET%\mkjambase0
-    set BOOST_JAM_OPT_YYACC=/Febootstrap.%BOOST_JAM_TOOLSET%\yyacc0
+    set BOOST_JAM_CC=cl /nologo /GZ /Zi /MLd -DNT -DYYDEBUG kernel32.lib advapi32.lib user32.lib
+    set BOOST_JAM_OPT_JAM=/Febootstrap\jam0
+    set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0
+    set BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0
     set _known_=1
 )
+if "_%BOOST_JAM_TOOLSET%_" == "_vc8_" (
+    if NOT "_%MSVCDir%_" == "__" (
+        set BOOST_JAM_TOOLSET_ROOT=%MSVCDir%\) )
+if "_%BOOST_JAM_TOOLSET%_" == "_vc8_" (
+    if EXIST "%BOOST_JAM_TOOLSET_ROOT%bin\VCVARS32.BAT" (
+        call "%BOOST_JAM_TOOLSET_ROOT%bin\VCVARS32.BAT" ) )
+if "_%BOOST_JAM_TOOLSET%_" == "_vc8_" (
+    if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (
+        set PATH=%BOOST_JAM_TOOLSET_ROOT%bin;%PATH%)
+    set BOOST_JAM_CC=cl /nologo /RTC1 /Zi /MTd -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib user32.lib
+    set BOOST_JAM_OPT_JAM=/Febootstrap\jam0
+    set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0
+    set BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0
+    set _known_=1
+)
 if "_%BOOST_JAM_TOOLSET%_" == "_borland_" (
     if "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (
         call :Test_Path bcc32.exe ) )
@@ -258,7 +270,7 @@
             set BOOST_JAM_TOOLSET_ROOT=%FOUND_PATH%..\) ) )
 if "_%BOOST_JAM_TOOLSET%_" == "_borland_" (
     if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (set PATH=%BOOST_JAM_TOOLSET_ROOT%Bin;%PATH%)
-    set BOOST_JAM_CC=bcc32 -WC -w- -q "-I%BOOST_JAM_TOOLSET_ROOT%Include" "-L%BOOST_JAM_TOOLSET_ROOT%Lib" /DNT -nbootstrap.%BOOST_JAM_TOOLSET%
+    set BOOST_JAM_CC=bcc32 -WC -w- -q "-I%BOOST_JAM_TOOLSET_ROOT%Include" "-L%BOOST_JAM_TOOLSET_ROOT%Lib" /DNT -nbootstrap
     set BOOST_JAM_OPT_JAM=-ejam0
     set BOOST_JAM_OPT_MKJAMBASE=-emkjambasejam0
     set BOOST_JAM_OPT_YYACC=-eyyacc0
@@ -266,38 +278,38 @@
 )
 if "_%BOOST_JAM_TOOLSET%_" == "_como_" (
     set BOOST_JAM_CC=como -DNT
-    set BOOST_JAM_OPT_JAM=-o bootstrap.%BOOST_JAM_TOOLSET%\jam0.exe
-    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap.%BOOST_JAM_TOOLSET%\mkjambase0.exe
-    set BOOST_JAM_OPT_YYACC=-o bootstrap.%BOOST_JAM_TOOLSET%\yyacc0.exe
+    set BOOST_JAM_OPT_JAM=-o bootstrap\jam0.exe
+    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap\mkjambase0.exe
+    set BOOST_JAM_OPT_YYACC=-o bootstrap\yyacc0.exe
     set _known_=1
 )
 if "_%BOOST_JAM_TOOLSET%_" == "_gcc_" (
     set BOOST_JAM_CC=gcc -DNT
-    set BOOST_JAM_OPT_JAM=-o bootstrap.%BOOST_JAM_TOOLSET%\jam0.exe
-    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap.%BOOST_JAM_TOOLSET%\mkjambase0.exe
-    set BOOST_JAM_OPT_YYACC=-o bootstrap.%BOOST_JAM_TOOLSET%\yyacc0.exe
+    set BOOST_JAM_OPT_JAM=-o bootstrap\jam0.exe
+    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap\mkjambase0.exe
+    set BOOST_JAM_OPT_YYACC=-o bootstrap\yyacc0.exe
     set _known_=1
 )
 if "_%BOOST_JAM_TOOLSET%_" == "_gcc-nocygwin_" (
     set BOOST_JAM_CC=gcc -DNT -mno-cygwin
-    set BOOST_JAM_OPT_JAM=-o bootstrap.%BOOST_JAM_TOOLSET%\jam0.exe
-    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap.%BOOST_JAM_TOOLSET%\mkjambase0.exe
-    set BOOST_JAM_OPT_YYACC=-o bootstrap.%BOOST_JAM_TOOLSET%\yyacc0.exe
+    set BOOST_JAM_OPT_JAM=-o bootstrap\jam0.exe
+    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap\mkjambase0.exe
+    set BOOST_JAM_OPT_YYACC=-o bootstrap\yyacc0.exe
     set _known_=1
 )
 if "_%BOOST_JAM_TOOLSET%_" == "_intel-win32_" (
-    set BOOST_JAM_CC=icl -DNT /nologo
-    set BOOST_JAM_OPT_JAM=/Febootstrap.%BOOST_JAM_TOOLSET%\jam0
-    set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap.%BOOST_JAM_TOOLSET%\mkjambase0
-    set BOOST_JAM_OPT_YYACC=/Febootstrap.%BOOST_JAM_TOOLSET%\yyacc0
+    set BOOST_JAM_CC=icl -DNT /nologo kernel32.lib advapi32.lib user32.lib
+    set BOOST_JAM_OPT_JAM=/Febootstrap\jam0
+    set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0
+    set BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0
     set _known_=1
 )
 if "_%BOOST_JAM_TOOLSET%_" == "_mingw_" (
     if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (set PATH=%BOOST_JAM_TOOLSET_ROOT%bin;%PATH%)
     set BOOST_JAM_CC=gcc -DNT
-    set BOOST_JAM_OPT_JAM=-o bootstrap.%BOOST_JAM_TOOLSET%\jam0.exe
-    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap.%BOOST_JAM_TOOLSET%\mkjambase0.exe
-    set BOOST_JAM_OPT_YYACC=-o bootstrap.%BOOST_JAM_TOOLSET%\yyacc0.exe
+    set BOOST_JAM_OPT_JAM=-o bootstrap\jam0.exe
+    set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap\mkjambase0.exe
+    set BOOST_JAM_OPT_YYACC=-o bootstrap\yyacc0.exe
     set _known_=1
 )
 if "_%_known_%_" == "__" (
@@ -312,25 +324,45 @@
 set YYACC_SOURCES=yyacc.c
 set MKJAMBASE_SOURCES=mkjambase.c
 set BJAM_SOURCES=
-set BJAM_SOURCES=%BJAM_SOURCES% command.c compile.c execnt.c execunix.c execvms.c expand.c
-set BJAM_SOURCES=%BJAM_SOURCES% filent.c fileos2.c fileunix.c filevms.c glob.c hash.c
+set BJAM_SOURCES=%BJAM_SOURCES% command.c compile.c debug.c execnt.c expand.c filent.c glob.c hash.c
 set BJAM_SOURCES=%BJAM_SOURCES% hdrmacro.c headers.c jam.c jambase.c jamgram.c lists.c make.c make1.c
-set BJAM_SOURCES=%BJAM_SOURCES% newstr.c option.c parse.c pathunix.c pathvms.c regexp.c
+set BJAM_SOURCES=%BJAM_SOURCES% newstr.c option.c parse.c pathunix.c regexp.c
 set BJAM_SOURCES=%BJAM_SOURCES% rules.c scan.c search.c subst.c timestamp.c variable.c modules.c
 set BJAM_SOURCES=%BJAM_SOURCES% strings.c filesys.c builtins.c pwd.c class.c w32_getreg.c native.c
 set BJAM_SOURCES=%BJAM_SOURCES% modules/set.c modules/path.c modules/regex.c 
 set BJAM_SOURCES=%BJAM_SOURCES% modules/property-set.c modules/sequence.c modules/order.c
 
+set BJAM_UPDATE=
+if "_%1" == "_--update" (
+    set BJAM_UPDATE=update
+)
+if "_%2" == "_--update" (
+    set BJAM_UPDATE=update
+)
+if "_%3" == "_--update" (
+    set BJAM_UPDATE=update
+)
+if "_%4" == "_--update" (
+    set BJAM_UPDATE=update
+)
+if "_%BJAM_UPDATE%_" == "_update_" (
+    if not exist ".\bootstrap\jam0.exe" (
+        set BJAM_UPDATE=
+    )
+)
+
+
 @echo ON
-rd /S /Q bootstrap.%BOOST_JAM_TOOLSET%
-md bootstrap.%BOOST_JAM_TOOLSET%
+ at if "_%BJAM_UPDATE%_" == "_update_" goto Skip_Bootstrap
+rd /S /Q bootstrap
+md bootstrap
 @if not exist jamgram.y goto Bootstrap_GrammarPrep
 @if not exist jamgramtab.h goto Bootstrap_GrammarPrep
 @goto Skip_GrammarPrep
 :Bootstrap_GrammarPrep
 %BOOST_JAM_CC% %BOOST_JAM_OPT_YYACC% %YYACC_SOURCES%
- at if not exist ".\bootstrap.%BOOST_JAM_TOOLSET%\yyacc0.exe" goto Skip_GrammarPrep
-.\bootstrap.%BOOST_JAM_TOOLSET%\yyacc0 jamgram.y jamgramtab.h jamgram.yy
+ at if not exist ".\bootstrap\yyacc0.exe" goto Skip_GrammarPrep
+.\bootstrap\yyacc0 jamgram.y jamgramtab.h jamgram.yy
 :Skip_GrammarPrep
 @if not exist jamgram.c goto Bootstrap_GrammarBuild
 @if not exist jamgram.h goto Bootstrap_GrammarBuild
@@ -352,13 +384,23 @@
 @echo ON
 @if exist jambase.c goto Skip_Jambase
 %BOOST_JAM_CC% %BOOST_JAM_OPT_MKJAMBASE% %MKJAMBASE_SOURCES%
- at if not exist ".\bootstrap.%BOOST_JAM_TOOLSET%\mkjambase0.exe" goto Skip_Jambase
-.\bootstrap.%BOOST_JAM_TOOLSET%\mkjambase0 jambase.c Jambase
+ at if not exist ".\bootstrap\mkjambase0.exe" goto Skip_Jambase
+.\bootstrap\mkjambase0 jambase.c Jambase
 :Skip_Jambase
 %BOOST_JAM_CC% %BOOST_JAM_OPT_JAM% %BJAM_SOURCES%
- at if not exist ".\bootstrap.%BOOST_JAM_TOOLSET%\jam0.exe" goto Skip_Jam
-.\bootstrap.%BOOST_JAM_TOOLSET%\jam0 -f build.jam --toolset=%BOOST_JAM_TOOLSET% "--toolset-root=%BOOST_JAM_TOOLSET_ROOT% " clean
-.\bootstrap.%BOOST_JAM_TOOLSET%\jam0 -f build.jam --toolset=%BOOST_JAM_TOOLSET% "--toolset-root=%BOOST_JAM_TOOLSET_ROOT% " %1 %2 %3 %4 %5 %6 %7 %8 %9
+:Skip_Bootstrap
+ at if not exist ".\bootstrap\jam0.exe" goto Skip_Jam
+ at if "_%BJAM_UPDATE%_" == "_update_" goto Skip_Clean
+.\bootstrap\jam0 -f build.jam --toolset=%BOOST_JAM_TOOLSET% "--toolset-root=%BOOST_JAM_TOOLSET_ROOT% " clean
+:Skip_Clean
+ at set args=
+:Set_Args
+ at if not "_%1_" == "__" (
+    set args=%args% %1
+    shift
+    goto Set_Args
+)
+.\bootstrap\jam0 -f build.jam --toolset=%BOOST_JAM_TOOLSET% "--toolset-root=%BOOST_JAM_TOOLSET_ROOT% " %args%
 :Skip_Jam
 
 :Finish


Property changes on: boost-build/branches/upstream/current/jam_src/build.bat
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/jam_src/build.jam
===================================================================
--- boost-build/branches/upstream/current/jam_src/build.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/build.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,4 +1,4 @@
-#~ Copyright 2002-2004 Rene Rivera.
+#~ Copyright 2002-2005 Rene Rivera.
 #~ 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)
 
@@ -12,10 +12,11 @@
 else { . = "." ; }
 
 # Info about what we are building.
+_VERSION_ = 3 1 13 ;
 NAME = boost-jam ;
-VERSION = 3$(.)1$(.)10 ;
+VERSION = $(_VERSION_:J=$(.)) ;
 RELEASE = 1 ;
-LICENSE = 1_0 ;
+LICENSE = LICENSE_1_0 ;
 
 # Generate development debug binaries?
 if --debug in $(ARGV)
@@ -36,6 +37,53 @@
     ARGV += --release ;
 }
 
+# Enable, and configure, Python hooks.
+with-python = ;
+python-location = [ MATCH --with-python=(.*) : $(ARGV) ] ;
+if $(python-location)
+{
+    with-python = true ;
+}
+if $(with-python)
+{
+    if $(NT)
+    {
+        --python-include = [ .path $(python-location) include ] ;
+        --python-lib = ;
+        for local v in 25 24 23 22
+        {
+            --python-lib ?=
+                [ GLOB [ .path $(python-location) libs ] : "python$(v).lib" ]
+                [ GLOB $(python-location) $(Path) $(PATH) $(path) : "python$(v).dll" ]
+                ;
+            if ! $(--python-lib[2])
+            {
+                --python-lib = ;
+            }
+        }
+    }
+    else if $(OS) = MACOSX
+    {
+        --python-include = [ .path $(python-location) Headers ] ;
+        --python-lib = $(python-location) Python ;
+    }
+    else
+    {
+        --python-include = ;
+        --python-lib = ;
+        for local v in 2.5 2.4 2.3 2.2
+        {
+            local inc = [ GLOB [ .path $(python-location) include ] : python$(v) ] ;
+            local lib = [ GLOB [ .path $(python-location) lib ] : libpython$(v)* ] ;
+            if $(inc) && $(lib)
+            {
+                --python-include ?= $(inc) ;
+                --python-lib ?= $(lib[1]:D) python$(v) ;
+            }
+        }
+    }
+}
+
 # An explicit root for the toolset? (trim spaces)
 toolset-root = [ MATCH --toolset-root=(.*) : $(ARGV) ] ;
 {
@@ -70,105 +118,160 @@
 toolset acc cc : "-o " : -D
     : -Ae
     [ opt --release : -s -O3 ]
-    [ opt --debug : -g -pg ] ;
+    [ opt --debug : -g -pg ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Borland C++ 5.5.x
 toolset borland bcc32 : -e -n : /D
     : -WC -w- -q "-I$(toolset-root)Include" "-L$(toolset-root)Lib"
     [ opt --release : -O2 -vi -w-inl ]
-    [ opt --debug : -v -Od -vi- ] ;
+    [ opt --debug : -v -Od -vi- ]
+    -I$(--python-include)
+    : $(--python-lib[1]) ;
 ## Generic Unix cc
 if ! $(CC) { CC = cc ; }
 toolset cc $(CC) : "-o " : -D
     : $(CFLAGS)
     [ opt --release : -s -O ]
     [ opt --debug : -g ]
-    : $(LIBS) ;
+    -I$(--python-include)
+    : $(LIBS) -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Comeau C/C++ 4.x
 toolset como como : "-o " : -D
     : --c
     [ opt --release : --inlining ]
-    [ opt --debug : --no_inlining ] ;
+    [ opt --debug : --no_inlining ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## MacOSX Darwin, using GCC 2.9.x, 3.x
 toolset darwin cc :  "-o " : -D
     :
     [ opt --release : -Wl,-x -O3 -finline-functions ]
-    [ opt --debug : -g -O0 -fno-inline -pg ] ;
-## GCC 2.x, 3.x
+    [ opt --debug : -g -O0 -fno-inline -pg ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
+## GCC 2.x, 3.x, 4.x
 toolset gcc gcc : "-o " : -D
     : -pedantic
-    [ opt --release : [ opt --symbols : -g : -s ] -O3 -finline-functions ]
-    [ opt --debug : -g -O0 -fno-inline ] ;
+    [ opt --release : [ opt --symbols : -g : -s ] -O3 ]
+    [ opt --debug : -g -O0 -fno-inline ]
+    -I$(--python-include) -Wno-long-long
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## GCC 2.x, 3.x on CYGWIN but without cygwin1.dll
 toolset gcc-nocygwin gcc : "-o " : -D
     : -s -O3 -mno-cygwin
     [ opt --release : -finline-functions ]
-    [ opt --debug : -s -O3 -fno-inline -pg ] ;
+    [ opt --debug : -s -O3 -fno-inline -pg ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Intel C/C++ for Linux
 toolset intel-linux icc : "-o " : -D
     :
     [ opt --release : -Xlinker -s -O3 ]
-    [ opt --debug : -g -O0 -p ] ;
+    [ opt --debug : -g -O0 -p ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Intel C/C++ for Win32
 toolset intel-win32 icl : /Fe : -D
     : /nologo
     [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ]
-    [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ] ;
+    [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ]
+    -I$(--python-include)
+    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
 ## KCC ?
 toolset kcc KCC : "-o " : -D
     :
     [ opt --release : -s +K2 ]
-    [ opt --debug : -g +K0 ] ;
+    [ opt --debug : -g +K0 ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Borland Kylix
 toolset kylix bc++ : -o : -D
     : -tC -q
     [ opt --release : -O2 -vi -w-inl ]
-    [ opt --debug : -v -Od -vi- ] ;
+    [ opt --debug : -v -Od -vi- ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Metrowerks CodeWarrior 8.x
 {
+    # Even though CW can compile all files at once, it crashes if it tries in the bjam case.
     local mwcc = ; if $(NT) { mwcc = mwcc ; } else { mwcc = mwc$(OSPLAT:L) ; }
     mwcc ?= mwcc ;
     toolset metrowerks $(mwcc) : "-o " : -D
-        : -subsystem console -cwd include -ladvapi32.lib
-        [ opt --release : -runtime ss -opt full -inline auto -inline level=8 ]
-        [ opt --debug : -runtime ssd -O0 -inline off ] ;
+        : -c -lang c -subsystem console -cwd include
+        [ opt --release : -runtime ss -opt full -inline all ]
+        [ opt --debug : -runtime ssd -opt none -inline off ]
+        -I$(--python-include) ;
+    toolset metrowerks $(mwcc) .link : "-o " :
+        : -subsystem console -lkernel32.lib -ladvapi32.lib -luser32.lib
+        [ opt --release : -runtime ss ]
+        [ opt --debug : -runtime ssd ]
+        : $(--python-lib[1]) ;
 }
 ## MINGW GCC
 toolset mingw gcc : "-o " : -D
     :
     [ opt --release : -s -O3 -finline-functions ]
-    [ opt --debug : -g -O0 -fno-inline -pg ] ;
+    [ opt --debug : -g -O0 -fno-inline -pg ]
+    -I$(--python-include)
+    : $(--python-lib[2]) ;
 ## MIPS Pro
 toolset mipspro cc : "-o " : -D
     :
     [ opt --release : -s -O3 -g0 -INLINE:none ]
-    [ opt --debug : -g -O0 -INLINE ] ;
+    [ opt --debug : -g -O0 -INLINE ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Microsoft Visual Studio C++ 6.x
 toolset msvc cl : /Fe : -D
     : /nologo
     [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ]
     [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ]
-    : kernel32.lib advapi32.lib ;
+    -I$(--python-include)
+    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
+## QNX 6.x GCC 3.x/2.95.3
+toolset qcc qcc : "-o " : -D
+    : -Wc,-pedantic
+    [ opt --release : [ opt --symbols : -g ] -O3 -Wc,-finline-functions ]
+    [ opt --debug : -g -O0 -Wc,-fno-inline ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Sun Workshop 6 C++
 toolset sunpro cc : "-o " : -D
     :
     [ opt --release : -s -fast -xO4 ]
-    [ opt --debug : -g ] ;
+    [ opt --debug : -g ]
+    -xarch=generic
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Compaq Alpha CXX
 toolset tru64cxx cc : "-o " : -D
     :
     [ opt --release : -s -O5 -inline speed ]
-    [ opt --debug : -g -O0 -pg ] ;
+    [ opt --debug : -g -O0 -pg ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## IBM VisualAge C++
 toolset vacpp xlc : "-o " : -D
     :
     [ opt --release : -s -O3 -qstrict -qinline ]
-    [ opt --debug : -g -qNOOPTimize -qnoinline -pg ] ;
+    [ opt --debug : -g -qNOOPTimize -qnoinline -pg ]
+    -I$(--python-include)
+    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
 ## Microsoft Visual C++ .NET 7.x
 toolset vc7 cl : /Fe : -D
     : /nologo
     [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ]
     [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ]
-    : kernel32.lib advapi32.lib ;
+    -I$(--python-include)
+    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
+## Microsoft Visual C++ 2005
+toolset vc8 cl : /Fe : -D
+    : /nologo
+    [ opt --release : /MT /O2 /Ob2 /Gy /GF /GA /wd4996 ]
+    [ opt --debug : /MTd /DEBUG /Z7 /Od /Ob0 /wd4996 ]
+    -I$(--python-include)
+    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
 ## VMS/OpenVMS DEC C
 toolset vmsdecc cc : /OBJECT= : "/DEFINES=(" "," ")"
     : /STANDARD=VAXC /PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES
@@ -265,14 +368,19 @@
     locate-target = [ .path $(locate-target) ] ;
 }
 
+if --show-locate-target in $(ARGV)
+{
+  ECHO $(locate-target) ;
+}
+
 # We have some different files for UNIX, VMS, and NT.
 jam.source =
-    command.c compile.c expand.c glob.c
+    command.c compile.c debug.c expand.c glob.c
     hash.c hcache.c headers.c hdrmacro.c
     jam.c jambase.c jamgram.c
     lists.c make.c make1.c newstr.c
     option.c parse.c regexp.c rules.c
-    scan.c search.c subst.c
+    scan.c search.c subst.c w32_getreg.c
     timestamp.c variable.c modules.c strings.c filesys.c 
     builtins.c pwd.c class.c native.c modules/set.c 
     modules/path.c modules/regex.c modules/property-set.c
@@ -280,7 +388,7 @@
     ;
 if $(NT)
 {
-    jam.source += execnt.c filent.c pathunix.c w32_getreg.c ;
+    jam.source += execnt.c filent.c pathunix.c ;
 }
 else if $(OS2)
 {
@@ -309,9 +417,11 @@
 --defs += OPT_HEADER_CACHE_EXT ;
 --defs += OPT_GRAPH_DEBUG_EXT ;
 --defs += OPT_SEMAPHORE ;
+--defs += OPT_AT_FILES ;
 
 # Bug fixes
 --defs += OPT_FIX_TARGET_VARIABLES_EXT ;
+#~ --defs += OPT_NO_EXTERNAL_VARIABLE_SPLIT ;
 
 # Improvements
 --defs += OPT_IMPROVED_PATIENCE_EXT ;
@@ -326,6 +436,13 @@
 }
 --defs += YYSTACKSIZE=5000 ;
 
+if $(with-python)
+{
+    --defs += HAVE_PYTHON ;
+}
+
+
+
 # The basic symbolic targets...
 NOTFILE all clean dist ;
 ALWAYS clean ;
@@ -333,15 +450,15 @@
 # Utility rules and actions...
 rule .clean
 {
-    .rm. clean : $(<) ;
+    [DELETE] clean : $(<) ;
 }
-if $(NT) { actions piecemeal together existing .rm. {
+if $(NT) { actions piecemeal together existing [DELETE] {
     del /F /Q $(>)
 } }
-if $(UNIX) { actions piecemeal together existing .rm. {
+if $(UNIX) { actions piecemeal together existing [DELETE] {
     rm -f $(>)
 } }
-if $(VMS) { actions piecemeal together existing .rm. {
+if $(VMS) { actions piecemeal together existing [DELETE] {
     DELETE $(>[--2]:J=";*, ") $(>[-1]);*
 } }
 if $(NT) {
@@ -358,15 +475,15 @@
 {
     NOUPDATE $(<) ;
     if $(<:P) { DEPENDS $(<) : $(<:P) ; .mkdir $(<:P) ; }
-    if ! $(md<$(<)>) { .mkdir. $(<) ; md<$(<)> = - ; }
+    if ! $(md<$(<)>) { [MKDIR] $(<) ; md<$(<)> = - ; }
 }
-if $(NT) { actions .mkdir. {
+if $(NT) { actions [MKDIR] {
     md $(<)
 } }
-if $(UNIX) { actions .mkdir. {
+if $(UNIX) { actions [MKDIR] {
     mkdir $(<)
 } }
-if $(VMS) { actions .mkdir. {
+if $(VMS) { actions [MKDIR] {
     CREATE/DIR $(<J=", ")
 } }
 
@@ -379,40 +496,45 @@
     .mkdir $(locate-target) ;
     if $(--link)
     {
+        local objs = ;
         for local s in $(>)
         {
-            local o = $(s:S=.o) ;
+            # Translate any subdir elements into a simple file name.
+            local o = [ MATCH "([^/]+)[/]?(.+)" : $(s) ] ;
+            o = $(o:J=_) ;
+            o = $(o:S=.o) ;
+            objs += $(o) ;
             LOCATE on $(o) = $(locate-target) ;
             DEPENDS $(exe) : $(o) ;
             DEPENDS $(o) : $(s) ;
             DEPENDS $(o) : $(locate-target) ;
-            .cc. $(o) : $(s) ;
+            [COMPILE] $(o) : $(s) ;
             .clean $(o) ;
         }
-        DEPENDS $(exe) : $(>:S=.o) ;
+        DEPENDS $(exe) : $(objs) ;
         DEPENDS $(exe) : $(locate-target) ;
-        .ld. $(exe) : $(>:S=.o) ;
+        [COMPILE.LINK] $(exe) : $(objs) ;
         .clean $(exe) ;
     }
     else
     {
         DEPENDS $(exe) : $(>) ;
         DEPENDS $(exe) : $(locate-target) ;
-        .cc. $(exe) : $(>) ;
+        [COMPILE] $(exe) : $(>) ;
         .clean $(exe) ;
     }
     return $(exe) ;
 }
-if ! $(--def[2]) { actions .cc. {
+if ! $(--def[2]) { actions [COMPILE] {
     "$(--cc)" $(--bin)$(<:D=) $(--dir)$(<:D) $(--out)$(<) $(--def)$(--defs) $(--flags) "$(--libs)" $(>)
 } }
-else { actions .cc. {
+else { actions [COMPILE] {
     "$(--cc)" $(--bin)$(<:D=) $(--dir)$(<:D) $(--out)$(<) $(--def[1])$(--defs:J=$(--def[2]))$(--def[3]) $(--flags) "$(--libs)" $(>)
 } }
-if $(VMS) { actions .ld. {
+if $(VMS) { actions [COMPILE.LINK] {
     "$(--link)" $(--link-bin)$(<:D=) $(--link-dir)$(<:D) $(--link-out)$(<) $(--link-def)$(--link-defs) $(--link-flags) "$(--link-libs)" $(>J=", ")
 } }
-else { actions .ld. {
+else { actions [COMPILE.LINK] {
     "$(--link)" $(--link-bin)$(<:D=) $(--link-dir)$(<:D) $(--link-out)$(<) $(--link-def)$(--link-defs) $(--link-flags) "$(--link-libs)" $(>)
 } }
 
@@ -420,32 +542,32 @@
 {
     DEPENDS all : $(<) ;
     DEPENDS $(<) : $(>) ;
-    .link. $(<) : $(>) ;
+    [LINK] $(<) : $(>) ;
     .clean $(<) ;
 }
-if $(NT) { actions .link. {
+if $(NT) { actions [LINK] {
     copy $(>) $(<)
 } }
-if $(UNIX) { actions .link. {
-    ln -f $(>) $(<)
+if $(UNIX) { actions [LINK] {
+    ln -fs $(>) $(<)
 } }
-if $(VMS) { actions .link. {
+if $(VMS) { actions [LINK] {
     COPY/REPLACE $(>) $(<)
 } }
 
 rule .move
 {
     DEPENDS $(<) : $(>) ;
-    .move. $(<) : $(>) ;
+    [MOVE] $(<) : $(>) ;
 }
-if $(NT) { actions .move. {
+if $(NT) { actions [MOVE] {
     del /f $(<)
     rename $(>) $(<)
 } }
-if $(UNIX) { actions .move. {
+if $(UNIX) { actions [MOVE] {
     mv -f $(>) $(<)
 } }
-if $(VMS) { actions .move. {
+if $(VMS) { actions [MOVE] {
     RENAME $(>) $(<)
 } }
 
@@ -457,9 +579,9 @@
     DEPENDS $(<) : $(exe) $(>) ;
     LEAVES $(<) ;
     yyacc.exe on $(<) = $(exe:R=$(locate-target)) ;
-    .yyacc. $(<) : $(>) ;
+    [YYACC] $(<) : $(>) ;
 }
-actions .yyacc. {
+actions [YYACC] {
     $(--chmod+w)$(<[1])
     $(--chmod+w)$(<[2])
     "$(yyacc.exe)" $(<) $(>)
@@ -468,7 +590,7 @@
 {
     .yyacc jamgram.y jamgramtab.h : jamgram.yy ;
 }
-else
+else if $(debug)
 {
     .exe yyacc : yyacc.c ;
 }
@@ -502,9 +624,9 @@
 {
     DEPENDS $(<) : $(>) ;
     LEAVES $(<) ;
-    .yacc. $(<) : $(>) ;
+    [YACC] $(<) : $(>) ;
 }
-if $(NT) { actions .yacc. {
+if $(NT) { actions [YACC] {
     "$(yacc)" $(>)
     if not errorlevel 1 (
         del /f $(<[1])
@@ -513,7 +635,7 @@
         rename y.tab$(<[2]:S) $(<[2])
     ) else set _error_ =
 } }
-if $(UNIX) { actions .yacc. {
+if $(UNIX) { actions [YACC] {
     if ` "$(yacc)" $(>) ` ; then
         mv -f y.tab$(<[1]:S) $(<[1])
         mv -f y.tab$(<[2]:S) $(<[2])
@@ -521,7 +643,7 @@
         exit 1
     fi
 } }
-if $(VMS) { actions .yacc. {
+if $(VMS) { actions [YACC] {
     IF "$(yacc)" $(>)
     THEN
         RENAME y_tab$(<[1]:S) $(<[1])
@@ -544,57 +666,75 @@
     DEPENDS $(<) : $(exe) $(>) ;
     LEAVES $(<) ;
     mkjambase.exe on $(<) = $(exe:R=$(locate-target)) ;
-    .mkjambase. $(<) : $(>) ;
+    [MKJAMBASE] $(<) : $(>) ;
 }
-actions .mkjambase. {
+actions [MKJAMBASE] {
     $(--chmod+w)$(<)
     $(mkjambase.exe) $(<) $(>)
 }
-.mkjambase jambase.c : Jambase ;
+if $(debug)
+{
+    .mkjambase jambase.c : Jambase ;
+}
 
 # How to build Jam.
 rule .jam
 {
     $(>).exe = [ .exe $(>) : $(jam.source) ] ;
-    $(<).exe = $(<:S=$($(>).exe:S)) ;
-    LOCATE on $($(<).exe) = $(locate-target) ;
-    .link $($(<).exe) : $($(>).exe) ;
+    DEPENDS all : $($(>).exe) ;
     
-    DEPENDS all : $($(>).exe) $($(<).exe) ;
+    if $(debug)
+    {
+        $(<).exe = $(<:S=$($(>).exe:S)) ;
+        LOCATE on $($(<).exe) = $(locate-target) ;
+        .link $($(<).exe) : $($(>).exe) ;
+        DEPENDS all : $($(<).exe) ;
+    }
 }
-.jam bjam : jam ;
+.jam jam : bjam ;
 
 # Scan sources for header dependencies.
+#	WARNING: Yes those are *REAL TABS* below. DO NOT CHANGE,
+#	under any circumstances, to spaces!! And the tabs
+#	indenting this are so that if someone is in the mood to
+#	replace tabs they hit this comment, and hopefully notice
+#	their error.
 rule .scan
 {
     HDRRULE on $(<:D=) = .hdr.scan ;
-    HDRSCAN on $(<:D=) = "^[     ]*#[    ]*include[  ]*[<\"]([^\">]*)[\">].*$" ;
+    HDRSCAN on $(<:D=) = "^[ 	]*#[ 	]*include[ 	]*([<\"][^\">]*[\">]).*$" ;
 }
 rule .hdr.scan
 {
     local hdrs = [ GLOB . : $(>:D=) ] ;
     INCLUDES $(<:D=) : $(hdrs:D=) ;
     HDRRULE on $(>:D=) = .hdr.scan ;
-    HDRSCAN on $(>:D=) = "^[     ]*#[    ]*include[  ]*[<\"]([^\">]*)[\">].*$" ;
+    HDRSCAN on $(>:D=) = "^[ 	]*#[ 	]*include[ 	]*([<\"][^\">]*[\">]).*$" ;
 }
 .scan [ GLOB . : *.c ] ;
 
-# Distribution making from here on out.
+# Distribution making from here on out. Assumes that
+# the docs are already built as html at ../doc/html. If
+# they aren't, then the docs are not included in the dist
+# archive.
 dist.license =
-    #~ [ GLOB . : LICENSE_$(LICENSE).txt ] [ GLOB [ .path .. .. .. ] : LICENSE_$(LICENSE).txt ] ;
-    [ GLOB . : LICENSE_$(LICENSE).txt ]
-    [ GLOB [ .path .. .. .. ] : LICENSE_$(LICENSE).txt ]
-    [ GLOB [ .path .. boost ] : LICENSE_$(LICENSE).txt ] ;
+    [ GLOB . : $(LICENSE).txt ]
+    ;
+dist.license = $(dist.license:D=)
+    [ GLOB [ .path .. .. .. ] : $(LICENSE).txt ]
+    [ GLOB [ .path .. boost ] : $(LICENSE).txt ] ;
 dist.docs =
-    $(dist.license[1])
-    index.html
-    Porting
-    Jam.html
+    [ GLOB . : *.png *.css *.html ]
     ;
+dist.docs = $(dist.docs:D=)
+    [ GLOB [ .path images ] : *.png ]
+    [ GLOB [ .path jam ] : *.html ]
+    ;
 dist.source =
     [ GLOB . : *.c *.h ]
     ;
 dist.source = $(dist.source:D=)
+    $(dist.license[1])
     $(dist.docs)
     build.jam build.bat build.sh build_vms.com
     Jambase
@@ -622,34 +762,35 @@
 
 if $(NT)
 {
+    zip ?= [ GLOB "$(ProgramFiles:J= )\\7-ZIP" "C:\\Program Files\\7-ZIP" : "7z.exe" ] ;
     zip ?= [ GLOB "$(ProgramFiles:J= )\\7-ZIP" "C:\\Program Files\\7-ZIP" : "7zn.exe" ] ;
     zip ?= [ GLOB $(PATH) : zip.exe ] ;
     zip ?= zip ;
     zip = $(zip[1]) ;
     switch $(zip:D=:S=)
     {
-        case 7zn : zip += a -r -tzip ;
+        case 7z* : zip += a -r -tzip -mx=9 ;
         case zip  : zip += -9r ;
     }
-    actions piecemeal .pack. {
+    actions piecemeal [PACK] {
     "$(zip)" "$(<)" "$(>)"
     }
-    actions piecemeal .zip. {
+    actions piecemeal [ZIP] {
     "$(zip)" "$(<)" "$(>)"
     }
-    actions piecemeal .cp. {
-    copy /Y "$(>)" "$(<)"
+    actions piecemeal [COPY] {
+    copy /Y "$(>)" "$(<)" >NUL:
     }
 }
 if $(UNIX)
 {
-    actions .pack. {
+    actions [PACK] {
     tar zcf "$(<)" "$(>)"
     }
-    actions .zip. {
+    actions [ZIP] {
     gzip -c9 "$(>)" > "$(<)"
     }
-    actions .cp. {
+    actions [COPY] {
     cp -Rpf "$(>)" "$(<)"
     }
 }
@@ -664,8 +805,8 @@
     DEPENDS $(zip) : $($(<).exe) ;
     DEPENDS dist : $(zip) ;
     #~ LOCATE on $(zip) = $(locate-target) ;
-    if $(NT) { .zip. $(zip) : $($(<).exe) ; }
-    if $(UNIX) { .pack. $(zip) : $($(<).exe) ; }
+    if $(NT) { [ZIP] $(zip) : $($(<).exe) ; }
+    if $(UNIX) { [PACK] $(zip) : $($(<).exe) ; }
     .clean $(zip) ;
 }
 
@@ -700,16 +841,18 @@
         DEPENDS $(dst-file) : $(src-path) $(dst-file:D) ;
         .mkdir $(dst-file:D) ;
         
-        .cp. $(dst-file) : $(src-path) ;
+        [COPY] $(dst-file) : $(src-path) ;
         .clean $(dst-file) ;
     }
     
-    .pack. $(pack) : $(dst-files) ;
+    [PACK] $(pack) : $(dst-files) ;
     .clean $(pack) ;
 }
 
 # RPM distro file.
-rpm-tool = [ GLOB $(PATH) : "rpmbuild" "rpm" ] ;
+rpm-tool = [ GLOB $(PATH) : "rpmbuild" ] ;
+rpm-tool ?= [ GLOB $(PATH) : "rpm" ] ;
+rpm-tool = $(rpm-tool[1]) ;
 rule .rpm ( name : source )
 {
     local rpm-arch = ;
@@ -734,12 +877,13 @@
     arch on $(target) = $(rpm-arch) ;
     if $(rpm-arch) = ppc { target-opt on $(target) = --target= ; }
     else { target-opt on $(target) = "--target " ; }
-    .rpm. $(target) : $(source) ;
+    [RPM] $(target) : $(source) ;
     .clean $(name).$(rpm-arch).rpm $(name).src.rpm ;
 }
-actions .rpm. {
+actions [RPM] {
+    set -e
     export BOOST_JAM_TOOLSET="$(toolset)"
-    $(rpm-tool[1]) -ta $(target-opt)$(arch) $(>) | tee rpm.out
+    $(rpm-tool) -ta $(target-opt)$(arch) $(>) | tee rpm.out
     cp `grep -e '^Wrote:' rpm.out | sed 's/^Wrote: //'` .
     rm -f rpm.out
 }

Modified: boost-build/branches/upstream/current/jam_src/build.sh
===================================================================
--- boost-build/branches/upstream/current/jam_src/build.sh	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/build.sh	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-#~ Copyright 2002-2003 Rene Rivera.
+#~ Copyright 2002-2005 Rene Rivera.
 #~ 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)
 
@@ -12,7 +12,7 @@
 echo_run ()
 {
     echo "$@"
-    "$@"
+    $@
     r=$?
     if test $r -ne 0 ; then
         exit $r
@@ -30,7 +30,7 @@
     echo "###"
     echo "### Toolsets supported by this script are:"
     echo "###     acc, como, darwin, gcc, intel-linux, kcc, kylix, mipspro,"
-    echo "###     sunpro, tru64cxx, vacpp"
+    echo "###     mingw(msys), qcc, sunpro, tru64cxx, vacpp"
     echo "###"
     echo "### A special toolset; cc, is available which is used as a fallback"
     echo "### when a more specific toolset is not found and the cc command is"
@@ -43,8 +43,8 @@
 # Check that a command is in the PATH.
 test_path ()
 {
-    if `whence 1>/dev/null 2>/dev/null`; then
-        whence $1 1>/dev/null 2>/dev/null
+    if `command -v command 1>/dev/null 2>/dev/null`; then
+        command -v $1 1>/dev/null 2>/dev/null
     else
         hash $1 1>/dev/null 2>/dev/null
     fi
@@ -61,11 +61,22 @@
 # Try and guess the toolset to bootstrap the build with...
 Guess_Toolset ()
 {
-    if test_uname Darwin ; then BOOST_JAM_TOOLSET=darwin
+    if test -r /mingw/bin/gcc ; then
+        BOOST_JAM_TOOLSET=mingw
+        BOOST_JAM_TOOLSET_ROOT=/mingw/
+    elif test_uname Darwin ; then BOOST_JAM_TOOLSET=darwin
     elif test_uname IRIX ; then BOOST_JAM_TOOLSET=mipspro
     elif test_uname IRIX64 ; then BOOST_JAM_TOOLSET=mipspro
+    elif test_uname OSF1 ; then BOOST_JAM_TOOLSET=tru64cxx
+    elif test_uname QNX && test_path qcc ; then BOOST_JAM_TOOLSET=qcc
     elif test_path gcc ; then BOOST_JAM_TOOLSET=gcc
     elif test_path icc ; then BOOST_JAM_TOOLSET=intel-linux
+    elif test -r /opt/intel/cc/9.0/bin/iccvars.sh ; then
+        BOOST_JAM_TOOLSET=intel-linux
+        BOOST_JAM_TOOLSET_ROOT=/opt/intel/cc/9.0
+    elif test -r /opt/intel_cc_80/bin/iccvars.sh ; then
+        BOOST_JAM_TOOLSET=intel-linux
+        BOOST_JAM_TOOLSET_ROOT=/opt/intel_cc_80
     elif test -r /opt/intel/compiler70/ia32/bin/iccvars.sh ; then
         BOOST_JAM_TOOLSET=intel-linux
         BOOST_JAM_TOOLSET_ROOT=/opt/intel/compiler70/ia32/
@@ -99,14 +110,22 @@
 # is the name of the toolset to force building
 # with.
 case "$1" in
+    --guess-toolset) Guess_Toolset ; echo "$BOOST_JAM_TOOLSET" ; exit 1 ;;
     -*) Guess_Toolset ;;
     ?*) BOOST_JAM_TOOLSET=$1 ; shift ;;
     *) Guess_Toolset ;;
 esac
-BOOST_JAM_OPT_JAM="-o bootstrap.$BOOST_JAM_TOOLSET/jam0"
-BOOST_JAM_OPT_MKJAMBASE="-o bootstrap.$BOOST_JAM_TOOLSET/mkjambase0"
-BOOST_JAM_OPT_YYACC="-o bootstrap.$BOOST_JAM_TOOLSET/yyacc0"
+BOOST_JAM_OPT_JAM="-o bootstrap/jam0"
+BOOST_JAM_OPT_MKJAMBASE="-o bootstrap/mkjambase0"
+BOOST_JAM_OPT_YYACC="-o bootstrap/yyacc0"
 case $BOOST_JAM_TOOLSET in
+    mingw)
+    if test -r ${BOOST_JAM_TOOLSET_ROOT}bin/gcc ; then
+        export PATH=${BOOST_JAM_TOOLSET_ROOT}bin:$PATH
+    fi
+    BOOST_JAM_CC="gcc -DNT"
+    ;;
+    
     gcc)
     BOOST_JAM_CC=gcc
     ;;
@@ -116,7 +135,11 @@
     ;;
     
     intel-linux)
-    if test -r /opt/intel/compiler70/ia32/bin/iccvars.sh ; then
+    if test -r /opt/intel/cc/9.0/bin/iccvars.sh ; then
+        BOOST_JAM_TOOLSET_ROOT=/opt/intel/cc/9.0/
+    elif test -r /opt/intel_cc_80/bin/iccvars.sh ; then
+        BOOST_JAM_TOOLSET_ROOT=/opt/intel_cc_80/
+    elif test -r /opt/intel/compiler70/ia32/bin/iccvars.sh ; then
         BOOST_JAM_TOOLSET_ROOT=/opt/intel/compiler70/ia32/
     elif test -r /opt/intel/compiler60/ia32/bin/iccvars.sh ; then
         BOOST_JAM_TOOLSET_ROOT=/opt/intel/compiler60/ia32/
@@ -124,6 +147,17 @@
         BOOST_JAM_TOOLSET_ROOT=/opt/intel/compiler50/ia32/
     fi
     if test -r ${BOOST_JAM_TOOLSET_ROOT}bin/iccvars.sh ; then
+        # iccvars doesn't change LD_RUN_PATH. We adjust LD_RUN_PATH
+        # here in order not to have to rely on ld.so.conf knowing the
+        # icc library directory. We do this before running iccvars.sh
+        # in order to allow a user to add modifications to LD_RUN_PATH
+        # in iccvars.sh.
+        if test -z "${LD_RUN_PATH}"; then
+            LD_RUN_PATH="${BOOST_JAM_TOOLSET_ROOT}lib"
+        else
+            LD_RUN_PATH="${BOOST_JAM_TOOLSET_ROOT}lib:${LD_RUN_PATH}"
+        fi
+        export LD_RUN_PATH
         . ${BOOST_JAM_TOOLSET_ROOT}bin/iccvars.sh
     fi
     BOOST_JAM_CC=icc
@@ -150,11 +184,12 @@
     ;;
     
     sunpro)
-    if test -r /opt/SUNWspro/bin/cc ; then
+    if test -z "${BOOST_JAM_TOOLSET_ROOT}" -a -r /opt/SUNWspro/bin/cc ; then
         BOOST_JAM_TOOLSET_ROOT=/opt/SUNWspro/
     fi
-    if test -r $BOOST_JAM_TOOLSET_ROOTbin/cc ; then
-        export PATH=$BOOST_JAM_TOOLSET_ROOTbin:$PATH
+    if test -r "${BOOST_JAM_TOOLSET_ROOT}bin/cc" ; then
+        PATH=${BOOST_JAM_TOOLSET_ROOT}bin:${PATH}
+        export PATH
     fi
     BOOST_JAM_CC=cc
     ;;
@@ -175,6 +210,10 @@
     BOOST_JAM_OPT_YYACC="$BOOST_JAM_OPT_YYACC $CFLAGS $LIBS"
     ;;
    
+    qcc)
+    BOOST_JAM_CC=qcc
+    ;;
+    
     *)
     error_exit "Unknown toolset: $BOOST_JAM_TOOLSET"
     ;;
@@ -187,39 +226,51 @@
 YYACC_SOURCES="yyacc.c"
 MKJAMBASE_SOURCES="mkjambase.c"
 BJAM_SOURCES="\
- command.c compile.c execnt.c execunix.c execvms.c expand.c\
- filent.c fileos2.c fileunix.c filevms.c glob.c hash.c\
+ command.c compile.c debug.c execunix.c expand.c fileunix.c glob.c hash.c\
  hdrmacro.c headers.c jam.c jambase.c jamgram.c lists.c make.c make1.c\
  newstr.c option.c parse.c pathunix.c pathvms.c regexp.c\
  rules.c scan.c search.c subst.c timestamp.c variable.c modules.c\
- strings.c filesys.c builtins.c pwd.c class.c native.c modules/set.c\
- modules/path.c modules/regex.c modules/property-set.c\
- modules/sequence.c modules/order.c"
+ strings.c filesys.c builtins.c pwd.c class.c native.c w32_getreg.c\
+ modules/set.c modules/path.c modules/regex.c modules/property-set.c\
+ modules/sequence.c modules/order.c\
+ execnt.c filent.c"
 
-echo_run rm -rf bootstrap.$BOOST_JAM_TOOLSET
-echo_run mkdir bootstrap.$BOOST_JAM_TOOLSET
-if test ! -r jamgram.y -o ! -r jamgramtab.h ; then
-    echo_run ${BOOST_JAM_CC} ${BOOST_JAM_OPT_YYACC} ${YYACC_SOURCES}
-    if test -x "./bootstrap.$BOOST_JAM_TOOLSET/yyacc0" ; then
-        echo_run ./bootstrap.$BOOST_JAM_TOOLSET/yyacc0 jamgram.y jamgramtab.h jamgram.yy
-    fi
+BJAM_UPDATE=
+if test "$1" = "--update" -o "$2" = "--update" -o "$3" = "--update" -o "$4" = "--update"  ; then
+    BJAM_UPDATE="update"
 fi
-if test ! -r jamgram.c -o ! -r jamgram.h ; then
-    if test_path yacc ; then YACC="yacc -d"
-    elif test_path bison ; then YACC="bison -y -d --yacc"
+if test "${BJAM_UPDATE}" = "update" -a ! -x "./bootstrap/jam0" ; then
+    BJAM_UPDATE=
+fi
+
+if test "${BJAM_UPDATE}" != "update" ; then
+    echo_run rm -rf bootstrap
+    echo_run mkdir bootstrap
+    if test ! -r jamgram.y -o ! -r jamgramtab.h ; then
+        echo_run ${BOOST_JAM_CC} ${BOOST_JAM_OPT_YYACC} ${YYACC_SOURCES}
+        if test -x "./bootstrap/yyacc0" ; then
+            echo_run ./bootstrap/yyacc0 jamgram.y jamgramtab.h jamgram.yy
+        fi
     fi
-    echo_run $YACC jamgram.y
-    mv -f y.tab.c jamgram.c
-    mv -f y.tab.h jamgram.h
+    if test ! -r jamgram.c -o ! -r jamgram.h ; then
+        if test_path yacc ; then YACC="yacc -d"
+        elif test_path bison ; then YACC="bison -y -d --yacc"
+        fi
+        echo_run $YACC jamgram.y
+        mv -f y.tab.c jamgram.c
+        mv -f y.tab.h jamgram.h
+    fi
+    if test ! -r jambase.c ; then
+        echo_run ${BOOST_JAM_CC} ${BOOST_JAM_OPT_MKJAMBASE} ${MKJAMBASE_SOURCES}
+        if test -x "./bootstrap/mkjambase0" ; then
+            echo_run ./bootstrap/mkjambase0 jambase.c Jambase
+        fi
+    fi
+    echo_run ${BOOST_JAM_CC} ${BOOST_JAM_OPT_JAM} ${BJAM_SOURCES}
 fi
-if test ! -r jambase.c ; then
-    echo_run ${BOOST_JAM_CC} ${BOOST_JAM_OPT_MKJAMBASE} ${MKJAMBASE_SOURCES}
-    if test -x "./bootstrap.$BOOST_JAM_TOOLSET/mkjambase0" ; then
-        echo_run ./bootstrap.$BOOST_JAM_TOOLSET/mkjambase0 jambase.c Jambase
+if test -x "./bootstrap/jam0" ; then
+    if test "${BJAM_UPDATE}" != "update" ; then
+        echo_run ./bootstrap/jam0 -f build.jam --toolset=$BOOST_JAM_TOOLSET "--toolset-root=$BOOST_JAM_TOOLSET_ROOT" clean
     fi
+    echo_run ./bootstrap/jam0 -f build.jam --toolset=$BOOST_JAM_TOOLSET "--toolset-root=$BOOST_JAM_TOOLSET_ROOT" "$@"
 fi
-echo_run ${BOOST_JAM_CC} ${BOOST_JAM_OPT_JAM} ${BJAM_SOURCES}
-if test -x "./bootstrap.$BOOST_JAM_TOOLSET/jam0" ; then
-    echo_run ./bootstrap.$BOOST_JAM_TOOLSET/jam0 -f build.jam --toolset=$BOOST_JAM_TOOLSET "--toolset-root=$BOOST_JAM_TOOLSET_ROOT" clean
-    echo_run ./bootstrap.$BOOST_JAM_TOOLSET/jam0 -f build.jam --toolset=$BOOST_JAM_TOOLSET "--toolset-root=$BOOST_JAM_TOOLSET_ROOT" "$@"
-fi


Property changes on: boost-build/branches/upstream/current/jam_src/build.sh
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/jam_src/builtins.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/builtins.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/builtins.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -5,6 +5,7 @@
  */
 
 # include "jam.h"
+# include "debug.h"
 
 # include "lists.h"
 # include "parse.h"
@@ -22,6 +23,7 @@
 # include "hdrmacro.h"
 # include "compile.h"
 # include "native.h"
+# include "variable.h"
 # include <ctype.h>
 
 /*
@@ -50,7 +52,7 @@
 # define P0 (PARSE *)0
 # define C0 (char *)0
 
-# ifdef OS_NT
+# if defined( OS_NT ) || defined( OS_CYGWIN )
 LIST* builtin_system_registry( PARSE *parse, FRAME *frame );
 # endif
 
@@ -96,12 +98,16 @@
       bind_builtin( "ECHO" ,
                     builtin_echo, 0, 0 ) ) );
 
-    duplicate_rule( "exit" ,
-    duplicate_rule( "Exit" ,
-      bind_builtin( "EXIT" ,
-                    builtin_exit, 0, 0 ) ) );
 
     {
+        char * args[] = { "message", "*", ":", "result-value", "?", 0 };
+        duplicate_rule( "exit" ,
+        duplicate_rule( "Exit" ,
+          bind_builtin( "EXIT" ,
+                        builtin_exit, 0, args ) ) );
+    }
+
+    {
         char * args[] = { "directories", "*", ":", "patterns", "*", ":", "case-insensitive", "?", 0 };
         duplicate_rule(
             "Glob" ,
@@ -109,10 +115,22 @@
             );
     }
 
+    {
+        char * args[] = { "patterns", "*", 0 };
+        bind_builtin( "GLOB-RECURSIVELY" , builtin_glob_recursive, 0, args );
+    }
+
+
     duplicate_rule( "Includes" ,
       bind_builtin( "INCLUDES" ,
                     builtin_depends, 1, 0 ) );
 
+    {
+        char * args[] = { "targets", "*", ":", "targets-to-rebuild", "*", 0 };
+        bind_builtin( "REBUILDS" ,
+                      builtin_rebuilds, 0, args );
+    }
+    
     duplicate_rule( "Leaves" ,
       bind_builtin( "LEAVES" ,
                     builtin_flags, T_FLAG_LEAVES, 0 ) );
@@ -138,6 +156,13 @@
       bind_builtin( "TEMPORARY" ,
                     builtin_flags, T_FLAG_TEMP, 0 ) );
 
+    {
+        char * args[] = { "targets", "*", 0 };
+        bind_builtin(
+            "ISFILE",
+            builtin_flags, T_FLAG_ISFILE, 0 );
+    }
+
     duplicate_rule( "HdrMacro" ,
       bind_builtin( "HDRMACRO" ,
                     builtin_hdrmacro, 0, 0 ) );
@@ -246,7 +271,7 @@
       }
 
       {
-          char * args[] = { "path", 0 };
+          char * args[] = { "path_parts", "*", 0 };
           bind_builtin( "NORMALIZE_PATH",
               builtin_normalize_path, 0, args );
       }
@@ -263,14 +288,56 @@
               builtin_native_rule, 0, args );
       }
 
-# ifdef OS_NT
       {
+          char * args[] = { "module", ":", "rule", ":", "version", 0 };
+          bind_builtin( "HAS_NATIVE_RULE",
+              builtin_has_native_rule, 0, args );
+      }
+
+
+      {
+          char * args[] = { "module", "*", 0 };
+          bind_builtin( "USER_MODULE",
+              builtin_user_module, 0, args );
+      }
+
+      {
+          char * args[] = { 0 };
+          bind_builtin( "NEAREST_USER_LOCATION",
+              builtin_nearest_user_location, 0, args );
+      }
+
+      {
+          char * args[] = { "file", 0 };
+          bind_builtin( "CHECK_IF_FILE",
+                        builtin_check_if_file, 0, args );
+      }
+
+#ifdef HAVE_PYTHON
+      {
+          char * args[] = { "python-module", ":", "function", ":", 
+                            "jam-module", ":", "rule-name", 0 };
+          bind_builtin( "PYTHON_IMPORT_RULE",
+              builtin_python_import_rule, 0, args );
+      }
+#endif
+
+# if defined( OS_NT ) || defined( OS_CYGWIN )
+      {
           char * args[] = { "key_path", ":", "data", "?", 0 };
           bind_builtin( "W32_GETREG",
               builtin_system_registry, 0, args );
       }
 # endif
 
+      {
+          char * args[] = { "command", ":", "*", 0 };
+          bind_builtin( "SHELL",
+              builtin_shell, 0, args );
+          bind_builtin( "COMMAND",
+              builtin_shell, 0, args );
+      }
+
       /* Initialize builtin modules */
       init_set();
       init_path();
@@ -349,7 +416,6 @@
 {
 	LIST *targets = lol_get( frame->args, 0 );
 	LIST *sources = lol_get( frame->args, 1 );
-	int which = parse->num;
 	LIST *l;
 
 	for( l = targets; l; l = list_next( l ) )
@@ -372,10 +438,43 @@
 	    t->depends = targetlist( t->depends, sources );
 	}
 
+    /* Enter reverse links */
+	for( l = sources; l; l = list_next( l ) )
+	{
+	    TARGET *s = bindtarget( l->string );
+        s->dependents = targetlist( s->dependents, targets );
+    }
+
 	return L0;
 }
 
 /*
+ * builtin_rebuilds() - REBUILDS rule
+ *
+ * The REBUILDS builtin rule appends each of the listed
+ * rebuild-targets in its 2nd argument on the rebuilds list of each of
+ * the listed targets in its first argument.
+ */
+
+LIST *
+builtin_rebuilds(
+	PARSE	*parse,
+	FRAME *frame )
+{
+	LIST *targets = lol_get( frame->args, 0 );
+	LIST *rebuilds = lol_get( frame->args, 1 );
+	LIST *l;
+
+	for( l = targets; l; l = list_next( l ) )
+	{
+	    TARGET *t = bindtarget( l->string );
+	    t->rebuilds = targetlist( t->rebuilds, rebuilds );
+	}
+
+	return L0;
+}
+
+/*
  * builtin_echo() - ECHO rule
  *
  * The ECHO builtin rule echoes the targets to the user.  No other 
@@ -401,13 +500,20 @@
 
 LIST *
 builtin_exit(
-	PARSE	*parse,
-	FRAME *frame )
+    PARSE   *parse,
+    FRAME   *frame )
 {
-	list_print( lol_get( frame->args, 0 ) );
-	printf( "\n" );
-	exit( EXITBAD ); /* yeech */
-	return L0;
+    list_print( lol_get( frame->args, 0 ) );
+    printf( "\n" );
+    if ( lol_get( frame->args, 1 ) )
+    {
+        exit ( atoi( lol_get( frame->args, 1 )->string ) );
+    }
+    else
+    {
+        exit( EXITBAD ); /* yeech */
+    }
+    return L0;
 }
 
 /*
@@ -455,21 +561,37 @@
     int status,
     time_t  time )
 {
+    PROFILE_ENTER(BUILTIN_GLOB_BACK);
+    
     struct globbing *globbing = (struct globbing *)closure;
     LIST        *l;
     PATHNAME    f;
     string          buf[1];
-
+    
     /* Null out directory for matching. */
     /* We wish we had file_dirscan() pass up a PATHNAME. */
 
     path_parse( file, &f );
     f.f_dir.len = 0;
+
+    /* For globbing, we unconditionally ignore current and parent
+       directory items. Since they items always exist, there's not
+       reason why caller of GLOB would want to see them.
+       We could also change file_dirscan, but then paths with embedded
+       "." and ".." won't work anywhere.
+    */
+    if (strcmp(f.f_base.ptr, ".") == 0 || strcmp(f.f_base.ptr, "..") == 0)
+    {
+        PROFILE_EXIT(BUILTIN_GLOB_BACK);
+        return;
+    }
+
     string_new( buf );
     path_build( &f, buf, 0 );
 
-    if (globbing->case_insensitive)
+    if (globbing->case_insensitive) {
         downcase_inplace( buf->value );
+    }
 
     for( l = globbing->patterns; l; l = l->next )
     {
@@ -481,6 +603,8 @@
     }
     
     string_free( buf );
+    
+    PROFILE_EXIT(BUILTIN_GLOB_BACK);
 }
 
 static LIST* downcase_list( LIST *in )
@@ -537,6 +661,160 @@
     return globbing.results;
 }
 
+static int has_wildcards(const char* str)
+{
+    size_t index = strcspn(str, "[]*?");
+    if (str[index] == '\0')
+        return 0;
+    else
+        return 1;
+}
+
+/** If 'file' exists, append 'file' to 'list'.
+    Returns 'list'.
+*/
+static LIST* append_if_exists(LIST* list, char* file)
+{
+    time_t time;
+    timestamp(file, &time);
+    if (time > 0)
+        return list_new(list, newstr(file));
+    else
+        return list;        
+}
+
+LIST* glob1(char* dirname, char* pattern)
+{
+    LIST* plist = list_new(L0, pattern);
+    struct globbing globbing;
+
+    globbing.results = L0;
+    globbing.patterns = plist;
+    
+    globbing.case_insensitive
+# if defined( OS_NT ) || defined( OS_CYGWIN )
+       = plist;  /* always case-insensitive if any files can be found */
+# else 
+       = L0;
+# endif
+
+    if ( globbing.case_insensitive )
+    {
+        globbing.patterns = downcase_list( plist );
+    }
+    
+    file_dirscan( dirname, builtin_glob_back, &globbing );
+
+    if ( globbing.case_insensitive )
+    {
+        list_free( globbing.patterns );
+    }
+
+    list_free(plist);
+
+    return globbing.results;
+}
+
+
+LIST* glob_recursive(char* pattern)
+{
+    LIST* result = L0;
+
+    /* Check if there's metacharacters in pattern */
+    if (!has_wildcards(pattern))
+    {
+        /* No metacharacters. Check if the path exists. */
+        result = append_if_exists(result, pattern);
+    }        
+    else
+    {
+        /* Have metacharacters in the pattern. Split into dir/name */
+        PATHNAME path[1];
+        path_parse(pattern, path);            
+        
+        if (path->f_dir.ptr)
+        {
+            LIST* dirs = L0;
+            string dirname[1];
+            string basename[1];
+            string_new(dirname);
+            string_new(basename);
+
+            string_append_range(dirname, path->f_dir.ptr, 
+                                path->f_dir.ptr + path->f_dir.len);
+
+            path->f_grist.ptr = 0;
+            path->f_grist.len = 0;
+            path->f_dir.ptr = 0;
+            path->f_dir.len = 0;
+            path_build(path, basename, 0);
+
+            if (has_wildcards(dirname->value))
+            {
+                dirs = glob_recursive(dirname->value);
+            }
+            else
+            {
+                dirs = list_new(dirs, dirname->value);
+            }
+            
+            if (has_wildcards(basename->value))
+            {
+                for(; dirs; dirs = dirs->next)
+                {
+                    result = list_append(result, 
+                                         glob1(dirs->string, basename->value));
+                }
+            }
+            else
+            {
+                string file_string[1];
+                string_new(file_string);
+
+                /** No wildcard in basename. */
+                for(; dirs; dirs = dirs->next)
+                {                                      
+                    path->f_dir.ptr = dirs->string;
+                    path->f_dir.len = strlen(dirs->string);                    
+                    path_build(path, file_string, 0);
+
+                    result = append_if_exists(result, file_string->value);
+
+                    string_truncate(file_string, 0);
+                }
+
+                string_free(file_string);
+            }
+
+            string_free(dirname);
+            string_free(basename);
+        }
+        else
+        {
+            /** No directory, just a pattern. */
+            result = list_append(result, glob1(".", pattern));
+        }
+    }
+
+    return result;
+}
+
+LIST *
+builtin_glob_recursive(
+    PARSE   *parse,
+    FRAME *frame )
+{
+    LIST* result = L0;
+    LIST* l = lol_get( frame->args, 0 );
+
+    for(; l; l = l->next)
+    {
+        result = list_append(result, glob_recursive(l->string));
+    }
+
+    return result;
+}
+
 /*
  * builtin_match() - MATCH rule, regexp matching
  */
@@ -1006,7 +1284,7 @@
 
 LIST *builtin_normalize_path( PARSE *parse, FRAME *frame )
 {
-    LIST* arg1 = lol_get( frame->args, 0 );
+    LIST* arg = lol_get( frame->args, 0 );
 
     /* First, we iterate over all '/'-separated elements, starting from
        the end of string. If we see '..', we remove previous path elements.
@@ -1019,14 +1297,20 @@
     char* end;      /* Last character of the part of string still to be processed. */
     char* current;  /* Working pointer. */  
     int dotdots = 0; /* Number of '..' elements seen and not processed yet. */
-    int rooted = arg1->string[0] == '/';
+    int rooted = arg->string[0] == '/';
     char* result;
 
     /* Make a copy of input: we should not change it. */
     string_new(in);
     if (!rooted)
         string_push_back(in, '/');
-    string_append(in, arg1->string);
+    while (arg)
+    {
+        string_append(in, arg->string);
+        arg = list_next(arg);
+        if (arg)
+            string_append(in, "/");
+    }
     
 
     end = in->value + in->size - 1;
@@ -1118,7 +1402,157 @@
     return L0;    
 }
 
+LIST *builtin_has_native_rule( PARSE *parse, FRAME *frame )
+{
+    LIST* module_name = lol_get( frame->args, 0 );    
+    LIST* rule_name = lol_get( frame->args, 1 );    
+    LIST* version = lol_get( frame->args, 2 );    
 
+    module_t* module = bindmodule(module_name->string);
+
+    native_rule_t n, *np = &n;
+    n.name = rule_name->string;
+    if (module->native_rules && hashcheck(module->native_rules, (HASHDATA**)&np))
+    {
+        int expected_version = atoi(version->string);
+        if (np->version == expected_version)
+            return list_new(0, newstr("true"));
+    }
+    return L0;    
+}
+
+
+LIST *builtin_user_module( PARSE *parse, FRAME *frame )
+{
+    LIST* module_name = lol_get( frame->args, 0 );    
+    for(; module_name; module_name = module_name->next) 
+    {
+        module_t* m = bindmodule( module_name->string);
+        m->user_module = 1;
+    }
+    return L0;
+}
+
+LIST *builtin_nearest_user_location( PARSE *parse, FRAME *frame )
+{
+    LIST* result = 0;
+    FRAME* nearest_user_frame = 
+        frame->module->user_module ? frame : frame->prev_user;
+
+    if (nearest_user_frame)
+    {
+        char* file;
+        int line;
+        char buf[32];
+        get_source_line( nearest_user_frame->procedure, &file, &line );
+        sprintf( buf, "%d", line );
+        result = list_new( result, newstr( file ) );
+        result = list_new( result, newstr( buf ) );
+        return result;
+    }
+    else
+    {
+        return L0;
+    }
+}
+
+LIST *builtin_check_if_file( PARSE *parse, FRAME *frame )
+{
+    LIST* name = lol_get( frame->args, 0 );
+    if (file_is_file(name->string) == 1) {
+        return list_new(0, newstr("true"));
+    } else {
+        return L0;
+    }
+}
+
+
+#ifdef HAVE_PYTHON
+
+LIST *builtin_python_import_rule( PARSE *parse, FRAME *frame )
+{
+    static int first_time = 1;
+   char* python_module = lol_get( frame->args, 0 )->string;        
+   char* python_function = lol_get( frame->args, 1 )->string;        
+   char* jam_module = lol_get( frame->args, 2 )->string;        
+   char* jam_rule = lol_get( frame->args, 3 )->string;        
+
+   PyObject *pName, *pModule, *pDict, *pFunc;
+
+   if (first_time)
+   {
+       /* At the first invocation, we add the value of the
+          global EXTRA_PYTHONPATH to the sys.path Python
+          variable.
+       */
+       LIST* extra = 0;
+       module_t* outer_module = frame->module;
+
+       first_time = 0;
+
+       if ( outer_module != root_module())
+       {
+           exit_module( outer_module );
+           enter_module( root_module());
+       }
+    
+       extra = var_get("EXTRA_PYTHONPATH");
+    
+       if ( outer_module != root_module())
+       {
+            exit_module( root_module());
+            enter_module( outer_module );
+       }
+
+       for(; extra; extra = extra->next)
+       {
+           string buf[1];
+           string_new(buf);
+           string_append(buf, "import sys\nsys.path.append(\"");
+           string_append(buf, extra->string);
+           string_append(buf, "\")\n");
+           PyRun_SimpleString(buf->value);   
+           string_free(buf);               
+       }       
+   }
+
+
+   pName = PyString_FromString(python_module);
+   
+   pModule = PyImport_Import(pName);
+   Py_DECREF(pName);
+
+   if (pModule != NULL) {
+        pDict = PyModule_GetDict(pModule);
+        pFunc = PyDict_GetItemString(pDict, python_function);
+
+        if (pFunc && PyCallable_Check(pFunc)) {
+
+            module_t* m = bindmodule(jam_module);
+            RULE* r = bindrule( jam_rule, m );
+
+            /* Make pFunc owned */
+            Py_INCREF(pFunc);
+
+            r->python_function = pFunc;
+        }
+        else {
+            if (PyErr_Occurred())
+                PyErr_Print();
+            fprintf(stderr, "Cannot find function \"%s\"\n", python_function);
+        }
+        Py_DECREF(pModule);
+    }
+    else {
+        PyErr_Print();
+        fprintf(stderr, "Failed to load \"%s\"\n", python_module);
+    }
+   return L0;
+
+}
+
+#endif
+
 void lol_build( LOL* lol, char** elements )
 {
     LIST* l = L0;
@@ -1142,3 +1576,178 @@
         lol_add( lol, l );
 }
 
+#ifdef HAVE_PYTHON
+
+/** Calls the bjam rule specified by name passed in 'args'.
+    The name is looked up in context of bjam's 'python_interface'
+    module. Returns the list of string retured by the rule.
+*/
+PyObject*
+bjam_call(PyObject* self, PyObject* args)
+{
+    FRAME       inner[1];
+    LIST    *result;
+    PARSE   *p;
+    char*  rulename;
+    
+    /* Build up the list of arg lists */
+
+    frame_init( inner );
+    inner->prev = 0;
+    inner->prev_user = 0;
+    inner->module = bindmodule("python_interface");
+    inner->procedure = 0;
+
+    /* Extract the rule name and arguments from 'args' */
+
+    /* PyTuple_GetItem returns borrowed reference */
+    rulename = PyString_AsString(PyTuple_GetItem(args, 0));
+    {
+        int i = 1;
+        int size = PyTuple_Size(args);
+        for( ; i < size; ++i) {
+            PyObject* a = PyTuple_GetItem(args, i);
+            if (PyString_Check(a))
+            {
+                lol_add(inner->args, 
+                        list_new(0, newstr(PyString_AsString(a))));
+            }
+            else if (PySequence_Check(a))
+            {
+                LIST* l = 0;
+                int s = PySequence_Size(a);
+                int i = 0;
+                for(; i < s; ++i)
+                {
+                    /* PySequence_GetItem returns new reference. */
+                    PyObject* e = PySequence_GetItem(a, i);
+                    char* s = PyString_AsString(e);
+                    if (!s)
+                    {
+                        printf("Invalid parameter type passed from Python\n");
+                        exit(1);
+                    }
+                    l = list_new(l, newstr(s));
+                    Py_DECREF(e);
+                }
+                lol_add(inner->args, l);
+            }                
+        }
+    }
+
+    result = evaluate_rule( rulename, inner );
+
+    frame_free( inner );
+
+    return Py_None;
+}
+
+/** Accepts three arguments: module name, rule name and Python callable.
+
+    Creates bjam rule with the specified name in the specified module,
+    which will invoke the Python callable.
+*/
+PyObject*
+bjam_import_rule(PyObject* self, PyObject* args)
+{
+    char* module;
+    char* rule;
+    PyObject* func;
+    module_t* m;
+    RULE* r;
+
+    if (!PyArg_ParseTuple(args, "ssO:import_rule", &module, &rule, &func))
+        return NULL;
+    
+    if (!PyCallable_Check(func))
+        return NULL;
+    
+    m = bindmodule(module);
+    r = bindrule(rule, m);
+
+    /* Make pFunc owned */
+    Py_INCREF(func);
+
+    r->python_function = func;
+    return Py_None;
+}
+
+#endif
+
+#ifdef HAVE_POPEN
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+    #define popen _popen
+    #define pclose _pclose
+#endif
+
+LIST *builtin_shell( PARSE *parse, FRAME *frame )
+{
+    LIST* command = lol_get( frame->args, 0 );
+    LIST* result = 0;
+    string s;
+    int ret;
+    char buffer[1024];
+    FILE *p = NULL;
+    int exit_status = -1;
+    int exit_status_opt = 0;
+    int no_output_opt = 0;
+    
+    /* Process the variable args options. */
+    {
+        int a = 1;
+        LIST * arg = lol_get( frame->args, a );
+        while ( arg )
+        {
+            if ( strcmp("exit-status", arg->string) == 0 )
+            {
+                exit_status_opt = 1;
+            }
+            else if ( strcmp("no-output", arg->string) == 0 )
+            {
+                no_output_opt = 1;
+            }
+            arg = lol_get( frame->args, ++a );
+        }
+    }
+
+    string_new( &s );
+
+    fflush(NULL);
+
+    p = popen(command->string, "r");
+    if ( p == NULL )
+        return L0;
+
+    while ( (ret = fread(buffer, sizeof(char), sizeof(buffer)-1, p)) > 0 )
+    {
+        buffer[ret] = 0;
+        if ( ! no_output_opt )
+        {
+            string_append( &s, buffer );
+        }
+    }
+
+    exit_status = pclose(p);
+
+    /* The command output is returned first. */
+    result = list_new( L0, newstr(s.value) );
+    string_free(&s);
+    
+    /* The command exit result next. */
+    if ( exit_status_opt )
+    {
+        sprintf (buffer, "%d", exit_status);
+        result = list_new( result, newstr( buffer ) );
+    }
+    
+    return result;
+}
+
+#else
+
+LIST *builtin_shell( PARSE *parse, FRAME *frame )
+{
+    return L0;
+}
+
+#endif

Modified: boost-build/branches/upstream/current/jam_src/builtins.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/builtins.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/builtins.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -17,10 +17,12 @@
 
 LIST *builtin_calc( PARSE *parse, FRAME *args );
 LIST *builtin_depends( PARSE *parse, FRAME *args );
+LIST *builtin_rebuilds( PARSE *parse, FRAME *args );
 LIST *builtin_echo( PARSE *parse, FRAME *args );
 LIST *builtin_exit( PARSE *parse, FRAME *args );
 LIST *builtin_flags( PARSE *parse, FRAME *args );
 LIST *builtin_glob( PARSE *parse, FRAME *args );
+LIST *builtin_glob_recursive( PARSE   *parse, FRAME *frame );
 LIST *builtin_subst( PARSE  *parse, FRAME *args );
 LIST *builtin_match( PARSE *parse, FRAME *args );
 LIST *builtin_hdrmacro( PARSE *parse, FRAME *args );
@@ -40,6 +42,12 @@
 LIST *builtin_sort( PARSE *parse, FRAME *frame );
 LIST *builtin_normalize_path( PARSE *parse, FRAME *frame );
 LIST *builtin_native_rule( PARSE *parse, FRAME *frame );
+LIST *builtin_has_native_rule( PARSE *parse, FRAME *frame );
+LIST *builtin_user_module( PARSE *parse, FRAME *frame );
+LIST *builtin_nearest_user_location( PARSE *parse, FRAME *frame );
+LIST *builtin_check_if_file( PARSE *parse, FRAME *frame );
+LIST *builtin_python_import_rule( PARSE *parse, FRAME *frame );
+LIST *builtin_shell( PARSE *parse, FRAME *frame );
 
 void backtrace( FRAME *frame );
 

Modified: boost-build/branches/upstream/current/jam_src/bump_version.py
===================================================================
--- boost-build/branches/upstream/current/jam_src/bump_version.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/bump_version.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,49 +7,74 @@
 # and updates all necessary files. For the time being, it's assumes presense
 # of 'perl' executable and Debian-specific 'dch' executable.
 #
- 
 
+
+import os
+import os.path
+import re
+import string
 import sys
-import string
-import os
 
-def spec(version):
-    os.system("perl -pi -e 's|^Version:.*|Version: %s|' boost-jam.spec" %
-              string.join(version, "."))
+srcdir = os.path.abspath(os.path.dirname(__file__ ))
+docdir = os.path.abspath(os.path.join(srcdir,"..","doc"))
 
-def build_jam(version):
-    os.system("perl -pi -e 's|^VERSION = .* ;|VERSION = %s\$(.)%s\$(.)%s ;|' build.jam"
-              % (version[0], version[1], version[2]))
+def edit(file,replacements):
+    print "  '%s'..." %(file)
+    text = open(file,'r').read()
+    while len(replacements) > 0:
+        #~ print  "  '%s' ==> '%s'" % (replacements[0],replacements[1])
+        text = re.compile(replacements[0],re.M).subn(replacements[1],text)[0]
+        replacements = replacements[2:]
+    #~ print text
+    open(file,'w').write(text)
 
-def index_html(version):
-    os.system("perl -pi -e 's|This is version .* of BJam|This is version %s of BJam|' index.html"
-              % string.join(version, "."))
+def make_edits(version):
+    edit(os.path.join(srcdir,"boost-jam.spec"), [
+        '^Version:.*$','Version: %s' % string.join(version, "."),
+        ])
 
-def jam_c(version):
-    re = "\\*major_version = .*, \\*minor_version = .*, \\*changenum = .*";
-    new = ('*major_version = "%02d", *minor_version = "%02d", *changenum = "%02d";' %
-        (int(version[0]), int(version[1]), int(version[2])))
-    os.system("perl -pi -e 's|%s|%s|' jam.c" % (re, new))
+    edit(os.path.join(srcdir,"build.jam"), [
+        '^_VERSION_ = .* ;$','_VERSION_ = %s %s %s ;' % (version[0], version[1], version[2]),
+        ])
 
-def patchlevel(version):
-    os.system("perl -pi -e 's|VERSION .*|VERSION \"%s\"|' patchlevel.h" %
-              string.join(version, "."))
+    edit(os.path.join(docdir,"bjam.qbk"), [
+        '\[version.*\]','[version: %s]' % string.join(version, '.'),
+        '\[def :version:.*\]','[def :version: %s]' % string.join(version, '.'),
+        ])
 
-def dch(version):
-    os.system("dch --ignore-dirname -v " + string.join(version, ".") + "-1")
-       
-bumpers = [spec, build_jam, index_html, jam_c, patchlevel, dch]
+    edit(os.path.join(srcdir,"patchlevel.h"), [
+        '^#define VERSION_MAJOR .*$',
+            '#define VERSION_MAJOR %s' % (version[0]),
+        '^#define VERSION_MINOR .*$',
+            '#define VERSION_MINOR %s' % (version[1]),
+        '^#define VERSION_PATCH .*$',
+            '#define VERSION_PATCH %s' % (version[2]),
+        '^#define VERSION_MAJOR_SYM .*$',
+            '#define VERSION_MAJOR_SYM "0%s"' % (version[0]),
+        '^#define VERSION_MINOR_SYM .*$',
+            '#define VERSION_MINOR_SYM "%s"' % (version[1]),
+        '^#define VERSION_PATCH_SYM .*$',
+            '#define VERSION_PATCH_SYM "%s"' % (version[2]),
+        '^#define VERSION .*$',
+            '#define VERSION "%s"' % string.join(version, '.'),
+        '^#define JAMVERSYM .*$',
+            '#define JAMVERSYM "JAMVERSION=%s.%s"' % (version[0],version[1]),
+        ])
 
 def main():
 
     if len(sys.argv) < 2:
         print "Expect new version as argument"
         sys.exit(1)
-                
-    new_version = string.split(sys.argv[1], ".")
-    print "Setting version to", new_version
-    for b in bumpers:
-        b(new_version)
 
+    version = string.split(sys.argv[1], ".")
+    print "Setting version to", version
+    make_edits(version)
+
 if __name__ == '__main__':
     main()
+
+#~ Copyright 2006 Rene Rivera.
+#~ Copyright 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)


Property changes on: boost-build/branches/upstream/current/jam_src/bump_version.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/jam_src/command.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/command.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/command.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -20,6 +20,7 @@
 # include "parse.h"
 # include "variable.h"
 # include "rules.h"
+# include "debug.h"
 
 # include "command.h"
 # include <limits.h>
@@ -42,6 +43,9 @@
     int max_line = MAXLINE;
     int allocated = -1;
 
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof( CMD ) );
+
     cmd->rule = rule;
     cmd->shell = shell;
     cmd->next = 0;
@@ -56,6 +60,9 @@
         free(cmd->buf); /* free any buffer from previous iteration */
         
         cmd->buf = (char*)malloc(max_line + 1);
+
+        if ( DEBUG_PROFILE )
+            profile_memory( max_line + 1 );
         
         if (cmd->buf == 0)
             break;

Modified: boost-build/branches/upstream/current/jam_src/compile.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/compile.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/compile.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -11,6 +11,7 @@
  */
 
 # include "jam.h"
+# include "debug.h"
 
 # include "lists.h"
 # include "parse.h"
@@ -28,7 +29,6 @@
 # include "builtins.h"
 # include "class.h"
 
-# include <time.h>
 # include <assert.h>
 # include <string.h>
 # include <stdarg.h>
@@ -98,6 +98,7 @@
 void frame_init( FRAME* frame )
 {
     frame->prev = 0;
+    frame->prev_user = 0;
     lol_init(frame->args);
     frame->module = root_module();
     frame->rulename = "module scope";
@@ -584,6 +585,7 @@
 
     frame_init( inner );
     inner->prev = frame;
+    inner->prev_user = frame->module->user_module ? frame : frame->prev_user;
     inner->module = frame->module; /* This gets fixed up in evaluate_rule(), below */
     inner->procedure = parse;
 
@@ -690,6 +692,7 @@
         frame_init( frame );
         frame->module = typecheck;
         frame->prev = caller;
+        frame->prev_user = caller->module->user_module ? caller : caller->prev_user;
 
         enter_module( typecheck );
         /* Prepare the argument list */
@@ -796,95 +799,105 @@
     return locals;
 }
 
-struct profile_info
-{
-    char* name;                 /* name of rule being called */
-    clock_t cumulative;         /* cumulative time spent in rule */
-    clock_t net;                /* time spent in rule proper */
-    unsigned long num_entries;  /* number of time rule was entered */
-    unsigned long stack_count;  /* number of the times this function is present in stack */
-};
-typedef struct profile_info profile_info;
+static int python_instance_number = 0;
 
-struct profile_frame
+RULE *
+enter_rule( char *rulename, module_t *target_module );
+
+#ifdef HAVE_PYTHON
+static LIST*
+call_python_function(RULE* r, FRAME* frame)
 {
-    profile_info* info;               /* permanent storage where data accumulates */
-    clock_t overhead;                 /* overhead for profiling in this call */
-    clock_t entry_time;               /* time of last entry to rule */
-    struct profile_frame* caller;     /* stack frame of caller */
-    clock_t subrules;                 /* time spent in subrules */
-};
-typedef struct profile_frame profile_frame;
+    LIST* result = 0;
+    PyObject* arguments = PyTuple_New(frame->args->count);
+    int i ;
+    PyObject* py_result;
 
-static profile_frame* profile_stack = 0;
-static struct hash* profile_hash = 0;
+    for(i = 0; i < frame->args->count; ++i)
+    {
+        PyObject* arg = PyList_New(0);
+        LIST* l = lol_get( frame->args, i);
 
-static void profile_enter( char* rulename, profile_frame* frame )
-{
-    clock_t start = clock();
-    profile_info info, *p = &info;
-    
-    if ( !profile_hash )
-        profile_hash = hashinit(sizeof(profile_info), "profile");
+        for(; l; l = l->next)
+        {
+            PyObject* v = PyString_FromString(l->string);
+            /* Steals reference to 'v' */
+            PyList_Append(arg, v);            
+        }
+        /* Steals reference to 'arg' */
+        PyTuple_SetItem(arguments, i, arg);
+    }
 
-    info.name = rulename;
-    
-    if ( hashenter( profile_hash, (HASHDATA **)&p ) )
-        p->cumulative = p->net = p->num_entries = p->stack_count = 0;
+    py_result = PyObject_CallObject(r->python_function, arguments);
+    Py_DECREF(arguments);
+    if (py_result != NULL) {
+        
+        if (PyList_Check(py_result)) {
+            int size = PyList_Size(py_result);
+            int i;
+            for(i = 0; i < size; ++i)
+            {
+                PyObject* item = PyList_GetItem(py_result, i);
+                if (PyString_Check(item))
+                {
+                    result = list_new(result, 
+                                      newstr(PyString_AsString(item)));
+                }
+                else
+                {
+                    fprintf(stderr, "Non-string object returned by Python call\n");
+                }
+            }
+        }
+        else if (PyInstance_Check(py_result))
+        {
+            static char instance_name[1000];
+            static char imported_method_name[1000];
+            module_t* m;
+            PyObject* method;
+            PyObject* method_name = PyString_FromString("foo");
+            RULE* r;
 
-    ++(p->num_entries);
-    ++(p->stack_count);
-    
-    frame->info = p;
-    
-    frame->caller = profile_stack;
-    profile_stack = frame;
+            fprintf(stderr, "Got instance!\n");
 
-    frame->entry_time = clock();
-    frame->overhead = 0;
-    frame->subrules = 0;
+            snprintf(instance_name, 1000,
+                     "pyinstance%d", python_instance_number);
+            snprintf(imported_method_name, 1000,
+                     "pyinstance%d.foo", python_instance_number);
+            ++python_instance_number;
+            
+            m = bindmodule(instance_name);
 
-    /* caller pays for the time it takes to play with the hash table */
-    if ( frame->caller )
-        frame->caller->overhead += frame->entry_time - start;
-}
-    
-static void profile_exit(profile_frame* frame)
-{
-    /* cumulative time for this call */
-    clock_t t = clock() - frame->entry_time - frame->overhead;
-    /* If this rule is already present on the stack, don't add the time for
-       this instance. */
-    if (frame->info->stack_count == 1)
-        frame->info->cumulative += t;
-    /* Net time does not depend on presense of the same rule in call stack. */
-    frame->info->net += t - frame->subrules;
-        
-    if (frame->caller)
-    {
-        /* caller's cumulative time must account for this overhead */
-        frame->caller->overhead += frame->overhead;
-        frame->caller->subrules += t;
-    }
-    /* pop this stack frame */
-    --frame->info->stack_count;
-    profile_stack = frame->caller;
-}
+            /* This is expected to get bound method. */
+            method = PyObject_GetAttr(py_result, method_name);
+            
+            r = bindrule( imported_method_name, root_module() );
 
-static void dump_profile_entry(void* p_, void* ignored)
-{
-    profile_info* p = (profile_info*)p_;
-    printf("%10d %10d %10d %s\n", p->cumulative, p->net, p->num_entries, p->name);
-}
+            r->python_function = method;
 
-void profile_dump()
-{
-    if ( profile_hash )
-    {
-        printf("%10s %10s %10s %s\n", "gross", "net", "# entries", "name");
-        hashenumerate( profile_hash, dump_profile_entry, 0 );
+            result = list_new(0, newstr(instance_name));    
+
+            Py_DECREF(method_name);
+        }
+        else if (py_result == Py_None)
+        {
+            result = L0;
+        }
+        else
+        {
+            fprintf(stderr, "Non-list object returned by Python call\n");
+        }
+
+        Py_DECREF(py_result);
     }
+    else {
+        PyErr_Print();
+        fprintf(stderr,"Call failed\n");
+    }
+    
+    return result;
 }
+#endif
 
 /*
  * evaluate_rule() - execute a rule invocation
@@ -922,6 +935,13 @@
     rulename = l->string;
     rule = bindrule( l->string, frame->module );
 
+#ifdef HAVE_PYTHON
+    if (rule->python_function)
+    {
+        return call_python_function(rule, frame);
+    }
+#endif
+
     /* drop the rule name */
     l = list_pop_front( l );
 
@@ -990,6 +1010,9 @@
         action = (ACTION *)malloc( sizeof( ACTION ) );
         memset( (char *)action, '\0', sizeof( *action ) );
 
+        if ( DEBUG_PROFILE )
+            profile_memory( sizeof( ACTION ) );
+
         action->rule = rule;
         action->targets = targetlist( (TARGETS *)0, lol_get( frame->args, 0 ) );
         action->sources = targetlist( (TARGETS *)0, lol_get( frame->args, 1 ) );
@@ -1049,7 +1072,9 @@
     FRAME       inner[1];
     frame_init( inner );
     inner->prev = caller_frame;
-    inner->module = caller_frame->module;
+    inner->prev_user = caller_frame->module->user_module ? 
+        caller_frame : caller_frame->prev_user;
+    inner->module = caller_frame->module;    
     inner->procedure = 0;
 
     va_start(va, caller_frame);    

Modified: boost-build/branches/upstream/current/jam_src/compile.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/compile.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/compile.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -48,8 +48,6 @@
 
 regexp* regex_compile( const char* pattern );
 
-void profile_dump();
-
 /* Flags for compile_set(), etc */
 
 # define ASSIGN_SET	0x00	/* = assign variable */

Modified: boost-build/branches/upstream/current/jam_src/debian/changelog
===================================================================
--- boost-build/branches/upstream/current/jam_src/debian/changelog	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/debian/changelog	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,3 +1,21 @@
+bjam (3.1.12-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Rene Rivera <grafik at redshift-software.com>  Sat, 01 Oct 2005 00:00:00 +0000
+
+bjam (3.1.11-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Rene Rivera <grafik at redshift-software.com>  Sat, 30 Apr 2005 00:00:00 +0000
+
+bjam (3.1.10-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Rene Rivera <grafik at redshift-software.com>  Tue, 1 Jun 2004 05:42:35 +0000
+
 bjam (3.1.9-2) unstable; urgency=low
 
   * Use default value of BOOST_BUILD_PATH is not is set in environment.

Modified: boost-build/branches/upstream/current/jam_src/debian/copyright
===================================================================
--- boost-build/branches/upstream/current/jam_src/debian/copyright	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/debian/copyright	2006-11-09 09:53:31 UTC (rev 14016)
@@ -17,8 +17,9 @@
 
 Some portions are also:
 
-    Copyright 2001-2004 David Abrahams.
-    Copyright 2002-2004 Rene Rivera.
+    Copyright 2001-2006 David Abrahams.
+    Copyright 2002-2006 Rene Rivera.
+    Copyright 2003-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)


Property changes on: boost-build/branches/upstream/current/jam_src/debian/rules
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/jam_src/debug.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/debug.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/debug.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,127 @@
+/*
+    Copyright Rene Rivera 2005.
+    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)
+*/
+
+# include "jam.h"
+# include "debug.h"
+
+# include "hash.h"
+
+# include <time.h>
+# include <assert.h>
+
+static profile_frame* profile_stack = 0;
+static struct hash* profile_hash = 0;
+static profile_info profile_other = { "[OTHER]", 0, 0, 0, 0, 0 };
+static profile_info profile_total = { "[TOTAL]", 0, 0, 0, 0, 0 };
+
+profile_frame* profile_init( char* rulename, profile_frame* frame )
+{
+    if ( DEBUG_PROFILE ) profile_enter(rulename,frame);
+    return frame;
+}
+
+void profile_enter( char* rulename, profile_frame* frame )
+{
+    if ( DEBUG_PROFILE )
+    {
+        clock_t start = clock();
+        profile_info info, *p = &info;
+
+        if ( !rulename ) p = &profile_other;
+
+        if ( !profile_hash )
+        {
+            if ( rulename ) profile_hash = hashinit(sizeof(profile_info), "profile");
+        }
+
+        info.name = rulename;
+
+        if ( rulename && hashenter( profile_hash, (HASHDATA **)&p ) )
+            p->cumulative = p->net = p->num_entries = p->stack_count = p->memory = 0;
+
+        ++(p->num_entries);
+        ++(p->stack_count);
+
+        frame->info = p;
+
+        frame->caller = profile_stack;
+        profile_stack = frame;
+
+        frame->entry_time = clock();
+        frame->overhead = 0;
+        frame->subrules = 0;
+
+        /* caller pays for the time it takes to play with the hash table */
+        if ( frame->caller )
+            frame->caller->overhead += frame->entry_time - start;
+    }
+}
+
+void profile_memory( long mem )
+{
+    if ( DEBUG_PROFILE )
+    {
+        if ( profile_stack && profile_stack->info )
+        {
+            profile_stack->info->memory += mem;
+        }
+    }
+}
+    
+void profile_exit(profile_frame* frame)
+{
+    if ( DEBUG_PROFILE )
+    {
+        /* cumulative time for this call */
+        clock_t t = clock() - frame->entry_time - frame->overhead;
+        /* If this rule is already present on the stack, don't add the time for
+           this instance. */
+        if (frame->info->stack_count == 1)
+            frame->info->cumulative += t;
+        /* Net time does not depend on presense of the same rule in call stack. */
+        frame->info->net += t - frame->subrules;
+
+        if (frame->caller)
+        {
+            /* caller's cumulative time must account for this overhead */
+            frame->caller->overhead += frame->overhead;
+            frame->caller->subrules += t;
+        }
+        /* pop this stack frame */
+        --frame->info->stack_count;
+        profile_stack = frame->caller;
+    }
+}
+
+static void dump_profile_entry(void* p_, void* ignored)
+{
+    profile_info* p = (profile_info*)p_;
+    unsigned long mem_each = (p->memory/(p->num_entries ? p->num_entries : 1));
+    double q = p->net; q /= (p->num_entries ? p->num_entries : 1);
+    if (!ignored)
+    {
+        profile_total.cumulative += p->net;
+        profile_total.memory += p->memory;
+    }
+    printf("%10d %10d %10d %12.6f %10d %10d %s\n",
+        p->num_entries, p->cumulative, p->net, q,
+        p->memory, mem_each,
+        p->name);
+}
+
+void profile_dump()
+{
+    if ( profile_hash )
+    {
+        printf("%10s %10s %10s %12s %10s %10s %s\n",
+            "--count--", "--gross--", "--net--", "--each--",
+            "--mem--", "--each--",
+            "--name--");
+        hashenumerate( profile_hash, dump_profile_entry, 0 );
+        dump_profile_entry(&profile_other,0);
+        dump_profile_entry(&profile_total,(void*)1);
+    }
+}

Added: boost-build/branches/upstream/current/jam_src/debug.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/debug.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/debug.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,53 @@
+/*
+    Copyright Rene Rivera 2005.
+    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)
+*/
+#ifndef BJAM_DEBUG_H
+#define BJAM_DEBUG_H
+
+# include "jam.h"
+# include <time.h>
+
+struct profile_info
+{
+    /* name of rule being called */
+    char* name;
+    /* cumulative time spent in rule */
+    clock_t cumulative;
+    /* time spent in rule proper */
+    clock_t net;
+    /* number of time rule was entered */
+    unsigned long num_entries;
+    /* number of the times this function is present in stack */
+    unsigned long stack_count;
+    /* bytes of memory allocated by the call */
+    unsigned long memory;
+};
+typedef struct profile_info profile_info;
+
+struct profile_frame
+{
+    /* permanent storage where data accumulates */
+    profile_info* info;
+    /* overhead for profiling in this call */
+    clock_t overhead;
+    /* time of last entry to rule */
+    clock_t entry_time;
+    /* stack frame of caller */
+    struct profile_frame* caller;
+    /* time spent in subrules */
+    clock_t subrules;
+};
+typedef struct profile_frame profile_frame;
+
+profile_frame * profile_init( char* rulename, profile_frame* frame );
+void profile_enter( char* rulename, profile_frame* frame );
+void profile_memory( long mem );
+void profile_exit(profile_frame* frame);
+void profile_dump();
+
+#define PROFILE_ENTER(scope) profile_frame PROF_ ## scope, *PROF_ ## scope ## _p = profile_init(#scope,&PROF_ ## scope)
+#define PROFILE_EXIT(scope) profile_exit(PROF_ ## scope ## _p)
+
+#endif

Modified: boost-build/branches/upstream/current/jam_src/execcmd.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/execcmd.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/execcmd.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -10,9 +10,16 @@
  * 05/04/94 (seiwald) - async multiprocess interface
  */
 
+typedef struct timing_info
+{
+    /* double elapsed; */  /* We don't know how to get this number on Unix */
+    double system;
+    double user;
+} timing_info;
+
 void execcmd(
 	char *string,
-	void (*func)( void *closure, int status ),
+	void (*func)( void *closure, int status, timing_info* ),
 	void *closure,
 	LIST *shell );
 

Modified: boost-build/branches/upstream/current/jam_src/execnt.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/execnt.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/execnt.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -13,15 +13,21 @@
 # include "jam.h"
 # include "lists.h"
 # include "execcmd.h"
+# include "pathsys.h"
+# include "debug.h"
 # include <errno.h>
 # include <assert.h>
 # include <ctype.h>
+# include <time.h>
 
 # ifdef USE_EXECNT
 
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>		/* do the ugly deed */
 # include <process.h>
+# if !defined( __BORLANDC__ )
+# include <tlhelp32.h>
+# endif
 
 # if !defined( __BORLANDC__ ) && !defined( OS_OS2 )
 # define wait my_wait
@@ -71,7 +77,7 @@
 static struct
 {
 	int	pid; /* on win32, a real process handle */
-	void	(*func)( void *closure, int status );
+	void	(*func)( void *closure, int status, timing_info* );
 	void 	*closure;
 	char	*tempfile;
 
@@ -107,93 +113,105 @@
         : 2047;
 }
 
+static void
+free_argv( char** args )
+{
+  free( args[0] );
+  free( args );
+}
+
+/* Convert a command string into arguments for spawnvp.  The original
+ * code, inherited from ftjam, tried to break up every argument on the
+ * command-line, dealing with quotes, but that's really a waste of
+ * time on Win32, at least.  It turns out that all you need to do is
+ * get the raw path to the executable in the first argument to
+ * spawnvp, and you can pass all the rest of the command-line
+ * arguments to spawnvp in one, un-processed string.
+ *
+ * New strategy: break the string in at most one place.
+ */
 static char**
-string_to_args( const char*  string, int*  pcount )
+string_to_args( const char*  string )
 {
-  int    total    = strlen( string );
-  int    in_quote = 0,
-      num_args = 0; /* was uninitialized -- dwa */
-  char*  line;
-  char*  p;
-  char** arg;
-  char** args;
+    int src_len;
+    int in_quote;
+    char* line;
+    char const* src;
+    char* dst;
+    char** argv;
 
-  *pcount = 0;  
+    /* drop leading and trailing whitespace if any */
+    while (isspace(*string))
+        ++string;
+  
+    src_len = strlen( string );
+    while ( src_len > 0 && isspace( string[src_len - 1] ) )
+        --src_len;
 
-  /* do not copy trailing newlines, if any */  
-  while ( total > 0 )
-  {
-      if ( !isspace( string[total - 1] ) )
-          break;
-      --total;
-  }
-  
-  /* first of all, copy the input string */
-  line    = (char*)malloc( total+2 );
-  if (!line)
-    return 0;
-    
-  memcpy( line+1, string, total );
-  line[0]       = 0;
-  line[total+1] = 0;
-  
-  in_quote = 0;
-  for ( p = line+1; p[0]; p++ )
-  {
-    switch (p[0])
+    /* Copy the input string into a buffer we can modify
+     */
+    line = (char*)malloc( src_len+1 );
+    if (!line)
+        return 0;
+
+    if ( DEBUG_PROFILE )
+        profile_memory( src_len+1 );
+
+    /* allocate the argv array.
+     *   element 0: stores the path to the executable
+     *   element 1: stores the command-line arguments to the executable
+     *   element 2: NULL terminator
+     */
+    argv = (char**)malloc( 3 * sizeof(char*) );
+    if (!argv)
     {
-      case '"':
-        in_quote = !in_quote;
-        break;
-        
-      case ' ':
-      case '\t':
-        if (!in_quote)
-          p[0]    = 0;
-        
-      default:
-        ;
+        free( line );
+        return 0;
     }
-  }
-  
-  /* now count the arguments.. */
-  for ( p = line; p < line+total+1; p++ )
-    if ( !p[0] && p[1] )
-      num_args++;
-      
-  /* allocate the args array */
-  /* dwa -- did you really mean to allocate only 2 additional bytes? */
-#if 0 /* was like this */
-  args = (char**)malloc( num_args*sizeof(char*)+2 );
-#endif
-  args = (char**)malloc( (num_args + 2) * sizeof(char*) );
-  if (!args)
-  {
-    free( line );
-    return 0;
-  }
-  
-  arg = args+1;
-  for ( p = line; p < line+total+1; p++ )
-    if ( !p[0] && p[1] )
+
+    if ( DEBUG_PROFILE )
+        profile_memory( 3 * sizeof(char*) );
+    
+    /* Strip quotes from the first command-line argument and find
+     * where it ends.  Quotes are illegal in Win32 pathnames, so we
+     * don't need to worry about preserving escaped quotes here.
+     * Spaces can't be escaped in Win32, only enclosed in quotes, so
+     * removing backslash escapes is also a non-issue.
+     */
+    in_quote = 0;
+    for ( src = string, dst = line ; *src; src++ )
     {
-      arg[0] = p+1;
-      arg++;
+        if (*src == '"')
+            in_quote = !in_quote;
+        else if (!in_quote && isspace(*src))
+            break;
+        else
+            *dst++ = *src;
     }
-  arg[0]  = 0;
-  *pcount = num_args;
-  args[0] = line;
-  return args+1;
-}
+    *dst++ = 0;
+    argv[0] = line;
 
-static void
-free_args( char** args )
-{
-  free( args[-1] );
-  free( args-1 );
+    /* skip whitespace in src */
+    while (isspace(*src))
+        ++src;
+
+    argv[1] = dst;
+
+	/* Copy the rest of the arguments verbatim */
+    
+    src_len -= src - string;
+
+    /* Use strncat because it appends a trailing nul */
+    *dst = 0;
+    strncat(dst, src, src_len);
+
+    argv[2] = 0;
+    
+    return argv;
 }
 
 
+
 /* process a "del" or "erase" command under Windows 95/98 */
 static int
 process_del( char*  command )
@@ -272,6 +290,8 @@
               line = (char*)malloc( len+4+1 );
               if (!line)
                 return 1;
+              if ( DEBUG_PROFILE )
+                  profile_memory( len+4+1 );
                 
               strncpy( line, "del ", 4 );
               strncpy( line+4, q, len );
@@ -310,28 +330,22 @@
 	printf( "...interrupted\n" );
 }
 
-#if 0 // the shell is too different from direct invocation; let's
-      // always use the shell unless forced.
 /*
- * use_bat_file() - return true iff the command demands the use of a
- * .bat file to run it
+ * can_spawn() - If the command is suitable for execution via spawnvp,
+ * return a number >= the number of characters it would occupy on the
+ * command-line.  Otherwise, return zero.
  */
-int use_bat_file(char* command)
+long can_spawn(char* command)
 {
-    char *p = command;
+    char *p;
     
     char inquote = 0;
 
-    p += strspn( p, " \t" );
+    /* Move to the first non-whitespace */
+    command += strspn( command, " \t" );
 
-    /* spawnvp can't handle any paths with spaces or quoted filenames with no directory prefix */
-    if ( *p == '"' )
-    {
-        char* q = p + 1 + strcspn( p + 1, "\" /\\" );
-        if ( *q == '"' || *q == ' ' )
-            return 1;
-    }
-        
+    p = command;
+    
     /* Look for newlines and unquoted i/o redirection */
     do
     {
@@ -343,11 +357,11 @@
             /* skip over any following spaces */
             while( isspace( *p ) )
                 ++p;
-            /* return true iff there is anything significant following
-             * the newline
+            /* Must use a .bat file if there is anything significant
+             * following the newline
              */
             if (*p)
-                return 1;
+                return 0;
             break;
             
         case '"':
@@ -367,20 +381,21 @@
         case '>':
         case '|':
             if (!inquote)
-                return 1;
+                return 0;
             ++p;
             break;
         }
     }
     while (*p);
-    
-    return p - command >= MAXLINE;
+
+    /* Return the number of characters the command will occupy
+     */
+    return p - command;
 }
-#endif
 
 void execnt_unit_test()
 {
-#if 0 && !defined(NDEBUG)
+#if !defined(NDEBUG)        
     /* vc6 preprocessor is broken, so assert with these strings gets
      * confused. Use a table instead.
      */
@@ -390,10 +405,6 @@
         { "x\n ", 0 },
         { "x\ny", 1 },
         { "x\n\n y", 1 },
-        { "\"x\"", 1 },
-        { "\"x y\"", 1 },
-        { "\"x/y\"", 0 },
-        { "\"x\\y\"", 0 },
         { "echo x > foo.bar", 1 },
         { "echo x < foo.bar", 1 },
         { "echo x \">\" foo.bar", 0 },
@@ -404,7 +415,7 @@
     int i;
     for ( i = 0; i < sizeof(tests)/sizeof(*tests); ++i)
     {
-        assert( use_bat_file( tests[i].command ) == tests[i].result );
+        assert( !can_spawn( tests[i].command ) == tests[i].result );
     }
 
     {
@@ -412,39 +423,82 @@
         assert( long_command != 0 );
         memset( long_command, 'x', MAXLINE + 9 );
         long_command[MAXLINE + 9] = 0;
-        assert( use_bat_file( long_command ) );
+        assert( can_spawn( long_command ) == MAXLINE + 9);
         free( long_command );
     }
+
+    {
+        /* Work around vc6 bug; it doesn't like escaped string
+         * literals inside assert
+         */
+        char** argv = string_to_args("\"g++\" -c -I\"Foobar\"");
+        char const expected[] = "-c -I\"Foobar\""; 
+        
+        assert(!strcmp(argv[0], "g++"));
+        assert(!strcmp(argv[1], expected));
+        free_argv(argv);
+    }
 #endif 
 }
 
-// SVA - handle temp dirs with spaces in the path
-static const char *getTempDir(void)
+/* 64-bit arithmetic helpers */
+
+/* Compute the carry bit from the addition of two 32-bit unsigned numbers */
+#define add_carry_bit(a, b) ( (((a) | (b)) >> 31) & (~((a) + (b)) >> 31) & 0x1 )
+
+/* Compute the high 32 bits of the addition of two 64-bit unsigned numbers, h1l1 and h2l2 */
+#define add_64_hi(h1, l1, h2, l2) ((h1) + (h2) + add_carry_bit(l1, l2))
+
+/* Add two 64-bit unsigned numbers, h1l1 and h2l2 */
+static FILETIME add_64(
+    unsigned long h1, unsigned long l1,
+    unsigned long h2, unsigned long l2)
 {
-    static char tempPath[_MAX_PATH];
-    static char *pTempPath=NULL;
+    FILETIME result;
+    result.dwLowDateTime = l1 + l2;
+    result.dwHighDateTime = add_64_hi(h1, l1, h2, l2);
 
-    if(pTempPath == NULL)
+    return result;
+}
+
+static FILETIME add_FILETIME(FILETIME t1, FILETIME t2)
+{
+    return add_64(
+        t1.dwHighDateTime, t1.dwLowDateTime
+      , t2.dwHighDateTime, t2.dwLowDateTime);
+}
+static FILETIME negate_FILETIME(FILETIME t)
+{
+    /* 2s complement negation */
+    return add_64(~t.dwHighDateTime, ~t.dwLowDateTime, 0, 1);
+}
+
+/* COnvert a FILETIME to a number of seconds */
+static double filetime_seconds(FILETIME t)
+{
+    return t.dwHighDateTime * (double)(1UL << 31) * 2 + t.dwLowDateTime * 1.0e-7;
+}
+
+static void
+record_times(int pid, timing_info* time)
+{
+    FILETIME creation, exit, kernel, user;
+    if (GetProcessTimes((HANDLE)pid, &creation, &exit, &kernel, &user))
     {
-        char *p;
+        /* Compute the elapsed time */
+#if 0 /* We don't know how to get this number this on Unix */
+        time->elapsed = filetime_seconds(
+            add_FILETIME( exit, negate_FILETIME(creation) )
+        );
+#endif 
 
-        p = getenv("TEMP");
-        if(p == NULL)
-        {
-            p = getenv("TMP");
-        }
-        if(p == NULL)
-        {
-            pTempPath = "\\temp";
-        }
-        else
-        {
-            GetShortPathName(p, tempPath, _MAX_PATH);
-            pTempPath = tempPath;
-        }
+        time->system = filetime_seconds(kernel);
+        time->user = filetime_seconds(user);            
     }
-    return pTempPath;
+        
+    CloseHandle((HANDLE)pid);
 }
+    
 
 /*
  * execcmd() - launch an async command execution
@@ -453,7 +507,7 @@
 void
 execcmd( 
 	char *string,
-	void (*func)( void *closure, int status ),
+	void (*func)( void *closure, int status, timing_info* ),
 	void *closure,
 	LIST *shell )
 {
@@ -496,16 +550,14 @@
   
     if( !cmdtab[ slot ].tempfile )
     {
-        const char *tempdir;
-        DWORD procID;
-
-        tempdir = getTempDir();
+        const char *tempdir = path_tmpdir();
+        DWORD procID = GetCurrentProcessId();
   
-        // SVA - allocate 64 other just to be safe
+        /* SVA - allocate 64 other just to be safe */
         cmdtab[ slot ].tempfile = malloc( strlen( tempdir ) + 64 );
+        if ( DEBUG_PROFILE )
+            profile_memory( strlen( tempdir ) + 64 );
   
-        procID = GetCurrentProcessId();
-  
         sprintf( cmdtab[ slot ].tempfile, "%s\\jam%d-%02d.bat", 
                  tempdir, procID, slot );		
     }
@@ -515,19 +567,35 @@
     while( isspace( *string ) )
         ++string;
 
-    /* If multi line, or too long, or JAMSHELL is set, write to bat file. */
-    /* Otherwise, exec directly. */
-    /* Frankly, if it is a single long line I don't think the */
-    /* command interpreter will do any better -- it will fail. */
-
-    if( shell || !raw_cmd // && use_bat_file( string )
-        )
+    /* Write to .BAT file unless the line would be too long and it
+     * meets the other spawnability criteria.
+     */
+    if( raw_cmd && can_spawn( string ) >= MAXLINE )
     {
-        FILE *f;
-
-        /* Write command to bat file. */
-
-        f = fopen( cmdtab[ slot ].tempfile, "w" );
+        if( DEBUG_EXECCMD )
+            printf("Executing raw command directly\n");        
+    }
+    else
+    {
+        FILE *f = 0;
+        int tries = 0;
+        raw_cmd = 0;
+        
+        /* Write command to bat file. For some reason this open can
+           fails intermitently. But doing some retries works. Most likely
+           this is due to a previously existing file of the same name that
+           happens to be opened by an active virus scanner. Pointed out,
+           and fix by Bronek Kozicki. */
+        for (; !f && tries < 4; ++tries)
+        {
+            f = fopen( cmdtab[ slot ].tempfile, "w" );
+            if ( !f && tries < 4 ) Sleep( 250 );
+        }
+        if (!f)
+        {
+            printf( "failed to write command file!\n" );
+            exit( EXITBAD );
+        }
         fputs( string, f );
         fclose( f );
 
@@ -541,10 +609,6 @@
                 printf("Executing through .bat file\n");
         }
     }
-    else if( DEBUG_EXECCMD )
-    {
-        printf("Executing raw command directly\n");
-    }
 
     /* Forumulate argv */
     /* If shell was defined, be prepared for % and ! subs. */
@@ -577,8 +641,7 @@
     }
     else if (raw_cmd)
     {
-        int ignored;
-        argv = string_to_args(string, &ignored);
+        argv = string_to_args(string);
     }
     else
     {
@@ -608,6 +671,7 @@
         const char**  keyword;
         int           len, spawn = 1;
         int           result;
+        timing_info time = {0,0};
           
         for ( keyword = hard_coded; keyword[0]; keyword++ )
         {
@@ -630,11 +694,10 @@
         if (spawn)
         {
             char**  args;
-            int     num_args;
             
             /* convert the string into an array of arguments */
             /* we need to take care of double quotes !!      */
-            args = string_to_args( string, &num_args );
+            args = string_to_args( string );
             if ( args )
             {
 #if 0
@@ -649,12 +712,13 @@
                 fprintf( stderr, "\n" );
 #endif              
                 result = spawnvp( P_WAIT, args[0], args );
-                free_args( args );
+                record_times(result, &time);
+                free_argv( args );
             }
             else
                 result = 1;
         }
-        func( closure, result ? EXEC_CMD_FAIL : EXEC_CMD_OK );
+        func( closure, result ? EXEC_CMD_FAIL : EXEC_CMD_OK, &time );
         return;
     }
 
@@ -672,12 +736,19 @@
     }
 
     /* the rest is for Windows NT only */
-    /* spawn doesn't like quotes aroudn the command name */
+    /* spawn doesn't like quotes around the command name */
     if ( argv[0][0] == '"')
     {
         int l = strlen(argv[0]);
-        if (argv[0][l-1] == '"') argv[0][l-1] = '\0';
-        strcpy(argv[0],argv[0]+1);
+
+        /* Clobber any closing quote, shortening the string by one
+         * element */
+        if (argv[0][l-1] == '"')
+            argv[0][l-1] = '\0';
+        
+        /* Move everything *including* the original terminating zero
+         * back one place in memory, covering up the opening quote */
+        memmove(argv[0],argv[0]+1,l);
     }
     if( ( pid = spawnvp( P_NOWAIT, argv[0], argv ) ) == -1 )
     {
@@ -699,7 +770,7 @@
     
     if (argv != argv_static)
     {
-        free_args(argv);
+        free_argv(argv);
     }
 }
 
@@ -713,19 +784,20 @@
 	int i;
 	int status, w;
 	int rstat;
+    timing_info time;
 
 	/* Handle naive make1() which doesn't know if cmds are running. */
 
 	if( !cmdsrunning )
 	    return 0;
 
-        if ( is_win95 )
-          return 0;
+    if ( is_win95 )
+        return 0;
           
 	/* Pick up process pid and status */
     
-	while( ( w = wait( &status ) ) == -1 && errno == EINTR )
-		;
+    while( ( w = wait( &status ) ) == -1 && errno == EINTR )
+        ;
 
 	if( w == -1 )
 	{
@@ -746,6 +818,8 @@
 	    exit( EXITBAD );
 	}
 
+    record_times(cmdtab[i].pid, &time);
+    
 	/* Clear the temp file */
     if ( cmdtab[i].tempfile )
         unlink( cmdtab[ i ].tempfile );
@@ -763,68 +837,401 @@
 	    rstat = EXEC_CMD_OK;
 
 	cmdtab[ i ].pid = 0;
-	// SVA don't leak temp files
+	/* SVA don't leak temp files */
 	if(cmdtab[i].tempfile != NULL)
 	{
             free(cmdtab[i].tempfile);
             cmdtab[i].tempfile = NULL;
 	}
-	(*cmdtab[ i ].func)( cmdtab[ i ].closure, rstat );
+	(*cmdtab[ i ].func)( cmdtab[ i ].closure, rstat, &time );
 
 	return 1;
 }
 
 # if !defined( __BORLANDC__ )
 
+/* The possible result codes from check_process_exit, below */
+typedef enum { process_error, process_active, process_finished } process_state;
+
+/* Helper for my_wait() below.  Checks to see whether the process has
+ * exited and if so, records timing information.
+ */
+static process_state
+check_process_exit(
+    HANDLE process         /* The process we're looking at */
+    
+  , int* status            /* Storage for the finished process' exit
+                            * code.  If the process is still active
+                            * this location is left untouched. */
+    
+  , HANDLE* active_handles /* Storage for the process handle if it is
+                            * found to be still active, or NULL.  The
+                            * process is treated as though it is
+                            * complete.  */
+    
+  , int* num_active        /* The current length of active_handles */
+)
+{
+    DWORD exitcode;
+    process_state result;
+
+    /* Try to get the process exit code */
+    if (!GetExitCodeProcess(process, &exitcode))
+    {
+        result = process_error; /* signal an error */
+    }
+    else if (
+        exitcode == STILL_ACTIVE     /* If the process is still active */
+        && active_handles != 0       /* and we've been passed a place to buffer it */
+    )
+    {
+        active_handles[(*num_active)++] = process; /* push it onto the active stack */
+        result = process_active;
+    }
+    else
+    {
+        *status = (int)((exitcode & 0xff) << 8);
+        result = process_finished;
+    }
+    
+    return result;
+}
+
+static double
+running_time(HANDLE process)
+{
+    FILETIME creation, exit, kernel, user, current;
+    if (GetProcessTimes(process, &creation, &exit, &kernel, &user))
+    {
+        /* Compute the elapsed time */
+        GetSystemTimeAsFileTime(&current);
+        {
+            double delta = filetime_seconds(
+                add_FILETIME( current, negate_FILETIME(creation) )
+                );
+            return delta;
+        }
+    }
+    return 0.0;
+}
+
+static double
+creation_time(HANDLE process)
+{
+    FILETIME creation, exit, kernel, user, current;
+    if (GetProcessTimes(process, &creation, &exit, &kernel, &user))
+    {
+        return filetime_seconds(creation);
+    }
+    return 0.0;
+}
+
+/* it's just stupidly silly that one has to do this! */
+typedef struct PROCESS_BASIC_INFORMATION__ {
+    LONG ExitStatus;
+    PVOID PebBaseAddress;
+    ULONG AffinityMask;
+    LONG BasePriority;
+    ULONG UniqueProcessId;
+    ULONG InheritedFromUniqueProcessId;
+    } PROCESS_BASIC_INFORMATION_;
+typedef LONG (__stdcall * NtQueryInformationProcess__)(
+    HANDLE ProcessHandle,
+    LONG ProcessInformationClass,
+    PVOID ProcessInformation,
+    ULONG ProcessInformationLength,
+    PULONG ReturnLength);
+static NtQueryInformationProcess__ NtQueryInformationProcess_ = NULL;
+static HMODULE NTDLL_ = NULL;
+DWORD get_process_id(HANDLE process)
+{
+    PROCESS_BASIC_INFORMATION_ pinfo;
+    if ( ! NtQueryInformationProcess_ )
+    {
+        if ( ! NTDLL_ )
+        {
+            NTDLL_ = GetModuleHandleA("ntdll");
+        }
+        if ( NTDLL_ )
+        {
+            NtQueryInformationProcess_
+                = (NtQueryInformationProcess__)GetProcAddress( NTDLL_,"NtQueryInformationProcess" );
+        }
+    }
+    if ( NtQueryInformationProcess_ )
+    {
+        LONG r = (*NtQueryInformationProcess_)(
+            process,/* ProcessBasicInformation == */ 0,&pinfo,sizeof(PROCESS_BASIC_INFORMATION_),NULL);
+        return pinfo.UniqueProcessId;
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+/* not really optimal, or efficient, but it's easier this way, and it's not
+like we are going to be killing thousands, or even tens or processes. */
+static void
+kill_all(DWORD pid, HANDLE process)
+{
+    HANDLE process_snapshot_h = INVALID_HANDLE_VALUE;
+    if ( !pid )
+    {
+        pid = get_process_id(process);
+    }
+    process_snapshot_h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
+    
+    if (INVALID_HANDLE_VALUE != process_snapshot_h)
+    {
+        BOOL ok = TRUE;
+        PROCESSENTRY32 pinfo;
+        pinfo.dwSize = sizeof(PROCESSENTRY32);
+        for (
+            ok = Process32First(process_snapshot_h,&pinfo);
+            TRUE == ok;
+            ok = Process32Next(process_snapshot_h,&pinfo) )
+        {
+            if (pinfo.th32ParentProcessID == pid)
+            {
+                /* found a child, recurse to kill it and anything else below it */
+                HANDLE ph = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pinfo.th32ProcessID);
+                if (NULL != ph)
+                {
+                    kill_all(pinfo.th32ProcessID,ph);
+                    CloseHandle(ph);
+                }
+            }
+        }
+        CloseHandle(process_snapshot_h);
+    }
+    /* now that the children are all dead, kill the root */
+    TerminateProcess(process,-2);
+}
+
+/* recursive check if first process is parent (directly or indirectly) of 
+the latter one. Both processes are passed as process ids, not handles */
+static int 
+is_parent_child(DWORD parent, DWORD child)
+{
+    HANDLE process_snapshot_h = INVALID_HANDLE_VALUE;
+
+    if (!child)
+        return 0;
+    if (parent == child)
+        return 1;
+
+    process_snapshot_h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
+    if (INVALID_HANDLE_VALUE != process_snapshot_h)
+    {
+        BOOL ok = TRUE;
+        PROCESSENTRY32 pinfo;
+        pinfo.dwSize = sizeof(PROCESSENTRY32);
+        for (
+            ok = Process32First(process_snapshot_h, &pinfo); 
+            ok == TRUE; 
+            ok = Process32Next(process_snapshot_h, &pinfo) )
+        {
+            if (pinfo.th32ProcessID == child)
+            {
+                /*
+                Unfortunately, process ids are not really unique. There might 
+                be spurious "parent and child" relationship match between
+                two non-related processes if real parent process of a given
+                process has exited (while child process kept running as an 
+                "orphan") and the process id of such parent process has been 
+                reused by internals of the operating system when creating 
+                another process. Thus additional check is needed - process
+                creation time. */
+                double tchild = 0.0;
+                double tparent = 0.0;
+                HANDLE hchild = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pinfo.th32ProcessID);
+                if (hchild != 0)
+                {
+                    HANDLE hparent = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pinfo.th32ParentProcessID);
+                    if (hparent != 0)
+                    {
+                        tchild = creation_time(hchild);
+                        tparent = creation_time(hparent);
+                        
+                        CloseHandle(hparent);
+                    }
+                    CloseHandle(hchild);
+                }
+                CloseHandle(process_snapshot_h);
+
+                /* was child created before alleged parent? */
+                if (tchild == 0.0 || tparent == 0.0 || tchild < tparent)
+                    return 0;
+
+                /* csrss.exe may display message box like following:
+                    xyz.exe - Unable To Locate Component
+                    This application has failed to start because 
+                    boost_foo-bar.dll was not found. Re-installing the 
+                    application may fix the problem
+                This actually happens when starting test process that depends
+                on a dynamic library which failed to build. We want to 
+                automatically close these message boxes even though csrss.exe
+                is not our child process. We may depend on the fact that (in
+                all current versions of Windows) csrss.exe is indirectly 
+                child of System process, which always has process id == 4 */
+                if (stricmp(pinfo.szExeFile, "csrss.exe") == 0)
+                {
+                    if (is_parent_child(4, pinfo.th32ParentProcessID))
+                        return 1;
+                }
+                
+                return is_parent_child(parent, pinfo.th32ParentProcessID);
+            }
+        }
+
+        CloseHandle(process_snapshot_h);
+    }
+
+    return 0;
+}
+
+typedef struct PROCESS_HANDLE_ID {HANDLE h; DWORD pid;} PROCESS_HANDLE_ID;
+
+/* This function is called by the operating system for each topmost window. */
+BOOL CALLBACK
+window_enum(HWND hwnd, LPARAM lParam)
+{
+    char buf[7] = {0};
+    PROCESS_HANDLE_ID p = *((PROCESS_HANDLE_ID*) (lParam));
+    DWORD pid = 0;
+    DWORD tid = 0;
+
+    /* we want to find and close any window that:
+    1. is visible and
+    2. is a dialog and
+    3. is displayed by any of our child processes */
+    if (!IsWindowVisible(hwnd))
+        return TRUE;
+
+    if (!GetClassNameA(hwnd, buf, sizeof(buf)))
+        return TRUE; /* failed to read class name; presume it's not a dialog */
+ 
+    if (strcmp(buf, "#32770") != 0)
+        return TRUE; /* not a dialog */
+
+    /* GetWindowThreadProcessId returns 0 on error, otherwise thread id
+    of window message pump thread */
+    tid = GetWindowThreadProcessId(hwnd, &pid);
+ 
+    if (tid && is_parent_child(p.pid, pid))
+    {
+        /* ask really nice */
+        PostMessageA(hwnd, WM_CLOSE, 0, 0);
+        /* now wait and see if it worked. If not, insist */
+        if (WaitForSingleObject(p.h, 200) == WAIT_TIMEOUT)
+        {
+            PostThreadMessageA(tid, WM_QUIT, 0, 0);
+            WaitForSingleObject(p.h, 300);
+        }
+        
+        /* done, we do not want to check any other window now */
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+static void 
+close_alert(HANDLE process)
+{
+    DWORD pid = get_process_id(process);
+    /* If process already exited or we just cannot get its process id, do not 
+    go any further */
+    if (pid)
+    {
+        PROCESS_HANDLE_ID p = {process, pid};
+        EnumWindows(&window_enum, (LPARAM) &p);
+    }
+}
+
 static int
 my_wait( int *status )
 {
 	int i, num_active = 0;
 	DWORD exitcode, waitcode;
-	static HANDLE *active_handles = 0;
+	HANDLE active_handles[MAXJOBS];
 
-	if (!active_handles)
-	    active_handles = (HANDLE *)malloc(globs.jobs * sizeof(HANDLE) );
-
 	/* first see if any non-waited-for processes are dead,
 	 * and return if so.
 	 */
-	for ( i = 0; i < globs.jobs; i++ ) {
-	    if ( cmdtab[i].pid ) {
-		if ( GetExitCodeProcess((HANDLE)cmdtab[i].pid, &exitcode) ) {
-		    if ( exitcode == STILL_ACTIVE )
-			active_handles[num_active++] = (HANDLE)cmdtab[i].pid;
-		    else {
-			CloseHandle((HANDLE)cmdtab[i].pid);
-			*status = (int)((exitcode & 0xff) << 8);
-			return cmdtab[i].pid;
-		    }
-		}
-		else
-		    goto FAILED;
+	for ( i = 0; i < globs.jobs; i++ )
+    {
+        int pid = cmdtab[i].pid;
+        
+	    if ( pid )
+        {
+            process_state state
+                = check_process_exit((HANDLE)pid, status, active_handles, &num_active);
+            
+            if ( state == process_error )
+                goto FAILED;
+            else if ( state == process_finished )
+                return pid;
 	    }
 	}
 
 	/* if a child exists, wait for it to die */
-	if ( !num_active ) {
+	if ( !num_active )
+    {
 	    errno = ECHILD;
 	    return -1;
 	}
-	waitcode = WaitForMultipleObjects( num_active,
-					   active_handles,
-					   FALSE,
-					   INFINITE );
-	if ( waitcode != WAIT_FAILED ) {
+    
+    if ( globs.timeout > 0 )
+    {
+        unsigned int alert_wait = 1;
+        /* with a timeout we wait for a finish or a timeout, we check every second
+         to see if something timed out */
+        for (waitcode = WAIT_TIMEOUT; waitcode == WAIT_TIMEOUT; ++alert_wait)
+        {
+            waitcode = WaitForMultipleObjects( num_active, active_handles, FALSE, 1*1000 /* 1 second */ );
+            if ( waitcode == WAIT_TIMEOUT )
+            {
+                /* check if any jobs have surpassed the maximum run time. */
+                for ( i = 0; i < num_active; ++i )
+                {
+                    double t = running_time(active_handles[i]);
+
+                    /* periodically (each 5 secs) check and close message boxes
+                    displayed by any of our child processes */
+                    if ((alert_wait % ((unsigned int) 5)) == 0)
+                        close_alert(active_handles[i]);
+
+                    if ( t > (double)globs.timeout )
+                    {
+                        /* the job may have left an alert dialog around,
+                        try and get rid of it before killing */
+                        close_alert(active_handles[i]);
+                        /* we have a "runaway" job, kill it */
+                        kill_all(0,active_handles[i]);
+                        /* indicate the job "finished" so we query its status below */
+                        waitcode = WAIT_ABANDONED_0+i;
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        /* no timeout, so just wait indefinately for something to finish */
+        waitcode = WaitForMultipleObjects( num_active, active_handles, FALSE, INFINITE );
+    }
+	if ( waitcode != WAIT_FAILED )
+    {
 	    if ( waitcode >= WAIT_ABANDONED_0
-		&& waitcode < WAIT_ABANDONED_0 + num_active )
-		i = waitcode - WAIT_ABANDONED_0;
+             && waitcode < WAIT_ABANDONED_0 + num_active )
+            i = waitcode - WAIT_ABANDONED_0;
 	    else
-		i = waitcode - WAIT_OBJECT_0;
-	    if ( GetExitCodeProcess(active_handles[i], &exitcode) ) {
-		CloseHandle(active_handles[i]);
-		*status = (int)((exitcode & 0xff) << 8);
-		return (int)active_handles[i];
-	    }
+            i = waitcode - WAIT_OBJECT_0;
+        
+        if ( check_process_exit(active_handles[i], status, 0, 0) == process_finished )
+            return (int)active_handles[i];
 	}
 
 FAILED:

Modified: boost-build/branches/upstream/current/jam_src/execunix.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/execunix.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/execunix.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -8,31 +8,20 @@
 # include "lists.h"
 # include "execcmd.h"
 # include <errno.h>
+# include <time.h>
+# include <unistd.h> /* needed for vfork(), _exit() prototypes */
 
-#if defined(sun) || defined(__sun)
-#include <unistd.h> /* need to include unistd.h on sun for the vfork prototype*/
+#if defined(sun) || defined(__sun) || defined(linux)
 #include <wait.h>
 #endif
 
 # ifdef USE_EXECUNIX
+# include <sys/times.h>
 
 # ifdef NO_VFORK
 # define vfork() fork()
 # endif
 
-# if defined( OS_NT ) || defined( OS_OS2 )
-
-# define USE_EXECNT
-
-# include <process.h>
-
-# if !defined( __BORLANDC__ ) && !defined( OS_OS2 )
-# define wait my_wait
-static int my_wait( int *status );
-# endif
-
-# endif
-
 /*
  * execunix.c - execute a shell script on UNIX/WinNT/OS2/AmigaOS
  *
@@ -71,13 +60,8 @@
 static struct
 {
 	int	pid; /* on win32, a real process handle */
-	void	(*func)( void *closure, int status );
+	void	(*func)( void *closure, int status, timing_info* );
 	void 	*closure;
-
-# ifdef USE_EXECNT
-	char	*tempfile;
-# endif
-
 } cmdtab[ MAXJOBS ] = {{0}};
 
 /*
@@ -98,7 +82,7 @@
 void
 execcmd( 
 	char *string,
-	void (*func)( void *closure, int status ),
+	void (*func)( void *closure, int status, timing_info* ),
 	void *closure,
 	LIST *shell )
 {
@@ -106,10 +90,6 @@
 	int slot;
 	char *argv[ MAXARGC + 1 ];	/* +1 for NULL */
 
-# ifdef USE_EXECNT
-	char *p;
-# endif
-
 	/* Find a slot in the running commands table for this one. */
 
 	for( slot = 0; slot < MAXJOBS; slot++ )
@@ -122,50 +102,7 @@
 	    exit( EXITBAD );
 	}
 
-# ifdef USE_EXECNT
-	if( !cmdtab[ slot ].tempfile )
-	{
-	    char *tempdir;
 
-	    if( !( tempdir = getenv( "TEMP" ) ) &&
-		!( tempdir = getenv( "TMP" ) ) )
-		    tempdir = "\\temp";
-
-	    cmdtab[ slot ].tempfile = malloc( strlen( tempdir ) + 14 );
-
-	    sprintf( cmdtab[ slot ].tempfile, "%s\\jamtmp%02d.bat", 
-				tempdir, slot );
-	}
-
-	/* Trim leading, ending white space */
-
-	while( isspace( *string ) )
-		++string;
-
-	p = strchr( string, '\n' );
-
-	while( p && isspace( *p ) )
-		++p;
-
-	/* If multi line, or too long, or JAMSHELL is set, write to bat file. */
-	/* Otherwise, exec directly. */
-	/* Frankly, if it is a single long line I don't think the */
-	/* command interpreter will do any better -- it will fail. */
-
-	if( p && *p || strlen( string ) > MAXLINE || shell )
-	{
-	    FILE *f;
-
-	    /* Write command to bat file. */
-
-	    f = fopen( cmdtab[ slot ].tempfile, "w" );
-	    fputs( string, f );
-	    fclose( f );
-
-	    string = cmdtab[ slot ].tempfile;
-	}
-# endif
-
 	/* Forumulate argv */
 	/* If shell was defined, be prepared for % and ! subs. */
 	/* Otherwise, use stock /bin/sh (on unix) or cmd.exe (on NT). */
@@ -197,13 +134,8 @@
 	}
 	else
 	{
-# ifdef USE_EXECNT
-	    argv[0] = "cmd.exe";
-	    argv[1] = "/Q/C";		/* anything more is non-portable */
-# else
 	    argv[0] = "/bin/sh";
 	    argv[1] = "-c";
-# endif
 	    argv[2] = string;
 	    argv[3] = 0;
 	}
@@ -215,13 +147,6 @@
 
 	/* Start the command */
 
-# ifdef USE_EXECNT
-	if( ( pid = spawnvp( P_NOWAIT, argv[0], argv ) ) == -1 )
-	{
-	    perror( "spawn" );
-	    exit( EXITBAD );
-	}
-# else
 	if ((pid = vfork()) == 0) 
    	{
 		execvp( argv[0], argv );
@@ -233,7 +158,7 @@
 	    perror( "vfork" );
 	    exit( EXITBAD );
 	}
-# endif
+
 	/* Save the operation for execwait() to find. */
 
 	cmdtab[ slot ].pid = pid;
@@ -258,14 +183,17 @@
 	int i;
 	int status, w;
 	int rstat;
-
+    timing_info time;
+    struct tms old_time, new_time;
+    
 	/* Handle naive make1() which doesn't know if cmds are running. */
 
 	if( !cmdsrunning )
 	    return 0;
 
-	/* Pick up process pid and status */
+    times(&old_time);
     
+	/* Pick up process pid and status */
 	while( ( w = wait( &status ) ) == -1 && errno == EINTR )
 		;
 
@@ -276,6 +204,11 @@
 	    exit( EXITBAD );
 	}
 
+    times(&new_time);
+
+    time.system = (double)(new_time.tms_cstime - old_time.tms_cstime) / CLOCKS_PER_SEC;
+    time.user = (double)(new_time.tms_cutime - old_time.tms_cutime) / CLOCKS_PER_SEC;
+    
 	/* Find the process in the cmdtab. */
 
 	for( i = 0; i < MAXJOBS; i++ )
@@ -288,6 +221,7 @@
 	    exit( EXITBAD );
 	}
 
+    
 	/* Drive the completion */
 
 	if( !--cmdsrunning )
@@ -302,7 +236,7 @@
 
 	cmdtab[ i ].pid = 0;
 
-	(*cmdtab[ i ].func)( cmdtab[ i ].closure, rstat );
+	(*cmdtab[ i ].func)( cmdtab[ i ].closure, rstat, &time );
 
 	return 1;
 }
@@ -321,7 +255,11 @@
 	static HANDLE *active_handles = 0;
 
 	if (!active_handles)
+    {
 	    active_handles = (HANDLE *)malloc(globs.jobs * sizeof(HANDLE) );
+        if ( DEBUG_PROFILE )
+            profile_memory( globs.jobs * sizeof(HANDLE) );
+    }
 
 	/* first see if any non-waited-for processes are dead,
 	 * and return if so.

Modified: boost-build/branches/upstream/current/jam_src/expand.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/expand.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/expand.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,3 +1,9 @@
+/*
+ * Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.
+ *
+ * This file is part of Jam - see jam.c for Copyright information.
+ */
+
 # include "jam.h"
 # include "lists.h"
 # include "variable.h"
@@ -9,6 +15,7 @@
 # ifdef OS_CYGWIN
 #  include <sys/cygwin.h>
 #  include <windows.h>
+#  include <stdlib.h>
 # endif
 
 /*
@@ -130,14 +137,14 @@
     /*
      * Input so far (ignore blanks):
      *
-     *	stuff-in-outbuf $(variable) remainder
-     *			 ^	             ^
-     *			 in		     end
+     *  stuff-in-outbuf $(variable) remainder
+     *                   ^                   ^
+     *                   in                  end
      * Output so far:
      *
-     *	stuff-in-outbuf $
-     *	^	         ^
-     *	out_buf          out
+     *  stuff-in-outbuf $
+     *  ^                ^
+     *  out_buf          out
      *
      *
      * We just copied the $ of $(...), so back up one on the output.
@@ -163,9 +170,9 @@
     /*
      * Input so far (ignore blanks):
      *
-     *	stuff-in-outbuf $(variable) remainder
-     *			  ^	   ^         ^
-     *			  inp      in        end
+     *  stuff-in-outbuf $(variable) remainder
+     *                    ^        ^         ^
+     *                    inp      in        end
      */
     prefix_length = buf->size;
     string_append_range( buf, inp, in - 1 );
@@ -184,14 +191,14 @@
     /*
      * Input so far (ignore blanks):
      *
-     *	stuff-in-outbuf $(variable) remainder
-     *			            ^        ^
-     *			            in       end
+     *  stuff-in-outbuf $(variable) remainder
+     *                              ^        ^
+     *                              in       end
      * Output so far:
      *
-     *	stuff-in-outbuf variable
-     *	^	        ^       ^
-     *	out_buf         out	ov
+     *  stuff-in-outbuf variable
+     *  ^               ^       ^
+     *  out_buf         out     ov
      *
      * Later we will overwrite 'variable' in out_buf, but we'll be
      * done with it by then.  'variable' may be a multi-element list, 
@@ -675,11 +682,18 @@
     char axyb[] = "a$(xy)b";
     char azb[] = "a$($(z))b";
     char path[] = "$(p:W)";
+    
+    # ifdef OS_CYGWIN
+    char cygpath[256];
+    cygwin_conv_to_posix_path("c:\\foo\\bar", cygpath);
+    # else
+    char cygpath[] = "/cygdrive/c/foo/bar";
+    # endif
         
     lol_init(lol);
     var_set("xy", list_new( list_new( L0, newstr( "x" ) ), newstr( "y" ) ), VAR_SET );
     var_set("z", list_new( L0, newstr( "xy" ) ), VAR_SET );
-    var_set("p", list_new( L0, newstr( "/cygdrive/c/foo/bar" ) ), VAR_SET );
+    var_set("p", list_new( L0, newstr( cygpath ) ), VAR_SET );
 
     l = var_expand( 0, axyb, axyb + sizeof(axyb) - 1, lol, 0 );
     for ( l2 = l, e2 = expected; l2 && e2; l2 = list_next(l2), e2 = list_next(e2) )
@@ -696,11 +710,11 @@
     l = var_expand( 0, path, path + sizeof(path) - 1, lol, 0 );
     assert(l != 0);
     assert(list_next(l) == 0);
-# ifdef OS_CYGWIN
+    # ifdef OS_CYGWIN
     assert( !strcmp( l->string, "c:\\foo\\bar" ) );
-# else 
-    assert( !strcmp( l->string, "/cygdrive/c/foo/bar" ) );
-# endif   
+    # else 
+    assert( !strcmp( l->string, cygpath ) );
+    # endif   
     list_free(l);
 
     list_free(expected);
@@ -708,3 +722,9 @@
     lol_free(lol);
 }
 #endif
+
+/*
+     Local Variables:
+     tab-width: 8
+     End:
+ */

Modified: boost-build/branches/upstream/current/jam_src/filemac.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/filemac.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/filemac.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -156,6 +156,20 @@
 	return 0;
 }
 
+int file_is_file(char* filename)
+{
+	struct stat statbuf;
+
+	if( stat( filename, &statbuf ) < 0 )
+	    return -1;
+
+    if (S_ISREG(statbuf.st_mode)) 
+        return 1;
+    else
+        return 0;    
+}
+
+
 /*
  * file_archscan() - scan an archive for files
  */

Modified: boost-build/branches/upstream/current/jam_src/filent.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/filent.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/filent.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,14 +6,18 @@
 
 /*  This file is ALSO:
  *  Copyright 2001-2004 David Abrahams.
+ *  Copyright 2005 Rene Rivera.
  *  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)
  */
 
 # include "jam.h"
+# include "debug.h"
+
 # include "filesys.h"
 # include "pathsys.h"
 # include "strings.h"
+# include "newstr.h"
 
 # ifdef OS_NT
 
@@ -54,94 +58,157 @@
  */
 
 void
-file_dirscan( 
+file_dirscan(
 	char *dir,
 	scanback func,
 	void *closure )
 {
-    PATHNAME f;
-    string filespec[1];
-    string filename[1];
-    long handle;
-    int ret;
-    struct _finddata_t finfo[1];
+    PROFILE_ENTER(FILE_DIRSCAN);
+    
+    file_info_t * d = 0;
 
     dir = short_path_to_long_path( dir );
-	
+
     /* First enter directory itself */
 
-    memset( (char *)&f, '\0', sizeof( f ) );
+    d = file_query( dir );
+    
+    if ( ! d || ! d->is_dir )
+    {
+        PROFILE_EXIT(FILE_DIRSCAN);
+        return;
+    }
 
-    f.f_dir.ptr = dir;
-    f.f_dir.len = strlen(dir);
+    if ( ! d->files )
+    {
+        PATHNAME f;
+        string filespec[1];
+        string filename[1];
+        long handle;
+        int ret;
+        struct _finddata_t finfo[1];
+        LIST* files = L0;
 
-    dir = *dir ? dir : ".";
+        memset( (char *)&f, '\0', sizeof( f ) );
+        
+        f.f_dir.ptr = d->name;
+        f.f_dir.len = strlen(d->name);
+        
+        /* Now enter contents of directory */
 
-    /* Special case \ or d:\ : enter it */
- 
-    if( f.f_dir.len == 1 && f.f_dir.ptr[0] == '\\' )
-        (*func)( closure, dir, 0 /* not stat()'ed */, (time_t)0 );
-    else if( f.f_dir.len == 3 && f.f_dir.ptr[1] == ':' )
-        (*func)( closure, dir, 0 /* not stat()'ed */, (time_t)0 );
+        string_copy( filespec, *d->name ? d->name : "." );
+        string_append( filespec, "/*" );
 
-    /* Now enter contents of directory */
+        if( DEBUG_BINDSCAN )
+            printf( "scan directory %s\n", dir );
 
-    string_copy( filespec, dir );
-    string_append( filespec, "/*" );
+        # if defined(__BORLANDC__) && __BORLANDC__ < 0x550
+        if ( ret = findfirst( filespec->value, finfo, FA_NORMAL | FA_DIREC ) )
+        {
+            string_free( filespec );
+            PROFILE_EXIT(FILE_DIRSCAN);
+            return;
+        }
 
-    if( DEBUG_BINDSCAN )
-        printf( "scan directory %s\n", dir );
+        string_new( filename );
+        while( !ret )
+        {
+            file_info_t * ff = 0;
+            
+            f.f_base.ptr = finfo->ff_name;
+            f.f_base.len = strlen( finfo->ff_name );
 
-# if defined(__BORLANDC__) && __BORLANDC__ < 0x550
-    if ( ret = findfirst( filespec->value, finfo, FA_NORMAL | FA_DIREC ) )
-    {
-        string_free( filespec );
-        return;
-    }
+            string_truncate( filename, 0 );
+            path_build( &f, filename );
 
-    string_new( filename );
-    while( !ret )
-    {
-        time_t time_write = finfo->ff_fdate;
+            files = list_new( files, newstr(filename->value) );
+            ff = file_info( filename->value );
+            ff->is_file = finfo->ff_attrib & FA_DIREC ? 0 : 1;
+            ff->is_dir = finfo->ff_attrib & FA_DIREC ? 1 : 0;
+            ff->size = finfo->ff_fsize;
+            ff->time = (finfo->ff_ftime << 16) | finfo->ff_ftime;
 
-        time_write = (time_write << 16) | finfo->ff_ftime;
-        f.f_base.ptr = finfo->ff_name;
-        f.f_base.len = strlen( finfo->ff_name );
+            ret = findnext( finfo );
+        }
+        # else
+        handle = _findfirst( filespec->value, finfo );
 
-        string_truncate( filename, 0 );
-        path_build( &f, filename );
+        if( ret = ( handle < 0L ) )
+        {
+            string_free( filespec );
+            PROFILE_EXIT(FILE_DIRSCAN);
+            return;
+        }
 
-        (*func)( closure, filename->value, 1 /* stat()'ed */, time_write );
+        string_new( filename );
+        while( !ret )
+        {
+            file_info_t * ff = 0;
 
-        ret = findnext( finfo );
+            f.f_base.ptr = finfo->name;
+            f.f_base.len = strlen( finfo->name );
+
+            string_truncate( filename, 0 );
+            path_build( &f, filename, 0 );
+
+            files = list_new( files, newstr(filename->value) );
+            ff = file_info( filename->value );
+            ff->is_file = finfo->attrib & _A_SUBDIR ? 0 : 1;
+            ff->is_dir = finfo->attrib & _A_SUBDIR ? 1 : 0;
+            ff->size = finfo->size;
+            ff->time = finfo->time_write;
+
+            ret = _findnext( handle, finfo );
+        }
+
+        _findclose( handle );
+        # endif
+        string_free( filename );
+        string_free( filespec );
+    
+        d->files = files;
     }
-# else
-    handle = _findfirst( filespec->value, finfo );
 
-    if( ret = ( handle < 0L ) )
+    /* Special case \ or d:\ : enter it */
     {
-        string_free( filespec );
-        return;
+        unsigned long len = strlen(d->name);
+        if( len == 1 && d->name[0] == '\\' )
+            (*func)( closure, d->name, 1 /* stat()'ed */, d->time );
+        else if( len == 3 && d->name[1] == ':' )
+            (*func)( closure, d->name, 1 /* stat()'ed */, d->time );
     }
-        
-    string_new( filename );
-    while( !ret )
+
+    /* Now enter contents of directory */
+    if ( d->files )
     {
-        f.f_base.ptr = finfo->name;
-        f.f_base.len = strlen( finfo->name );
+        LIST * files = d->files;
+        while ( files )
+        {
+            file_info_t * ff = file_info( files->string );
+            (*func)( closure, ff->name, 1 /* stat()'ed */, ff->time );
+            files = list_next( files );
+        }
+    }
+    
+    PROFILE_EXIT(FILE_DIRSCAN);
+}
 
-        string_truncate( filename, 0 );
-        path_build( &f, filename, 0 );
+file_info_t * file_query( char * filename )
+{
+    file_info_t * ff = file_info( filename );
+    if ( ! ff->time )
+    {
+        struct stat statbuf;
 
-        (*func)( closure, filename->value, 1 /* stat()'ed */, finfo->time_write );
- 
-        ret = _findnext( handle, finfo );
+        if( stat( *filename ? filename : ".", &statbuf ) < 0 )
+            return 0;
+
+        ff->is_file = statbuf.st_mode & S_IFREG ? 1 : 0;
+        ff->is_dir = statbuf.st_mode & S_IFDIR ? 1 : 0;
+        ff->size = statbuf.st_size;
+        ff->time = statbuf.st_mtime ? statbuf.st_mtime : 1;
     }
-
-    _findclose( handle );
-# endif
-    string_free( filename );
-    string_free( filespec );
+    return ff;
 }
 
 /*
@@ -153,18 +220,20 @@
 	char	*filename,
 	time_t	*time )
 {
-	/* On NT this is called only for C:/ */
+    file_info_t * ff = file_query( filename );
+    if ( !ff ) return -1;
+    *time = ff->time;
+    return 0;
+}
 
-	struct stat statbuf;
+int file_is_file(char* filename)
+{
+    file_info_t * ff = file_query( filename );
+    if ( !ff ) return -1;
+    return ff->is_file;
+}
 
-	if( stat( filename, &statbuf ) < 0 )
-	    return -1;
 
-	*time = statbuf.st_mtime;
-
-	return 0;
-}
-
 /*
  * file_archscan() - scan an archive for files
  */
@@ -237,9 +306,12 @@
 		** 15 characters (ie. don't fit into a ar_name
 		*/
 
-		string_table = malloc(lar_size);
+		string_table = malloc(lar_size+1);
+        if ( DEBUG_PROFILE )
+            profile_memory( lar_size+1 );
 		if (read(fd, string_table, lar_size) != lar_size)
 		    printf("error reading string table\n");
+		string_table[lar_size] = '\0';
 		offset += SARHDR + lar_size;
 		continue;
 	    }
@@ -251,7 +323,7 @@
 		*/
 
 		name = string_table + atoi( ar_hdr.ar_name + 1 );
-		endname = name + strlen( name );
+		for ( endname = name; *endname && *endname != '\n'; ++endname) {}
 	    }
 	    else
 	    {
@@ -263,7 +335,7 @@
 	    /* strip trailing white-space, slashes, and backslashes */
 
 	    while( endname-- > name )
-		if( !isspace(*endname) && *endname != '\\' && *endname != '/' )
+	    	if( !isspace(*endname) && *endname != '\\' && *endname != '/' )
 		    break;
 	    *++endname = 0;
 

Modified: boost-build/branches/upstream/current/jam_src/filesys.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/filesys.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/filesys.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,6 +1,9 @@
 # include "jam.h"
 # include "pathsys.h"
 # include "strings.h"
+# include "newstr.h"
+# include "filesys.h"
+# include "lists.h"
 
 void
 file_build1(
@@ -31,3 +34,51 @@
             string_push_back( file, '>' );
     }
 }
+
+static struct hash * filecache_hash = 0;
+
+file_info_t * file_info(char * filename)
+{
+    file_info_t finfo_, *finfo = &finfo_;
+    
+    if ( !filecache_hash )
+        filecache_hash = hashinit( sizeof( file_info_t ), "file_info" );
+    
+    finfo->name = filename;
+    if ( hashenter( filecache_hash, (HASHDATA**)&finfo ) )
+    {
+        /* printf( "file_info: %s\n", filename ); */
+        finfo->name = newstr( finfo->name );
+        finfo->is_file = 0;
+        finfo->is_dir = 0;
+        finfo->size = 0;
+        finfo->time = 0;
+        finfo->files = 0;
+    }
+    
+    return finfo;
+}
+
+static LIST * files_to_remove = L0;
+
+static void remove_files_atexit(void)
+{
+    /* we do pop front in case this exit function is called
+       more than once */
+    while ( files_to_remove )
+    {
+        remove( files_to_remove->string );
+        files_to_remove = list_pop_front( files_to_remove );
+    }
+}
+
+void file_done()
+{
+    remove_files_atexit();
+    hashdone( filecache_hash );
+}
+
+void file_remove_atexit( const char * path )
+{
+    files_to_remove = list_new( files_to_remove, newstr((char*)path) );
+}

Modified: boost-build/branches/upstream/current/jam_src/filesys.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/filesys.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/filesys.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -18,6 +18,8 @@
 # define FILESYS_DWA20011025_H
 
 # include "pathsys.h"
+#include "hash.h"
+#include "lists.h"
 
 typedef void (*scanback)( void *closure, char *file, int found, time_t t );
 
@@ -27,5 +29,26 @@
 int file_time( char *filename, time_t *time );
 
 void file_build1(PATHNAME *f, string* file) ;
+int file_is_file(char* filename);
 
+struct file_info_t {
+    char * name;
+    short is_file;
+    short is_dir;
+    unsigned long size;
+    time_t time;
+    LIST * files;
+} ;
+typedef struct file_info_t file_info_t ;
+
+file_info_t * file_info(char * filename);
+
+file_info_t * file_query(char * filename);
+
+void file_done();
+
+/** Marks a path/file to be removed when jam exits.
+*/
+void file_remove_atexit( const char * path );
+
 #endif

Modified: boost-build/branches/upstream/current/jam_src/fileunix.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/fileunix.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/fileunix.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,17 +6,20 @@
 
 /*  This file is ALSO:
  *  Copyright 2001-2004 David Abrahams.
+ *  Copyright 2005 Rene Rivera.
  *  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)
  */
 
 # include "jam.h"
+# include "debug.h"
 # include "filesys.h"
 # include "strings.h"
 # include "pathsys.h"
+# include "newstr.h"
 # include <stdio.h>
 
-#if defined(sun) || defined(__sun)
+#if defined(sun) || defined(__sun) || defined(linux)
 # include <unistd.h> /* needed for read and close prototype */
 #endif
 
@@ -127,54 +130,112 @@
 	scanback func,
 	void *closure )
 {
-	PATHNAME f;
-	DIR *d;
-	STRUCT_DIRENT *dirent;
-        string filename[1];
+    PROFILE_ENTER(FILE_DIRSCAN);
+    
+    file_info_t * d = 0;
 
-	/* First enter directory itself */
+    d = file_query( dir );
+    
+    if ( ! d || ! d->is_dir )
+    {
+        PROFILE_EXIT(FILE_DIRSCAN);
+        return;
+    }
 
-	memset( (char *)&f, '\0', sizeof( f ) );
+    if ( ! d->files )
+    {
+        LIST* files = L0;
+        PATHNAME f;
+        DIR *dd;
+        STRUCT_DIRENT *dirent;
+        string filename[1];
 
-	f.f_dir.ptr = dir;
-	f.f_dir.len = strlen(dir);
+        /* First enter directory itself */
 
-	dir = *dir ? dir : ".";
+        memset( (char *)&f, '\0', sizeof( f ) );
 
-	/* Special case / : enter it */
+        f.f_dir.ptr = dir;
+        f.f_dir.len = strlen(dir);
 
-	if( f.f_dir.len == 1 && f.f_dir.ptr[0] == '/' )
-	    (*func)( closure, dir, 0 /* not stat()'ed */, (time_t)0 );
+        dir = *dir ? dir : ".";
 
-	/* Now enter contents of directory */
+        /* Now enter contents of directory */
 
-	if( !( d = opendir( dir ) ) )
-	    return;
+        if( !( dd = opendir( dir ) ) )
+        {
+            PROFILE_EXIT(FILE_DIRSCAN);
+            return;
+        }
 
-	if( DEBUG_BINDSCAN )
-	    printf( "scan directory %s\n", dir );
+        if( DEBUG_BINDSCAN )
+            printf( "scan directory %s\n", dir );
 
         string_new( filename );
-	while( dirent = readdir( d ) )
-	{
-# ifdef old_sinix
-	    /* Broken structure definition on sinix. */
-	    f.f_base.ptr = dirent->d_name - 2;
-# else
-	    f.f_base.ptr = dirent->d_name;
-# endif
-	    f.f_base.len = strlen( f.f_base.ptr );
+        while( dirent = readdir( dd ) )
+        {
+            file_info_t * ff = 0;
+            
+            # ifdef old_sinix
+            /* Broken structure definition on sinix. */
+            f.f_base.ptr = dirent->d_name - 2;
+            # else
+            f.f_base.ptr = dirent->d_name;
+            # endif
+            f.f_base.len = strlen( f.f_base.ptr );
 
             string_truncate( filename, 0 );
-	    path_build( &f, filename, 0 );
+            path_build( &f, filename, 0 );
 
-	    (*func)( closure, filename->value, 0 /* not stat()'ed */, (time_t)0 );
-	}
+            files = list_new( files, newstr(filename->value) );
+            file_query( filename->value );
+        }
         string_free( filename );
 
-	closedir( d );
+        closedir( dd );
+    
+        d->files = files;
+    }
+
+    /* Special case / : enter it */
+    {
+        unsigned long len = strlen(d->name);
+        if( len == 1 && d->name[0] == '/' )
+            (*func)( closure, d->name, 1 /* stat()'ed */, d->time );
+    }
+
+    /* Now enter contents of directory */
+    if ( d->files )
+    {
+        LIST * files = d->files;
+        while ( files )
+        {
+            file_info_t * ff = file_info( files->string );
+            (*func)( closure, ff->name, 1 /* stat()'ed */, ff->time );
+            files = list_next( files );
+        }
+    }
+    
+    PROFILE_EXIT(FILE_DIRSCAN);
 }
 
+file_info_t * file_query( char * filename )
+{
+    file_info_t * ff = file_info( filename );
+    if ( ! ff->time )
+    {
+        struct stat statbuf;
+
+        if( stat( *filename ? filename : ".", &statbuf ) < 0 )
+            return 0;
+
+        ff->is_file = statbuf.st_mode & S_IFREG ? 1 : 0;
+        ff->is_dir = statbuf.st_mode & S_IFDIR ? 1 : 0;
+        ff->size = statbuf.st_size;
+        ff->time = statbuf.st_mtime ? statbuf.st_mtime : 1;
+    }
+    return ff;
+}
+
 /*
  * file_time() - get timestamp of file, if not done by file_dirscan()
  */
@@ -184,21 +245,20 @@
 	char	*filename,
 	time_t	*time )
 {
-	struct stat statbuf;
+    file_info_t * ff = file_query( filename );
+    if ( !ff ) return -1;
+    *time = ff->time;
+    return 0;
+}
 
-	if( stat( filename, &statbuf ) < 0 )
-	    return -1;
-
-    /* Technically, existing files can have 0 as statbuf.st_mtime 
-       --- in particular, the /cygdrive directory under cygwin. However, 
-       though all the code jam assumes that timestamp of 0 means
-       "does not exist" and will try to create the "missing" target, causing
-       problems. Work around this problem by chanding 0 to 1.
-    */
-	*time = statbuf.st_mtime ? statbuf.st_mtime : 1 ;
-	return 0;
+int file_is_file(char* filename)
+{
+    file_info_t * ff = file_query( filename );
+    if ( !ff ) return -1;
+    return ff->is_file;
 }
 
+
 /*
  * file_archscan() - scan an archive for files
  */
@@ -267,6 +327,8 @@
 		    */
 
 		    string_table = (char *)malloc(lar_size);
+            if ( DEBUG_PROFILE )
+                profile_memory( lar_size );
 		    lseek(fd, offset + SARHDR, 0);
 		    if (read(fd, string_table, lar_size) != lar_size)
 			printf("error reading string table\n");

Modified: boost-build/branches/upstream/current/jam_src/frames.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/frames.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/frames.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -15,6 +15,9 @@
 struct frame
 {
     FRAME* prev;
+    /** The nearest enclosing frame for which module->user_module is
+        true. */
+    FRAME* prev_user;
     LOL args[1];
     module_t* module;
     PARSE* procedure;

Modified: boost-build/branches/upstream/current/jam_src/hash.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/hash.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/hash.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,6 +6,8 @@
 
 # include "jam.h"
 # include "hash.h"
+# include "compile.h"
+#include "debug.h"
 # include <assert.h>
 
 /* 
@@ -24,6 +26,10 @@
  * 4/29/93 - ensure ITEM's are aligned
  */
 
+/* */
+#define HASH_DEBUG_PROFILE 1
+/* */
+
 char 	*hashsccssid="@(#)hash.c	1.14  ()  6/20/88";
 
 /* Header attached to all data items entered into a hash table. */
@@ -144,12 +150,24 @@
 	register ITEM *i;
 	unsigned char *b = (unsigned char*)(*data)->key;
 	unsigned int keyval;
+    
+    #ifdef HASH_DEBUG_PROFILE
+    profile_frame prof[1];
+    if ( DEBUG_PROFILE )
+        profile_enter( 0, prof );
+    #endif
 
 	if( enter && !hp->items.more )
 	    hashrehash( hp );
 
 	if( !enter && !hp->items.nel )
+    {
+        #ifdef HASH_DEBUG_PROFILE
+        if ( DEBUG_PROFILE )
+            profile_exit( prof );
+        #endif
 	    return 0;
+    }
 
 	keyval = *b;
 
@@ -163,6 +181,10 @@
 		!strcmp( i->data.key, (*data)->key ) )
 	{
 		*data = &i->data;
+        #ifdef HASH_DEBUG_PROFILE
+        if ( DEBUG_PROFILE )
+            profile_exit( prof );
+        #endif
 		return !0;
 	}
 
@@ -188,6 +210,10 @@
 		*data = &i->data;
 	}
 
+    #ifdef HASH_DEBUG_PROFILE
+    if ( DEBUG_PROFILE )
+        profile_exit( prof );
+    #endif
 	return 0;
 }
 
@@ -198,10 +224,12 @@
 static void hashrehash( register struct hash *hp )
 {
 	int i = ++hp->items.list;
-
 	hp->items.more = i ? 2 * hp->items.nel : hp->inel;
 	hp->items.next = (char *)malloc( hp->items.more * hp->items.size );
     hp->items.free = 0;
+
+    if ( DEBUG_PROFILE )
+        profile_memory( hp->items.more * hp->items.size );
     
 	hp->items.lists[i].nel = hp->items.more;
 	hp->items.lists[i].base = hp->items.next;
@@ -213,6 +241,9 @@
 	hp->tab.nel = hp->items.nel * hp->bloat;
 	hp->tab.base = (ITEM **)malloc( hp->tab.nel * sizeof(ITEM **) );
 
+    if ( DEBUG_PROFILE )
+        profile_memory( hp->tab.nel * sizeof(ITEM **) );
+
 	memset( (char *)hp->tab.base, '\0', hp->tab.nel * sizeof( ITEM * ) );
 
 	for( i = 0; i < hp->items.list; i++ )
@@ -268,6 +299,9 @@
 {
 	struct hash *hp = (struct hash *)malloc( sizeof( *hp ) );
 
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof( *hp ) );
+
 	hp->bloat = 3;
 	hp->tab.nel = 0;
 	hp->tab.base = (ITEM **)0;
@@ -277,7 +311,7 @@
 	hp->items.size = sizeof( struct hashhdr ) + ALIGNED( datalen );
 	hp->items.list = -1;
 	hp->items.nel = 0;
-	hp->inel = 11;
+	hp->inel = /* */ 11 /*/ 47 /* */;
 	hp->name = name;
 
 	return hp;

Modified: boost-build/branches/upstream/current/jam_src/hash.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/hash.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/hash.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,6 +7,9 @@
 /*
  * hash.h - simple in-memory hashing routines 
  */
+ 
+#ifndef BOOST_JAM_HASH_H
+#define BOOST_JAM_HASH_H
 
 typedef struct hashdata HASHDATA;
 
@@ -18,3 +21,5 @@
 
 # define	hashenter( hp, data ) (!hashitem( hp, data, !0 ))
 # define	hashcheck( hp, data ) hashitem( hp, data, 0 )
+
+#endif

Deleted: boost-build/branches/upstream/current/jam_src/index.html
===================================================================
--- boost-build/branches/upstream/current/jam_src/index.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/index.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,1220 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-
-<html>
-<head>
-  <meta name="generator" content=
-  "HTML Tidy for Linux/x86 (vers 1st September 2003), see www.w3.org">
-  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
-  <link rel="stylesheet" type="text/css" href="../../../../boost.css">
-
-  <title>Boost.Jam</title>
-  <meta name="author" content="Rene Rivera">
-  <meta name="description" content=
-  "Boost.Jam (bjam) is the core build tool for using the Boost.Build system. BJam is based on Perforce's Jam/MR.">
-  </head>
-
-<body link="#0000FF" vlink="#800080">
-  <table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
-  "header">
-    <tbody>
-      <tr>
-        <td valign="top" width="300">
-          <h3><a href="../../../index.htm"><img height="86" width="277" alt=
-          "C++ Boost" src="../../../c++boost.gif" border="0"></a></h3>
-        </td>
-
-        <td valign="top">
-          <h1 align="center">Boost.Jam</h1>
-
-          <h2 align="center"></h2>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <hr>
-
-  <dl class="index">
-    <dt><a href="#introduction">Introduction</a></dt>
-
-    <dt><a href="#features">Features</a></dt>
-
-    <dt><a href="#contents">Contents</a></dt>
-
-    <dt><a href="#building_bjam">Building Boost.Jam</a></dt>
-
-    <dt><a href="#core_extensions">Core Jam Extensions</a></dt>
-
-    <dd>
-      <dl class="index">
-        <dt><a href="#variable_quoting">Command-line and Environment Variable
-        Quoting</a></dt>
-
-        <dt><a href="#jambase_replacement">Startup Behavior</a></dt>
-
-        <dt><a href="#rule_indirection">Rule Indirection</a></dt>
-
-        <dt><a href="#argument_lists">Argument Lists</a></dt>
-
-        <dt><a href="#module_support">Module Support</a></dt>
-
-        <dd>
-          <dl class="index">
-            <dt><a href="#module_declaration">Declaration</a></dt>
-
-            <dt><a href="#module_locals">Variable Scope</a></dt>
-
-            <dt><a href="#local_rules">Local Rules</a></dt>
-
-            <dt><a href="#RULENAMES_rule">The <tt>RULENAMES</tt>
-            rule</a></dt>
-
-            <dt><a href="#VARNAMES_rule">The <tt>VARNAMES</tt> rule</a></dt>
-
-            <dt><a href="#IMPORT_rule">The <tt>IMPORT</tt> rule</a></dt>
-
-            <dt><a href="#EXPORT_rule">The <tt>EXPORT</tt> rule</a></dt>
-
-            <dt><a href="#CALLER_MODULE_rule">The
-            <tt>CALLER_MODULE</tt></a></dt>
-
-            <dt><a href="#DELETE_MODULE_rule">The <tt>DELETE_MODULE</tt>
-            rule</a></dt>
-          </dl>
-        </dd>
-
-        <dt><a href="#local_foreach">Local for Loop Variables</a></dt>
-
-        <dt><a href="#negative_indexing">Negative Indexing</a></dt>
-
-        <dt><a href="#cygwin_support">Support for Cygwin</a></dt>
-
-        <dt><a href="#BINDRULE">Target Binding Detection</a></dt>
-
-        <dt><a href="#FAIL_EXPECTED">Return Code Inversion</a></dt>
-
-        <dt><a href="#NOCARE">Ignoring Return Codes</a></dt>
-
-        <dt><a href="#RMOLD">Removing outdated targets</a></dt>
-
-        <dt><a href="#SUBST_rule">The <tt>SUBST</tt> Rule</a></dt>
-
-        <dt><a href="#JAM_VERSION">The <tt>JAM_VERSION</tt> global
-        variable</a></dt>
-
-        <dt><a href="#debugging_support">Debugging Support</a></dt>
-
-        <dd>
-          <dl class="index">
-            <dt><a href="#BACKTRACE_rule">The BACKTRACE rule</a></dt>
-
-            <dt><a href="#profiling">Profiling</a></dt>
-
-            <dt><a href="#parse_debugging">Parser Debugging</a></dt>
-
-            <dt><a href="#dependency_graph">Dependency Graph Output</a></dt>
-          </dl>
-        </dd>
-
-        <dt><a href="#UPDATE">The <tt>UPDATE</tt> rule and changes to command
-        line handling</a></dt>
-
-        <dt><a href="#semaphores">Semaphores</a></dt>
-
-        <dt><a href="#semaphores">The W32_GETREG rule</a></dt>
-      </dl>
-    </dd>
-
-    <dt><a href="#jam_fundamentals">Jam Fundamentals</a></dt>
-  </dl>
-
-  <h2><a name="introduction"></a>Introduction</h2>
-
-  <p>Boost.Jam (BJam) &nbsp;is a build tool based on FTJam, which in turn is
-  based on Perforce Jam. It contains significant improvements made to
-  facilitate its use in the Boost Build System, but should be backward
-  compatible with Perforce Jam.</p>
-
-  <p>This is version 3.1.10 of BJam and is based on version 2.4 of Jam/MR:</p>
-  <pre>
-/+\
-+\  Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.
-\+/
-This is Release 2.4 of Jam/MR, a make-like program.
-License is hereby granted to use this software and distribute it
-freely, as long as this copyright notice is retained and modifications
-are clearly marked.
-ALL WARRANTIES ARE HEREBY DISCLAIMED.
-</pre>
-
-  <h2><a name="features"></a>Features</h2>
-
-  <p>Jam is a make(1) replacement that makes building simple things simple
-  and building complicated things manageable.</p>
-
-  <p>Jam's language is expressive, making Jamfiles (c.f. Makefiles) compact.
-  Here's a sample:</p>
-  <pre>
-Main smail : main.c map.c resolve.c deliver.c
-     misc.c parser.y alias.c pw.c headers.c
-     scanner.l getpath.c str.c ;
-</pre>
-
-  <p>This builds "smail" from a dozen source files. Jam handles header file
-  dependencies automatically and on-the-fly.</p>
-
-  <p>Jam is very portable: it runs on UNIX, VMS, Mac, and NT. Most Jamfiles
-  themselves are portable, like the sample above.</p>
-
-  <p>Jam is unintrusive: it is small, it has negligible CPU overhead, and it
-  doesn't create any of its own funny files (c.f. Odin, nmake, SunOS
-  make).</p>
-
-  <p>Jam can build large projects spread across many directories in one pass,
-  without recursing, tracking the relationships among all files. Jam can do
-  this with multiple, concurrent processes.</p>
-
-  <p>Jam isn't under the blinkin GNU copyright, so you can incorporate it
-  into commercial products.</p>
-
-  <h2><a name="contents"></a>Contents</h2>
-
-  <table cellpadding="2" cellspacing="2" border="0" summary=
-  "Contents of Jam documents.">
-    <tr>
-      <td valign="top"><a href="Jam.html">Jam.html</a></td>
-
-      <td valign="top">Jam and language reference.</td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href="Porting">Porting</a></td>
-
-      <td valign="top">Notes on porting jam to wildcat platforms.</td>
-    </tr>
-  </table>
-
-  <h2><a name="building_bjam"></a>Building Boost.Jam</h2>
-
-  <p>Installing BJam after building it is simply a matter of copying the
-  generated executables someplace in your <tt>PATH</tt>. For building the
-  executables there are a set of <tt>build</tt> bootstrap scripts to
-  accomodate particular environments. The scripts take one optional argument,
-  the name of the toolset to build with. When the toolset is not given an
-  attempt is made to detect an available toolset and use that. The build
-  scripts accept these areguments:</p>
-  <pre>
-&lt;build script name&gt; [toolset]
-</pre>
-
-  <p>Running the scripts without arguments will give you the best chance of
-  success. On Windows platforms from a command console do:</p>
-  <pre>
-cd &lt;jam source location&gt;
-.\build.bat
-</pre>
-
-  <p>On Unix type platforms do:</p>
-  <pre>
-cd &lt;jam source location&gt;
-sh ./build.sh
-</pre>
-
-  <p>For the Boost.Jam source included with the Boost distribution the
-  <tt>&lt;jam source location&gt;</tt> is
-  <tt>BOOST_ROOT/tools/build/jam_src.</tt></p>
-
-  <p>If the scripts fail to detect an appropriate toolset to build with your
-  particular toolset may not be auto-detectable. In that case, you can
-  specify the toolset as the first argument, this assumes that the toolset is
-  readily available in the <tt>PATH</tt>. NOTE: The toolset used to build
-  Boost.Jam is independent of the toolsets used for Boost.Build. Only one
-  version of Boost.Jam is needed to use Boost.Build. The supported toolsets,
-  and wether they are auto-detected, are:</p>
-
-  <table cellpadding="2" cellspacing="2" border="1" summary=
-  "Bootstrap supported platforms and toolsets.">
-    <tr>
-      <th valign="top">Script</th>
-
-      <th valign="top">Platforms</th>
-
-      <th valign="top">Toolsets</th>
-
-      <th valign="top">Detection</th>
-    </tr>
-
-    <tr>
-      <td valign="top" rowspan="9" colspan="1"><tt>build.bat</tt></td>
-
-      <td valign="top" rowspan="9" colspan="1">Windows NT, 2000, and XP</td>
-
-      <td valign="top"><a href=
-      "http://www.comeaucomputing.com"><tt>como</tt></a>, Comeau.Computing
-      C/C++</td>
-
-      <td valign="top"></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href=
-      "http://www.borland.com/bcppbuilder/freecompiler"><tt>borland</tt></a>,
-      <a href="http://www.borland.com/">Borland</a> C++Builder (BCC 5.5)</td>
-
-      <td valign="top">* Common install location:
-      <tt>"C:\Borland\BCC55"</tt><br>
-      * <tt>BCC32.EXE</tt> in <tt>PATH</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href="http://gcc.gnu.org">gcc</a>, GNU GCC</td>
-
-      <td valign="top"></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href="http://gcc.gnu.org">gcc-nocygwin</a>, GNU
-      GCC</td>
-
-      <td valign="top"></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href=
-      "http://www.intel.com/software/products/compilers/c60"><tt>intel-win32</tt></a>,
-      Intel C++ Compiler for Windows</td>
-
-      <td valign="top">* <tt>ICL.EXE</tt> in <tt>PATH</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href=
-      "http://www.metrowerks.com"><tt>metrowerks</tt></a>, MetroWerks
-      CodeWarrior C/C++ 7.x, 8.x</td>
-
-      <td valign="top">* <tt>CWFolder</tt> variable configured<br>
-      * <tt>MWCC.EXE</tt> in <tt>PATH</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href="http://www.mingw.org">mingw</a>, GNU <a href=
-      "http://gcc.gnu.org">GCC</a> as the <a href=
-      "http://www.mingw.org">MinGW</a> configuration</td>
-
-      <td valign="top">* Common install location: <tt>"C:\MinGW"</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href="http://msdn.microsoft.com/visualc/">msvc</a>,
-      Microsoft Visual C++ 6.x</td>
-
-      <td valign="top">* <tt>VCVARS32.BAT</tt> already configured<br>
-      * Common install locations: <tt>"C:\Program Files\Microsoft Visual
-      Studio"</tt>, <tt>"C:\Program Files\Microsoft Visual C++"<br></tt> *
-      <tt>CL.EXE</tt> in <tt>PATH</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href="http://msdn.microsoft.com/visualc/">vc7</a>,
-      Microsoft Visual C++ 7.x</td>
-
-      <td valign="top">* <tt>VCVARS32.BAT</tt> or <tt>VSVARS32.BAT</tt>
-      already configured<br>
-      * Common install location: <tt>"C:\Program Files\Microsoft Visual
-      Studio .NET"</tt><br>
-      * Common install location: <tt>"C:\Program Files\Microsoft Visual
-      Studio .NET 2003"</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top" rowspan="11" colspan="1"><tt>build.sh</tt></td>
-
-      <td valign="top" rowspan="10" colspan="1">Unix, Linux, Cygwin,
-      etc.</td>
-
-      <td valign="top"><a href="http://www.hp.com/go/c++">acc</a>, HP-UX
-      aCC</td>
-
-      <td valign="top">* <tt>aCC</tt> in <tt>PATH</tt><br>
-      * <tt>uname</tt> is "HP-UX"</td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href="http://www.comeaucomputing.com">como</a>,
-      Comeau.Computing C/C++</td>
-
-      <td valign="top">* <tt>como</tt> in <tt>PATH</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href="http://gcc.gnu.org">gcc</a>, GNU GCC</td>
-
-      <td valign="top">* <tt>gcc</tt> in <tt>PATH</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href=
-      "http://www.intel.com/software/products/compilers/c60l/">intel-linux</a>,
-      Intel C++ for Linux</td>
-
-      <td valign="top">* <tt>icc</tt> in <tt>PATH</tt><br>
-      * Common install locations: <tt>"/opt/intel/compiler70"</tt>,
-      <tt>"/opt/intel/compiler60"</tt>, <tt>"/opt/intel/compiler50"</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href=
-      "http://developer.intel.com/software/products/kcc/">kcc</a>, Intel KAI
-      C++</td>
-
-      <td valign="top">* <tt>KCC</tt> in <tt>PATH</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href=
-      "http://www.borland.com/bcppbuilder/freecompiler"><tt>kylix</tt></a>,
-      <a href="http://www.borland.com/">Borland</a> C++Builder</td>
-
-      <td valign="top">* <tt>bc++</tt> in <tt>PATH</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href=
-      "http://www.sgi.com/developers/devtools/languages/mipspro.html">mipspro</a>,
-      SGI MIPSpro C</td>
-
-      <td valign="top"></td>
-    </tr>
-
-    <tr>
-      <td valign="top">sunpro, Sun Workshop 6 C++</td>
-
-      <td valign="top">* Standard install location:
-      <tt>"/opt/SUNWspro"</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href=
-      "http://www.tru64unix.compaq.com/cplus/">true64cxx</a>, Compaq C++
-      Compiler for True64 UNIX</td>
-
-      <td valign="top"></td>
-    </tr>
-
-    <tr>
-      <td valign="top"><a href=
-      "http://www-3.ibm.com/software/ad/vacpp/">vacpp</a>, IBM VisualAge
-      C++</td>
-
-      <td valign="top">* <tt>xlc</tt> in <tt>PATH</tt></td>
-    </tr>
-
-    <tr>
-      <td valign="top">MacOS X<br></td>
-
-      <td valign="top"><a href=
-      "http://developer.apple.com/tools/compilers.html">darwin</a>, Apple
-      MacOS X GCC</td>
-
-      <td valign="top">* <tt>uname</tt> is <tt>"Darwin"</tt></td>
-    </tr>
-  </table>
-
-  <p>The built executables are placed in a subdirectory specific to your
-  platform. For example, in Linux running on an Intel x86 compatible chip,
-  the executables are placed in: <tt>"bin.linuxx86"</tt>. There are two
-  executables generated: <tt>jam[.exe]</tt>, and <tt>bjam[.exe]</tt>, both
-  are the same binary but with different names. The "jam" invocation is used
-  for compatability with the Perforce Jam/MR functionality, whereas "bjam" is
-  used for the extended Boost.Build functionality.</p>
-
-  <p>The <tt>build</tt> scripts support additional invocation arguments for
-  use by developers of Boost.Jam. The extra arguments come after the toolset,
-  and can take the form of <tt>"--option"</tt> or targets for the
-  <tt>build.jam</tt> script:</p>
-  <pre>
-&lt;build script name&gt; [toolset] [--option+ target*]
-</pre>
-
-  <p>There is current only one available option, <tt>"--debug"</tt>, which
-  builds debugging versions of the executable. When built they are placed in
-  their own directory <tt>"bin.&lt;platform&gt;.debug"</tt>. To specify
-  targets without options, one can suply a special ignore option
-  <tt>"---"</tt>.</p>
-
-  <p>Currently there are two targets supported: <tt>dist</tt>, and
-  <tt>clean</tt>. Respectively they: generate packages (compressed archives)
-  as appropriate for distribution in the platform, or remove all the built
-  executables and objects.</p>
-
-  <h2><a name="core_extensions">Core Jam Extensions</a></h2>
-
-  <p>A number of enhancements have been made to the core language of Classic
-  Jam. These changes were aimed primarily at making it easier to manage the
-  complexity of a large system such as Boost.Build.</p>
-
-  <h3><a name="variable_quoting"></a>Command-line and Environment Variable
-  Quoting</h3>
-
-  <p>Classic Jam had an <a href="#variable_splitting">odd behavior</a> with
-  respect to command-line variable ( <tt>-s...</tt>) and environment variable
-  settings which made it impossible to define an arbitrary variable with
-  spaces in the value. Boost Jam remedies that by treating all such settings
-  as a single string if they are surrounded by double-quotes. Uses of this
-  feature can look interesting, since shells require quotes to keep
-  characters separated by whitespace from being treated as separate
-  arguments:</p>
-  <pre>
-jam -sMSVCNT="\"\"C:\Program Files\Microsoft Visual C++\VC98\"\"" ...
-</pre>
-
-  <p>The outer quote is for the shell. The middle quote is for Jam, to tell
-  it to take everything within those quotes literally, and the inner quotes
-  are for the shell again when paths are passed as arguments to build
-  actions. Under NT, it looks a lot more sane to use environment variables
-  before invoking jam when you have to do this sort of quoting:</p>
-  <pre>
-set MSVCNT=""C:\Program Files\Microsoft Visual C++\VC98\""
-</pre>
-
-  <h3><a name="jambase_replacement">Startup Behavior</a></h3>
-
-  <p>The Boost.Build v2 initialization behavior has been implemented. This
-  behavior only applies when the executable being invoked is called
-  "<code>bjam</code>" or, for backward-compatibility, when the
-  <code>BOOST_ROOT</code> variable is set.</p>
-
-  <ol>
-    <li>We attempt to load "boost-build.jam" by searching from the current
-    invocation directory up to the root of the file-system. This file is
-    expected to invoke the <tt>boost-build</tt> rule to indicate where the
-    Boost.Build system files are, and to load them.</li>
-
-    <li>If boost-build.jam is not found we error and exit, giving brief
-    instructions on possible errors.
-
-      <blockquote>
-        As a backward-compatibility measure for older versions of
-        Boost.Build, when the <code>BOOST_ROOT</code> variable is set, we
-        first search for <code>boost-build.jam</code> in
-        <code>$(BOOST_ROOT)/tools/build</code> and
-        <code>$(BOOST_BUILD_PATH)</code>. If found, it is loaded and
-        initialization is complete.
-      </blockquote>
-    </li>
-
-    <li>The <code>boost-build</code> rule adds its (optional) argument to the
-    front of <code>BOOST_BUILD_PATH</code>, and attempts to load
-    <code>bootstrap.jam</code> from those directories. If a relative path is
-    specified as an argument, it is treated as though it was relative to the
-    <code>boost-build.jam</code> file.</li>
-
-    <li>If the bootstrap.jam file was not found, we print a likely error
-    message and exit.</li>
-  </ol>
-
-  <h3><a name="rule_indirection">Rule Indirection</a></h3>
-
-  <p>Boost Jam allows you to call a rule whose name is held in a variable or
-  computed as the result of an expression:</p>
-  <pre>
-x = foo ;
-rule foobar { ECHO foobar ; }   # a trivial rule
-$(x)bar ;                       # invokes foobar
-</pre>
-
-  <p>Furthermore, if the first expression expands to more than one list item,
-  everything after the first item becomes part of the first argument. This
-  allows a crude form of argument binding:</p>
-  <pre>
-# return the elements of sequence for which predicate returns non-nil
-rule filter ( sequence * : predicate + )
-{
-    local result ;
-    for local x in $(sequence)
-    {
-        if [ $(predicate) $(x) ] { result += $(x); }
-    }
-    return $(result);
-}
-# true iff x == y
-rule equal ( x y )
-{
-    if $(x) = $(y) { return true; }
-}
-# bind 3 to the first argument of equal
-ECHO [ filter 1 2 3 4 5 4 3 : equal 3 ] ; # prints "3 3"
-</pre>
-
-  <h3><a name="argument_lists">Argument lists</a></h3>
-
-  <p>You can now describe the arguments accepted by a rule, and refer to them
-  by name within the rule. For example, the following prints ``I'm sorry,
-  Dave'' to the console:</p>
-  <pre>
-rule report ( pronoun index ? : state : names + )
-{
-    local he.suffix she.suffix it.suffix = s ;
-    local I.suffix = m ;
-    local they.suffix you.suffix = re ;
-    ECHO $(pronoun)'$($(pronoun).suffix) $(state), $(names[$(index)]) ;
-}
-report I 2 : sorry : Joe Dave Pete ;
-</pre>
-
-  <p>Each name in a list of formal arguments (separated by ``<tt>:</tt>'' in
-  the rule declaration) is bound to a single element of the corresponding
-  actual argument unless followed by one of these modifiers:</p>
-
-  <table border="1" summary="Argument modifiers">
-    <tr>
-      <th>Symbol</th>
-
-      <th>Semantics of preceding symbol</th>
-    </tr>
-
-    <tr>
-      <td><tt>?</tt></td>
-
-      <td>optional</td>
-    </tr>
-
-    <tr>
-      <td><tt>*</tt></td>
-
-      <td>Bind to zero or more unbound elements of the actual argument. When
-      ``<tt>*</tt>'' appears where an argument name is expected, any number
-      of additional arguments are accepted. This feature can be used to
-      implement "varargs" rules.</td>
-    </tr>
-
-    <tr>
-      <td><tt>+</tt></td>
-
-      <td>Bind to one or more unbound elements of the actual argument.</td>
-    </tr>
-  </table>
-
-  <p>The actual and formal arguments are checked for inconsistencies, which
-  cause Jam to exit with an error code:</p>
-  <pre>
-### argument error
-# rule report ( pronoun index ?  : state  : names + )
-# called with: ( I 2 foo  : sorry  : Joe Dave Pete )
-# extra argument foo
-### argument error
-# rule report ( pronoun index ?  : state  : names + )
-# called with: ( I 2  : sorry )
-# missing argument names
-</pre>
-
-  <p>If you omit the list of formal arguments, all checking is bypassed as in
-  ``classic'' Jam. Argument lists drastically improve the reliability and
-  readability of your rules, however, and are <b>strongly recommended</b> for
-  any new Jam code you write.</p>
-
-  <h3><a name="module_support">Module Support</a></h3>
-
-  <p>Boost Jam introduces support for modules, which provide some rudimentary
-  namespace protection for rules and variables. A new keyword,
-  ``<tt>module</tt>'' was also introduced. The features described in this
-  section are <i>primitives</i>, meaning that they are meant to provide the
-  operations needed to write Jam rules which provide a more elegant module
-  interface.</p>
-
-  <h4><a name="module_declaration">Declaration</a></h4>
-  <pre>
-module <i>expression</i> { ... }
-</pre>
-
-  <p>Code within the <tt>{</tt> ... <tt>}</tt> executes within the module
-  named by evaluating <i>expression</i>. Rule definitions can be found in the
-  module's own namespace, and in the namespace of the global module as
-  <i>module-name</i><tt>.</tt><i>rule-name</i>, so within a module, other
-  rules in that module may always be invoked without qualification:</p>
-  <pre>
-<b>module my_module
-{</b>
-    rule salute ( x ) { ECHO $(x), world ; }
-    rule greet ( ) { salute hello ; }
-    greet ;
-<b>}
-my_module.salute</b> goodbye ;
-</pre>
-
-  <p>When an invoked rule is not found in the current module's namespace, it
-  is looked up in the namespace of the global module, so qualified calls work
-  across modules:</p>
-  <pre>
-module your_module
-{
-    rule bedtime ( ) { <b>my_module.salute</b> goodnight ; }
-}
-</pre>
-
-  <h4><a name="module_locals">Variable Scope</a></h4>
-
-  <p>Each module has its own set of dynamically nested variable scopes. When
-  execution passes from module A to module B, all the variable bindings from
-  A become unavailable, and are replaced by the bindings that belong to B.
-  This applies equally to local and global variables:</p>
-  <pre>
-module A
-{
-    x = 1 ;
-    rule f ( )
-    {
-        local y = 999 ; # becomes visible again when B.f calls A.g
-        B.f ;
-    }
-    rule g ( )
-    {
-        ECHO $(y) ;     # prints "999"
-    }
-}
-module B
-{
-    y = 2 ;
-    rule f ( )
-    {
-        ECHO $(y) ; # always prints "2"
-        A.g ;
-    }
-}
-</pre>
-
-  <p>The only way to access another module's variables is by entering that
-  module:</p>
-  <pre>
-rule peek ( module-name ? : variables + )
-{
-    module $(module-name)
-    {
-        return $($(&gt;)) ;
-    }
-}
-</pre>Note that because existing variable bindings change whenever a new
-module scope is entered, argument bindings become unavailable. That explains
-the use of "<code>$(&gt;)</code>" in the <code>peek</code> rule above.
-
-  <h4><a name="local_rules">Local Rules</a></h4>
-  <pre>
-local rule <i>rulename...</i>
-</pre>
-
-  <p>The rule is declared locally to the current module. It is not entered in
-  the global module with qualification, and its name will not appear in the
-  result of:</p>
-  <pre>
-[ RULENAMES <i>module-name</i> ]
-</pre>
-
-  <h4><a name="RULENAMES_rule">The <tt>RULENAMES</tt> Rule</a></h4>
-  <pre>
-rule RULENAMES ( module ? )
-</pre>
-
-  <p>Returns a list of the names of all non-local rules in the given module.
-  If <tt>module</tt> is omitted, the names of all non-local rules in the
-  global module are returned.</p>
-
-  <h4><a name="VARNAMES_rule">The <tt>VARNAMES</tt> Rule</a></h4>
-  <pre>
-rule VARNAMES ( module ? )
-</pre>
-
-  <p>Returns a list of the names of all variable bindings in the given
-  module. If <tt>module</tt> is omitted, the names of all variable bindings
-  in the global module are returned. <b>Note:</b>this includes any local
-  variables in rules from the call stack which have not returned at the time
-  of the <code>VARNAMES</code> invocation.</p>
-
-  <h4><a name="IMPORT_rule">The <tt>IMPORT</tt> Rule</a></h4>
-
-  <p><tt>IMPORT</tt> allows rule name aliasing across modules:</p>
-  <pre>
-rule IMPORT ( source_module ? : source_rules *
-            : target_module ? : target_rules * )
-</pre>
-
-  <p>The <tt>IMPORT</tt> rule copies rules from the <tt>source_module</tt>
-  into the <tt>target_module</tt> as <tt>local</tt> rules. If either
-  <tt>source_module</tt> or <tt>target_module</tt> is not supplied, it refers
-  to the global module. <tt>source_rules</tt> specifies which rules from the
-  <tt>source_module</tt> to import; <tt>TARGET_RULES</tt> specifies the names
-  to give those rules in <tt>target_module</tt>. If <tt>source_rules</tt>
-  contains a name which doesn't correspond to a rule in
-  <tt>source_module</tt>, or if it contains a different number of items than
-  <tt>target_rules</tt>, an error is issued. For example,</p>
-  <pre>
-# import m1.rule1 into m2 as local rule m1-rule1.
-IMPORT m1 : rule1 : m2 : m1-rule1 ;
-# import all non-local rules from m1 into m2
-IMPORT m1 : [ RULENAMES m1 ] : m2 : [ RULENAMES m1 ] ;
-</pre>
-
-  <h4><a name="EXPORT_rule">The <tt>EXPORT</tt> Rule</a></h4>
-
-  <p><tt>EXPORT</tt> allows rule name aliasing across modules:</p>
-  <pre>
-rule EXPORT ( module ? : rules * )
-</pre>
-
-  <p>The <tt>EXPORT</tt> rule marks <tt>rules</tt> from the
-  <tt>source_module</tt> as non-local (and thus exportable). If an element of
-  <tt>rules</tt> does not name a rule in <tt>module</tt>, an error is issued.
-  For example,</p>
-  <pre>
-module X {
-  local rule r { ECHO X.r ; }
-}
-IMPORT X : r : : r ; # error - r is local in X
-EXPORT X : r ;
-IMPORT X : r : : r ; # OK.
-</pre>
-
-  <h4><a name="CALLER_MODULE_rule">The <tt>CALLER_MODULE</tt> Rule</a></h4>
-  <pre>
-rule CALLER_MODULE ( levels ? )
-</pre>
-
-  <p><tt>CALLER_MODULE</tt> returns the name of the module scope enclosing
-  the call to its caller (if levels is supplied, it is interpreted as an
-  integer number of additional levels of call stack to traverse to locate the
-  module). If the scope belongs to the global module, or if no such module
-  exists, returns the empty list. For example, the following prints "{Y}
-  {X}":</p>
-  <pre>
-module X {
-    rule get-caller { return [ CALLER_MODULE ] ; }
-    rule get-caller's-caller { return [ CALLER_MODULE 1 ] ; }
-    rule call-Y { return Y.call-X2 ; }
-}
-module Y {
-    rule call-X { return X.get-caller ; }
-    rule call-X2 { return X.get-caller's-caller ; }
-}
-callers = [ X.get-caller ] [ Y.call-X ] [ X.call-Y ] ;
-ECHO {$(callers)} ;
-</pre>
-
-  <h4><a name="DELETE_MODULE_rule">The <tt>DELETE_MODULE</tt> Rule</a></h4>
-  <pre>
-rule DELETE_MODULE ( module ? )
-</pre>
-
-  <p><tt>DELETE_MODULE</tt> removes all of the variable bindings and
-  otherwise-unreferenced rules from the given module (or the global module,
-  if no module is supplied), and returns their memory to the system.
-  <b>Note:</b> though it won't affect rules that are currently executing
-  until they complete, <code>DELETE_MODULE</code> should be used with extreme
-  care because it will wipe out any others and all variable (including locals
-  in that module) immediately. Because of the way dynamic binding works,
-  variables which are shadowed by locals will not be destroyed, so the
-  results can be really unpredictable.</p>
-
-  <h3><a name="local_foreach">Local For Loop Variables</a></h3>
-
-  <p>Boost Jam allows you to declare a local <tt>for</tt> loop control
-  variable right in the loop:</p>
-  <pre>
-x = 1 2 3 ;
-y = 4 5 6 ;
-for <b>local</b> y in $(x)
-{
-    ECHO $(y) ; # prints "1", "2", or "3"
-}
-ECHO $(y) ;     # prints "4 5 6"
-</pre>
-
-  <h4><a name="negative_indexing">Negative Indexing</a></h4>
-
-  <p>Classic Jam supplies 1-based list indexing, and slicing on a closed
-  (inclusive) range:</p>
-  <pre>
-x = 1 2 3 4 5 ;
-ECHO $(x[3]) ;   # prints "3"
-ECHO $(x[2-4]) ; # prints "2 3 4"
-ECHO $(x[2-]) ;  # prints "2 3 4 5"
-</pre>
-
-  <p>Boost Jam adds Python-style negative indexing to access locations
-  relative to the <i>end</i> of the list.</p>
-  <pre>
-ECHO $(x[-1]) $(x[-3]) ; # prints "5 3"
-ECHO $(x[-3--1]) ;       # prints "3 4 5"
-ECHO $(x[-3-4]) ;        # prints "3 4"
-ECHO $(x[2--2]) ;        # prints "2 3 4"       
-</pre>
-
-  <p>Consistency with the 1-based, inclusive indexing of Classic Jam and the
-  use of ``<tt>-</tt>'' as the range separator make this feature a bit
-  clumsier than it would otherwise need to be, but it does work.</p>
-
-  <h4><a name="cygwin_support">Support for Cygwin</a></h4>
-
-  <p>When invoking Windows-based tools from <a href=
-  "www.cygwin.com">Cygwin</a> it can be important to pass them true
-  windows-style paths. Boost.Jam supplies the <code>:W</code> modifier which,
-  <em>under Cygwin only</em>, turns a cygwin path into a Win32 path using the
-  <a href=
-  "http://www.cygwin.com/cygwin-api/func-cygwin-conv-to-win32-path.html"><code>
-  cygwin_conv_to_win32_path</code></a> function. On other platforms, the
-  string is unchanged.</p>
-  <pre>
-x = /cygdrive/c/Program Files/Borland ;
-ECHO $(x:W) ; # prints "c:\Program Files\Borland" on Cygwin
-</pre>
-
-  <h4><a name="BINDRULE">Target Binding Detection</a></h4>
-
-  <p>Whenever a target is <a href="#binding">bound</a> to a location in the
-  filesystem, Boost Jam will look for a variable called <tt>BINDRULE</tt>
-  (first ``<tt>on</tt>'' the target being bound, then in the global module).
-  If non-empty, <tt>$(BINDRULE[1])</tt> names a rule which is called with the
-  name of the target and the path it is being bound to. The signature of the
-  rule named by <tt>$(BINDRULE[1])</tt> should match the following:</p>
-  <pre>
-rule bind-rule ( target : path )
-</pre>
-
-  <p>This facility is useful for correct header file scanning, since many
-  compilers will search for <tt>#include</tt>d files first in the directory
-  containing the file doing the <tt>#include</tt> directive.
-  <tt>$(BINDRULE)</tt> can be used to make a record of that directory.</p>
-
-  <h4><a name="FAIL_EXPECTED">Return Code Inversion</a></h4>
-
-  <p>For handling targets whose build actions are expected to fail (e.g. when
-  testing that assertions or compile-time type checkin work properly), Boost
-  Jam supplies a <tt>FAIL_EXPECTED</tt> rule in the same style as
-  <tt>NOCARE</tt>, et. al. During target updating, the return code of the
-  build actions for arguments to <tt>FAIL_EXPECTED</tt> is inverted: if it
-  fails, building of dependent targets continues as though it succeeded. If
-  it succeeds, dependent targets are skipped.</p>
-
-  <h4><a name="NOCARE">Ignoring Return Codes</a></h4>
-
-  <p>Perforce Jam supplied a <tt>NOCARE</tt> rule which is typically used for
-  header files to indicate that if they are not found, the dependent targets
-  should be built anyway. Boost Jam extends <tt>NOCARE</tt> to apply to
-  targets with build actions: if their build actions exit with a nonzero
-  return code, dependent targets will still be built.</p>
-
-  <h4><a name="RMOLD">Removing Outdated Targets</a></h4>
-  <pre>
-rule RMOLD ( targets * )
-</pre>
-
-  <p>Perforce Jam removes any target files that may exist on disk when the
-  rule used to build those targets fails. However, targets whose dependencies
-  fail to build are not removed by default. The <code>RMOLD</code> rule
-  causes its arguments to be removed if any of their dependencies fail to
-  build.</p>
-
-  <h3><a name="SUBST_rule">The <tt>SUBST</tt> Rule</a></h3>
-
-  <p><b>Note:</b> the <code>SUBST</code> rule is deprecated in favor of
-  Perforce Jam's built-in <code>MATCH</code> rule, which has been rolled into
-  Boost.Jam.</p>
-
-  <p>The behavior of the <tt>SUBST</tt> rule for regular-expression matching
-  and replacement (originally added in <a href=
-  "http://freetype.sourceforge.net/jam/index.html">FTJam</a>) has been
-  modified:</p>
-
-  <ul>
-    <li>One or more replacement patterns may be supplied. The new signature
-    for <tt>SUBST</tt> is:
-      <pre>
-SUBST ( source pattern replacements + )
-</pre>The return value is the concatenated results of applying each element
-of <tt>replacements</tt> in turn. For example, the following will print
-``<tt>[x] (y) {z}</tt>'':
-      <pre>
-ECHO [ SUBST xyz (.)(.)(.) [$1] ($2) {$3} ] ;
-</pre>
-    </li>
-
-    <li>If there is no match, <tt>SUBST</tt> now returns an empty list. In
-    FTJam, the original <tt>source</tt> string was returned, making it
-    awkward to check whether a pattern was matched.</li>
-
-    <li>Compiled regular expressions are now internally cached, making it
-    much faster to use <tt>SUBST</tt> multiple times with the same
-    string.</li>
-  </ul>
-
-  <h3><a name="JAM_VERSION">The <tt>JAM_VERSION</tt> global variable</a></h3>
-
-  <p>A predefined global variable with two elements indicates the version
-  number of Boost Jam. Boost Jam versions start at <tt>"03" "00"</tt>.
-  Earlier versions of Jam do not automatically define
-  <tt>JAM_VERSION</tt>.</p>
-
-  <h3><a name="debugging_support">Debugging Support</a></h3>
-
-  <h4><a name="BACKTRACE_rule">The BACKTRACE rule</a></h4>
-  <pre>
-rule BACKTRACE ( )
-</pre>
-
-  <p>Returns a list of quadruples: <i>filename line module rulename</i>...,
-  describing each shallower level of the call stack. This rule can be used to
-  generate useful diagnostic messages from Jam rules.</p>
-
-  <p>The <tt>-d</tt> command-line option admits new arguments:</p>
-
-  <ul>
-    <li><tt>-d+10</tt> - enables <a name="profiling"><b>profiling</b></a> of
-    rule invocations. When Jam exits, it dumps all rules invoked, their gross
-    and net times in platform-dependent units, and the number of times the
-    rule was invoked.</li>
-
-    <li><tt>-d+11</tt> - enables <a name="parse_debugging"><b>parser
-    debugging</b></a>, if Jam has been compiled with the "--debug" option to
-    the parser generator named by $(YACC).</li>
-
-    <li><tt>-d+12</tt> - enables <a name="dependency_graph"><b>dependency
-    graph output</b></a> . This feature was ``stolen'' from a version of Jam
-    modified by <a href="mailto:cmcpheeters at aw.sgi.com">Craig
-    McPheeters</a>.</li>
-  </ul>
-
-  <h3><a name="UPDATE">The <tt>UPDATE</tt> rule and changes to command line
-  handling</a></h3>
-
-  <p>Classic jam treats any non-option element of command line as a name of
-  target to be updated. This prevented more sophisticated handling of command
-  line. This is now enabled again but with additional changes to the
-  <tt>UPDATE&gt;</tt> rule to allow for the flexibility of changing the list
-  of targets to update. The <tt>UPDATE</tt> builtin rule is:</p>
-  <pre>
-rule UPDATE ( targets * )
-</pre>
-
-  <p>The rule has two effects: 1. it clears the list of targets to update,
-  and 2. causes the specified targets to be updated. If no target was
-  specified with the <tt>UPDATE</tt> rule, no targets will be updated. To
-  support changing of the update list in more usefull ways, the rule also
-  returns the targets previously in the update list. This makes it possible
-  to add targets as such:</p>
-  <pre>
-local previous-updates = [ UPDATE ] ;
-UPDATE $(previous-updates) a-new-target ;
-</pre>
-
-  <h3 id="semaphores">Semaphores</h3>
-
-  <p>It is sometimes desirable to disallow parallel execution of some
-  actions. For example:</p>
-
-  <ul>
-    <li>Old versions of <tt>yacc</tt> use files with fixed names. So, running
-    two yacc actions is dangerous.</li>
-
-    <li>One might want to perform parallel compiling, but not do parallel
-    linking, because linking is i/o bound and only gets slower.</li>
-  </ul>Craig McPeeters has extended Perforce Jam to solve such problems, and
-  that extension was integrated in Boost.Jam.
-
-  <p>Any target can be assigned a <em>semaphore</em>, by setting a variable
-  called <tt>SEMAPHORE</tt> on that target. The value of the variable is the
-  semaphore name. It must be different from names of any declared target, but
-  is arbitrary otherwise.</p>
-
-  <p>The semantic of semaphores is that in a group of targets which have the
-  same semaphore, only one can be updated at the moment, regardless of "-j"
-  option.</p>
-
-  <h3 id="w32_getreg">The W32_GETREG rule</h3>
-<pre>
-    rule W32_GETREG ( path : data ? )
-</pre>
-
-<p>    
-    Defined only for win32 platform. It reads the registry of Windows.
-    'path' is the location of the information, and 'data' is
-    the name of the value which we want to get. If 'data' is omitted,
-    the default value of 'path' will be returned. The 'path' value
-    must conform to MS key path format and must be prefixed with
-    one of the predefined root keys. As usual,
-
-<ul>    
-    <li>'HKLM' is equivalent to 'HKEY_LOCAL_MACHINE'.
-    <li>'HKCU' is equivalent to 'HKEY_CURRENT_USER'.
-    <li>'HKCR' is equivalent to 'HKEY_CLASSES_ROOT'.
-</ul>    
-    
-<p>    
-    Other predefined root keys are not supported.    
-<p>    
-    Currently supported data types : 'REG_DWORD', 'REG_SZ',
-    'REG_EXPAND_SZ', 'REG_MULTI_SZ'. The data with 'REG_DWORD' type
-    will be turned into a string, 'REG_MULTI_SZ' into a list of strings,
-    and for those with 'REG_EXPAND_SZ' type environment variables
-    in it will be replaced with their defined values.
-    The data with 'REG_SZ' type and other unsupported types
-    will be put into a string without modification. If it can't
-    receive the value of the data, it just return an empty list.
-    For example,
-
-<pre>
-    local PSDK-location =
-    [ PROFILE HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MicrosoftSDK\\Directories : "Install Dir" ] ;
-</pre>
-
-  <h2><a name="jam_fundamentals">Jam Fundamentals</a></h2>
-
-  <p>This section is derived from the official Jam documentation and from my
-  experience using it and reading the Jambase rules. I repeat the information
-  here mostly because it is essential to understanding and using Jam, but is
-  not consolidated in a single place. Some of it is missing from the official
-  documentation altogether. I hope it will be useful to anyone wishing to
-  become familiar with Jam and the Boost build system.</p>
-
-  <p>&middot; Jam ``<b>rules</b>'' are actually simple procedural entities.
-  Think of them as functions. Arguments are separated by colons.</p>
-
-  <p>&middot; A Jam <b>target</b> is an abstract entity identified by an
-  arbitrary string. The build-in <tt>DEPENDS</tt> rule creates a link in the
-  dependency graph between the named targets.</p>
-
-  <p>&middot; Note that the documentation for the built-in <tt>INCLUDES</tt>
-  rule is incorrect: <tt>INCLUDES targets1 : targets2</tt> causes everything
-  that depends on a member of <i>targets1</i> to depend on all members of
-  <i>targets2</i>. It does this in an odd way, by tacking <i>targets2</i>
-  onto a special tail section in the dependency list of everything in
-  <i>targets1</i>. It seems to be OK to create circular dependencies this
-  way; in fact, it appears to be the ``right thing to do'' when a single
-  build action produces both <i>targets1</i> and <i>targets2</i>.</p>
-
-  <p>&middot; When a rule is invoked, if there are <b><tt>actions</tt></b>
-  declared with the same name as the rule, the <tt>actions</tt> are added to
-  the updating actions for the target identified by the rule's first
-  argument. It is actually possible to invoke an undeclared rule if
-  corresponding actions are declared: the rule is treated as empty.</p>
-
-  <p>&middot; <a name="binding">Targets</a> (other than <tt>NOTFILE</tt>
-  targets) are associated with paths in the file system through a process
-  called <a href="./Jam.html#binding">binding</a>. Binding is a process of
-  searching for a file with the same name as the target (sans grist), based
-  on the settings of the <a href="#target_specific">target-specific</a>
-  <tt>SEARCH</tt> and <tt>LOCATE</tt> variables.</p>
-
-  <p>&middot; <a name="target_specific">In addition to</a> local and global
-  variables, jam allows you to set a variable <tt><b>on</b></tt> a target.
-  Target-specific variable values can usually not be read, and take effect
-  <i>only</i> in the following contexts:</p>
-
-  <ul>
-    <li>In updating <tt>actions</tt>, variable values are first looked up
-    <tt><b>on</b></tt> the target named by the first argument (the target
-    being updated). Because Jam builds its entire dependency tree before
-    executing <tt>actions</tt>, Jam rules make target-specific variable
-    settings as a way of supplying parameters to the corresponding
-    <tt>actions</tt>.</li>
-
-    <li>Binding is controlled <i>entirely</i> by the target-specific setting
-    of the <tt>SEARCH</tt> and <tt>LOCATE</tt> variables, as described
-    <a href="./Jam.html#search">here</a>.</li>
-
-    <li>In the special rule used for <a href="./Jam.html#hdrscan">header file
-    scanning</a>, variable values are first looked up <tt><b>on</b></tt> the
-    target named by the rule's first argument (the source file being
-    scanned).</li>
-  </ul>
-
-  <p>&middot; The ``<b>bound value</b>'' of a variable is the path associated
-  with the target named by the variable. In build <tt>actions</tt>, the first
-  two arguments are automatically replaced with their bound values.
-  Target-specific variables can be selectively replaced by their bound values
-  using the <a href="./Jam.html#actionmods">bind</a> action modifier.</p>
-
-  <p>&middot; Note that the term ``binding'' as used in the Jam documentation
-  indicates a phase of processing that includes three sub-phases:
-  <i>binding</i> (yes!), update determination, and header file scanning. The
-  repetition of the term ``binding'' can lead to some confusion. In
-  particular, the <a href="./Jam.html#bindingmods">Modifying Binding</a>
-  section in the Jam documentation should probably be titled ``Modifying
-  Update Determination''.</p>
-
-  <p>&middot; ``Grist'' is just a string prefix of the form
-  <tt>&lt;</tt><i>characters</i><tt>&gt;</tt>. It is used in Jam to create
-  unique target names based on simpler names. For example, the file name
-  ``<tt>test.exe</tt>'' may be used by targets in separate subprojects, or
-  for the debug and release variants of the ``same'' abstract target. Each
-  distinct target bound to a file called ``<tt>test.exe</tt>'' has its own
-  unique grist prefix. The Boost build system also takes full advantage of
-  Jam's ability to divide strings on grist boundaries, sometimes
-  concatenating multiple gristed elements at the beginning of a string. Grist
-  is used instead of identifying targets with absolute paths for two
-  reasons:</p>
-
-  <ol>
-    <li>The location of targets cannot always be derived solely from what the
-    user puts in a Jamfile, but sometimes depends also on the <a href=
-    "#binding">binding</a> process. Some mechanism to distinctly identify
-    targets with the same name is still needed.</li>
-
-    <li>Grist allows us to use a uniform abstract identifier for each built
-    target, regardless of target file location (as allowed by setting
-    <tt>ALL_LOCATE_TARGET</tt>.</li>
-  </ol>
-
-  <p>When grist is extracted from a name with
-  <tt>$(</tt><i>var</i><tt>:G)</tt>, the result includes the leading and
-  trailing angle brackets. When grist is added to a name with
-  <tt>$(</tt><i>var</i><tt>:G=</tt><i>expr</i><tt>)</tt>, existing grist is
-  first stripped. Then, if <i>expr</i> is non-empty, leading <tt>&lt;</tt>s
-  and trailing <tt>&gt;</tt>s are added if necessary to form an expression of
-  the form <tt>&lt;</tt><i>expr2</i><tt>&gt;</tt>;
-  <tt>&lt;</tt><i>expr2</i><tt>&gt;</tt> is then prepended.</p>
-
-  <p>&middot; <a name="variable_splitting">When Jam</a> is invoked it imports
-  all environment variable settings into corresponding Jam variables,
-  followed by all command-line (<tt>-s...</tt>) variable settings. Variables
-  whose name ends in <tt>PATH</tt>, <tt>Path</tt>, or <tt>path</tt> are split
-  into string lists on OS-specific path-list separator boundaries (e.g.
-  "<tt>:</tt>" for UNIX and "<tt>;</tt>" for Windows). All other variables
-  are split on space (" ") boundaries. Boost Jam modifies that behavior by
-  allowing variables to be <a href="#variable_quoting">quoted</a>.</p>
-
-  <p>&middot; A variable whose value is an empty list <i>or</i> which
-  consists entirely of empty strings has a negative logical value. Thus, for
-  example, code like the following allows a sensible non-empty default which
-  can easily be overridden by the user:</p>
-  <pre>
-MESSAGE ?= starting jam... ;
-if $(MESSAGE) { ECHO The message is: $(MESSAGE) ; }
-</pre>
-
-  <p>If the user wants a specific message, he invokes jam with
-  <tt>"-sMESSAGE=</tt><i>message text</i><tt>"</tt>. If he wants no message,
-  he invokes jam with <tt>-sMESSAGE=</tt> and nothing at all is printed.</p>
-
-  <p>&middot; The parsing of command line options in Jam can be rather
-  unintuitive, with regards to how other Unix programs accept options. There
-  are two variants accepted as valid for an option:</p>
-
-  <ol>
-    <li><tt>-xvalue</tt>, and</li>
-
-    <li><tt>-x value</tt>.</li>
-  </ol>
-
-  <p>Please also read <a href="./Jam.html">The Jam language reference</a> for
-  the additional details.</p>
-  <hr>
-
-  <p>Revised 
-  <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
-   18 November, 2003 
-  <!--webbot bot="Timestamp" endspan i-checksum="39359" --></p>
-
-  <p>Copyright 2003-2004 Rene Rivera, David Abrahams, Vladimir Prus.</p>
-
-  <p>Distributed under the Boost Software License, Version 1.0.
-  (See accompanying file LICENSE_1_0.txt or <a href="http://www.boost.org/LICENSE_1_0.txt">
-  http://www.boost.org/LICENSE_1_0.txt)</a></p>
-</body>
-</html>

Modified: boost-build/branches/upstream/current/jam_src/jam.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/jam.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/jam.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -121,6 +121,8 @@
 # include "make.h"
 # include "strings.h"
 # include "expand.h"
+# include "debug.h"
+# include "filesys.h"
 
 /* Macintosh is "special" */
 
@@ -144,7 +146,8 @@
 # else
 	{ 0, 1 }, 		/* debug ... */
 # endif
-	0			/* output commands, not run them */
+	0,			/* output commands, not run them */
+    0 /* action timeout */
 } ;
 
 /* Symbols to be defined as true for use in Jambase */
@@ -196,6 +199,14 @@
 }
 #endif
 
+#ifdef HAVE_PYTHON
+    extern PyObject*
+    bjam_call(PyObject *self, PyObject *args);
+ 
+    extern PyObject*
+    bjam_import_rule(PyObject* self, PyObject* args);
+#endif
+
 int  main( int argc, char **argv, char **arg_environ )
 {
     int		n;
@@ -206,6 +217,7 @@
     int		status;
     int arg_c = argc;
     char ** arg_v = argv;
+    const char *progname = argv[0];
 
 # ifdef OS_MAC
     InitGraf(&qd.thePort);
@@ -213,15 +225,16 @@
 
     argc--, argv++;
 
-	if( ( n = getoptions( argc, argv, "-:d:j:f:gs:t:ano:qv", optv ) ) < 0 )
+	if( getoptions( argc, argv, "-:l:d:j:f:gs:t:ano:qv", optv ) < 0 )
     {
-        printf( "\nusage: jam [ options ] targets...\n\n" );
+        printf( "\nusage: %s [ options ] targets...\n\n", progname );
 
         printf( "-a      Build all targets, even if they are current.\n" );
         printf( "-dx     Set the debug level to x (0-9).\n" );
         printf( "-fx     Read x instead of Jambase.\n" );
 	    /* printf( "-g      Build from newest sources first.\n" ); */
         printf( "-jx     Run up to x shell commands concurrently.\n" );
+        printf( "-lx     Limit actions to x number of seconds after which they are stopped.\n" );
         printf( "-n      Don't actually execute the updating actions.\n" );
         printf( "-ox     Write the updating actions to file x.\n" );
 		printf( "-q      Quit quickly as soon as a target fails.\n" );
@@ -233,8 +246,6 @@
         exit( EXITBAD );
     }
 
-    argc -= n, argv += n;
-
     /* Version info. */
 
     if( ( s = getoptval( optv, 'v', 0 ) ) )
@@ -244,7 +255,8 @@
 	   printf( "   Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.  \n" );
         printf( "   Copyright 2001 David Turner.\n" );
         printf( "   Copyright 2001-2004 David Abrahams.\n" );
-        printf( "   Copyright 2002-2004 Rene Rivera.\n" );
+        printf( "   Copyright 2002-2005 Rene Rivera.\n" );
+        printf( "   Copyright 2003-2005 Vladimir Prus.\n" );
 
         return EXITOK;
     }
@@ -265,6 +277,9 @@
 	if( ( s = getoptval( optv, 'g', 0 ) ) )
 	    globs.newestfirst = 1;
 
+    if( ( s = getoptval( optv, 'l', 0 ) ) )
+        globs.timeout = atoi( s );
+
     /* Turn on/off debugging */
 
     for( n = 0; s = getoptval( optv, 'd', n ); n++ )
@@ -294,6 +309,28 @@
             globs.debug[i--] = 1;
     }
 
+    { PROFILE_ENTER(MAIN);
+
+    #ifdef HAVE_PYTHON
+    {
+        PROFILE_ENTER(MAIN_PYTHON);
+        Py_Initialize();
+    
+        {
+            static PyMethodDef BjamMethods[] = {
+                {"call", bjam_call, METH_VARARGS,
+                 "Call the specified bjam rule."},
+                {"import_rule", bjam_import_rule, METH_VARARGS,
+                 "Imports Python callable to bjam."},
+                {NULL, NULL, 0, NULL}
+            };
+    
+            Py_InitModule("bjam", BjamMethods);
+        }
+        PROFILE_EXIT(MAIN_PYTHON);
+    }
+    #endif
+    
 #ifndef NDEBUG
     run_unit_tests();
 #endif
@@ -319,16 +356,11 @@
     }
 
  
-    {
-   /* Pleace don't change the following line. The 'bump_version.py' script
-       expect a specific format of it. */
-    char  *major_version = "03", *minor_version = "01", *changenum = "10";
     var_set( "JAM_VERSION",
-             list_new( list_new( list_new( L0, newstr( major_version ) ), 
-                                 newstr( minor_version ) ), 
-                       newstr( changenum ) ),
+             list_new( list_new( list_new( L0, newstr( VERSION_MAJOR_SYM ) ), 
+                                 newstr( VERSION_MINOR_SYM ) ), 
+                       newstr( VERSION_PATCH_SYM ) ),
              VAR_SET );
-    }
 
     /* And JAMUNAME */
 # ifdef unix
@@ -354,7 +386,13 @@
 
     /* load up environment variables */
 
-    var_defines( use_environ );
+    /* first into global module, with splitting, for backward compatibility */
+    var_defines( use_environ, 1 );
+    
+    /* then into .ENVIRON, without splitting */
+    enter_module( bindmodule(".ENVIRON") );
+    var_defines( use_environ, 0 );
+    exit_module( bindmodule(".ENVIRON") );
 
 	/*
 	 * Jam defined variables OS, OSPLAT
@@ -363,7 +401,7 @@
      * change Jam notion of the current platform.
 	 */
 
-    var_defines( othersyms );
+    var_defines( othersyms, 1 );
 
 
     /* Load up variables set on command line. */
@@ -373,7 +411,7 @@
         char *symv[2];
         symv[0] = s;
         symv[1] = 0;
-        var_defines( symv );
+        var_defines( symv, 1 );
     }
 
     /* Set the ARGV to reflect the complete list of arguments of invocation. */
@@ -389,9 +427,18 @@
 
     /* Add the targets in the command line to update list */
 
-    for ( n = 0; n < argc; ++n )
+    for ( n = 1; n < arg_c; ++n )
     {
-        mark_target_for_updating(argv[n]);
+        if ( arg_v[n][0] == '-' )
+        {
+            char *f = "-:l:d:j:f:gs:t:ano:qv";
+            for( ; *f; f++ ) if( *f == arg_v[n][1] ) break;
+            if ( f[1] == ':' && arg_v[n][2] == '\0' ) { ++n; }
+        }
+        else
+        {
+            mark_target_for_updating(arg_v[n]);
+        }
     }
 
     /* Parse ruleset */
@@ -428,6 +475,8 @@
     /* Now make target */
 
     {
+        PROFILE_ENTER(MAIN_MAKE);
+        
         LIST* targets = targets_to_update();
         if ( !targets )
         {
@@ -438,6 +487,8 @@
             int targets_count = list_length(targets);
             const char **targets2 = (const char **)malloc(targets_count * sizeof(char *));
             int n = 0;
+            if ( DEBUG_PROFILE )
+                profile_memory( targets_count * sizeof(char *) );
             for ( ; targets; targets = list_next(targets) )
             {
                 targets2[n++] = targets->string;
@@ -445,15 +496,20 @@
             status |= make( targets_count, targets2, anyhow );       
             free(targets);
         }
+        
+        PROFILE_EXIT(MAIN_MAKE);
     }
 
 
+    PROFILE_EXIT(MAIN); }
+    
     if ( DEBUG_PROFILE )
         profile_dump();
 
     /* Widely scattered cleanup */
 
     var_done();
+    file_done();
     donerules();
     donestamps();
     donestr();
@@ -463,5 +519,10 @@
     if( globs.cmdout )
         fclose( globs.cmdout );
 
+#ifdef HAVE_PYTHON
+    Py_Finalize();
+#endif
+
+
     return status ? EXITBAD : EXITOK;
 }

Modified: boost-build/branches/upstream/current/jam_src/jam.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/jam.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/jam.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -37,6 +37,14 @@
 
 #ifndef JAM_H_VP_2003_08_01
 #define JAM_H_VP_2003_08_01
+
+#ifdef HAVE_PYTHON
+#include <Python.h>
+#endif
+
+/* Assume popen support is available unless known otherwise. */
+#define HAVE_POPEN 1
+
 /*
  * VMS, OPENVMS
  */
@@ -111,6 +119,12 @@
 # define OS_AS400
 # endif
 
+/* Metrowerks Standard Library on Windows. */
+
+# ifdef __MSL__
+#undef HAVE_POPEN
+#endif
+
 # endif
 
 /*
@@ -231,10 +245,14 @@
 # define OSMINOR "OS=CYGWIN"
 # define OS_CYGWIN
 # endif
-# ifdef __FreeBSD__
+# if defined(__FreeBSD__) && !defined(__DragonFly__)
 # define OSMINOR "OS=FREEBSD"
 # define OS_FREEBSD
 # endif
+# ifdef __DragonFly__
+# define OSMINOR "OS=DRAGONFLYBSD"
+# define OS_DRAGONFLYBSD
+# endif
 # ifdef __DGUX__
 # define OSMINOR "OS=DGUX"
 # define OS_DGUX
@@ -295,11 +313,11 @@
 # define NO_VFORK
 # endif
 # ifdef __QNX__
+# define unix
 # ifdef __QNXNTO__
 # define OSMINOR "OS=QNXNTO"
 # define OS_QNXNTO
 # else
-# define unix
 # define OSMINOR "OS=QNX"
 # define OS_QNX
 # define NO_VFORK
@@ -321,6 +339,9 @@
 # define OS_MACOSX
 # endif
 # ifdef __osf__
+# ifndef unix
+# define unix
+# endif
 # define OSMINOR "OS=OSF"
 # define OS_OSF
 # endif
@@ -364,6 +385,10 @@
 # define OS_OPENBSD
 # define unix
 # endif
+# if defined (__FreeBSD_kernel__) && !defined(__FreeBSD__)
+# define OSMINOR "OS=KFREEBSD"
+# define OS_KFREEBSD
+# endif
 # ifndef OSMINOR
 # define OSMINOR "OS=UNKNOWN"
 # endif
@@ -394,6 +419,7 @@
 
 # if !defined(OS_BSDI) && \
      !defined(OS_FREEBSD) && \
+     !defined(OS_DRAGONFLYBSD) && \
      !defined(OS_NEXT) && \
      !defined(OS_MACHTEN) && \
      !defined(OS_MACOSX) && \
@@ -426,6 +452,7 @@
      defined( __i386__ ) || \
      defined( _M_IX86 )
 # if !defined( OS_FREEBSD ) && \
+     !defined( OS_DRAGONFLYBSD ) && \
      !defined( OS_OS2 ) && \
      !defined( OS_AS400 )
 # define OSPLAT "OSPLAT=X86"
@@ -497,6 +524,7 @@
 	int	newestfirst;		/* build newest sources first */
 	char	debug[DEBUG_MAX];
 	FILE	*cmdout;		/* print cmds, not run them */
+    long timeout; /* number of seconds to limit actions to, default 0 for no limit. */
 } ;
 
 extern struct globs globs;

Modified: boost-build/branches/upstream/current/jam_src/jambase.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/jambase.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/jambase.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -23,6 +23,13 @@
 "{\n",
 "BOOST_BUILD_PATH = /usr/share/boost-build ;\n",
 "}\n",
+"rule _poke ( module-name ? : variables + : value * )\n",
+"{\n",
+"module $(<)\n",
+"{\n",
+"$(>) = $(3) ;\n",
+"}\n",
+"}\n",
 "rule boost-build ( dir ? )\n",
 "{\n",
 "if $(.bootstrap-file)\n",
@@ -33,7 +40,8 @@
 "ECHO ;\n",
 "EXIT \"Please consult the documentation at 'http://www.boost.org'.\" ;\n",
 "}\n",
-"BOOST_BUILD_PATH = $(dir:R=$(.boost-build-file:D)) $(BOOST_BUILD_PATH) ;\n",
+"BOOST_BUILD_PATH = $(BOOST_BUILD_PATH) $(dir:R=$(.boost-build-file:D)) ;\n",
+"_poke .ENVIRON : BOOST_BUILD_PATH : $(BOOST_BUILD_PATH) ;\n",
 "local bootstrap-file =\n",
 "[ GLOB $(BOOST_BUILD_PATH) : bootstrap.jam ] ;\n",
 ".bootstrap-file = $(bootstrap-file[1]) ;\n",
@@ -65,11 +73,6 @@
 "[ find-to-root [ PWD ] : boost-build.jam ]\n",
 "[ GLOB $(search-path) : boost-build.jam ] ;\n",
 ".boost-build-file = $(boost-build-files[1]) ;\n",
-"if [ MATCH .*(--debug-configuration).* : $(ARGV) ]\n",
-"{\n",
-"ECHO \"notice: found boost-build.jam at\" \n",
-"[ NORMALIZE_PATH $(.boost-build-file) ] ;\n",
-"}\n",
 "if ! $(.boost-build-file)\n",
 "{\n",
 "ECHO \"Unable to load Boost.Build: could not find \\\"boost-build.jam\\\"\" ;\n",
@@ -85,6 +88,11 @@
 "ECHO \"and in these directories from BOOST_BUILD_PATH and BOOST_ROOT: \"$(search-path:J=\", \")\".\" ;\n",
 "EXIT \"Please consult the documentation at 'http://www.boost.org'.\" ;\n",
 "}\n",
+"if [ MATCH .*(--debug-configuration).* : $(ARGV) ]      \n",
+"{\n",
+"ECHO \"notice: found boost-build.jam at\" \n",
+"[ NORMALIZE_PATH $(.boost-build-file) ] ;\n",
+"}\n",
 "include $(.boost-build-file) ;\n",
 "if ! $(.bootstrap-file)\n",
 "{\n",

Modified: boost-build/branches/upstream/current/jam_src/lists.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/lists.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/lists.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,6 +7,7 @@
 # include "jam.h"
 # include "newstr.h"
 # include "lists.h"
+# include "debug.h"
 
 /*
  * lists.c - maintain lists of strings
@@ -80,7 +81,9 @@
 	}
 	else
 	{
-	    l = (LIST *)malloc( sizeof( *l ) );
+        l = (LIST *)malloc( sizeof( LIST ) );
+        if ( DEBUG_PROFILE )
+            profile_memory( sizeof( LIST ) );
 	}
 
 	/* If first on chain, head points here. */

Modified: boost-build/branches/upstream/current/jam_src/make.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/make.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/make.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -82,6 +82,7 @@
 	"newer",	/* T_FATE_NEWER */
 	"temp", 	/* T_FATE_ISTMP */
 	"touched", 	/* T_FATE_TOUCHED */
+	"rebuild", 	/* T_FATE_REBUILD */
 	"missing", 	/* T_FATE_MISSING */
 	"needtmp", 	/* T_FATE_NEEDTMP */
 	"old", 		/* T_FATE_OUTDATED */
@@ -174,6 +175,63 @@
 	return status;
 }
 
+/* Force any dependents of t that have already at least begun being
+ * visited by make0 to be updated.
+ */
+static void update_dependents(TARGET* t)
+{
+    TARGETS *q;
+    
+    for (q = t->dependents; q; q = q->next)
+    {
+        TARGET* p = q->target;
+        char fate0 = p->fate;
+
+        /* If we've already at least begun visiting it and
+         * we're not already rebuilding it for other reasons
+         */
+        if (fate0 != T_FATE_INIT && fate0 < T_FATE_BUILD)
+        {
+            p->fate = T_FATE_UPDATE;
+            
+            if (DEBUG_FATE)
+            {
+                printf( "fate change  %s from %s to %s (as dependent of %s)\n",
+                        p->name, target_fate[fate0], target_fate[p->fate], t->name);
+            }
+    
+            /* If we're done visiting it, go back and make sure its
+             * dependents get rebuilt.
+             */
+            if (fate0 > T_FATE_MAKING)
+                update_dependents(p);
+        }
+    }
+}
+
+/* Make sure that all of t's rebuilds get rebuilt */
+static void force_rebuilds(TARGET* t)
+{
+    TARGETS* d;
+    for (d = t->rebuilds; d; d = d->next)
+    {
+        TARGET* r = d->target;
+
+        /* If it's not already being rebuilt for other reasons */
+        if (r->fate < T_FATE_BUILD)
+        {
+            if (DEBUG_FATE)
+                printf( "fate change  %s from %s to %s (by rebuild)\n",
+                        r->name, target_fate[r->fate], target_fate[T_FATE_REBUILD]);
+            
+            /* Force rebuild it */
+            r->fate = T_FATE_REBUILD;
+
+            /* And make sure its dependents are updated too */
+            update_dependents(r);
+        }
+    }
+}
 /*
  * make0() - bind and scan everything to make a TARGET
  *
@@ -362,7 +420,7 @@
 
 	last = 0;
 	leaf = 0;
-	fate = T_FATE_STABLE;
+    fate = T_FATE_STABLE;
 
 	for( c = t->depends; c; c = c->next )
 	{
@@ -515,7 +573,7 @@
 		       t->name, target_fate[fate],
 		       oldTimeStamp ? " (by timestamp)" : "" );
 	    else
-		printf( "fate change  %s adjusted from %s to %s%s\n",
+		printf( "fate change  %s from %s to %s%s\n",
 		       t->name, target_fate[savedFate], target_fate[fate],
 		       oldTimeStamp ? " (by timestamp)" : "" );
 #endif
@@ -551,8 +609,19 @@
 
 	t->time = max( t->time, last );
 	t->leaf = leaf ? leaf : t->time ;
-	t->fate = fate;
+    /* This target's fate may have been updated by virtue of following
+     * some target's rebuilds list, so only allow it to be increased
+     * to the fate we've calculated.  Otherwise, grab its new fate.
+     */
+    if (fate > t->fate)
+        t->fate = fate;
+    else
+        fate = t->fate;
 
+    /* Step 4g: if this target needs to be built, force rebuild
+     * everything in this target's rebuilds list */
+    if (fate >= T_FATE_BUILD && fate < T_FATE_BROKEN)
+        force_rebuilds(t);
 	/* 
 	 * Step 5: sort dependents by their update time. 
 	 */
@@ -674,6 +743,9 @@
       case T_FATE_OUTDATED:
 	printf( "  %s       : Outdated, updating it\n", spaces(depth) );
 	break;
+      case T_FATE_REBUILD:
+	printf( "  %s       : Rebuild, Updating it\n", spaces(depth) );
+	break;
       case T_FATE_UPDATE:
 	printf( "  %s       : Updating it\n", spaces(depth) );
 	break;

Modified: boost-build/branches/upstream/current/jam_src/make1.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/make1.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/make1.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -61,6 +61,8 @@
 # include "command.h"
 # include "execcmd.h"
 
+# include <stdlib.h>
+
 #if defined(sun) || defined(__sun)
 #include <unistd.h> /* for unlink */
 #endif
@@ -68,7 +70,7 @@
 static CMD *make1cmds( TARGET *t );
 static LIST *make1list( LIST *l, TARGETS *targets, int flags );
 static SETTINGS *make1settings( LIST *vars );
-static void make1bind( TARGET *t, int warn );
+static void make1bind( TARGET *t );
 
 /* Ugly static - it's too hard to carry it through the callbacks. */
 
@@ -101,7 +103,7 @@
 static void make1b( state *pState );
 static void make1c( state *pState );
 static void make1d( state *pState );
-static void make_closure(void *closure, int status);
+static void make_closure(void *closure, int status, timing_info*);
 
 typedef struct _stack
 {
@@ -125,6 +127,8 @@
 	}
 	else
 	{
+        if ( DEBUG_PROFILE )
+            profile_memory( sizeof(state) );
 		return (state *)malloc(sizeof(state));
 	}
 }
@@ -410,9 +414,10 @@
     if( pState->t->status == EXEC_CMD_OK )
         switch( pState->t->fate )
         {
+            /* These are handled by the default case below now
         case T_FATE_INIT:
         case T_FATE_MAKING:
-            /* shouldn't happen */
+            */
 
         case T_FATE_STABLE:
         case T_FATE_NEWER:
@@ -433,6 +438,7 @@
         case T_FATE_NEEDTMP:
         case T_FATE_OUTDATED:
         case T_FATE_UPDATE:
+        case T_FATE_REBUILD:
 
             /* Set "on target" vars, build actions, unset vars */
             /* Set "progress" so that make1c() counts this target among */
@@ -449,6 +455,11 @@
             }
 
             break;
+            
+            /* All possible fates should have been accounted for by now */
+        default:
+            printf("ERROR: %s has bad fate %d", pState->t->name, pState->t->fate);
+            abort();
         }
 
 		/* Call make1c() to begin the execution of the chain of commands */
@@ -655,11 +666,62 @@
 	}
 }
 
-static void make_closure(void *closure, int status)
+/* To l, append a 1-element list containing the string representation
+ * of x
+ */
+static void append_double_string( LOL *l, double x )
 {
-	push_state(&state_stack, (TARGET *)closure, NULL, T_STATE_MAKE1D)->status = status;
+    char buffer[50];
+    sprintf(buffer, "%f", x);
+    lol_add( l, list_new( L0, newstr( buffer ) ) );
 }
 
+/* Look up the __TIMING_RULE__ variable on the given target, and if
+ * non-empty, invoke the rule it names, passing the given
+ * timing_info
+ */
+static void call_timing_rule(TARGET* target, timing_info* time)
+{
+    LIST* timing_rule;
+    
+    pushsettings(target->settings);
+    timing_rule = var_get( "__TIMING_RULE__" );
+    popsettings(target->settings);
+
+    if (timing_rule)
+    {
+        /* We'll prepend $(__TIMING_RULE__[2-]) to the first argument */
+        LIST* initial_args = list_copy( L0, timing_rule->next );
+            
+        /* Prepare the argument list */
+        FRAME frame[1];
+        frame_init( frame );
+
+        /* First argument is the name of the timed target */
+        lol_add( frame->args, list_new( initial_args, target->name ) );
+        append_double_string(frame->args, time->user);
+        append_double_string(frame->args, time->system);
+
+        if( lol_get( frame->args, 2 ) )
+            evaluate_rule( timing_rule->string, frame );
+            
+        /* Clean up */
+        frame_free( frame );
+    }
+}
+
+static void make_closure(
+    void *closure, int status, timing_info* time)
+{
+    TARGET* built = (TARGET*)closure;
+
+    call_timing_rule(built, time);
+    if (DEBUG_EXECCMD)
+        printf("%f sec system; %f sec user\n", time->system, time->user);
+    
+    push_state(&state_stack, built, NULL, T_STATE_MAKE1D)->status = status;
+}
+
 /*
  * make1d() - handle command execution completion and call back make1c()
  */
@@ -935,13 +997,8 @@
     {
 	TARGET *t = targets->target;
 
-	/* Sources to 'actions existing' are never in the dependency */
-	/* graph (if they were, they'd get built and 'existing' would */
-	/* be superfluous, so throttle warning message about independent */
-	/* targets. */
-
 	if( t->binding == T_BIND_UNBOUND )
-	    make1bind( t, !( flags & RULE_EXISTING ) );
+	    make1bind( t );
 
     if ( ( flags & RULE_EXISTING ) && ( flags & RULE_NEWSRCS ) )
     {
@@ -997,11 +1054,10 @@
 	    {
 		TARGET *t = bindtarget( l->string );
 
-		/* Make sure the target is bound, warning if it is not in the */
-		/* dependency graph. */
+		/* Make sure the target is bound */
 
 		if( t->binding == T_BIND_UNBOUND )
-		    make1bind( t, 1 );
+		    make1bind( t );
 
 		/* Build new list */
 
@@ -1025,20 +1081,11 @@
 
 static void
 make1bind( 
-	TARGET	*t,
-	int	warn )
+	TARGET	*t )
 {
 	if( t->flags & T_FLAG_NOTFILE )
 	    return;
 
-	/* Sources to 'actions existing' are never in the dependency */
-	/* graph (if they were, they'd get built and 'existing' would */
-	/* be superfluous, so throttle warning message about independent */
-	/* targets. */
-
-	if( warn )
-	    printf( "warning: using independent target %s\n", t->name );
-
 	pushsettings( t->settings );
 	t->boundname = search( t->name, &t->time, 0 );
 	t->binding = t->time ? T_BIND_EXISTS : T_BIND_MISSING;

Modified: boost-build/branches/upstream/current/jam_src/modules/order.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/modules/order.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/modules/order.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,6 +7,7 @@
 #include "../strings.h"
 #include "../newstr.h"
 #include "../variable.h"
+#include "../debug.h"
 
 
 /* Use quite klugy approach: when we add order dependency from 'a' to 'b',
@@ -62,6 +63,8 @@
 {
     int i;
     int* colors = (int*)calloc(num_vertices, sizeof(int));
+    if ( DEBUG_PROFILE )
+        profile_memory( num_vertices*sizeof(int) );
     for (i = 0; i < num_vertices; ++i)
         colors[i] = white;
 
@@ -86,6 +89,8 @@
     int length = list_length(arg);
     int** graph = (int**)calloc(length, sizeof(int*));
     int* order = (int*)malloc((length+1)*sizeof(int));
+    if ( DEBUG_PROFILE )
+        profile_memory( length*sizeof(int*) + (length+1)*sizeof(int) );
    
     for(tmp = arg, src = 0; tmp; tmp = tmp->next, ++src) {
         /* For all object this one depend upon, add elements
@@ -94,6 +99,8 @@
         int index = 0;
 
         graph[src] = (int*)calloc(list_length(dependencies)+1, sizeof(int));
+        if ( DEBUG_PROFILE )
+            profile_memory( (list_length(dependencies)+1)*sizeof(int) );
         for(; dependencies; dependencies = dependencies->next) {          
             int dst = list_index(arg, dependencies->string);
             if (dst != -1)
@@ -130,12 +137,12 @@
 {
     {
         char* args[] = { "first", "second", 0 };
-        declare_native_rule("class at order", "add-pair", args, add_pair);
+        declare_native_rule("class at order", "add-pair", args, add_pair, 1);
     }
 
     {
         char* args[] = { "objects", "*", 0 };
-        declare_native_rule("class at order", "order", args, order);
+        declare_native_rule("class at order", "order", args, order, 1);
     }
 
 

Modified: boost-build/branches/upstream/current/jam_src/modules/path.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/modules/path.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/modules/path.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -26,7 +26,7 @@
 {
     {
         char* args[] = { "location", 0 };
-        declare_native_rule("path", "exists", args, path_exists);
+        declare_native_rule("path", "exists", args, path_exists, 1);
     }
 
 }

Modified: boost-build/branches/upstream/current/jam_src/modules/property-set.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/modules/property-set.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/modules/property-set.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -103,7 +103,7 @@
 {
     {
         char* args[] = { "raw-properties", "*", 0 };
-        declare_native_rule("property-set", "create", args, property_set_create);
+        declare_native_rule("property-set", "create", args, property_set_create, 1);
     }
 
 }

Modified: boost-build/branches/upstream/current/jam_src/modules/regex.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/modules/regex.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/modules/regex.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -10,15 +10,16 @@
 #include "../compile.h"
 
 /*
-rule transform ( list * : pattern )
+rule transform ( list * : pattern : indices * )
 {
+    indices ?= 1 ;
     local result ;
     for local e in $(list)
     {
         local m = [ MATCH $(pattern) : $(e) ] ;
         if $(m)
         {
-            result += $(m[1]) ;
+            result += $(m[$(indices)]) ;
         }        
     }
     return $(result) ;
@@ -28,30 +29,60 @@
 {
     LIST* l = lol_get( frame->args, 0 );    
     LIST* pattern = lol_get( frame->args, 1 );    
+    LIST* indices_list = lol_get(frame->args, 2);
+    int* indices = 0;
+    int size;
+    int* p;
     LIST* result = 0;
 
     string buf[1];
     string_new(buf);
 
+    if (indices_list)
+    {
+        size = list_length(indices_list);
+        indices = (int*)malloc(size*sizeof(int));
+        for(p = indices; indices_list; indices_list = indices_list->next)
+        {
+            *p++ = atoi(indices_list->string);
+        }        
+    }
+    else 
+    {
+        size = 1;
+        indices = (int*)malloc(sizeof(int));
+        *indices = 1;
+    }
 
-    /* Result is cached and intentionally never freed */
     {
+        /* Result is cached and intentionally never freed */
         regexp *re = regex_compile( pattern->string );
 
         for(; l; l = l->next)
         {
             if( regexec( re, l->string ) )
             {
-                if (re->startp[1])
+                int i = 0;
+                for(; i < size; ++i)
                 {
-                    string_append_range( buf, re->startp[1], re->endp[1] );
-                    result = list_new( result, newstr( buf->value ) );                
-                    string_truncate( buf, 0 );
+                    int index = indices[i];
+                    /* Skip empty submatches. Not sure it's right in all cases,
+                       but surely is right for the case for which this routine
+                       is optimized -- header scanning.
+                    */
+                    if (re->startp[index] != re->endp[index])
+                    {
+                        string_append_range( buf, re->startp[index], re->endp[index] );
+                        result = list_new( result, newstr( buf->value ) ); 
+                        string_truncate( buf, 0 );
+                    }
                 }
             }
         }
         string_free( buf );
     }
+
+    free(indices);
     
     return result;
 }
@@ -59,7 +90,7 @@
 void init_regex()
 {
     {
-        char* args[] = { "list", "*", ":", "pattern", 0 };
-        declare_native_rule("regex", "transform", args, regex_transform);
+        char* args[] = { "list", "*", ":", "pattern", ":", "indices", "*", 0 };
+        declare_native_rule("regex", "transform", args, regex_transform, 2);
     }
 }

Modified: boost-build/branches/upstream/current/jam_src/modules/sequence.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/modules/sequence.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/modules/sequence.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -36,7 +36,7 @@
     {
         char* args[] = { "elements", "*", ":", "rank", "*", 0 };
         declare_native_rule("sequence", "select-highest-ranked", args, 
-                            sequence_select_highest_ranked);
+                            sequence_select_highest_ranked, 1);
     }
 
 }

Modified: boost-build/branches/upstream/current/jam_src/modules/set.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/modules/set.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/modules/set.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -35,7 +35,7 @@
 {
     {
         char* args[] = { "B", "*", ":", "A", "*", 0 };
-        declare_native_rule("set", "difference", args, set_difference);
+        declare_native_rule("set", "difference", args, set_difference, 1);
     }
 
 }

Modified: boost-build/branches/upstream/current/jam_src/modules.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/modules.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/modules.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,8 +3,10 @@
  *  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)
  */
+#include "jam.h"
+#include "debug.h"
+
 #include "modules.h"
-#include "jam.h"
 #include "string.h"
 #include "hash.h"
 #include "newstr.h"
@@ -30,6 +32,8 @@
 
 module_t* bindmodule( char* name )
 {
+    PROFILE_ENTER(BINDMODULE);
+    
     string s;
     module_t m_, *m = &m_;
 
@@ -53,8 +57,12 @@
         m->imported_modules = 0;
         m->class_module = 0;
         m->native_rules = 0;
+        m->user_module = 0;
     }
     string_free( &s );
+
+    PROFILE_EXIT(BINDMODULE);
+
     return m;
 }
 
@@ -114,9 +122,11 @@
 }
 
 void import_module(LIST* module_names, module_t* target_module)
-{ 
+{
+    PROFILE_ENTER(IMPORT_MODULE);
+    
     struct hash* h;
-
+    
     if (!target_module->imported_modules)
         target_module->imported_modules = hashinit( sizeof(char*), "imported");
     h = target_module->imported_modules;
@@ -128,6 +138,8 @@
         
         hashenter(h, (HASHDATA**)&ss);
     }
+    
+    PROFILE_EXIT(IMPORT_MODULE);
 }
 
 static void add_module_name( void* r_, void* result_ )
@@ -147,4 +159,3 @@
 
     return result;
 }
-

Modified: boost-build/branches/upstream/current/jam_src/modules.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/modules.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/modules.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -16,13 +16,13 @@
     struct hash* imported_modules;
     struct module_t* class_module;
     struct hash* native_rules;
+    int user_module;
 };
 
 typedef struct module_t module_t ; /* MSVC debugger gets confused unless this is provided */
 
 module_t* bindmodule( char* name );
 module_t* root_module();
-void bind_module_var( module_t*, char* name );
 void enter_module( module_t* );
 void exit_module( module_t* );
 void delete_module( module_t* );

Modified: boost-build/branches/upstream/current/jam_src/native.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/native.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/native.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -10,7 +10,7 @@
 
 
 void declare_native_rule(char* module, char* rule, char** args, 
-                         LIST*(*f)(PARSE*, FRAME*))
+                         LIST*(*f)(PARSE*, FRAME*), int version)
 
 {
     module_t* m = bindmodule(module);
@@ -31,6 +31,7 @@
             n.arguments = 0;
         }
         n.procedure = parse_make( f, P0, P0, P0, C0, C0, 0 );        
+        n.version = version;
         hashenter(m->native_rules, (HASHDATA**)&np);
     }
 }

Modified: boost-build/branches/upstream/current/jam_src/native.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/native.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/native.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -12,13 +12,22 @@
     char* name;
     argument_list* arguments;
     PARSE* procedure;
+    /* Version of the interface that the native rule provides.
+       It's possible that we want to change the set parameter
+       for existing native rule. In that case, version number
+       should be incremented so that Boost.Build can check for
+       version it relies on.
+
+       Versions are numbered from 1.
+    */
+    int version;
 };
 
 /* MSVC debugger gets confused unless this is provided */
 typedef struct native_rule_t native_rule_t ; 
 
 void declare_native_rule(char* module, char* rule, char** args, 
-                         LIST*(*f)(PARSE*, FRAME*));
+                         LIST*(*f)(PARSE*, FRAME*), int version);
 
 
 

Modified: boost-build/branches/upstream/current/jam_src/newstr.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/newstr.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/newstr.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,6 +7,7 @@
 # include "jam.h"
 # include "newstr.h"
 # include "hash.h"
+# include "compile.h"
 # include <stddef.h>
 # include <stdlib.h>
 
@@ -34,6 +35,8 @@
 
 static struct hash *strhash = 0;
 static int strtotal = 0;
+static int strcount_in = 0;
+static int strcount_out = 0;
 
 /*
  * Immortal string allocator implementation speeds string allocation
@@ -53,11 +56,20 @@
 static char* storage_start = 0;
 static char* storage_finish = 0;
 
+/* */
+#define SIMPLE_ALLOC 0
+/*/
+#define SIMPLE_ALLOC 1
+/* */
+
 /*
  * allocate() - Allocate n bytes of immortal string storage
  */
 static char* allocate(size_t n)
 {
+    #if SIMPLE_ALLOC
+    return (char*)malloc(n);
+    #else
     /* See if we can grab storage from an existing block */
     size_t remaining = storage_finish - storage_start;
     if ( remaining >= n )
@@ -88,6 +100,7 @@
         }
         return new_block->data;
     }
+    #endif
 }
 
 /*
@@ -112,8 +125,12 @@
 	    strtotal += l + 1;
 	    memcpy( m, string, l + 1 );
 	    *s = m;
+
+        if ( DEBUG_PROFILE )
+            profile_memory( l+1 );
 	}
 
+    strcount_in += 1;
 	return *s;
 }
 
@@ -124,6 +141,7 @@
 char *
 copystr( char *s )
 {
+    strcount_in += 1;
 	return s;
 }
 
@@ -134,6 +152,7 @@
 void
 freestr( char *s )
 {
+    strcount_out += 1;
 }
 
 /*
@@ -155,4 +174,6 @@
     
     if( DEBUG_MEM )
         printf( "%dK in strings\n", strtotal / 1024 );
+    
+    /* printf( "--- %d strings of %d dangling\n", strcount_in-strcount_out, strcount_in ); */
 }

Modified: boost-build/branches/upstream/current/jam_src/option.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/option.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/option.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -34,7 +34,7 @@
 	char *arg;
 
 	if( argv[i][0] != '-' || ( argv[i][1] != '-' && !isalpha( argv[i][1] ) ) )
-	    break;
+	    continue;
 
 	if( !optc-- )
 	{

Modified: boost-build/branches/upstream/current/jam_src/parse.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/parse.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/parse.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -17,6 +17,7 @@
 # include "newstr.h"
 # include "modules.h"
 # include "frames.h"
+# include "debug.h"
 
 /*
  * parse.c - make and destroy parse trees as driven by the parser
@@ -78,6 +79,8 @@
 	int	num )
 {
 	PARSE	*p = (PARSE *)malloc( sizeof( PARSE ) );
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof( PARSE ) );
 
 	p->func = func;
 	p->left = left;

Modified: boost-build/branches/upstream/current/jam_src/patchlevel.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/patchlevel.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/patchlevel.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,5 +1,17 @@
+/*
+ * Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.
+ *
+ * This file is part of Jam - see jam.c for Copyright information.
+ */
+
 /* Keep JAMVERSYM in sync with VERSION. */
 /* It can be accessed as $(JAMVERSION) in the Jamfile. */
 
-#define VERSION "3.1.10"
+#define VERSION_MAJOR 3
+#define VERSION_MINOR 1
+#define VERSION_PATCH 13
+#define VERSION_MAJOR_SYM "03"
+#define VERSION_MINOR_SYM "1"
+#define VERSION_PATCH_SYM "13"
+#define VERSION "3.1.13"
 #define JAMVERSYM "JAMVERSION=3.1"

Modified: boost-build/branches/upstream/current/jam_src/pathsys.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/pathsys.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/pathsys.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -63,4 +63,19 @@
 
 #endif
 
+#ifdef USE_PATHUNIX
+/** Returns a static pointer to the system dependent path to the temporary
+    directory. NOTE: *without* a trailing path separator.
+*/
+const char * path_tmpdir(void);
+
+/** Returns a new temporary name.
+*/
+const char * path_tmpnam(void);
+
+/** Returns a new temporary path.
+*/
+const char * path_tmpfile(void);
 #endif
+
+#endif

Modified: boost-build/branches/upstream/current/jam_src/pathunix.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/pathunix.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/pathunix.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,6 +6,7 @@
 
 /*  This file is ALSO:
  *  Copyright 2001-2004 David Abrahams.
+ *  Copyright 2005 Rene Rivera.
  *  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)
  */
@@ -15,6 +16,11 @@
 # include "strings.h"
 # include "newstr.h"
 # include "filesys.h"
+# include <time.h>
+# include <stdlib.h>
+# ifndef OS_NT
+# include <unistd.h>
+# endif
 
 # ifdef USE_PATHUNIX
 
@@ -281,11 +287,11 @@
 DWORD ShortPathToLongPath(LPCTSTR lpszShortPath,LPTSTR lpszLongPath,DWORD
                           cchBuffer)
 {
-    DWORD i=0;
+    LONG i=0;
     TCHAR path[_MAX_PATH]={0};
     TCHAR ret[_MAX_PATH]={0};
-    DWORD pos=0, prev_pos=0;
-    DWORD len=_tcslen(lpszShortPath);
+    LONG pos=0, prev_pos=0;
+    LONG len=_tcslen(lpszShortPath);
 
     /* Is the string valid? */
     if (!lpszShortPath) {
@@ -393,5 +399,63 @@
 
 #endif
 
+static string path_tmpdir_buffer[1];
+static const char * path_tmpdir_result = 0;
 
+const char * path_tmpdir()
+{
+    if (!path_tmpdir_result)
+    {
+        # ifdef OS_NT
+        DWORD pathLength = 0;
+        pathLength = GetTempPath(pathLength,NULL);
+        string_new(path_tmpdir_buffer);
+        string_reserve(path_tmpdir_buffer,pathLength);
+        pathLength = GetTempPathA(pathLength,path_tmpdir_buffer[0].value);
+        path_tmpdir_buffer[0].value[pathLength-1] = '\0';
+        path_tmpdir_buffer[0].size = pathLength-1;
+        # else
+        const char * t = getenv("TMPDIR");
+        if (!t)
+        {
+            t = "/tmp";
+        }
+        string_new(path_tmpdir_buffer);
+        string_append(path_tmpdir_buffer,t);
+        # endif
+        path_tmpdir_result = path_tmpdir_buffer[0].value;
+    }
+    return path_tmpdir_result;
+}
+
+const char * path_tmpnam(void)
+{
+    char name_buffer[64];
+    # ifdef OS_NT
+    unsigned long c0 = GetCurrentProcessId();
+    # else
+    unsigned long c0 = getpid();
+    # endif
+    static unsigned long c1 = 0;
+    if (0 == c1) c1 = time(0)&0xffff;
+    c1 += 1;
+    sprintf(name_buffer,"jam%lx%lx.000",c0,c1);
+    return newstr(name_buffer);
+}
+
+const char * path_tmpfile(void)
+{
+    const char * result = 0;
+    
+    string file_path;
+    string_copy(&file_path,path_tmpdir());
+    string_push_back(&file_path,PATH_DELIM);
+    string_append(&file_path,path_tmpnam());
+    result = newstr(file_path.value);
+    string_free(&file_path);
+    
+    return result;
+}
+
+
 # endif /* unix, NT, OS/2, AmigaOS */

Modified: boost-build/branches/upstream/current/jam_src/pwd.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/pwd.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/pwd.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,4 +1,4 @@
-/* Copyright Vladimir Prus 2002. Distributed under the Boost */
+/* Copyright Vladimir Prus 2002, Rene Rivera 2005. Distributed under the Boost */
 /* Software License, Version 1.0. (See accompanying */
 /* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */
 
@@ -21,24 +21,32 @@
 #endif
 #endif
 
+/* The current directory can't change in bjam, so optimize this to cache
+** the result.
+*/
+static char pwd_buffer[PATH_MAX];
+static char * pwd_result = NULL;
 
 
 LIST*
 pwd(void)
 {
-    char buffer[PATH_MAX];
-    if (getcwd(buffer, sizeof(buffer)) == NULL)
+    if (!pwd_result)
     {
-        perror("can not get current directory");
-        return L0;
-    }
-    else
-    {
+        if (getcwd(pwd_buffer, sizeof(pwd_buffer)) == NULL)
+        {
+            perror("can not get current directory");
+            return L0;
+        }
+        else
+        {
 #ifdef NT
-        return list_new(L0, short_path_to_long_path(buffer));
+            pwd_result = short_path_to_long_path(pwd_buffer);
 #else
-        return list_new(L0, newstr(buffer));
+            pwd_result = newstr(pwd_buffer);
 #endif
+        }
     }
+    return list_new(L0, pwd_result);
 }
 

Modified: boost-build/branches/upstream/current/jam_src/regexp.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/regexp.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/regexp.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -42,6 +42,7 @@
  * regular-expression syntax might require a total rethink.
  */
 #include "regexp.h"
+#include "debug.h"
 #include <stdio.h>
 #include <ctype.h>
 #ifndef ultrix
@@ -241,6 +242,8 @@
 	r = (regexp *)malloc(sizeof(regexp) + (unsigned)regsize);
 	if (r == NULL)
 		FAIL("out of space");
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof(regexp) + (unsigned)regsize );
 
 	/* Second pass: emit code. */
 	regparse = (char *)exp;

Modified: boost-build/branches/upstream/current/jam_src/rules.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/rules.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/rules.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -16,6 +16,7 @@
 # include "lists.h"
 # include "pathsys.h"
 # include "timestamp.h"
+# include "debug.h"
 
 /*  This file is ALSO:
  *  Copyright 2001-2004 David Abrahams.
@@ -82,6 +83,9 @@
         r->arguments = 0;
         r->exported = 0;
         r->module = target_module;
+#ifdef HAVE_PYTHON
+        r->python_function = 0;
+#endif
     }
     return r;
 }
@@ -262,6 +266,8 @@
 	TARGET *t;
 
 	t = (TARGET *)malloc( sizeof( *t ) );
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof( *t ) );
 	memset( (char *)t, '\0', sizeof( *t ) );
 	t->name = copystr( ot->name );
 	t->boundname = t->name;
@@ -316,6 +322,8 @@
 	TARGETS *c;
 
 	c = (TARGETS *)malloc( sizeof( TARGETS ) );
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof( TARGETS ) );
 	c->target = target;
 
 	if( !chain ) chain = c;
@@ -362,6 +370,8 @@
 	ACTION	*action )
 {
 	ACTIONS *actions = (ACTIONS *)malloc( sizeof( ACTIONS ) );
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof( ACTIONS ) );
 
 	actions->action = action;
 
@@ -410,7 +420,11 @@
         if ( v )
             settings_freelist = v->next;
         else
+        {
             v = (SETTINGS *)malloc( sizeof( *v ) );
+            if ( DEBUG_PROFILE )
+                profile_memory( sizeof( *v ) );
+        }
         
 	    v->symbol = newstr( symbol );
 	    v->value = value;
@@ -550,6 +564,8 @@
 argument_list* args_new()
 {
     argument_list* r = (argument_list*)malloc( sizeof(argument_list) );
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof(argument_list) );
     r->reference_count = 0;
     lol_init(r->data);
     return r;
@@ -687,6 +703,8 @@
 static rule_actions* actions_new( char* command, LIST* bindlist, int flags )
 {
     rule_actions* result = (rule_actions*)malloc(sizeof(rule_actions));
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof(rule_actions) );
     result->command = copystr( command );
     result->bindlist = bindlist;
     result->flags = flags;
@@ -768,7 +786,7 @@
        here, but we don't have necessary information, such as frame.
     */
     if (!result)
-        result = enter_rule( rulename, root_module() );
+        result = enter_rule( rulename, m );
 
     return result;
 }

Modified: boost-build/branches/upstream/current/jam_src/rules.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/rules.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/rules.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -87,6 +87,9 @@
                                 * appear in the global module and be
                                 * automatically imported into other modules
                                 */
+#ifdef HAVE_PYTHON
+    PyObject* python_function;
+#endif    
 };
 
 /* ACTIONS - a chain of ACTIONs */
@@ -156,8 +159,12 @@
 
 # define T_FLAG_INTERNAL 0x0200    /* internal INCLUDES node */
 
+/*  Indicates that the target must be a file. This prevents matching non-files,
+    like directories, when a target is searched. */
+#define     T_FLAG_ISFILE   0x0400
 
 
+
 #ifdef OPT_SEMAPHORE
 # define 	T_MAKE_SEMAPHORE 5 /* Special target type for semaphores */
 #endif
@@ -174,6 +181,8 @@
 # define 	T_BIND_EXISTS	3	/* real file, timestamp valid */
 
 	TARGETS		*depends;	/* dependencies */
+	TARGETS		*dependents;/* the inverse of dependencies */
+    TARGETS     *rebuilds;  /* targets that should be force-rebuilt whenever this one is */
 	TARGET		*includes;	/* includes */
     TARGET        *original_target; /* original_target->includes = this */
     char rescanned;
@@ -194,14 +203,15 @@
 
 # define	T_FATE_BUILD	5	/* >= BUILD rebuilds target */
 # define	T_FATE_TOUCHED	5	/* manually touched with -t */
-# define	T_FATE_MISSING	6	/* is missing, needs updating */
-# define	T_FATE_NEEDTMP	7	/* missing temp that must be rebuild */
-# define 	T_FATE_OUTDATED	8	/* is out of date, needs updating */
-# define 	T_FATE_UPDATE	9	/* deps updated, needs updating */
+# define	T_FATE_REBUILD	6
+# define	T_FATE_MISSING	7	/* is missing, needs updating */
+# define	T_FATE_NEEDTMP	8	/* missing temp that must be rebuild */
+# define 	T_FATE_OUTDATED	9	/* is out of date, needs updating */
+# define 	T_FATE_UPDATE	10	/* deps updated, needs updating */
 
-# define 	T_FATE_BROKEN	10	/* >= BROKEN ruins parents */
-# define 	T_FATE_CANTFIND	10	/* no rules to make missing target */
-# define 	T_FATE_CANTMAKE	11	/* can't find dependents */
+# define 	T_FATE_BROKEN	11	/* >= BROKEN ruins parents */
+# define 	T_FATE_CANTFIND	11	/* no rules to make missing target */
+# define 	T_FATE_CANTMAKE	12	/* can't find dependents */
 
 	char	progress;		/* tracks make1() progress */
 

Modified: boost-build/branches/upstream/current/jam_src/scan.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/scan.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/scan.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -11,6 +11,7 @@
 # include "jamgram.h"
 # include "jambase.h"
 # include "newstr.h"
+# include "debug.h"
 
 /*
  * scan.c - the jam yacc scanner
@@ -82,6 +83,8 @@
 yyfparse( char *s )
 {
 	struct include *i = (struct include *)malloc( sizeof( *i ) );
+    if ( DEBUG_PROFILE )
+        profile_memory( sizeof( *i ) );
 
 	/* Push this onto the incp chain. */
 

Modified: boost-build/branches/upstream/current/jam_src/strings.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/strings.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/strings.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,6 +3,7 @@
 /* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */
 
 #include "strings.h"
+#include "debug.h"
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
@@ -55,6 +56,8 @@
     if ( self->value == self->opt )
     {
         self->value = (char*)malloc( capacity + JAM_STRING_MAGIC_SIZE );
+        if ( DEBUG_PROFILE )
+            profile_memory( capacity + JAM_STRING_MAGIC_SIZE );
         self->value[0] = 0;
         strncat( self->value, self->opt, sizeof(self->opt) );
         assert( strlen( self->value ) <= self->capacity ); /* This is a regression test */
@@ -78,7 +81,7 @@
     assert_invariants( self );
 }
 
-static void extend_full( string* self, char* start, char *finish )
+static void extend_full( string* self, char const* start, char const* finish )
 {
     size_t new_size = self->capacity + ( finish - start );
     size_t new_capacity = self->capacity;
@@ -91,7 +94,7 @@
     self->size = new_size;
 }
 
-void string_append( string* self, char* rhs )
+void string_append( string* self, char const* rhs )
 {
     char* p = self->value + self->size;
     char* end = self->value + self->capacity;
@@ -112,7 +115,7 @@
     assert_invariants( self );
 }
 
-void string_append_range( string* self, char* start, char* finish )
+void string_append_range( string* self, char const* start, char const* finish )
 {
     char* p = self->value + self->size;
     char* end = self->value + self->capacity;
@@ -133,7 +136,7 @@
     assert_invariants( self );
 }
 
-void string_copy( string* s, char* rhs )
+void string_copy( string* s, char const* rhs )
 {
     string_new( s );
     string_append( s, rhs );

Modified: boost-build/branches/upstream/current/jam_src/strings.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/strings.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/strings.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -19,10 +19,10 @@
 } string;
 
 void string_new( string* );
-void string_copy( string*, char* );
+void string_copy( string*, char const* );
 void string_free( string* );
-void string_append( string*, char* );
-void string_append_range( string*, char*, char* );
+void string_append( string*, char const* );
+void string_append_range( string*, char const*, char const* );
 void string_push_back( string* s, char x );
 void string_reserve( string*, size_t );
 void string_truncate( string*, size_t );

Modified: boost-build/branches/upstream/current/jam_src/timestamp.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/timestamp.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/timestamp.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -11,6 +11,8 @@
  */
 
 # include "jam.h"
+# include "debug.h"
+
 # include "hash.h"
 # include "filesys.h"
 # include "pathsys.h"
@@ -69,13 +71,15 @@
 	char	*target,
 	time_t	*time )
 {
+    PROFILE_ENTER(timestamp);
+    
 	PATHNAME f1, f2;
 	BINDING	binding, *b = &binding;
 	string buf[1];
+    string path; 
+	char *p;
 
 # ifdef DOWNSHIFT_PATHS
-        string path; 
-	char *p;
 
         string_copy( &path, target );
         p = path.value;
@@ -181,6 +185,8 @@
 # ifdef DOWNSHIFT_PATHS
         string_free( &path );
 #endif
+    
+    PROFILE_EXIT(timestamp);
 }
 
 static void

Modified: boost-build/branches/upstream/current/jam_src/variable.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/variable.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/variable.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,6 +6,8 @@
 
 /*  This file is ALSO:
  *  Copyright 2001-2004 David Abrahams.
+ *  Copyright 2005 Reece H. Dunn.
+ *  Copyright 2005 Rene Rivera.
  *  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)
  */
@@ -19,7 +21,9 @@
 # include "filesys.h"
 # include "newstr.h"
 # include "strings.h"
+# include "pathsys.h"
 # include <stdlib.h>
+# include <stdio.h>
 
 /*
  * variable.c - handle jam multi-element variables
@@ -78,12 +82,18 @@
 /*
  * var_defines() - load a bunch of variable=value settings
  *
- * If variable name ends in PATH, split value at :'s.  
- * Otherwise, split at blanks.
+ * If preprocess is false, take the value verbatim.
+ *
+ * Otherwise, if the variable value is enclosed in quotes, strip the
+ * quotes.
+ *
+ * Otherwise, if variable name ends in PATH, split value at :'s.
+ *
+ * Otherwise, split the value at blanks.
  */
 
 void
-var_defines( char **e )
+var_defines( char *const* e, int preprocess )
 {
     string buf[1];
 
@@ -93,12 +103,6 @@
 	{
 	    char *val;
 
-	    /* Just say "no": windows defines this in the env, */
-	    /* but we don't want it to override our notion of OS. */
-
-	    if( !strcmp( *e, "OS=Windows_NT" ) )
-		continue;
-
 # ifdef OS_MAC
 	    /* On the mac (MPW), the var=val is actually var\0val */
 	    /* Think different. */
@@ -110,13 +114,20 @@
 	    {
 		LIST *l = L0;
 		char *pp, *p;
+# ifdef OPT_NO_EXTERNAL_VARIABLE_SPLIT
+                char split = '\0';
+# else
 # ifdef OS_MAC
 		char split = ',';
 # else
 		char split = ' ';
 # endif
+# endif
                 size_t len = strlen(val + 1);
-                if ( val[1] == '"' && val[len] == '"')
+
+                int quoted = val[1] == '"' && val[len] == '"' && len > 1;
+                
+                if ( quoted && preprocess )
                 {
                     string_append_range( buf, val + 2, val + len );
                     l = list_new( l, newstr( buf->value ) );
@@ -136,7 +147,10 @@
 
                     /* Do the split */
 
-                    for( pp = val + 1; p = strchr( pp, split ); pp = p + 1 )
+                    for(
+                        pp = val + 1;
+                        preprocess && (p = strchr( pp, split )) != 0;
+                        pp = p + 1 )
                     {
                         string_append_range( buf, pp, p );
                         l = list_new( l, newstr( buf->value ) );
@@ -197,6 +211,97 @@
 
 		if( in[0] == '$' && in[1] == '(' )
 		    dollar++;
+                #ifdef OPT_AT_FILES
+                else if ( in[0] == '@' && in[1] == '(' )
+                {
+                    int depth = 1;
+                    char *ine = in + 2;
+                    char *split = 0;
+                    
+                    /* Scan the content of the response file @() section. */
+                    
+                    while( *ine && depth > 0 )
+                    {
+                        switch( *ine )
+                        {
+                        case '(':
+                            ++depth;
+                            break;
+                        case ')':
+                            --depth;
+                            break;
+                        case ':':
+                            if( depth == 1 && ine[1] == 'E' && ine[2] == '=' )
+                            {
+                                split = ine;
+                            }
+                           break;
+                        }
+                        ++ine;
+                    }
+                    
+                    if (!split)
+                    {
+                        printf( "no file specified!\n" );
+                        exit( EXITBAD );
+                    }
+                    
+                    if ( depth == 0 )
+                    {
+                        string file_name_v;
+                        int file_name_l = 0;
+                        const char * file_name_s = 0;
+                        
+                        /* expand the temporary file name var inline */
+                        #if 0
+                        string_copy(&file_name_v,"$(");
+                        string_append_range(&file_name_v,in+2,split);
+                        string_push_back(&file_name_v,')');
+                        #else
+                        string_new(&file_name_v);
+                        string_append_range(&file_name_v,in+2,split);
+                        #endif
+                        file_name_l = var_string(file_name_v.value,out,oute-out+1,lol);
+                        string_free(&file_name_v);
+                        if ( file_name_l < 0 ) return -1;
+                        file_name_s = out;
+                        
+                        /* for stdout/stderr we will create a temp file and generate
+                           a command that outputs the content as needed. */
+                        if ( strcmp( "STDOUT", out ) == 0 || strcmp( "STDERR", out ) == 0 )
+                        {
+                            int err_redir = strcmp( "STDERR", out ) == 0;
+                            out[0] = '\0';
+                            file_name_s = path_tmpfile();
+                            file_name_l = strlen(file_name_s);
+                            #ifdef OS_NT
+                            if ( (out+7+file_name_l+(err_redir?5:0)) >= oute ) return -1;
+                            sprintf( out,"type \"%s\"%s",
+                                file_name_s,
+                                err_redir ? " 1>&2" : "" );
+                            #else
+                            if ( (out+6+file_name_l+(err_redir?5:0)) >= oute ) return -1;
+                            sprintf( out,"cat \"%s\"%s",
+                                file_name_s,
+                                err_redir ? " 1>&2" : "" );
+                            #endif
+                            /* we also make sure that the temp files created by this
+                               get nuked eventually. */
+                            file_remove_atexit( file_name_s );
+                        }
+                        
+                        /* expand the file value into the file reference */
+                        if ( !globs.noexec )
+                            var_string_to_file( split+3, ine-split-4, file_name_s, lol );
+                        
+                        /* continue on with the expansion */
+                        out += strlen(out);
+                    }
+                    
+                    /* and continue with the parsing just past the @() reference */
+                    in = ine;
+                }
+                #endif
 
 		*out++ = *in++;
 	    }
@@ -218,7 +323,7 @@
 
 		out = lastword;
 
-		for( ; l; l = list_next( l ) )
+		while ( l )
 		{
 		    int so = strlen( l->string );
 
@@ -227,7 +332,8 @@
 
 		    strcpy( out, l->string );
 		    out += so;
-		    *out++ = ' ';
+		    l = list_next( l );
+		    if ( l ) *out++ = ' ';
 		}
 
 		list_free( l );
@@ -242,6 +348,102 @@
 	return out - out0;
 }
 
+void var_string_to_file( const char * in, int insize, const char * out, LOL * lol )
+{
+    const char * ine = in+insize;
+    FILE * out_file = 0;
+    if ( strcmp( out, "STDOUT" ) == 0 )
+    {
+        out_file = stdout;
+    }
+    else if ( strcmp( out, "STDERR" ) == 0 )
+    {
+        out_file = stderr;
+    }
+    else
+    {
+        /* Handle "path to file" filenames. */
+        string out_name;
+        if ( out[0] == '"' && out[strlen(out) - 1] == '"' )
+        {
+            string_copy(&out_name,out+1);
+            string_truncate(&out_name,out_name.size-1);
+        }
+        else
+        {
+            string_copy(&out_name,out);
+        }
+        out_file = fopen( out_name.value, "w" );
+        if (!out_file)
+        {
+            printf( "failed to write output file '%s'!\n", out_name.value );
+            exit( EXITBAD );
+        }
+        string_free(&out_name);
+    }
+
+    while( *in && in < ine )
+    {
+        int dollar = 0;
+        const char * output_0 = in;
+        const char * output_1 = in;
+
+        /* Copy white space */
+
+        while ( output_1 < ine && *output_1 && isspace( *output_1 ) )
+        {
+            ++output_1;
+        }
+        if ( output_0 < output_1 )
+        {
+            fwrite(output_0,output_1-output_0,1,out_file);
+        }
+        output_0 = output_1;
+
+        /* Copy non-white space, watching for variables */
+
+        while( output_1 < ine && *output_1 && !isspace( *output_1 ) )
+        {
+            if( output_1[0] == '$' && output_1[1] && output_1[1] == '(' )
+            {
+                dollar++;
+            }
+            ++output_1;
+        }
+
+        /* If a variable encountered, expand it and and embed the */
+        /* space-separated members of the list in the output. */
+
+        if( dollar )
+        {
+            LIST *l;
+
+            l = var_expand( L0, (char*)output_0, (char*)output_1, lol, 0 );
+
+            while ( l )
+            {
+                fputs( l->string, out_file );
+                l = list_next( l );
+                if ( l ) fputc( ' ', out_file );
+            }
+
+            list_free( l );
+        }
+        else if ( output_0 < output_1 )
+        {
+            fwrite(output_0,output_1-output_0,1,out_file);
+        }
+        
+        in = output_1;
+    }
+
+    if ( out_file != stdout && out_file != stderr )
+    {
+        fflush( out_file );
+        fclose( out_file );
+    }
+}
+
 /*
  * var_get() - get value of a user defined symbol
  *
@@ -251,18 +453,44 @@
 LIST *
 var_get( char *symbol )
 {
-	VARIABLE var, *v = &var;
-
-	v->symbol = symbol;
-
-	if( varhash && hashcheck( varhash, (HASHDATA **)&v ) )
-	{
-	    if( DEBUG_VARGET )
-		var_dump( v->symbol, v->value, "get" );
-	    return v->value;
-	}
+    LIST * result = 0;
+    #ifdef OPT_AT_FILES
+    /* Some "fixed" variables... */
+    if ( strcmp( "TMPDIR", symbol ) == 0 )
+    {
+        result = list_new( L0, newstr( (char*)path_tmpdir() ) );
+    }
+    else if ( strcmp( "TMPNAME", symbol ) == 0 )
+    {
+        result = list_new( L0, newstr( (char*)path_tmpnam() ) );
+    }
+    else if ( strcmp( "TMPFILE", symbol ) == 0 )
+    {
+        result = list_new( L0, newstr( (char*)path_tmpfile() ) );
+    }
+    else if ( strcmp( "STDOUT", symbol ) == 0 )
+    {
+        result = list_new( L0, newstr( "STDOUT" ) );
+    }
+    else if ( strcmp( "STDERR", symbol ) == 0 )
+    {
+        result = list_new( L0, newstr( "STDERR" ) );
+    }
+    else
+    #endif
+    {
+        VARIABLE var, *v = &var;
     
-	return 0;
+        v->symbol = symbol;
+    
+        if( varhash && hashcheck( varhash, (HASHDATA **)&v ) )
+        {
+            if( DEBUG_VARGET )
+                var_dump( v->symbol, v->value, "get" );
+            result = v->value;
+        }
+    }
+    return result;
 }
 
 /*

Modified: boost-build/branches/upstream/current/jam_src/variable.h
===================================================================
--- boost-build/branches/upstream/current/jam_src/variable.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/variable.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -10,7 +10,7 @@
 
 struct hash;
 
-void 	var_defines( char **e );
+void 	var_defines( char* const *e, int preprocess );
 int 	var_string( char *in, char *out, int outsize, LOL *lol );
 LIST * 	var_get( char *symbol );
 void 	var_set( char *symbol, LIST *value, int flag );
@@ -18,6 +18,13 @@
 void 	var_done();
 void    var_hash_swap( struct hash** );
 
+/** Expands the "in" expression directly into the "out" file.
+    The file can be one of: a path, STDOUT, or STDERR to send
+    the output to a file overwriting previous content, to
+    the console, or to the error output respectively.
+*/
+void var_string_to_file( const char * in, int insize, const char * out, LOL * lol );
+
 /*
  * Defines for var_set().
  */

Modified: boost-build/branches/upstream/current/jam_src/w32_getreg.c
===================================================================
--- boost-build/branches/upstream/current/jam_src/w32_getreg.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/jam_src/w32_getreg.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,6 +3,9 @@
 /* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */
 
 # include "jam.h"
+
+# if defined( OS_NT ) || defined( OS_CYGWIN )
+
 # include "lists.h"
 # include "newstr.h"
 # include "parse.h"
@@ -63,8 +66,9 @@
         && ERROR_SUCCESS == RegOpenKeyEx(key, path, 0, KEY_QUERY_VALUE, &key) 
     )
     {
-        DWORD  type, len;
+        DWORD  type;
         BYTE   data[MAX_REGISTRY_DATA_LENGTH];
+        DWORD  len = sizeof(data);
         LIST const* const field = lol_get(frame->args, 1);
         
         if ( ERROR_SUCCESS ==
@@ -121,3 +125,4 @@
     return  result;
 }
 
+# endif


Property changes on: boost-build/branches/upstream/current/kernel/boost-build.jam
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/kernel/bootstrap.jam
===================================================================
--- boost-build/branches/upstream/current/kernel/bootstrap.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/kernel/bootstrap.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,17 +1,80 @@
 # (C) Copyright David Abrahams, 2001.
-# (C) Copyright Rene Rivera, 2003.
+# (C) Copyright Rene Rivera, 2003 2006.
 #
 # See accompanying license for terms and conditions of use.
 #
 
 # First of all, check the jam version
 
-if $(JAM_VERSION:J="") < 030109
+if $(JAM_VERSION:J="") < 030112
 {
-    ECHO "error: Boost.Jam version 3.1.9 or later required" ;
+    ECHO "error: Boost.Jam version 3.1.12 or later required" ;
     EXIT ;
-} 
+}
 
+local required-rules = GLOB-RECURSIVELY HAS_NATIVE_RULE ;
+
+for local r in $(required-rules)
+{
+    if ! $(r) in [ RULENAMES ]
+    {
+        ECHO "error: builtin rule '$(r)' is not present" ;
+        ECHO "error: your version of bjam is likely out of date" ;
+        ECHO "error: please get a fresh version from CVS." ;
+        EXIT ;
+    }
+}
+
+local native =
+    regex transform 2
+    ;
+while $(native)
+{
+    if ! [ HAS_NATIVE_RULE $(native[1]) :
+                           $(native[2]) :
+               $(native[3]) ]
+    {
+        ECHO "error: missing native rule '$(native[1]).$(native[2])'" ;
+        ECHO "error: or interface version of that rule is too low" ;
+        ECHO "error: your version of bjam is likely out of date" ;
+        ECHO "error: please get a fresh version from CVS." ;
+        EXIT ;
+    }
+    native = $(native[4-]) ;
+}
+
+# Check that the builtin .ENVIRON module is present. We don't have a
+# builtin to check that a module is present, so we assume that the PATH
+# environment variable is always set and verify that the .ENVIRON module
+# has non-empty value of that variable.
+module .ENVIRON
+{
+    local p = $(PATH) $(Path) $(path) ;
+    if ! $(p)
+    {
+        ECHO "error: no builtin module .ENVIRON is found" ;
+        ECHO "error: your version of bjam is likely out of date" ;
+        ECHO "error: please get a fresh version from CVS." ;
+        EXIT ;
+    }
+}
+
+# Check that @() functionality is present. Similarly to modules,
+# we don't have a way to test that directly. Instead we check that
+# $(TMPNAME) functionality is present which was added at roughly
+# the same time (more precisely it was added just before).
+{
+    if ! $(TMPNAME)
+    {
+        ECHO "error: no @() functionality found" ;
+        ECHO "error: your version of bjam is likely out of date" ;
+        ECHO "error: please get a fresh version from CVS." ;
+        EXIT ;
+    }
+}
+
+
+
 # Bootstrap the module system. Then bring the import rule into the global module.
 #
 SEARCH on <module@>modules.jam = $(.bootstrap-file:D) ;
@@ -25,21 +88,23 @@
     # separation of different layers without changing all of our code
     # to specify subdirectories in import statements or use an extra
     # level of qualification on imported names.
-    
-    local subdirs = 
+
+    local subdirs =
       kernel        # only the most-intrinsic modules: modules, errors
       util          # low-level substrate: string/number handling, etc.
       build         # essential elements of the build system architecture
       tools         # toolsets for handling specific build jobs and targets.
-      
+
       new           # until we get everything sorted out, there is
                     # still some code here
-      
+
       .             # build-system.jam lives here
-      
+
       ;
     local whereami = [ NORMALIZE_PATH $(.bootstrap-file:DT) ] ;
     BOOST_BUILD_PATH += $(whereami:D)/$(subdirs) ;
+
+    modules.poke .ENVIRON : BOOST_BUILD_PATH : $(BOOST_BUILD_PATH) ;
 }
 
 # Reload the modules, to clean up things. The modules module can tolerate
@@ -47,70 +112,17 @@
 #
 import modules ;
 
-# Check command-line args as soon as possible.  For each option try
-# to load module named after option. Is that succeeds, invoke 'process'
-# rule in the module. The rule may return "true" to indicate that the
-# regular built process should not be attempted.
+# Process option plugins first to alow them to prevent loading
+# the rest of the build system.
 #
-# Options take the general form of: --<name>[=<value>] [<value>]
+import option ;
+local dont-build = [ option.process ] ;
+
+# Should we skip building, i.e. loding the build system, according
+# to the options processed?
 #
-local dont-build ;
-local args = $(ARGV) ;
-while $(args)
+if ! $(dont-build)
 {
-    local arg = [ MATCH ^--(.*) : $(args[1]) ] ;
-    while $(args[2-]) && ! $(arg)
-    {
-        args = $(args[2-]) ;
-        arg = [ MATCH ^--(.*) : $(args[1]) ] ;
-    }
-    args = $(args[2-]) ;
-    
-    if $(arg)
-    {
-        local split = [ MATCH ^(([^-=]+)[^=]*)(=?)(.*)$ : $(arg) ] ;
-        local full-name = $(split[1]) ;
-        local prefix = $(split[2]) ;
-        local values ;
-        
-        if $(split[3])
-        {
-            values = $(split[4]) ;
-        }
-        if $(args) && ! [ MATCH ^(--).* : $(args[1]) ]
-        {
-            values += $(args[1]) ;
-            args = $(args[2-]) ;
-        }
-        
-        # look in options subdirectories of BOOST_BUILD_PATH for modules
-        # matching the full option name and then its prefix.
-        local plugin-dir = options ;
-        local option-files = [ 
-            GLOB $(plugin-dir:D=$(BOOST_BUILD_PATH)) : $(full-name).jam $(prefix).jam 
-            ] ;
-        
-        if $(option-files)
-        {
-            # load the file into a module named for the option
-            local f = $(option-files[1]) ;
-            local module-name = --$(f:D=:S=) ;
-            modules.load $(module-name) : $(f:D=) : $(f:D) ;
-            
-            # if there's a process rule, call it with the full option name
-            # and its value (if any).  If there was no "=" in the option,
-            # the value will be empty.
-            if process in [ RULENAMES $(module-name) ]
-            {
-                dont-build += 
-                  [ modules.call-in $(module-name) : process --$(full-name) : $(values) ] ;
-            }
-        }
-    }
-}
-
-if ! $(dont-build)
-{   
     # Allow users to override the build system file from the
     # command-line (mostly for testing)
     local build-system = [ MATCH --build-system=(.*) : $(ARGV) ] ;
@@ -119,3 +131,4 @@
     # Use last element in case of multiple command-line options
     import $(build-system[-1]) ;
 }
+


Property changes on: boost-build/branches/upstream/current/kernel/bootstrap.jam
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/kernel/class.jam
===================================================================
--- boost-build/branches/upstream/current/kernel/class.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/kernel/class.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -82,17 +82,17 @@
 
 rule new ( class args * : * )
 {
-    .next-instance.$(class) ?= 1 ;
-    local id = object($(class))@$(.next-instance.$(class)) ;
+    .next-instance ?= 1 ;
+    local id = object($(class))@$(.next-instance) ;
     
-    xinit $(id) : $(class) ;    
-       
+    xinit $(id) : $(class) ;
+    
     INSTANCE $(id) : class@$(class) ;
     IMPORT_MODULE $(id) : ;
     $(id).__init__ $(args) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
-          
+    
     # bump the next unique object name
-    .next-instance.$(class) = [ numbers.increment $(.next-instance.$(class)) ] ;
+    .next-instance = [ numbers.increment $(.next-instance) ] ;
     
     # Return the name of the new instance.
     return $(id) ;

Modified: boost-build/branches/upstream/current/kernel/errors.jam
===================================================================
--- boost-build/branches/upstream/current/kernel/errors.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/kernel/errors.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -17,43 +17,47 @@
         drop-elements = 5 ;
     }
     
-    # get the whole backtrace, then drop the initial quadruples
-    # corresponding to the frames that must be skipped.
-    local bt = [ BACKTRACE ] ;
-    bt = $(bt[$(drop-elements)-]) ; 
-    
-    local args = $(.args) ;
-    while $(bt)
+    local args = $(.args) ;    
+    if $(.user-modules-only)
     {
-        local m = [ MATCH ^(.+)\\.$ : $(bt[3]) ] ;
-        local user-modules = ([Jj]amfile(.jam|.v2)|user-config.jam|site-config.jam|project-root.jam) ;
-        
-        if $(.user-modules-only) 
-        {
-            if [ MATCH $(user-modules) : $(bt[1]:D=) ] 
-            {                
-                ECHO "$(prefix) at $(bt[1]):$(bt[2]) " ;
-            }            
-        }        
-        else          
+        local bt = [ nearest-user-location ] ;
+        ECHO "$(prefix) at $(bt) " ;
+        for local n in $(args)
         {            
-            ECHO $(bt[1]):$(bt[2]): "in" $(bt[4]) "from module" $(m) ;
-        }
-                
-        # the first time through, print each argument on a separate
-        # line
-        for local n in $(args)
-        {
             if $($(n))-is-not-empty
             {
                 ECHO $(prefix) $($(n)) ;
             }
+        }        
+    }
+    else
+    {
+        # get the whole backtrace, then drop the initial quadruples
+        # corresponding to the frames that must be skipped.
+        local bt = [ BACKTRACE ] ;
+        bt = $(bt[$(drop-elements)-]) ; 
+        
+        while $(bt)
+        {
+            local m = [ MATCH ^(.+)\\.$ : $(bt[3]) ] ;
+            ECHO $(bt[1]):$(bt[2]): "in" $(bt[4]) "from module" $(m) ;
+       
+                        
+            # the first time through, print each argument on a separate
+            # line
+            for local n in $(args)
+            {
+                if $($(n))-is-not-empty
+                {
+                    ECHO $(prefix) $($(n)) ;
+                }
+            }
+            args = ; # kill args so that this never happens again
+            
+            # Move on to the next quadruple
+            bt = $(bt[5-]) ;
         }
-        args = ; # kill args so that this never happens again
-        
-        # Move on to the next quadruple
-        bt = $(bt[5-]) ;
-    }
+    }    
 }
 
 .args ?= messages 2 3 4 5 6 7 8 9 ;
@@ -215,7 +219,18 @@
     return $(result) ;
 }
 
+# If optimized rule is available in jam, use it.
+if NEAREST_USER_LOCATION in [ RULENAMES ] 
+{
+    rule nearest-user-location ( )
+    {
+        local r = [ NEAREST_USER_LOCATION ] ;
+        return $(r[1]):$(r[2]) ;
+    }    
+}
 
+
+
 rule __test__ ( )
 {
     # show that we can correctly catch an expected error


Property changes on: boost-build/branches/upstream/current/kernel/errors.jam
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/kernel/modules.jam
===================================================================
--- boost-build/branches/upstream/current/kernel/modules.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/kernel/modules.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -205,6 +205,9 @@
     return $(result) ;
 }
 
+.cwd = [ PWD ] ;
+
+
 # load the indicated module and import rule names into the current
 # module. Any members of rules-opt will be available without
 # qualification in the caller's module. Any members of rename-opt will
@@ -238,18 +241,17 @@
             # if the importing module isn't already in the BOOST_BUILD_PATH,
             # prepend it to the path.  We don't want to invert the search
             # order of modules that are already there.
-            local cwd = [ PWD ] ;
-            
+                        
             local caller-location ; 
             if $(caller)
             {
                 caller-location = [ binding $(caller) ] ;
                 caller-location = $(caller-location:D) ;
-                caller-location = [ normalize-raw-paths $(caller-location:R=$(cwd)) ] ;
+                caller-location = [ normalize-raw-paths $(caller-location:R=$(.cwd)) ] ;
             }
             
             local search = [ peek : BOOST_BUILD_PATH ] ;
-            search = [ normalize-raw-paths $(search:R=$(cwd)) ] ;
+            search = [ normalize-raw-paths $(search:R=$(.cwd)) ] ;
             
             if $(caller-location) && ! $(caller-location) in $(search)
             {


Property changes on: boost-build/branches/upstream/current/kernel/modules.jam
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/notes/README.txt
===================================================================
--- boost-build/branches/upstream/current/notes/README.txt	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/notes/README.txt	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,4 @@
+
+This directory contains various development notes. Some of them
+may eventually find the way into documentation, so are purely
+imlementation comments.

Added: boost-build/branches/upstream/current/notes/build_dir_option.txt
===================================================================
--- boost-build/branches/upstream/current/notes/build_dir_option.txt	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/notes/build_dir_option.txt	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,76 @@
+
+Summary
+-------
+
+We need a --build-dir option that users building from read-only
+medium can use to force building to some other location. Pretty much
+every project need this functionality, so it's desirable to have it
+out-of-the box, without explicit setup.
+
+Design
+------
+
+We can achieve the desired effect manually by adding something like this
+to Jamroot:
+
+  project .... : build-dir [ my-rule-to-compute-build-dir ] ;
+
+Where 'my-rule-to-compute-build-dir' would look at the --build-dir option.
+
+We need to automate this, but essentially, --build-dir will only affect
+the 'build-dir' attribute of Jamroots.
+
+If Jamroot contains:
+
+   project foo ;
+
+and --build-dir options' value if /tmp/build, then we'll act as if Jamroot
+contained:
+
+   project foo : build-dir /tmp/build/foo ;
+
+If the 'project' rule has explicit 'build-dir':
+
+   project foo : build-dir bin.v2 ;
+
+then with the same value of --build-dir we'd act as if Jamroot contained:
+
+   project foo : build-dir /tmp/build/foo/bin.v2 ;
+
+We can't drop "bin.v2" because it's quite possible that the name of build
+dir have specific meaning. For example, it can be used to 
+separate Boost.Build V2 and V1 build results.
+
+The --build-dir option has no effect if Jamroot does not define any project
+id. Dowing otherwise can lead to nasty problems if we're building two distinct
+projects (that is with two different Jamroot). They'll get the same build
+directory. Most likely, user will see
+the "duplicate target" error, which is generally confusing.
+
+It is expected that any non-trivial project will have top-level "project"
+invocation with non empty id, so the above limitation is not so drastic.
+We'll emit a warning if Jamroot does not define project id, and --build-dir
+is specified.
+
+Here's the exact behavior of the --build-dir option. If we're loading a
+Jamfile (either  root or non-root), that declare some project id and some
+build-dir attribute, the following table gives the value of build-dir
+that will actually be used.
+
+
+Root?    Id     Build-dir attribute            Resulting build dir
+yes      none    *                             --build-dir is ignored, with warning 
+yes      'foo'   none                          /tmp/build/foo
+yes      'foo'   'bin.v2'                      /tmp/build/foo/bin.v2
+yes      'foo'   '/tmp/bar'                    Error [1]
+no       *      none                           --build-dir has no effect,                                                  inherited build dir is used
+no       *      non-empty                      Error [2]
+
+[1] -- not clear what to do
+[2] -- can be made to work, but non-empty build-dir 
+attribute in non-root Jamfile does not make much sense even without --build-dir
+
+
+
+
+

Added: boost-build/branches/upstream/current/notes/relative_source_paths.txt
===================================================================
--- boost-build/branches/upstream/current/notes/relative_source_paths.txt	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/notes/relative_source_paths.txt	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,72 @@
+
+Hi,
+recently, we had a couple of problems caused by using relative file paths, and 
+I'd like to discuss what to do.
+
+Let's use the case from CÊdric. Simplified version is:
+
+    exe a : a.cpp dir1/qt_file.h ;
+    exe b : a.cpp dir2/qt_file.h ;
+
+Both exes have the same source cpp file but different *.h files -- which are 
+processed by Qt tools. V2 currently strips directory name from all targets, 
+so it tries to
+
+   - create "bin/mvsc/debug/moc_qt_file.cpp" from dir1/qt_file.h
+   - create "bin/msvc/debug/moc_qt_file.cpp" from dir2/qt_file.h
+
+There are two solutions that I see:
+
+   1. Rewrite the code like:
+      
+      lib aux : a.cpp 
+      exe a : aux dir1/qt_file.h : <location-prefix>a ;
+      exe b : aux dir2/qt_file.h : <location-prefix>b ;
+
+    This way, two version of moc_qt_file.cpp will be generated to different
+    places. 
+
+  2. Rewrite the code like:
+
+      obj a_moc : dir1/qt_file.h : <library>/qt//qt ;
+      exe a : a.cpp a_moc ;
+      obj b_moc : dir2/qt_file.h : <library>/qt//qt ;
+      exe b : a.cpp b_moc ;
+
+     Explicitly changing name for the problematic files.
+
+  3. Generally change V2 so that directory part of source is preserved. This
+      will generate targets:
+     "bin/msvc/debug/dir1/moc_qt_file.cpp" and
+     "bin/msvc/debug/dir2/moc_qt_file.cpp". No problems.
+
+   However, there are some additional questions:
+
+       - What if source has absolute file name?
+       - What if source is "../../include/qt_file.h"?
+
+       We can ignore directory names in those cases (i.e. use the current 
+       behaviour) but that would be a bit inconsistent.
+
+Any opinions?
+
+Pedro Ferreira:
+
+I think this is a corner case and BB should not try to solve everything 
+automatically - otherwise it will become really complex.
+I don't see a problem in requiring the user to help the build system by 
+using solutions 1 or 2.
+Of course, the better the error reporting, the easier it will be to 
+find the cause and the cure of the problem.
+
+TEMPLIE Cedric:
+
+I agree with Pedro. Solution 1 or 2 is the best way to deal with this 
+problem. Of course I have a preference for the solution 1, but the 
+solution 2 has the advantage to work without any modification...
+
+Toon Knapen:
+
+I agree.
+
+

Modified: boost-build/branches/upstream/current/options/help.jam
===================================================================
--- boost-build/branches/upstream/current/options/help.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/options/help.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -11,6 +11,9 @@
 import doc : do-scan set-option set-output set-output-file print-help-usage print-help-top ;
 import sequence ;
 import set ;
+import project ;
+import print ;
+import os ;
 
 
 # List of possible modules, but which really aren't.
@@ -55,37 +58,36 @@
             local module-files = [ GLOB $(path-to-modules) : $(m)\\.jam ] ;
             modules-to-scan += $(module-files[1]) ;
         }
-        do-scan $(modules-to-scan[1--2]) ;
-        do-scan $(modules-to-scan[-1]) : print-help-all ;
+        do-scan $(modules-to-scan) : print-help-all ;
         did-help = true ;
-        
+
         case --help-enable-* :
         local option = [ MATCH --help-enable-(.*) : $(command) ] ; option = $(option:L) ;
         set-option $(option) : enabled ;
         did-help = true ;
-        
+
         case --help-disable-* :
         local option = [ MATCH --help-disable-(.*) : $(command) ] ; option = $(option:L) ;
         set-option $(option) ;
         did-help = true ;
-        
+
         case --help-output :
         set-output $(values[1]) ;
         did-help = true ;
-        
+
         case --help-output-file :
         set-output-file $(values[1]) ;
         did-help = true ;
-        
+
         case --help-options :
         local doc-module-spec = [ split-symbol doc ] ;
         do-scan $(doc-module-spec[1]) : print-help-options ;
         did-help = true ;
-        
+
         case --help-usage :
         print-help-usage ;
         did-help = true ;
-        
+
         case --help :
         local spec = $(values[1]) ;
         if $(spec)
@@ -111,6 +113,31 @@
         }
         else
         {
+            # First print documentation from the current Jamfile, if any.
+            local project-file =
+                [ project.find-jamfile . : no-error ]
+                [ project.find-jamfile . parent : no-error ] ;
+            for local p in $(project-file)
+            {
+                do-scan $(p) : print-help-project $(p) ;
+            }
+            
+            # Next any user-config help.
+            local user-path = [ os.home-directories ] [ os.environ BOOST_BUILD_PATH ] ;
+            local user-config = [ GLOB $(user-path) : user-config.jam ] ;
+            if $(user-config)
+            {
+                do-scan $(user-config[1]) : print-help-config user $(user-config[1]) ;
+            }
+            
+            # Next any site-config help.
+            local site-config = [ GLOB $(user-path) : site-config.jam ] ;
+            if $(site-config)
+            {
+                do-scan $(site-config[1]) : print-help-config site $(site-config[1]) ;
+            }
+
+            # Then the overall help.
             print-help-top ;
         }
         did-help = true ;
@@ -118,6 +145,7 @@
     if $(did-help)
     {
         UPDATE all ;
+        NOCARE all ;
     }
     return $(did-help) ;
 }
@@ -138,11 +166,11 @@
         local module-path = [ GLOB $(path-to-modules) : $(module-name)\\.jam ] ;
         if $(module-path)
         {
-            # The 'module-name' in fact refers to module. Return the full 
-            # module path and a symbol within it. If 'symbol' passed to this 
-            # rule is already module, 'symbol-name' will be empty. Otherwise, 
-            # it's initialized on the previous loop iteration. 
-            # In case there are several modules by this name, 
+            # The 'module-name' in fact refers to module. Return the full
+            # module path and a symbol within it. If 'symbol' passed to this
+            # rule is already module, 'symbol-name' will be empty. Otherwise,
+            # it's initialized on the previous loop iteration.
+            # In case there are several modules by this name,
             # use the first one.
             result = $(module-path[1]) $(symbol-name) ;
         }


Property changes on: boost-build/branches/upstream/current/options/help.jam
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/.cvsignore
===================================================================
--- boost-build/branches/upstream/current/test/.cvsignore	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/.cvsignore	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1 @@
+*.pyc test_results.txt failed_test test-config.jam
\ No newline at end of file

Modified: boost-build/branches/upstream/current/test/BoostBuild.py
===================================================================
--- boost-build/branches/upstream/current/test/BoostBuild.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/BoostBuild.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -20,16 +20,18 @@
     return toolset or 'gcc'
 
 windows = 0
+if os.environ.get('OS','').lower().startswith('windows') or \
+       os.__dict__.has_key('uname') and \
+       os.uname()[0].lower().startswith('cygwin'):
+    windows = 1
+
 suffixes = {}
 
 # Prepare the map of suffixes
 def prepare_suffix_map(toolset):
     global windows, suffixes    
     suffixes = {'.exe': '', '.dll': '.so', '.lib': '.a', '.obj': '.o'}
-    if os.environ.get('OS','').lower().startswith('windows') or \
-       os.__dict__.has_key('uname') and \
-       os.uname()[0].lower().startswith('cygwin'):
-        windows = 1
+    if windows:
         suffixes = {}
         if toolset in ["gcc"]:
             suffixes['.lib'] = '.a' # static libs have '.a' suffix with mingw...
@@ -37,6 +39,9 @@
     if os.__dict__.has_key('uname') and os.uname()[0] == 'Darwin':
         suffixes['.dll'] = '.dylib'
 
+lib_prefix = 1
+if windows:
+    lib_prefix = 0
         
     
     
@@ -68,13 +73,20 @@
     Optional argument `executable` indicates the name of the
     executable to invoke. Set this to "jam" to test Boost.Build v1
     behavior.
+
+    Optional argument `work_dir` indicates an absolute directory, 
+    where the test will run be run.
     """
     def __init__(self, arguments="", executable = 'bjam', match =
                  TestCmd.match_exact, boost_build_path = None,
                  translate_suffixes = 1, pass_toolset = 1,
+                 workdir = '',
                  **keywords):
 
         self.original_workdir = os.getcwd()
+        if workdir != '' and not os.path.isabs(workdir):
+            raise "Parameter workdir <"+workdir+"> must point to a absolute directory: "
+
         self.last_build_time = 0
         self.translate_suffixes = translate_suffixes
 
@@ -93,7 +105,11 @@
                     print 'Setting $TMP to /tmp to get around problem with short path names'
                     os.environ['TMP'] = '/tmp'
             elif os.uname()[0] == 'Linux':
-                jam_build_dir = "bin.linuxx86"
+                cpu = os.uname()[4]
+                if re.match("i.86", cpu):
+                    jam_build_dir = "bin.linuxx86";
+                else:
+                    jam_build_dir = "bin.linux" + os.uname()[4]
             elif os.uname()[0] == 'SunOS':
                 jam_build_dir = "bin.solaris"
             elif os.uname()[0] == 'Darwin':
@@ -102,6 +118,10 @@
                 jam_build_dir = "bin.aix"
             elif os.uname()[0] == "IRIX64":
                 jam_build_dir = "bin.irix"
+            elif os.uname()[0] == "FreeBSD":
+                jam_build_dir = "bin.freebsd"
+            elif os.uname()[0] == "OSF1":
+                jam_build_dir = "bin.osf"
             else:
                 raise "Don't know directory where jam is build for this system: " + os.name + "/" + os.uname()[0]
         else:
@@ -121,7 +141,9 @@
         # Find there jam_src is located.
         # try for the debug version if it's lying around
 
-        dirs = [os.path.join('../../jam_src', jam_build_dir + '.debug'),
+        dirs = [os.path.join('../../../jam/src', jam_build_dir + '.debug'),
+                os.path.join('../../../jam/src', jam_build_dir),
+                os.path.join('../../jam_src', jam_build_dir + '.debug'),
                 os.path.join('../../jam_src', jam_build_dir),
                 os.path.join('../jam_src', jam_build_dir + '.debug'),
                 os.path.join('../jam_src', jam_build_dir),
@@ -147,7 +169,7 @@
             self
             , program=program_list
             , match=match
-            , workdir=''
+            , workdir = workdir
             , **keywords)
 
         os.chdir(self.workdir)
@@ -257,6 +279,12 @@
         self, extra_args='', subdir='', stdout = None, stderr = '',
         status = 0, match = None, pass_toolset = None, **kw):
 
+        if os.path.isabs(subdir):
+            if stderr:
+                print "You must pass a relative directory to subdir <"+subdir+">."
+            status = 1
+            return
+
         self.previous_tree = build_tree(self.workdir)
 
         if match is None:
@@ -342,7 +370,7 @@
         if condition and dump_stdio:
             self.dump_stdio()
 
-        if '--preserve' in sys.argv:
+        if condition and '--preserve' in sys.argv:
             print 
             print "*** Copying the state of working dir into 'failed_test' ***"
             print 
@@ -451,6 +479,7 @@
             self.ignore('*.pdb') # msvc program database files
             self.ignore('*.rsp') # response files
             self.ignore('*.tds') # borland debug symbols
+            self.ignore('*.manifest') # msvc DLL manifests
 
         # debug builds of bjam built with gcc produce this profiling data
         self.ignore('gmon.out')
@@ -523,6 +552,20 @@
         """Removes in-place, element of 'list' that match the given wildcard."""
         list[:] = filter(lambda x, w=wildcard: not fnmatch.fnmatch(x, w), list)
 
+    def adjust_lib_name(self, name):
+        global lib_prefix
+        result = name
+        
+        pos = string.rfind(name, ".")
+        if pos != -1:
+            suffix = name[pos:]
+            if suffix in [".lib", ".dll"]:
+                (head, tail) = os.path.split(name)
+                if lib_prefix:
+                    tail = "lib" + tail
+                    result = os.path.join(head, tail)
+        return result
+                
     def adjust_suffix(self, name):
         if not self.translate_suffixes:
             return name
@@ -544,7 +587,8 @@
     def adjust_names(self, names):
         if type(names) == types.StringType:
                 names = [names]
-        r = map(self.adjust_suffix, names)
+        r = map(self.adjust_lib_name, names)
+        r = map(self.adjust_suffix, r)
         r = map(lambda x, t=self.toolset: string.replace(x, "$toolset", t), r)
         return r
 
@@ -556,7 +600,7 @@
     # Wait while time is no longer equal to the time last "run_build_system"
     # call finished.
     def wait_for_time_change(self):
-        while int(time.time()) == int(self.last_build_time):
+        while int(time.time()) < int(self.last_build_time) + 1:
             time.sleep(0.1)
 
             

Modified: boost-build/branches/upstream/current/test/TestCmd.py
===================================================================
--- boost-build/branches/upstream/current/test/TestCmd.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/TestCmd.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -525,28 +525,32 @@
         path name.  If the path is a null string (''), a unique
         directory name is created.
         """
-        if (path != None):
-            if path == '':
-                path = tempfile.mktemp()
-            if path != None:
-                os.mkdir(path)
-            self._dirlist.append(path)
-            global _Cleanup
-            try:
-                _Cleanup.index(self)
-            except ValueError:
-                _Cleanup.append(self)
-            # We'd like to set self.workdir like this:
-            #        self.workdir = path
-            # But symlinks in the path will report things
-            # differently from os.getcwd(), so chdir there
-            # and back to fetch the canonical path.
-            cwd = os.getcwd()
-            os.chdir(path)
-            self.workdir = os.getcwd()
-            os.chdir(cwd)
+
+        if os.path.isabs(path):
+            self.workdir = path
         else:
-            self.workdir = None
+            if (path != None):
+                if path == '':
+                    path = tempfile.mktemp()
+                if path != None:
+                    os.mkdir(path)
+                self._dirlist.append(path)
+                global _Cleanup
+                try:
+                    _Cleanup.index(self)
+                except ValueError:
+                    _Cleanup.append(self)
+                # We'd like to set self.workdir like this:
+                #        self.workdir = path
+                # But symlinks in the path will report things
+                # differently from os.getcwd(), so chdir there
+                # and back to fetch the canonical path.
+                cwd = os.getcwd()
+                os.chdir(path)
+                self.workdir = os.getcwd()
+                os.chdir(cwd)
+            else:
+                self.workdir = None
 
     def workpath(self, *args):
         """Returns the absolute path name to a subdirectory or file

Added: boost-build/branches/upstream/current/test/abs_workdir.py
===================================================================
--- boost-build/branches/upstream/current/test/abs_workdir.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/abs_workdir.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,39 @@
+# Niklaus Giger, 2005-03-15
+# Testing whether we may run a test in a absolute directories
+# There are no tests for temporary directories as this is implictly tested in a lot of other cases
+
+from BoostBuild import Tester
+import os, string
+
+t = Tester(
+      executable="jam"
+    , workdir = os.getcwd()
+    , pass_toolset=0
+    )
+
+jamfile="""
+actions print_pwd { pwd ; }
+print_pwd pwd ;
+Always pwd ;
+"""
+
+t.write("Jamfile", jamfile)
+t.write("project-root.jam", " ")
+
+t.run_build_system(status=0, extra_args = "pwd")
+
+if 'TMP' in os.environ:
+  tmp_dir =os.environ.get('TMP')
+else:
+  tmp_dir ="/tmp"
+
+if string.rfind(t.stdout(), tmp_dir) != -1:
+    t.fail_test(1)
+
+if string.rfind(t.stdout(), 'build/v2/test') == -1:
+    t.fail_test(1)
+
+t.run_build_system(status=1, extra_args = "pwd", subdir ="/must/fail/with/absolute/path",
+                   stderr=None)
+t.cleanup
+

Modified: boost-build/branches/upstream/current/test/absolute_sources.py
===================================================================
--- boost-build/branches/upstream/current/test/absolute_sources.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/absolute_sources.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -52,4 +52,22 @@
 t.run_build_system()
 t.expect_addition("bin/$toolset/debug/a.exe")
 
+# Test absolute path in target ids
+t.rm(".")
+t.write("d1/project-root.jam", "")
+t.write("d1/Jamfile", """
+exe a : a.cpp ;
+""")
+t.write("d1/a.cpp", """
+int main() { return 0; }
+""")
+t.write("d2/project-root.jam", "")
+t.write("d2/Jamfile", """
+local pwd = [ PWD ] ;
+alias x : $(pwd)/../d1//a ;
+""")
+
+t.run_build_system(subdir="d2")
+t.expect_addition("d1/bin/$toolset/debug/a.exe")
+
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/absolute_sources.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/alias.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/alternatives.py
===================================================================
--- boost-build/branches/upstream/current/test/alternatives.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/alternatives.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -85,8 +85,8 @@
 exe a : a_empty.cpp ;
 exe a : a.cpp ;
 """)
-t.run_build_system("--no-error-backtrace", status=1)
-t.fail_test(find(t.stdout(), "because no best-matching alternative could be found") == -1)
+t.run_build_system("--no-error-backtrace", status=None)
+t.fail_test(find(t.stdout(), "No best alternative") == -1)
 
 # Another ambiguity test: two matches properties in one alternative are
 # neither better nor worse than a single one in another alternative.
@@ -95,8 +95,8 @@
 exe a : a.cpp : <debug-symbols>on ;
 """)
 
-t.run_build_system("--no-error-backtrace", status=1)
-t.fail_test(find(t.stdout(), "because no best-matching alternative could be found") == -1)
+t.run_build_system("--no-error-backtrace", status=None)
+t.fail_test(find(t.stdout(), "No best alternative") == -1)
 
 
 


Property changes on: boost-build/branches/upstream/current/test/alternatives.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/bad_dirname.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/boostbook/Jamroot
===================================================================
--- boost-build/branches/upstream/current/test/boostbook/Jamroot	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/boostbook/Jamroot	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,3 @@
+
+boostbook docs : docs.xml ;
+doxygen autodoc : [ glob *.hpp ] ;

Added: boost-build/branches/upstream/current/test/boostbook/a.hpp
===================================================================
--- boost-build/branches/upstream/current/test/boostbook/a.hpp	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/boostbook/a.hpp	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,12 @@
+
+// Seems like Boostbook does like classes outside of namespaces,
+// and won't generate anything for them.
+namespace boost {
+
+/// A class
+class A {
+public:
+    /// A constructor
+    A();    
+};
+}
\ No newline at end of file

Added: boost-build/branches/upstream/current/test/boostbook/docs.xml
===================================================================
--- boost-build/branches/upstream/current/test/boostbook/docs.xml	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/boostbook/docs.xml	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+     "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+<library 
+    name="library"
+    dirname="librarys" id="library" 
+    xmlns:xi="http://www.w3.org/2001/XInclude">
+  <libraryinfo>
+    <author>
+      <firstname>Joe</firstname>
+      <surname>Hacker</surname>
+    </author>
+    
+    <copyright>
+      <year>7002</year>
+      <holder>Joe Hacker</holder>
+    </copyright>
+
+  </libraryinfo>
+  
+  <title>Documentation</title>
+  
+  <section>
+    <title>Introduction</title>
+
+    <para>This is introduction</para>
+    
+  </section>
+   
+  <xi:include href="autodoc.boostbook"/> 
+</library>

Added: boost-build/branches/upstream/current/test/boostbook.py
===================================================================
--- boost-build/branches/upstream/current/test/boostbook.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/boostbook.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,22 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2004. Permission to copy, use, modify, sell and
+#  distribute this software is granted provided this copyright notice appears in
+#  all copies. This software is provided "as is" without express or implied
+#  warranty, and with no claim as to its suitability for any purpose.
+
+from BoostBuild import Tester, List
+
+# Create a temporary working directory
+t = Tester()
+
+t.set_tree("boostbook")
+# For some reason, the messages are sent to stderr.
+t.run_build_system(stderr="""Writing boost/A.html for refentry(boost.A)
+Writing library/reference.html for section(library.reference)
+Writing index.html for chapter(library)
+Writing HTML.manifest
+""")
+t.expect_addition(["html/boost/A.html", "html/index.html"])
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/boostbook.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: boost-build/branches/upstream/current/test/build_dir.py
===================================================================
--- boost-build/branches/upstream/current/test/build_dir.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/build_dir.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -4,6 +4,9 @@
 # the 'build-dir' project attribute.
 
 from BoostBuild import Tester
+import string
+import os
+
 t = Tester()
 
 
@@ -47,5 +50,57 @@
 t.run_build_system()
 t.expect_addition(["bin/$toolset/debug/a.exe",
                    "src/build/$toolset/debug/b.exe"])
-           
+
+# Now test the '--build-dir' option.
+t.rm(".")
+t.write("Jamroot", "")
+
+# Test that we get an error when no project id is specified.
+t.run_build_system("--build-dir=foo")
+t.fail_test(string.find(t.stdout(),
+                   "warning: the --build-dir option will be ignored") == -1)
+
+t.write("Jamroot", """
+project foo ;
+exe a : a.cpp ;
+build-project sub ;
+""")
+t.write("a.cpp", "int main() { return 0; }\n")
+t.write("sub/Jamfile", "exe b : b.cpp ;\n")
+t.write("sub/b.cpp", "int main() { return 0; }\n")
+
+t.run_build_system("--build-dir=build")
+t.expect_addition(["build/foo/$toolset/debug/a.exe",
+                   "build/foo/sub/$toolset/debug/b.exe"])
+
+t.write("Jamroot", """
+project foo : build-dir bin.v2 ;
+exe a : a.cpp ;
+build-project sub ;
+""")
+
+t.run_build_system("--build-dir=build")
+t.expect_addition(["build/foo/bin.v2/$toolset/debug/a.exe",                   
+                   "build/foo/bin.v2/sub/$toolset/debug/b.exe"])
+
+# Try building in subdir
+t.rm('build')
+t.run_build_system("--build-dir=build", subdir="sub")
+t.expect_addition(["sub/build/foo/bin.v2/sub/$toolset/debug/b.exe"])
+
+
+
+t.write("Jamroot", """
+project foo : build-dir %s ;
+exe a : a.cpp ;
+build-project sub ;
+""" % string.replace(os.getcwd(), '\\', '\\\\'))
+
+t.run_build_system("--build-dir=build", status=1)
+t.fail_test(string.find(t.stdout(),
+                   "Absolute directory specified via 'build-dir' project attribute") == -1)
+
+
+
+
 t.cleanup()        


Property changes on: boost-build/branches/upstream/current/test/build_dir.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/build_file.py
===================================================================
--- boost-build/branches/upstream/current/test/build_file.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/build_file.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Tests that we can build a file (not target), by it's name
+from BoostBuild import Tester, List
+from string import find
+
+# Create a temporary working directory
+t = Tester()
+
+# Create the needed files
+t.write("Jamroot", """
+exe hello : hello.cpp ;
+build-project sub ;
+""")
+t.write("hello.cpp", """
+int main()
+{
+    return 0;
+}
+""")
+t.write("sub/Jamfile", """
+exe hello : hello.cpp ;
+exe sub : hello.cpp ;
+""")
+t.write("sub/hello.cpp", """
+int main()
+{
+    return 0;
+}
+""")
+
+
+t.run_build_system(t.adjust_suffix("hello.obj"))
+
+t.fail_test(find(t.stdout(), "depends on itself") != -1)
+t.expect_addition("bin/$toolset/debug/hello.obj")
+t.expect_addition("sub/bin/$toolset/debug/hello.obj")
+t.expect_nothing_more()
+
+# Remove temporary directories
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/build_file.py
___________________________________________________________________
Name: svn:executable
   + *

Added: boost-build/branches/upstream/current/test/build_no.py
===================================================================
--- boost-build/branches/upstream/current/test/build_no.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/build_no.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Tests that <build>no property prevents a target from being built.
+from BoostBuild import Tester, List
+import string
+
+
+# Create a temporary working directory
+t = Tester()
+
+# Create the needed files
+t.write("Jamroot", """
+exe hello : hello.cpp : <variant>debug:<build>no ;
+""")
+t.write("hello.cpp", """
+int main()
+{
+    return 0;
+}
+
+""")
+
+t.run_build_system()
+t.expect_nothing_more()
+
+t.fail_test(string.find(t.stdout(), "Skipping build of ./hello -- <build>no in properties.") == -1)
+
+t.run_build_system("release")
+t.expect_addition("bin/$toolset/release/hello.exe")
+
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/build_no.py
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: boost-build/branches/upstream/current/test/c_file.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/chain.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/clean.py
===================================================================
--- boost-build/branches/upstream/current/test/clean.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/clean.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,130 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+from BoostBuild import Tester, List
+import string
+
+t = Tester()
+
+t.write("a.cpp", """ 
+int main() {}
+
+""")
+
+t.write("Jamroot", """ 
+exe a : a.cpp sub1//sub1 sub2//sub2 sub3//sub3 ; 
+""")
+
+t.write("sub1/Jamfile", """ 
+lib sub1 : sub1.cpp sub1_2 ../sub2//sub2 ;
+lib sub1_2 : sub1_2.cpp ;
+""")
+
+t.write("sub1/sub1.cpp", """
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+void sub1() {}
+
+""")
+
+t.write("sub1/sub1_2.cpp", """
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+void sub1() {}
+
+""")
+
+
+t.write("sub2/Jamfile", """ 
+lib sub2 : sub2.cpp ; 
+""")
+
+t.write("sub2/sub2.cpp", """
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+void sub2() {}
+
+""")
+
+t.write("sub3/Jamroot", """ 
+lib sub3 : sub3.cpp ; 
+""")
+
+t.write("sub3/sub3.cpp", """
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+void sub3() {}
+
+""")
+
+
+# The 'clean' should not remove files under separate Jamroot.
+t.run_build_system()
+t.run_build_system("--clean")
+t.expect_removal("bin/$toolset/debug/a.obj")
+t.expect_removal("sub1/bin/$toolset/debug/sub1.obj")
+t.expect_removal("sub1/bin/$toolset/debug/sub1_2.obj")
+t.expect_removal("sub2/bin/$toolset/debug/sub2.obj")
+t.expect_nothing("sub3/bin/$toolset/debug/sub3.obj")
+
+# The 'clean-all' removes everything it can reach.
+t.run_build_system()
+t.run_build_system("--clean")
+t.expect_removal("bin/$toolset/debug/a.obj")
+t.expect_removal("sub1/bin/$toolset/debug/sub1.obj")
+t.expect_removal("sub1/bin/$toolset/debug/sub1_2.obj")
+t.expect_removal("sub2/bin/$toolset/debug/sub2.obj")
+t.expect_nothing("sub3/bin/$toolset/debug/sub3.obj")
+
+# The 'clean' together with project target removes
+# only under that probject
+t.run_build_system()
+t.run_build_system("sub1 --clean")
+t.expect_nothing("bin/$toolset/debug/a.obj")
+t.expect_removal("sub1/bin/$toolset/debug/sub1.obj")
+t.expect_removal("sub1/bin/$toolset/debug/sub1_2.obj")
+t.expect_nothing("sub2/bin/$toolset/debug/sub2.obj")
+t.expect_nothing("sub3/bin/$toolset/debug/sub3.obj")
+
+# And clean-all removes everything.
+t.run_build_system()
+t.run_build_system("sub1 --clean-all")
+t.expect_nothing("bin/$toolset/debug/a.obj")
+t.expect_removal("sub1/bin/$toolset/debug/sub1.obj")
+t.expect_removal("sub1/bin/$toolset/debug/sub1_2.obj")
+t.expect_removal("sub2/bin/$toolset/debug/sub2.obj")
+t.expect_nothing("sub3/bin/$toolset/debug/sub3.obj")
+
+# If main target is explicitly named, we should not remove
+# files from other targets.
+
+t.run_build_system()
+t.run_build_system("sub1//sub1 --clean")
+t.expect_removal("sub1/bin/$toolset/debug/sub1.obj")
+t.expect_nothing("sub1/bin/$toolset/debug/sub1_2.obj")
+t.expect_nothing("sub2/bin/$toolset/debug/sub2.obj")
+t.expect_nothing("sub3/bin/$toolset/debug/sub3.obj")
+
+
+# Regression test: sources of the 'cast' rule were mistakenly
+# deleted.
+t.rm(".")
+t.write("Jamroot", """
+import cast ;
+cast a cpp : a.h ;
+""")
+t.write("a.h", "")
+
+t.run_build_system("--clean")
+t.expect_nothing("a.h")
+
+t.cleanup()
+


Property changes on: boost-build/branches/upstream/current/test/clean.py
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: boost-build/branches/upstream/current/test/composite.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/conditionals.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/conditionals2.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/conditionals3.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/core_d12.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/core_delete_module.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/core_dependencies.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/core_import_module.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/core_modifiers.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/core_typecheck.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/core_varnames.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/custom_generator.py
===================================================================
--- boost-build/branches/upstream/current/test/custom_generator.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/custom_generator.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -48,7 +48,7 @@
 """)
 
 t.run_build_system()
-t.expect_content("bin/$toolset/debug/r.obj", "rc-object\n")
+t.expect_content("bin/$toolset/debug/r.obj", "rc-object")
 
 t.cleanup()
 


Property changes on: boost-build/branches/upstream/current/test/custom_generator.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/default_features.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/dependency-test/Jamfile
===================================================================
--- boost-build/branches/upstream/current/test/dependency-test/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/dependency-test/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -4,7 +4,7 @@
     ;
 
 exe a 
-    : x.foo a.cpp 
+    : x.foo a.cpp a_c.c
     ;
     
 exe b

Added: boost-build/branches/upstream/current/test/dependency-test/a_c.c
===================================================================
--- boost-build/branches/upstream/current/test/dependency-test/a_c.c	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/dependency-test/a_c.c	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,12 @@
+//  Copyright (c) 2003 Vladimir Prus
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  http://www.boost.org
+// 
+
+#include <a.h>
+# include "a.h"
+#include <x.h>

Modified: boost-build/branches/upstream/current/test/dependency-test/foo.jam
===================================================================
--- boost-build/branches/upstream/current/test/dependency-test/foo.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/dependency-test/foo.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,29 +7,23 @@
 
 generators.register-standard foo.foo : FOO : CPP H ;
 
+nl = "
+" ;
+
 rule foo ( targets * : sources * : properties * )
 {
-    # On NT, you need an exported symbol in order to have an import lib generated
-    if [ os.name ] = NT && <main-target-type>LIB in $(properties)
+    # On NT, you need an exported symbol in order to have an 
+    # import lib generated
+    # We won't really use the symbol defined here, just force
+    # lib creation.
+    if ( [ os.name ] = NT || [ modules.peek : OS ] in CYGWIN )
+        && <main-target-type>LIB in $(properties)
     {
-        .decl =  "echo void __declspec(dllexport) foo(){}" ;
+        .decl =  "void __declspec(dllexport) foo(){}" ;
     }
-    if [ modules.peek : OS ] in CYGWIN &&  <main-target-type>LIB in $(properties) && $toolset != gcc
-    {
-        .decl =  "echo 'void __declspec(dllexport) foo(){}'" ;
-    }
-
-
-    .decl1 on $(<) = $(.decl:E="echo //") ;
     
-    # Further files must be touched also; NT doesn't have a touch command
-    local i = [ print.echo-cmd "#include <z.h>" ] ;
-    .decl2 on $(<) = "      
-    $(i) > " ;
+    print.output $(<[1]) ;
+    print.text $(.decl:E="//")$(nl) ;
+    print.output $(<[2]) ;
+    print.text "#include <z.h>"$(nl) ;
 }
-
-actions foo
-{
-    $(.decl1) > $(<[1]) $(.decl2)$(<[2-])
-}
-

Modified: boost-build/branches/upstream/current/test/dependency-test/src1/z.h
===================================================================
--- boost-build/branches/upstream/current/test/dependency-test/src1/z.h	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/dependency-test/src1/z.h	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1 +1 @@
-
+extern int dummy_variabled_need_to_suppress_empty_file_warning_on_hp_cxx_compiler;


Property changes on: boost-build/branches/upstream/current/test/dependency_property.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/dependency_test.py
===================================================================
--- boost-build/branches/upstream/current/test/dependency_test.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/dependency_test.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -18,6 +18,7 @@
 
 t.expect_touch("bin/$toolset/debug/a.exe")
 t.expect_touch("bin/$toolset/debug/a.obj")
+t.expect_touch("bin/$toolset/debug/a_c.obj")
 t.expect_touch("bin/$toolset/debug/b.exe")
 t.expect_touch("bin/$toolset/debug/b.obj")
 # Now, <dependency> does not add dependency.
@@ -33,6 +34,7 @@
 
 t.expect_touch("bin/$toolset/debug/a.exe")
 t.expect_touch("bin/$toolset/debug/a.obj")
+t.expect_touch("bin/$toolset/debug/a_c.obj")
 t.ignore("*.tds")
 t.expect_nothing_more()
 
@@ -41,6 +43,7 @@
 t.run_build_system()
 t.expect_touch("bin/$toolset/debug/a.exe")
 t.expect_touch("bin/$toolset/debug/a.obj")
+t.expect_touch("bin/$toolset/debug/a_c.obj")
 t.ignore("*.tds")
 t.expect_nothing_more()
 
@@ -61,10 +64,41 @@
 t.touch("x.foo")
 t.run_build_system()
 t.expect_touch("bin/$toolset/debug/a.obj")
+t.expect_touch("bin/$toolset/debug/a_c.obj")
 
 # Check that generated headers are scanned for dependencies as well
 t.touch("src1/z.h")
 t.run_build_system()
 t.expect_touch("bin/$toolset/debug/a.obj")
+t.expect_touch("bin/$toolset/debug/a_c.obj")
 
+# Regression test: on windows, <includes> with absolute paths
+# were not considered when scanning dependencies.
+
+t.rm(".")
+
+t.write("Jamroot", """
+path-constant TOP : . ;
+exe app : main.cpp
+        : <include>$(TOP)/include
+         ;
+""");
+
+t.write("main.cpp", """
+#include <dir/header.h>
+
+int main() { return 0; }
+
+""")
+
+t.write("include/dir/header.h", "")
+t.run_build_system()
+t.expect_addition("bin/$toolset/debug/main.obj")
+
+t.touch("include/dir/header.h")
+t.run_build_system()
+t.expect_touch("bin/$toolset/debug/main.obj")
+
+
+
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/dependency_test.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/direct_request_test.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/disambiguation.py
===================================================================
--- boost-build/branches/upstream/current/test/disambiguation.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/disambiguation.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Test that it's possible to add a suffix to a main target name to
+#  disambiguate that main target from another, and that this does not
+#  affect the names of the generated targets.
+from BoostBuild import Tester, List
+
+# Create a temporary working directory
+t = Tester()
+
+# Create the needed files
+t.write("Jamroot", """
+exe hello.exe : hello.obj ;
+obj hello.obj : hello.cpp : <variant>debug ;
+obj hello.obj2 : hello.cpp : <variant>release ;
+""")
+t.write("hello.cpp", """
+int main()
+{
+    return 0;
+}
+
+""")
+
+t.run_build_system()
+
+t.expect_addition("bin/$toolset/debug/hello.exe")
+t.expect_addition("bin/$toolset/debug/hello.obj")
+t.expect_addition("bin/$toolset/release/hello.obj")
+
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/disambiguation.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: boost-build/branches/upstream/current/test/dll_path.py
===================================================================
--- boost-build/branches/upstream/current/test/dll_path.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/dll_path.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -45,7 +45,7 @@
 
 rule init ( ) 
 { 
-    type.register PATH_LIST : pathlist : : main ;
+    type.register PATH_LIST : pathlist ;
     
     class dll-paths-list-generator : generator 
     {


Property changes on: boost-build/branches/upstream/current/test/dll_path.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/double_loading.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/duplicate.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/example_customization.py
===================================================================
--- boost-build/branches/upstream/current/test/example_customization.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/example_customization.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Test the 'libraries' example.
+from BoostBuild import Tester, List
+
+# Create a temporary working directory
+t = Tester()
+
+t.set_tree("../example/customization")
+
+t.run_build_system()
+
+t.expect_addition(["bin/$toolset/debug/codegen.exe",
+                   "bin/$toolset/debug/usage.cpp"])
+                   
+
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/example_customization.py
___________________________________________________________________
Name: svn:executable
   + *

Added: boost-build/branches/upstream/current/test/example_gettext.py
===================================================================
--- boost-build/branches/upstream/current/test/example_gettext.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/example_gettext.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Test the 'libraries' example.
+from BoostBuild import Tester, List
+import os
+import string
+
+# Create a temporary working directory
+t = Tester()
+
+t.set_tree("../example/gettext")
+
+t.run_build_system(stderr=None)
+
+t.expect_addition(["bin/$toolset/debug/main.exe",
+                   "bin/$toolset/debug/russian.mo"])
+
+
+file = t.adjust_names(["bin/$toolset/debug/main.exe"])[0]
+
+input_fd = os.popen(file)
+input = input_fd.read();
+
+t.fail_test(string.find(input, "international hello") != 0)
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/example_gettext.py
___________________________________________________________________
Name: svn:executable
   + *

Added: boost-build/branches/upstream/current/test/example_libraries.py
===================================================================
--- boost-build/branches/upstream/current/test/example_libraries.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/example_libraries.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,22 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Test the 'libraries' example.
+from BoostBuild import Tester, List
+
+# Create a temporary working directory
+t = Tester()
+
+t.set_tree("../example/libraries")
+
+t.run_build_system()
+
+t.expect_addition(["app/bin/$toolset/debug/app.exe",
+                   "util/foo/bin/$toolset/debug/bar.dll"])
+
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/example_libraries.py
___________________________________________________________________
Name: svn:executable
   + *

Added: boost-build/branches/upstream/current/test/example_make.py
===================================================================
--- boost-build/branches/upstream/current/test/example_make.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/example_make.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,20 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Test the 'libraries' example.
+from BoostBuild import Tester, List
+
+# Create a temporary working directory
+t = Tester()
+
+t.set_tree("../example/make")
+
+t.run_build_system()
+
+t.expect_addition(["bin/$toolset/debug/main.exe"])
+                   
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/example_make.py
___________________________________________________________________
Name: svn:executable
   + *

Added: boost-build/branches/upstream/current/test/example_qt4.py
===================================================================
--- boost-build/branches/upstream/current/test/example_qt4.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/example_qt4.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Test the 'qt4' examples.
+from BoostBuild import Tester, List
+
+# Create a temporary working directory
+t = Tester()
+
+t.set_tree("../example/qt/qt4/hello")
+t.run_build_system()
+t.expect_addition(["bin/$toolset/debug/arrow"])
+
+t.set_tree("../example/qt/qt4/moccable-cpp")
+t.run_build_system()
+t.expect_addition(["bin/$toolset/debug/main"])
+
+t.set_tree("../example/qt/qt4/uic")
+t.run_build_system()
+t.expect_addition(["bin/$toolset/debug/hello"])
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/example_qt4.py
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: boost-build/branches/upstream/current/test/expansion.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/explicit.py
===================================================================
--- boost-build/branches/upstream/current/test/explicit.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/explicit.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -36,5 +36,40 @@
 t.run_build_system("hello2")
 t.expect_addition("bin/$toolset/debug/hello2.exe")
 
+t.rm(".")
 
+
+# Test that 'explicit' used in a helper rule applies to the current project,
+# and not to the Jamfile where the helper rule is defined.
+t.write("Jamroot", """ 
+rule myinstall ( name : target )
+{
+    install $(name)-bin : $(target) ;
+    explicit $(name)-bin ;
+    alias $(name) : $(name)-bin ;
+} 
+""")
+
+t.write("sub/a.cpp", """ 
+""")
+
+t.write("sub/Jamfile", """ 
+myinstall dist : a.cpp ;
+""")
+
+t.run_build_system(subdir="sub")
+t.expect_addition("sub/dist-bin/a.cpp")
+
+t.rm("sub/dist-bin")
+
+t.write("sub/Jamfile", """ 
+myinstall dist : a.cpp ;
+explicit dist ;
+
+""")
+
+t.run_build_system(subdir="sub")
+t.expect_nothing_more()
+
+
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/explicit.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/gcc_runtime.py
===================================================================
--- boost-build/branches/upstream/current/test/gcc_runtime.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/gcc_runtime.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -24,11 +24,11 @@
 }
 """)
 
-t.run_build_system("link-runtime=static", status=1)
+t.run_build_system("runtime-link=static", status=1)
 t.fail_test(string.find(t.stdout(),
-                        "on gcc, DLL can't be build with <link-runtime>static") == -1)
+                        "on gcc, DLL can't be build with <runtime-link>static") == -1)
 
-t.run_build_system("link=static link-runtime=static")
-t.expect_addition("bin/$toolset/debug/link-runtime-static/link-static/hello.lib")
+t.run_build_system("link=static runtime-link=static")
+t.expect_addition("bin/$toolset/debug/link-static/runtime-link-static/hello.lib")
 
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/gcc_runtime.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/generators-test/Jamfile
===================================================================
--- boost-build/branches/upstream/current/test/generators-test/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/generators-test/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -5,7 +5,7 @@
     : requirements <define>YY_NO_UNPUT
     ;
 
-exe a : a.cpp b.cxx obj_1 obj_2 c.ui d.wd x.l y.x_pro lib//auxilliary ;
+exe a : a.cpp b.cxx obj_1 obj_2 c.tui d.wd x.l y.x_pro lib//auxilliary ;
 # This should not cause second compilation of a.cpp 
 exe f : a.cpp b.cxx obj_1 obj_2 lib//auxilliary ;
 

Added: boost-build/branches/upstream/current/test/generators-test/c.tui
===================================================================

Deleted: boost-build/branches/upstream/current/test/generators-test/c.ui
===================================================================

Modified: boost-build/branches/upstream/current/test/generators-test/extra.jam
===================================================================
--- boost-build/branches/upstream/current/test/generators-test/extra.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/generators-test/extra.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,6 +1,7 @@
 
 import type ;
 import generators ;
+import "class" : new ;
 
 type.register WHL : whl ;
 type.register DLP : dlp ;
@@ -11,6 +12,46 @@
 generators.register-standard extra.dolphin : DLP : CPP ;
 generators.register-standard extra.wd : WD : WHL(%_parser) DLP(%_lexer) ;
 
+class wd-to-cpp : generator
+{
+    rule __init__ ( * : * : * )
+    {
+        generator.__init__ $(1) : $(2) : $(3) ;
+    }
+    
+    rule run ( project name ? : property-set : source )
+    {
+        local new-sources ;
+        if ! [ $(source).type ] in WHL DLP
+        {            
+            local r1 = [ generators.construct $(project) $(name) 
+              : WHL : $(property-set) : $(source) ] ;
+            local r2 = [ generators.construct $(project) $(name) 
+              : DLP : $(property-set) : $(source) ] ;
+            
+            new-sources = [ sequence.unique $(r1[2-]) $(r2[2-]) ] ;
+        }
+        else
+        {
+            new-sources = $(source) ;
+        }
+                    
+        local result ;
+        for local i in $(new-sources) 
+        {
+            local t = [ generators.construct $(project) $(name) : CPP 
+              : $(property-set) : $(i) ] ;          
+            result += $(t[2-]) ;
+        }
+        return $(result) ;
+    }        
+}
+generators.override extra.wd-to-cpp : extra.whale ;
+generators.override extra.wd-to-cpp : extra.dolphin ;
+
+
+generators.register [ new wd-to-cpp extra.wd-to-cpp : : CPP ] ;
+    
 rule whale ( targets * : sources * : properties * )
 {
 }

Modified: boost-build/branches/upstream/current/test/generators-test/lex.jam
===================================================================
--- boost-build/branches/upstream/current/test/generators-test/lex.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/generators-test/lex.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -18,7 +18,8 @@
     print.output $(<) ;
     # Need to supress SunCC's warning about empty source
     # file.
-    print.text "void foo() {}" ;
+    print.text "void foo() {}
+" ;
 }
 
 actions lex 

Modified: boost-build/branches/upstream/current/test/generators-test/project-root.jam
===================================================================
--- boost-build/branches/upstream/current/test/generators-test/project-root.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/generators-test/project-root.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,9 +7,9 @@
 
 import type ;
 
-type.register UI : ui ;
-type.register UIC_H ;
-type.set-generated-target-suffix UIC_H : : h ;
+type.register tUI : tui ;
+type.register tUIC_H ;
+type.set-generated-target-suffix tUIC_H : : h ;
 
 type.register X1 : x1 ;
 type.register X2 : x2  ;
@@ -17,8 +17,8 @@
 
 import generators ;
 
-generators.register-standard qt.uic : UI UIC_H : CPP ;
-generators.register-standard qt.uic-h : UI : UIC_H ;
+generators.register-standard qt.uic : tUI tUIC_H : CPP ;
+generators.register-standard qt.uic-h : tUI : tUIC_H ;
 
 # That's an interesting example. Currently, X_PRO will be processed
 # twice.
@@ -33,10 +33,10 @@
 #if $(no-var) {
 import nm ;
 
-type.register CPP_MARKED : marked.cpp : CPP ;
+type.register CPP_MARKED : marked_cpp : CPP ;
 type.register POSITIONS : positions ;
-type.register NM.TARGET.CPP : target.cpp : CPP ;
-type.register NM_EXE : : EXE : main ;
+type.register NM.TARGET.CPP : target_cpp : CPP ;
+type.register NM_EXE : : EXE ;
 
 generators.register-standard nm.target-source : CPP_MARKED : NM.TARGET.CPP ;
 generators.register-standard nm.cpp-mark : CPP : CPP_MARKED POSITIONS ;
@@ -60,7 +60,7 @@
             local converted = [ generators.construct $(project) : NM.TARGET.CPP : $(properties) : $(source) ] ;
         if $(converted[1])
             {            
-                local result = [ generators.construct $(project) : OBJ : $(properties) : $(converted[1]) ] ;
+                local result = [ generators.construct $(project) : OBJ : $(properties) : $(converted[2]) ] ;
                 return $(result) ;
             }
             else

Modified: boost-build/branches/upstream/current/test/generators_test.py
===================================================================
--- boost-build/branches/upstream/current/test/generators_test.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/generators_test.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -14,7 +14,7 @@
     List(   
        "a.obj b.obj c.h c.cpp c.obj d_parser.whl d_lexer.dlp d_parser.cpp d_lexer.cpp "
         + "d_parser.lr0 d_parser.h d_parser_symbols.h x.c x.obj y.x1 y.x2 "
-        + "y.cpp y.obj e.marked.cpp e.positions e.target.cpp e.obj "))
+        + "y.cpp y.obj e.marked_cpp e.positions e.target_cpp e.obj "))
     )
 ok = 0
 


Property changes on: boost-build/branches/upstream/current/test/generators_test.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/glob.py
===================================================================
--- boost-build/branches/upstream/current/test/glob.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/glob.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,6 +7,8 @@
 
 #  Test the 'glob' rule in Jamfile context.
 from BoostBuild import Tester, List
+import os
+import string
 
 # Create a temporary working directory
 t = Tester()
@@ -37,10 +39,22 @@
 lib l : [ glob *.cpp ] ; 
 """)
 
+t.write("d3/d/Jamfile", """
+exe a : [ glob ../*.cpp ] ;
+""")
+t.write("d3/a.cpp", """
+int main()
+{
+    return 0;
+}
+""")
+
 t.run_build_system(subdir="d1")
-
 t.expect_addition("d1/bin/$toolset/debug/a.exe")
 
+t.run_build_system(subdir="d3/d")
+t.expect_addition("d3/d/bin/$toolset/debug/a.exe")
+
 t.rm("d2/d/bin")
 t.run_build_system(subdir="d2/d")
 t.expect_addition("d2/d/bin/$toolset/debug/l.dll")
@@ -85,7 +99,21 @@
 t.run_build_system(subdir="d1")
 t.expect_addition("d1/bin/$toolset/debug/a.exe")
 
+# Test that 'glob' works with absolute names
+t.rm("d1/bin")
 
+# Note that to get current dir, we use bjam's PWD,
+# not Python's os.getcwd, because the former will
+# always return long path. The latter might return
+# short path, and that will confuse path.glob.
+t.write("d1/Jamfile", """
+project : source-location src ;
+local pwd = [ PWD ] ; # Always absolute
+exe a : [ glob $(pwd)/src/foo/*.cpp $(pwd)/src/bar/*.cpp ] ../d2/d//l ; 
+""")
 
+t.run_build_system(subdir="d1")
+t.expect_addition("d1/bin/$toolset/debug/a.exe")
 
+
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/glob.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/implicit_dependency.py
===================================================================
--- boost-build/branches/upstream/current/test/implicit_dependency.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/implicit_dependency.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Test the <implicit-dependency> is respected even if the
+#  target referred-to is not build itself, but only referred
+#  to by <implicit-dependency>.
+
+from BoostBuild import Tester, List
+import string
+
+t = Tester()
+
+t.write("Jamroot", """ 
+make a.h : : gen-header ;
+explicit a.h ;
+
+exe hello : hello.cpp : <implicit-dependency>a.h ;
+
+import os ;
+if [ os.name ] = NT
+{
+    actions gen-header
+    {
+       echo int i; > $(<)
+    }
+}
+else
+{
+    actions gen-header
+    {
+        echo "int i;" > $(<)
+    }
+}
+""")
+
+t.write("hello.cpp", """ 
+#include "a.h"
+
+int main()
+{
+    return i;
+} 
+""")
+
+
+
+t.run_build_system()
+
+t.expect_addition("bin/$toolset/debug/hello.exe")
+
+t.cleanup()
+


Property changes on: boost-build/branches/upstream/current/test/implicit_dependency.py
___________________________________________________________________
Name: svn:executable
   + *

Added: boost-build/branches/upstream/current/test/indirect_conditional.py
===================================================================
--- boost-build/branches/upstream/current/test/indirect_conditional.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/indirect_conditional.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+from BoostBuild import Tester, List
+import string
+
+t = Tester()
+
+t.write("Jamroot", """ 
+exe a1 : a1.cpp : <conditional>@a1-rule ;
+
+rule a1-rule ( properties * )
+{
+    if <variant>debug in $(properties)
+    {
+	    return <define>OK ;
+    }
+}
+
+exe a2 : a2.cpp : <conditional>@$(__name__).a2-rule <variant>debug:<optimization>speed ;
+
+rule a2-rule ( properties * )
+{
+    if <optimization>speed in $(properties)
+    {
+        return <define>OK ;
+    }
+}
+
+exe a3 : a3.cpp : <conditional>@$(__name__).a3-rule-1 <conditional>@$(__name__).a3-rule-2 ;
+
+rule a3-rule-1 ( properties * )
+{
+    if <optimization>speed in $(properties)
+    {
+        return <define>OK ;
+    }
+}
+
+rule a3-rule-2 ( properties * )
+{
+    if <variant>debug in $(properties)
+    {
+        return <optimization>speed ;
+    }
+}
+
+""")
+
+t.write("a1.cpp", """ 
+#ifdef OK
+int main() {}
+#endif
+
+""")
+
+t.write("a2.cpp", """ 
+#ifdef OK
+int main() {}
+#endif
+
+""")
+
+t.write("a3.cpp", """ 
+#ifdef OK
+int main() {}
+#endif
+
+""")
+
+
+
+t.run_build_system()
+
+t.expect_addition("bin/$toolset/debug/a1.exe")
+t.expect_addition("bin/$toolset/debug/optimization-speed/a2.exe")
+t.expect_addition("bin/$toolset/debug/optimization-speed/a3.exe")
+
+t.cleanup()
+


Property changes on: boost-build/branches/upstream/current/test/indirect_conditional.py
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: boost-build/branches/upstream/current/test/inherit_toolset.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/inline.py
===================================================================
--- boost-build/branches/upstream/current/test/inline.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/inline.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -23,11 +23,11 @@
 """)
 
 t.run_build_system()
-t.expect_addition("bin/$toolset/debug/everything..a.exe")
-t.rm("bin/$toolset/debug/everything..a.exe")
+t.expect_addition("bin/$toolset/debug/everything__a.exe")
+t.rm("bin/$toolset/debug/everything__a.exe")
 
-t.run_build_system("everything..a")
-t.expect_addition("bin/$toolset/debug/everything..a.exe")
+t.run_build_system("everything__a")
+t.expect_addition("bin/$toolset/debug/everything__a.exe")
 
 t.rm("bin")
 
@@ -42,8 +42,8 @@
 
 t.run_build_system()
 t.expect_addition("bin/$toolset/debug/a.exe")
-t.expect_addition("bin/$toolset/debug/everything..a.exe")
-t.expect_addition("bin/$toolset/debug/everything2..a.exe")
+t.expect_addition("bin/$toolset/debug/everything__a.exe")
+t.expect_addition("bin/$toolset/debug/everything2__a.exe")
 
 
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/inline.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/lib_source_property.py
===================================================================
--- boost-build/branches/upstream/current/test/lib_source_property.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/lib_source_property.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Regression test: if a library had no explicit sources, but
+#  only <source> properties, it was built as it it were searched
+#  library, and the specified sources were not compiled.
+from BoostBuild import Tester, List
+
+# Create a temporary working directory
+t = Tester()
+
+# Create the needed files
+t.write("Jamroot", """
+lib a : : <source>a.cpp ;
+""")
+t.write("a.cpp", """
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+void foo() {}
+
+""")
+
+t.run_build_system()
+t.expect_addition("bin/$toolset/debug/a.obj")
+
+t.rm("bin")
+
+# Now try with <conditional>
+t.write("Jamroot", """
+rule test ( properties * )
+{
+    return <source>a.cpp ;
+}
+lib a : : <conditional>@test ;
+""")
+
+t.run_build_system()
+t.expect_addition("bin/$toolset/debug/a.obj")
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/lib_source_property.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: boost-build/branches/upstream/current/test/library_chain.py
===================================================================
--- boost-build/branches/upstream/current/test/library_chain.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/library_chain.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,8 +7,9 @@
 
 #  Test that a chain of libraries work ok, not matter if we use static or
 #  shared linking.
-from BoostBuild import Tester, List
+from BoostBuild import Tester, List, get_toolset
 import string
+import os
 
 t = Tester()
 
@@ -71,7 +72,16 @@
 t.expect_addition("bin/$toolset/debug/link-static/main.exe")
 t.rm(["bin", "a/bin", "b/bin"])
 
+# Check that <library> works for static linking.
+
 t.write("b/Jamfile", """ 
+lib b : b.cpp : <library>../a//a ; 
+""")
+t.run_build_system("link=static")
+t.expect_addition("bin/$toolset/debug/link-static/main.exe")
+
+t.rm(["bin", "a/bin", "b/bin"])
+t.write("b/Jamfile", """ 
 lib b : b.cpp ../a//a/<link>shared : <link>static ; 
 """)
 
@@ -86,9 +96,69 @@
 lib png : z : <name>png ;
 lib z : : <name>zzz ;
 """)
-t.run_build_system("-a -n -d+2")
-t.fail_test(string.find(t.stdout(), "zzz") == -1)
+t.run_build_system("-a -d+2", status=None, stderr=None)
+# Try to find the "zzz" string either in response file
+# (for Windows compilers), or in standard output.
+rsp = t.adjust_names("bin/$toolset/debug/main.exe.rsp")[0]
+if os.path.exists(rsp) and string.find(open(rsp).read(), "zzz") != -1:
+    pass
+elif string.find(t.stdout(), "zzz") != -1:
+    pass
+else:
+    t.fail_test(1)
 
+#
+# Test main -> libb -> liba chain
+# in the case where liba is a file, not a Boost.Build target.
+#
+t.rm(".")
+t.write("Jamroot", "")
+t.write("a/Jamfile", """
+lib a : a.cpp ;
+""")
+t.write("a/a.cpp", """
+#if defined(_WIN32)
+__declspec(dllexport)
+#endif
+void a() {}
+""")
+t.run_build_system(subdir="a")
+t.expect_addition("a/bin/$toolset/debug/a.dll")
 
+if (os.name == 'nt' or os.uname()[0].lower().startswith('cygwin')) and get_toolset() != 'gcc':
+    file = t.adjust_names(["a/bin/$toolset/debug/a.lib"])[0]
+else:
+    file = t.adjust_names(["a/bin/$toolset/debug/a.dll"])[0]
 
+t.write("b/Jamfile", """
+lib b : b.cpp ../%s ;
+""" % file)
+t.write("b/b.cpp", """
+#if defined(_WIN32)
+__declspec(dllimport)
+#endif
+void a();
+
+#if defined(_WIN32)
+__declspec(dllexport)
+#endif
+void b() { a(); }
+""")
+
+t.write("Jamroot", """
+exe main : main.cpp b//b ;
+""")
+t.write("main.cpp", """
+#if defined(_WIN32)
+__declspec(dllimport)
+#endif
+void b();
+int main() { b(); }
+""")
+
+t.run_build_system()
+t.expect_addition("bin/$toolset/debug/main.exe")
+
+
+
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/library_chain.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/library_order.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/library_property.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/load_dir.py
===================================================================
--- boost-build/branches/upstream/current/test/load_dir.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/load_dir.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -35,6 +35,28 @@
                 print l,
             print '\n""")\n'
 
+header =  """#!/usr/bin/python
+
+#  Copyright (C) FILL SOMETHING HERE 2005.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+from BoostBuild import Tester, List
+import string
+
+t = Tester()
+"""
+
+footer = """
+
+t.run_build_system()
+
+t.expect_addition("bin/$toolset/debug/FILL_SOME_HERE.exe")
+
+t.cleanup()
+"""
+    
 def main():
     if len(sys.argv) != 2:
         usage()
@@ -48,8 +70,12 @@
         if not os.path.isdir(path):
             print "Path '%s' is not a directory" % (path,)
         
+        print header
+    
         os.path.walk(path, create_file, None)
 
+        print footer
+
 if __name__ == '__main__':
     main()
 


Property changes on: boost-build/branches/upstream/current/test/load_dir.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/load_order.py
===================================================================
--- boost-build/branches/upstream/current/test/load_order.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/load_order.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,75 @@
+#!/usr/bin/python
+
+# Copyright 2004 Vladimir Prus.
+# Distributed under the Boost Software License, Version 1.0. (See
+# accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+#  Test that we load parent projects before loading children.
+from BoostBuild import Tester, List
+from string import find
+
+t = Tester()
+
+t.write("Jamfile", """ 
+use-project /child : child ;
+
+ECHO "Setting parent requirements" ;
+project
+    : requirements <define>PASS_THE_TEST
+    ; 
+    
+alias x : child//main ;    
+""")
+
+t.write("project-root.jam", """ 
+""")
+
+t.write("child/Jamfile", """ 
+ECHO "Setting child requirements" ;
+project /child ;
+
+exe main : main.cpp ; 
+""")
+
+t.write("child/main.cpp", """ 
+#if defined(PASS_THE_TEST)
+int main() { return 0; }
+#endif
+
+""")
+
+t.run_build_system()
+
+
+t.expect_addition("child/bin/$toolset/debug/main.exe")
+t.fail_test(find(t.stdout(), "Setting child requirements") <
+            find(t.stdout(), "Setting parent requirements"))
+
+
+# Regression test: parent requirements were ignored in some cases
+t.rm(".")
+t.write("Jamroot", """ 
+build-project src ; 
+""")
+
+t.write("src/Jamfile", """ 
+project : requirements <define>EVERYTHING_OK ; 
+""")
+
+t.write("src/app/Jamfile", """ 
+exe test : test.cpp ; 
+""")
+
+t.write("src/app/test.cpp", """ 
+#ifdef EVERYTHING_OK
+int main() {}
+#endif
+
+""")
+
+t.run_build_system(subdir="src/app")
+t.expect_addition("src/app/bin/$toolset/debug/test.exe")
+
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/load_order.py
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: boost-build/branches/upstream/current/test/loop.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/m1-01.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/m1-02.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/m1-03.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/make_rule.py
===================================================================
--- boost-build/branches/upstream/current/test/make_rule.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/make_rule.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,40 +7,37 @@
 
 t = Tester(pass_toolset=1)
 
-t.write("project-root.jam", "")
-t.write("Jamfile", """
+t.write("Jamroot", """
 
-rule creator ( string targets * : sources * : * )
-{
-    STRING on $(targets) = $(string) ;
-    creator2 $(targets) : $(sources) ;
-}
+import feature ;
+feature.feature test_feature : : free ;
 
-actions creator2
+import toolset ;
+toolset.flags creator STRING : <test_feature> ;
+
+actions creator
 {
     echo $(STRING) > $(<)
 }
 
-make foo.bar : : creator foobar ;
+make foo.bar : : creator : <test_feature>12345678 ;
 """)
 
 t.run_build_system()
 t.expect_addition("bin/$toolset/debug/foo.bar")
-t.fail_test(find(t.read("bin/$toolset/debug/foo.bar"), "foobar") == -1)
+t.fail_test(find(t.read("bin/$toolset/debug/foo.bar"), "12345678") == -1)
 
 # Regression test. Make sure that if main target requested two times,
 # and build request differ only in incidental properties, the main target
 # if created only once. The bug was discovered by Kirill Lapshin.
 
-t.write("Jamfile", """ 
+t.write("Jamroot", """ 
 # Make sure that incidental property does not
 # cause second creation of 'hello1.cpp'.
 exe a : dir//hello1.cpp ;
 exe b : dir//hello1.cpp/<hardcode-dll-paths>true ; 
 """)
 
-t.write("project-root.jam", "")
-
 t.write("dir/Jamfile", """ 
 import common ;
 make hello1.cpp : hello.cpp : common.copy ;
@@ -53,7 +50,8 @@
     return 1;
 }
 """)
-t.run_build_system("-d2")
-t.fail_test(t.stdout().count("common.copy") != 1)
+# Show only names of the actions.
+t.run_build_system("-d1 -n")
+t.fail_test(t.stdout().count("copy") != 1)
 
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/make_rule.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/ndebug.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/no_type.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/notfile.py
===================================================================
--- boost-build/branches/upstream/current/test/notfile.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/notfile.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2005.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Basic tests for the 'notfile' rule.
+
+from BoostBuild import Tester, List
+import string
+import os
+
+t = Tester()
+
+t.write("Jamroot", """ 
+import notfile ;
+
+notfile say : "echo hi" ;
+
+exe hello : hello.cpp ;
+notfile hello_valgrind : @valgrind : hello ;
+
+actions valgrind
+{
+   valgrind $(>) 
+}
+
+""")
+
+t.write("hello.cpp", """
+
+#include <iostream>
+
+int main()
+{
+    std::cout << "Hello!\\n";
+    return 1;
+}
+
+""")
+
+
+t.run_build_system("-n -d+2")
+
+t.fail_test(string.find(t.stdout(), "echo hi") == -1)
+
+name = t.adjust_names(["bin/$toolset/debug/hello.exe"])[0]
+name = apply(os.path.join, string.split(name, "/"));
+c = "valgrind " + name
+t.fail_test(string.find(t.stdout(), c) == -1)
+
+
+t.cleanup()
+


Property changes on: boost-build/branches/upstream/current/test/notfile.py
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: boost-build/branches/upstream/current/test/ordered_properties.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/out_of_tree.py
===================================================================
--- boost-build/branches/upstream/current/test/out_of_tree.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/out_of_tree.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+
+#  Copyright (C) FILL SOMETHING HERE 2005.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Tests that we can build a project when the current directory is outside of
+#  that project tree, that is:
+#     bjam some_dir
+#  works.
+from BoostBuild import Tester, List
+
+# Create a temporary working directory
+t = Tester()
+
+# Create the needed files
+t.write("p1/Jamroot", """
+exe hello : hello.cpp ;
+""")
+t.write("p1/hello.cpp", """
+int main()
+{
+    return 0;
+}
+
+""")
+
+t.write("p2/Jamroot", """
+exe hello2 : hello.cpp ;
+exe hello3 : hello.cpp ;
+""")
+t.write("p2/hello.cpp", """
+int main()
+{
+    return 0;
+}
+
+""")
+
+t.run_build_system("p1 p2//hello3")
+
+t.expect_addition("p1/bin/$toolset/debug/hello.exe")
+t.expect_addition("p2/bin/$toolset/debug/hello3.exe")
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/out_of_tree.py
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: boost-build/branches/upstream/current/test/path_features.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/prebuilt/ext/Jamfile2
===================================================================
--- boost-build/branches/upstream/current/test/prebuilt/ext/Jamfile2	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/prebuilt/ext/Jamfile2	2006-11-09 09:53:31 UTC (rev 14016)
@@ -2,6 +2,7 @@
 import modules ;
 
 local dll-suffix = so ;
+local prefix = "" ;
 if [ modules.peek : OS ] in CYGWIN NT
 {
    if $toolset = gcc
@@ -13,6 +14,10 @@
       dll-suffix = lib ;
    }
 }
+else
+{
+   prefix = "lib" ;      
+}
 if $toolset = darwin
 {
    dll-suffix = dylib ;
@@ -21,13 +26,13 @@
 project ext ;
 
 lib a : 
-    : <file>bin/$toolset/debug/a.$(dll-suffix) <variant>debug
+    : <file>bin/$toolset/debug/$(prefix)a.$(dll-suffix) <variant>debug
     :
     : <include>debug
     ;
     
 lib a :
-    : <file>bin/$toolset/release/a.$(dll-suffix) <variant>release
+    : <file>bin/$toolset/release/$(prefix)a.$(dll-suffix) <variant>release
     :
     : <include>release
     ;

Modified: boost-build/branches/upstream/current/test/prebuilt/ext/Jamfile3
===================================================================
--- boost-build/branches/upstream/current/test/prebuilt/ext/Jamfile3	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/prebuilt/ext/Jamfile3	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,6 +6,7 @@
 import modules ;
 
 local dll-suffix = so ;
+local prefix = "" ;
 if [ modules.peek : OS ] in CYGWIN NT
 {
    if $toolset = gcc
@@ -17,26 +18,28 @@
       dll-suffix = lib ;
    }
 }
+else
+{
+   prefix = "lib" ;      
+}
 if $toolset = darwin
 {
    dll-suffix = dylib ;
 }
 
-
-
 project ext ;
 
 # Assumed bjam was invoked from the project root
 local pwd = [ PWD ] ;
 
 lib a : 
-    : <file>$(pwd)/ext/bin/$toolset/debug/a.$(dll-suffix) <variant>debug
+    : <file>$(pwd)/ext/bin/$toolset/debug/$(prefix)a.$(dll-suffix) <variant>debug
     :
     : <include>debug
     ;
     
 lib a :
-    : <file>$(pwd)/ext/bin/$toolset/release/a.$(dll-suffix) <variant>release
+    : <file>$(pwd)/ext/bin/$toolset/release/$(prefix)a.$(dll-suffix) <variant>release
     :
     : <include>release
     ;


Property changes on: boost-build/branches/upstream/current/test/prebuilt.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/print.py
===================================================================
--- boost-build/branches/upstream/current/test/print.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/print.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -14,21 +14,19 @@
 """)
 
 t.run_build_system()
-t.expect_content("foo", """\"Something\"
-""")
+t.expect_content("foo", """\"Something\"""")
 
 t.write("Jamfile", """
 import print ;
 print.output foo ;
-print.text \\\"Somethingelse\\\" ;
+print.text \\\n\\\"Somethingelse\\\" ;
 DEPENDS all : foo ;
 ALWAYS foo ;
 """)
 
 t.run_build_system()
 t.expect_content("foo", """\"Something\"
-\"Somethingelse\"
-""")
+\"Somethingelse\"""")
 
 t.write("Jamfile", """
 import print ;
@@ -39,7 +37,6 @@
 """)
 
 t.run_build_system()
-t.expect_content("foo", """\"Different\"
-""")
+t.expect_content("foo", """\"Different\"""")
 
 t.cleanup()

Modified: boost-build/branches/upstream/current/test/project-test3/lib3/Jamfile
===================================================================
--- boost-build/branches/upstream/current/test/project-test3/lib3/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/project-test3/lib3/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,10 +6,23 @@
 
 import property ;
 
+rule properties-as-path ( properties * )
+{
+    local r ;
+    for local p in $(properties)
+    {
+	    if $(p:G) != <action>
+	    {
+	        r += $(p) ;
+	    }
+    }
+    return [ property.as-path
+        [ property.remove incidental : $(r) ] ] ;
+}
+
 rule mfc-compile ( target : sources * : property-set * )
 {
-    PROPERTIES on $(target) = [ 
-      property.as-path [ property.remove incidental : $(property-set) ] ] ;      
+    PROPERTIES on $(target) = [ properties-as-path $(property-set) ] ;
 }
 
 actions mfc-compile

Modified: boost-build/branches/upstream/current/test/project-test3/project-root.jam
===================================================================
--- boost-build/branches/upstream/current/test/project-test3/project-root.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/project-test3/project-root.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -2,10 +2,23 @@
 import gcc ;
 import property ;
 
+rule properties-as-path ( properties * )
+{
+    local r ;
+    for local p in $(properties)
+    {
+	if $(p:G) != <action>
+	{
+	    r += $(p) ;
+	}
+    }
+    return [ property.as-path
+        [ property.remove incidental : $(r) ] ] ;
+}
+
 rule yfc-compile ( target : sources * : property-set * )
 {
-    PROPERTIES on $(target) = [ 
-      property.as-path [ property.remove incidental : $(property-set) ] ] ;
+    PROPERTIES on $(target) = [ properties-as-path $(property-set) ] ;
 }
 
 actions yfc-compile
@@ -16,8 +29,7 @@
 
 rule yfc-link ( target : sources * : property-set * )
 {
-    PROPERTIES on $(target) = [ 
-      property.as-path [ property.remove incidental : $(property-set) ] ] ;      
+    PROPERTIES on $(target) = [ properties-as-path $(property-set) ] ;
 }
 
 actions yfc-link

Modified: boost-build/branches/upstream/current/test/project-test4/project-root.jam
===================================================================
--- boost-build/branches/upstream/current/test/project-test4/project-root.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/project-test4/project-root.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -2,10 +2,24 @@
 import gcc ;
 import property ;
 
+rule properties-as-path ( properties * )
+{
+    local r ;
+    for local p in $(properties)
+    {
+	    if $(p:G) != <action>
+	    {
+	        r += $(p) ;
+	    }
+    }
+    return [ property.as-path
+        [ property.remove incidental : $(r) ] ] ;
+}
+
+
 rule yfc-compile ( target : sources * : property-set * )
 {
-    PROPERTIES on $(target) = [ 
-      property.as-path [ property.remove incidental : $(property-set) ] ] ;      
+    PROPERTIES on $(target) = [ properties-as-path $(property-set) ] ;      
 }
 
 actions yfc-compile
@@ -16,8 +30,7 @@
 
 rule yfc-link ( target : sources * : property-set * )
 {
-    PROPERTIES on $(target) = [ 
-      property.as-path [ property.remove incidental : $(property-set) ] ] ;
+    PROPERTIES on $(target) = [ properties-as-path $(property-set) ] ;
 }
 
 actions yfc-link

Modified: boost-build/branches/upstream/current/test/project_dependencies.py
===================================================================
--- boost-build/branches/upstream/current/test/project_dependencies.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/project_dependencies.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -11,8 +11,7 @@
 
 t = Tester()
 
-t.write("project-root.jam", "import gcc ;")
-t.write("Jamfile", "build-project src ;")
+t.write("Jamroot", "build-project src ;")
 t.write("lib/Jamfile", "lib lib1 : lib1.cpp ;")
 t.write("lib/lib1.cpp", """
 #ifdef _WIN32


Property changes on: boost-build/branches/upstream/current/test/project_dependencies.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Deleted: boost-build/branches/upstream/current/test/project_root.py
===================================================================
--- boost-build/branches/upstream/current/test/project_root.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/project_root.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,23 +0,0 @@
-#!/usr/bin/python
-
-#  Copyright (C) Vladimir Prus 2003. Permission to copy, use, modify, sell and
-#  distribute this software is granted provided this copyright notice appears in
-#  all copies. This software is provided "as is" without express or implied
-#  warranty, and with no claim as to its suitability for any purpose.
-
-#  Test that we can access project-root attributes from Jamfiles.
-from BoostBuild import Tester, List
-
-# Create a temporary working directory
-t = Tester()
-
-t.write("Jamfile", """
-local l = [ project-root get-location ] ;
-ECHO XXX $(l) ;
-""")
-
-t.write("project-root.jam", "")
-        
-t.run_build_system(stdout="XXX .\n")
-
-t.cleanup()

Modified: boost-build/branches/upstream/current/test/project_root_constants.py
===================================================================
--- boost-build/branches/upstream/current/test/project_root_constants.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/project_root_constants.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -13,14 +13,14 @@
 
 # Create the needed files
 t.write("project-root.jam", """
-constant FOO : foobar ;
+constant FOO : foobar gee ;
 ECHO $(FOO) ;
 """)
 t.write("Jamfile", """
 """)
 
 t.run_build_system()
-t.fail_test(find(t.stdout(), "foobar") == -1)
+t.fail_test(find(t.stdout(), "foobar gee") == -1)
 
 # Regression test: when absolute paths were passed to path-constant rule,
 # Boost.Build failed to recognize path as absolute and prepended current dir.
@@ -39,5 +39,30 @@
 
 t.run_build_system()
 
+t.write("Jamfile", """
+# This tests that rule 'hello' will be imported
+# to children unlocalized, and will still access
+# variables in this Jamfile
+x = 10 ;
+constant FOO : foo ;
+rule hello ( ) { ECHO "Hello $(x)" ; }
+""")
 
+t.write("d/Jamfile", """
+ECHO "d: $(FOO)" ;
+constant BAR : bar ;
+""")
+
+t.write("d/d2/Jamfile", """
+ECHO "d2: $(FOO)" ;
+ECHO "d2: $(BAR)" ;
+hello ;
+""")
+
+t.run_build_system(subdir="d/d2", stdout="""d: foo
+d2: foo
+d2: bar
+Hello 10
+""")
+
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/project_root_constants.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/project_root_rule.py
===================================================================
--- boost-build/branches/upstream/current/test/project_root_rule.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/project_root_rule.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,40 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2005.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Tests that we can declare a rule in Jamroot that will be 
+#  can be called in child Jamfile to declare a target. Specifically
+#  test for use of 'glob' in that rule.
+# 
+
+from BoostBuild import Tester, List
+import string
+
+t = Tester()
+
+t.write("Jamroot", """ 
+project : requirements <link>static ;
+
+rule my-lib ( name )
+{
+   lib $(name) : [ glob *.cpp ] ;
+} 
+""")
+
+t.write("sub/a.cpp", """ 
+""")
+
+t.write("sub/Jamfile", """ 
+my-lib foo ; 
+""")
+
+
+t.run_build_system(subdir="sub")
+
+t.expect_addition("sub/bin/$toolset/debug/link-static/foo.lib")
+
+t.cleanup()
+


Property changes on: boost-build/branches/upstream/current/test/project_root_rule.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: boost-build/branches/upstream/current/test/project_test3.py
===================================================================
--- boost-build/branches/upstream/current/test/project_test3.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/project_test3.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -10,9 +10,9 @@
 t.set_tree("project-test3")
 os.remove("project-root.jam")
 t.run_build_system(status=1, stdout=
-"""Failed to find the project root for directory '.'.
-Did not find a project-root.jam file there or in any of its parent directories.
-Please consult the documentation at 'http://www.boost.org'.
+"""error: Could not find parent for project at '.'
+error: Did not find Jamfile or project-root.jam in any parent directory.
+
 """)
 
 t.set_tree("project-test3")
@@ -89,7 +89,7 @@
                   "bin/$toolset/release/optimization-off/a.exe", 
                   "bin/$toolset/release/optimization-off/a.obj"])
 
-t.run_build_system(extra_args='clean')
+t.run_build_system(extra_args='--clean-all')
 t.expect_removal(["bin/$toolset/debug/a.obj",
                  "bin/$toolset/debug/a.exe",
                  "lib/bin/$toolset/debug/b.obj",
@@ -106,7 +106,7 @@
 t.expect_addition("lib/bin/$toolset/debug/b.obj")
 t.expect_nothing_more()
 
-t.run_build_system("clean lib//b.obj")
+t.run_build_system("--clean lib//b.obj")
 t.expect_removal("lib/bin/$toolset/debug/b.obj")
 t.expect_nothing_more()
 


Property changes on: boost-build/branches/upstream/current/test/project_test3.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/project_test4.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/property_expansion.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/railsys/libx/project-root.jam
===================================================================
--- boost-build/branches/upstream/current/test/railsys/libx/project-root.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/railsys/libx/project-root.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,8 +1,6 @@
 
-import toolset ; 
-
 # Tell that QT should be used. QTDIR will give installation
 # prefix. 
-toolset.using qt ;
+using qt ;
 
 

Modified: boost-build/branches/upstream/current/test/railsys/program/Jamfile
===================================================================
--- boost-build/branches/upstream/current/test/railsys/program/Jamfile	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/railsys/program/Jamfile	2006-11-09 09:53:31 UTC (rev 14016)
@@ -14,7 +14,7 @@
 #
 #  02/21/02! Jürgen Hunold
 #
-#  $Id: Jamfile,v 1.5 2004/10/05 07:55:20 vladimir_prus Exp $
+#  $Id: Jamfile,v 1.6 2004/10/30 08:31:48 vladimir_prus Exp $
 #
 # ================================================================
 
@@ -26,7 +26,7 @@
     : requirements 
         <include>$(BOOST_ROOT)
         <threading>multi
-	<library>/qt//qt	
+        <library>/qt//qt    
         <hardcode-dll-paths>true
         <stdlib>stlport
         <use>/libx

Modified: boost-build/branches/upstream/current/test/railsys/program/project-root.jam
===================================================================
--- boost-build/branches/upstream/current/test/railsys/program/project-root.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/railsys/program/project-root.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,9 +1,7 @@
 
-import toolset ; 
-
 # Tell that QT should be used. QTDIR will give installation
 # prefix. 
-toolset.using qt ;
+using qt ;
 
 # Not that good, but sufficient for testing
-toolset.using stlport : : /path/to/stlport ;
+using stlport : : /path/to/stlport ;


Property changes on: boost-build/branches/upstream/current/test/railsys.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/rebuilds.py
===================================================================
--- boost-build/branches/upstream/current/test/rebuilds.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/rebuilds.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+
+# This tests the typechecking facilities.
+
+import BoostBuild
+
+t = BoostBuild.Tester(pass_toolset=0)
+
+t.write('file.jam', '''
+rule make
+{
+    DEPENDS $(<) : $(>) ;
+    DEPENDS all : $(<) ;
+}
+actions make
+{
+    echo "******" making $(<) from $(>) "******"
+    echo made from $(>) >> $(<)
+}
+
+make aux1 : bar ;
+make foo : bar ;
+REBUILDS foo : bar ;
+make bar : baz ;
+make aux2 : bar ;
+''')
+
+t.write('baz', 'nothing\n')
+
+t.run_build_system('-ffile.jam bar')
+t.expect_addition('bar')
+t.expect_nothing_more()
+
+t.run_build_system('-ffile.jam foo')
+t.expect_touch('bar')
+t.expect_addition('foo')
+t.expect_nothing_more()
+
+t.run_build_system('-ffile.jam')
+t.expect_addition(['aux1', 'aux2'])
+t.expect_nothing_more()
+
+t.touch('bar')
+t.run_build_system('-ffile.jam')
+t.expect_touch(['foo', 'aux1', 'aux2', 'bar'])
+t.expect_nothing_more()
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/rebuilds.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: boost-build/branches/upstream/current/test/recursive.jam
===================================================================
--- boost-build/branches/upstream/current/test/recursive.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/recursive.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -7,7 +7,7 @@
 ##############################################################
 # Rules and actions that test Jam by invoking it recursively #
 #                                                            #
-# This is neccessary for testing anything that requires Jam  #
+# This is necessary for testing anything that requires Jam   #
 # to execute build actions whose results must be checked,    #
 # and anything which exits Jam with a failure code (e.g. a   #
 # failed assertion).                                         #

Modified: boost-build/branches/upstream/current/test/regression.py
===================================================================
--- boost-build/branches/upstream/current/test/regression.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/regression.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -66,7 +66,7 @@
 t.write("project-root.jam", "")
 
 # First test that when outcomes are expected, all .test files are created.
-t.run_build_system("hardcode-dll-paths=true", stderr=None, status=None)
+t.run_build_system("hardcode-dll-paths=false", stderr=None, status=None)
 t.expect_addition("bin/c.test/$toolset/debug/c.test")
 t.expect_addition("bin/c-f.test/$toolset/debug/c-f.test")
 t.expect_addition("bin/r.test/$toolset/debug/r.test")
@@ -97,16 +97,21 @@
 import testing ;
 
 compile c.cpp ;
+obj c-obj : c.cpp ;
 compile-fail c-f.cpp ;
 run r.cpp : : dir/input.txt ;
 run-fail r-f.cpp ;
-
+time execution : r ;
+time compilation : c-obj ;
 """)
 
-t.run_build_system("hardcode-dll-paths=true")
+t.run_build_system('hardcode-dll-paths=false')
 t.expect_content("bin/r.test/$toolset/debug/r.output",
                  "test input\nEXIT STATUS: 0\n")
 
+t.expect_addition('bin/$toolset/debug/execution.time')
+t.expect_addition('bin/$toolset/debug/compilation.time')
+
 # Make sure test failures are detected. Reverse expectation and see
 # if .test files are created or not.
 t.write("Jamfile", """ 
@@ -116,12 +121,11 @@
 compile c-f.cpp ;
 run-fail r.cpp : : dir/input.txt ;
 run r-f.cpp ;
-
 """)
 
 t.touch(List("c.cpp c-f.cpp r.cpp r-f.cpp"))
 
-t.run_build_system("hardcode-dll-paths=true", stderr=None, status=1)
+t.run_build_system("hardcode-dll-paths=false", stderr=None, status=1)
 t.expect_removal("bin/c.test/$toolset/debug/c.test")
 t.expect_removal("bin/c-f.test/$toolset/debug/c-f.test")
 t.expect_removal("bin/r.test/$toolset/debug/r.test")


Property changes on: boost-build/branches/upstream/current/test/regression.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/relative_sources.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/resolution.py
===================================================================
--- boost-build/branches/upstream/current/test/resolution.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/resolution.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,38 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Tests for the target id resolution process.
+from BoostBuild import Tester, List
+
+# Create a temporary working directory
+t = Tester()
+
+# Create the needed files
+t.write("Jamroot", """
+exe hello : hello.cpp ;
+# This should use the 'hello' target, even if there's
+# 'hello' file in current dir.
+install s : hello : <location>. ;
+""")
+t.write("hello.cpp", """
+int main()
+{
+    return 0;
+}
+""")
+
+t.run_build_system()
+
+t.expect_addition("bin/$toolset/debug/hello.obj")
+
+t.touch("hello.cpp")
+t.run_build_system("s")
+# If 'hello' in the 's' target resolved to file in
+# current dir, nothing will be rebuilt.
+t.expect_touch("bin/$toolset/debug/hello.obj")
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/resolution.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: boost-build/branches/upstream/current/test/searched_lib.py
===================================================================
--- boost-build/branches/upstream/current/test/searched_lib.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/searched_lib.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -10,7 +10,7 @@
 
 # To start with, we have to prepate a library to link with
 t.write("lib/project-root.jam", "")
-t.write("lib/Jamfile", "lib libtest_lib : test_lib.cpp ;")
+t.write("lib/Jamfile", "lib test_lib : test_lib.cpp ;")
 t.write("lib/test_lib.cpp", """
 #ifdef _WIN32
 __declspec(dllexport)
@@ -19,15 +19,16 @@
 """);
 
 t.run_build_system(subdir="lib")
-t.expect_addition("lib/bin/$toolset/debug/libtest_lib.dll")
+t.expect_addition("lib/bin/$toolset/debug/test_lib.dll")
 
 # Auto adjusting of suffixes does not work, since we need to
 # change dll to lib.
 # 
 if (os.name == 'nt' or os.uname()[0].lower().startswith('cygwin')) and get_toolset() != 'gcc':
-    t.copy("lib/bin/$toolset/debug/libtest_lib.lib", "lib/test_lib.lib")
+    t.copy("lib/bin/$toolset/debug/test_lib.lib", "lib/test_lib.lib")
+    t.copy("lib/bin/$toolset/debug/test_lib.dll", "lib/test_lib.dll")
 else:
-    t.copy("lib/bin/$toolset/debug/libtest_lib.dll", "lib/libtest_lib.dll")
+    t.copy("lib/bin/$toolset/debug/test_lib.dll", "lib/test_lib.dll")
 
 
 # Test that the simplest usage of searched library works.
@@ -41,7 +42,7 @@
 here = [ path.root $(here) [ path.pwd ] ] ;
 
 exe main : main.cpp helper ;
-lib helper : helper.cpp test_lib : <dll-path>$(here)/lib ;
+lib helper : helper.cpp test_lib ;
 lib test_lib : : <name>test_lib <search>lib ;
 """)
 t.write("main.cpp", """
@@ -57,10 +58,32 @@
 #endif
 helper() { foo(); }
 """)
-t.run_build_system(stderr=None) # gcc warns about libraries which are not in -rpath.
+t.run_build_system()
 t.expect_addition("bin/$toolset/debug/main.exe")
 t.rm("bin/$toolset/debug/main.exe")
 
+# Test that 'unit-test' will correctly add runtime paths
+# to searched libraries.
+t.write('Jamfile', """
+
+import path ;
+import project ;
+import testing ;
+
+project : requirements <hardcode-dll-paths>false ;
+
+local here = [ project.attribute $(__name__) location ] ;
+here = [ path.root $(here) [ path.pwd ] ] ;
+
+unit-test main : main.cpp helper ;
+lib helper : helper.cpp test_lib ;
+lib test_lib : : <name>test_lib <search>lib ;
+""")
+t.run_build_system()
+t.expect_addition("bin/$toolset/debug/main.passed")
+t.rm("bin/$toolset/debug/main.exe")
+
+
 # Now try using searched lib from static lib. Request shared version
 # of searched lib, since we don't have static one handy.
 t.write('Jamfile', """
@@ -132,7 +155,7 @@
 t.write("a.cpp", "")
 
 t.write("Jamfile", """
-project a : requirements <link-runtime>static ;
+project a : requirements <runtime-link>static ;
 
 static-lib a : a.cpp l ;
 lib l : : <name>l_f ;
@@ -141,4 +164,21 @@
 t.run_build_system("-n")
 
 
+# Make sure that plain "lib foobar ; " works.
+t.write("Jamfile", """
+exe a : a.cpp foobar ;
+lib foobar ;
+""")
+t.run_build_system("-n -d2")
+t.fail_test(string.find(t.stdout(), "foobar") == -1)
+
+# Make sure that plain "lib foo bar ; " works.
+t.write("Jamfile", """
+exe a : a.cpp foo bar ;
+lib foo bar ;
+""")
+t.run_build_system("-n -d2")
+t.fail_test(string.find(t.stdout(), "foo") == -1)
+t.fail_test(string.find(t.stdout(), "bar") == -1)
+
 t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/searched_lib.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/skipping.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/source_locations.py
===================================================================
--- boost-build/branches/upstream/current/test/source_locations.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/source_locations.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,53 @@
+#!/usr/bin/python
+
+#  Copyright (C) Craig Rodrigues 2005.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+# Test that projects with multiple source-location directories are handled OK.
+
+from BoostBuild import Tester
+t = Tester()
+
+t.write("Jamroot", """
+path-constant SRC1  : "./src1" ;
+path-constant SRC2  : "./src2" ;
+path-constant SRC3  : "./src3" ;
+path-constant BUILD : "build" ;
+
+project
+        : requirements
+                <include>$(SRC1)/include
+                <threading>multi
+        : build-dir $(BUILD)
+        ;
+
+build-project project1 ;
+
+""")
+t.write("project1/Jamfile", """
+project project1
+        : source-location $(SRC1)
+          $(SRC2)
+          $(SRC3)
+        ;
+
+SRCS =  s1.cpp
+        s2.cpp
+        testfoo.cpp
+        ;
+exe test : $(SRCS) ;
+""")
+
+t.write("src1/s1.cpp", "int main() { return 0; }\n")
+t.write("src2/s2.cpp", "void hello() {}\n")
+t.write("src3/testfoo.cpp", "void testfoo() {}\n")
+
+# This file should not be picked up, because "src2" is before
+# "src3" in the list of source directories.
+t.write("src3/s2.cpp", "void hello() {}\n")
+
+t.run_build_system()
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/source_locations.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: boost-build/branches/upstream/current/test/stage.py
===================================================================
--- boost-build/branches/upstream/current/test/stage.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/stage.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -96,7 +96,7 @@
 
 t.write("project-root.jam", """ 
 import type ;
-type.register MYEXE : : EXE : main ;
+type.register MYEXE : : EXE ;
 type.set-generated-target-suffix MYEXE : <optimization>off : myexe ; 
 """)
 
@@ -128,7 +128,7 @@
 t.write("Jamfile", """ 
 lib l : l.cpp ;
 exe a : a.cpp l ;
-stage dist : a : <traverse-dependencies>on <include-type>EXE <include-type>LIB ; 
+stage dist : a : <install-dependencies>on <install-type>EXE <install-type>LIB ; 
 """)
 
 t.write("project-root.jam", "")
@@ -138,6 +138,105 @@
 t.expect_addition("dist/a.exe")
 t.expect_addition("dist/l.dll")
 
+# Check that <use> properties are ignored the traversing
+# target for staging.
+t.copy("l.cpp", "l2.cpp")
+t.copy("l.cpp", "l3.cpp")
+t.write("Jamfile", """
+lib l2 : l2.cpp ;
+lib l3 : l3.cpp ;
+lib l : l.cpp : <use>l2 <dependency>l3 ;
+exe a : a.cpp l ;
+stage dist : a : <install-dependencies>on <install-type>EXE <install-type>LIB ; 
+""")
 
+t.rm("dist")
+t.run_build_system()
+t.expect_addition("dist/l3.dll")
+t.expect_nothing("dist/l2.dll")
+
+# Check if <dependency> on 'stage' works.
+t.rm(".")
+t.write("Jamroot", """
+stage a1 : a1.txt : <location>dist ;
+stage a2 : a2.txt : <location>dist <dependency>a1 ;
+""")
+t.write("a1.txt", "")
+t.write("a2.txt", "")
+t.run_build_system("a2")
+t.expect_addition(["dist/a1.txt", "dist/a2.txt"])
+
+# Regression test: check if <location>. works
+t.rm(".")
+t.write("Jamroot", """
+stage a1 : d/a1.txt : <location>. ;
+""")
+t.write("d/a1.txt", "")
+t.run_build_system()
+t.expect_addition("a1.txt")
+
+# Test that relative paths of sources can be preserved
+t.rm(".")
+t.write("Jamroot", """
+install dist : a/b/c.h : <install-source-root>. ;
+""")
+t.write("a/b/c.h", "")
+t.run_build_system()
+t.expect_addition("dist/a/b/c.h")
+
+t.write("Jamroot", """
+install dist : a/b/c.h : <install-source-root>a ;
+""")
+t.write("a/b/c.h", "")
+t.run_build_system()
+t.expect_addition("dist/b/c.h")
+
+t.rm(".")
+t.write("build/Jamroot", """
+install dist : ../a/b/c.h 
+    : <location>../dist <install-source-root>../a ;
+""")
+t.write("a/b/c.h", "")
+t.run_build_system(subdir="build")
+t.expect_addition("dist/b/c.h")
+
+t.write("Jamroot", """
+install dist2 : a/b/c.h : <install-source-root>a ;
+""")
+t.write("a/b/c.h", "")
+t.write("sub/Jamfile", """
+alias h : ..//dist2 ;
+""")
+t.run_build_system(subdir="sub")
+t.expect_addition("dist2/b/c.h")
+
+# Test that when installing .cpp files, we don't scan
+# include dependencies.
+t.rm(".")
+t.write("Jamroot", """
+install dist : a.cpp ;
+""")
+t.write("a.cpp", """
+#include "a.h"
+""")
+t.write("a.h", "")
+t.run_build_system()
+t.expect_addition("dist/a.cpp")
+
+t.touch("a.h")
+t.run_build_system()
+t.expect_nothing("dist/a.cpp")
+
+# Test that <name> property works, when there's just
+# one file in sources.
+t.rm(".")
+t.write("Jamroot", """
+install dist : a.cpp : <name>b.cpp ;
+""")
+t.write("a.cpp", "test file")
+t.run_build_system()
+
+t.expect_addition("dist/b.cpp")
+
 t.cleanup()
 


Property changes on: boost-build/branches/upstream/current/test/stage.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/standalone.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/startup_v1.py
===================================================================
--- boost-build/branches/upstream/current/test/startup_v1.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/startup_v1.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -12,7 +12,7 @@
 
 # Test the v1 startup behavior
 t = Tester(
-    executable='jam'
+    executable='bjam'
     , match=match_re
     , boost_build_path=''
     , pass_toolset=0
@@ -20,13 +20,13 @@
 
 t.set_tree('startup')
 
-if os.name == 'nt':
-    t.run_build_system(
-        status=1, stdout="You didn't set BOOST_ROOT", match = expect_substring)
+#if os.name == 'nt':
+#    t.run_build_system(
+#        status=1, stdout="You didn't set BOOST_ROOT", match = expect_substring)
 
 t.run_build_system(
     extra_args = '-sBOOST_ROOT=.', status=1
-    , stdout=r'''Unable to load Boost\.Build: could not find "boost-build\.jam".*BOOST_ROOT must be set'''
+    , stdout=r'''Unable to load Boost\.Build: could not find "boost-build\.jam".'''
     )
 
 os.chdir('no-bootstrap1')

Modified: boost-build/branches/upstream/current/test/suffix.py
===================================================================
--- boost-build/branches/upstream/current/test/suffix.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/suffix.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -34,7 +34,7 @@
 import common ;
 
 type.register First : first : ;
-type.register Second : "" : First : main ;
+type.register Second : "" : First ;
 
 generators.register-standard $(__name__).second : CPP : Second ;
 


Property changes on: boost-build/branches/upstream/current/test/suffix.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/symlink.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/tag.py
===================================================================
--- boost-build/branches/upstream/current/test/tag.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/tag.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,14 +6,47 @@
 #  warranty, and with no claim as to its suitability for any purpose.
 
 from BoostBuild import Tester, List
+import string
 
 t = Tester()
 
 t.write("project-root.jam", "")
 t.write("Jamfile", """ 
-local tags = <variant>debug:<tag>_d <variant>release:<tag>_r <link>shared:<tag>s <link>static:<tag>t ;
-exe a : a.cpp : $(tags) ;
-lib b : a.cpp : $(tags) ;
+import virtual-target ;
+rule tag ( name : type ? : property-set )
+{
+    local tags ;
+    local v = [ $(property-set).get <variant> ] ;
+    if $(v) = debug
+    {
+        tags += d ;
+    }
+    else if $(v) = release
+    {
+        tags += r ;
+    }
+    
+    local l = [ $(property-set).get <link> ] ;
+    if $(l) = shared
+    {
+        tags += s ;
+    }
+    else if $(l) = static
+    {
+        tags += t ;
+    }
+    
+    if $(tags)
+    {
+        return [ virtual-target.add-prefix-and-suffix $(name)_$(tags:J="") 
+            : $(type) : $(property-set) ] ;
+    }
+    
+}
+
+# Test both fully-qualified and local name of the rule
+exe a : a.cpp : <tag>@$(__name__).tag ;
+lib b : a.cpp : <tag>@tag ;
 stage c : a ;
 """)
 
@@ -50,5 +83,24 @@
 t.run_build_system(variants + " clean")
 t.expect_removal(file_list)
 
+# Regression test: the 'tag' feature did not work in directories that
+# had dot in names.
+t.write("version-1.32.0/Jamroot", """
+project test : requirements <tag>@$(__name__).tag ;
+
+rule tag ( name : type ? : property-set )
+{
+   # Do nothing, just make sure the rule is invoked OK.
+   ECHO "The tag rule was invoked" ;
+}
+exe a : a.cpp ;
+""")
+
+t.write("version-1.32.0/a.cpp", "int main() { return 0; }\n")
+
+t.run_build_system(subdir="version-1.32.0")
+t.expect_addition("version-1.32.0/bin/$toolset/debug/a.exe")
+t.fail_test(string.find(t.stdout(), "The tag rule was invoked") == -1)
+
 t.cleanup()
 


Property changes on: boost-build/branches/upstream/current/test/tag.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/template.py
===================================================================
--- boost-build/branches/upstream/current/test/template.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/template.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,9 +1,9 @@
 #!/usr/bin/python
 
-#  Copyright (C) Vladimir Prus 2003. Permission to copy, use, modify, sell and
-#  distribute this software is granted provided this copyright notice appears in
-#  all copies. This software is provided "as is" without express or implied
-#  warranty, and with no claim as to its suitability for any purpose.
+#  Copyright (C) FILL SOMETHING HERE 2006.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
 
 #  This file is template for Boost.Build tests. It creates a simple
 #  project that builds one exe from one source, and checks that the exe
@@ -14,8 +14,7 @@
 t = Tester()
 
 # Create the needed files
-t.write("project-root.jam", "")
-t.write("Jamfile", """
+t.write("Jamroot", """
 exe hello : hello.cpp ;
 """)
 t.write("hello.cpp", """


Property changes on: boost-build/branches/upstream/current/test/template.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/test-config-example.jam
===================================================================
--- boost-build/branches/upstream/current/test/test-config-example.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/test-config-example.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -4,8 +4,12 @@
 # and tweak it. When tests are run, only this file will be loaded,
 # while site-config.jam and user-config.jam will be ignored.
 
-import toolset : using ;
+using gcc ;
+using borland ;
 
-using gcc ;
-using msvc : : "P:/Program Files/Microsoft Visual Studio/vc98" : : vcvars32-p.bat ;
-using borland ;
\ No newline at end of file
+using boostbook 
+     : /home/ghost/build/docbook/xsl
+     : /home/ghost/build/docbook/dtd
+     : /home/ghost/Work/boost-rc/tools/boostbook
+     ; 
+using doxygen ;
\ No newline at end of file

Modified: boost-build/branches/upstream/current/test/test.jam
===================================================================
--- boost-build/branches/upstream/current/test/test.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/test.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -9,6 +9,8 @@
 import property ;
 import build-request ;
 import container ;
+import print ;
+import common ;
 
 
 actions nothing { }


Property changes on: boost-build/branches/upstream/current/test/test1.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/test2.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/test_all.py
===================================================================
--- boost-build/branches/upstream/current/test/test_all.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/test_all.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -73,7 +73,8 @@
 critical_tests += ["core_d12", "core_typecheck", "core_delete_module",
                    "core_varnames", "core_import_module"]
 
-tests = [ "project_test1",
+tests = [ "rebuilds",
+          "timedata",
           "project_test3",
           "project_test4",
           "generators_test",
@@ -111,7 +112,6 @@
           "suffix",
           "inherit_toolset",
           "skipping",
-          "project_root",
           "glob",
           "project_root_constants",
           "double_loading",
@@ -125,21 +125,48 @@
           "wrapper",
           "duplicate",
           "library_property",
-          #"ordered_properties",
+          "load_order",
+          "wrong_project",
+          "using",
+          "source_locations",
+          "out_of_tree",
+          "notfile",
+          "project_root_rule",
+          "resolution",
+          "build_file",
+          "indirect_conditional",
+          "build_no",
+          "disambiguation",
+          "clean",
+          "lib_source_property",
+          "implicit_dependency",
+          "example_libraries",
+          "example_make",
           ]
 
 if os.name == 'posix':
     tests.append("symlink")
     # On windows, library order is not important, so skip this test
-    # Besides, it fails ;-)    
-    tests.append("library_order")
+    # Besides, it fails ;-)
+    # Further, the test relies on the fact that on Linux, one
+    # can build a shared library with unresolved symbols. This is
+    # not true on Windows (even with cygwin gcc).
+    if string.find(os.uname()[0], "CYGWIN") == -1:
+        tests.append("library_order")
 
 if string.find(get_toolset(), 'gcc') == 0:
     tests.append("gcc_runtime")
 
-if os.environ.has_key('QTDIR'):
-    tests.append("railsys")
+if "--extras" in sys.argv:
+    tests.append("boostbook")
+    tests.append("example_qt4")
+    # Requires ./whatever.py to work, so is
+    # not guaranted to work everywhere.
+    tests.append("example_customization")
+    # Requires gettext tools.
+    tests.append("example_gettext")
+    
 else:
-    print 'skipping railsys test since QTDIR environment variable is unset'
+    print 'Note: skipping extra tests'
 
 run_tests(critical_tests, tests)

Modified: boost-build/branches/upstream/current/test/test_system.html
===================================================================
--- boost-build/branches/upstream/current/test/test_system.html	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/test_system.html	2006-11-09 09:53:31 UTC (rev 14016)
@@ -4,13 +4,12 @@
 <html>
   <head>
     <meta name="generator" content=
-    "HTML Tidy for Linux/x86 (vers 1st April 2002), see www.w3.org">
+    "HTML Tidy for Linux/x86 (vers 1st March 2002), see www.w3.org">
     <!--tidy options: -i -wrap 78 -->
     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 
     <title>A testing system for Boost.Build</title>
-
-    <style type="text/css">
+<style type="text/css">
         hr { color: black }
         p.revision { text-align: right; font-style: italic }
         pre.code { margin-left: 2em } 
@@ -20,7 +19,8 @@
         h1 { text-align: right }
         br.clear { clear: left }
         div.attention { color: red }
-    </style>
+    
+</style>
   </head>
 
   <body>
@@ -104,7 +104,7 @@
       2.1 is known to work.</li>
 
       <li>Build Boost.Jam. See <a href=
-      "../../jam_src/index.html">$boost_build_root/jam_src/index.html</a> for
+      "../../../jam/index.html">$boost_build_root/jam/index.html</a> for
       instructions.</li>
 
       <li>Configure at least one toolset. You can edit
@@ -293,8 +293,8 @@
     This is true on all platforms. In some contexts, a list of files is
     allowed. In that case any object with sequence interface is allowed.</p>
 
-    <h3><a name="method-__init__">Method <tt>__init__(self, arguments='',
-    executable='bjam')</tt></a></h3>
+    <h3><a name="method-__init__">Method <tt>__init__(self, workdir='',
+    arguments='', executable='bjam')</tt></a></h3>
 
     <p><b>Effects:</b></p>
 
@@ -313,6 +313,9 @@
 
       <li>Changes current working dir to the temporary working directory
       created by the base constructor.</li>
+
+      <li>If you want to run a test in a existing directory, pass it to
+      <tt>workdir</tt>.</li>
     </ol>
 
     <h3><a name="method-set_tree">Method <tt>set_tree(self,
@@ -359,12 +362,13 @@
       <li>Stores the state of the working directory in
       <tt>self.previous_tree</tt>.</li>
 
-      <li>Changes to <tt>subdir</tt>, if it is specified. If it is not
-      absolute path, it is relative to the working dir.</li>
+      <li>Changes to <tt>subdir</tt>, if it is specified. It is relative to
+      the <tt>original_workdir</tt> or the workdir specified in
+      <tt>__init</tt>.</li>
 
       <li>Invokes the <tt>bjam</tt> executable, passing <tt>extra_args</tt>
       to it. The binary should be located under
-      <tt>&lt;test_invocation_dir&gt;/../jam_src/bin.&lt;platform&gt;</tt>.
+      <tt>&lt;test_invocation_dir&gt;/../jam/src/bin.&lt;platform&gt;</tt>.
       This is to make sure tests use the version of jam build from CVS.</li>
 
       <li>Compares the stdout, stderr and exit status of build system
@@ -539,13 +543,13 @@
 </pre>
     <hr>
 
-    <p class="revision">Last modified: Mar 3, 2003</p>
+    <p class="revision">Last modified: Mar 11, 2005</p>
 
-    <p>&copy; Copyright Vladimir Prus 2002, 2003. Permission to copy, use,
-    modify, sell and distribute this document is granted provided this
-    copyright notice appears in all copies. This document is provided ``as
-    is'' without express or implied warranty, and with no claim as to its
-    suitability for any purpose.</p>
+    <p>&copy; Copyright Vladimir Prus 2002, 2003, 2004, 2005. Permission to
+    copy, use, modify, sell and distribute this document is granted provided
+    this copyright notice appears in all copies. This document is provided
+    ``as is'' without express or implied warranty, and with no claim as to
+    its suitability for any purpose.</p>
   </body>
 </html>
 

Added: boost-build/branches/upstream/current/test/timedata.py
===================================================================
--- boost-build/branches/upstream/current/test/timedata.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/timedata.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,57 @@
+#!/usr/bin/python
+# Copyright David Abrahams 2005. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+# This tests the build step timing facilities.
+
+import BoostBuild
+
+t = BoostBuild.Tester(pass_toolset=0)
+
+t.write('file.jam', '''
+rule time
+{
+    DEPENDS $(<) : $(>) ;
+    __TIMING_RULE__ on $(>) = record_time $(<) ;
+    DEPENDS all : $(<) ;
+}
+actions time
+{
+    echo $(>) user: $(__USER_TIME__) system: $(__SYSTEM_TIME__)
+    echo timed from $(>) >> $(<)
+}
+
+rule record_time ( target source : user : system )
+{
+    ECHO record_time called: $(target) / $(source) / $(user) / $(system) ;
+    __USER_TIME__ on $(target) = $(user) ;
+    __SYSTEM_TIME__ on $(target) = $(system) ;
+}
+
+rule make
+{
+    DEPENDS $(<) : $(>) ;
+}
+actions make
+{
+    echo made from $(>) >> $(<)
+}
+
+
+time foo : bar ;
+make bar : baz ;
+''')
+
+import re
+t.write('baz', 'nothing\n')
+t.run_build_system(
+    '-ffile.jam',
+    stdout=r'bar +user: [0-9\.]+ +system: +[0-9\.]+ *$',
+    match = lambda actual,expected: re.search(expected,actual,re.DOTALL)
+    )
+t.expect_addition('foo')
+t.expect_addition('bar')
+t.expect_nothing_more()
+
+t.cleanup()


Property changes on: boost-build/branches/upstream/current/test/timedata.py
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: boost-build/branches/upstream/current/test/unit_test.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/unit_tests.py
___________________________________________________________________
Name: svn:executable
   - 
   + *


Property changes on: boost-build/branches/upstream/current/test/unused.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Modified: boost-build/branches/upstream/current/test/use_requirements.py
===================================================================
--- boost-build/branches/upstream/current/test/use_requirements.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/use_requirements.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -4,15 +4,20 @@
 t = Tester()
 
 # Test that use requirements on main target work
+# (and a propagated all the way up, not only to direct
+# dependents)
 t.write("project-root.jam", "import gcc ;")
 
+# Note: 'lib cc ..', not 'lib c', If using 'lib c: ...' the HP-CXX
+# linker will confuse it with the system C runtime.
 t.write(
     "Jamfile",
 """
     lib b : b.cpp : <link>shared:<define>SHARED_B
-    : : <define>FOO <link>shared:<define>SHARED_B
+    : : <define>FOO <link>shared:<define>SHARED_B    
     ;
-    exe a : a.cpp b ;
+    lib cc : c.cpp b ;
+    exe a : a.cpp cc ;
 """)
 
 t.write(
@@ -26,6 +31,17 @@
 """)
 
 t.write(
+    "c.cpp",
+"""
+void
+#if defined(_WIN32) && defined(SHARED_B)
+__declspec(dllexport)
+#endif
+create_lib_please() {}\n
+""")
+
+
+t.write(
     "a.cpp",
 """
 #ifdef FOO
@@ -163,11 +179,11 @@
     # Here's the test: we should correctly
     # handle dependency feature and get
     # use requirements from 'b'.
-    lib c : c.cpp : <link>shared:<define>SHARED_C : : <library>b ;
+    lib cc : c.cpp : <link>shared:<define>SHARED_C : : <library>b ;
     
     # This will build only if <define>FOO
     # was propagated from 'c'.
-    exe a : a.cpp c ;
+    exe a : a.cpp cc ;
 """)
 
 t.write(
@@ -202,7 +218,7 @@
 t.write(
     "Jamfile",
 """
-    exe a : a.cpp lib1//c ;
+    exe a : a.cpp lib1//cc ;
 """)
 
 t.write(
@@ -213,7 +229,7 @@
     : usage-requirements <library>../lib2//b <link>shared:<define>SHARED_C
     ;
     
-    lib c : c.cpp ;    
+    lib cc : c.cpp ;    
 """)
 
 t.write(


Property changes on: boost-build/branches/upstream/current/test/use_requirements.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/using.py
===================================================================
--- boost-build/branches/upstream/current/test/using.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/using.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+
+#  Copyright (C) Vladimir Prus 2005.
+#  Distributed under the Boost Software License, Version 1.0. (See
+#  accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+from BoostBuild import Tester, List
+import string
+
+t = Tester()
+
+t.write("sub/a.cpp", """ 
+int main() { return 0; }
+
+""")
+
+t.write("Jamroot", """ 
+using some_tool ;
+""")
+
+t.write("some_tool.jam", """ 
+import project ;
+project.initialize $(__name__) ;
+
+rule init ( )
+{
+}
+
+""")
+
+t.write("sub/Jamfile", """ 
+exe a : a.cpp ; 
+""")
+
+
+
+t.run_build_system(subdir="sub")
+
+t.expect_addition("sub/bin/$toolset/debug/a.exe")
+
+t.cleanup()
+


Property changes on: boost-build/branches/upstream/current/test/using.py
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: boost-build/branches/upstream/current/test/wrapper.py
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/test/wrong_project.py
===================================================================
--- boost-build/branches/upstream/current/test/wrong_project.py	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/test/wrong_project.py	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+
+# Copyright Vladimir Prus 2005.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt
+# or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+# Regression test. When Jamfile contained "using whatever ; " and the
+# 'whatever' module declared a project, then all targets in Jamfile were
+# considered to be declared in the project associated with 'whatever',
+# not with the Jamfile.
+
+from BoostBuild import Tester, List
+
+
+t = Tester()
+# Remove temporary directories
+
+t.write("a.cpp", """ 
+int main() { return 0; }
+
+""")
+
+t.write("Jamroot", """ 
+using some_tool ;
+exe a : a.cpp ; 
+""")
+
+t.write("some_tool.jam", """ 
+import project ;
+project.initialize $(__name__) ;
+
+rule init ( )
+{
+}
+
+""")
+
+t.run_build_system()
+t.expect_addition("bin/$toolset/debug/a.exe")
+
+t.cleanup()
+


Property changes on: boost-build/branches/upstream/current/test/wrong_project.py
___________________________________________________________________
Name: svn:executable
   + *

Added: boost-build/branches/upstream/current/timestamp.txt
===================================================================
--- boost-build/branches/upstream/current/timestamp.txt	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/timestamp.txt	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1 @@
+Thu Jul 20 12:15:20 MSD 2006

Added: boost-build/branches/upstream/current/tools/acc.jam
===================================================================
--- boost-build/branches/upstream/current/tools/acc.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/acc.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,99 @@
+# Copyright Vladimir Prus 2004.
+# Copyright Toon Knapen 2004.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt
+# or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#
+# Boost.Build V2 toolset for the IBM VisualAge compiler
+#
+
+import toolset : flags ;
+import feature ;
+import generators ;
+
+feature.extend toolset : acc ;
+toolset.inherit acc : unix ;
+generators.override builtin.lib-generator : acc.prebuilt ;
+generators.override acc.searched-lib-generator : searched-lib-generator ;
+feature.subfeature toolset acc : version ;
+
+# Configures the acc toolset. 
+rule init ( version ? : path * )
+{
+}
+
+
+# Declare generators
+generators.register-c-compiler acc.compile.c : C : OBJ : <toolset>acc ;
+generators.register-c-compiler acc.compile.c++ : CPP : OBJ : <toolset>acc ;
+
+# Declare flags.
+flags acc CFLAGS <optimization>off : ;
+flags acc CFLAGS <optimization>speed : -O3 ;
+flags acc CFLAGS <optimization>space : -O2 ;
+
+flags acc CFLAGS <inlining>off : +d ;
+flags acc CFLAGS <inlining>on : ;
+flags acc CFLAGS <inlining>full : ;
+
+flags acc C++FLAGS <exception-handling>off : ;
+flags acc C++FLAGS <exception-handling>on : ;
+
+flags acc C++FLAGS <rtti>off : ;
+flags acc C++FLAGS <rtti>on : ;
+
+# We want the full path to the sources in the debug symbols because otherwise
+# the debugger won't find the sources when we use boost.build.
+flags acc CFLAGS <debug-symbols>on : -g ;
+flags acc LINKFLAGS <debug-symbols>on : -g ;
+flags acc LINKFLAGS <debug-symbols>off : -s ;
+
+# V2 does not have <shared-linkable>, not sure what this meant in V1.
+# flags acc CFLAGS <shared-linkable>true : +Z ;
+
+flags acc CFLAGS <profiling>on : -pg ;
+flags acc LINKFLAGS <profiling>on : -pg ;
+
+flags acc CFLAGS <cflags> ;
+flags acc C++FLAGS <cxxflags> ;
+flags acc DEFINES <define> ;
+flags acc UNDEFS <undef> ;
+flags acc HDRS <include> ;
+flags acc STDHDRS <sysinclude> ;
+flags acc LINKFLAGS <linkflags> ;
+flags acc ARFLAGS <arflags> ;
+
+flags acc LIBPATH <library-path> ;
+flags acc NEEDLIBS <library-file> ;
+flags acc FINDLIBS <find-shared-library> ;
+flags acc FINDLIBS <find-static-library> ;
+
+# Select the compiler name according to the threading model.
+flags acc CFLAGS <threading>multi : -mt   ;
+flags acc LINKFLAGS <threading>multi : -mt ;
+
+actions acc.link bind NEEDLIBS
+{
+    aCC $(LINKFLAGS) +DD64 -mt -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS)
+}
+
+actions acc.link.dll bind NEEDLIBS
+{
+    aCC -b $(LINKFLAGS) +DD64 -mt -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS)
+}
+
+actions acc.compile.c
+{    
+    aCC -Ae -mt +DD64 -c -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)"
+}
+
+actions acc.compile.c++
+{
+    aCC -AA -mt +DD64 -c -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(C++FLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)"
+}
+
+actions updated together piecemeal acc.archive
+{
+    ar ru$(ARFLAGS:E="") "$(<)" "$(>)"
+}

Added: boost-build/branches/upstream/current/tools/boostbook-config.jam
===================================================================
--- boost-build/branches/upstream/current/tools/boostbook-config.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/boostbook-config.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,53 @@
+#~ Copyright 2005 Rene Rivera.
+#~ 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)
+
+# Automatic configuration for BoostBook tools. To use, just import this module.
+
+import os ;
+import toolset : using ;
+
+local docbook_xsl-path = [ modules.peek : DOCBOOK_XSL_DIR ] ;
+local docbook_dtd-path = [ modules.peek : DOCBOOK_DTD_DIR ] ;
+local boostbook-path = [ modules.peek : BOOSTBOOK_DIR ] ;
+if [ os.name ] = NT
+{
+    # If installed by the Boost installer.
+    local boost-dir = ;
+    for local R in snapshot cvs 1.33.0
+    {
+        boost-dir += [ W32_GETREG
+            "HKEY_LOCAL_MACHINE\\SOFTWARE\\Boost.org\\$(R)"
+            : "InstallRoot" ] ;
+    }
+    # Plausible locations.
+    docbook_xsl-path ?= [ GLOB "$(boost-dir)\\share" "\\Boost\\share" : docbook-xsl* ] ;
+    docbook_dtd-path ?= [ GLOB "$(boost-dir)\\share" "\\Boost\\share" : docbook-xml* ] ;
+    boostbook-path ?= [ GLOB "$(boost-dir)\\share" "\\Boost\\share" : boostbook* ] ;
+    
+    docbook_xsl-path = $(docbook_xsl-path[1]) ;
+    docbook_dtd-path = $(docbook_dtd-path[1]) ;
+    boostbook-path = $(boostbook-path[1]) ;
+}
+else
+{
+    # Plausible locations.
+    docbook_xsl-path ?= [ GLOB "/usr/local/share" "/usr/share" "/opt/share" : docbook-xsl* ] ;
+    docbook_dtd-path ?= [ GLOB "/usr/local/share" "/usr/share" "/opt/share" : docbook-xml* ] ;
+    boostbook-path ?= [ GLOB "/usr/local/share" "/usr/share" "/opt/share" : boostbook* ] ;
+    # Ubuntu Linux
+    docbook_xsl-path ?= [ GLOB "/usr/share/xml/docbook/stylesheet" : nwalsh ] ;
+    docbook_dtd-path ?= [ GLOB "/usr/share/xml/docbook/schema/dtd" : 4.3 4.2 ] ;
+    
+    docbook_xsl-path = $(docbook_xsl-path[1]) ;
+    docbook_dtd-path = $(docbook_dtd-path[1]) ;
+    boostbook-path = $(boostbook-path[1]) ;
+}
+if $(docbook_xsl-path) && $(docbook_dtd-path)
+{
+    if --debug-configuration in [ modules.peek : ARGV ]
+    {
+        ECHO "notice:" using boostbook ":" $(docbook_xsl-path) ":" $(docbook_dtd-path) ":" $(boostbook-path) ;
+    }
+    using boostbook : $(docbook_xsl-path) : $(docbook_dtd-path) : $(boostbook-path) ;
+}

Modified: boost-build/branches/upstream/current/tools/boostbook.jam
===================================================================
--- boost-build/branches/upstream/current/tools/boostbook.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/boostbook.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -23,16 +23,17 @@
 import make ;
 import type ;
 import modules path project ;
+import build-system ;
+
 import xsltproc : xslt xslt-dir ;
 
 feature.feature format : html onehtml man pdf ps docbook fo tests
   : incidental implicit composite ;
 
 type.register DTDXML : dtdxml ;
-type.register XML : xml : : main ;
+type.register XML : xml ;
 type.register BOOSTBOOK : boostbook : XML ;
 type.register DOCBOOK : docbook : XML ; 
-type.register HTML : html ;
 type.register FO : fo : XML ;
 type.register PDF : pdf ;
 type.register PS : ps ;
@@ -40,6 +41,9 @@
 type.register HTMLDIR ;
 type.register MANPAGES ;
 type.register TESTS : tests ;
+# Artificial target type, used to require invocation of top-level
+# BoostBook generator.
+type.register BOOSTBOOK_MAIN ;
 
 
 # Initialize BoostBook support. The parameters are:
@@ -50,22 +54,19 @@
 #   docbook-dtd-dir: The DocBook DTD directory. If not provided, we use
 #     DOCBOOK_DTD_DIR From the environment (if available). Otherwise, we let
 #     the XML processor load the DTD remotely.
-rule init ( docbook-xsl-dir ? : docbook-dtd-dir ? )
+#
+#   boost-book-dir: The BoostBook directory with the DTD and XSL subdirs.
+#
+rule init ( docbook-xsl-dir ? : docbook-dtd-dir ? : boostbook-dir ? )
 {
 
-  if ! $(docbook-xsl-dir)
-  {
-    docbook-xsl-dir = [ modules.peek : DOCBOOK_XSL_DIR ] ;
-  }
+  docbook-xsl-dir ?= [ modules.peek : DOCBOOK_XSL_DIR ] ;
 
-  if ! $(docbook-dtd-dir)
-  {
-    docbook-dtd-dir = [ modules.peek : DOCBOOK_DTD_DIR ] ;
-  }
+  docbook-dtd-dir ?= [ modules.peek : DOCBOOK_DTD_DIR ] ;
 
   if ! $(.initialized) 
   {
-    $(.initialized) = true ;
+    .initialized = true ;
     if $(docbook-xsl-dir) 
     {
       .docbook-xsl-dir = [ path.make $(docbook-xsl-dir) ] ;
@@ -80,12 +81,11 @@
     {
         boost-root = [ path.make $(boost-root) ] ;
     }    
-    local boost-build-root = [
-        sequence.transform path.make : [ modules.peek : BOOST_BUILD_PATH ]
-    ] ; 
-    local search-dirs = [ path.join $(boost-root) tools boostbook ] 
+    local boost-build-root = [ build-system.location ] ;
+    local search-dirs = $(boostbook-dir) [ path.join $(boost-root) tools boostbook ] 
                         $(boost-build-root)/../../boostbook ;
     
+    
     if --debug-configuration in [ modules.peek : ARGV ] 
     {
         ECHO "notice: Boost.Book: searching XSLS/DTD in" ;
@@ -99,14 +99,8 @@
     for local dir in $(search-dirs) {
         boostbook-dtd-dir += [ path.glob $(dir) : dtd ] ;
     }
-    if $(boostbook-xsl-dir)
-    {        
-        .boostbook-xsl-dir = [ path.make $(boostbook-xsl-dir[1]) ] ;
-    }
-    if $(boostbook-dtd-dir)
-    {        
-        .boostbook-dtd-dir = [ path.make $(boostbook-dtd-dir[1]) ] ;
-    }
+    .boostbook-xsl-dir = $(boostbook-xsl-dir[1]) ;
+    .boostbook-dtd-dir = $(boostbook-dtd-dir[1]) ;
     
     
     if ! $(.boostbook-xsl-dir) || ! $(.boostbook-dtd-dir)
@@ -200,165 +194,160 @@
   xslt $(target) : $(source) $(stylesheet) : $(properties) ;
 }
 
-class xml-catalog-action : action
+rule generate-xml-catalog ( target : sources * : properties * )
 {
-    import boostbook ;
-    import print ;
+  print.output $(target) ;
 
-    rule __init__ ( target : property-set ? : catalog-entries * )
-    {
-        action.__init__ $(target) : : generate-xml-catalog : $(property-set) ;
-    }
-    
-  rule actualize ( )
+  # BoostBook DTD catalog entry
+  local boostbook-dtd-dir = [ boostbook.dtd-dir ] ;
+  
+  print.text
+    "<?xml version=\"1.0\"?>"
+    "<!DOCTYPE catalog "
+    "  PUBLIC \"-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN\""
+    "  \"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd\">"
+    "<catalog xmlns=\"urn:oasis:names:tc:entity:xmlns:xml:catalog\">"
+    "  <rewriteURI uriStartString=\"http://www.boost.org/tools/boostbook/dtd/\" rewritePrefix=\"file://$(boostbook-dtd-dir)/\"/>"
+    : true ;
+
+  local docbook-xsl-dir = [ boostbook.docbook-xsl-dir ] ;
+  if ! $(docbook-xsl-dir) 
   {
-    if ! $(self.actualized)
-    {
-      self.actualized = true ;
-      local actual = [ $(self.targets[1]).actualize ] ; 
-      local text = "<?xml version=\"1.0\"?>" ;
+    ECHO "BoostBook warning: no DocBook XSL directory specified." ;
+    ECHO "  If you have the DocBook XSL stylesheets installed, please " ;
+    ECHO "  set DOCBOOK_XSL_DIR to the stylesheet directory on either " ;
+    ECHO "  the command line (via -sDOCBOOK_XSL_DIR=...) or in a " ;
+    ECHO "  Boost.Jam configuration file. The DocBook XSL stylesheets " ;
+    ECHO "  are available here: http://docbook.sourceforge.net/ " ;
+    ECHO "  Stylesheets will be downloaded on-the-fly (very slow!) " ;
+  }
+  else 
+  {
+    print.text "  <rewriteURI uriStartString=\"http://docbook.sourceforge.net/release/xsl/current/\" rewritePrefix=\"file://$(docbook-xsl-dir)/\"/>" ;
+  }
 
-      text += "<!DOCTYPE catalog " ;
-      text += "  PUBLIC \"-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN\"" ;
-      text += "  \"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd\">" ;
-      text += "<catalog xmlns=\"urn:oasis:names:tc:entity:xmlns:xml:catalog\">" ;
- 
-      # BoostBook DTD catalog entry
-      local boostbook-dtd-dir = [ boostbook.dtd-dir ] ;
-
-      text += "  <rewriteURI uriStartString=\"http://www.boost.org/tools/boostbook/dtd/\" rewritePrefix=\"file://$(boostbook-dtd-dir)/\"/>" ;
-
-      local docbook-xsl-dir = [ boostbook.docbook-xsl-dir ] ;
-      if ! $(docbook-xsl-dir) 
-      {
-        ECHO "BoostBook warning: no DocBook XSL directory specified." ;
-        ECHO "  If you have the DocBook XSL stylesheets installed, please " ;
-        ECHO "  set DOCBOOK_XSL_DIR to the stylesheet directory on either " ;
-        ECHO "  the command line (via -sDOCBOOK_XSL_DIR=...) or in a " ;
-        ECHO "  Boost.Jam configuration file. The DocBook XSL stylesheets " ;
-        ECHO "  are available here: http://docbook.sourceforge.net/ " ;
-        ECHO "  Stylesheets will be downloaded on-the-fly (very slow!) " ;
-      }
-      else 
-      {
-        text += "  <rewriteURI uriStartString=\"http://docbook.sourceforge.net/release/xsl/current/\" rewritePrefix=\"file://$(docbook-xsl-dir)/\"/>" ;
-      }
-
-      local docbook-dtd-dir = [ boostbook.docbook-dtd-dir ] ;
-      if ! $(docbook-dtd-dir)
-      {
-        ECHO "BoostBook warning: no DocBook DTD directory specified." ;
-        ECHO "  If you have the DocBook DTD installed, please set " ;
-        ECHO "  DOCBOOK_DTD_DIR to the DTD directory on either " ;
-        ECHO "  the command line (via -sDOCBOOK_DTD_DIR=...) or in a " ;
-        ECHO "  Boost.Jam configuration file. The DocBook DTD is available " ;
-        ECHO "  here: http://www.oasis-open.org/docbook/xml/4.2/index.shtml" ;
-        ECHO "  The DTD will be downloaded on-the-fly (very slow!) " ;
-      }
-      else 
-      {
-        text += "  <rewriteURI uriStartString=\"http://www.oasis-open.org/docbook/xml/4.2/\" rewritePrefix=\"file://$(docbook-dtd-dir)/\"/>" ;
-      }
-
-      text += "</catalog>" ;
-
-      print.output $(actual) ;
-      print.text $(text) : true ;          
-    }
+  local docbook-dtd-dir = [ boostbook.docbook-dtd-dir ] ;
+  if ! $(docbook-dtd-dir)
+  {
+    ECHO "BoostBook warning: no DocBook DTD directory specified." ;
+    ECHO "  If you have the DocBook DTD installed, please set " ;
+    ECHO "  DOCBOOK_DTD_DIR to the DTD directory on either " ;
+    ECHO "  the command line (via -sDOCBOOK_DTD_DIR=...) or in a " ;
+    ECHO "  Boost.Jam configuration file. The DocBook DTD is available " ;
+    ECHO "  here: http://www.oasis-open.org/docbook/xml/4.2/index.shtml" ;
+    ECHO "  The DTD will be downloaded on-the-fly (very slow!) " ;
   }
+  else 
+  {
+    print.text "  <rewriteURI uriStartString=\"http://www.oasis-open.org/docbook/xml/4.2/\" rewritePrefix=\"file://$(docbook-dtd-dir)/\"/>" ;
+  }
+
+  print.text "</catalog>" ;
 }
 
-class boostbook-target-class : basic-target
+class boostbook-generator : generator
 {
     import feature ;
     import virtual-target ;
     import generators ;
-        
-    rule __init__ ( name : project : sources * : requirements * 
-                              : default-build * : catalog-entries * )
-    {
-
-        basic-target.__init__ $(name) : $(project) : $(sources) : $(requirements)
-          : $(default-build) ;
-        self.catalog-entries = $(catalog-entries) ;
-    }
+      
     
-  rule construct ( source-targets * : property-set )
-  {
-    local path = [ $(self.project).get location ] ;
-    local catalog = [ new file-target catalog : XML : $(self.project) ] ;
-    $(catalog).action [ new xml-catalog-action $(catalog) : $(property-set) 
-                                               : $(self.catalog-entries) ] ;
-
-    $(catalog).set-path $(path) ;
-    catalog = [ virtual-target.register $(catalog) ] ;
-    local properties = [ $(property-set).raw ] ;
-
-    local format = [ feature.get-values <format> : $(properties) ] ;
-    local targets = $(catalog) ;
-
-    local type = none ;
-    local manifest ; 
-    switch $(format) 
+    rule __init__ ( * : * )
     {
-      case html    : 
-      {
-        type = HTMLDIR ;
-        manifest = HTML.manifest ;
-      }
-
-      case onehtml : type = HTML ;
- 
-      case man : 
-      {
-        type = MANPAGES ;
-        manifest = man.manifest ;
-      }
-
-      case docbook : type = DOCBOOK ;
-      case fo      : type = FO ;
-      case pdf     : type = PDF ;
-      case ps      : type = PS ;
-      case tests   : type = TESTS ;
+        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
     }
     
-    if $(manifest)
+    rule run ( project name ? : property-set : sources * : multiple ? )
     {
-      local base-target = [ generators.construct $(self.project) 
-                            : DOCBOOK : $(property-set) : $(source-targets) ] ;
-      $(base-target).depends $(catalog) ;
+        # Generate the catalog
+        local catalog = [ new file-target catalog 
+                            : XML 
+                            : $(project)
+                            : [ new action 
+                                  : boostbook.generate-xml-catalog 
+                                  : $(property-set) ] ] ;
 
-      local target = [ generators.construct $(self.project) $(manifest)
-                       : $(type) : $(property-set) : $(base-target) ] ;
-      $(target).set-path $(format) ;
+        #  catalog = [ virtual-target.register $(catalog) ] ;
+       
+        # Add the catalog to the property set
+        local catalog-path = [ $(catalog).path ] ;
+        catalog-path = "$(catalog-path)/" ;
+        local catalog-file = $(catalog-path:G=<catalog>:B=catalog:S=.xml) ;
+        property-set = [ $(property-set).add-raw $(catalog-file) ] ;
 
-      targets += $(target) ;
-    }
-    else {
-      local target = [ generators.construct $(self.project)
-                       : $(type) : $(property-set) : $(source-targets) ] ;
+        # local targets = $(catalog) ;
 
-      if ! $(target)
-      {
-        errors.error "Cannot build documentation type '$(format)'" ;
-      }
-      else 
-      {
-        $(target).depends $(catalog) ;
-        targets += $(target) ;
-      }
-    }
+        local type = none ;
+        local manifest ; 
+        local format = [ $(property-set).get <format> ] ;
+        switch $(format) 
+        {
+            case html    : 
+            {
+                type = HTMLDIR ;
+                manifest = HTML.manifest ;
+            }
+            
+            case onehtml : type = HTML ;
+            
+            case man : 
+            {
+                type = MANPAGES ;
+                manifest = man.manifest ;
+            }
+            
+            case docbook : type = DOCBOOK ;
+            case fo      : type = FO ;
+            case pdf     : type = PDF ;
+            case ps      : type = PS ;
+            case tests   : type = TESTS ;
+        }
+        
+        if $(manifest)
+        {
+            # Create DOCBOOK file from BOOSTBOOK sources.
+            local base-target = [ generators.construct $(project) 
+              : DOCBOOK : $(property-set) : $(sources) ] ;
+            base-target = $(base-target[2]) ;
+            $(base-target).depends $(catalog) ;
+            
+            # Generate HTML/PDF/PS from DOCBOOK.
+            local target = [ generators.construct $(project) $(manifest)
+              : $(type) : $(property-set) : $(base-target) ] ;
+            local name = [ $(property-set).get <name> ] ;
+            name ?= $(format) ;
+            $(target[2]).set-path $(name) ;
+            $(target[2]).depends $(catalog) ;            
 
-    return $(targets) ;
-  }
+            targets += $(target[2]) ;
+        }
+        else {
+            local target = [ generators.construct $(project)
+              : $(type) : $(property-set) : $(sources) ] ;
+            
+            if ! $(target)
+            {
+                errors.error "Cannot build documentation type '$(format)'" ;
+            }
+            else 
+            {
+                $(target[2]).depends $(catalog) ;
+                targets += $(target[2]) ;
+            }
+        }
+        
+        return $(targets) ;
+    }
 }
 
+generators.register [ new boostbook-generator boostbook.main : : BOOSTBOOK_MAIN ] ;
+
 rule boostbook ( target-name : sources * : requirements * : default-build * )
 { 
   local project = [ project.current ] ;
- 
+    
   targets.main-target-alternative 
-    [ new boostbook-target-class $(target-name) : $(project) 
+    [ new typed-target $(target-name) : $(project) : BOOSTBOOK_MAIN
         : [ targets.main-target-sources $(sources) : $(target-name) ] 
         : [ targets.main-target-requirements $(requirements) : $(project) ]
         : [ targets.main-target-default-build $(default-build) : $(project) ] 

Modified: boost-build/branches/upstream/current/tools/borland.jam
===================================================================
--- boost-build/branches/upstream/current/tools/borland.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/borland.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -36,6 +36,7 @@
     
     flags borland.compile STDHDRS $(condition) : $(root)/include/ ;
     flags borland.link STDLIBPATH $(condition) : $(root)/lib ;
+    flags borland.link RUN_PATH $(condition) : $(root)/bin ;
     flags borland .root $(condition) : $(root)/bin/ ;    
 }
 
@@ -45,14 +46,14 @@
 
 # Declare generators
 
-generators.register-linker borland.link : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : EXE RSP : <toolset>borland ;
-generators.register-linker borland.link.dll : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB RSP : <toolset>borland ;
+generators.register-linker borland.link : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : EXE : <toolset>borland ;
+generators.register-linker borland.link.dll : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB : <toolset>borland ;
 
-generators.register-composing borland.archive : OBJ : STATIC_LIB : <toolset>borland ;
+generators.register-archiver borland.archive : OBJ : STATIC_LIB : <toolset>borland ;
 generators.register-c-compiler borland.compile.c++ : CPP : OBJ : <toolset>borland ;
 generators.register-c-compiler borland.compile.c : C : OBJ : <toolset>borland ;
+generators.register-standard borland.asm : ASM : OBJ : <toolset>borland ;
 
-
 # Declare flags 
 
 flags borland.compile OPTIONS <debug-symbols>on : -v ;
@@ -62,11 +63,22 @@
 flags borland.compile OPTIONS <optimization>speed : -O2 ;
 flags borland.compile OPTIONS <optimization>space : -O1 ;
 
-flags borland CFLAGS <inlining>off : -vi- ;
-flags borland CFLAGS <inlining>on : -vi -w-inl ;
-flags borland CFLAGS <inlining>full : -vi -w-inl ;
+if $(.BORLAND_HAS_FIXED_INLINING_BUGS)
+{
+    flags borland CFLAGS <inlining>off : -vi- ;
+    flags borland CFLAGS <inlining>on : -vi -w-inl ;
+    flags borland CFLAGS <inlining>full : -vi -w-inl ;
+}
+else
+{
+    flags borland CFLAGS : -vi- ;
+}
 
+flags borland.compile OPTIONS <warnings>off : -w- ;
+flags borland.compile OPTIONS <warnings>all : -w ;
+flags borland.compile OPTIONS <warnings-as-errors>on : -w! ;
 
+
 # Deal with various runtime configs...
 
 # This should be not for DLL
@@ -74,7 +86,7 @@
 
 # -tWR sets -tW as well, so we turn it off here and then turn it 
 # on again later if we need it:
-flags borland OPTIONS <link-runtime>shared : -tWR -tWC ;
+flags borland OPTIONS <runtime-link>shared : -tWR -tWC ;
 flags borland OPTIONS <user-interface>gui : -tW ;
 
 flags borland OPTIONS <main-target-type>LIB/<link>shared : -tWD ;
@@ -98,7 +110,6 @@
 # -q     no banner
 # -c     compile to object
 # -P     C++ code regardless of file extention
-# -w     turns on all warnings
 # -Ve    zero sized empty base classes, this option is on in the IDE by default 
 #        and effects binary compatibility.
 # -Vx    zero sized empty members, this option is on in the IDE by default 
@@ -112,13 +123,13 @@
 
 actions compile.c++
 {
-    $(CONFIG_COMMAND) -j5 -g255 -q -c -P -w -Ve -Vx -a8 -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
+    "$(CONFIG_COMMAND)" -j5 -g255 -q -c -P -Ve -Vx -a8 -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
 }
 
 # For C, we don't pass -P flag
 actions compile.c
 {
-    $(CONFIG_COMMAND) -j5 -g255 -q -c -w -Ve -Vx -a8 -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
+    "$(CONFIG_COMMAND)" -j5 -g255 -q -c -Ve -Vx -a8 -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
 }
 
 
@@ -128,7 +139,6 @@
 toolset.flags borland.link FINDLIBS_ST <find-static-library> ;
 toolset.flags borland.link FINDLIBS_SA <find-shared-library> ;
 toolset.flags borland.link LIBRARIES <library-file> ;
-toolset.flags borland.link LIBRARIES <library> ;
 
 flags borland.link OPTIONS <linkflags> ;
 flags borland.link OPTIONS <link>shared : -tWD ;
@@ -149,7 +159,8 @@
 # CONSIDER: don't know what 'together' is for...
 actions updated together piecemeal archive
 { 
-    "$(.root)tlib" $(AROPTIONS) /u /a /C "$(<:W)" +-"$(>:W)"
+    $(.set-path)$(.root:W)$(.old-path)
+    tlib $(AROPTIONS) /u /a /C "$(<:W)" +-"$(>:W)"
 }
 
 
@@ -157,6 +168,7 @@
 {
     .set-path = "cmd /S /C set \"PATH=" ;
     .old-path = ";%PATH%\" \"&&\"" ;
+    
 
     # Couldn't get TLIB to stop being confused about pathnames
     # containing dashes (it seemed to treat them as option separators
@@ -166,9 +178,10 @@
     # options.
     actions updated together piecemeal archive
     { 
-        echo "\"$(.root)tlib\" $(OPTIONS) /u /a /C \"$(<:W)\" +-\"$(>:W)\"" > $(<:D)/tlib.bat
-        chmod +x $(<:D)/tlib.bat && $(<:D)/tlib.bat && rm $(<:D)/tlib.bat ;
-    }
+       chdir $(<:D)
+       echo +-$(>:BS) > $(<:BS).rsp
+       $(.set-path)$(.root)$(.old-path) "tlib.exe" $(AROPTIONS) /P256 /C $(<:BS) @$(<:BS).rsp && $(RM) $(<:BS).rsp
+    }    
 }
 else if [ os.name ] = NT
 {
@@ -184,25 +197,27 @@
       " ;
 }
 
+RM = [ common.rm-command ] ;
 
-rule link ( targets + : sources * : properties * )
-{
-    common.response-file $(targets) : $(sources) : $(targets[2]) 
-      : $(properties) ;
-}   
+nl = "
+" ;
 
-actions link bind LIBRARIES
+actions link
 {
-    $(.set-path)$(.root:W)$(.old-path) $(CONFIG_COMMAND) -v -q $(OPTIONS) -L"$(LIBRARY_PATH:W)" -L"$(STDLIBPATH:W)" -e"$(<[1]:W)" @"$(<[2]:W)"
+    $(.set-path)$(.root:W)$(.old-path) "$(CONFIG_COMMAND)" -v -q $(OPTIONS) -L"$(LIBRARY_PATH:W)" -L"$(STDLIBPATH:W)" -e"$(<[1]:W)" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
 }
 
-rule link.dll ( targets + : sources * : properties * )
+
+actions link.dll bind LIBRARIES RSP
 {
-    common.response-file $(targets) : $(sources) : $(targets[3]) : $(properties) ;    
+    $(.set-path)$(.root:W)$(.old-path) "$(CONFIG_COMMAND)" -v -q $(OPTIONS) -L"$(LIBRARY_PATH:W)" -L"$(STDLIBPATH:W)" -e"$(<[1]:W)" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"  && "$(.root)implib" "$(<[2]:W)" "$(<[1]:W)"
 }
 
-actions link.dll bind LIBRARIES
+# It seems impossible to specify output file with directory when compiling
+# asm files using bcc32, so use tasm32 directly.
+# /ml makes all symbol names case-sensitive
+actions asm
 {
-    $(.set-path)$(.root:W)$(.old-path) $(CONFIG_COMMAND) -v -q $(OPTIONS) -L"$(LIBRARY_PATH:W)" -L"$(STDLIBPATH:W)" -e"$(<[1]:W)" @"$(<[3]:W)"
-    "$(.root)implib" "$(<[2]:W)" "$(<[1]:W)"
+    $(.set-path)$(.root:W)$(.old-path) tasm32.exe /ml "$(>)" "$(<)"
 }
+

Modified: boost-build/branches/upstream/current/tools/builtin.jam
===================================================================
--- boost-build/branches/upstream/current/tools/builtin.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/builtin.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -30,10 +30,10 @@
 
 feature toolset : : implicit propagated symmetric ;
 
-feature stdlib : native : propagated link-incompatible composite ;
+feature stdlib : native : propagated composite ;
 
 feature link : shared static : propagated ;
-feature link-runtime : shared static : propagated ;
+feature runtime-link : shared static : propagated ;
 feature runtime-debugging : on off : propagated ;
 
 
@@ -44,17 +44,25 @@
 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 ;
 
 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
@@ -73,6 +81,17 @@
 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
+  : incidental propagated ;
+
+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 ;
@@ -100,12 +119,77 @@
 #provides means to specify def-file for windows dlls.
 feature def-file : : free dependency ;
 
+# This is internal feature which is used to store the name of 
+# 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 ;
+
+# Type of CPU architecture to compile for.
+feature architecture :
+    # x86 and x86-64
+    x86
+    # ia64
+    ia64
+    # Sparc
+    sparc
+    # RS/6000 & PowerPC
+    power
+    # MIPS/SGI
+    mips1 mips2 mips3 mips4 mips32 mips32r2 mips64
+    #
+    : propagated optional ;
+
+# The specific instruction set in an architecture to compile.
+feature instruction-set :
+    # x86 and x86-64
+    i386 i486 i586 i686
+    pentium pentium-mmx pentiumpro pentium2 pentium3 pentium3m pentium-m pentium4 pentium4m
+    prescott nocona
+    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
+    # 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
+    # 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
+    #
+    : propagated optional ;
+    
+    
+# Used to select specific variant of C++ ABI is the compiler
+# supports several.
+feature c++abi : : propagated optional ;    
+    
+    
+feature conditional : : incidental free ;    
+
+# The value of 'no' prevents building of a target.
+feature build : yes no : optional ;
+
 # Windows-specific features
 
 feature user-interface : console gui wince native auto ;
@@ -191,10 +275,12 @@
         : project 
         : shared ?                                
         : real-name ?
-        : search *                 
+        : search *
+        : action
     )
     {
-        abstract-file-target.__init__ $(name) : SEARCHED_LIB : $(project) ;
+        abstract-file-target.__init__ $(name) : SEARCHED_LIB : $(project) 
+          : $(action) ;
         
         self.shared = $(shared) ;
         self.real-name = $(real-name) ;
@@ -228,53 +314,7 @@
     }
 }    
 
-type.register LIB : : : main ;
-
-# register the given type on the specified OSes, or on remaining OSes
-# if os is not specified.
-local rule declare-type ( os * : type : suffixes * : base-type ? : main ? ) 
-{
-    if ! [ type.registered $(type) ]
-    {
-        if ( ! $(os) ) || [ os.name ] in $(os)
-        {
-            type.register $(type) : $(suffixes) : $(base-type) : $(main) ;
-        }
-    }
-}
-
-#
-# Common target types.
-#
-
-declare-type NT CYGWIN : OBJ : obj : : main ;
-declare-type : OBJ : o : : main ;
-
-declare-type NT CYGWIN : STATIC_LIB : lib a : LIB : main ;
-declare-type : STATIC_LIB : a : LIB : main ;
-
-declare-type : IMPORT_LIB : : STATIC_LIB : main ;
-type.set-generated-target-suffix IMPORT_LIB : : lib ;
-
-declare-type NT CYGWIN : SHARED_LIB : dll : LIB : main ;
-declare-type : SHARED_LIB : so : LIB : main ;
-
-declare-type : SEARCHED_LIB : : LIB : main ;
-
-declare-type NT CYGWIN : EXE : exe : : ;
-declare-type : EXE : : : ;
-
-declare-type : PYTHON_EXTENSION : : SHARED_LIB : main ;
-# We can't give "dll" suffix to PYTHON_EXTENSION, because
-# we would not know what "a.dll" is: python extenstion or
-# ordinary library. Therefore, we specify only suffixes
-# used for generation of targets.
-type.set-generated-target-suffix PYTHON_EXTENSION : : so ;
-type.set-generated-target-suffix PYTHON_EXTENSION : <os>NT : so ;
-type.set-generated-target-suffix PYTHON_EXTENSION : <os>CYGWIN : dll ;
-
-type.register CPP : cpp cxx cc ;
-
+import types/register ;
 import stage ;
 
 
@@ -285,8 +325,12 @@
     rule __init__ ( includes * )
     {
         scanner.__init__ ;
-    
-        self.includes = $(includes) ;
+          
+        for local i in $(includes)
+        {            
+            self.includes += [ path.native $(i:G=) ] ;
+        }
+        
     }    
 
     rule pattern ( )
@@ -338,104 +382,68 @@
 type.register HPP : hpp : H ;
 type.register C : c ;
 
-class lib-target-class : basic-target
+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.
+class lib-generator : generator
 {
-    import generators : construct : generators.construct ;    
-    import type ;
-    import path ;
-    
-    rule __init__ ( name : project 
-        : sources * : requirements * : default-build * : usage-requirements * )
-    {    
-        basic-target.__init__ $(name) : $(project) 
-          : $(sources) : $(requirements) : $(default-build) : $(usage-requirements) ;        
+    rule __init__ ( * : * )
+    {
+        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
     }
-                
-    rule construct ( source-targets * : property-set )
-    {        
-        local properties = [ $(property-set).raw ] ;
-        # Determine the needed target type
-        local actual-type ;
-        if <search> in $(properties:G) || <name> in $(properties:G)
-        {
-            actual-type = SEARCHED_LIB ;
-        }
-        else if <file> in $(properties:G)
-        {
-            # The generator for 
-            actual-type = LIB ;
-        }        
-        else if <link>shared in $(properties)
-        {
-            actual-type = SHARED_LIB ;
-        }
-        else 
-        {
-            actual-type = STATIC_LIB ;
-        }
-        property-set = [ $(property-set).add-raw <main-target-type>LIB ] ;
-        # Construct the target.
-        return [ generators.construct $(self.project) $(self.name) : $(actual-type) 
-                : $(property-set) : $(source-targets) : LIB ] ;        
-    }            
     
-    rule compute-usage-requirements ( subvariant )
+    rule run ( project name ? : property-set : sources * )
     {
-        local rproperties = [ $(subvariant).build-properties ] ;
-        local created-targets = [ $(subvariant).created-targets ] ;  
-        local result = [ basic-target.compute-usage-requirements $(subvariant) ] ;
-        
-        # For lib targets with <search>, add the value of <search> as <library-path>
-        # usage requirement.
-        local search = [ $(rproperties).get <search> ] ;
-        if $(search)
-        {
-            result = [ $(result).add [ 
-              property-set.create $(search:G=<library-path>) ] ] ;            
-        }
-        
-        # Add appropricate <xdll-path> usage requirements.
-        local raw = [ $(rproperties).raw ] ;
-        if <link>shared in $(raw)
-        {
-            local paths ;
-            local pwd = [ path.pwd ] ;
-            for local t in $(created-targets)
+        # The lib generator is composing, and can be only invoked with
+        # explicit name. This check is present in generator.run (and so in
+        # builtin.linking-generator), but duplicate it here to avoid doing
+        # extra work.
+        if $(name)
+        {            
+            local properties = [ $(property-set).raw ] ;
+            # 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.
+            if ! <source> in $(properties:G) &&
+               ( <search> in $(properties:G) || <name> in $(properties:G) )
             {
-                if [ type.is-derived [ $(t).type ] SHARED_LIB ] 
-                {
-                    paths += [ path.root [ path.make [ $(t).path ] ] $(pwd) ] ;
-                }                                
-            }       
-            if $(paths)
+                actual-type = SEARCHED_LIB ;
+            }
+            else if <file> in $(properties:G)
             {
-                result = [ $(result).add 
-                  [ property-set.create $(paths:G=<xdll-path>) ] ] ;
-            }                                    
-        }
-        
-        # Pass <xdll-path> features that we've got from sources.
-        local u = [ $(subvariant).sources-usage-requirements ] ;
-        local values = [ $(u).get <xdll-path> ] ;
-        result = [ $(result).add-raw $(values:G=<xdll-path>) ] ;
-        
-        # For libraries that we've failed to consume, we need to 
-        # pass <library-path> usage requirements, if any.
-        # We look at all generated target, and if they are created in different
-        # subvariant, we add usage requirements.
-        for local t in [ $(subvariant).created-targets ]
-        {
-            local s = [ $(t).creating-subvariant ] ;
-            if $(s) != $(subvariant)
+                # The generator for 
+                actual-type = LIB ;
+            }        
+            else if <link>shared in $(properties)
             {
-                result = [ $(result).add [ $(s).usage-requirements ] ] ;
-            }            
-        }
-                                        
-        return $(result) ;
-    }            
+                actual-type = SHARED_LIB ;
+            }
+            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) : LIB ] ;        
+        }  
+    }    
+    
+    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 * 
     : usage-requirements * )
 {
@@ -443,37 +451,34 @@
     
     # This is a circular module dependency, so it must be imported here
     import targets ;
-
-    local result ;
-    if ! $(sources) && ! $(requirements) 
-      && ! $(default-build) && ! $(usage-requirements)
+    
+    if $(names[2])
     {
-        for local name in $(names)
-        {    
-            result += [ 
-            targets.main-target-alternative
-              [ new lib-target-class $(name) : $(project) 
-                : 
-                : [ targets.main-target-requirements $(requirements) <name>$(name)  :
-                    $(project) ] 
-                : [ targets.main-target-default-build $(default-build) : $(project) ]
-                : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
-             ] ] ;        
+        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. " ;
         }        
-    }
-    else
-    {
-        if $(names[2])
+        if $(sources)
         {
             errors.user-error "When several names are given to the 'lib' rule" :
-              "it's not allows to specify sources or requirements. " ;
-        }
+              "it's not allowed to specify sources. " ;
+        }        
+    }
                 
-        local name = $(names[1]) ;
-        result = [ targets.main-target-alternative
-          [ new lib-target-class $(name) : $(project) 
+    for local name in $(names)
+    {    
+        local r = $(requirements) ;
+        # Support " lib a ; " and " lib a b c ; " syntaxes.
+        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 $(requirements) : $(project) ] 
+            : [ targets.main-target-requirements $(r) : $(project) ] 
             : [ targets.main-target-default-build $(default-build) : $(project) ]
             : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
          ] ] ;
@@ -482,73 +487,10 @@
 }
 IMPORT $(__name__) : lib : : lib ;
 
-
-class exe-target-class : typed-target
+class searched-lib-generator : generator
 {
-    import type ;
+    import property-set ;
     
-    rule __init__ ( name : project
-        : sources * : requirements * : default-build * : usage-requirements * )
-    {    
-        typed-target.__init__ $(name) : $(project) : EXE 
-          : $(sources) : $(requirements) : $(default-build) : $(usage-requirements) ;        
-    }
-                
-    rule compute-usage-requirements ( subvariant )
-    {
-        local result = [ typed-target.compute-usage-requirements $(subvariant) ] ;
-        local p = [ $(subvariant).build-properties ] ;
-        
-        local xdll-paths = [ $(p).get <xdll-path> ] ;
-        if $(xdll-paths)
-        {
-            result = [  $(result).add-raw $(xdll-paths:G=<xdll-path>) ] ;
-        }                            
-        
-        return $(result) ;
-    }
-    
-    rule check-for-unused-sources ( result * : sources * )
-    {
-        # For exes, we typically don't consume ignore DLL on windows.
-        # We also handle searched libraries via special properties
-        # on actions, so should not check for search libraries.
-        # As the result, we don't check for unused LIB sources
-        # at all.
-                
-        local sources-to-check ;
-        for local s in $(sources)
-        {
-            if ! [ type.is-derived [ $(s).type ] LIB ]
-            {
-                sources-to-check += $(s) ;
-            }            
-        }
-        basic-target.check-for-unused-sources $(result) : $(sources-to-check) ;
-    }
-}
-
-rule exe ( name : sources * : requirements * : default-build * 
-    : usage-requirements * )
-{
-    local project = [ project.current ] ;
-        
-    # This is a circular module dependency, so it must be imported here
-    import targets ;
-    targets.main-target-alternative
-      [ new exe-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__) : exe : : exe ;
-
-
-
-class searched-lib-generator : generator
-{
     rule __init__ ( )
     {
         # The requirements cause the generators to be tried *only* when we're building
@@ -558,7 +500,7 @@
         generator.__init__ searched-lib-generator : : SEARCHED_LIB ;
     }
     
-    rule run ( project name ? : property-set : sources * : multiple ? )
+    rule run ( project name ? : property-set : sources * )
     {
         if $(name)
         {
@@ -573,20 +515,22 @@
                 shared = true ;
             }        
             
+            local search = [ feature.get-values <search> : $(properties) ] ;
+
+            a = [ new null-action $(property-set) ] ;
             local t = [ new searched-lib-target $(name) : $(project) : $(shared)
                             : [ feature.get-values <name> : $(properties) ]
-                            : [ feature.get-values <search> : $(properties) ]
+                            : $(search)
+                            : $(a)
                       ] ;
-            # attach an action and properties to the target
-            a = [ new null-action $(t) : $(property-set) ] ;
-            $(t).action $(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.
-            return [ virtual-target.register $(t) ] $(sources) ;
+            return [ property-set.create <xdll-path>$(search) ]
+                   [ virtual-target.register $(t) ] $(sources) ;
         }
-    }
+    }        
 }
 
 generators.register [ new searched-lib-generator ] ;
@@ -598,7 +542,7 @@
         generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
     }
 
-    rule run ( project name ? : property-set : sources * : multiple ? )
+    rule run ( project name ? : property-set : sources * )
     {
         local f = [ $(property-set).get <file> ] ;
         return $(f) $(sources) ;
@@ -608,30 +552,35 @@
 generators.register 
   [ new prebuilt-lib-generator builtin.prebuilt : : LIB : <file> ] ;
 
+generators.override builtin.prebuilt : builtin.lib-generator ;
+
     
-
-
-
 class compile-action : action 
 {
     import sequence ;
     
-    rule __init__ ( targets + : sources * : action-name : properties * )
+    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.
-    rule adjust-properties ( properties * )
+    rule adjust-properties ( property-set )
     {        
         local s = [ $(self.targets[1]).creating-subvariant ] ;
-        return $(properties) [ $(s).implicit-includes "include" : H ] ;
+        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.
 class C-compiling-generator : generator
 {
     rule __init__ ( id : source-types + : target-types + :
@@ -640,7 +589,7 @@
         generator.__init__ $(id) : $(source-types) : $(target-types) :
           $(requirements) : $(optional-properties) ;
     }
-        
+            
     rule action-class ( )
     {
         return compile-action ;
@@ -659,6 +608,7 @@
 # register all generators as "generator.some-rule", not with "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 ;
@@ -679,44 +629,107 @@
           $(requirements) ;
     }
         
-    rule run ( project name ? : property-set : sources + :  multiple ? )
+    rule run ( project name ? : property-set : sources + )
     {   
         sources += [ $(property-set).get <library>  ] ;        
         
+        # Add <library-path> properties for all searched libraries
+        local extra ;
+        for local s in $(sources)
+        {
+            if [ $(s).type ] = SEARCHED_LIB
+            {
+                local search = [ $(s).search ] ;
+                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.
+        local extra-xdll-paths ;
+        for local s in $(sources)
+        {
+            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.
+                local p = [ $(s).project ] ;
+                local location = [ path.root [ $(s).name ]
+                  [ $(p).get source-location ] ] ;
+                extra-xdll-paths += [ path.parent $(location) ] ;
+            }                
+        }
+                        
+        # Hardcode dll paths only when linking executables.
+        # Pros: don't need to relinking libraries when installing.
+        # 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 ] 
         {
             local xdll-path = [ $(property-set).get <xdll-path> ] ;
-            # It's possible that we have libraries in sources which did not came
-            # from 'lib' target. For example, libraries which are specified
-            # just as filenames as sources. We don't have xdll-path properties
-            # for such target, but still need to add proper dll-path properties.
-            for local s in $(sources)
+            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) ] ;
+        
+        local 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 extra ;
+                        
+        # Add appropricate <xdll-path> usage requirements.
+        local raw = [ $(property-set).raw ] ;
+        if <link>shared in $(raw)
+        {
+            local paths ;
+            local pwd = [ path.pwd ] ;
+            for local t in $(created-targets)
             {
-                if [ type.is-derived [ $(s).type ] SHARED_LIB ] && ! [ $(s).action ] 
+                if [ type.is-derived [ $(t).type ] SHARED_LIB ] 
                 {
-                    # 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 ] ] ;
-                    xdll-path += [ path.parent $(location) ] ;
-                }                
-            }
-                          
-            if $(xdll-path)
-            {
-                property-set = [ $(property-set).add-raw $(xdll-path:G=<dll-path>) ] ;
-            }            
-
+                    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.
                         
-        local result = [ generator.run $(project) $(name) : $(property-set)
-          : $(sources) : $(multiple) ] ;
-        
+        # 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.                
+        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
@@ -731,8 +744,7 @@
         local fst ;
         for local s in $(sources)
         {
-            if [ type.is-derived [ $(s).type ] LIB ] &&
-               [ class.is-a $(s) : searched-lib-target ]
+            if [ type.is-derived [ $(s).type ] SEARCHED_LIB ]
             {
                 local name = [ $(s).real-name ] ;
                 if [ $(s).shared ] 
@@ -767,8 +779,72 @@
     generators.register $(g) ;
 }
 
-IMPORT $(__name__) : register-linker : : generators.register-linker ;
+# The generator class for handling STATIC_LIB creation.
+class archive-generator : generator
+{
+    import property-set ; 
 
-declare-type : RSP : rsp ;
+    rule __init__ ( id composing ? : source-types + : target-types + : 
+        requirements * )
+    {
+        composing ?= true ;
+        generator.__init__ $(id) $(composing) : $(source-types) : $(target-types) :
+          $(requirements) ;
+    }
+        
+    rule run ( project name ? : property-set : sources + )
+    {                                
+        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:
+        # - 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.
+        local usage-requirements ;
+        if [ $(property-set).get <link> ] = static
+        {
+            for local t in $(sources)
+            {
+                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 * )
+{
+    local g = [ new archive-generator $(id) $(composing) : $(source-types) 
+                : $(target-types) : $(requirements) ] ;
+    generators.register $(g) ;
+}
 
+
+IMPORT $(__name__) : register-linker register-archiver 
+  : : generators.register-linker generators.register-archiver ;
+
+
+

Added: boost-build/branches/upstream/current/tools/cast.jam
===================================================================
--- boost-build/branches/upstream/current/tools/cast.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/cast.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,89 @@
+# Copyright 2005 Vladimir Prus.
+# Distributed under the Boost Software License, Version 1.0. (See
+# accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+# Defines main target 'cast', used to change type for target. For example,
+# in Qt library one wants two kinds of CPP files -- those that just compiled
+# and those that are passed via the MOC tool.
+#
+# 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.
+#
+# At the moment, the 'cast' rule only works for non-derived (source) targets.
+#
+# Another solution would be to add separate main target 'moc-them' that
+# will moc all the passed sources, not matter what's the type, but I prefer
+# 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 property-set ;
+
+class cast-target-class : typed-target
+{
+    import type ;
+    
+    rule __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 ;
+        for local s in $(source-targets)
+        {
+            if ! [ class.is-a $(s) : file-target ]
+            {
+                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 * 
+    : 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" ;
+    }
+    
+        
+    # 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) ]
+      ] ;
+}
+IMPORT $(__name__) : cast : : cast ;

Modified: boost-build/branches/upstream/current/tools/common.jam
===================================================================
--- boost-build/branches/upstream/current/tools/common.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/common.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -17,7 +17,114 @@
 import sequence ;
 import toolset ;
 
+if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
+{
+    .debug-configuration = true ;
+}
 
+# 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.
+
+class configurations
+{
+    import errors : error ;
+
+    rule __init__ ( )
+    {
+    }
+    
+    # Registers a configuration. 
+    #
+    # 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) 
+        {
+            error "common: the configuration '$(id)' is in use" ;
+        }
+
+        local retval ;
+
+        if ! $(id) in $(self.all)
+        {
+            self.all += $(id) ;
+
+            # indicate that a new configuration has been added
+            retval = true ;
+        }
+
+        return $(retval) ;
+    }
+
+    # Mark a configuration as 'used'. 
+    #
+    # 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" ;
+        }
+
+        local retval ;
+
+        if ! $(id) in $(self.used) 
+        {
+            self.used += $(id) ;
+
+            # indicate that the configuration has been marked as 'used'
+            retval = true ;
+        }
+
+        return $(retval) ;
+    }
+
+    # Return all registered configurations.
+    rule all ( )
+    {
+        return $(self.all) ;
+    }
+
+    # Return all used configurations.
+    rule used ( )
+    {
+        return $(self.used) ;
+    }
+    
+    # Returns the value of a configuration parameter.
+    rule get ( id : param )
+    {
+        return $(self.$(param).$(id)) ; 
+    }
+
+    # Sets the value of a configuration parameter.
+    rule set ( id : param : 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
@@ -107,12 +214,17 @@
     return $(condition) ;
 }
 
-# A helper rule to get the command to invoke some tool. The rule is either passed
-# a user provided command, it which case it checks it for correctness, or it tries
-# to find the tool using it's name, the PATH, and additional path.
+# 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.
+#
+#
 # 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'.
+# If 'path-last' is specified, PATH is checked after 'additional-paths' when
+# searching to 'tool'.
 rule get-invocation-command ( 
     toolset : tool : user-provided-command * : additional-paths * : path-last ? )
 {
@@ -122,8 +234,11 @@
         command = [ common.find-tool $(tool) : $(additional-paths) : $(path-last) ] ;
         if ! $(command)
         {
-            ECHO "warning: toolset $(toolset) initialization: can't find tool $(tool)" ;
-            ECHO "warning: initialized from" [ errors.nearest-user-location ] ;
+            if $(.debug-configuration)
+            {
+                ECHO "warning: toolset $(toolset) initialization: can't find tool $(tool)" ;
+                ECHO "warning: initialized from" [ errors.nearest-user-location ] ;
+            }
         }        
     }
     else
@@ -131,9 +246,12 @@
         command = [ common.check-tool $(user-provided-command) ] ;        
         if ! $(command)
         {
-            ECHO "warning: toolset $(toolset) initialization: " ;
-            ECHO "warning: can't find user-provided command '$(user-provided-command:J= )'" ;
-            ECHO "warning: initialized from" [ errors.nearest-user-location ] ;
+            if $(.debug-configuration)
+            {
+                ECHO "warning: toolset $(toolset) initialization: " ;
+                ECHO "warning: can't find user-provided command " '$(user-provided-command)' ;
+                ECHO "warning: initialized from" [ errors.nearest-user-location ] ;
+            }
             # It's possible, in theory, that user-provided command is OK, but we're
             # not smart enough to understand that. 
             command = $(user-provided-command) ;
@@ -164,12 +282,12 @@
 
 
 
-# Attempts to find tool (binary) named 'name' in PATH and in 'additiona-paths'.
-# If found in path, returns 'name'.
-# If found in additional paths, returns full name. If there are several possibilities,
-# returns them all.
+# 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 checked after 'additional-paths'.
+# If 'path-last' is specified, PATH is searched after 'additional-paths'.
 rule find-tool ( name : additional-paths * : path-last ? )
 {
     local path = [ path.programs-path ] ;
@@ -243,7 +361,7 @@
 # - 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 * )
+rule handle-options ( toolset : condition * : command * : options * )
 {
     # The last parameter ('true') says it's OK to set flags for another
     # module,   
@@ -254,6 +372,8 @@
       [ feature.get-values <cflags> : $(options) ] : unchecked ;
     toolset.flags $(toolset).compile.c++ OPTIONS $(condition) :
       [ feature.get-values <cxxflags> : $(options) ] : unchecked ;
+    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 ;        
 }
@@ -277,8 +397,9 @@
 
 if [ os.name ] = NT
 {
-    RM = del /f ;
+    RM = del /f /q ;
     CP = copy ;
+    IGNORE = "2>nul >nul & setlocal" ;
 }
 else
 {
@@ -289,48 +410,54 @@
 nl = "
 " ;
 
-# Returns the command needed to set shell variable on the
-# current platform.
-rule variable-setting-command ( variable value )
+rule rm-command ( ) 
 {
-    if [ modules.peek : NT ]
+     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.
+rule variable-setting-command ( variable : value )
+{    
+    if [ os.name ] = NT
     {
         return "set $(variable)=$(value)$(nl)" ;
     }
     else
     {
-        return "$(variable)=$(value)" ;
+        return "$(variable)=$(value)$(nl)export $(variable)$(nl)" ;
     }
 }
 
-# Returns the command needed to set shell variable on the
-# current platform. Each element of values is expected to be a path,
-# elements are joined with os-specific characer which delimits paths in
-# environment variables.
-rule path-variable-setting-command ( variable : values * : exported ? )
+# Returns a command that sets the named shell path variable to the
+# given NATIVE paths to on the current platform.
+rule path-variable-setting-command ( variable : paths * )
 {   
-    local result ;
-    if [ modules.peek : NT ]
-    {
-        result = set $(variable)=$(values:J=";")$(nl) ;                
-    }
-    else
-    {
-        # We can't put ":" directly in :J modifier.
-        local sep = ":" ;
-        if $(exported)
-        {                       
-            result = $(variable)=$(values:J=$(sep));export $(variable) ;
-        }
-        else
-        {
-            result = $(variable)=$(values:J=$(sep)) ;    
-        }                
-    }
-    return $(result:J=" ") ;
+    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.
+rule prepend-path-variable-command ( variable : paths * )
+{   
+    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
@@ -349,6 +476,22 @@
 }
 
         
+# 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
+    {
+        return "echo. >> " ;
+    }
+    else
+    {
+        return "touch " ;
+    }
+}
+
+
 rule MkDir
 {
     # If dir exists, don't update it
@@ -414,67 +557,38 @@
     $(CP) "$(>)" "$(<)"
 }
 
-# Cause creation of response file, containing the sources in 'sources'
-# All the targets in 'targets' will depend on response file, and response
-# file will be created before the targets are built.
-rule response-file ( targets + : sources * : the-response-file : properties * )
+rule RmTemps
 {
-    # Manufacture a fake target for response file.
-    # If response file is in targets, we're in trouble.
-    # The actions for response file are already generated, and bjam thinks it's 
-    # created. So setting dependency on response file will not help to create
-    # it before other targets. So, we need another target.
-    
-    local g = [ utility.ungrist $(the-response-file:G) ] ;
-    local rsp = $(the-response-file:G=$(g)-rsp) ;
-    LOCATE on $(rsp) = [ on $(the-response-file) return $(LOCATE) ] ;    
-    DEPENDS $(targets) : $(rsp) ;
-    # Cause RSP to be recreated if sources are out-of-date.
-    DEPENDS $(rsp) : $(sources) ;
-        
-    # Add libraries from <library> property to the list of sources.
-    local libraries ;
-    for local p in $(properties)
-    {
-        if $(p:G) = <library-file> && 
-          ! [ type.is-derived [ $(p:G=).type ] SHARED_LIB ] 
-        {
-            libraries += $(p:G=) ;
-        }          
-    }
-    # Get real jam targets
-    local xlibraries ;
-    for local l in $(libraries)
-    {
-        xlibraries += [ $(l).actualize ] ;
-    }
-    
-    sources += $(xlibraries) ; 
-       
-    response-file-1 $(rsp) : $(sources[1]) ;
-    if $(sources[2-])
-    {
-        response-file-2 $(rsp) : $(sources[2-]) ;
-    }
-    
-    print.output $(rsp) ;
-    print.text [ utility.apply-default-suffix .lib :
-        [ on $(targets[1])
-          return "$(LIBRARY_OPTION)$(FINDLIBS_ST)"
-            "$(LIBRARY_OPTION)$(FINDLIBS_SA)"
-        ] ] ;    
 }
-
-# response-file generation is broken up into two phases, the first of
-# which overwrites any existing file and the second of which appends
-# to the file, piecemeal, so that no command-line is too long.
-actions quietly response-file-1
+actions quietly updated piecemeal together RmTemps
 {
-    echo "$(>)" > "$(<)"
+    $(RM) "$(>)" $(IGNORE)
 }
 
-actions quietly piecemeal response-file-2
-{
-    echo "$(>)" >> "$(<)"
-}
+rule __test__ ( ) {
 
+    import assert ;
+    
+    local save-os = [ modules.peek os : name ] ;
+    
+    modules.poke os : .name : LINUX ;
+    
+    local nl = "
+" ;
+    
+    assert.result "PATH=foo:bar:baz$(nl)export PATH$(nl)"
+      : 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 ;
+    
+    modules.poke os : .name : NT ;
+    
+    assert.result "set PATH=foo;bar;baz$(nl)"
+      : path-variable-setting-command PATH : foo bar baz ;
+    
+    assert.result "set PATH=foo;bar;%PATH%$(nl)"
+      : prepend-path-variable-command PATH : foo bar ;
+
+    modules.poke os : .name : $(save-os) ;      
+}    

Modified: boost-build/branches/upstream/current/tools/como-linux.jam
===================================================================
--- boost-build/branches/upstream/current/tools/como-linux.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/como-linux.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -11,13 +11,17 @@
 import feature ;
 import toolset : flags ;
 import common ;
+import generators ;
 
 import unix ;  
 import como ;
+
 feature.extend-subfeature toolset como : platform : linux ;
 
 toolset.inherit-generators como-linux 
      <toolset>como <toolset-como:platform>linux : unix ;
+generators.override como-linux.prebuilt : builtin.lib-generator ;     
+generators.override como-linux.searched-lib-generator : searched-lib-generator ;
 toolset.inherit-flags como-linux : unix ;
 toolset.inherit-rules como-linux : gcc ;
 

Modified: boost-build/branches/upstream/current/tools/como-win.jam
===================================================================
--- boost-build/branches/upstream/current/tools/como-win.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/como-win.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -42,12 +42,12 @@
 
 generators.register-linker como-win.link 
   : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB 
-  : EXE RSP 
+  : EXE
   : <toolset>como <toolset-como:platform>win ;  
 # Note that status of shared libraries support is not clear, so we don't
 # define the link.dll generator.
-generators.register-composing como-winc.archive 
-  : OBJ : STATIC_LIB RSP
+generators.register-archiver como-win.archive 
+  : OBJ : STATIC_LIB
   : <toolset>como <toolset-como:platform>win ;  
 
 flags como-win C++FLAGS <exception-handling>off : --no_exceptions ;
@@ -83,18 +83,15 @@
 flags como-win FINDLIBS <find-shared-library> ;
 flags como-win FINDLIBS <find-static-library> ;
 
-#### Link ####
+RM = [ common.rm-command ] ;
+nl = "
+" ;
 
-rule link ( targets + : sources * : properties * )
-{
-    common.response-file $(targets) : $(sources) : $(targets[2]) 
-      : $(properties) ;
-}
 
 # for como, we repeat all libraries so that dependencies are always resolved
 actions link bind LIBRARIES
 {
-    $(CONFIG_COMMAND) --no_version --no_prelink_verbose $(LINKFLAGS) -o "$(<[1]:S=)" @"$(<[2])" "$(LIBRARIES)" "$(FINDLIBS:S=.lib)"
+    $(CONFIG_COMMAND) --no_version --no_prelink_verbose $(LINKFLAGS) -o "$(<[1]:S=)" @"@($(<[1]:W).rsp:E=$(nl)"$(>)")" "$(LIBRARIES)" "$(FINDLIBS:S=.lib)"
 }
 
 actions compile.c
@@ -104,7 +101,7 @@
 
 actions compile.c++
 {
-    $(CONFIG_COMMAND) -c -e5 --no_version --no_prelink_verbose --display_error_number --long_long --diag_suppress=9,21,161,748,940,962 -D__STL_LONG_LONG -U$(UNDEFS) -D$(DEFINES) $(WARN) $(CFLAGS) $(C++FLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -I"$(SYSHDRS)" -o "$(<)" "$(>)"
+    $(CONFIG_COMMAND) -c -e5 --no_version --no_prelink_verbose --display_error_number --long_long --diag_suppress=9,21,161,748,940,962 --diag_error=461 -D__STL_LONG_LONG -U$(UNDEFS) -D$(DEFINES) $(WARN) $(CFLAGS) $(C++FLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -I"$(SYSHDRS)" -o "$(<)" "$(>)"
 }
 
 #### Archive ####
@@ -116,7 +113,7 @@
 
 actions updated together piecemeal archive
 {
-    $(CONFIG_COMMAND) --no_version --no_prelink_verbose --prelink_object @"$(>)"
-    lib $(ARFLAGS) /nologo /out:"$(<:S=.lib)" @"$(>)"
+    $(CONFIG_COMMAND) --no_version --no_prelink_verbose --prelink_object "$(LIBRARIES)"
+    lib $(ARFLAGS) /nologo /out:"$(<:S=.lib)" "$(LIBRARIES)"
 }
 

Added: boost-build/branches/upstream/current/tools/cw-config.jam
===================================================================
--- boost-build/branches/upstream/current/tools/cw-config.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/cw-config.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,34 @@
+#~ Copyright 2005 Rene Rivera.
+#~ 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)
+
+# Automatic configuration for CodeWarrior toolset. To use, just import this module.
+
+import os ;
+import toolset : using ;
+
+if [ os.name ] = NT
+{
+    for local R in 9 8 7
+    {
+        local cw-path = [ W32_GETREG
+            "HKEY_LOCAL_MACHINE\\SOFTWARE\\Metrowerks\\CodeWarrior\\Product Versions\\CodeWarrior for Windows R$(R)"
+            : "PATH" ] ;
+        local cw-version = [ W32_GETREG
+            "HKEY_LOCAL_MACHINE\\SOFTWARE\\Metrowerks\\CodeWarrior\\Product Versions\\CodeWarrior for Windows R$(R)"
+            : "VERSION" ] ;
+        cw-path ?= [ W32_GETREG
+            "HKEY_LOCAL_MACHINE\\SOFTWARE\\Metrowerks\\CodeWarrior for Windows\\$(R).0"
+            : "PATH" ] ;
+        cw-version ?= $(R).0 ;
+        
+        if $(cw-path)
+        {
+            if --debug-configuration in [ modules.peek : ARGV ]
+            {
+                ECHO "notice:" using cw ":" $(cw-version) ":" "$(cw-path)\\Other Metrowerks Tools\\Command Line Tools\\mwcc.exe" ;
+            }
+            using cw : $(cw-version) : "$(cw-path)\\Other Metrowerks Tools\\Command Line Tools\\mwcc.exe" ;
+        }
+    }
+}

Modified: boost-build/branches/upstream/current/tools/cw.jam
===================================================================
--- boost-build/branches/upstream/current/tools/cw.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/cw.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -23,6 +23,9 @@
 
 feature.extend toolset : cw ;
 
+nl = "
+" ;
+
 rule init ( version ? : command * : options * )
 {
    # TODO: fix the $(command[1]) = $(compiler) issue
@@ -42,17 +45,25 @@
     
     common.handle-options cw : $(condition) : $(command) : $(options) ;
 
+    local root = [ feature.get-values <root> : $(options) ] ;    
     if $(command)
     {
         command = [ common.get-absolute-tool-path $(command[-1]) ] ;
     }
-    local root = $(command) ;
+    local tool-root = $(command) ;
 
-    setup = $(root)\\$(setup) ;
+    setup = $(tool-root)\\$(setup) ;
 
    # map the batch file in setup so it can be executed
 
-   setup = "call \""$(setup)"\" > nul " ;
+    other-tools = $(tool-root:D) ;
+    root ?= $(other-tools:D) ;
+    
+    flags cw.link RUN_PATH $(condition) : 
+        "$(root)\\Win32-x86 Support\\Libraries\\Runtime"
+        "$(root)\\Win32-x86 Support\\Libraries\\Runtime\\Libs\\MSL_All-DLLs" ;      
+    
+    setup = "set \"CWFOLDER="$(root)"\" && call \""$(setup)"\" > nul " ;
 
    if [ os.name ] = NT
    {
@@ -72,6 +83,22 @@
    flags cw.compile .CC $(condition) : $(prefix)$(compiler) ;
    flags cw.link .LD $(condition) : $(prefix)$(linker) ;
    flags cw.archive .LD $(condition) : $(prefix)$(linker) ;
+
+    if [ MATCH ^([89]\\.) : $(version) ]   
+    {
+        if [ os.name ] = NT
+        {
+        # The runtime libraries
+        flags cw.compile CFLAGS <runtime-link>static/<threading>single/<runtime-debugging>off : -runtime ss ;
+        flags cw.compile CFLAGS <runtime-link>static/<threading>single/<runtime-debugging>on : -runtime ssd ;
+        
+        flags cw.compile CFLAGS <runtime-link>static/<threading>multi/<runtime-debugging>off : -runtime sm ;
+        flags cw.compile CFLAGS <runtime-link>static/<threading>multi/<runtime-debugging>on : -runtime smd ;
+        
+        flags cw.compile CFLAGS <runtime-link>shared/<runtime-debugging>off : -runtime dm ;
+        flags cw.compile CFLAGS <runtime-link>shared/<runtime-debugging>on : -runtime dmd ;
+        }        
+    }    
 }
 
 rule default-paths ( version ? ) # FIXME
@@ -94,6 +121,9 @@
    return $(possible-paths) ;
 }
 
+
+
+
 ## declare generators
 
 generators.register-c-compiler cw.compile.c++ : CPP : OBJ : <toolset>cw ;
@@ -101,18 +131,18 @@
 
 generators.register-linker cw.link
    : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB
-   : EXE RSP
+   : EXE
    : <toolset>cw
    ;
 generators.register-linker cw.link.dll
    : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB
-   : SHARED_LIB IMPORT_LIB RSP
+   : SHARED_LIB IMPORT_LIB
    : <toolset>cw
    ;
 
-generators.register-composing cw.archive
+generators.register-archiver cw.archive
    : OBJ
-   : STATIC_LIB RSP
+   : STATIC_LIB
    : <toolset>cw
    ;
 
@@ -128,8 +158,16 @@
 flags cw.compile CFLAGS <inlining>on : -inline on ;
 flags cw.compile CFLAGS <inlining>full : -inline all ;
 flags cw.compile CFLAGS <exception-handling>off : -Cpp_exceptions off ;
+
+
+flags cw.compile CFLAGS <rtti>on : -RTTI on ;
 flags cw.compile CFLAGS <rtti>off : -RTTI off ;
 
+flags cw.compile CFLAGS <warnings>on : -w on ;
+flags cw.compile CFLAGS <warnings>off : -w off ;
+flags cw.compile CFLAGS <warnings>all : -w all ;
+flags cw.compile CFLAGS <warnings-as-errors>on : -w error ;
+
 flags cw.compile USER_CFLAGS <cflags> : ;
 flags cw.compile.c++ USER_CFLAGS <cxxflags> : ;
 
@@ -139,11 +177,11 @@
 
 actions compile.c
 {
-   $(.CC) -c -cwd include -lang c -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(USER_CFLAGS) -I- -I"$(INCLUDES)" -o "$(<)" "$(>)"
+   $(.CC) -c -cwd include -lang c -U$(UNDEFS) $(CFLAGS) $(USER_CFLAGS) -I- -o "$(<)" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)-D$(DEFINES) $(nl)"-I$(INCLUDES)")"
 }
 actions compile.c++
 {
-   $(.CC) -c -cwd include -lang c++ -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(USER_CFLAGS) -I- -I"$(INCLUDES)" -o "$(<)" "$(>)"
+   $(.CC) -c -cwd include -lang c++ -U$(UNDEFS) $(CFLAGS) $(USER_CFLAGS) -I- -o "$(<)" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)-D$(DEFINES) $(nl)"-I$(INCLUDES)")"
 }
 
 ## linking phase
@@ -160,75 +198,46 @@
 flags cw LINKFLAGS <main-target-type>LIB/<link>static : -library ;
 flags cw LINKFLAGS <main-target-type>LIB/<link>shared : -shared ;
 
-toolset.flags cw.link USER_LINKFLAGS <linkflags> ;
-toolset.flags cw.link LINKPATH <library-path> ;
+flags cw.link USER_LINKFLAGS <linkflags> ;
+flags cw.link LINKPATH <library-path> ;
 
+flags cw.link FINDLIBS_ST <find-static-library> ;
+flags cw.link FINDLIBS_SA <find-shared-library> ;
+flags cw.link LIBRARY_OPTION <toolset>cw : "" : unchecked ;
+flags cw.link LIBRARIES_MENTIONED_BY_FILE : <library-file> ;
+
+rule link.dll ( targets + : sources * : properties * )
+{
+    DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ;
+}
+
 if [ os.name ] in NT
 {
-   rule link ( targets + : sources * : properties * )
-   {
-      common.response-file $(targets) : $(sources) : $(targets[2])
-         : $(properties) ;
-   }
-
-   rule link.dll ( targets + : sources * : properties * )
-   {
-      common.response-file $(targets) : $(sources) : $(targets[3])
-         : $(properties) ;
-      DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ;
-   }
-
-   rule archive ( targets + : sources * : properties * )
-   {
-      common.response-file $(targets) : $(sources) : $(targets[2])
-         : $(properties) ;
-   }
-
    actions archive
    {
       if exist "$(<[1])" DEL "$(<[1])"
-      $(.LD) -library -o "$(<[1])" @"$(<[2])"
+      $(.LD) -library -o "$(<[1])" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
    }
 }
 else # cygwin
 {
-   rule link ( targets + : sources * : properties * )
-   {
-      common.response-file $(targets) : $(sources) : $(targets[2])
-         : $(properties) ;
-   }
-
-   rule link.dll ( targets + : sources + : properties * )
-   {
-      common.response-file $(targets) : $(sources) : $(targets[3])
-         : $(properties) ;
-      .cygpath = "cygpath -d " ;
-      DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ;
-   }
-
-   rule archive ( targets + : sources * : properties * )
-   {
-      common.response-file $(targets) : $(sources) : $(targets[2])
-         : $(properties) ;
-   }
-
    actions archive
    {
       _bbv2_out_="$(<)"
       if test -f "$_bbv2_out_" ; then
          _bbv2_existing_="$(<:W)"
       fi
-      $(.LD) -library -o "$(<:W)" $_bbv2_existing_ @"$(>:W)"
+      $(.LD) -library -o "$(<:W)" $_bbv2_existing_ @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
    }
 }
 
 actions link bind DEF_FILE
 {
-   $(.LD) -o "$(<[1]:W)" -L"$(LINKPATH)" $(LINKFLAGS) $(USER_LINKFLAGS) @"$(<[2]:W)"
+   $(.LD) -o "$(<[1]:W)" -L"$(LINKPATH)" $(LINKFLAGS) $(USER_LINKFLAGS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
 }
 
 actions link.dll bind DEF_FILE
 {
-   $(.LD) -o "$(<[1]:W)" -implib "$(<[2]:W)" -L"$(LINKPATH)" $(LINKFLAGS) -f "$(DEF_FILE)" $(USER_LINKFLAGS) @"$(<[3]:W)"
+   $(.LD) -o "$(<[1]:W)" -implib "$(<[2]:W)" -L"$(LINKPATH)" $(LINKFLAGS) -f"$(DEF_FILE)" $(USER_LINKFLAGS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
 }
 

Modified: boost-build/branches/upstream/current/tools/darwin.jam
===================================================================
--- boost-build/branches/upstream/current/tools/darwin.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/darwin.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -11,12 +11,21 @@
 import toolset : flags ;
 import type ;
 import common ;
+import generators ;
 
 toolset.register darwin ;
 import gcc ;
 toolset.inherit-generators darwin : gcc ;
+
+generators.override darwin.prebuilt : builtin.prebuilt ;
+generators.override darwin.searched-lib-generator : searched-lib-generator ;
+
 toolset.inherit-rules darwin : gcc ;
-toolset.inherit-flags darwin : gcc ;
+toolset.inherit-flags darwin : gcc     
+  :  # On Darwin, static runtime is just not supported. So don't inherit
+     # any flags settings for <runtime-link>static
+     <runtime-link>static
+  ;
 
 # No additional initialization should be necessary
 rule init ( version ? : command * : options * )
@@ -26,19 +35,22 @@
     
     common.handle-options darwin : $(condition) : $(command) : $(options) ;
     
+    # GCC 4.0 and higher in Darwin does not have -fcoalesce-templates.
+    local gccversion = [ SHELL "$(command) -dumpversion" ] ;
+    if $(gccversion) < "4.0.0"
+    {
+        flags darwin.compile.c++ OPTIONS : -fcoalesce-templates ;
+    }
+
     gcc.init-link-flags darwin darwin $(condition) ;
+    
+    flags darwin.link NEED_STRIP $(condition)/<debug-symbols>off : "" ;        
 }
 
-# Darwin has a different shared library suffix
-type.set-generated-target-suffix SHARED_LIB : <toolset>darwin : dylib ;
-# we need to be able to tell the type of .dylib files
-type.register-suffixes dylib : SHARED_LIB ;
-
 feature framework : : free ;
 
 flags darwin.compile OPTIONS <link>shared : -dynamic ;
 flags darwin.compile OPTIONS : -Wno-long-double -no-cpp-precomp  ;
-flags darwin.compile.c++ OPTIONS : -fcoalesce-templates ;
 
 flags darwin.link FRAMEWORK <framework> ;
 
@@ -46,16 +58,14 @@
 # uncomment to see what libtool is doing under the hood
 # flags darwin.link.dll OPTIONS : -Wl,-v ;
 
+_ = " " ;
+
 actions link bind LIBRARIES
 {
-    $(CONFIG_COMMAND) $(ST_OPTIONS) -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) -framework$(_)$(FRAMEWORK) $(OPTIONS)   
+    $(CONFIG_COMMAND) -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) -framework$(_)$(FRAMEWORK) $(OPTIONS)
+    $(NEED_STRIP)strip $(NEED_STRIP)"$(<)"
 }
 
-rule link.dll
-{
-    _ on $(<) = " " ;
-}
-
 actions link.dll bind LIBRARIES
 {
     $(CONFIG_COMMAND) -dynamiclib -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) -framework$(_)$(FRAMEWORK) $(OPTIONS) 

Added: boost-build/branches/upstream/current/tools/dmc.jam
===================================================================
--- boost-build/branches/upstream/current/tools/dmc.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/dmc.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,134 @@
+# Digital Mars C++
+
+# (C) Copyright Christof Meerwald 2003.
+# (C) Copyright Aleksey Gurtovoy 2004.
+# (C) Copyright Arjan Knepper 2006.
+#
+# Distributed under the Boost Software License, Version 1.0. (See
+# accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+# The following #// line will be used by the regression test table generation
+# program as the column heading for HTML tables. Must not include version number.
+#//<a href="http://www.digitalmars.com/">Digital<br>Mars C++</a>
+
+import feature generators common ;
+import toolset : flags ;
+import sequence regex ;
+
+feature.extend toolset : dmc ;
+
+rule init ( version ? : command * : options * )
+{
+    local condition = [ common.check-init-parameters dmc : version $(version) ] ;
+    
+    local command = [ common.get-invocation-command dmc : dmc : $(command) ] ;
+    command ?= dmc ;
+
+    common.handle-options dmc : $(condition) : $(command) : $(options) ;   
+    
+    if $(command)
+    {
+        command = [ common.get-absolute-tool-path $(command[-1]) ] ;
+    }   
+    root = $(command:D) ;    
+    
+    if $(root)
+    {        
+        # DMC linker is sensitive the the direction of slashes, and
+        # won't link if forward slashes are used in command.
+        root = [ sequence.join [ regex.split $(root) "/" ] : "\\" ] ;
+        flags dmc .root $(condition) : $(root)\\bin\\ ;
+    }
+    else
+    {
+        flags dmc .root $(condition) : "" ;
+    }    
+}
+
+
+# Declare generators
+generators.register-linker dmc.link : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : EXE : <toolset>dmc ;
+generators.register-linker dmc.link.dll : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB : <toolset>dmc ;
+
+generators.register-archiver dmc.archive : OBJ : STATIC_LIB : <toolset>dmc ;
+generators.register-c-compiler dmc.compile.c++ : CPP : OBJ : <toolset>dmc ;
+generators.register-c-compiler dmc.compile.c : C : OBJ : <toolset>dmc ;
+
+
+# Declare flags
+# dmc optlink has some limitation on the amount of debug-info included. Therefore only linenumbers are enabled in debug builds.
+# flags dmc.compile OPTIONS <debug-symbols>on : -g ;
+flags dmc.compile OPTIONS <debug-symbols>on : -gl ;
+flags dmc.link OPTIONS <debug-symbols>on : /CO /NOPACKF /DEBUGLI ;
+flags dmc.link OPTIONS <debug-symbols>off : /PACKF ;
+
+flags dmc.compile OPTIONS <optimization>off : -S -o+none ;
+flags dmc.compile OPTIONS <optimization>speed : -o+time ;
+flags dmc.compile OPTIONS <optimization>space : -o+space ;
+flags dmc.compile OPTIONS <exception-handling>on : -Ae ;
+flags dmc.compile OPTIONS <rtti>on : -Ar ;
+# FIXME:
+# Compiling sources to be linked into a shared lib (dll) the -WD cflag should be used
+# Compiling sources to be linked into a static lib (lib) or executable the -WA cflag should be used
+# But for some reason the -WD cflag is always in use.
+# flags dmc.compile OPTIONS <link>shared : -WD ;
+# flags dmc.compile OPTIONS <link>static : -WA ;
+
+# Note that these two options actually imply multithreading support on DMC
+# because there is no single-threaded dynamic runtime library. Specifying
+# <threading>multi would be a bad idea, though, because no option would be
+# matched when the build uses the default settings of <runtime-link>dynamic
+# and <threading>single.
+flags dmc.compile OPTIONS <runtime-debugging>off/<runtime-link>shared : -ND ;
+flags dmc.compile OPTIONS <runtime-debugging>on/<runtime-link>shared : -ND ;
+
+flags dmc.compile OPTIONS <runtime-debugging>off/<runtime-link>static/<threading>single : ;
+flags dmc.compile OPTIONS <runtime-debugging>on/<runtime-link>static/<threading>single : ;
+flags dmc.compile OPTIONS <runtime-debugging>off/<runtime-link>static/<threading>multi : -D_MT ;
+flags dmc.compile OPTIONS <runtime-debugging>on/<runtime-link>static/<threading>multi : -D_MT ;
+
+flags dmc.compile OPTIONS : <cflags> ;
+flags dmc.compile.c++ OPTIONS : <cxxflags> ;
+
+flags dmc.compile DEFINES : <define> ;
+flags dmc.compile INCLUDES : <include> ;
+
+flags dmc.link <linkflags> ;
+flags dmc.archive OPTIONS <arflags> ;
+
+flags dmc LIBPATH <library-path> ;
+flags dmc LIBRARIES <library-file> ;
+flags dmc FINDLIBS <find-library-sa> ;
+flags dmc FINDLIBS <find-library-st> ;
+
+actions together link bind LIBRARIES
+{
+    "$(.root)link" $(OPTIONS) /NOI /DE /XN "$(>)" , "$(<[1])" ,, $(LIBRARIES) user32.lib kernel32.lib "$(FINDLIBS:S=.lib)" , "$(<[2]:B).def"
+}
+
+actions together link.dll bind LIBRARIES
+{
+    echo LIBRARY "$(<[1])" > $(<[2]:B).def
+    echo DESCRIPTION 'A Library' >> $(<[2]:B).def
+    echo EXETYPE NT >> $(<[2]:B).def
+    echo SUBSYSTEM WINDOWS >> $(<[2]:B).def
+    echo CODE	EXECUTE READ >> $(<[2]:B).def
+    echo DATA	READ WRITE >> $(<[2]:B).def
+    "$(.root)link" $(OPTIONS) /NOI /DE /XN /ENTRY:_DllMainCRTStartup /IMPLIB:"$(<[2])" "$(>)" $(LIBRARIES) , "$(<[1])" ,, user32.lib kernel32.lib "$(FINDLIBS:S=.lib)" , "$(<[2]:B).def"
+}
+
+actions compile.c
+{
+    "$(.root)dmc"  -c $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -o"$(<)" "$(>)"
+}
+
+actions compile.c++
+{
+    "$(.root)dmc" -cpp -c -Ab $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -o"$(<)" "$(>)"
+}
+
+actions together piecemeal archive
+{
+    "$(.root)lib" $(OPTIONS) -c -n -p256 "$(<)" "$(>)"
+}

Added: boost-build/branches/upstream/current/tools/docutils.jam
===================================================================
--- boost-build/branches/upstream/current/tools/docutils.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/docutils.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,67 @@
+# Copyright David Abrahams 2004. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+# Support for docutils ReStructuredText processing.
+
+import type ;
+import scanner ;
+import generators ;
+import os ;
+import common ;
+import toolset ;
+import path ;
+import feature : feature ;
+
+.initialized = ;
+
+type.register ReST : rst ;
+
+class rst-scanner : common-scanner
+{
+    rule pattern ( )
+    {
+         return "^\\w*\\.\\.\\w+include::\w+(.*)"
+        "^\\w*\\.\\.\\w+image::\w+(.*)"
+        "^\\w*\\.\\.\\w+figure::\w+(.*)"
+        ;
+    }
+}
+
+scanner.register rst-scanner : include ;
+type.set-scanner ReST : rst-scanner ;
+
+generators.register-standard docutils.html : ReST : HTML ;
+
+rule init ( docutils-dir )
+{
+    docutils-dir ?= [ modules.peek : DOCUTILS_DIR ] ;
+
+    if ! $(.initialized)
+    {
+        .initialized = true ;
+        .docutils-dir = $(docutils-dir) ;
+        
+        .setup = [ 
+          common.prepend-path-variable-command PYTHONPATH 
+            : $(.docutils-dir) $(.docutils-dir)/extras ] ;
+    }
+}
+
+rule html ( target : source : properties *  )
+{
+    docutils-dir on $(target) = $(.docutils-dir) ;
+}
+
+
+feature docutils : : free ;
+feature docutils-html : : free ;
+toolset.flags docutils COMMON-FLAGS : <docutils> ;
+toolset.flags docutils HTML-FLAGS : <docutils-html> ;
+  
+actions html
+{
+    $(.setup)
+    python $(docutils-dir)/tools/rst2html.py $(COMMON-FLAGS) $(HTML-FLAGS) $(>) $(<)
+}
+


Property changes on: boost-build/branches/upstream/current/tools/docutils.jam
___________________________________________________________________
Name: svn:executable
   + *

Added: boost-build/branches/upstream/current/tools/doxygen-config.jam
===================================================================
--- boost-build/branches/upstream/current/tools/doxygen-config.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/doxygen-config.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,47 @@
+#~ Copyright 2005 Rene Rivera.
+#~ 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)
+
+# Automatic configuration for Python tools and librries. To use, just import this module.
+
+import os ;
+import toolset : using ;
+
+if [ os.name ] = NT
+{
+    local ProgramFiles = [ modules.peek : ProgramFiles ] ;
+    if $(ProgramFiles)
+    {
+        ProgramFiles = "$(ProgramFiles:J= )" ;
+    }
+    else
+    {
+        ProgramFiles = "C:\\Program Files" ;
+    }
+    
+    local doxygen-path = [ GLOB [ modules.peek : PATH ] "$(ProgramFiles)\\doxygen\\bin" : doxygen\.exe ] ;
+    doxygen-path = $(doxygen-path[1]) ;
+    
+    if $(doxygen-path)
+    {
+        if --debug-configuration in [ modules.peek : ARGV ]
+        {
+            ECHO "notice:" using doxygen ":" $(doxygen-path) ;
+        }
+        using doxygen : $(doxygen-path) ;
+    }
+}
+else
+{
+    local doxygen-path = [ GLOB [ modules.peek : PATH ] : doxygen ] ;
+    doxygen-path = $(doxygen-path[1]) ;
+    
+    if $(xsltproc-path)
+    {
+        if --debug-configuration in [ modules.peek : ARGV ]
+        {
+            ECHO "notice:" using doxygen ":" $(doxygen-path) ;
+        }
+        using doxygen : $(doxygen-path) ;
+    }
+}

Modified: boost-build/branches/upstream/current/tools/doxygen.jam
===================================================================
--- boost-build/branches/upstream/current/tools/doxygen.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/doxygen.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -20,13 +20,15 @@
 import stage ;
 import project ;
 
+import xsltproc ;
+
 feature.feature doxygen:param : : free ;
 feature.feature prefix : : free ;
 feature.feature reftitle : : free ;
 
 type.register DOXYFILE : doxyfile ; # Doxygen input file
 type.register DOXYGEN_XML_MULTIFILE : : XML ; # Doxygen XML multi-file output
-type.register DOXYGEN_XML : doxygen : XML : main ; # Doxygen XML output
+type.register DOXYGEN_XML : doxygen : XML ; # Doxygen XML output
 
 # Initialize the Doxygen module. Parameters are:
 #   name: the name of the 'doxygen' executable. If not specified, the name
@@ -45,16 +47,7 @@
     generators.register-composing doxygen.headers-to-doxyfile : H HPP : DOXYFILE ; 
     generators.register-standard doxygen.run : DOXYFILE : DOXYGEN_XML_MULTIFILE ;
     generators.register-standard doxygen.xml-to-boostbook : DOXYGEN_XML : BOOSTBOOK ;
-    
-    if ! [ boostbook.xsl-dir ]
-    {
-        ECHO "warning: Doxygen initialization: Boost.Build stylesheets not found " ;
-        ECHO "warning: Generation of single XML file won't be possible. " ;
-    }
-    else
-    {          
-        generators.register-standard doxygen.collect : DOXYGEN_XML_MULTIFILE : DOXYGEN_XML ;
-    }
+    generators.register-standard doxygen.collect : DOXYGEN_XML_MULTIFILE : DOXYGEN_XML ;
             
     IMPORT $(__name__) : doxygen : : doxygen ;
   }
@@ -114,6 +107,22 @@
   NAME on $(target) = $(.doxygen) ;
 }
 
+# The rules below require Boost.Book stylesheets, so we need
+# some code to check that the boostbook module is actaully
+# initialized.
+rule check-boostbook ( )
+{
+    if ! [ modules.peek boostbook : .initialized ]
+    {
+        ECHO "error: the boostbook module is not initialized" ;
+        ECHO "error: you've attempted to use the 'doxygen' toolset, " ;
+        ECHO "error: which requires Boost.Book," ;
+        ECHO "error: but never initialized Boost.Book." ;
+        EXIT "error: Hint: add 'using boostbook ;' to your user-config.jam" ;
+    }      
+}
+
+
 # Collect the set of Doxygen XML files into a single XML source file
 # that can be handled by an XSLT processor. The source is completely
 # ignored (see doxygen-action), because this action picks up the
@@ -123,13 +132,14 @@
 # Doxygen XML file.
 rule collect ( target : source : properties * )
 {
+  check-boostbook ;
   local collect-xsl-dir = [ path.native 
-	                    [ path.join [ boostbook.xsl-dir ] doxygen collect ] 
+                        [ path.join [ boostbook.xsl-dir ] doxygen collect ] 
                           ] ;
   local collect-path = [ path.join [ path.pwd ] xml ] ;
   local real-source = [ path.native xml/index.xml ] ;
   NOTFILE $(real-source) ;
-  xslt $(target) : $(real-source) $(collect-xsl-dir:S=.xsl) 
+  xsltproc.xslt $(target) : $(real-source) $(collect-xsl-dir:S=.xsl) 
                  : <xsl:param>doxygen.xml.path=$(collect-path)
                  ;
 }
@@ -137,10 +147,11 @@
 # Translate Doxygen XML into BoostBook
 rule xml-to-boostbook ( target : source : properties * )
 {
+  check-boostbook ;
   local xsl-dir = [ boostbook.xsl-dir ] ;
   local d2b-xsl = [ path.native 
-	              [ path.join [ boostbook.xsl-dir ] doxygen 
-	                doxygen2boostbook.xsl ] ] ;
+                  [ path.join [ boostbook.xsl-dir ] doxygen 
+                    doxygen2boostbook.xsl ] ] ;
 
   local xslt-properties = $(properties) ;
   for local prefix in [ feature.get-values <prefix> : $(properties) ]
@@ -152,7 +163,7 @@
     xslt-properties += "<xsl:param>boost.doxygen.reftitle=\"$(title)\"" ;
   }
 
-  xslt $(target) : $(source) $(d2b-xsl) : $(xslt-properties) ;
+  xsltproc.xslt $(target) : $(source) $(d2b-xsl) : $(xslt-properties) ;
 }
 
 # User-level rule to generate BoostBook XML from a set of headers via Doxygen. 
@@ -170,7 +181,7 @@
   targets.main-target-alternative $(doxyfile) ;
 
   targets.main-target-alternative
-    [ new stage-target-class $(target-name:S=.xml) : $(project) 
+    [ new install-target-class $(target-name:S=.xml) : $(project) 
       : [ $(doxyfile).name ]
       : [ targets.main-target-requirements $(requirements) <location>. : $(project) ] 
       : [ targets.main-target-default-build $(default-build) : $(project) ] 

Modified: boost-build/branches/upstream/current/tools/fop.jam
===================================================================
--- boost-build/branches/upstream/current/tools/fop.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/fop.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,40 +1,102 @@
-#  Copyright (C) 2003 Doug Gregor. Permission to copy, use, modify,
-#  sell and distribute this software is granted provided this
-#  copyright notice appears in all copies. This software is provided
-#  "as is" without express or implied warranty, and with no claim as
-#  to its suitability for any purpose.
+#  Copyright (C) 2003-2004 Doug Gregor and Dave Abrahams. Distributed
+# under the Boost Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+#  This module defines rules to handle generation of PDF and
+#  PostScript files from XSL Formatting Objects via Apache FOP
 
-#  This module defines rules to handle generation of PDF and PostScript files
-#  from XSL Formatting Objects via Apache FOP
-
+import os ;
 import generators ;
+import common ;
+import errors ; 
 
-generators.register-standard fop.fo-to-print : FO : PDF ;
-generators.register-standard fop.fo-to-print : FO : PS ;
+generators.register-standard fop.render.pdf : FO : PDF ;
+generators.register-standard fop.render.ps : FO : PS ;
 
-rule init ( fop-dir ? : java-home ? )
+rule init ( fop-command ? : java-home ? : java ? )
 {
-  if ! $(fop-dir)
-  {
-    fop-dir = [ modules.peek : FOP_DIR ] ;
-  }
+    fop-command = [ common.get-invocation-command fop : fop : $(fop-command) 
+      : [ modules.peek : FOP_DIR ] ] ;
+        
+    if $(.initialized)
+    {
+        if $(.FOP_COMMAND) != $(fop-command) || $(JAVA_HOME) != $(java-home)
+           || $(JAVACMD) != $(java)
+        {
+            errors.user-error "fop: reinitialization with different options" ;
+        }        
+    }
+    else
+    {
+        .initialized = true ;
+        .FOP_COMMAND = $(fop-command) ;
+        # What is the meaning of this logic?  Needs more comments!!  --DWA
+        java-home ?= $(java) ;
+        .FOP_SETUP = [ common.variable-setting-command JAVA_HOME : $(java-home) ] ;
+    }
+    
+    # Make sure the fop command is executed from within the directory where it's located.
 
-  if ! $(.initialized)
-  {
-    .initialized = true ;
-    .fop-dir = $(fop-dir) ;
-    .java-home = $(java-home) ;
-  }
+    # DPG: I can't see how this could ever be correct, because it
+    # messes up path names that are used in the command.
+
+    # if $(.FOP_COMMAND:D)
+    # {
+    #     .FOP_SETUP = $(.FOP_SETUP)"
+# cd "$(.FOP_COMMAND:D) ;
+    # }
+      
 }
 
-rule fo-to-print ( target : source : properties * )
+local rule find-by-absolute-path ( target )
 {
-  JAVA_HOME on $(target) = $(.java-home) ;
-  FOP_DIR on $(target) = $(.fop-dir) ;
-  fop $(target) : $(source) ;
+    # Mask off any vars by these names that may be hanging around in
+    # outer dynamic scopes.
+    local LOCATE SEARCH ; 
+    
+    # simulate the target binding process to find the target
+    
+    local found =  [ on $(target) GLOB $(LOCATE) (SEARCH) : $(target:G=) ] ;
+    
+    if $(found)
+    {
+        # Re-LOCATE the target with an absolute path if it isn't
+        # already absolute.
+        local found-dir = $(found[1]:D) ;
+        local cwd = [ PWD ] ;
+        local absolute-dir = $(found-dir:R=$(cwd)) ;
+        
+        # Translate cygwin paths to Windows iff the user is running on
+        # cygwin but using a Windows FOP.  We detect a Windows FOP by
+        # looking to see if FOP_COMMAND ends with ".bat"
+        if [ os.name ] = CYGWIN && [ MATCH .*\\.([Bb][Aa][Tt])$ : $(.FOP_COMMAND) ]
+        {
+            absolute-dir = "`cygpath --windows '$(absolute-dir)'`" ;
+        }
+        LOCATE on $(target) = $(absolute-dir) ;
+    }
 }
 
-actions fop
+rule render.pdf ( source : target : properties * )
 {
-  JAVA_HOME=$(JAVA_HOME) $(FOP_DIR)/fop.sh $(>) $(<)
-}
\ No newline at end of file
+    find-by-absolute-path $(source) ;
+    find-by-absolute-path $(target) ;
+}
+
+rule render.ps ( source : target : properties * )
+{
+    find-by-absolute-path $(source) ;
+    find-by-absolute-path $(target) ;
+}
+
+
+actions render.pdf
+{
+  $(.FOP_SETUP) $(.FOP_COMMAND) $(>) $(<)
+}
+
+actions render.ps
+{
+  $(.FOP_SETUP) $(.FOP_COMMAND) $(>) -ps $(<)
+}

Added: boost-build/branches/upstream/current/tools/fortran.jam
===================================================================
--- boost-build/branches/upstream/current/tools/fortran.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/fortran.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,36 @@
+# Copyright (C) 2004 Toon Knapen
+#
+#  Use, modification and distribution is subject to 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 contains common settings for all fortran tools
+#
+
+import "class" : new ;
+
+import type ;
+import generators ;
+import common ;
+
+type.register FORTRAN : f ;
+
+class fortran-compiling-generator : generator
+{
+    rule __init__ ( id : source-types + : target-types + : requirements * : optional-properties * )
+    {
+        generator.__init__ $(id) : $(source-types) : $(target-types) : $(requirements) : $(optional-properties) ;
+    }
+}
+
+rule register-fortran-compiler ( id : source-types + : target-types + : requirements * : optional-properties * )
+{
+    local g = [ new fortran-compiling-generator $(id) : $(source-types) : $(target-types) : $(requirements) : $(optional-properties) ] ;
+    generators.register $(g) ;
+}
+
+# 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".)
+IMPORT $(__name__) : register-fortran-compiler : : generators.register-fortran-compiler ;
+

Modified: boost-build/branches/upstream/current/tools/gcc.jam
===================================================================
--- boost-build/branches/upstream/current/tools/gcc.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/gcc.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -17,6 +17,12 @@
 import common ;
 import errors ;
 
+if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
+{
+    .debug-configuration = true ;
+}
+
+
 feature.extend toolset : gcc ;
 
 import unix ;
@@ -24,6 +30,8 @@
 toolset.inherit-flags gcc : unix ;
 toolset.inherit-rules gcc : unix ;
 
+generators.override gcc.prebuilt : builtin.prebuilt ;
+generators.override gcc.searched-lib-generator : searched-lib-generator ;
 
 
 # Make the "o" suffix used for gcc toolset on all
@@ -31,6 +39,7 @@
 type.set-generated-target-suffix OBJ : <toolset>gcc : o ;
 type.set-generated-target-suffix STATIC_LIB : <toolset>gcc : a ;
 
+import rc ;
 
 # Initializes the gcc toolset for the given version.
 # If necessary, command may be used to specify where the compiler
@@ -51,9 +60,77 @@
     
     local linker = [ feature.get-values <linker-type> : $(options) ] ;
     if ! $(linker) {
-        linker = gnu ;
+        
+        if [ os.name ] = OSF
+        {
+            linker = osf ;
+        }
+        else
+        {                            
+            linker = gnu ;
+        }        
     }
     init-link-flags gcc $(linker) $(condition) ;
+    
+    local root = [ feature.get-values <root> : $(options) ] ;
+    local bin ;
+    if $(command)
+    {
+        bin ?= [ common.get-absolute-tool-path $(command[-1]) ] ;
+        root ?= $(bin:D) ;
+    }
+    
+    # If gcc is installed in non-standard location, we'd need to
+    # add LD_LIBRARY_PATH when running programs created with it
+    # (for unit-test/run rules).       
+    if $(command)
+    {
+        # On multilib 64-bit boxes, there are both 32-bit and 64-bit
+        # libraries and all must be added to LD_LIBRARY_PATH. The linker
+        # will pick the right onces.
+        # Note that we don't provide a clean way to build 32-bit binary
+        # with 64-bit compiler, but user can always pass -m32 manually.
+        local lib_path = $(root)/bin $(root)/lib $(root)/lib32 $(root)/lib64 ;
+        if $(.debug-configuration)
+        {
+            ECHO notice: using gcc libraries :: $(condition) :: $(lib_path) ;
+        }
+        flags gcc.link RUN_PATH $(condition) : $(lib_path) ;
+    }   
+
+    #~ If it's not a system gcc install we should adjust the various
+    #~ programs as needed to prefer using the install specific versions.
+    #~ This is essential for correct use of MinGW and for cross-compiling.
+    
+    #~ - The archive builder.
+    local archiver =
+        [ common.get-invocation-command gcc
+            : ar : [ feature.get-values <archiver> : $(options) ] : $(bin) : search-path ] ;
+    flags gcc.archive .AR $(condition) : $(archiver[1]) ;
+    if $(.debug-configuration)
+    {
+        ECHO notice: using gcc archiver :: $(condition) :: $(archiver[1]) ;
+    }
+    
+    #~ - The resource compiler.
+    local rc =
+        [ common.get-invocation-command gcc
+            : windres : [ feature.get-values <rc> : $(options) ] : $(bin) : search-path ] ;
+    local rc-type =
+        [ feature.get-values <rc-type> : $(options) ] ;
+    rc-type ?= windres ;
+    if ! $(rc)
+    {
+        #~ If we can't find an RC compiler we fallback to a null RC compiler
+        #~ that creates empty object files. This allows the same Jamfiles
+        #~ to work across the board. The null RC uses the assembler to create
+        #~ the empty objects, so configure that.
+        rc =
+            [ common.get-invocation-command gcc
+                : as : : $(bin) : search-path ] ;
+        rc-type = null ;
+    }
+    rc.configure $(rc) : $(condition) : <rc-type>$(rc-type) ;
 }
 
 if [ os.name ] = NT
@@ -65,6 +142,7 @@
 
 generators.register-c-compiler gcc.compile.c++ : CPP : OBJ : <toolset>gcc ;
 generators.register-c-compiler gcc.compile.c : C : OBJ : <toolset>gcc ;
+generators.register-c-compiler gcc.compile.asm : ASM : OBJ : <toolset>gcc ;
 
 
 # Declare flags and action for compilation
@@ -76,6 +154,11 @@
 flags gcc.compile OPTIONS <inlining>on : -Wno-inline ;
 flags gcc.compile OPTIONS <inlining>full : -finline-functions -Wno-inline ;
 
+flags gcc.compile OPTIONS <warnings>off : -w ;
+flags gcc.compile OPTIONS <warnings>on : -Wall ;
+flags gcc.compile OPTIONS <warnings>all : -Wall -pedantic ;
+flags gcc.compile OPTIONS <warnings-as-errors>on : -Werror ;
+
 flags gcc.compile OPTIONS <debug-symbols>on : -g ;
 flags gcc.compile OPTIONS <profiling>on : -pg ;
 # On cygwin and mingw, gcc generates position independent code by default,
@@ -87,17 +170,38 @@
 # inside 'init'.
 if [ os.name ] != CYGWIN && [ os.name ] != NT
 {        
-    flags gcc.compile OPTIONS <link>shared/<main-target-type>LIB : -fPIC ;
+    # This logic will add -fPIC for all compilations:
+    #
+    # lib a : a.cpp b ;
+    # obj b : b.cpp ;
+    # exe c : c.cpp a d ;
+    # obj d : d.cpp ;
+    # 
+    # This all is fine, except that 'd' will be compiled with
+    # -fPIC even though it's not needed, as 'd' is used only in
+    # exe. However, it's hard to detect where a target is going to
+    # be used. Alternative, we can set -fPIC only when main target type 
+    # is LIB but than 'b' will be compiled without -fPIC. In x86-64 that
+    # will lead to link errors. So, compile everything with -fPIC.
+    #
+    # Yet another alternative would be to create propagated <sharedable> 
+    # feature, and set it when building shared libraries, but that's hard
+    # to implement and will increase target path length even more.
+    flags gcc.compile OPTIONS <link>shared : -fPIC ;
 }    
-if [ os.name ] != NT
+if [ os.name ] != NT && [ os.name ] != OSF
 {
-    HAVE_SONAME = "" ;
+    # OSF does have an option called -soname but it doesn't seem to work as
+    # expected, therefore it has been disabled.
+
+    HAVE_SONAME   = "" ;
+    SONAME_OPTION = -h ;
 }
 
 
 
-flags gcc.compile OPTIONS <cflags> ;
-flags gcc.compile.c++ OPTIONS <cxxflags> ;
+flags gcc.compile USER_OPTIONS <cflags> ;
+flags gcc.compile.c++ USER_OPTIONS <cxxflags> ;
 flags gcc.compile DEFINES <define> ;
 flags gcc.compile INCLUDES <include> ;
 
@@ -115,7 +219,7 @@
 
 actions compile.c++
 {
-    "$(CONFIG_COMMAND)" $(LANG) -Wall -ftemplate-depth-100 $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" 
+    "$(CONFIG_COMMAND)" $(LANG) -ftemplate-depth-128 $(OPTIONS) $(USER_OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" 
 }
 
 rule compile.c
@@ -132,22 +236,32 @@
 
 actions compile.c
 {
-    "$(CONFIG_COMMAND)" $(LANG) -Wall $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" 
+    "$(CONFIG_COMMAND)" $(LANG) $(OPTIONS) $(USER_OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" 
 }
 
+rule compile.asm
+{
+    LANG on $(<) = "-x assembler-with-cpp" ;
+}
+
+actions compile.asm
+{
+    "$(CONFIG_COMMAND)" $(LANG) $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" 
+}
+
 # The class which check that we don't try to use
-# the <link-runtime>static property while creating or using shared library,
+# the <runtime-link>static property while creating or using shared library,
 # since it's not supported by gcc/libc.
 class gcc-linking-generator : unix-linking-generator
 {
     rule generated-targets ( sources + : property-set : project name ? )
     {
-        if <link-runtime>static in [ $(property-set).raw ] 
+        if <runtime-link>static in [ $(property-set).raw ] 
         {
             local m ;
             if [ id ] = "gcc.link.dll"
             {
-                m = "on gcc, DLL can't be build with <link-runtime>static" ;
+                m = "on gcc, DLL can't be build with <runtime-link>static" ;
             }         
             if ! $(m) {                
                 for local s in $(sources)
@@ -155,14 +269,14 @@
                     local type = [ $(s).type ] ;
                     if $(type) &&  [ type.is-derived $(type) SHARED_LIB ] 
                     {
-                        m = "on gcc, using DLLS together with the <link-runtime>static options is not possible " ;
+                        m = "on gcc, using DLLS together with the <runtime-link>static options is not possible " ;
                     }                
                 }                
             }
             if $(m)
             {
                 errors.user-error $(m) :
-                  "it's suggested to use <link-runtime>static together with the <link>static" ;
+                  "it's suggested to use <runtime-link>static together with the <link>static" ;
             }
             
         }
@@ -178,23 +292,20 @@
 generators.register [ new gcc-linking-generator gcc.link.dll : LIB OBJ : SHARED_LIB 
     : <toolset>gcc ] ;
 
-generators.override gcc.prebuilt : builtin.prebuilt ;
 
-
-
 # Declare flags for linking
 # First, the common flags
 flags gcc.link OPTIONS <debug-symbols>on : -g ;
 flags gcc.link OPTIONS <profiling>on : -pg ;
-flags gcc.link OPTIONS <linkflags> ;
+flags gcc.link USER_OPTIONS <linkflags> ;
 flags gcc.link LINKPATH <library-path> ;
 flags gcc.link FINDLIBS-ST <find-static-library> ;
 flags gcc.link FINDLIBS-SA <find-shared-library> ;
 flags gcc.link LIBRARIES <library-file> ;
 
-# For <link-runtime>static we made sure there are no dynamic libraries 
+# For <runtime-link>static we made sure there are no dynamic libraries 
 # in the link
-flags gcc.link OPTIONS <link-runtime>static : -static ;
+flags gcc.link OPTIONS <runtime-link>static : -static ;
 
 # Now, the vendor specific flags
 # The parameter linker can be either gnu or sun
@@ -212,18 +323,32 @@
           : unchecked ;
         flags $(toolset).link RPATH $(condition) : <dll-path> : unchecked ;
         flags $(toolset).link RPATH_LINK $(condition) : <xdll-path> : unchecked ;
+        flags $(toolset).link START-GROUP $(condition) : -Wl,--start-group : unchecked ;
+        flags $(toolset).link END-GROUP $(condition) : -Wl,--end-group : unchecked ;
         }
     case darwin :
         {
-        # we can't pass -s to ld unless we also pass -static
-        # so we removed -s completly from OPTIONS and add it
-        # to ST_OPTIONS            
-        flags $(toolset).link ST_OPTIONS $(condition)/<debug-symbols>off : -s 
-           : unchecked ;  
+        # On Darwin, the -s option to ld does not work unless we pass
+        # -static, and passing -static unconditionally is a bad idea.
+        # So, don't pass -s at all, darwin.jam will use separate 'strip'
+        # invocation.
         flags $(toolset).link RPATH $(condition) : <dll-path> : unchecked ;
         flags $(toolset).link RPATH_LINK $(condition) : <xdll-path> : unchecked ;
         }
+        
+    case osf :
+        {
+            # No --strip-all, just -s
+            flags $(toolset).link OPTIONS $(condition)/<debug-symbols>off : -Wl,-s 
+              : unchecked ;
 
+            flags $(toolset).link RPATH $(condition) : <dll-path> : unchecked ;
+            # This does not supports -R
+            flags $(toolset).link RPATH_OPTION $(condition) : -rpath : unchecked ;
+            # -rpath-link is not supported at all.
+        }
+        
+
     case sun :
         {
         flags $(toolset).link OPTIONS $(condition)/<debug-symbols>off : -Wl,-s 
@@ -256,35 +381,80 @@
 rule link ( targets * : sources * : properties * )
 {
     SPACE on $(targets) = " " ;    
+    # Serialize execution of the 'link' action, since
+    # running N links in parallel is just slower.
+    # For now, serialize only gcc links, it might be a good
+    # idea to serialize all links.
+    JAM_SEMAPHORE on $(targets) = <s>gcc-link-semaphore ;
 }
 
 actions link bind LIBRARIES
 {
-    "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,-R$(SPACE)-Wl,"$(RPATH)" -Wl,-rpath-link$(SPACE)-Wl,"$(RPATH_LINK)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) $(OPTIONS) 
+    "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,"$(RPATH)" -Wl,-rpath-link$(SPACE)-Wl,"$(RPATH_LINK)" -o "$(<)" $(START-GROUP) "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS)
 }
 
+# Default value. Mostly for the sake of intel-linux
+# that inherits from gcc, but does not has the same
+# logic to set the .AR variable. We can put the same
+# logic in intel-linux, but that's hardly worth the trouble
+# as on Linux, 'ar' is always available.
+.AR = ar ; 
+
+flags gcc.archive AROPTIONS <archiveflags> ;
+
+rule archive ( targets * : sources * : properties * )
+{
+    # Always remove archive and start again. Here's rationale from
+    #
+    # Andre Hentz:
+    #
+    # I had a file, say a1.c, that was included into liba.a. 
+    # I moved a1.c to a2.c, updated my Jamfiles and rebuilt. 
+    # My program was crashing with absurd errors. 
+    # After some debugging I traced it back to the fact that a1.o was *still* 
+    # in liba.a 
+    #
+    # Rene Rivera:
+    #
+    # Originally removing the archive was done by splicing an RM
+    # onto the archive action. That makes archives fail to build on NT
+    # when they have many files because it will no longer execute the
+    # action directly and blow the line length limit. Instead we
+    # remove the file in a different action, just before the building
+    # of the archive.
+    #
+    local clean.a = $(targets[1])(clean) ;
+    TEMPORARY $(clean.a) ;
+    NOCARE $(clean.a) ;
+    LOCATE on $(clean.a) = [ on $(targets[1]) return $(LOCATE) ] ;
+    DEPENDS $(clean.a) : $(sources) ;
+    DEPENDS $(targets) : $(clean.a) ;
+    common.RmTemps $(clean.a) : $(targets) ;
+}
+
 # Declare action for creating static libraries
-# The 'r' letter means to replace files in the archive
-# The 'u' letter means only outdated files in the archive
-#   should be replaced.
+# The 'r' letter means to add files to the archive with replacement
+# Since we remove archive, we don't care about replacement, but
+# there's no option "add without replacement".
 # The 'c' letter means suppresses warning in case the archive
 #   does not exists yet. That warning is produced only on
 #   some platforms, for whatever reasons.
 actions piecemeal archive 
 {
-    ar ruc "$(<)" "$(>)"
+    "$(.AR)" $(AROPTIONS) rc "$(<)" "$(>)"
 }
 
 
 rule link.dll ( targets * : sources * : properties * )
 {
     SPACE on $(targets) = " " ;    
+    JAM_SEMAPHORE on $(targets) = <s>gcc-link-semaphore ;
 }
 
 # Differ from 'link' above only by -shared.
 actions link.dll bind LIBRARIES
 {
-    "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,-R$(SPACE)-Wl,"$(RPATH)" -o "$(<)" $(HAVE_SONAME)-Wl,-h$(SPACE)-Wl,$(<[1]:D=) -shared "$(>)"  "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) $(OPTIONS)  
+    "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,"$(RPATH)" -o "$(<)" $(HAVE_SONAME)-Wl,$(SONAME_OPTION)$(SPACE)-Wl,$(<[1]:D=) -shared $(START-GROUP) "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS)
 }
 
 # Set up threading support. It's somewhat contrived, so perform it at the end,
@@ -326,6 +496,10 @@
         {
         # gcc on HP-UX does not support multi-threading, don't set anything here
         }
+    case Darwin :
+        {
+        # Darwin has no threading options, don't set anything here.
+        }
     case * :
         {
         flags gcc OPTIONS <threading>multi : -pthread ;

Modified: boost-build/branches/upstream/current/tools/gettext.jam
===================================================================
--- boost-build/branches/upstream/current/tools/gettext.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/gettext.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -89,7 +89,7 @@
     local project = [ project.current ] ;
     
     targets.main-target-alternative
-      [ new update-translations-class $(name) : $(project) : 
+      [ new typed-target $(name) : $(project) : gettext.UPDATE :
         $(existing-translation) $(sources)
         : [ targets.main-target-requirements $(requirements) : $(project) ]        
       ] ;
@@ -100,10 +100,12 @@
 # The human editable source, containing translation.
 type.register gettext.PO : po ; 
 # The machine readable message catalog.
-type.register gettext.catalog : mo : : main ;
+type.register gettext.catalog : mo ;
 # Intermediate type produce by extracting translations from
 # sources.
 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
@@ -114,62 +116,73 @@
 
 generators.register-standard gettext.compile : gettext.PO : gettext.catalog ;
 
-class update-translations-class : basic-target
+class update-translations-generator : generator
 {
     import regex : split ;
+    import property-set ;
    
-    rule __init__ ( name : project : sources * : requirements )
+    rule __init__ ( * : * )
     {
-        basic-target.__init__ $(name) : $(project) : $(sources) : $(requirements) 
-          : $(default-build) ;
+        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
     }
-            
-    rule construct ( source-targets * : property-set )
+
+    # The rule should be called with at least two sources. The first source
+    # is the translation (.po) file to update. The remaining sources are targets
+    # which should be scanned for new messages. All sources files for those targets
+    # will be found and passed to the 'xgettext' utility, which extracts the
+    # messages for localization. Those messages will be merged to the .po file.
+    rule run ( project name ? : property-set : sources * : multiple ? )
     {
         local types = [ $(property-set).get <gettext.types> ] ;
         types ?= "C CPP" ;
         types = [ regex.split $(types) " " ] ;
-        property-set = [ property-set.empty ] ;
+        
+        local keywords = [ $(property-set).get <gettext.keyword> ] ;
+        property-set = [ property-set.create $(keywords:G=<gettext.keyword>) ] ;
 
-        if ! $(.constructed)
-        {            
-            # First deterime the list of sources that must be scanned to 
-            # messages.
-            local all-sources ;
-            for local s in $(source-targets[2-])
+        # 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':
+        # i.e. following dependency properties as well.
+        for local s in $(sources[2-])
+        {
+            all-sources += [ virtual-target.traverse $(s) : : include-sources ] ;
+        }
+        local right-sources ;
+        for local s in $(all-sources)
+        {
+            if [ $(s).type ] in $(types)
             {
-                all-sources += [ virtual-target.traverse $(s) : : include-sources ] ;
-            }
-            local right-sources ;
-            for local s in $(all-sources)
-            {
-                if [ $(s).type ] in $(types)
-                {
-                    right-sources += $(s) ;
-                }                
-            }
+                right-sources += $(s) ;
+            }                
+        }
             
-            if $(right-sources)
-            {                                                                                        
-                local new-messages = [ new file-target $(self.name) : gettext.POT : $(self.project) ] ;
-                local extract = 
-                  [ new action $(new-messages) : $(right-sources) : gettext.extract ] ;
-                $(new-messages).action $(extract) ;
+        local .constructed ;
+        if $(right-sources)
+        {                                              
+            # Create the POT file, which will contain list of messages extracted
+            # from the sources.
+            local extract = 
+              [ new action $(right-sources) : gettext.extract : $(property-set) ] ;
+            local new-messages = [ new file-target $(name) : gettext.POT 
+              : $(project) : $(extract) ] ;
                 
-                local r = [ new notfile-target $(self.name) : $(self.project) ] ;
-                local a = [ new action $(r) : $(source-targets[1]) $(new-messages) 
-                  : gettext.update-po-dispatch ] ;
-                $(r).action $(a) ;
-                .constructed = [ virtual-target.register $(r) ] ;
-            }
-            else
-            {
-                errors.error "No source could be scanned by gettext tools" ;
-            }            
+            # Create a notfile target which will update the existing translation file
+            # 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) ] ;
         }
+        else
+        {
+            errors.error "No source could be scanned by gettext tools" ;
+        }            
         return $(.constructed) ;                
     }        
 }
+generators.register [ new update-translations-generator gettext.update : : gettext.UPDATE ] ;
 
 flags gettext.extract KEYWORD <gettext.keyword> ;
 actions extract

Added: boost-build/branches/upstream/current/tools/gfortran.jam
===================================================================
--- boost-build/branches/upstream/current/tools/gfortran.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/gfortran.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,39 @@
+# Copyright (C) 2004 Toon Knapen
+#
+#  Use, modification and distribution is subject to the Boost Software
+#  License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+import toolset : flags ;
+import feature ;
+import fortran ;
+
+rule init ( version ? : command * : options * )
+{
+}
+
+# Declare flags and action for compilation
+flags gfortran OPTIONS <fflags> ;
+
+flags gfortran OPTIONS <optimization>off : -O0 ;
+flags gfortran OPTIONS <optimization>speed : -O3 ;
+flags gfortran OPTIONS <optimization>space : -Os ;
+
+flags gfortran OPTIONS <debug-symbols>on : -g ;
+flags gfortran OPTIONS <profiling>on : -pg ;
+
+flags gfortran OPTIONS <link>shared/<main-target-type>LIB : -fPIC ;
+
+flags gfortran DEFINES <define> ;
+flags gfortran INCLUDES <include> ;
+
+rule compile.fortran
+{
+}
+
+actions compile.fortran
+{
+  gcc -Wall $(OPTIONS) -D$(DEFINES) -I$(INCLUDES) -c -o "$(<)" "$(>)" 
+}
+
+generators.register-fortran-compiler gfortran.compile.fortran : FORTRAN : OBJ ; 

Added: boost-build/branches/upstream/current/tools/hp_cxx.jam
===================================================================
--- boost-build/branches/upstream/current/tools/hp_cxx.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/hp_cxx.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,168 @@
+# Copyright 2001 David Abrahams.
+# Copyright 2004, 2005 Markus Schoepflin.
+# 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)
+
+#
+# HP CXX compiler
+# See http://h30097.www3.hp.com/cplus/?jumpid=reg_R1002_USEN
+#
+#
+# Notes on this toolset:
+#
+# - Because of very subtle issues with the default ansi mode, strict_ansi mode
+#   is used for compilation. One example of things that don't work correctly in
+#   the default ansi mode is overload resolution of function templates when
+#   mixed with non-template functions.
+#
+# - For template instantiation "-timplicit_local" is used. Previously,
+#   "-tlocal" has been tried to avoid the need for a template repository
+#   but this doesn't work with manually instantiated templates. "-tweak"
+#   has not been used to avoid the stream of warning messages issued by
+#   ar or ld when creating a library or linking an application.
+#
+# - Debug symbols are generated with "-g3", as this works both in debug and
+#   release mode. When compiling C++ code without optimization, we additionally
+#   use "-gall", which generates full symbol table information for all classes,
+#   structs, and unions. As this turns off optimization, it can't be used when
+#   optimization is needed.
+#
+
+import feature generators common ;
+import toolset : flags ;
+
+feature.extend toolset : hp_cxx ;
+feature.extend c++abi : cxxarm ;
+
+# Inherit from Unix toolset to get library ordering magic.
+toolset.inherit  hp_cxx : unix ;
+
+generators.override hp_cxx.prebuilt : builtin.lib-generator ;
+generators.override hp_cxx.prebuilt : builtin.prebuilt ;
+generators.override hp_cxx.searched-lib-generator : searched-lib-generator ;
+
+
+rule init ( version ? : command * : options * )
+{
+    local condition = [ common.check-init-parameters hp_cxx : version $(version) ] ;
+    
+    local command = [ common.get-invocation-command hp_cxx : cxx : $(command) ] ;
+    
+    if $(command)
+    {
+        local root = [ common.get-absolute-tool-path $(command[-1]) ] ;
+
+        if $(root)
+        {
+            flags hp_cxx .root $(condition) : "\"$(root)\"/" ;
+        }        
+    }      
+    # If we can't find 'cxx' anyway, at least show 'cxx' in the commands
+    command ?= cxx ;
+        
+    common.handle-options hp_cxx : $(condition) : $(command) : $(options) ;               
+}
+
+generators.register-c-compiler hp_cxx.compile.c++ : CPP : OBJ : <toolset>hp_cxx ;
+generators.register-c-compiler hp_cxx.compile.c : C : OBJ : <toolset>hp_cxx ;
+
+
+
+# No static linking as far as I can tell.
+# flags cxx LINKFLAGS <runtime-link>static : -bstatic ;
+flags hp_cxx.compile OPTIONS <debug-symbols>on : -g3 ;
+flags hp_cxx.compile OPTIONS <optimization>off/<debug-symbols>on : -gall ;
+flags hp_cxx.link OPTIONS <debug-symbols>on : -g ;
+flags hp_cxx.link OPTIONS <debug-symbols>off : -s ;
+
+flags hp_cxx.compile OPTIONS <optimization>off : -O0 ;
+flags hp_cxx.compile OPTIONS <optimization>speed/<inlining>on : -O2 ;
+flags hp_cxx.compile OPTIONS <optimization>speed : -O2 ;
+
+# This (undocumented) macro needs to be defined to get all C function
+# overloads required by the C++ standard.
+flags hp_cxx.compile.c++ OPTIONS : -D__CNAME_OVERLOADS ;
+
+# Added for threading support
+flags hp_cxx.compile OPTIONS <threading>multi : -pthread ;
+flags hp_cxx.link OPTIONS <threading>multi : -pthread ;
+
+flags hp_cxx.compile OPTIONS <optimization>space/<inlining>on : <inlining>size ;
+flags hp_cxx.compile OPTIONS <optimization>space : -O1 ;
+flags hp_cxx.compile OPTIONS <inlining>off : -inline none ;
+
+# The compiler versions tried (up to V6.5-040) hang when compiling Boost code
+# with full inlining enabled. So leave it at the default level for now.
+#
+# flags hp_cxx.compile OPTIONS <inlining>full : -inline all ;
+
+flags hp_cxx.compile OPTIONS <profiling>on : -pg ;
+flags hp_cxx.link OPTIONS <profiling>on : -pg ;
+
+# Selection of the object model. This flag is needed on both the C++ compiler
+# and linker command line.
+
+# Unspecified ABI translates to '-model ansi' as most
+# standard-conforming.
+flags hp_cxx.compile.c++ OPTIONS <c++abi> : -model ansi : : hack-hack ;
+flags hp_cxx.compile.c++ OPTIONS <c++abi>cxxarm : -model arm ;
+flags hp_cxx.link OPTIONS <c++abi> : -model ansi : : hack-hack ;
+flags hp_cxx.link OPTIONS <c++abi>cxxarm : -model arm ;
+
+# Display a descriptive tag together with each compiler message. This tag can
+# be used by the user to explicitely suppress the compiler message.
+flags hp_cxx.compile OPTIONS : -msg_display_tag ;
+
+flags hp_cxx.compile OPTIONS <cflags> ;
+flags hp_cxx.compile.c++ OPTIONS <cxxflags> ;
+flags hp_cxx.compile DEFINES <define> ;
+flags hp_cxx.compile INCLUDES <include> ;
+flags hp_cxx.link OPTIONS <linkflags> ;
+
+flags hp_cxx.link LIBPATH <library-path> ;
+flags hp_cxx.link LIBRARIES <library-file> ;
+flags hp_cxx.link FINDLIBS-ST <find-static-library> ;
+flags hp_cxx.link FINDLIBS-SA <find-shared-library> ;
+
+actions link bind LIBRARIES
+{
+    $(CONFIG_COMMAND) -noimplicit_include $(OPTIONS) -o "$(<)" -L$(LIBPATH) "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) -lrt -lm
+}
+
+# When creating dynamic libraries, we don't want to be warned about unresolved
+# symbols, therefore all unresolved symbols are marked as expected by
+# '-expect_unresolved *'. This also mirrors the behaviour of the GNU tool
+# chain.
+
+actions link.dll bind LIBRARIES
+{
+    $(CONFIG_COMMAND) -shared -expect_unresolved \* -noimplicit_include $(OPTIONS) -o "$(<[1])" -L$(LIBPATH)  "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) -lm
+}
+
+
+# Note: Relaxed ANSI mode (-std) is used for compilation because in strict ANSI
+# C89 mode (-std1) the compiler doesn't accept C++ comments in C files. As -std
+# is the default, no special flag is needed.
+actions compile.c
+{
+    $(.root:E=)cc -c $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -o "$(<)" "$(>)"
+}
+
+# Note: The compiler is forced to compile the files as C++ (-x cxx) because
+# otherwise it will silently ignore files with no file extension.
+#
+# Note: We deliberately don't suppress any warnings on the compiler command
+# line, the user can always do this in a customized toolset later on.
+
+actions compile.c++
+{
+    $(CONFIG_COMMAND) -x cxx -c -std strict_ansi -nopure_cname -noimplicit_include -timplicit_local -ptr "$(<[1]:D)/cxx_repository" $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -o "$(<)" "$(>)"
+}
+
+# Always create archive from scratch. See the gcc toolet for rationale.
+RM = [ common.rm-command ] ;
+actions together piecemeal archive
+{
+  $(RM) "$(<)"
+  ar rc $(<) $(>)
+}

Added: boost-build/branches/upstream/current/tools/hpfortran.jam
===================================================================
--- boost-build/branches/upstream/current/tools/hpfortran.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/hpfortran.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,35 @@
+# Copyright (C) 2004 Toon Knapen
+#
+#  Use, modification and distribution is subject to the Boost Software
+#  License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+import toolset : flags ;
+import feature ;
+import fortran ;
+
+rule init ( version ? : command * : options * )
+{
+}
+
+# Declare flags and action for compilation
+flags hpfortran OPTIONS <optimization>off : -O0 ;
+flags hpfortran OPTIONS <optimization>speed : -O3 ;
+flags hpfortran OPTIONS <optimization>space : -O1 ;
+
+flags hpfortran OPTIONS <debug-symbols>on : -g ;
+flags hpfortran OPTIONS <profiling>on : -pg ;
+
+flags hpfortran DEFINES <define> ;
+flags hpfortran INCLUDES <include> ;
+
+rule compile.fortran
+{
+}
+
+actions compile.fortran
+{
+  f77 +DD64 $(OPTIONS) -D$(DEFINES) -I$(INCLUDES) -c -o "$(<)" "$(>)" 
+}
+
+generators.register-fortran-compiler hpfortran.compile.fortran : FORTRAN : OBJ ; 

Added: boost-build/branches/upstream/current/tools/ifort.jam
===================================================================
--- boost-build/branches/upstream/current/tools/ifort.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/ifort.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,44 @@
+# Copyright (C) 2004 Toon Knapen
+#
+#  Use, modification and distribution is subject to the Boost Software
+#  License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+import toolset : flags ;
+import feature ;
+import fortran ;
+
+rule init ( version ? : command * : options * )
+{
+}
+
+# Declare flags and action for compilation
+flags ifort OPTIONS <fflags> ;
+
+flags ifort OPTIONS <optimization>off : /Od ;
+flags ifort OPTIONS <optimization>speed : /O3 ;
+flags ifort OPTIONS <optimization>space : /O1 ;
+
+flags ifort OPTIONS <debug-symbols>on : /debug:full ;
+flags ifort OPTIONS <profiling>on : /Qprof_gen ;
+
+flags ifort.compile FFLAGS <runtime-debugging>off/<runtime-link>shared : /MD ;
+flags ifort.compile FFLAGS <runtime-debugging>on/<runtime-link>shared : /MDd ;
+flags ifort.compile FFLAGS <runtime-debugging>off/<runtime-link>static/<threading>single : /ML ;
+flags ifort.compile FFLAGS <runtime-debugging>on/<runtime-link>static/<threading>single : /MLd ;
+flags ifort.compile FFLAGS <runtime-debugging>off/<runtime-link>static/<threading>multi : /MT ;
+flags ifort.compile FFLAGS <runtime-debugging>on/<runtime-link>static/<threading>multi : /MTd ;
+
+flags ifort DEFINES <define> ;
+flags ifort INCLUDES <include> ;
+
+rule compile.fortran
+{
+}
+
+actions compile.fortran
+{
+  ifort $(FFLAGS) $(OPTIONS) /names:lowercase /D$(DEFINES) /I"$(INCLUDES)" /c /object:"$(<)" "$(>)" 
+}
+
+generators.register-fortran-compiler ifort.compile.fortran : FORTRAN : OBJ ; 

Modified: boost-build/branches/upstream/current/tools/intel-linux.jam
===================================================================
--- boost-build/branches/upstream/current/tools/intel-linux.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/intel-linux.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -12,15 +12,27 @@
 import gcc ;
 import common ;
 import errors ;
+import generators ;
 
 feature.extend-subfeature toolset intel : platform : linux ;
 
 toolset.inherit-generators intel-linux 
      <toolset>intel <toolset-intel:platform>linux : gcc ;
+generators.override intel-linux.prebuilt : builtin.lib-generator ;
+generators.override intel-linux.prebuilt : builtin.prebuilt ;
+generators.override intel-linux.searched-lib-generator : searched-lib-generator ;
+
 toolset.inherit-rules intel-linux : gcc ;
 toolset.inherit-flags intel-linux : gcc 
-        : <inlining>off <inlining>on <inlining>full <optimization>space ;
-
+        : <inlining>off <inlining>on <inlining>full <optimization>space 
+          <warnings>off <warnings>all <warnings>on
+        ;
+        
+if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
+{
+    .debug-configuration = true ;
+}
+                       
 # Initializes the intel-linux toolset
 #   version in mandatory
 #   name (default icc) is used to invoke the specified intellinux complier
@@ -30,19 +42,43 @@
     local condition = [ common.check-init-parameters intel-linux
         : version $(version) ] ;
     
-    command = [ common.get-invocation-command intel-linux : icc 
+    command = [ common.get-invocation-command intel-linux : icpc 
         : $(command) : /opt/intel_cc_80/bin ] ;
                 
     common.handle-options intel-linux : $(condition) : $(command) : $(options) ;
 
     gcc.init-link-flags intel-linux gnu $(condition) ;
-
+    
+    local root = [ feature.get-values <root> : $(options) ] ;
+    local bin ;
+    if $(command) || $(root)
+    {
+        bin ?= [ common.get-absolute-tool-path $(command[-1]) ] ;
+        root ?= $(bin:D) ;
+    
+        if $(root)
+        {
+            local lib_path = $(root)/lib ;
+            if $(.debug-configuration)
+            {
+                ECHO notice: using intel libraries :: $(condition) :: $(lib_path) ;
+            }
+            flags intel-linux.link RUN_PATH $(condition) : $(lib_path) ;
+        }   
+    }
 }
 
+SPACE = " " ;
+
 flags intel-linux.compile OPTIONS <inlining>off : "-Ob0" ;
 flags intel-linux.compile OPTIONS <inlining>on : "-Ob1" ;
 flags intel-linux.compile OPTIONS <inlining>full : "-Ob2" ;
 flags intel-linux.compile OPTIONS <optimization>space : "-O1" ; # no specific space optimization flag in icc
+
+flags intel-linux.compile OPTIONS <warnings>off : -w0 ;
+flags intel-linux.compile OPTIONS <warnings>on : -w1 ;
+flags intel-linux.compile OPTIONS <warnings>all : -w2 ;
+
 actions compile.c++
 {
     "$(CONFIG_COMMAND)" -c -xc++ $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)"

Modified: boost-build/branches/upstream/current/tools/intel-win.jam
===================================================================
--- boost-build/branches/upstream/current/tools/intel-win.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/intel-win.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -38,11 +38,16 @@
         $(command) ] ;    
     
     common.handle-options intel-win : $(condition) : $(command) : $(options) ;
-
-    local root = [ common.get-absolute-tool-path $(command[-1]) ] ;)
+   
+    local root ;
+    if $(command)
+    {
+        root = [ common.get-absolute-tool-path $(command[-1]) ] ;
+        root = $(root)/ ;
+    }
     
     local setup ;
-    setup = $(root:D)/iclvars.bat ;
+    setup = $(root)/iclvars.bat ;
     setup = "call \""$(setup)"\" > nul " ;
         
     if [ os.name ] = NT
@@ -112,11 +117,15 @@
     {
         C++FLAGS += 
           -Qoption,cpp,--arg_dep_lookup
-          -Qoption,cpp,--const_string_literals
-          -Qoption,cpp,--new_for_init
-          -Qoption,cpp,--no_implicit_typename
-          -Qoption,cpp,--no_friend_injection
-          -Qoption,cpp,--no_microsoft_bugs
+          # The following options were intended to disable
+          # 'bug-emulation' mode of intel compiler, but later
+          # were reported to case ICE with Intel-Win 9.0
+          # It's not yet clear which options can be safely used.
+          # -Qoption,cpp,--const_string_literals
+          # -Qoption,cpp,--new_for_init
+          # -Qoption,cpp,--no_implicit_typename
+          # -Qoption,cpp,--no_friend_injection
+          # -Qoption,cpp,--no_microsoft_bugs
           ;
     }
     

Modified: boost-build/branches/upstream/current/tools/make.jam
===================================================================
--- boost-build/branches/upstream/current/tools/make.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/make.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -19,48 +19,46 @@
     import type regex virtual-target ;    
     import "class" : new ;
     
-    rule __init__ ( name : project : sources * : requirements * 
-        : make-rule + : default-build * )
+    rule __init__ ( name : project : sources * : requirements * : default-build * )
     {     
-        basic-target.__init__ $(name) : $(project) : $(sources) : $(requirements) 
-          : $(default-build) ;
-       
-        self.make-rule = $(make-rule) ;    
+        basic-target.__init__ $(name) : $(project) : $(sources) 
+          : $(requirements) : $(default-build) ;
     }
         
-    rule construct ( source-targets * : property-set )
+    rule construct ( name : source-targets * : property-set )
     {
-        local t = [ new file-target $(self.name:S=) : [ type.type $(self.name) ]
-                    : $(self.project) ] ;
-        $(t).suffix [ regex.match .(.*) : $(self.name:S) ] ;
-        local a = [ new action $(t) : $(source-targets) : $(self.make-rule) 
-                    : $(property-set) ] ;
-        $(t).action $(a) ;
-        return [ virtual-target.register $(t) ] ;
+        local action-name = [ $(property-set).get <action> ] ;        
+        # 'm' will always be set -- we add '@' outselfs in 'make'
+        # rule below.
+        local m = [ MATCH ^@(.*) : $(action-name) ] ;
+                        
+        local a = [ new action $(source-targets) : $(m[1])
+                    : $(property-set) ] ;        
+        local t = [ new file-target $(self.name) exact 
+          : [ type.type $(self.name) ] : $(self.project) : $(a) ] ;        
+        return [ property-set.empty ] [ virtual-target.register $(t) ] ;
     }   
 }
 
 # Declares the 'make' main target.
-rule make ( target-name : sources * : generating-rule + : requirements * 
-            : caller ? )
+rule make ( target-name : sources * : generating-rule + : requirements * )
 {
-    caller ?= [ project.current ] ;
-    caller-module = [ $(caller).project-module ] ;
-    local rules = [ RULENAMES $(caller-module) ] ;
-    if $(generating-rule[1]) in $(rules)
+    local project = [ project.current ] ;
+    
+    # The '@' sign causes the feature.jam module to qualify rule name
+    # with the module name of current project, if needed.
+    local m = [ MATCH ^(@).* : $(generating-rule) ] ;
+    if ! $(m)
     {
-        # This is local rule, make it global
-        local n = $(caller-module).$(generating-rule[1]) ;
-        IMPORT $(caller-module) : $(generating-rule[1]) : : $(n) ;
-        generating-rule = $(n) $(generating-rule[2-]) ;
-    }
+        generating-rule = @$(generating-rule) ;
+    }        
+    requirements += <action>$(generating-rule) ;
     
-   targets.main-target-alternative
-     [ new make-target-class $(target-name) : $(caller)
+    targets.main-target-alternative
+     [ new make-target-class $(target-name) : $(project)
        : [ targets.main-target-sources $(sources) : $(target-name) ] 
-       : [ targets.main-target-requirements $(requirements) : $(caller) ] 
-       : $(generating-rule) 
-       : [ targets.main-target-default-build : $(caller) ] 
+       : [ targets.main-target-requirements $(requirements) : $(project) ] 
+       : [ targets.main-target-default-build : $(project) ] 
      ] ;
          
 }

Added: boost-build/branches/upstream/current/tools/mc.jam
===================================================================
--- boost-build/branches/upstream/current/tools/mc.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/mc.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,44 @@
+#~ Copyright 2005 Alexey Pakhunov.
+#~ 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)
+
+#  Support for Microsoft message compiler tool.
+#  Notes:
+#  - there's just message compiler tool, there's no tool for 
+#    extracting message strings from sources
+#  - This file allows to use Microsoft message compiler
+#    with any toolset. In msvc.jam, there's more specific
+#    message compiling action.
+
+import common ;
+import generators ;
+import feature : feature get-values ;
+import toolset : flags ;
+import type ;
+import rc ;
+
+rule init ( )
+{
+}
+
+type.register MC : mc ;
+
+
+# Command line options
+feature mc-input-encoding : ansi unicode : free ;
+feature mc-output-encoding : unicode ansi : free ;
+feature mc-set-customer-bit : no yes : free ;
+
+flags mc.compile MCFLAGS <mc-input-encoding>ansi : -a ;
+flags mc.compile MCFLAGS <mc-input-encoding>unicode : -u ;
+flags mc.compile MCFLAGS <mc-output-encoding>ansi : -A ;
+flags mc.compile MCFLAGS <mc-output-encoding>unicode : -U ;
+flags mc.compile MCFLAGS <mc-set-customer-bit>no : ;
+flags mc.compile MCFLAGS <mc-set-customer-bit>yes : -c ;
+
+generators.register-standard mc.compile : MC : H RC ;
+
+actions compile
+{
+    mc $(MCFLAGS) -h "$(<[1]:DW)" -r "$(<[2]:DW)" "$(>:W)"
+}

Added: boost-build/branches/upstream/current/tools/midl.jam
===================================================================
--- boost-build/branches/upstream/current/tools/midl.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/midl.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,142 @@
+# Copyright (c) 2005 Alexey Pakhunov.
+#
+# Use, modification and distribution is subject to the Boost Software
+# License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+# http://www.boost.org/LICENSE_1_0.txt)
+
+# Microsoft Interface Definition Language (MIDL) related routines
+
+import common ;
+import generators ;
+import feature : feature get-values ;
+import os ;
+import scanner ;
+import toolset : flags ;
+import type ;
+
+rule init ( )
+{
+}
+
+type.register IDL : idl ;
+
+# A type library (.tlb) is generated by MIDL compiler and can be included
+# to resources of an application (.rc). In order to be found by a resource 
+# compiler its target type should be derived from 'H' - otherwise
+# the property '<implicit-dependency>' will be ignored.
+type.register MSTYPELIB : tlb : H ;
+
+
+# Register scanner for MIDL files
+class midl-scanner : scanner 
+{
+    import path property-set regex scanner type virtual-target ;
+    
+    rule __init__ ( includes * )
+    {
+        scanner.__init__ ;
+    
+        self.includes = $(includes) ;
+
+        # List of quoted strings 
+        self.re-strings = "[ \t]*\"([^\"]*)\"([ \t]*,[ \t]*\"([^\"]*)\")*[ \t]*" ;
+
+        # 'import' and 'importlib' directives 
+        self.re-import    = "import"$(self.re-strings)"[ \t]*;" ;
+        self.re-importlib = "importlib[ \t]*[(]"$(self.re-strings)"[)][ \t]*;" ;
+
+        # C preprocessor 'include' directive
+        self.re-include-angle  = "#[ \t]*include[ \t]*<(.*)>" ;
+        self.re-include-quoted = "#[ \t]*include[ \t]*\"(.*)\"" ;
+    }    
+
+    rule pattern ( )
+    {
+        # Match '#include', 'import' and 'importlib' directives
+        return "((#[ \t]*include|import(lib)?).+(<(.*)>|\"(.*)\").+)" ;
+    }
+
+    rule process ( target : matches * : binding )
+    {
+        local included-angle  = [ regex.transform $(matches) : $(self.re-include-angle)  : 1 ] ;
+        local included-quoted = [ regex.transform $(matches) : $(self.re-include-quoted) : 1 ] ;
+        local imported        = [ regex.transform $(matches) : $(self.re-import)         : 1 3 ] ;
+        local imported_tlbs   = [ regex.transform $(matches) : $(self.re-importlib)      : 1 3 ] ;
+
+        # CONSIDER: the new scoping rule seem to defeat "on target" variables.
+        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.      
+        local g2 = $(g)"#"$(b) ;
+
+        included-angle = $(included-angle:G=$(g)) ;
+        included-quoted = $(included-quoted:G=$(g2)) ;
+        imported = $(imported:G=$(g2)) ;
+        imported_tlbs = $(imported_tlbs:G=$(g2)) ;
+
+        local all = $(included-angle) $(included-quoted) $(imported) ;
+
+        INCLUDES $(target) : $(all) ;
+        DEPENDS $(target) : $(imported_tlbs) ;
+        NOCARE $(all) $(imported_tlbs) ;
+        SEARCH on $(included-angle)  = $(self.includes:G=) ;
+        SEARCH on $(included-quoted) = $(b) $(self.includes:G=) ;
+        SEARCH on $(imported)        = $(b) $(self.includes:G=) ;
+        SEARCH on $(imported_tlbs)   = $(b) $(self.includes:G=) ;
+        
+        scanner.propagate 
+            [ type.get-scanner CPP : [ property-set.create $(self.includes) ] ] : 
+            $(included-angle) $(included-quoted) : $(target) ;
+
+        scanner.propagate $(__name__) : $(imported) : $(target) ;
+    }        
+}
+
+scanner.register midl-scanner : include ;
+type.set-scanner IDL : midl-scanner ;
+
+
+# Command line options
+feature midl-stubless-proxy : yes no : propagated ;
+feature midl-robust : yes no : propagated ;
+
+flags midl.compile.idl MIDLFLAGS <midl-stubless-proxy>yes : /Oicf ;
+flags midl.compile.idl MIDLFLAGS <midl-stubless-proxy>no : /Oic ;
+flags midl.compile.idl MIDLFLAGS <midl-robust>yes : /robust ;
+flags midl.compile.idl MIDLFLAGS <midl-robust>no : /no_robust ;
+
+# Architecture-specific options
+architecture-x86 = <architecture> <architecture>x86 ;
+address-model-32 = <address-model> <address-model>32 ;
+address-model-64 = <address-model> <address-model>64 ;
+
+flags midl.compile.idl MIDLFLAGS $(architecture-x86)/$(address-model-32) : /win32 ;
+flags midl.compile.idl MIDLFLAGS $(architecture-x86)/<address-model>64 : /x64 ;
+flags midl.compile.idl MIDLFLAGS <architecture>ia64/$(address-model-64) : /ia64 ;
+
+
+flags midl.compile.idl DEFINES <define> ;
+flags midl.compile.idl UNDEFS <undef> ;
+flags midl.compile.idl INCLUDES <include> ;
+
+
+generators.register-c-compiler midl.compile.idl : IDL : MSTYPELIB H C(%_i) C(%_proxy) C(%_dlldata) ;
+
+
+# MIDL does not always generate '%_proxy.c' and '%_dlldata.c'. This behavior 
+# depends on contents of the source IDL file. Calling TOUCH_FILE below ensures
+# that both files will be created so bjam will not try to recreate them 
+# constantly.
+TOUCH_FILE = [ common.file-touch-command ] ;
+
+actions compile.idl
+{
+    midl /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)"  
+}

Added: boost-build/branches/upstream/current/tools/msvc-config.jam
===================================================================
--- boost-build/branches/upstream/current/tools/msvc-config.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/msvc-config.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,12 @@
+#~ Copyright 2005 Rene Rivera.
+#~ 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)
+
+# Automatic configuration for VisualStudio toolset. To use, just import this module.
+
+import toolset : using ;
+
+ECHO "warning: msvc-config.jam is deprecated. Use 'using msvc : all ;' instead." ;
+
+using msvc : all ;
+

Modified: boost-build/branches/upstream/current/tools/msvc.jam
===================================================================
--- boost-build/branches/upstream/current/tools/msvc.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/msvc.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,8 +1,12 @@
-# Copyright David Abrahams 2003. Permission to copy, use,
-# modify, sell and distribute this software is granted provided this
-# copyright notice appears in all copies. This software is provided
-# "as is" without express or implied warranty, and with no claim as
-# to its suitability for any purpose.
+# Copyright (c) 2003 David Abrahams.
+# Copyright (c) 2005 Vladimir Prus.
+# Copyright (c) 2005 Alexey Pakhunov.
+# Copyright (c) 2006 Bojan Resnik.
+#
+# Use, modification and distribution is subject to the Boost Software
+# License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+# http://www.boost.org/LICENSE_1_0.txt)
+
 import property ;
 import generators ;
 import os ;
@@ -13,8 +17,11 @@
 import path ;
 import sequence : unique ;
 import common ;
-
+import "class" : new ;
 import rc ;
+import midl ;
+import mc ;
+import pch ;
 
 if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
 {
@@ -30,187 +37,469 @@
   # to be seen, though ;-)
   ;
 
-RM =  [ modules.peek common : RM ] ;
+# List of all registered configurations
+.versions = [ new configurations ] ;
 
+# Inherit MIDL flags
+toolset.inherit-flags msvc : midl ;
+
+# Inherit MC flags
+toolset.inherit-flags msvc : mc ;
+
+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::
+# that version of compiler is requested. For example, you might have:
 #
-#    using msvc : 6.5 : X:/some_dir ;
-#    using msvc : 7.0 : Y:/some_dir ;
-#    using msvc : : Z:/some_dir
+#    using msvc : 6.5 : cl.exe ;
+#    using msvc : 7.0 : Y:/foo/bar/cl.exe ;
 #
-# If you have "msvc-6.5" in build request, the version from X: drive will be used,
-# and if you put only "msvc", then drive "Z:" will be used. Note that it's not possible
-# the specify that by default, version 7.0 must be used --- you should use 'using'
-# without version number for that effect. 
-#    
-# version -- 
-# path -- 
+# The version paramater can be ommited:
 #
-# When invoking tools, we'll first run vcvars32.bat from the configured path and
-# then cl/link, without path.   
+#    using msvc : : Z:/foo/bar/cl.exe ;
 #
+# Two special version keywords may be supplied:
+#   - 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:
+#
+#                                      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 ( 
-  version ? # the msvc version which is being configured. When omitted
+    version ? # the msvc version which is being configured. When omitted
             # the tools invoked when no explicit version is given will be configured.
     : 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.    
+    # 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 * 
-   # options can include <setup>, <compiler>, <linker> and <resource-compiler>
+    # options can include <setup>, <compiler>, <assembler>, <linker> and <resource-compiler>
 )
-{    
-    # setup will be used iff a path has been specified.  If setup is
-    # not specified, vcvars32.bat will be used instead.
-    setup = [ get-values <setup> : $(options) ] ;
-    setup ?= vcvars32.bat ;    
-    compiler = [ get-values <compiler> : $(options) ] ;
-    compiler ?= cl ;
-    linker = [ get-values <linker> : $(options) ] ;
-    linker ?= link ;
-    resource-compiler = [ get-values <resource-compiler> : $(options) ] ;
-    resource-compiler ?= rc ;
-    
-    local condition = [ common.check-init-parameters msvc : 
-        version $(version) ] ;
-
-    # 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 $(command)
-    {        
-        command = [ common.get-absolute-tool-path $(command[-1]) ] ;
+    {
+        options += <command>$(command) ;
     }
-    local root = $(command:D) ;
-                  
-    setup = $(root)\\bin\\$(setup) ;
-    
-    # CONSIDER: What's the point of 'call'. Can we invoke the script directly?
-    setup = "call \""$(setup)"\" > nul " ;
-    
-    if [ os.name ] = NT
+
+    configure $(version) : $(options) ;
+}
+
+
+# 'configure' is a newer version of 'init'. The parameter 'command' is passed as 
+# a part of the 'options' list.
+rule configure (
+    version ? :
+    options * 
+    )
+{
+    switch $(version)
     {
-        setup = $(setup)"
-" ;
+        case all :
+            if $(options)
+            {
+                error "msvc: options should be empty when 'all' is specified" ;
+            }
+
+            # use all detected versions
+            for local v in [ $(.versions).all ]
+            {
+                configure-really $(v) ;
+            }
+
+        case "default" :
+            configure-really : $(options) ;
+
+        case * :
+            configure-really $(version) : $(options) ;
     }
-    else
+}
+
+
+# Supported CPU architectures
+cpu-arch-i386 = 
+    <architecture>/<address-model>
+    <architecture>/<address-model>32
+    <architecture>x86/<address-model>   
+    <architecture>x86/<address-model>32 ;
+
+cpu-arch-amd64 = 
+    <architecture>/<address-model>64    
+    <architecture>x86/<address-model>64 ;
+
+cpu-arch-ia64 =
+    <architecture>ia64/<address-model>  
+    <architecture>ia64/<address-model>64 ;
+
+
+local rule configure-really (
+    version ? :
+    options *
+    )
+{
+    # If no version supplied use the default configuration. Note that condition 
+    # remains versionless.
+    local v = $(version) ;
+    if ! $(v)
     {
-        setup = "cmd /S /C "$(setup)" \"&&\" " ;
+        # take the first detected version
+        version = [ $(.versions).all ] ;
+        version = $(version[1]) ;
+
+        # Note: 'version' can still be empty at this point if no versions were 
+        # detected.
+        version ?= "default" ;
     }
 
-    # prefix with setup, or quoted path if any
-    local prefix = $(setup) ;
-    
-    flags msvc.compile .CC $(condition) : $(prefix)$(compiler) ;
-    flags msvc.compile .RC $(condition) : $(prefix)$(resource-compiler) ;
-    flags msvc.link .LD $(condition) : $(prefix)$(linker) ;
-    flags msvc.archive .LD $(condition) : $(prefix)$(linker) ;
-    
-    if ! $(version) 
+    # Version alias -> real version number
+    if $(.version-alias-$(version))
     {
-        # Even if version is not explicitly specified, try to detect the version
-        # from the path.
-        if [ MATCH "(Microsoft Visual Studio 8)" : $(command) ]
+        version = $(.version-alias-$(version)) ;
+    }
+
+    # Check whether selected configuration is used already
+    if $(version) in [ $(.versions).used ]
+    {
+        # Allow multiple 'toolset.usage' calls for the same configuration
+        # if the identical sets of options are used 
+        if $(options) && ( $(options) != [ $(.versions).get $(version) : options ] )
         {
-            version = 8.0 ;
-        }                 
-        else if [ MATCH "(\\.NET 2003\\VC7)" : $(command) ] ||
-                [ MATCH "(Microsoft Visual C\\+\\+ Toolkit 2003)" : $(command) ]
+            error "msvc: the toolset version '$(version)' is configured already" ;
+        }
+    }
+    else
+    {
+        # Register a new configuration 
+        $(.versions).register $(version) ;
+
+        # Add user-supplied to auto-detected options
+        options = [ $(.versions).get $(version) : options ] $(options) ;
+
+        # Mark the configuration as 'used'.
+        $(.versions).use $(version) ;
+
+        # Generate condition and save it
+        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.
+        command = [ common.get-invocation-command msvc : cl.exe : $(command)
+          : [ default-paths $(version) ] : $(version) ] ;
+
+        common.handle-options msvc : $(condition) : $(command) : $(options) ;
+            
+
+        if ! $(version) 
         {
-            version = 7.1 ;
+            # Even if version is not explicitly specified, try to detect the version
+            # from the path.
+            if [ MATCH "(Microsoft Visual Studio 8)" : $(command) ]
+            {
+                version = 8.0 ;
+            }                 
+            else if [ MATCH "(NET 2003[\/\\]VC7)" : $(command) ]
+            {
+                version = 7.1 ;
+            }
+            else if [ MATCH "(Microsoft Visual C\\+\\+ Toolkit 2003)" : $(command) ]
+            {
+                version = 7.1toolkit ;
+            }
+            else if [ MATCH "(.NET[\/\\]VC7)" : $(command) ]
+            {
+                version = 7.0 ;
+            }
+            else
+            {
+                version = 6.0 ;
+            }                
         }
-        else if [ MATCH "(.NET\\VC7)" : $(command) ]
+
+        
+        # Generate and register setup command
+
+        local below-8.0 = [ MATCH ^([67]\\.) : $(version) ] ;
+
+        local cpu = i386 ;
+
+        local setup ;
+        local setup-option ;
+
+        if $(command)
         {
-            version = 7.0 ;
+            command = [ common.get-absolute-tool-path $(command[-1]) ] ;
+
+            local parent = [ path.make $(command) ] ;
+            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 = [ get-values <setup> : $(options) ] ;
+
+            if ! $(setup)
+            {
+                if $(below-8.0)
+                {
+                    setup ?= vcvars32.bat ;
+                }
+                else
+                {
+                    setup ?= vcvarsall.bat ;
+                }
+
+                # 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 
+                setup = "\""$(setup[1]:W)"\"" ;
+
+                if ! $(below-8.0)
+                {
+                    cpu = i386 amd64 ia64 ;
+                    setup-option = x86 x86_amd64 x86_ia64 ;
+                }
+            }
         }
-        else
+
+        local prefix = "call " ;
+        local suffix = " >nul
+" ;
+        if ! [ os.name ] in NT
         {
-            version = 6.0 ;
-        }                
+            prefix = "cmd.exe /S /C call " ;
+            suffix = " >nul \"&&\" " ;
+        }
+
+        command = $(prefix)$(setup)" "$(setup-option:E="")$(suffix) ;
+
+        # Setup script is not required in some configurations
+        command ?= "" ;
+
+        # Get tool names (if any) and finish setup
+
+        compiler = [ get-values <compiler> : $(options) ] ;
+        compiler ?= cl ;
+
+        linker = [ get-values <linker> : $(options) ] ;
+        linker ?= link ;
+
+        resource-compiler = [ get-values <resource-compiler> : $(options) ] ;
+        resource-compiler ?= rc ;
+
+        assembler = [ get-values <assembler> : $(options) ] ;
+        assembler ?= ml ;
+
+        idl-compiler = [ get-values <idl-compiler> : $(options) ] ;
+        idl-compiler ?= midl ;
+
+        mc-compiler = [ get-values <mc-compiler> : $(options) ] ;
+        mc-compiler ?= mc ;
+
+        manifest-tool = mt ;
+
+        for local i in 1 2 3
+        {
+            local c = $(cpu[$(i)]) ;
+
+            if $(c)
+            {
+                local cond = $(condition)/$(cpu-arch-$(c)) ;
+
+                if $(.debug-configuration)
+                {
+                    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) ;
+                flags msvc.link    .LD  $(cond) : $(command[$(i)])$(linker) /NOLOGO /INCREMENTAL:NO ;
+                flags msvc.archive .LD  $(cond) : $(command[$(i)])$(linker) /lib /NOLOGO  ;
+                flags msvc.compile .IDL $(cond) : $(command[$(i)])$(idl-compiler) ;
+                flags msvc.compile .MC  $(cond) : $(command[$(i)])$(mc-compiler) ;
+
+                if ! [ os.name ] in NT
+                {
+                    flags msvc.link .MT $(cond) : $(command[$(i)])$(manifest-tool) -nologo ;
+                }
+                else
+                {
+                    flags msvc.link .MT $(cond) : $(manifest-tool) -nologo ;
+                }
+            }
+        }
+
+        # Set version-specific flags
+        configure-version-specific $(version) : $(condition) ;
     }
-                
-    # The following options work only for 7* versions. It means
-    # that if the user has not specified a version he gets 6.0 compatible
-    # behavious (i.e. a bit buggy)
-    if [ MATCH ^(7\..*) : $(version) ] 
+}
+
+
+# Supported CPU types
+cpu-type-g5 = i586 pentium pentium-mmx ;
+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-amd64 = k8 opteron athlon64 athlon-fx ;
+
+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 ;
+
+
+local rule configure-version-specific ( version : condition )
+{
+    # 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).
+    if ! [ MATCH ^(6\\.) : $(version) ]
     {
         flags msvc.compile CFLAGS $(condition) : /Zc:forScope /Zc:wchar_t ;
+        flags msvc.compile.c++ C++FLAGS $(condition) : /wd4675 ;
+        # disable the function is deprecated warning
+        # Some version of msvc have a bug, that cause deprecation
+        # warning to be emitted even with /W0
+        flags msvc.compile CFLAGS $(condition)/<warnings>off : /wd4996 ; 
+        # 64-bit compatibility warning
+        flags msvc.compile CFLAGS $(condition)/<warnings>all : /Wp64 ; 
     }
     
-    # 8.0 deprecates some of the options
-    if [ MATCH ^(8) : $(version) ]
+    #
+    # Processor-specific optimization
+    #
+
+    if [ MATCH ^([67]\\.) : $(version) ]
     {
-        flags msvc.compile CFLAGS $(condition)/<optimization>speed : /O2 ;
-        flags msvc.compile CFLAGS $(condition)/<optimization>space : /O1 ;
+        # 8.0 deprecates some of the options
+        flags msvc.compile CFLAGS $(condition)/<optimization>speed $(condition)/<optimization>space : /Ogiy /Gs ;
+        flags msvc.compile CFLAGS $(condition)/<optimization>speed : /Ot ;
+        flags msvc.compile CFLAGS $(condition)/<optimization>space : /Os ;
+
+        flags msvc.compile CFLAGS $(condition)/$(cpu-arch-i386)/<instruction-set> : /GB ;
+        flags msvc.compile CFLAGS $(condition)/$(cpu-arch-i386)/<instruction-set>i386 : /G3 ;
+        flags msvc.compile CFLAGS $(condition)/$(cpu-arch-i386)/<instruction-set>i486 : /G4 ;
+        flags msvc.compile CFLAGS $(condition)/$(cpu-arch-i386)/<instruction-set>$(cpu-type-g5) : /G5 ;
+        flags msvc.compile CFLAGS $(condition)/$(cpu-arch-i386)/<instruction-set>$(cpu-type-g6) : /G6 ;
+        flags msvc.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.
+        flags msvc.compile CFLAGS $(condition) : /Op ;
+
+        # 7.1 and below have single-threaded static RTL
+        flags msvc.compile CFLAGS $(condition)/<runtime-debugging>off/<runtime-link>static/<threading>single : /ML ;
+        flags msvc.compile CFLAGS $(condition)/<runtime-debugging>on/<runtime-link>static/<threading>single : /MLd ;
     }
     else
-    {        
-        flags msvc.compile CFLAGS $(condition)/<optimization>speed : /Ogity /O2 /Gs ;
-        flags msvc.compile CFLAGS $(condition)/<optimization>space : /Ogisy /O1 /Gs ;        
-    }        
+    {
+        # 8.0 adds some more options
+        flags msvc.compile CFLAGS $(condition)/$(cpu-arch-amd64)/<instruction-set> : /favor:blend ;
+        flags msvc.compile CFLAGS $(condition)/$(cpu-arch-amd64)/<instruction-set>$(cpu-type-em64t) : /favor:EM64T ;
+        flags msvc.compile CFLAGS $(condition)/$(cpu-arch-amd64)/<instruction-set>$(cpu-type-amd64) : /favor:AMD64 ;
+
+        # 8.0 only has multi-threaded static RTL
+        flags msvc.compile CFLAGS $(condition)/<runtime-debugging>off/<runtime-link>static/<threading>single : /MT ;
+        flags msvc.compile CFLAGS $(condition)/<runtime-debugging>on/<runtime-link>static/<threading>single : /MTd ;
+    }
 }
 
-rule default-paths ( version ? )
+
+# Returns the default installation path for the given version. 
+local rule default-path ( version )
 {
-    local possible-paths ;
-    
-    local ProgramFiles = [ modules.peek : ProgramFiles ] ;
-    if $(ProgramFiles)
+    # Use auto-detected path if possible 
+    local path = [ get-values <command> : 
+        [ $(.versions).get $(version) : options ] ] ;
+
+    if $(path)
     {
-        ProgramFiles = "$(ProgramFiles:J= )" ;
+        path = $(path:D) ;
     }
     else
     {
-        ProgramFiles = "c:\\Program Files" ;
+        # Check environment
+        if $(.version-$(version)-env)
+        {
+            local vc-path = [ os.environ $(.version-$(version)-env) ] ;
+            if $(vc-path)
+            {
+                vc-path = [ path.make $(vc-path) ] ;
+                vc-path = [ path.join $(vc-path) $(.version-$(version)-envpath) ] ;
+                vc-path = [ path.native $(vc-path) ] ;
+
+                path = $(vc-path) ;
+            }
+        }
+
+        # Check default path
+        if ! $(path) && $(.version-$(version)-path)
+        {
+            path = [ path.native [ path.join $(.ProgramFiles) $(.version-$(version)-path) ] ] ;
+        }
     }
 
-    local version-6-path = $(ProgramFiles)"\\Microsoft Visual Studio\\VC98" ;
-    local version-7-path = $(ProgramFiles)"\\Microsoft Visual Studio .NET\\VC7" ;
-    local version-7.0-path = $(version-7-path) ;
-    local version-7.1-path = $(ProgramFiles)"\\Microsoft Visual Studio .NET 2003\\VC7" ;
-    local version-8.0-path = $(ProgramFiles)"\\Microsoft Visual Studio 8" ;
+    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)
+rule default-paths ( version ? )
+{
+    local possible-paths ;
     
-    local VS71COMNTOOLS = [ modules.peek : VS71COMNTOOLS ] ;
-    if $(VS71COMNTOOLS)
-    {
-        # VS71COMNTOOLS is set by VS .NET 2003 to <VSDIR>\Common7\Tools
-        version-7.1-path = [ path.make "$(VS71COMNTOOLS:J= )" ] ;
-        version-7.1-path = [ path.parent $(version-7.1-path) ] ;
-        version-7.1-path = [ path.parent $(version-7.1-path) ] ;
-        version-7.1-path = [ path.join $(version-7.1-path) "VC7" ] ;
-        version-7.1-path = [ path.native $(version-7.1-path) ] ;
-    }
-        
-    local VCToolkitInstallDir = [ modules.peek : VCToolkitInstallDir ] ;
-    if $(VCToolkitInstallDir)
-    {
-        version-7.1-path = [ path.make "$(VCToolkitInstallDir:J= )" ] ;
-    }
-    
     if $(version)
     {
-        local v = [ MATCH ^(6|[^6].*) : $(version) ] ;
-        possible-paths += $(version-$(v)-path) ;
+        possible-paths += [ default-path $(version) ] ;
     }
     else
     {
-        possible-paths += $(version-7.1-path) $(version-7.0-path) $(version-6-path) ;
+        for local i in $(.known-versions)
+        {
+            possible-paths += [ default-path $(i) ] ;
+        }
     }
-    # The vccars32.bat is actually in "bin" directory.
-    # (except for free VC7.1 tools)
-    possible-paths = $(possible-paths)\\bin $(possible-paths) ;
 
     return $(possible-paths) ;
 }
@@ -221,38 +510,63 @@
 # is it possible to combine these?
 # make the generators non-composing, so that they don't convert each source
 # into separate rsp file.
-generators.register-linker msvc.link : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : EXE RSP : <toolset>msvc ;
-generators.register-linker msvc.link.dll : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB RSP : <toolset>msvc ;
-
-generators.register-composing msvc.archive : OBJ : STATIC_LIB RSP : <toolset>msvc ;
+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 ;
-generators.register-standard msvc.compile.rc : RC : OBJ(%_res) : <toolset>msvc ;
-generators.override msvc.compile.rc : rc.resource-compile ;
 
+# Using 'register-c-compiler' adds the build directory to INCLUDES
+generators.register-c-compiler msvc.compile.rc : RC : OBJ(%_res) : <toolset>msvc ;
+generators.override msvc.compile.rc : rc.compile.resource ;
+generators.register-standard msvc.compile.asm : ASM : OBJ : <toolset>msvc ;
+
+generators.register-c-compiler msvc.compile.idl : IDL : MSTYPELIB H C(%_i) C(%_proxy) C(%_dlldata) : <toolset>msvc ;
+generators.override msvc.compile.idl : midl.compile.idl ;
+
+generators.register-standard msvc.compile.mc : MC : H RC : <toolset>msvc ;
+generators.override msvc.compile.mc : mc.compile ;
+
+generators.register [ new pch-generator msvc.compile.pch : PCHEADER : OBJ PCH : <toolset>msvc ] ;
+
 #
 # Declare flags and action for compilation
 #
 feature.feature debug-store : object database : propagated ;
+
+flags msvc.compile CFLAGS <optimization>speed : /O2 ;
+flags msvc.compile CFLAGS <optimization>space : /O1 ;
+
+flags msvc.compile CFLAGS $(cpu-arch-ia64)/<instruction-set>$(cpu-type-itanium) : /G1 ;
+flags msvc.compile CFLAGS $(cpu-arch-ia64)/<instruction-set>$(cpu-type-itanium2) : /G2 ;
+
 flags msvc.compile CFLAGS <debug-symbols>on/<debug-store>object : /Z7 ;
 flags msvc.compile CFLAGS <debug-symbols>on/<debug-store>database : /Zi ;
 flags msvc.compile CFLAGS <optimization>off : /Od ;
 flags msvc.compile CFLAGS <inlining>off : /Ob0 ;
 flags msvc.compile CFLAGS <inlining>on : /Ob1 ;
 flags msvc.compile CFLAGS <inlining>full : /Ob2 ;
-flags msvc.compile CFLAGS <exception-handling>on : /EHsc ;
+
+flags msvc.compile CFLAGS <warnings>on : /W3 ;
+flags msvc.compile CFLAGS <warnings>off : /W0 ;
+flags msvc.compile CFLAGS <warnings>all : /W4 ;
+flags msvc.compile CFLAGS <warnings-as-errors>on : /WX ;
+
+flags msvc.compile C++FLAGS  <exception-handling>on/<asynch-exceptions>off/<extern-c-nothrow>off : /EHs ;
+flags msvc.compile C++FLAGS  <exception-handling>on/<asynch-exceptions>off/<extern-c-nothrow>on : /EHsc ;
+flags msvc.compile C++FLAGS  <exception-handling>on/<asynch-exceptions>on/<extern-c-nothrow>off : /EHa ;
+flags msvc.compile C++FLAGS  <exception-handling>on/<asynch-exceptions>on/<extern-c-nothrow>on : /EHac ;
+
 flags msvc.compile CFLAGS <rtti>on : /GR ;
-flags msvc.compile CFLAGS <runtime-debugging>off/<link-runtime>shared : /MD ;
-flags msvc.compile CFLAGS <runtime-debugging>on/<link-runtime>shared : /MDd ;
+flags msvc.compile CFLAGS <runtime-debugging>off/<runtime-link>shared : /MD ;
+flags msvc.compile CFLAGS <runtime-debugging>on/<runtime-link>shared : /MDd ;
 
-flags msvc.compile CFLAGS <runtime-debugging>off/<link-runtime>static/<threading>single : /ML ;
-flags msvc.compile CFLAGS <runtime-debugging>on/<link-runtime>static/<threading>single : /MLd ;
-flags msvc.compile CFLAGS <runtime-debugging>off/<link-runtime>static/<threading>multi : /MT ;
-flags msvc.compile CFLAGS <runtime-debugging>on/<link-runtime>static/<threading>multi : /MTd ;
-flags msvc.compile CFLAGS <base-target-type>CPP : /EHsc ;
+flags msvc.compile CFLAGS <runtime-debugging>off/<runtime-link>static/<threading>multi : /MT ;
+flags msvc.compile CFLAGS <runtime-debugging>on/<runtime-link>static/<threading>multi : /MTd ;
 
-flags msvc.compile USER_CFLAGS <cflags> : ;
-flags msvc.compile.c++ USER_CFLAGS <cxxflags> : ;
+flags msvc.compile.c OPTIONS <cflags> : ;
+flags msvc.compile.c++ OPTIONS <cxxflags> : ;
 
 flags msvc.compile PDB_CFLAG <debug-symbols>on/<debug-store>database : /Fd ;  # not used yet
 
@@ -260,23 +574,83 @@
 flags msvc.compile UNDEFS <undef> ;
 flags msvc.compile INCLUDES <include> ;
 
-flags msvc WHATEVER <toolset-msvc:version> ;
+flags msvc.compile PCH_SOURCE <pch-source> ;
+flags msvc.compile PCH_HEADER <pch>on : <pch-header> ;
+flags msvc.compile PCH_FILE <pch>on : <pch-file> ;
 
-# The actions differ only by explicit selection of input language
-actions compile.c
+rule get-rspline ( target : lang-opt )
 {
-    $(.CC) /Zm800 -nologo -TC -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(USER_CFLAGS) -I"$(INCLUDES)" -c -Fo"$(<:W)" "$(>:W)"
+    CC_RSPLINE on $(target) = [ on $(target) return $(lang-opt) -U$(UNDEFS) $(CFLAGS) $(C++FLAGS) $(OPTIONS) -c $(nl)-D$(DEFINES) $(nl)\"-I$(INCLUDES)\" ] ;
 }
-actions compile.c++
+
+rule compile-c-c++ ( targets + : sources * )
 {
-    $(.CC) /Zm800 -nologo -TP -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(USER_CFLAGS) -I"$(INCLUDES)" -c -Fo"$(<:W)" "$(>:W)"
+    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))"
+}
+
+rule compile.c ( targets + : sources * : properties * )
+{
+    C++FLAGS on $(targets[1]) = ;
+    get-rspline $(targets) : -TC ;
+    compile-c-c++ $(<) : $(>) [ on $(<) return $(PCH_FILE) ] [ on $(<) return $(PCH_HEADER) ] ;
+}
+
+rule compile.c++ ( targets + : sources * : properties * )
+{
+    get-rspline $(targets[1]) : -TP ;
+    compile-c-c++ $(<) : $(>) [ on $(<) return $(PCH_FILE) ] [ on $(<) return $(PCH_HEADER) ] ;
+}
+
+actions compile-pch
+{
+    $(.CC) @"@($(<[1]:W).rsp:E="$(>[2]:W)" -Fo"$(<[1]:W)" -Yc"$(>[1]:D=)" -Yl"__bjam_pch_symbol_$(>[1]:D=)" -Fp"$(<[2]:W)" $(CC_RSPLINE))"
+}
+
+rule compile.pch ( targets + : sources * : properties * )
+{
+    DEPENDS $(<) : [ on $(<) return $(PCH_SOURCE) ] ;
+    get-rspline $(targets[1]) : -TP ;
+    compile-pch $(targets) : $(sources) [ on $(<) return $(PCH_SOURCE) ] ;
+}
+
 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)"  
+}
+
+# Declare flags and action for the assembler
+
+flags msvc.compile.asm USER_ASMFLAGS <asmflags> : ;
+
+#
+# for the assembler the following options are turned on by default:
+#
+# -coff  generate COFF format object file (compatible with cl.exe output)
+# -Zp4   align structures to 4 bytes
+# -Cp    preserve case of user identifiers
+# -Cx    preserve case in publics, externs
+
+actions compile.asm
+{
+    $(.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 LINKFLAGS <debug-symbols>on : /DEBUG ;
@@ -291,33 +665,22 @@
 flags msvc LINKFLAGS <user-interface>native : /subsystem:native ;
 flags msvc LINKFLAGS <user-interface>auto : /subsystem:posix ;
 
-flags msvc LINKFLAGS <main-target-type>LIB/<link>shared : /DLL ;
+flags msvc.link OPTIONS <linkflags> ;
+flags msvc.link LINKPATH <library-path> ;
 
-toolset.flags msvc.link USER_LINKFLAGS <linkflags> ;
-toolset.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 ;
+flags msvc.link LIBRARIES_MENTIONED_BY_FILE : <library-file> ;
 
+flags msvc.archive AROPTIONS <archiveflags> ;
 
-rule archive ( targets + : sources * : properties * )    
-{
-    common.response-file $(targets) : $(sources) : $(targets[2]) : $(properties) ;             
-}
 
-rule link ( targets + : sources * : properties * )
-{
-    common.response-file $(targets) : $(sources) : $(targets[2]) 
-      : $(properties) ;
-}
-
 rule link.dll ( targets + : sources * : properties * )
 {
-    common.response-file $(targets) : $(sources) : $(targets[3]) : $(properties) ;
     DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ;
-}    
+}
 
 # Declare action for creating static libraries
 # If library exists, remove it before adding files. See
@@ -327,18 +690,18 @@
 {    
     # The 'DEL' command would issue a message to stdout
     # if the file does not exist, so need a check.
-    actions archive 
+    actions archive
     {  
         if exist "$(<[1])" DEL "$(<[1])"  
-        $(.LD) /lib /NOLOGO /out:"$(<[1])" @"$(<[2])"
+        $(.LD) $(AROPTIONS) /out:"$(<[1])" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
     }
 }
 else
 {
-    actions archive 
+    actions archive
     {  
         $(RM) "$(<[1])"
-        $(.LD) /lib /NOLOGO /out:"$(<[1])" @"$(<[2])"
+        $(.LD) $(AROPTIONS) /out:"$(<[1])" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
     }
 }
         
@@ -348,14 +711,140 @@
 # 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.
-actions link bind DEF_FILE
+
+# Windows Manifests is a new way to specify dependencies 
+# on managed DotNet assemblies and Windows native DLLs. The 
+# manifests are embedded as resourses and are useful in 
+# any PE targets (both DLL and EXE)
+
+if [ os.name ] in NT
 {
-    $(.LD) /NOLOGO $(LINKFLAGS) /out:"$(<[1]:W)" /INCREMENTAL:NO /LIBPATH:"$(LINKPATH:W)" $(USER_LINKFLAGS) @"$(<[2]:W)"
+    actions link bind DEF_FILE
+    {
+        $(.LD) $(LINKFLAGS) /out:"$(<[1]:W)" /LIBPATH:"$(LINKPATH:W)" $(OPTIONS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
+        if exist "$(<[1]).manifest" (
+            $(.MT) -manifest "$(<[1]).manifest" "-outputresource:$(<[1]);1"
+        )
+    }
+
+    actions link.dll bind DEF_FILE
+    {
+        $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:$(DEF_FILE) $(OPTIONS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
+        if exist "$(<[1]).manifest" (
+            $(.MT) -manifest "$(<[1]).manifest" "-outputresource:$(<[1]);2"
+        )
+    }
 }
+else
+{
+    actions link bind DEF_FILE
+    {
+        $(.LD) $(LINKFLAGS) /out:"$(<[1]:W)" /LIBPATH:"$(LINKPATH:W)" $(OPTIONS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
+        if test -e "$(<[1]).manifest"; then
+            $(.MT) -manifest "$(<[1]:W).manifest" "-outputresource:$(<[1]:W);1"
+        fi
+    }
 
-actions link.dll bind DEF_FILE
+    actions link.dll bind DEF_FILE
+    {
+        $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:$(DEF_FILE) $(OPTIONS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
+        if test -e "$(<[1]).manifest"; then
+            $(.MT) -manifest "$(<[1]:W).manifest" "-outputresource:$(<[1]:W);2"
+        fi
+    }
+}
+
+
+actions compile.mc
 {
-    $(.LD) /NOLOGO $(LINKFLAGS) /out:"$(<[1]:W)" /INCREMENTAL:NO /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:$(DEF_FILE) $(USER_LINKFLAGS) @"$(<[3]:W)"
+    $(.MC) $(MCFLAGS) -h "$(<[1]:DW)" -r "$(<[2]:DW)" "$(>:W)"
 }
 
-        
+
+#
+# Autodetection code
+#     detects versions listed as '.known-versions' using registry, environment 
+#     and checking default paths. Supports both native Windows and Cygwin.
+#
+
+.ProgramFiles = [ path.make [ common.get-program-files-dir ] ] ;
+
+.known-versions = 8.0 8.0express 7.1 7.1toolkit 7.0 6.0 ;
+
+# Version aliases
+.version-alias-6 = 6.0 ;
+.version-alias-7 = 7.0 ;
+.version-alias-8 = 8.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++" ;
+.version-7.0-reg = "VisualStudio\\7.0\\Setup\\VC" ;
+.version-7.1-reg = "VisualStudio\\7.1\\Setup\\VC" ;
+.version-8.0-reg = "VisualStudio\\8.0\\Setup\\VC" ;
+.version-8.0express-reg = "VCExpress\\8.0\\Setup\\VC" ;
+
+# Visual C++ Toolkit 2003 do not store its installation path in the registry.
+# 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
+.version-7.1toolkit-envpath = "bin" ;
+
+
+# Validates given path, registers found configuration and prints debug information 
+# about it.
+local rule register-configuration ( version : path ? )
+{
+    if $(path)
+    {
+        local command = [ GLOB $(path) : cl.exe ] ;
+
+        if $(command)
+        {
+            if $(.debug-configuration)
+            {
+                ECHO "notice: msvc-$(version) detected, command: '$(command)'" ;
+            }
+
+            $(.versions).register $(version) ;
+            $(.versions).set $(version) : options : <command>$(command) ;
+        }
+    }
+}
+
+if [ os.name ] in NT CYGWIN
+{
+    # Get installation paths from the registry
+
+    for local i in $(.known-versions)
+    {
+        if $(.version-$(i)-reg)
+        {
+            local vc-path = [ W32_GETREG
+                "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"$(.version-$(i)-reg)
+                : "ProductDir" ] ;
+            
+            if $(vc-path)
+            {
+                vc-path = [ path.native [ path.join [ path.make-NT $(vc-path) ] "bin" ] ] ;
+                register-configuration $(i) : $(vc-path) ;
+            }
+        }
+    }
+}
+
+
+# Check environment and default installation paths
+
+for local i in $(.known-versions)
+{
+    if ! $(i) in [ $(.versions).all ]
+    {
+        register-configuration $(i) : [ default-path $(i) ] ;
+    }
+}
+

Added: boost-build/branches/upstream/current/tools/notfile.jam
===================================================================
--- boost-build/branches/upstream/current/tools/notfile.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/notfile.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,71 @@
+#  Copyright (c) 2005 Vladimir Prus.
+#
+#  Use, modification and distribution is subject to the Boost Software
+#  License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+import generators ;
+import type ;
+import feature ;
+import project ;
+import targets ;
+import toolset ;
+import "class" : new ;
+
+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)        
+        {
+            action = [ new action $(sources) : $(m[1]) 
+              : $(property-set) ] ;                
+        }
+        else
+        {
+            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)
+}
+
+
+rule notfile ( target-name : action + : sources * : requirements * : default-build * )
+{ 
+    local project = [ project.current ] ;
+    
+    requirements += <action>$(action) ;
+
+    
+    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) ] 
+        ] ;
+}
+
+IMPORT $(__name__) : notfile : : notfile ;
+
+

Added: boost-build/branches/upstream/current/tools/package.jam
===================================================================
--- boost-build/branches/upstream/current/tools/package.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/package.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,95 @@
+#  Copyright (c) 2005 Vladimir Prus.
+#
+#  Use, modification and distribution is subject to the Boost Software
+#  License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#  Provides mechanism for installing whole packages into a specific
+#  directory structure. This is opposed to the 'install' rule, that
+#  installs a number of targets to a single directory, and does not
+#  care about directory structure at all.
+
+#  Example usage:
+#
+#    package.install boost : <properties>
+#                          : <binaries>
+#                          : <libraries>
+#                          : <headers>
+#                          ;
+#
+#  This will install binaries, libraries and headers to the 'proper' location, given
+#  by command line options --prefix, --exec-prefix, --bindir, --libdir and 
+#  --includedir. 
+#
+#  The rule is just a convenient wrapper, avoiding the need to define several
+#  'install' targets.
+#
+#  The only install-related feature is <install-source-root>. It will apply to
+#  headers only and if present, paths of headers relatively to source root will be
+#  retained after installing. If it's not specified, then "." is assumed, so 
+#  relative paths in headers are always preserved.
+
+import project ;
+import targets ;
+import "class" : new ;
+import option ;
+import errors ;
+import stage ;
+import property ;
+
+rule install ( name : requirements * : binaries * : libraries * : headers * )
+{
+    # If <install-source-root> is not specified, all headers are installed
+    # to prefix/include, no matter what their relative path is. Sometimes
+    # that's what needed.
+    local install-source-root
+        = [ property.select <install-source-root> : $(requirements) ] ;
+    requirements = [ property.change $(requirements) : <install-source-root> ] ;
+    
+    #
+    local install-header-subdir
+        = [ property.select <install-header-subdir> : $(requirements) ] ;
+    install-header-subdir = /$(install-header-subdir:G=) ;
+    install-header-subdir ?= "" ;
+    requirements = [ property.change $(requirements) : <install-header-subdir> ] ;
+    
+    # First, figure out all locations.
+    local prefix = [ option.get prefix : "" ] ;
+    
+    if ! $(prefix)
+    {
+        if [ modules.peek : NT ] { prefix = C:\\$(name) ; }
+        else if [ modules.peek : UNIX ] { prefix = /usr/local ; }        
+    }
+
+    # architecture dependent files
+    local exec-locate = [ option.get exec-prefix : $(prefix) ] ;
+    
+    # binaries
+    local bin-locate = [ option.get bindir : $(prefix)/bin ] ;
+
+    # object code libraries
+    local lib-locate = [ option.get libdir : $(prefix)/lib ] ;
+
+    # source header files
+    local include-locate = [ option.get includedir : $(prefix)/include ] ;
+
+    
+    stage.install $(name)-bin : $(binaries) : $(requirements) <location>$(bin-locate) ;
+    stage.install $(name)-lib : 
+        $(binaries) $(libraries) 
+        : $(requirements) <location>$(lib-locate) 
+          <install-dependencies>on <install-type>LIB 
+        ;
+    stage.install $(name)-headers : $(headers) : $(requirements) 
+      <location>$(include-locate)$(install-header-subdir)
+      <install-source-root>$(install-source-root) ;
+    alias $(name) : $(name)-bin $(name)-lib $(name)-headers ;
+    
+    local c = [ project.current ] ;
+    local project-module = [ $(c).project-module ] ;
+    module $(project-module)
+    {
+        explicit $(1)-bin $(1)-lib $(1)-headers $(1) ;
+    }
+}

Added: boost-build/branches/upstream/current/tools/pch.jam
===================================================================
--- boost-build/branches/upstream/current/tools/pch.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/pch.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,68 @@
+# Copyright (c) 2005 Reece H. Dunn.
+#
+# Use, modification and distribution is subject to the Boost Software
+# License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+# http://www.boost.org/LICENSE_1_0.txt)
+
+import type ;
+import feature : feature ;
+import generators ;
+
+##### Using Pre-compiled Headers (Quick Guide) #####
+#
+# Make mypch.hpp a pre-compiled header (PCH) using mypch.cpp as the source file:
+#    import cast ;
+#    pch mypch : [ cast _ pcheader : pch.hpp ] pch.cpp ;
+#
+# Enable PCHs in a target:
+#    exe hello : mypch main.cpp hello.cpp ;
+#                ^^^^^ -- mypch.hpp is a PCH
+#
+# Don't use PCHs for a specific source:
+#    obj nopch : nopch.cpp : <pch>off ;
+#
+
+type.register PCH : pch ;
+type.register PCHEADER : pcheader ;
+
+feature pch : # control precompiled header (PCH) generation
+    on  # this file has support for using PCHs (if available)
+    off # this file doesn't use PCHs
+  ;
+
+feature pch-source : : free dependency ; # mypch.cpp
+feature pch-header : : free dependency ; # mypch.h[pp]
+feature pch-file   : : free dependency ; # mypch.pch
+
+class pch-generator : generator
+{
+    import property-set ;
+
+    rule __init__ ( * : * )
+    {
+        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
+    }
+
+    rule action-class ( )
+    {
+        return compile-action ;
+    }
+
+    rule run ( project name ? : property-set : sources * )
+    {
+        local r =
+          [ generator.run $(project) $(name) :
+            [
+              property-set.create
+                <pch-source>$(sources[2]) # mypch.cpp
+                [ $(property-set).raw ]
+            ] : $(sources)
+          ] ;
+
+        return
+          [ property-set.create
+              <pch-header>$(sources[1]) # mypch.h[pp]
+              <pch-file>$(r[2])         # mypch.pch
+          ] $(r) ;
+    }
+}

Added: boost-build/branches/upstream/current/tools/python-config.jam
===================================================================
--- boost-build/branches/upstream/current/tools/python-config.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/python-config.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,27 @@
+#~ Copyright 2005 Rene Rivera.
+#~ 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)
+
+# Automatic configuration for Python tools and librries. To use, just import this module.
+
+import os ;
+import toolset : using ;
+
+if [ os.name ] = NT
+{
+    for local R in 2.4 2.3 2.2
+    {
+        local python-path = [ W32_GETREG
+            "HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\$(R)\\InstallPath" ] ;
+        local python-version = $(R) ;
+        
+        if $(python-path)
+        {
+            if --debug-configuration in [ modules.peek : ARGV ]
+            {
+                ECHO "notice:" using python ":" $(python-version) ":" $(python-path) ;
+            }
+            using python : $(python-version) : $(python-path) ;
+        }
+    }
+}

Added: boost-build/branches/upstream/current/tools/python.jam
===================================================================
--- boost-build/branches/upstream/current/tools/python.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/python.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,547 @@
+# Copyright 2004 Vladimir Prus.
+# Distributed under the Boost Software License, Version 1.0. (See
+# accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+# Support for Python and the the Boost.Python library.
+#
+# This module defines
+#
+# - a project 'python' with a target 'python' in it, that corresponds
+#   to the python library
+#
+# - a main target rule 'python-extension' which can be used
+#   to build a python extension.
+#
+# Extensions that use Boost.Python must explicitly link to it.
+
+# Known problems: 
+# - the directory where extension is generated is different from V2
+# - the ext + py -> pyd_run_output generator is declared to take 
+#   SHARED_LIB, not PYTHON_EXTENSION. That's because we reuse 
+#   'lib-target-class', which creates SHARED_LIB explicitly.
+
+
+
+
+import type ;
+import testing ;
+import generators ;
+import project ;
+import errors ;
+import targets ;
+import "class" : new ;
+import os ;
+import common ;
+import toolset : flags ;
+
+# Make this module a project
+project.initialize $(__name__) ;
+project python ;
+
+# Save the project so that if 'init' is called several
+# times we define new targets in the python project,
+# not in whatever project we were called by.
+.project = [ project.current ] ;
+
+# Dynamic linker lib. Necessary to specify it explicitly 
+# on some platforms.
+lib dl ;  
+# This contains 'openpty' function need by python. Again, on
+# some system need to pass this to linker explicitly.
+lib util ;
+
+
+# Initializes the Python toolset.
+# - version -- the version of Python to use. Should be in Major.Minor format,
+#   for example 2.3
+# - 'root' -- the install root for Python
+# - 'includes' -- the include path to Python headers. If empty, will be
+#        guessed from 'root'
+# - 'libraries' -- the path to Python libraries. If empty, will be guessed
+#        from 'root'
+# - 'cygwin-condition' -- if specified, should be a set of properties which
+#   are present when we're building with cygwin gcc. 
+#   This argument is not used yet.
+#
+# Example usage:
+#
+#   using python 2.3 ;  # Use default root
+#   using python 2.3 : /usr/local ; # Root specified, include and lib paths
+#                                   # will be guessed
+#    
+rule init ( version ? : root ? : includes ? : libraries ? 
+    : cygwin-condition * )
+{
+    .configured = true ;
+    
+    project.push-current $(.project) ;
+               
+    if [ os.name ] = NT
+    {
+        init-nt $(version) : $(root) : $(includes) : $(libraries) : $(cygwin-condition) ;
+    }
+    else if [ os.name ] = MACOSX
+    {
+        init-mac $(version) : $(root) : $(includes) : $(libraries) ;
+    } 
+    else if [ modules.peek : UNIX ]
+    {
+        init-unix $(version) : $(root) : $(includes) : $(libraries) : $(cygwin-condition) ;
+    }
+    
+    project.pop-current ;
+}
+
+rule init-unix ( version ? : root ? : includes ? : libraries ? : condition * )
+{
+    root ?= /usr ;
+    includes ?= $(root)/include/python$(version) ;
+    libraries ?= $(root)/lib/python$(version)/config ;
+    
+    # Find the 'python' binary, which is used for testing.
+    # Look first in $(root)/bin, then in PATH.    
+    local interpreter = [ common.get-invocation-command 
+        python : python : : $(root)/bin : path-last ] ;
+    
+    if $(interpreter:D) != $(root)/bin
+    {            
+        ECHO "warning: was expecting Python interpreter in " $(root)/bin ;
+        ECHO "warning: found only in PATH:" $(interpreter) ;
+    }        
+                
+    if --debug-configuration in [ modules.peek : ARGV ]
+    {
+        ECHO "notice: Python include path is" $(includes) ;
+        ECHO "notice: Python library path is" $(libraries) ;
+        ECHO "notice: Python interpreter is" $(interpreter) ;                
+    }
+    
+    # If not specific condition is specified, set global value
+    # If condition is specified, set PYTHON on target. It will
+    # override the global value.
+    if ! $(condition)
+    {
+        PYTHON = $(interpreter) ;
+    }
+    else
+    {              
+        flags python.capture-output PYTHON $(condition:J=/) : $(interpreter) ;
+    }   
+
+    
+    local extra-libs ;
+    
+    switch [ os.name ]
+    {
+        case SOLARIS : extra-libs = dl      ;
+        case OSF :     extra-libs =         ;
+        case QNXTO :   extra-libs = util    ;
+        case * :       extra-libs = dl util ;
+    }
+    
+    # On Linux, we don't want to link either Boost.Python or
+    # Python extensions to libpython, so that when extensions
+    # loaded in the interpreter, the symbols in the interpreter
+    # are used. If we linked to libpython, we'd get duplicate
+    # symbols. So declare two targets -- one for headers and another
+    # for library.   
+    alias python_for_extensions
+                 :  
+                 : $(condition)
+                 :
+                 : <include>$(includes) 
+                 ;
+    
+    alias python
+                 : $(extra-libs)
+                 : $(condition)
+                 :
+                 : <include>$(includes) 
+                   <library-path>$(libraries)
+                   <find-shared-library>python$(version)
+                 ;
+    
+    # NOTES:
+    # - V1 had logic to force intel to use gcc's runtime.
+    #   Note sure why that was needed, with icc 8.0 extensions
+    #   built with intel are loaded by python without problems.
+    # - There was 'python-static-multithread' logic. Don't know
+    #   what it affected, so can't test.
+    
+    # TODO: need to figure out when the following code is needed:
+    # for builtin extensions only or in some other cases too.
+
+    
+    #    if [ modules.peek $(OS) ] = OSF
+    #    {
+    #        PYTHON_PROPERTIES += <*><*><linkflags>"-expect_unresolved 'Py*' -expect_unresolved '_Py*'" ;
+    #    }
+    #    else if [ modules.peek $(OS) ] = AIX
+    #    {
+    #        PYTHON_PROPERTIES 
+    #          += <*><*><linkflags>"-Wl,-bI:$(PYTHON_LIB_PATH)/python.exp"
+    #            <*><*><find-library>pthreads ;
+    #    }
+}
+
+rule init-mac ( version : root ? : includes ? : libraries ? )
+{
+    if ! $(root)
+    {
+        if [ GLOB /System/Library/Frameworks : Python.framework ]
+        {
+            root = /System/Library/Frameworks/Python.framework/Versions/$(version) ;
+        }
+        else
+        {
+            root = /Library/Frameworks/Python.framework/Versions/$(version) ;
+        }
+    }   
+
+    # includes ?= $(PYTHON_ROOT)/include/python$(PYTHON_VERSION) ;
+    includes ?= $(root)/include/python$(version) ;
+    libraries ?= $(root)/lib/python$(version)/config ;
+
+    # Find the 'python' binary, which is used for testing.
+    # Look first in $(root)/bin, then in PATH.
+    local interpreter = [ common.get-invocation-command 
+        python : python : : $(root)/bin : path-last ] ;
+    
+    # debug support
+    if --debug-configuration in [ modules.peek : ARGV ]
+    {
+        ECHO "notice: Python include path is" $(includes) ;
+        ECHO "notice: Python library path is" $(libraries) ;
+        ECHO "notice: Python interpreter is" $(interpreter) ;        
+    }
+    
+    flags python.capture-output PYTHON : $(interpreter) ;
+    
+    PYTHON_FRAMEWORK ?= $(root) ;
+    while $(PYTHON_FRAMEWORK:D=) && $(PYTHON_FRAMEWORK:D=) != Python.framework
+    {
+        PYTHON_FRAMEWORK = $(PYTHON_FRAMEWORK:D) ;
+    }
+    PYTHON_FRAMEWORK = $(PYTHON_FRAMEWORK:D)/Python ;
+
+    alias python_for_extensions
+      : 
+      :
+      : 
+      : <include>$(includes)
+      ;  
+    
+    alias python
+      :
+      : <os>MACOSX <toolset>darwin
+      :
+      : <include>$(includes) <framework>$(PYTHON_FRAMEWORK)
+      ;  
+}
+
+.alias-defined = ;
+rule init-nt ( version : root ? : includes ? : libraries ? : cygwin-condition ? )
+{
+#    PYTHON_PROPERTIES =
+#      boost-python-disable-borland
+#      select-nt-python-includes
+#      <runtime-link>dynamic
+#      <sysinclude>@boost
+#      <$(gcc-compilers)><*><define>USE_DL_IMPORT
+#      ;
+
+    if ! $(cygwin-condition)
+    {        
+        root ?= c:/tools/python ;
+        
+        local PATH = [ modules.peek : PATH ] ;
+        local PATH = [ modules.peek : Path ] ;        
+        
+        PYTHON_LIB_PATH ?= $(root)/libs [ GLOB $(root) : PCbuild ] ;
+        
+        PYTHON_INCLUDES ?= $(root)/include [ GLOB $(root) : PC ] ;
+        
+        PYTHON_DLL ?= [ GLOB $(PATH) $(Path) : python$(PYTHON_VERSION_NODOT).dll ] ;
+        PYTHON_DEBUG_DLL ?= [ GLOB $(PATH) $(Path) : python$(PYTHON_VERSION_NODOT)_d.dll ] ;
+        PYTHON_IMPORT_LIB ?= [ GLOB $(PYTHON_LIB_PATH) : libpython$(PYTHON_VERSION_NODOT).* ] ;
+        PYTHON_DEBUG_IMPORT_LIB ?= [ GLOB $(PYTHON_LIB_PATH) : libpython$(PYTHON_VERSION_NODOT).* ] ;        
+        
+        
+        local interpreter = [ common.get-invocation-command 
+            python : python : : $(root)/bin 
+                                          $(root)
+                                          $(root)/PCBuild
+                                            : path-last ] ;
+        
+        if --debug-configuration in [ modules.peek : ARGV ]
+        {
+            ECHO "notice: Python include path is" $(includes) ;
+            ECHO "notice: Python library path is" $(libraries) ;
+            ECHO "notice: Python interpreter is" $(interpreter) ;        
+        }
+        
+        flags python.capture-output PYTHON : $(interpreter) ;
+
+                
+        # This is mingw-specific V1 code. I don't yet understand
+        # why mingw must be specially-cased.
+        #local lib = $(PYTHON_IMPORT_LIB) ;
+        #if <define>BOOST_DEBUG_PYTHON in $(properties)
+        #{
+        #    lib = $(PYTHON_DEBUG_IMPORT_LIB) ;
+        #}
+        #lib ?= $(PYTHON_DLL) ;
+        #if <define>BOOST_DEBUG_PYTHON in $(properties)
+        #{
+        #    lib ?= $(PYTHON_DEBUG_DLL) ;
+        #}
+        #properties += <library-file>$(lib) ;
+        #}
+        
+        properties += <library-path>$(PYTHON_LIB_PATH) ;
+            
+        # msvc compilers auto-find the python library
+        # declare two alternatives -- one for msvc and another
+        # for the rest of the world
+        alias python 
+          :
+          : <toolset>msvc 
+          :
+          : <library-path>$(PYTHON_LIB_PATH) 
+            <include>$(PYTHON_INCLUDES)
+          ;
+                       
+        local lib = python$(PYTHON_VERSION_NODOT) ;
+        # TODO: don't support BOOST_DEBUG_PYTHON yet.        
+        #    if <define>BOOST_DEBUG_PYTHON in $(properties)
+        #    {
+        #            lib = python$(PYTHON_VERSION_NODOT)_d ;
+        #    }
+        
+        alias python
+          :
+          :
+          :
+          : <library-path>$(PYTHON_LIB_PATH)    
+            <include>$(PYTHON_INCLUDES)
+            <find-library>$(lib) ;                
+    }
+    else
+    {        
+        root ?= /usr ;  
+        if $(root) = /usr
+        {
+            CYGWIN_PYTHON_DLL_PATH ?= /bin ;
+        }
+        else
+        {
+            CYGWIN_PYTHON_DLL_PATH ?= $(root)/bin ;
+        }
+        CYGWIN_PYTHON_LIB_PATH ?= $(CYGWIN_PYTHON_ROOT)/lib/python$(version)/config ;
+      
+        CYGWIN_PYTHON_DEBUG_VERSION ?= $(version) ;
+        CYGWIN_PYTHON_DEBUG_ROOT ?= /usr/local/pydebug ;
+        CYGWIN_PYTHON_DEBUG_DLL_PATH ?= $(CYGWIN_PYTHON_DEBUG_ROOT)/bin ;
+        CYGWIN_PYTHON_DEBUG_LIB_PATH ?= $(CYGWIN_PYTHON_DEBUG_ROOT)/lib/python$(CYGWIN_PYTHON_DEBUG_VERSION)/config ;        
+        
+        local properties ;
+        # TODO: don't support BOOST_DEBUG_PYTHON yet.                
+        #if <define>BOOST_DEBUG_PYTHON in $(properties)
+        #{
+        #    properties += <library-path>$(CYGWIN_PYTHON_DEBUG_LIB_PATH) <find-library>python$(CYGWIN_PYTHON_DEBUG_VERSION).dll ;
+        #}
+        #else
+        #{
+        properties += <library-path>$(CYGWIN_PYTHON_LIB_PATH) 
+                      <find-library>python$(CYGWIN_PYTHON_VERSION).dll ;
+        
+        properties += <include>$(root)/include/python$(version) ;          
+          
+        #}
+        alias python
+          :
+          : $(cygwin-condition)
+          :
+          : $(properties)
+          ;        
+    }    
+    
+    if ! $(.alias-defined)
+    {
+        .alias-defined = true ;
+        alias python_for_extensions : python ;
+    }    
+}
+
+
+rule configured ( ) 
+{
+     return $(.configured) ;
+}
+        
+type.register PYTHON_EXTENSION : : SHARED_LIB ;
+# We can't give "dll" suffix to PYTHON_EXTENSION, because
+# we would not know what "a.dll" is: python extenstion or
+# ordinary library. Therefore, we specify only suffixes
+# used for generation of targets.
+type.set-generated-target-suffix PYTHON_EXTENSION : : so ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <os>NT : dll ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <os>CYGWIN : so ;
+
+# Unset 'lib' prefix for PYTHON_EXTENSION
+type.set-generated-target-prefix PYTHON_EXTENSION : : "" ;
+
+rule python-extension ( name : sources * : requirements * : default-build * : 
+                        usage-requirements * )
+{
+    requirements += <use>/python//python_for_extensions ;
+        
+    # TODO: handle the following V1 code
+    #if $(OS) = MACOSX && $(toolset) = darwin
+    #{
+    #    if <target-type>PYD in $(properties)
+    #    {
+    #        properties += <link-format>bundle ;
+    #    }
+    #    properties += <framework>$(PYTHON_FRAMEWORK) ;
+    #}    
+               
+#        <metrowerks><*><cxxflags>"-inline deferred" 
+#      <cwpro8><*><cxxflags>"-inline deferred"  # added for internal testing purposes
+#        <cxx><*><sysinclude>@boost/boost/compatibility/cpp_c_headers
+#         <define>BOOST_PYTHON_DYNAMIC_LIB
+    
+    
+#    PYTHON_PROPERTIES += 
+#        <sysinclude>@boost
+#          <stlport-iostream>on
+#            select-python-library
+    
+#      boost-python-disable-borland
+#      select-nt-python-includes
+#      <runtime-link>dynamic
+#      <sysinclude>@boost
+#      <$(gcc-compilers)><*><define>USE_DL_IMPORT
+#          <sysinclude>$(PYTHON_INCLUDES)
+            
+    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) ] 
+      ] ;
+}                            
+
+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 ;
+    
+    rule __init__ ( * : * )
+    {
+        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
+        self.composing = true ;
+    }
+        
+    rule run ( project name ? : property-set : sources * : multiple ? )
+    {       
+        local python ;
+        for local s in $(sources)
+        {
+            if [ $(s).type ] = PY
+            {
+                python = $(s) ;
+            }
+        }
+        
+        local extensions ;
+        for local s in $(sources)
+        {
+            if [ $(s).type ] = PYTHON_EXTENSION
+            {
+                extensions += $(s) ;
+            }
+        }
+                
+        local libs ;
+        for local s in $(sources)
+        {
+            if [ type.is-derived [ $(s).type ] LIB ] 
+              && ! $(s) in $(extensions)
+            {
+                libs += $(s) ;
+            }
+        }
+        
+        local new-sources ;
+        for local s in $(sources)
+        {
+            if [ type.is-derived [ $(s).type ] CPP ] 
+            {
+                local name = [ utility.basename [ $(s).name ] ] ;
+                if $(name) = [ utility.basename [ $(python).name ] ]
+                {
+                    name = $(name)_ext ;
+                }          
+                local extension = [ generators.construct $(project) $(name) :
+                  PYTHON_EXTENSION : $(property-set) : $(s) $(libs) ] ;
+
+                # The important part of usage requirements returned from
+                # PYTHON_EXTENSION genrator are xdll-path properties that
+                # will allow to find python extension at runtime.
+                property-set = [ $(property-set).add $(extension[1]) ] ;
+                # Ignore usage requirements. We're top-level generator and
+                # nobody is going to use us.
+                new-sources += $(extension[2-]) ;
+            }
+        }
+
+            
+        result = [ construct-result $(python) $(extensions) $(new-sources) 
+          : $(project) $(name) : $(property-set) ] ;        
+    }    
+}
+
+generators.register 
+  [ new python-test-generator python.capture-output : : RUN_PYD_OUTPUT ] ;
+
+generators.register-standard testing.expect-success 
+  : RUN_PYD_OUTPUT : RUN_PYD ;
+
+
+rule capture-output ( target : sources * : properties * )
+{
+    # Setup up proper DLL search path.
+    # Here, $(sources[1]) is python module and $(sources[2]) is
+    # DLL. Only $(sources[1]) is passed to testing.capture-output,
+    # so RUN_PATH variable on $(sources[2]) is not consulted. Move it
+    # over explicitly.
+    RUN_PATH on $(sources[1]) = [ on $(sources[2]) return $(RUN_PATH) ] ;
+    PYTHONPATH = [ on $(sources[2]) return $(LOCATE) ] ;
+    testing.capture-output $(target) : $(sources[1]) : $(properties) ;
+    local c = [ common.prepend-path-variable-command PYTHONPATH : $(PYTHONPATH) ] ;
+    LAUNCHER on $(target) = $(c) [ on $(target) return $(PYTHON) ] ;
+}
+
+rule bpl-test ( name : sources * : requirements * )
+{        
+    sources ?= $(name).py $(name).cpp ;
+    return [ testing.make-test 
+        run-pyd : $(sources) /boost/python//boost_python
+          : $(requirements) : $(name) ] ;
+}
+
+IMPORT $(__name__) : bpl-test : : bpl-test ;
+  
+  

Added: boost-build/branches/upstream/current/tools/qcc.jam
===================================================================
--- boost-build/branches/upstream/current/tools/qcc.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/qcc.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,228 @@
+#  Copyright (c) 2001 David Abrahams.
+#  Copyright (c) 2002-2003 Rene Rivera.
+#  Copyright (c) 2002-2003 Vladimir Prus.
+#
+#  Use, modification and distribution is subject to the Boost Software
+#  License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+import toolset : flags ;
+import property ;
+import generators ;
+import os ;
+import type ;
+import feature ;
+import "class" : new ;
+import set ;
+import common ;
+import errors ;
+
+feature.extend toolset : qcc ;
+
+import unix ;
+toolset.inherit-generators qcc : unix : unix.link unix.link.dll ;
+generators.override builtin.lib-generator : qcc.prebuilt ;
+toolset.inherit-flags qcc : unix ;
+toolset.inherit-rules qcc : unix ;
+
+
+
+# Make the "o" suffix used for qcc toolset on all
+# platforms
+type.set-generated-target-suffix OBJ : <toolset>qcc : o ;
+type.set-generated-target-suffix STATIC_LIB : <toolset>qcc : a ;
+
+
+# Initializes the qcc toolset for the given version.
+# If necessary, command may be used to specify where the compiler
+# is located.
+# The parameter 'options' is a space-delimited list of options, each
+# one being specified as <option-name>option-value. Valid option names
+# are: cxxflags, linkflags and linker-type. Accepted values for linker-type
+# are gnu and sun, gnu being the default.
+# Example:
+#   using qcc : 3.4 : : <cxxflags>foo <linkflags>bar <linker-type>sun ;
+rule init ( version ? : command * : options * )
+{
+    local condition = [ common.check-init-parameters qcc : version $(version) ] ;
+    
+    local command = [ common.get-invocation-command qcc : QCC : $(command) ] ;
+
+    common.handle-options qcc : $(condition) : $(command) : $(options) ;
+}
+
+
+generators.register-c-compiler qcc.compile.c++ : CPP : OBJ : <toolset>qcc ;
+generators.register-c-compiler qcc.compile.c : C : OBJ : <toolset>qcc ;
+generators.register-c-compiler qcc.compile.asm : ASM : OBJ : <toolset>qcc ;
+
+
+# Declare flags for compilation
+flags qcc.compile OPTIONS <debug-symbols>on : -gstabs+ ;
+
+# Declare flags and action for compilation
+flags qcc.compile OPTIONS <optimization>off : -O0 ;
+flags qcc.compile OPTIONS <optimization>speed : -O3 ;
+flags qcc.compile OPTIONS <optimization>space : -Os ;
+
+flags qcc.compile OPTIONS <inlining>off : -Wc,-fno-inline ;
+flags qcc.compile OPTIONS <inlining>on : -Wc,-Wno-inline ;
+flags qcc.compile OPTIONS <inlining>full : -Wc,-finline-functions -Wc,-Wno-inline ;
+
+flags qcc.compile OPTIONS <warnings>off : -w ;
+flags qcc.compile OPTIONS <warnings>all : -Wc,-Wall ;
+flags qcc.compile OPTIONS <warnings-as-errors>on : -Wc,-Werror ;
+
+flags qcc.compile OPTIONS <profiling>on : -p ;
+
+flags qcc.compile OPTIONS <cflags> ;
+flags qcc.compile.c++ OPTIONS <cxxflags> ;
+flags qcc.compile DEFINES <define> ;
+flags qcc.compile INCLUDES <include> ;
+
+flags qcc.compile OPTIONS <link>shared : -shared ;
+
+
+actions compile.c++
+{
+    "$(CONFIG_COMMAND)" -Wc,-ftemplate-depth-100 $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" 
+}
+
+actions compile.c
+{
+    "$(CONFIG_COMMAND)" $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" 
+}
+
+actions compile.asm
+{
+    "$(CONFIG_COMMAND)" $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" 
+}
+
+# The class which check that we don't try to use
+# the <runtime-link>static property while creating or using shared library,
+# since it's not supported by qcc/libc.
+class qcc-linking-generator : unix-linking-generator
+{
+    rule generated-targets ( sources + : property-set : project name ? )
+    {
+        if <runtime-link>static in [ $(property-set).raw ] 
+        {
+            local m ;
+            if [ id ] = "qcc.link.dll"
+            {
+                m = "on qcc, DLL can't be build with <runtime-link>static" ;
+            }         
+            if ! $(m) {                
+                for local s in $(sources)
+                {
+                    local type = [ $(s).type ] ;
+                    if $(type) &&  [ type.is-derived $(type) SHARED_LIB ] 
+                    {
+                        m = "on qcc, using DLLS together with the <runtime-link>static options is not possible " ;
+                    }                
+                }                
+            }
+            if $(m)
+            {
+                errors.user-error $(m) :
+                  "it's suggested to use <runtime-link>static together with the <link>static" ;
+            }
+            
+        }
+                        
+        return [ unix-linking-generator.generated-targets 
+            $(sources) : $(property-set) : $(project) $(name) ] ;
+    }    
+}
+
+generators.register [ new qcc-linking-generator qcc.link : LIB OBJ : EXE 
+    : <toolset>qcc ] ;
+
+generators.register [ new qcc-linking-generator qcc.link.dll : LIB OBJ : SHARED_LIB 
+    : <toolset>qcc ] ;
+
+generators.override qcc.prebuilt : builtin.prebuilt ;
+generators.override qcc.searched-lib-generator : searched-lib-generator ;
+
+
+
+# Declare flags for linking
+# First, the common flags
+flags qcc.link OPTIONS <debug-symbols>on : -gstabs+ ;
+flags qcc.link OPTIONS <profiling>on : -p ;
+flags qcc.link OPTIONS <linkflags> ;
+flags qcc.link LINKPATH <library-path> ;
+flags qcc.link FINDLIBS-ST <find-static-library> ;
+flags qcc.link FINDLIBS-SA <find-shared-library> ;
+flags qcc.link LIBRARIES <library-file> ;
+
+flags qcc.link FINDLIBS-SA : m ;
+
+# For <runtime-link>static we made sure there are no dynamic libraries 
+# in the link
+flags qcc.link OPTIONS <runtime-link>static : -static ;
+
+# Assuming this is just like with gcc.
+flags qcc.link RPATH : <dll-path> : unchecked ;
+flags qcc.link RPATH_LINK : <xdll-path> : unchecked ;
+
+
+
+# Declare actions for linking
+rule link ( targets * : sources * : properties * )
+{
+    SPACE on $(targets) = " " ;    
+    # Serialize execution of the 'link' action, since
+    # running N links in parallel is just slower.
+    # For now, serialize only qcc links, it might be a good
+    # idea to serialize all links.
+    JAM_SEMAPHORE on $(targets) = <s>qcc-link-semaphore ;
+}
+
+actions link bind LIBRARIES
+{
+    "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,-R$(SPACE)-Wl,"$(RPATH)" -Wl,-rpath-link$(SPACE)-Wl,"$(RPATH_LINK)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) $(OPTIONS) 
+}
+
+
+# Always remove archive and start again. Here's rationale from
+# Andre Hentz:
+# I had a file, say a1.c, that was included into liba.a. 
+# I moved a1.c to a2.c, updated my Jamfiles and rebuilt. 
+# My program was crashing with absurd errors. 
+# After some debugging I traced it back to the fact that a1.o was *still* 
+# in liba.a 
+RM = [ common.rm-command ] ;
+
+if [ os.name ] = NT
+{
+    RM = "if exist \"$(<[1])\" DEL \"$(<[1])\""  ;
+}
+
+
+# Declare action for creating static libraries
+# The 'r' letter means to add files to the archive with replacement
+# Since we remove archive, we don't care about replacement, but
+# there's no option "add without replacement".
+# The 'c' letter means suppresses warning in case the archive
+#   does not exists yet. That warning is produced only on
+#   some platforms, for whatever reasons.
+actions piecemeal archive 
+{
+    $(RM) "$(<)"
+    ar rc "$(<)" "$(>)"
+}
+
+
+rule link.dll ( targets * : sources * : properties * )
+{
+    SPACE on $(targets) = " " ;    
+    JAM_SEMAPHORE on $(targets) = <s>qcc-link-semaphore ;
+}
+
+# Differ from 'link' above only by -shared.
+actions link.dll bind LIBRARIES
+{
+    "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,-R$(SPACE)-Wl,"$(RPATH)" -o "$(<)" $(HAVE_SONAME)-Wl,-h$(SPACE)-Wl,$(<[1]:D=) -shared "$(>)"  "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) $(OPTIONS)  
+}
+

Modified: boost-build/branches/upstream/current/tools/qt.jam
===================================================================
--- boost-build/branches/upstream/current/tools/qt.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/qt.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,154 +1,17 @@
-#  Copyright (C) Vladimir Prus 2002. Permission to copy, use, modify, sell and
-#  distribute this software is granted provided this copyright notice appears in
-#  all copies. This software is provided "as is" without express or implied
-#  warranty, and with no claim as to its suitability for any purpose.
+#  Copyright (c) 2006 Vladimir Prus.
+#
+#  Use, modification and distribution is subject to 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 feature ;
-import errors ;
-import type ;
-import "class" : new ;
-import generators ;
-import project ;
-import toolset : flags ;
+#  Forwarning toolset file to Qt GUI library. Forwards to the toolset file
+#  for the current version of Qt.
 
-# Convert this module into a project, so that we can declare
-# targets here.
+import qt4 ;
 
-project.initialize $(__name__) ;
-project qt ;
-
-# Initialized the QT support module. The 'prefix' parameter 
-# tells where QT is installed. When not given, environmental
-# variable QTDIR should be set.
 rule init ( prefix ? )
 {
-    if ! $(prefix)
-    {
-        prefix = [ modules.peek : QTDIR ] ;
-        if ! $(prefix) 
-        {
-            errors.error 
-              "QT installation prefix not given and QTDIR variable is empty" ;
-        }        
-    }
- 
-    if $(.initialized)
-    {
-        if $(prefix) != $(.prefix)
-        {
-            errors.error 
-              "Attempt the reinitialize QT with different installation prefix" ;
-        }        
-    } 
-    else
-    {            
-        .initialized = true ;
-        .prefix = $(prefix) ;
-        
-        generators.register-standard qt.moc : H : CPP(moc_%) : <allow>qt ;    
-        
-        type.register UI : ui ;
-        type.register UIC_H : : H ;
-        
-        generators.register-standard qt.uic-h : UI : UIC_H : <allow>qt ;
-        
-        # The following generator is used to convert UI files to CPP
-        # It creates UIC_H from UI, and constructs CPP from UI/UIC_H
-        # In addition, it also returns UIC_H target, so that it can bee
-        # mocced.
-        class qt::uic-cpp-generator : generator
-        {
-            rule __init__ ( )
-            {
-                generator.__init__ qt.uic-cpp : UI UIC_H : CPP : <allow>qt ;
-            }
-                        
-            rule run ( project name ? : properties * : sources + :  multiple ? )
-            {
-                # Consider this:
-                #    obj test : test_a.cpp : <optimization>off ;
-                #
-                # This generator will somehow be called in this case, and,
-                # will fail -- which is okay. However, if there are <library>
-                # properties they will be converted to sources, so the size of 
-                # 'sources' will be more than 1. In this case, the base generator
-                # will just crash -- and that's not good. Just use a quick test
-                # here.
-                                
-                local result ;
-                if ! $(sources[2])
-                {    
-                    # Construct CPP as usual
-                    result = [ generator.run $(project) $(name) 
-                      : $(properties) : $(sources) : $(multiple) ] ;
-                    # If OK, add "UIC_H" target to the returned list
-                    if $(result)
-                    {
-                        local action = [ $(result[1]).action ] ;
-                        local sources = [ $(action).sources ] ;
-                        result += $(sources[2]) ;
-                    }
-                }
-                            
-                return $(result) ;
-            }               
-        }
-    
-        generators.register [ new qt::uic-cpp-generator ] ;
-        
-        # Finally, declare prebuilt target for QT library.
-        local usage-requirements = 
-             <include>$(.prefix)/include 
-             <dll-path>$(.prefix)/lib
-             <library-path>$(.prefix)/lib     
-             <allow>qt
-             ;  
-        lib qt : : <name>qt-mt <threading>multi : : $(usage-requirements) ;
-        lib qt : : <name>qt <threading>single : : $(usage-requirements) ;        
-    }
+    qt4.init $(prefix) ;
 }
 
-# Query the installation directory
-# This is needed in at least two scenarios
-# First, when re-using sources from the Qt-Tree.
-# Second, to "install" custom Qt plugins to the Qt-Tree.
-rule directory 
-{ 
-    return $(.prefix) ; 
-} 
 
-# -f forces moc to include the processed source file.
-# Without it, it would think that .qpp is not a header and would not
-# include it from the generated file.
-actions moc 
-{
-    $(.prefix)/bin/moc -f $(>) -o $(<)
-}
-
-space = " " ;
-
-# Sometimes it's required to make 'plugins' available during
-# uic invocation. To help with this we add paths to all dependency
-# libraries to uic commane line. The intention is that it's possible
-# to write
-#    
-#     exe a : ... a.ui ... : <uses>some_plugin ; 
-# 
-# and have everything work. We'd add quite a bunch of unrelated paths
-# but it won't hurt.
-flags qt.uic-h LIBRARY_PATH <xdll-path> ;
-actions uic-h
-{
-    $(.prefix)/bin/uic $(>) -o $(<) -L$(space)$(LIBRARY_PATH)
-}
-
-flags qt.uic-cpp LIBRARY_PATH <xdll-path> ;
-# The second target is uic-generated header name. It's placed in
-# build dir, but we want to include it using only basename.
-actions uic-cpp
-{
-    $(.prefix)/bin/uic $(>[1]) -i $(>[2]:D=) -o $(<) -L$(space)$(LIBRARY_PATH)
-}
-
-

Added: boost-build/branches/upstream/current/tools/qt3.jam
===================================================================
--- boost-build/branches/upstream/current/tools/qt3.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/qt3.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,213 @@
+#  Copyright (C) Vladimir Prus 2002. Permission to copy, use, modify, sell and
+#  distribute this software is granted provided this copyright notice appears in
+#  all copies. This software is provided "as is" without express or implied
+#  warranty, and with no claim as to its suitability for any purpose.
+
+#  Support for the Qt GUI library version 3
+#  (http://www.trolltech.com/products/qt3/index.html).
+#  For new developments, it's recommented to use Qt4 via the qt4 
+#  Boost.Build module.
+
+import modules ;
+import feature ;
+import errors ;
+import type ;
+import "class" : new ;
+import generators ;
+import project ;
+import toolset : flags ;
+
+# Convert this module into a project, so that we can declare
+# targets here.
+
+project.initialize $(__name__) ;
+project qt3 ;
+
+# Initialized the QT support module. The 'prefix' parameter 
+# tells where QT is installed. When not given, environmental
+# variable QTDIR should be set.
+rule init ( prefix ? )
+{
+    if ! $(prefix)
+    {
+        prefix = [ modules.peek : QTDIR ] ;
+        if ! $(prefix) 
+        {
+            errors.error 
+              "QT installation prefix not given and QTDIR variable is empty" ;
+        }        
+    }
+ 
+    if $(.initialized)
+    {
+        if $(prefix) != $(.prefix)
+        {
+            errors.error 
+              "Attempt the reinitialize QT with different installation prefix" ;
+        }        
+    } 
+    else
+    {            
+        .initialized = true ;
+        .prefix = $(prefix) ;
+        
+        generators.register-standard qt3.moc : H : CPP(moc_%) : <allow>qt3 ;
+        # Note: the OBJ target type here is fake, take a look
+        # at qt4.jam/uic-h-generator for explanations that
+        # apply in this case as well.
+        generators.register [ new moc-h-generator-qt3 
+            qt3.moc.cpp : MOCCABLE_CPP : OBJ : <allow>qt3 ] ;
+        
+        # The UI type is defined in types/qt.jam,
+        # and UIC_H is only used in qt.jam, but not in qt4.jam, so
+        # define it here.
+        type.register UIC_H : : H ;
+        
+        generators.register-standard qt3.uic-h : UI : UIC_H : <allow>qt3 ;
+        
+        # The following generator is used to convert UI files to CPP
+        # It creates UIC_H from UI, and constructs CPP from UI/UIC_H
+        # In addition, it also returns UIC_H target, so that it can bee
+        # mocced.
+        class qt::uic-cpp-generator : generator
+        {
+            rule __init__ ( )
+            {
+                generator.__init__ qt3.uic-cpp : UI UIC_H : CPP : <allow>qt3 ;
+            }
+                        
+            rule run ( project name ? : properties * : sources + )
+            {
+                # Consider this:
+                #    obj test : test_a.cpp : <optimization>off ;
+                #
+                # This generator will somehow be called in this case, and,
+                # will fail -- which is okay. However, if there are <library>
+                # properties they will be converted to sources, so the size of 
+                # 'sources' will be more than 1. In this case, the base generator
+                # will just crash -- and that's not good. Just use a quick test
+                # here.
+                                
+                local result ;
+                if ! $(sources[2])
+                {    
+                    # Construct CPP as usual
+                    result = [ generator.run $(project) $(name) 
+                      : $(properties) : $(sources) ] ;
+                    
+                    # If OK, process UIC_H with moc. It's pretty clear that
+                    # the object generated with UIC will have Q_OBJECT macro.
+                    if $(result)
+                    {
+                        local action = [ $(result[1]).action ] ;
+                        local sources = [ $(action).sources ] ;
+                        local mocced = [ generators.construct $(project) $(name)
+                          : CPP : $(properties) : $(sources[2]) ] ;
+                        result += $(mocced[2-]) ;
+                    }
+                }
+                            
+                return $(result) ;
+            }               
+        }
+    
+        generators.register [ new qt::uic-cpp-generator ] ;
+        
+        # Finally, declare prebuilt target for QT library.
+        local usage-requirements = 
+             <include>$(.prefix)/include 
+             <dll-path>$(.prefix)/lib
+             <library-path>$(.prefix)/lib     
+             <allow>qt3
+             ;  
+        lib qt : : <name>qt-mt <threading>multi : : $(usage-requirements) ;
+        lib qt : : <name>qt <threading>single : : $(usage-requirements) ;        
+    }
+}
+
+class moc-h-generator-qt3 : generator
+{
+    rule __init__ ( * : * )
+    {
+        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
+    }
+
+    rule run ( project name ? : property-set : sources * )
+    {       
+        if ! $(sources[2]) && [ $(sources[1]).type ] = MOCCABLE_CPP
+        {                              
+            name = [ $(sources[1]).name ] ;
+            name = $(name:B) ;
+            
+            local a = [ new action $(sources[1]) : qt3.moc.cpp :
+              $(property-set) ] ;
+            
+            local target = [ 
+              new file-target $(name) : MOC : $(project) : $(a) ] ;
+            
+            local r = [ virtual-target.register $(target) ] ; 
+                                  
+            # Since this generator will return H target, the linking generator
+            # won't use it at all, and won't set any dependency on it.
+            # However, we need to target to be seen by bjam, so that dependency
+            # from sources to this generated header is detected -- if jam does
+            # not know about this target, it won't do anything.
+            DEPENDS all : [ $(r).actualize ] ;
+            
+            return $(r) ;            
+        }        
+    }    
+}
+
+
+# Query the installation directory
+# This is needed in at least two scenarios
+# First, when re-using sources from the Qt-Tree.
+# Second, to "install" custom Qt plugins to the Qt-Tree.
+rule directory 
+{ 
+    return $(.prefix) ; 
+} 
+
+# -f forces moc to include the processed source file.
+# Without it, it would think that .qpp is not a header and would not
+# include it from the generated file.
+actions moc 
+{
+    $(.prefix)/bin/moc -f $(>) -o $(<)
+}
+
+# When moccing .cpp files, we don't need -f, otherwise generated
+# code will include .cpp and we'll get duplicated symbols.
+actions moc.cpp
+{
+    $(.prefix)/bin/moc $(>) -o $(<)
+}
+
+
+space = " " ;
+
+# Sometimes it's required to make 'plugins' available during
+# uic invocation. To help with this we add paths to all dependency
+# libraries to uic commane line. The intention is that it's possible
+# to write
+#    
+#     exe a : ... a.ui ... : <uses>some_plugin ; 
+# 
+# and have everything work. We'd add quite a bunch of unrelated paths
+# but it won't hurt.
+flags qt3.uic-h LIBRARY_PATH <xdll-path> ;
+actions uic-h
+{
+    $(.prefix)/bin/uic $(>) -o $(<) -L$(space)$(LIBRARY_PATH)
+}
+
+flags qt3.uic-cpp LIBRARY_PATH <xdll-path> ;
+# The second target is uic-generated header name. It's placed in
+# build dir, but we want to include it using only basename.
+actions uic-cpp
+{
+    $(.prefix)/bin/uic $(>[1]) -i $(>[2]:D=) -o $(<) -L$(space)$(LIBRARY_PATH)
+}
+
+

Added: boost-build/branches/upstream/current/tools/qt4.jam
===================================================================
--- boost-build/branches/upstream/current/tools/qt4.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/qt4.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,475 @@
+# Copyright 2002-2006 Vladimir Prus 
+# Copyright 2005 Alo Sarv
+# Copyright 2005-2006 Juergen Hunold
+#
+# Distributed under the Boost Software License, Version 1.0. (See
+# accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+# Qt4 library support module
+#
+# The module attempts to auto-detect QT installation location from QTDIR
+# environment variable; failing that, installation location can be passed as
+# argument:
+#
+# toolset.using qt4 : /usr/local/Trolltech/Qt-4.0.0 ;
+#
+# The module supports code generation from .ui and .qrc files, as well as
+# running the moc preprocessor on headers. Note that you must list all your
+# moc-able headers in sources.
+#
+# Example:
+#
+#     exe myapp : myapp.cpp myapp.h myapp.ui myapp.qrc 
+#                 /qt4//QtGui /qt4//QtNetwork ;
+#
+# It's also possible to run moc on cpp sources:
+#
+#   import cast ; 
+#
+#   exe myapp : myapp.cpp [ cast _ moccable-cpp : myapp.cpp ] /qt4//QtGui ;
+#
+# When moccing source file myapp.cpp you need to include "myapp.moc" from
+# myapp.cpp. When moccing .h files, the output of moc will be automatically
+# compiled and linked in, you don't need any includes.
+#
+# This is consistent with Qt guidelines:
+# http://doc.trolltech.com/4.0/moc.html
+
+import modules ;
+import feature ;
+import errors ;
+import type ;
+import "class" : new ;
+import generators ;
+import project ;
+import toolset : flags ;
+import os ;
+import virtual-target ;
+
+project.initialize $(__name__) ;
+project qt ;
+
+# Save the project so that we tolerate 'import + using' combo.
+.project = [ project.current ] ;
+
+
+# Initialized the QT support module. The 'prefix' parameter
+# tells where QT is installed. 
+rule init ( prefix )
+{
+    project.push-current $(.project) ;
+    
+    if $(.initialized)
+    {
+        if $(prefix) != $(.prefix)
+        {
+            errors.error
+              "Attempt the reinitialize QT with different installation prefix" ;
+        }
+    }
+    else
+    {
+        .initialized = true ;
+        .prefix = $(prefix) ;
+
+        # Generates cpp files from header files using "moc" tool
+        generators.register-standard qt4.moc : H : CPP(moc_%) : <allow>qt4 ;
+        
+        # The OBJ result type is a fake, 'H' will be really produces.
+        # See comments on the generator calss, defined below 
+        # the 'init' function.
+        generators.register [ new uic-h-generator qt4.uic-h : UI : OBJ
+            : <allow>qt4  ] ;
+        
+        # The OBJ result type is a fake here too.
+        generators.register [ new moc-h-generator 
+            qt4.moc.inc : MOCCABLE_CPP : OBJ : <allow>qt4 ] ;
+
+        generators.register [ new moc-inc-generator 
+            qt4.moc.inc : MOCCABLE_H : OBJ : <allow>qt4 ] ;
+
+        # Generates .cpp file from qrc file
+        generators.register-standard qt4.rcc : QRC : CPP(qrc_%) ;
+        
+        # Test for a buildable Qt.
+        if [ glob $(.prefix)/Jamroot ]
+        {
+            # Import all Qt Modules
+            local all-libraries = QtCore QtGui QtNetwork QtXml QtSql QtSvg QtOpenGL Qt3Support QtTest QtAssistantClient QtUiTools ;
+            for local l in $(all-libraries) 
+            {
+                alias $(l) 
+                  : $(.prefix)//$(l) 
+                  : 
+                  : 
+                  : <allow>qt4 
+                  ;
+                explicit $(l) ;
+            }
+        }
+        else
+        # Use pre-built Qt
+        {
+            local usage-requirements = 
+                <include>$(.prefix)/include 
+                <library-path>$(.prefix)/lib 
+                <dll-path>$(.prefix)/lib 
+                <threading>multi 
+                <allow>qt4
+                ;
+            
+            local suffix ;
+            if [ os.name ] = NT
+            {
+                # On NT, the libs have "4" suffix, and "d" suffix in debug builds
+                # Also, on NT we must link against qtmain library (for WinMain)
+                suffix_version = "4" ;
+                suffix_debug = "d" ;
+                lib qtmain : : <name>qtmain$(suffix_debug) <variant>debug ;
+                lib qtmain : : <name>qtmain <variant>release ;
+                main = qtmain ;
+            } 
+            else 
+            {
+                # On X11, debug versions of libs have "_debug" suffix
+                suffix_version = "" ;
+                suffix_debug = "_debug" ;
+            }
+            
+            lib QtCore : $(main)
+                : <name>QtCore$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <define>QT_CORE_LIB
+                  <define>QT_NO_DEBUG
+                  <include>$(.prefix)/include/QtCore 
+                  $(usage-requirements)
+                ;
+            lib QtCore : $(main)
+                : <name>QtCore$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements
+                  <define>QT_CORE_LIB
+                  <include>$(.prefix)/include/QtCore 
+                  $(usage-requirements) 
+                ;
+            
+            lib QtGui : QtCore
+                : <name>QtGui$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <define>QT_GUI_LIB
+                  <include>$(.prefix)/include/QtGui 
+                  <user-interface>gui  
+                ;
+            
+            lib QtGui : QtCore
+                : <name>QtGui$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements
+                  <define>QT_GUI_LIB
+                  <include>$(.prefix)/include/QtGui 
+                  <user-interface>gui  
+                ;
+            
+            lib QtNetwork : QtCore
+                : <name>QtNetwork$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <define>QT_NETWORK_LIB
+                  <include>$(.prefix)/include/QtNetwork  
+                ;
+            lib QtNetwork : QtCore
+                : <name>QtNetwork$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements
+                  <define>QT_NETWORK_LIB
+                  <include>$(.prefix)/include/QtNetwork  
+                ;
+            
+            lib QtSql : QtCore
+                : <name>QtSql$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <define>QT_SQL_LIB
+                  <include>$(.prefix)/include/QtSql 
+                ;
+            lib QtSql : QtCore
+                : <name>QtSql$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements
+                  <define>QT_SQL_LIB
+                  <include>$(.prefix)/include/QtSql 
+                ;
+            
+            lib QtXml : QtCore
+                : <name>QtXml$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <define>QT_XML_LIB
+                  <include>$(.prefix)/include/QtXml 
+                ;
+            lib QtXml : QtCore
+                : <name>QtXml$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements
+                  <define>QT_XML_LIB
+                  <include>$(.prefix)/include/QtXml 
+                ;
+            
+            lib Qt3Support : QtGui QtNetwork QtXml QtSql
+                : <name>Qt3Support$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <define>QT_QT3SUPPORT_LIB
+                  <define>QT3_SUPPORT
+                  <include>$(.prefix)/include/Qt3Support 
+                ;
+            lib Qt3Support : QtGui QtNetwork QtXml QtSql
+                : <name>Qt3Support$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements
+                  <define>QT_QT3SUPPORT_LIB
+                  <define>QT3_SUPPORT
+                  <include>$(.prefix)/include/Qt3Support 
+                ;
+            
+            # OpenGl Support
+            lib QtOpenGL : QtGui
+                : <name>QtOpenGL$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <define>QT_OPENGL_LIB
+                  <include>$(.prefix)/include/QtOpenGL 
+                ;
+            lib QtOpenGL : QtGui
+                : <name>QtOpenGL$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements
+                  <define>QT_OPENGL_LIB
+                  <include>$(.prefix)/include/QtOpenGL 
+                ;
+            
+            # SVG-Support (Qt 4.1)
+            lib QtSvg : QtXml QtOpenGL
+                : <name>QtSvg$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <define>QT_SVG_LIB
+                  <include>$(.prefix)/include/QtSvg 
+                ;
+            lib QtSvg : QtXml QtOpenGL
+                : <name>QtSvg$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements 
+                  <define>QT_SVG_LIB
+                  <include>$(.prefix)/include/QtSvg 
+                ;
+            
+            # Test-Support (Qt 4.1)
+            lib QtTest : QtCore
+                : <name>QtTest$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <include>$(.prefix)/include/QtTest 
+                ;
+            lib QtTest : QtCore
+                : <name>QtTest$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements
+                  <include>$(.prefix)/include/QtTest 
+                ;
+            
+            # AssistantClient Support
+            lib QtAssistantClient : QtGui
+                : <name>QtAssistantClient$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <include>$(.prefix)/include/QtAssistantClient 
+                ;
+            lib QtAssistantClient : QtGui
+                : <name>QtAssistantClient$(suffix_debug)$(suffix_version) <variant>debug
+                :
+                : # usage-requirements
+                  <include>$(.prefix)/include/QtAssistantClient 
+                ;
+            
+            # Support for dynamic Widgets (Qt 4.1)
+            lib QtUiTools : QtGui QtXml
+                : <name>QtUiTools$(suffix_version) <variant>release
+                :
+                : # usage-requirements
+                  <include>$(.prefix)/include/QtUiTools 
+                ;
+            lib QtUiTools : QtGui QtXml
+                : <name>QtUiTools$(suffix_debug)$(suffix_version) <variant>debug
+                :   
+                : # usage-requirements
+                  <include>$(.prefix)/include/QtUiTools 
+                ;
+        }
+    }
+    
+    project.pop-current ;
+}
+
+rule initialized ( )
+{
+    return $(.initialized) ;
+}
+
+
+
+# This custom generator is needed because it QT4, UI files are translated
+# only in H files, and no C++ files are created. Further, the H files
+# need not be passed via MOC. The header is used only via inclusion.
+# If we define standard UI -> H generator, Boost.Build will run
+# MOC on H, and the compile resulting cpp. It will give a warning, since
+# output from moc will be empty.
+#
+# This generator is declared with UI -> OBJ signature, so it's
+# invoked when linking generator tries to convert sources to OBJ,
+# but it produces target of type H. This is non-standard, but allowed.
+# That header won't be mocced.
+#
+class uic-h-generator : generator
+{
+    rule __init__ ( * : * )
+    {
+        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
+    }
+
+    rule run ( project name ? : property-set : sources * )
+    {       
+        if ! $(name)        
+        {
+            name = [ $(sources[0]).name ] ;
+            name = $(name:B) ;
+        }
+                
+        local a = [ new action $(sources[1]) : qt4.uic-h :
+          $(property-set) ] ;
+        
+        # The 'ui_' prefix is to match qmake's default behavior.
+        local target = [ 
+          new file-target ui_$(name) : H : $(project) : $(a) ] ;
+        
+        local r = [ virtual-target.register $(target) ] ;
+ 
+        # Since this generator will return H target, the linking generator
+        # won't use it at all, and won't set any dependency on it.
+        # However, we need to target to be seen by bjam, so that dependency
+        # from sources to this generated header is detected -- if jam does
+        # not know about this target, it won't do anything.
+        DEPENDS all : [ $(r).actualize ] ;
+        
+        return $(r) ;
+    }    
+}
+
+class moc-h-generator : generator
+{
+    rule __init__ ( * : * )
+    {
+        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
+    }
+
+    rule run ( project name ? : property-set : sources * )
+    {       
+        if ! $(sources[2]) && [ $(sources[1]).type ] = MOCCABLE_CPP
+        {                              
+            name = [ $(sources[0]).name ] ;
+            name = $(name:B) ;
+            
+            local a = [ new action $(sources[1]) : qt4.moc.inc :
+              $(property-set) ] ;
+            
+            local target = [ 
+              new file-target $(name) : MOC : $(project) : $(a) ] ;
+            
+            local r = [ virtual-target.register $(target) ] ;
+            
+            # Since this generator will return H target, the linking generator
+            # won't use it at all, and won't set any dependency on it.
+            # However, we need to target to be seen by bjam, so that dependency
+            # from sources to this generated header is detected -- if jam does
+            # not know about this target, it won't do anything.
+            DEPENDS all : [ $(r).actualize ] ;
+            
+            return $(r) ;
+        }        
+    }
+}
+class moc-inc-generator : generator
+{
+    rule __init__ ( * : * )
+    {
+        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
+    }
+
+    rule run ( project name ? : property-set : sources * )
+    {       
+        if ! $(sources[2]) && [ $(sources[1]).type ] = MOCCABLE_H
+        {                              
+            name = [ $(sources[0]).name ] ;
+            name = $(name:B) ;
+            
+            local a = [ new action $(sources[1]) : qt4.moc.inc :
+              $(property-set) ] ;
+            
+            local target = [ 
+              new file-target moc_$(name) : CPP : $(project) : $(a) ] ;
+            
+            # Since this generator will return H target, the linking generator
+            # won't use it at all, and won't set any dependency on it.
+            # However, we need to target to be seen by bjam, so that dependency
+            # from sources to this generated header is detected -- if jam does
+            # not know about this target, it won't do anything.
+            DEPENDS all : [ $(target).actualize ] ;
+            
+            return [ virtual-target.register $(target) ] ;
+        }        
+    }    
+}
+
+# Query the installation directory
+# This is needed in at least two scenarios
+# First, when re-using sources from the Qt-Tree.
+# Second, to "install" custom Qt plugins to the Qt-Tree.
+rule directory
+{
+    return $(.prefix) ;
+}
+
+# Get <include> and <defines> from current toolset
+flags qt4.moc INCLUDES <include> ;
+flags qt4.moc DEFINES  <define> ;
+
+# Processes headers to create Qt MetaObject information
+# Qt4-moc has its c++-parser, so pass INCLUDES and DEFINES.
+actions moc
+{
+    $(.prefix)/bin/moc -I$(INCLUDES) -D$(DEFINES) -f $(>) -o $(<)
+}
+
+# When moccing files for include only, we don't need -f, 
+# otherwise the generated code will include the .cpp 
+# and we'll get duplicated symbols.
+actions moc.inc
+{
+    $(.prefix)/bin/moc -I$(INCLUDES) -D$(DEFINES) $(>) -o $(<)
+}
+
+
+# Generates source files from resource files
+actions rcc
+{
+    $(.prefix)/bin/rcc $(>) -name $(>:B) -o $(<)
+}
+
+# Generates user-interface source from .ui files
+actions uic-h
+{
+    $(.prefix)/bin/uic $(>) -o $(<)
+}

Added: boost-build/branches/upstream/current/tools/quickbook-config.jam
===================================================================
--- boost-build/branches/upstream/current/tools/quickbook-config.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/quickbook-config.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,44 @@
+#~ Copyright 2005 Rene Rivera.
+#~ 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)
+
+# Automatic configuration for BoostBook tools. To use, just import this module.
+
+import os ;
+import toolset : using ;
+
+if [ os.name ] = NT
+{
+    local boost-dir = ;
+    for local R in snapshot cvs 1.33.0
+    {
+        boost-dir += [ W32_GETREG
+            "HKEY_LOCAL_MACHINE\\SOFTWARE\\Boost.org\\$(R)"
+            : "InstallRoot" ] ;
+    }
+    local quickbook-path = [ GLOB "$(boost-dir)\\bin" "\\Boost\\bin" : quickbook.exe ] ;
+    quickbook-path = $(quickbook-path[1]) ;
+    
+    if $(quickbook-path)
+    {
+        if --debug-configuration in [ modules.peek : ARGV ]
+        {
+            ECHO "notice:" using quickbook ":" $(quickbook-path) ;
+        }
+        using quickbook : $(quickbook-path) ;
+    }
+}
+else
+{
+    local quickbook-path = [ GLOB "/usr/local/bin" "/usr/bin" "/opt/bin" : quickbook ] ;
+    quickbook-path = $(quickbook-path[1]) ;
+    
+    if $(quickbook-path)
+    {
+        if --debug-configuration in [ modules.peek : ARGV ]
+        {
+            ECHO "notice:" using quickbook ":" $(quickbook-path) ;
+        }
+        using quickbook : $(quickbook-path) ;
+    }
+}

Added: boost-build/branches/upstream/current/tools/quickbook.jam
===================================================================
--- boost-build/branches/upstream/current/tools/quickbook.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/quickbook.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,298 @@
+#
+#   Copyright (c) 2005 João Abecasis
+#   Copyright (c) 2005 Vladimir Prus
+#
+#   Distributed under the Boost Software License, Version 1.0. (See
+#   accompanying file LICENSE_1_0.txt or copy at
+#   http://www.boost.org/LICENSE_1_0.txt)
+#
+
+# This toolset defines a generator to translate QuickBook to BoostBook. It can
+# be used to generate nice (!) user documentation in different formats
+# (pdf/html/...), from a single text file with simple markup.
+#
+# The toolset defines the QUICKBOOK type (file extension 'qbk') and
+# a QUICKBOOK to XML (BOOSTBOOK) generator.
+#
+#
+#   ===========================================================================
+#   Q & A
+#   ===========================================================================
+#
+#   If you don't know what this is all about, some Q & A will hopefully get you
+#   up to speed with QuickBook and this toolset.
+#
+#
+#   What is QuickBook ?
+#
+#       QuickBook is a WikiWiki style documentation tool geared towards C++
+#       documentation using simple rules and markup for simple formatting tasks.
+#       QuickBook extends the WikiWiki concept. Like the WikiWiki, QuickBook
+#       documents are simple text files. A single QuickBook document can
+#       generate a fully linked set of nice HTML and PostScript/PDF documents
+#       complete with images and syntax-colorized source code.
+#
+#
+#   Where can I get QuickBook ?
+#
+#       Quickbook can be found in Boost's repository, under the tools/quickbook
+#       directory it was added there on Jan 2005, some time after the release of
+#       Boost v1.32.0 and will hopefully be an integral part of the Boost
+#       distribution starting from v1.33.
+#
+#       Here's a link to the CVS repository:
+#           http://cvs.sourceforge.net/viewcvs.py/boost/boost/tools/quickbook/
+#
+#       And to CVS version of QuickBook's QuickBook-generated docs:
+#           http://cvs.sourceforge.net/viewcvs.py/*checkout*/boost/boost/tools/quickbook/doc/html/index.html
+#
+#
+#   How do I use QuickBook and this toolset in my projects ?
+#
+#       The minimal example is:
+#
+#           using boostbook ;
+#           import quickbook ;
+#
+#           boostbook my_docs : my_docs_source.qbk ;
+#
+#       where my_docs is a target name and my_docs_source.qbk is a QuickBook
+#       file. The documentation format to be generated is determined by the
+#       boostbook toolset. By default html documentation should be generated,
+#       but you should check BoostBook's docs to be sure.
+#
+#
+#   What do I need ?
+#
+#       You should start by setting up the BoostBook toolset. Please refer to
+#       boostbook.jam and the BoostBook documentation for information on how to
+#       do this.
+#
+#       A QuickBook executable is also needed. The toolset will generate this
+#       executable if it can find the QuickBook sources. The following
+#       directories will be searched:
+#
+#           BOOST_ROOT/tools/quickbook/
+#           BOOST_BUILD_PATH/../../quickbook/
+#
+#       (BOOST_ROOT and BOOST_BUILD_PATH are environment variables)
+#
+#       If QuickBook sources are not found the toolset will then try to use
+#       the shell command 'quickbook'.
+#
+#
+#   How do I provide a custom QuickBook executable ?
+#
+#       You may put the following in your user-config.jam or site-config.jam:
+#
+#           using quickbook : /path/to/quickbook ;
+#
+#       or, if 'quickbook' can be found in your PATH,
+#
+#           using quickbook : quickbook ;
+#
+#
+#   For convenience three alternatives are tried to get a QuickBook executable:
+#
+#       1.  If the user points us to the a QuickBook executable, that is used.
+#
+#       2.  Otherwise, we search for the QuickBook sources and compile QuickBook
+#           using the default toolset.
+#
+#       3.  As a last resort, we rely on the shell for finding 'quickbook'.
+#
+
+import boostbook ;
+import "class" : new ;
+import feature ;
+import generators ;
+import toolset ;
+import type ;
+import scanner ;
+
+# The one and only QUICKBOOK type!
+type.register QUICKBOOK : qbk ;
+
+# <quickbook-binary> shell command to run QuickBook
+# <quickbook-binary-dependencies> targets to build QuickBook from sources.
+feature.feature <quickbook-binary> : : free ;
+feature.feature <quickbook-binary-dependencies> : : free dependency ;
+
+# quickbook-binary-generator handles generation of the QuickBook executable, by
+# marking it as a dependency for QuickBook docs.
+#
+# If the user supplied the QuickBook command that will be used.
+#
+# Otherwise we search some sensible places for the QuickBook sources and
+# compile from scratch using the default toolset.
+#
+# As a last resort we rely on the shell to find 'quickbook'.
+class quickbook-binary-generator : generator
+{
+    import common modules path targets build-system ;
+
+    rule run ( project name ? : property-set : sources * : multiple ? )
+    {
+        # QuickBook invocation command and dependencies.
+        local quickbook-binary = [ modules.peek quickbook : .command ] ;
+        local quickbook-binary-dependencies ;
+
+        if $(quickbook-binary)
+        {
+            # Use user-supplied command.
+            quickbook-binary = [ common.get-invocation-command quickbook : quickbook : $(quickbook-binary) ] ;
+        }
+        else
+        {
+            # Search for QuickBook sources in sensible places, like
+            #   $(BOOST_ROOT)/tools/quickbook
+            #   $(BOOST_BUILD_PATH)/../../quickbook
+
+            # And build quickbook executable from sources.
+
+            local boost-root = [ modules.peek : BOOST_ROOT ] ;
+            local boost-build-path = [ build-system.location ] ;
+
+            local quickbook-dir ;
+
+            if $(boost-root)
+            {
+                quickbook-dir += [ path.join $(boost-root) tools ] ;
+            }
+
+            if $(boost-build-path)
+            {
+                quickbook-dir += $(boost-build-path)/../.. ;
+            }
+
+            quickbook-dir = [ path.glob $(quickbook-dir) : quickbook ] ;
+
+            # If the QuickBook source directory was found, mark its main target
+            # as a dependency for the current project. Otherwise, try to find
+            # 'quickbook' in user's PATH
+            if $(quickbook-dir)
+            {
+                quickbook-dir = [ path.make $(quickbook-dir[1]) ] ;
+
+                # Get the main-target in QuickBook directory.
+                local quickbook-main-target = [ targets.resolve-reference $(quickbook-dir) : $(project) ] ;
+
+                # The first element are actual targets, the second are
+                # properties found in target-id. We don't care about these since
+                # we've passed the id ourselves.
+                quickbook-main-target =
+                    [ $(quickbook-main-target[1]).main-target quickbook ] ;
+
+                quickbook-binary-dependencies =
+                    [ $(quickbook-main-target).generate $(property-set) ] ;
+
+                # Ignore usage-requirements returned as first element.
+                quickbook-binary-dependencies = $(quickbook-binary-dependencies[2-]) ;
+
+                # Some toolsets generate extra targets (e.g. RSP).
+                # We must mark all targets as dependencies for the project, but
+                # we'll only use the EXE target for quickbook-to-boostbook
+                # translation.
+                for local target in $(quickbook-binary-dependencies)
+                {
+                    if [ $(target).type ] = EXE
+                    {
+                        quickbook-binary = 
+                            [ path.native 
+                                [ path.join
+                                    [ $(target).path ]
+                                    [ $(target).name ]
+                                ]
+                            ] ;
+                    }
+                }
+            }
+            else
+            {
+                ECHO "QuickBook warning: The path to the quickbook executable was" ;
+                ECHO "  not provided. Additionally, couldn't find QuickBook" ;
+                ECHO "  sources searching in" ;
+                ECHO "    * BOOST_ROOT/tools/quickbook" ;
+                ECHO "    * BOOST_BUILD_PATH/../../quickbook" ;
+                ECHO "  Will now try to find a precompiled executable by searching" ;
+                ECHO "  the PATH for 'quickbook'." ;
+                ECHO "  To disable this warning in the future, or to completely" ;
+                ECHO "  avoid compilation of quickbook, you can explicitly set the" ;
+                ECHO "  path to a quickbook executable command in user-config.jam" ;
+                ECHO "  or site-config.jam with the call" ;
+                ECHO "    using quickbook : /path/to/quickbook ;" ;
+
+                # As a last resort, search for 'quickbook' command in path.
+                # Note that even if the 'quickbook' command is not found,
+                # get-invocation-command will still return 'quickbook' and might
+                # generate an error while generating the virtual-target.
+
+                quickbook-binary = [ common.get-invocation-command quickbook : quickbook ] ;
+            }
+        }
+
+        # Add $(quickbook-binary-dependencies) as a dependency of the current project
+        # and set it as the <quickbook-binary> feature for the
+        # quickbook-to-boostbook rule, below.
+        property-set = [ $(property-set).add-raw
+            <dependency>$(quickbook-binary-dependencies)
+            <quickbook-binary>$(quickbook-binary)
+            <quickbook-binary-dependencies>$(quickbook-binary-dependencies)
+        ] ;
+
+        return [ generator.run $(project) $(name) : $(property-set) : $(sources) : $(multiple) ] ;
+    }
+}
+
+# Define a scanner for tracking QBK include dependencies
+class qbk-scanner : common-scanner
+{
+    rule pattern ( )
+    {
+        return "\\[include[ \t]+([^]]+)\\]" 
+        "\\[include:[a-zA-Z0-9_]+[ \t]+([^]]+)\\]" ;
+    }
+}
+
+scanner.register qbk-scanner : include ;
+
+type.set-scanner QUICKBOOK : qbk-scanner ;
+
+# Initialization of toolset.
+#
+# Parameters:
+#   command ?    -> path to QuickBook executable.
+#
+# When command is not supplied toolset will search for QuickBook directory and
+# compile the executable from source. If that fails we still search the path for
+# 'quickbook'.
+rule init (
+        command ?   # path to QuickBook executable.
+    )
+{
+    if ! $(.initialized)
+    {
+        .initialized = true ;
+        .command = $(command) ;
+    }
+}
+
+generators.register [ new quickbook-binary-generator quickbook.quickbook-to-boostbook : QUICKBOOK : XML ] ;
+
+# <quickbook-binary> shell command to run QuickBook
+# <quickbook-binary-dependencies> targets to build QuickBook from sources.
+toolset.flags quickbook.quickbook-to-boostbook QB-COMMAND       <quickbook-binary> ;
+toolset.flags quickbook.quickbook-to-boostbook QB-DEPENDENCIES  <quickbook-binary-dependencies> ;
+
+rule quickbook-to-boostbook ( target : source : properties * )
+{
+    # Signal dependency of quickbook sources on <quickbook-binary-dependencies>
+    # upon invocation of quickbook-to-boostbook.
+    DEPENDS $(target) : [ on $(target) return $(QB-DEPENDENCIES) ] ;
+}
+
+actions quickbook-to-boostbook
+{
+    $(QB-COMMAND) --output-file=$(1) $(2)  
+}
+

Modified: boost-build/branches/upstream/current/tools/rc.jam
===================================================================
--- boost-build/branches/upstream/current/tools/rc.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/rc.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -2,51 +2,77 @@
 #  distribute this software is granted provided this copyright notice appears in
 #  all copies. This software is provided "as is" without express or implied
 #  warranty, and with no claim as to its suitability for any purpose.
+#  
+#  Copyright (c) 2006 Rene Rivera.
+#
+#  Use, modification and distribution is subject to the Boost Software
+#  License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+#  http://www.boost.org/LICENSE_1_0.txt)
 
 import type ;
 import generators ;
 import feature ;
 import errors ;
 import scanner ;
+import toolset : flags ;
 
+if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
+{
+    .debug-configuration = true ;
+}
+
 type.register RC : rc ;
 
 rule init ( )
 {
 }
 
-rule resource-compile ( target : sources * : properties * )
+# Configures a new resource compilation command specific to a condition,
+# usually a toolset selection condition. The possible options are:
+#
+#     * <rc-type>(rc|windres) - Indicates the type of options the command
+#       accepts.
+#
+# Even though the arguments are all optional, only when a command, condition,
+# and at minimum the rc-type option are given will the command be configured.
+# This is so that callers don't have to check auto-configuration values
+# before calling this. And still get the functionality of build failures when
+# the resource compiler can't be found.
+#
+rule configure ( command ? : condition ? : options * )
 {
-    local OS = [ feature.get-values <os> : $(properties) ] ;
-    switch $(OS)
+    local rc-type = [ feature.get-values <rc-type> : $(options) ] ;
+
+    if $(command) && $(condition) && $(rc-type)
     {
-        case "NT" :
-            resource-compile-nt $(target) : $(sources[1]) ;
-        case "CYGWIN" :
-            resource-compile-cygwin $(target) : $(sources[1]) ;
-        case "FREEBSD" :
-            create-empty-object $(target) : $(sources[1]) ;
-        case "SOLARIS" :
-            create-empty-object $(target) : $(sources[1]) ;
-        case "LINUX" :
-            create-empty-object $(target) : $(sources[1]) ;
-        case "*" :
-            errors.error "Cannot process RC files for OS=$(OS)" ;
+        flags rc.compile.resource .RC $(condition) : $(command) ;
+        flags rc.compile.resource .RC_TYPE $(condition) : $(rc-type:L) ;
+        flags rc.compile.resource DEFINES <define> ;
+        flags rc.compile.resource INCLUDES <include> ;
+        if $(.debug-configuration)
+        {
+            ECHO notice: using rc compiler :: $(condition) :: $(command) ;
+        }
     }
 }
 
+rule compile.resource ( target : sources * : properties * )
+{
+    local rc-type = [ on $(target) return $(.RC_TYPE) ] ;
+    compile.resource.$(rc-type) $(target) : $(sources[1]) ;
+}
 
-actions quietly resource-compile-nt
+actions compile.resource.rc
 {
-    rc /i "$(>:D)" /i "$(<:D)" /fo "$(<)" "$(>)"
+    "$(.RC)" -l 0x409 "-U$(UNDEFS)" "-D$(DEFINES)" -I"$(>:D)" -I"$(<:D)" -I"$(INCLUDES)" -fo "$(<)" "$(>)"
 }
 
-actions quietly resource-compile-cygwin
+actions compile.resource.windres
 {
-    windres --include-dir "$(>:D)" -o "$(<)" -i "$(>)"
+    "$(.RC)" "-U$(UNDEFS)" "-D$(DEFINES)" -I"$(>:D)" -I"$(<:D)" -I"$(INCLUDES)" -o "$(<)" -i "$(>)"
 }
 
-actions quietly create-empty-object
+actions quietly compile.resource.null
 {
     as /dev/null -o "$(<)"
 }
@@ -58,7 +84,9 @@
 # The reason we generate OBJ and not RES, is that gcc does not
 # seem to like RES files, but works OK with OBJ.
 # See http://article.gmane.org/gmane.comp.lib.boost.build/5643/
-generators.register-standard rc.resource-compile : RC : OBJ(%_res) ;
+#
+# Using 'register-c-compiler' adds the build directory to INCLUDES
+generators.register-c-compiler rc.compile.resource : RC : OBJ(%_res) ;
 
 # Register scanner for resources
 class res-scanner : scanner 
@@ -125,7 +153,3 @@
 
 scanner.register res-scanner : include ;
 type.set-scanner RC : res-scanner ;
-
-
-
-

Modified: boost-build/branches/upstream/current/tools/stage.jam
===================================================================
--- boost-build/branches/upstream/current/tools/stage.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/stage.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -3,49 +3,8 @@
 #  all copies. This software is provided "as is" without express or implied
 #  warranty, and with no claim as to its suitability for any purpose.
 
-#  This module defines the 'stage' rule, used to copy a set of targets to
+#  This module defines the 'install' rule, used to copy a set of targets to
 #  a single location
-#
-#  Typical usage:
-#
-#  stage dist : hello_world : <location>/usr/bin ;
-#
-#  The source target will be copied to the specified location. Some targets will
-#  we specially processed. In particular, binaries will be relinked. Free properties
-#  from stage dist will be included to properties used for relinking. For example
-#
-#  stage dist : hello_world : <location>/usr/bin <dll-path>/opt/lib ;
-# 
-#  will cause 'hello_world' to be relinked to the new location, and <dll-path>
-#  property will be added when relinking.
-#
-#  Two properties specifically control 'stage' rule.
-# 
-#  - <location> tells where to put targets. If not specified, directory
-#    with the same name as stage name will be used.
-#  
-#  - <name> tells the new name of the staged target. In this case, only
-#    one target can be specified in sources.
-#
-#  The stage rule can also traverse dependencies, for example to install a
-#  program an all required libraries. Two properties affect this.
-#
-#  - <traverse-dependencies>on tells that dependencies should be traversed.
-#    For each target in 'stage' sources, all sources to that target and all
-#    dependency properties are traversed. Sources and dependecy properties of
-#    those target are traversed recursively.
-#
-#  - <include-type>SOME_TYPE tells that targets of SOME_TYPE or a type derived
-#    from SOME_TYPE, should be included.
-#    If no such property is specified, then all found targets will be staged.
-#    Otherwise, only targets with types mentioned in <include-type> property
-#    will be included.
-#    
-#    Example usage::
-#
-#      stage dist : hello_world : 
-#        <traverse-dependencies>on <include-type>EXE <include-type>SHARED_LIB ;
-#
 
 import targets ;
 import "class" : new ;
@@ -57,13 +16,18 @@
 import generators ;
 import feature ;
 import project ;
+import property-set ;
+import virtual-target ;
+import path ;
 
-feature.feature <traverse-dependencies> : off on : incidental ;
-feature.feature <include-type> : : free incidental ;
+feature.feature <install-dependencies> : off on : incidental ;
+feature.feature <install-type> : : free incidental ;
+feature.feature <install-source-root> : : free path  ;
+feature.feature <so-version> : : free incidental ;
 
-class stage-target-class : basic-target
+class install-target-class : basic-target
 {
-    import feature project type errors generators path ;    
+    import feature project type errors generators path stage ;    
     import "class" : new ;
     
     rule __init__ ( name-and-dir : project : sources * : requirements * : default-build * )
@@ -85,140 +49,180 @@
         
         return $(property-set) ;
     }
-        
-    # Constructs the targets of types for which a type exists
-    # with the form STAGED_*.
-    rule construct-special-targets ( property-set : source : type )
+            
+    # Takes a target that is installed and property set which is
+    # used when installing.
+    rule adjust-properties ( target : build-property-set )
     {
-        local targets = [ generators.construct $(self.project) : $(type) :
-            $(property-set) : $(source) : * ] ;
-
-        return $(targets) ;
-    }
-    
-    # Constructs the targets of types for which there is no STAGED_* type.
-    rule construct-regular-targets ( property-set : source )
-    {
-        local n = [ $(source).name ] ;
-        if $(name)
+        local ps-raw ;
+        local a = [ $(target).action ] ;       
+        if $(a)
         {
-            n = $(name) ;
+            local ps = [ $(a).properties ] ;
+            ps-raw = [ $(ps).raw ] ;
+                        
+            # Unless <hardcode-dll-paths>true is in properties, which can
+            # happen only if the user has explicitly requested it, nuke all
+            # <dll-path> properties                                  
+            if [ $(property-set).get <hardcode-dll-paths> ] != true
+            {
+                ps-raw = [ property.change $(ps-raw) : <dll-path> ] ;
+            }
+            
+            # If any <dll-path> properties were specified for installing,
+            # add them.
+            local l = [ $(build-property-set).get <dll-path> ] ;
+            ps-raw += $(l:G=<dll-path>) ;
+            
+            # Also copy <linkflags> feature from current build
+            # set, to be used for relinking.
+            local l = [ $(build-property-set).get <linkflags> ] ;
+            ps-raw += $(l:G=<linkflags>) ;            
         }
         
-        targets = [ new file-target $(n:D=) : [ $(source).type ] 
-            : $(self.project) ] ;
-        local a = [ $(source).action ] ;
-        local new-a ;
-        if $(a)
-        {                    
-            # Copy the properties of original target. They, in particular
-            # can affect the suffix of the target.
-            new-a = [ new action $(targets) : $(source) : common.copy : [ $(a).properties ] ] ;
-        }
+        # Remove the <tag> feature on original targets.
+        ps-raw = [ property.change $(ps-raw) : <tag> ] ;
+        # And <location>. If stage target has another stage target
+        # in sources, then we'll get virtual targets with <location>
+        # property set.
+        ps-raw = [ property.change $(ps-raw) : <location> ] ;
+        
+        
+        local d = [ $(build-property-set).get <dependency> ] ;
+        ps-raw += $(d:G=<dependency>) ;
+        
+        local d = [ $(build-property-set).get <location> ] ;
+        ps-raw += $(d:G=<location>) ;
+        
+        local d = [ $(build-property-set).get <install-source-root> ] ;
+        # Make the path absolute: we'll use it to compute relative
+        # paths and making the path absolute will help.
+        if $(d)
+        {            
+            d = [ path.root $(d) [ path.pwd ] ] ;
+            ps-raw += $(d:G=<install-source-root>) ;
+        }        
+        
+        if $(ps-raw)
+        {
+            return [ property-set.create $(ps-raw) ]  ;
+        }        
         else
         {
-            new-a = [ new action $(targets) : $(source) : common.copy ] ;
-        }                                
-        $(targets).suffix [ $(source).suffix ] ;
-        $(targets).action $(new-a) ;
-    
-        return $(targets) ;
+            return [ property-set.empty ] ;
+        }        
     }
     
-    rule construct ( source-targets * : property-set )
-    {        
-        local name = [ $(property-set).get <name> ] ;
-        if $(name) && $(source-targets[2])
-        {
-            errors.error "<name> property cannot be specified when staging several targets" ;
-        }
         
-        if [ $(property-set).get <traverse-dependencies> ] = "on"
+    rule construct ( name : source-targets * : property-set )
+    {                
+        source-targets = [ 
+          targets-to-stage $(source-targets) : $(property-set) ] ;
+        
+        property-set = [ update-location $(property-set) ] ;          
+        
+        local ename = [ $(property-set).get <name> ] ;              
+                
+        if $(ename) && $(source-targets[2])
         {
-            source-targets = [ collect-targets $(source-targets) 
-              : [ $(property-set).get <include-type> ] ] ;
+            errors.error 
+              "When <name> property is used in 'install', only one source is allowed" ;
         }
-
-
-        property-set = [ update-location $(property-set) ] ;          
-        local include-types = [ $(property-set).get <include-type> ] ;
         
+                                       
         local result ;
         for local i in $(source-targets)
-        {
-            # Intermediate targets are those with "unrequested" types.
-            # For example, given "exe a : a.cpp" we can end with RSP
-            # target on windows, and it will be marked as "intermediate".
-            # By default, we don't install such targets.
-            # If specific list of installable types is given, we don't
-            # care if target is intermediate or not.
-            if ! [ $(i).intermediate ] && [ $(i).type ] != SEARCHED_LIB
+        {            
+            local staged-targets ;
+                        
+            local new-properties = 
+              [ adjust-properties $(i) : $(property-set) ] ;
+                                    
+            # See if something special should be done when staging this
+            # type. It is indicated by presense of special "staged" type            
+            local t = [ $(i).type ] ;            
+            if $(t) && [ type.registered INSTALLED_$(t) ]
             {
-                local staged-targets ;
-                
-                local t = [ $(i).type ] ;
-                
-                # See if something special should be done when staging this
-                # type. It is indicated by presense of special "staged" type            
-                if $(t) && [ type.registered STAGED_$(t) ]
+                if $(ename)
                 {
-                    staged-targets = [ construct-special-targets $(property-set) : $(i) : STAGED_$(t) ] ;
+                    error.error "In 'install': <name> property specified with target that requires relinking" ;
                 }
-                else             
-                {                
-                    staged-targets = [ construct-regular-targets $(property-set) : $(i) ] ;
-                }
-                
-                if ! $(staged-targets)
-                {                    
-                    errors.error "Unable to generate staged version of " [ $(source).str ] ;
-                }                
-
-                for t in [ select-included $(staged-targets) : $(include-types) ]
+                else
                 {
-                    local a = [ $(t).action ] ;
-                    {
-                        for local s in [ $(a).targets ]
-                        {
-                            $(s).set-path [ $(property-set).get <location> ] ;
-                        }                        
-                    }
-                    
-                    result += [ virtual-target.register $(t) ] ;          
-                }            
+                    local targets = [ generators.construct $(self.project) $(name) : 
+                      INSTALLED_$(t) : $(new-properties) : $(i) : * ] ;
+                    staged-targets += $(targets[2-]) ;                                
+                }                                                
+            }
+            else             
+            {                
+                staged-targets = [ stage.copy-file $(self.project) $(ename)
+                  : $(i) : $(new-properties) ] ;
+            }
+            
+            if ! $(staged-targets)
+            {                    
+                errors.error "Unable to generate staged version of " [ $(source).str ] ;
+            }                
+            
+            for t in $(staged-targets) 
+            {
+                result += [ virtual-target.register $(t) ] ;          
             }            
         }
         
-        return $(result) ;
+        return [ property-set.empty ] $(result) ;
     }   
     
-    rule select-included ( source-targets * : types-to-include * )
-    {
-        local result-targets ;
-        if $(types-to-include)
-        {            
-            for local r in $(source-targets)
+
+    # Given the list of source targets explicitly passed to 'stage',
+    # returns the list of targets which must be staged.
+    rule targets-to-stage ( source-targets * : property-set )
+    {   
+        local result ;
+               
+        # Traverse the dependencies, if needed.
+        if [ $(property-set).get <install-dependencies> ] = "on"
+        {
+            source-targets = [ collect-targets $(source-targets) ] ;
+        }
+        
+        # Filter the target types, if needed
+        local included-types = [ $(property-set).get <install-type> ] ;                               
+        for local r in $(source-targets)
+        {
+            local ty = [ $(r).type ] ;        
+            if $(ty)
             {
-                local ty = [ $(r).type ] ;        
-                if $(ty)
+                # Don't stage searched libs.
+                if $(ty) != SEARCHED_LIB
                 {
-                    if [ include-type $(ty) : $(types-to-include) ]                  
+                    if $(included-types)
+                    {                        
+                        if [ include-type $(ty) : $(included-types) ]
+                        {
+                            result += $(r) ;
+                        }                                    
+                    }                
+                    else
                     {
-                        result-targets += $(r) ;
-                    }                
-                }           
+                        result += $(r) ;                        
+                    }   
+                }                                
             }
+            else if ! $(included-types)
+            {
+                # Don't install typeless target if there's
+                # explicit list of allowed types.
+                result += $(r) ;
+            }                
         }
-        else
-        {
-            result-targets = $(source-targets) ;
-        }
-        
-        
-        return $(result-targets) ;
+                
+        return $(result) ;
     }
     
-    rule collect-targets ( targets * : types-to-include * )
+    # CONSIDER: figure out why we can't use virtual-target.traverse here.
+    rule collect-targets ( targets * )
     {
         # Find subvariants
         local s ;        
@@ -233,13 +237,17 @@
         {
             result += [ $(i).all-referenced-targets ] ;
         }
-        result = [ sequence.unique $(result) ] ;        
+        local result2 ;
+        for local r in $(result)
+        {
+            if $(r:G) != <use>
+            {
+                result2 += $(r:G=) ;
+            }            
+        }        
+        result = [ sequence.unique $(result2) ] ;        
     }
-        
-    rule check-for-link-compatibility ( * : * )
-    {
-    }
-        
+                
     # Returns true iff 'type' is subtype of some element of 'types-to-include'.
     local rule include-type ( type : types-to-include * )
     {
@@ -254,59 +262,177 @@
         }
         
         return $(found) ;
+    }            
+}
+
+# Creates a copy of target 'source'. The 'properties' object should
+# have a <location> property which specifies where the target must
+# be placed.
+rule copy-file ( project name ? : source : properties )
+{   
+    local targets ;
+    name ?= [ $(source).name ] ;
+
+    new-a = [ 
+      new non-scanning-action $(source) : common.copy : $(properties) ] ;    
+    local source-root = [ $(properties).get <install-source-root> ] ;
+    if $(source-root) 
+    {        
+        # Get the real path of the target. We probably need to strip
+        # relative path from the target name at construction...
+        local path = [ $(source).path ] ;
+        path = [ path.root $(name:D) $(path) ] ;
+        # Make the path absolute. Otherwise, it's hard to compute relative
+        # path. The 'source-root' is already absolute, see the
+        # 'adjust-properties' method above.
+        path = [ path.root $(path) [ path.pwd ] ] ;
+
+        relative = [ path.relative-to $(source-root) $(path) ] ;
+        
+        targets = [ new file-target $(name:D=$(relative)) exact : [ $(source).type ] 
+          : $(project) : $(new-a) ] ;
+    }        
+    else
+    {
+        targets = [ new file-target $(name:D=) exact : [ $(source).type ] 
+          : $(project) : $(new-a) ] ;
     }
+            
+    return $(targets) ;
+}
+
+rule symlink ( name : project : source : properties )
+{
+    local a = [ new action $(source) : symlink.ln :
+      $(properties) ] ;
+    local targets = [ 
+     new file-target $(name) exact : [ $(source).type ] : $(project) : $(a) ] ;
     
+    return $(targets) ;
+}
+
+rule relink-file ( project : source : property-set  ) 
+{                                
+    local action = [ $(source).action ] ;
+    local cloned-action = [ virtual-target.clone-action $(action) : $(project) :
+      "" : $(property-set) ] ;
+    local result = [ $(cloned-action).targets ] ;                        
     
+    return $(result) ;
 }
 
-# Declare staged version of the EXE type. Generator for this type will
+# Declare installed version of the EXE type. Generator for this type will
 # cause relinking to the new location.
-type.register STAGED_EXE : : EXE ;
+type.register INSTALLED_EXE : : EXE ;
 
-class stage-exe-generator : generator
+class installed-exe-generator : generator
 {
-    import type property-set modules ;    
+    import type property-set modules stage ;
     
     rule __init__ ( )
     {
-        generator.__init__ stage-exe : EXE : STAGED_EXE ;
+        generator.__init__ install-exe : EXE : INSTALLED_EXE ;
     }
     
     rule run ( project name ? : property-set : source : multiple ? )
     {
-        local action = [ $(source).action ] ;
-                       
-        # stage can affect the relinking details.
-        local ps = [ $(action).properties ] ;
-        local ps-raw = [ $(ps).raw ] ;
-        # Unless <hardcode-dll-paths>true is in properties, which can
-        # happen only if the user has explicitly requested it, nuke all
-        # <dll-path> properties.
-        if [ $(property-set).get <hardcode-dll-paths> ] != true
+        if [ $(property-set).get <os> ] in NT CYGWIN
         {
-            ps-raw = [ property.change $(ps-raw) : <dll-path> ] ;
+            # Relinking is never needed on NT
+            return [ stage.copy-file $(project) 
+              : $(source) : $(property-set) ] ; 
         }
-        ps-raw = $(ps-raw) [ $(property-set).free ] ;
-        local new-ps = [ property-set.create $(ps-raw) ] ;
+        else 
+        {
+            return [ stage.relink-file $(project) 
+              : $(source) : $(property-set) ] ;            
+        }                
+    }    
+}
+
+generators.register [ new installed-exe-generator ] ;
+
+
+# Installing shared link on Unix might cause a creation of
+# versioned symbolic links. 
+type.register INSTALLED_SHARED_LIB : : SHARED_LIB ;
+class installed-shared-lib-generator : generator
+{
+    import type property-set modules stage ;
+    
+    rule __init__ ( )
+    {
+        generator.__init__ install-shared-lib : SHARED_LIB
+          : INSTALLED_SHARED_LIB ;
+    }
+    
+    rule run ( project name ? : property-set : source : multiple ? )
+    {                        
+        if [ $(property-set).get <os> ] = NT
+        {
+            local copied = [ stage.copy-file $(project) 
+              : $(source) : $(property-set) ] ; 
         
-        local cloned-action = [ virtual-target.clone-action $(action) : $(project) :
-          "" : $(new-ps) ] ;
-        local result = [ $(cloned-action).targets ] ;                        
-
-        return $(result) ;
+            copied = [ virtual-target.register $(copied) ] ;
+            
+            return $(copied) ;
+        }
+        else 
+        {
+            local a = [ $(source).action ] ;            
+            local copied ;
+            if ! $(a)
+            {
+                # Non-derived file, just copy.
+                copied = [ stage.copy-file $(project) 
+                  : $(source) : $(property-set) ] ; 
+            }
+            else
+            {                            
+                local cp = [ $(a).properties ] ;
+                local current-dll-path = [ $(cp).get <dll-path> ] ;
+                local new-dll-path = [ $(property-set).get <dll-path> ] ;
+                                    
+                if $(current-dll-path) != $(new-dll-path)
+                {
+                    # Rpath changed, need to relink.
+                    copied = [ stage.relink-file 
+                        $(project) : $(source) : $(property-set) ] ;
+                }
+                else
+                {                                        
+                    copied = [ stage.copy-file $(project) 
+                      : $(source) : $(property-set) ] ; 
+                }
+            }
+                                
+            copied = [ virtual-target.register $(copied) ] ;
+                                    
+            local result = $(copied) ;
+            # If the name is in the form NNN.XXX.YYY.ZZZ, where all
+            # 'X', 'Y' and 'Z' are numbers, we need to create
+            # NNN.XXX and NNN.XXX.YYY symbolic links.
+            local m = [ MATCH (.*)\\.([0123456789]+)\\.([0123456789]+)\\.([0123456789]+)$ 
+              : [ $(copied).name ] ] ;
+            if $(m)
+            {
+                result += [ stage.symlink $(m[1]).$(m[2]) : $(project)
+                  : $(copied) : $(property-set) ] ;
+                result += [ stage.symlink $(m[1]).$(m[2]).$(m[3])  : $(project)
+                  : $(copied) : $(property-set) ] ;
+            }
+                                    
+            return $(result) ;
+        }                
     }    
 }
 
-generators.register [ new stage-exe-generator ] ;
+generators.register [ new installed-shared-lib-generator ] ;
 
 
 
-# Declares a stage target. When build, it will construct all sources
-# and place in one directory. The directory can be specified in requirements
-# with 'location' property. If not specified, the directory name will be
-# the same as target name, relative to the project where the target 
-# is declared.
-rule stage ( name : sources * : requirements * : default-build * )
+# Main target rule for 'install'
+rule install ( name : sources * : requirements * : default-build * )
 {
     local project = [ project.current ] ;
     
@@ -317,16 +443,112 @@
     {
         requirements += <hardcode-dll-paths>false ;
     }        
-   
+        
+    if <tag> in $(requirements:G)
+    {
+        errors.user-error 
+          "The <tag> property is not allowed for the 'install' rule" ;
+    }
+           
     targets.main-target-alternative
-      [ new stage-target-class $(name) : $(project) 
+      [ new install-target-class $(name) : $(project) 
         : [ targets.main-target-sources $(sources) : $(name) ]
         : [ targets.main-target-requirements $(requirements) : $(project) ] 
         : [ targets.main-target-default-build $(default-build) : $(project) ] 
       ] ;
 }
 
-IMPORT $(__name__) : stage : : stage ;
+IMPORT $(__name__) : install : : install ;
+IMPORT $(__name__) : install : : stage ;
 
+rule add-variant-and-compiler ( name : type ? : property-set )
+{
+    return [ rename $(name) : $(type) : $(property-set) ] ;
+}
 
+rule add-variant ( name : type ? : property-set )
+{
+    return [ rename $(name) : $(type) : $(property-set) : unversioned ] ;
+}
 
+rule rename ( name : type ? : property-set : unversioned ? )
+{    
+    if [ type.is-derived $(type) LIB ]
+    {            
+        local properties = [ $(property-set).raw ] ;
+    
+        local tags = ;
+    
+        local thread-tag ;
+        if <threading>multi in $(properties) { thread-tag = mt ; }
+        
+        local runtime-tag = ;
+        if <runtime-link>static in $(properties) { runtime-tag += s ; }
+        if <runtime-debugging>on in $(properties) { runtime-tag += g ; }
+        
+        if <variant>debug-python in $(properties) { runtime-tag += y ; }
+        if <variant>debug in $(properties) { runtime-tag += d ; }
+        if <stdlib>stlport in $(properties) { runtime-tag += p ; }
+        if <stdlib-stlport:iostream>hostios in $(properties) { runtime-tag += n ; }
+        
+        local toolset-tag = ;
+        # 'unversioned' should be a parameter.
+        if ! $(unversioned)
+        {
+            switch [ $(property-set).get <toolset> ]
+            {
+                case borland* : toolset-tag += bcb ;
+                case como* : toolset-tag += como ;
+                case cw : toolset-tag += cw ;
+                case darwin* : toolset-tag += ;
+                case edg* : toolset-tag += edg ;
+                case gcc* : toolset-tag += gcc ;
+                case intel-linux* : toolset-tag += il ;
+                case intel-win* : toolset-tag += iw ;
+                case kcc* : toolset-tag += kcc ;
+                case kylix* : toolset-tag += bck ;
+                #case metrowerks* : toolset-tag += cw ;
+                #case mingw* : toolset-tag += mgw ;
+                case mipspro* : toolset-tag += mp ;
+                case msvc* : toolset-tag += vc ;
+                case sun* : toolset-tag += sw ;
+                case tru64cxx* : toolset-tag += tru ;
+                case vacpp* : toolset-tag += xlc ;
+            }
+            local version = [ MATCH "<toolset.*version>([0123456789]+)[.]([0123456789]*)" : $(properties) ] ;
+            toolset-tag += $(version) ;
+        }
+
+        # Note yet clear if this should be added on Linux (where we have
+        # version in soname) and how it should be done on Windows.
+        #local version-tag = ;
+        #if ! $(gUNVERSIONED_VARIANT_TAG)
+        #{
+        #    local version-number = [ get-values <version> : $(properties) ] ;
+        #    version-number ?= $(BOOST_VERSION) ;
+        #    version-tag = [ MATCH "^([^.]+)[.]([^.]+)" : $(version-number[1]) ] ;
+        #    version-tag = $(version-tag:J="_") ;
+        #}
+    
+        tags += $(toolset-tag:J=) ;
+        tags += $(thread-tag:J=) ;
+        tags += $(runtime-tag:J=) ;
+        #tags += $(version-tag) ;
+    
+        local result ;
+        
+        if $(tags)
+        {
+            result = $(name)-$(tags:J=-) ;
+        }
+        else
+        {
+            result = $(name) ;
+        }
+        return [ virtual-target.add-prefix-and-suffix $(result) : $(type) 
+          : $(property-set) ] ;
+    }    
+}
+
+
+

Modified: boost-build/branches/upstream/current/tools/stlport.jam
===================================================================
--- boost-build/branches/upstream/current/tools/stlport.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/stlport.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -1,5 +1,6 @@
-# (C) Copyright Gennadiy Rozental 2002. 
-# (C) Copyright Vladimir Prus 2003. 
+# (C) Copyright Gennadiy Rozental 2002.
+# (C) Copyright Vladimir Prus 2003.
+# (C) Copyright Rene Rivera 2006.
 # Permission to copy, use,
 # modify, sell and distribute this software is granted provided this
 # copyright notice appears in all copies. This software is provided
@@ -22,7 +23,7 @@
 # on used toolset.
 # Also, finish various flags:
 #
-# This is copied from V1 toolset, "+" means "impelemnted"
+# This is copied from V1 toolset, "+" means "implemented"
 #+flags $(CURR_TOOLSET) DEFINES <stlport-iostream>off : _STLP_NO_OWN_IOSTREAMS=1 _STLP_HAS_NO_NEW_IOSTREAMS=1 ;
 #+flags $(CURR_TOOLSET) DEFINES <stlport-extensions>off : _STLP_NO_EXTENSIONS=1 ;
 # flags $(CURR_TOOLSET) DEFINES <stlport-anachronisms>off : _STLP_NO_ANACHRONISMS=1 ;
@@ -37,7 +38,9 @@
 import project ;
 import "class" : new ;
 import targets ;
-import property-set ; 
+import property-set ;
+import common ;
+import type ;
 
 # Make this module into a project.
 project.initialize $(__name__) ;
@@ -55,8 +58,6 @@
 feature.extend stdlib : stlport ;
 feature.compose <stdlib>stlport : <library>/stlport//stlport ;
 
-subfeature stdlib stlport : version : : optional propagated link-incompatible ;
-
 # STLport iostreams or native iostreams
 subfeature stdlib stlport : iostream : hostios : optional propagated  ;
 
@@ -69,7 +70,7 @@
 # STLport debug allocation -- NOT YET SUPPORTED
 #subfeature stdlib stlport : debug-alloc : off on ;
 
-# Declare a special target class to handle the creation of search-lib-target 
+# Declare a special target class to handle the creation of search-lib-target
 # instances for STLport. We need a special class, because otherwise we'll have
 # - declare prebuilt targets for all possible toolsets. And by the time 'init'
 #   is called we don't even know the list of toolsets that are registered
@@ -79,29 +80,39 @@
 class stlport-target-class : basic-target
 {
     import feature project type errors generators ;
-    import set : difference ;       
-    
-    rule __init__ ( project : headers ? : libraries ? : requirements * )
+    import set : difference ;
+
+    rule __init__ ( project : headers ? : libraries * :  version ? )
     {
-        basic-target.__init__ stlport : $(project) : : $(requirements) ;
+        basic-target.__init__ stlport : $(project) ;
         self.headers = $(headers) ;
         self.libraries = $(libraries) ;
+        self.version = $(version) ;
+        self.version.5 = [ MATCH "^(5[.][0123456789]+).*" : $(version) ] ;
+        
+        local requirements ;
+        requirements += <stdlib-stlport:version>$(self.version) ;
+        self.requirements = [ property-set.create $(requirements) ] ;
     }
-            
+
     rule generate ( property-set )
     {
         # Since this target is built with <stdlib>stlport, it will also
         # have <library>/stlport//stlport in requirements, which will
         # cause a loop in main target references. Remove that property
         # manually.
-        
-        property-set = [ property-set.create [ difference
-            [ $(property-set).raw ] : <library>/stlport//stlport <stdlib>stlport ] ] ;
+
+        property-set = [ property-set.create
+            [ difference
+                [ $(property-set).raw ] :
+                <library>/stlport//stlport
+                <stdlib>stlport
+                ]
+            ] ;
         return [ basic-target.generate $(property-set) ] ;
     }
-    
-    
-    rule construct ( source-targets * : property-set )
+
+    rule construct ( name : source-targets * : property-set )
     {
         # Deduce the name of stlport library, based on toolset and
         # debug setting.
@@ -109,80 +120,189 @@
         local hostios = [ feature.get-values <stdlib-stlport:iostream> : $(raw) ] ;
         local toolset = [ feature.get-values <toolset> : $(raw) ] ;
 
-        
-        # We don't need libraries if host istreams are used. For
-        # msvc, automatic library selection will be used.
-        if ! $(hostios) && $(toolset) != msvc
-        {            
-            local debug = [ feature.get-values <runtime-debugging> : $(raw) ] ;
+        if $(self.version.5)
+        {
+            # Version 5.x
             
+            # STLport host IO streams no longer supported. So we always 
+            # need libraries.
+            
+            # name: stlport(stl)?[dg]?.M.R
             local name = stlport ;
+            if [ feature.get-values <runtime-debugging> : $(raw) ] = "on"
+            {
+                name += stl ;
+                switch $(toolset)
+                {
+                    case gcc* : name += g ;
+                    case darwin* : name += g ;
+                    case * : name += d ;
+                }
+            }
+            name += .$(self.version.5) ;
+            name = $(name:J=) ;
+            
+            if [ feature.get-values <install-dependencies> : $(raw) ] = "on"
+            {
+                #~ Allow explicitly asking to install the STLport lib by
+                #~ refering to it directly: /stlport//stlport/<install-dependencies>on
+                #~ This allows for install packaging of all libs one might need for
+                #~ a standalone distribution.
+                import path : make : path-make ;
+                local runtime-link
+                    = [ feature.get-values <runtime-link> : $(raw) ] ;
+                local lib-file.props
+                    = [ property-set.create $(raw) <link>$(runtime-link) ] ;
+                local lib-file.prefix
+                    = [ type.generated-target-prefix $(runtime-link:U)_LIB : $(lib-file.props) ] ;
+                local lib-file.suffix
+                    = [ type.generated-target-suffix $(runtime-link:U)_LIB : $(lib-file.props) ] ;
+                lib-file.prefix
+                    ?= "" "lib" ;
+                lib-file.suffix
+                    ?= "" ;
+                local lib-file
+                    = [ GLOB $(self.libraries) [ modules.peek : PATH ] :
+                        $(lib-file.prefix)$(name).$(lib-file.suffix) ] ;
+                lib-file
+                    = [ new file-reference [ path-make $(lib-file[1]) ] : $(self.project) ] ;
+                lib-file
+                    = [ $(lib-file).generate "" ] ;
+                local lib-file.requirements
+                    = [ targets.main-target-requirements
+                        [ $(lib-file.props).raw ] <file>$(lib-file[-1])
+                        : $(self.project) ] ;
+                return [ generators.construct $(self.project) $(name) : LIB : $(lib-file.requirements) : : LIB ] ;
+            }
+            else
+            {
+                #~ Otherwise, it's just a regular usage of the library.
+                return [ generators.construct
+                    $(self.project) $(name) : SEARCHED_LIB : $(property-set) ] ;
+            }
+        }
+        else if ! $(hostios) && $(toolset) != msvc
+        {
+            # We don't need libraries if host istreams are used. For
+            # msvc, automatic library selection will be used.
+            
+            # name: stlport_<toolset>(_stldebug)?
+            local name = stlport ;
             name = $(name)_$(toolset) ;
-            if $(debug) = "on"
+            if [ feature.get-values <runtime-debugging> : $(raw) ] = "on"
             {
                 name = $(name)_stldebug ;
             }
-                
-            return [ generators.construct $(self.project) $(name) : SEARCHED_LIB 
-              : $(property-set) ] ;
+
+            return [ generators.construct
+                $(self.project) $(name) : SEARCHED_LIB : $(property-set) ] ;
         }
-        
+        else
+        {
+            return [ property-set.empty ] ;
+        }
     }
-    
+
     rule compute-usage-requirements ( subvariant )
     {
-        local usage-requirements ;
-        usage-requirements += 
-            <include>$(self.headers) 
-            <dll-path>$(self.libraries)                   
-             <library-path>$(self.libraries)               
-                ;
-            
+        local usage-requirements =
+            <include>$(self.headers)
+            <dll-path>$(self.libraries)
+            <library-path>$(self.libraries)
+            ;
+
         local rproperties = [ $(subvariant).build-properties ] ;
         # CONSIDER: should this "if" sequence be replaced with
         # some use of 'property-map' class?
         if [ $(rproperties).get <runtime-debugging> ] = "on"
         {
-            usage-requirements += <define>_STLP_DEBUG=1 
-              <define>_STLP_DEBUG_UNINITIALIZED=1 ;
+            usage-requirements +=
+                <define>_STLP_DEBUG=1
+                <define>_STLP_DEBUG_UNINITIALIZED=1 ;
         }
-        if [ $(rproperties).get <runtime-debugging> ] = "on"            
+        if [ $(rproperties).get <runtime-debugging> ] = "on"
         {
-            usage-requirements += <define>_STLP_USE_DYNAMIC_LIB=1 ;
+            usage-requirements +=
+                <define>_STLP_USE_DYNAMIC_LIB=1 ;
         }
         if [ $(rproperties).get <stdlib-stlport:extensions> ] = noext
         {
-            usage-requirements += <define>_STLP_NO_EXTENSIONS=1 ;
+            usage-requirements +=
+                <define>_STLP_NO_EXTENSIONS=1 ;
         }
         if [ $(rproperties).get <stdlib-stlport:iostream> ] = hostios
         {
-            usage-requirements += <define>_STLP_NO_OWN_IOSTREAMS=1 
-                                  <define>_STLP_HAS_NO_NEW_IOSTREAMS=1 ;
+            usage-requirements +=
+                <define>_STLP_NO_OWN_IOSTREAMS=1
+                <define>_STLP_HAS_NO_NEW_IOSTREAMS=1 ;
         }
-                        
+        if $(self.version.5)
+        {
+            # Version 5.x
+            if [ $(rproperties).get <threading> ] = "single"
+            {
+                # Since STLport5 doesn't normally support single-thread
+                # we force STLport5 into the multi-thread mode. Hence
+                # getting what other libs provide of single-thread code
+                # linking against a multi-thread lib.
+                usage-requirements +=
+                    <define>_STLP_THREADS=1 ;
+            }
+        }
+        
+        #~ Allow setting up to use STLport by only using the library target
+        #~ /stlport//stlport.
+        #~ TODO: Make it possible to use /stlport//stlport/<version>5.0 to select
+        #~ a specific configured version.
+        if $(self.version)
+        {
+            usage-requirements +=
+                <stdlib>stlport-$(self.version) ;
+        }
+        else
+        {
+            usage-requirements +=
+                <stdlib>stlport ;
+        }
+
         return [ property-set.create $(usage-requirements) ] ;
-    }    
+    }
 }
 
-rule stlport-target ( headers ? : libraries ? : requirements * )
+rule stlport-target ( headers ? : libraries * : version ? )
 {
     local project = [ project.current ] ;
-    
+
     targets.main-target-alternative
-      [ new stlport-target-class  $(project) : $(headers) : $(libraries)        
-        : [ targets.main-target-requirements $(requirements) : $(project) ] 
+      [ new stlport-target-class  $(project) : $(headers) : $(libraries)
+        : $(version)
       ] ;
 }
 
-# Initialize stlport support. 
-rule init ( version ? :
-            headers       # Location of header files
-            libraries ? # Location of libraries
-         )
+local .version-subfeature-defined ;
+
+# Initialize stlport support.
+rule init (
+    version ? :
+    headers         # Location of header files
+    libraries *     # Location of libraries, lib and bin subdirs of STLport.
+    )
 {
-    feature.extend-subfeature stdlib stlport : version : $(version) ;
-    
+    # FIXME: need to use common.check-init-parameters here.
+    # At the moment, that rule always tries to define subfeature
+    # of the 'toolset' feature, while we need to define subfeature
+    # of <stdlib>stlport, so tweaks to check-init-parameters are needed.
+    if $(version)
+    {
+        if ! $(.version-subfeature-defined)
+        {
+            feature.subfeature stdlib stlport : version : : propagated ;
+            .version-subfeature-defined = true ;
+        }
+        feature.extend-subfeature stdlib stlport : version : $(version) ;
+    }
+
     # Declare the main target for this STLPort version.
-    stlport-target $(headers) : $(libraries) : <stdlib>stlport-$(version) ;
+    stlport-target $(headers) : $(libraries) : $(version) ;
 }
 

Modified: boost-build/branches/upstream/current/tools/sun.jam
===================================================================
--- boost-build/branches/upstream/current/tools/sun.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/sun.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -14,7 +14,8 @@
 
 feature.extend toolset : sun ;
 toolset.inherit  sun : unix ;
-feature.subfeature toolset sun : version ;
+generators.override sun.prebuilt : builtin.lib-generator ;
+generators.override sun.searched-lib-generator : searched-lib-generator ;
 
 feature.extend stdlib : sun-stlport ;
 feature.compose <stdlib>sun-stlport
@@ -28,7 +29,11 @@
     
     command = [ common.get-invocation-command sun : CC 
         : $(command) : "/opt/SUNWspro/bin" ] ;
-    
+
+    # Even if the real compiler is not found, put CC to
+    # command line so that user see command line that would have being executed.
+    command ?= CC ;
+
     common.handle-options sun : $(condition) : $(command) : $(options) ;
     
     command_c = $(command[1--2]) $(command[-1]:B=cc) ;
@@ -43,7 +48,7 @@
 # Declare flags and actions for compilation
 flags sun.compile OPTIONS <debug-symbols>on : -g ;
 flags sun.compile OPTIONS <profiling>on : -xprofile=tcov ;
-flags sun.compile OPTIONS <optimization>speed : -fast -xarch=generic ;
+flags sun.compile OPTIONS <optimization>speed : -fast ;
 flags sun.compile OPTIONS <optimization>space : -xO2 -xspace ;
 flags sun.compile OPTIONS <threading>multi : -mt ;
 
@@ -75,14 +80,17 @@
 flags sun.link FINDLIBS-ST <find-static-library> ;
 flags sun.link FINDLIBS-SA <find-shared-library> ;
 flags sun.link LIBRARIES <library-file> ;
-flags sun.link LINK-RUNTIME <link-runtime>static : static ;
-flags sun.link LINK-RUNTIME <link-runtime>shared : dynamic ;
+flags sun.link LINK-RUNTIME <runtime-link>static : static ;
+flags sun.link LINK-RUNTIME <runtime-link>shared : dynamic ;
 flags sun.link RPATH <dll-path> ;
 # On gcc, there are separate options for dll path at runtime and
 # link time. On Solaris, there's only one: -R, so we have to use
 # it, even though it's bad idea.
 flags sun.link RPATH <xdll-path> ;
 
+# The POSIX real-time library is always needed (nanosleep, clock_gettime etc.)
+flags sun.link FINDLIBS-SA : rt ;
+
 rule link ( targets * : sources * : properties * )
 {
     SPACE on $(targets) = " " ;

Modified: boost-build/branches/upstream/current/tools/symlink.jam
===================================================================
--- boost-build/branches/upstream/current/tools/symlink.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/symlink.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,7 +6,7 @@
 # Defines the "symlink" special target. 'symlink' targets make symbolic links
 # to the sources.
 
-import targets modules path class os feature project ;
+import targets modules path class os feature project property-set ;
 
 .count = 0 ;
 
@@ -51,14 +51,15 @@
         self.virtual-targets = ;
     }    
     
-    rule construct ( source-targets * : property-set )
+    rule construct ( name : source-targets * : property-set )
     {
         local i = 1 ;
         for local t in $(source-targets)
         {
             local s = $(self.targets[$(i)]) ;
-            local vt = [ class.new file-target $(s:D=) : [ $(t).type ] : $(self.project) ] ;
-            $(vt).action [ class.new action $(vt) : $(t) : symlink.ln : $(property-set) ] ;
+            local a = [ class.new action  $(t) : symlink.ln : $(property-set) ] ;
+            local vt = [ class.new file-target $(s:D=) 
+              : [ $(t).type ] : $(self.project) : $(a) ] ;
             
             # Place the symlink in the directory relative to the project
             # location, instead of placing it in the build directory.
@@ -70,7 +71,7 @@
             self.virtual-targets += $(vt) ;
             i = [ numbers.increment $(i) ] ;
         }
-        return $(self.virtual-targets) ;
+        return [ property-set.empty ] $(self.virtual-targets) ;
     }
 }
 

Modified: boost-build/branches/upstream/current/tools/testing.jam
===================================================================
--- boost-build/branches/upstream/current/tools/testing.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/testing.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -48,6 +48,7 @@
 import os ;
 import common ;
 import sequence ;
+import errors ;
 
 rule init ( ) { }
 
@@ -60,19 +61,21 @@
 
 # Register target types.
 type.register TEST : test ;
-type.register COMPILE : : TEST : main ;
-type.register COMPILE_FAIL : : TEST : main ;
-type.register RUN_OUTPUT : run : : main ;
-type.register RUN : : TEST : main ;
-type.register RUN_FAIL : : TEST : main ;
-type.register UNIT_TEST : passed : TEST : main ;
+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 of no
+# 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 ? )
@@ -108,15 +111,39 @@
     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) ] ;
+}
+
+
+rule handle-input-files ( input-files * )
+{
+    if $(input-files[2])
+    {
+        # 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" ;
+        }        
+    }
+    return <testing.input-file>$(input-files) ;
+}
+
+
 rule run ( sources + : args * : input-files * : requirements * : target-name ? 
     : default-build * )
 {      
     requirements += <testing.arg>$(args:J=" ") ;
-    requirements += <testing.input-file>$(input-files[1]) ;
-    if $(input-files[2]) || $(default-build)
-    {
-        EXIT "NOT supported" ;
-    }    
+    requirements += [ handle-input-files $(input-files) ] ;
     return [ make-test run : $(sources) : $(requirements) : $(target-name) ] ;
 }
 
@@ -124,15 +151,10 @@
     : default-build * )
 {    
     requirements += <testing.arg>$(args:J=" ") ;    
-    requirements += <testing.input-file>$(input-files[1]) ;
-    if $(input-files[2]) || $(default-build)
-    {
-        EXIT "NOT supported" ;
-    }    
+    requirements += [ handle-input-files $(input-files) ] ;
     return [ make-test run-fail : $(sources) : $(requirements) : $(target-name) ] ;
 }
 
-
 # Rule for grouping tests in suites.
 rule test-suite ( suite-name : tests + ) 
 {
@@ -158,6 +180,30 @@
     }    
 }
 
+# Given a project location, compute the name of 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) ] ;
+
+    if $(match1) { return $(match1[0]) ; }
+    else if $(match2) { return $(match2[0]) ; }
+    else if $(match3) { return "" ; }
+    else if --dump-tests in [ modules.peek : ARGV ] 
+    { 
+        EXIT Cannot extract library name from path $(path) ; 
+    }
+}
+
+
+# Take a target (instance of 'basic-target') and prints 
+# - its type
+# - its name
+# - comments specified via the <test-info> property
+# - relative location of all source from the project root.
 rule dump-test ( target )
 {
     local type = [ $(target).type ] ;
@@ -165,22 +211,32 @@
     local project = [ $(target).project ] ;
     
     local project-root = [ $(project).get project-root ] ;
-    local project-root-location = [ $(project-root).get-location ] ;
-    
+    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 ] 
         {
+            local location = 
+              [ path.root 
+                  [ path.root [ $(s).name ] [ $(s).location ] ]
+                  [ path.pwd ] ] ;  
+                       
             source-files += 
               [ path.relative 
-                  [ path.root [ $(s).location ] [ path.pwd ] ]
-                  [ path.root $(project-root-location) [ path.pwd ] ] ] ;
+                  $(location)
+                  [ path.root $(project-root) [ path.pwd ] ] ] ;
         }                
     }
           
-    local r = [ $(t).requirements ] ;
+    local r = [ $(target).requirements ] ;
     # Extract values of the <test-info> feature
     local test-info = [ $(r).get <test-info> ] ;
     
@@ -199,6 +255,8 @@
 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 ;
@@ -273,21 +331,15 @@
     # 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) ] ;
-        if [ modules.peek : NT ]
-        {
-            PATH_SETUP on $(target) = 
-              [ common.path-variable-setting-command PATH : $(dll-paths) %PATH% ] ;
-        }
-        else
-        {
-            PATH_SETUP on $(target) = 
-              [ common.path-variable-setting-command LD_LIBRARY_PATH :
-                  $(dll-paths) $LD_LIBRARY_PATH : exported ] ;
-        }        
+        
+        PATH_SETUP on $(target) = 
+          [ common.prepend-path-variable-command
+              [ os.shared-library-path-variable ] : $(dll-paths) ] ;
     }            
 }
 
@@ -390,6 +442,36 @@
     $(LAUNCHER) $(>) && $(MAKE_FILE) $(<)
 }
 
-IMPORT $(__name__) : compile compile-fail test-suite run run-fail 
-  : : compile compile-fail test-suite run run-fail ;
+IMPORT $(__name__) : compile compile-fail test-suite run run-fail link link-fail 
+  : : compile compile-fail test-suite run run-fail link link-fail ;
 
+
+type.register TIME : time ;
+generators.register-standard testing.time : : TIME ;
+
+rule record-time ( target source : user : system )
+{
+    local src-string = [$(source:G=:J=",")"] " ;
+    USER_TIME on $(target) += $(src-string)$(user) ;
+    SYSTEM_TIME on $(target) += $(src-string)$(system) ;
+}
+
+IMPORT testing : record-time : : testing.record-time ;
+rule time ( target : source : properties *  )
+{
+    # 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
+    REBUILDS $(target) : $(source) ;
+}
+
+actions time
+{
+    echo user: $(USER_TIME)
+    echo system: $(SYSTEM_TIME)
+      
+    echo user: $(USER_TIME)" seconds" > $(<)
+    echo system: $(SYSTEM_TIME)" seconds" > $(<)
+}

Added: boost-build/branches/upstream/current/tools/types/asm.jam
===================================================================
--- boost-build/branches/upstream/current/tools/types/asm.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/types/asm.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,4 @@
+# Copyright Craig Rodrigues 2005. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+type ASM : s S asm ;

Added: boost-build/branches/upstream/current/tools/types/cpp.jam
===================================================================
--- boost-build/branches/upstream/current/tools/types/cpp.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/types/cpp.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,4 @@
+# Copyright David Abrahams 2004. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+type CPP : cpp cxx cc ;

Added: boost-build/branches/upstream/current/tools/types/exe.jam
===================================================================
--- boost-build/branches/upstream/current/tools/types/exe.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/types/exe.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,5 @@
+# Copyright David Abrahams 2004. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+type EXE : exe : : NT CYGWIN ;
+type EXE ;

Added: boost-build/branches/upstream/current/tools/types/html.jam
===================================================================
--- boost-build/branches/upstream/current/tools/types/html.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/types/html.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,4 @@
+# Copyright David Abrahams 2004. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+type HTML : html ;

Added: boost-build/branches/upstream/current/tools/types/lib.jam
===================================================================
--- boost-build/branches/upstream/current/tools/types/lib.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/types/lib.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,28 @@
+# Copyright David Abrahams 2004. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import type ; # for set-generated-target-suffix
+import os ;
+
+type.register LIB ;
+
+if [ os.on-unix ]
+{
+    type.set-generated-target-prefix LIB : : "lib" ;
+}
+
+type STATIC_LIB : lib a : LIB : NT CYGWIN ;
+type STATIC_LIB : a : LIB : MACOSX ;
+type STATIC_LIB : a : LIB ;
+type.set-generated-target-prefix STATIC_LIB : : lib ;
+
+type IMPORT_LIB : : STATIC_LIB ;
+type.set-generated-target-suffix IMPORT_LIB : : lib ;
+type.set-generated-target-prefix IMPORT_LIB : : "" ;
+
+type SHARED_LIB : dll : LIB : NT CYGWIN ;
+type SHARED_LIB : dylib : LIB : MACOSX ;
+type SHARED_LIB : so : LIB ;
+
+type SEARCHED_LIB : : LIB ;

Added: boost-build/branches/upstream/current/tools/types/obj.jam
===================================================================
--- boost-build/branches/upstream/current/tools/types/obj.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/types/obj.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,5 @@
+# Copyright David Abrahams 2004. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+type OBJ : obj : : NT CYGWIN ;
+type OBJ : o ;

Added: boost-build/branches/upstream/current/tools/types/qt.jam
===================================================================
--- boost-build/branches/upstream/current/tools/types/qt.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/types/qt.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,10 @@
+# Copyright Vladimir Prus 2005. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+type UI : ui ;
+type QRC : qrc ;
+type MOCCABLE_CPP ;
+type MOCCABLE_H ;
+# Result of running moc.
+type MOC : moc : H ;

Added: boost-build/branches/upstream/current/tools/types/register.jam
===================================================================
--- boost-build/branches/upstream/current/tools/types/register.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/types/register.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,39 @@
+# Copyright David Abrahams 2004. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+# This module's job is to automatically import all the type
+# registration modules in its directory.
+import type os path modules ;
+
+# Register the given type on the specified OSes, or on remaining OSes
+# if os is not specified.  This rule is injected into each of the type
+# modules for the sake of convenience.
+local rule type ( type : suffixes * : base-type ? : os * )
+{
+    if ! [ type.registered $(type) ]
+    {
+        if ( ! $(os) ) || [ os.name ] in $(os)
+        {
+            type.register $(type) : $(suffixes) : $(base-type) ;
+        }
+    }
+}
+
+.this-module's-file = [ modules.binding $(__name__) ] ;
+.this-module's-dir = [ path.parent $(.this-module's-file) ] ;
+.sibling-jamfiles =  [ path.glob $(.this-module's-dir) : *.jam ] ;
+.sibling-modules = [ MATCH ^(.*)\.jam$ : $(.sibling-jamfiles) ] ;
+
+# A loop over all modules in this directory
+for m in $(.sibling-modules)
+{
+    m = [ path.basename $(m) ] ;
+    m = types/$(m) ;
+    
+    # Inject the type rule into the new module
+    IMPORT $(__name__) : type : $(m) : type ;
+    import $(m) ;
+}
+
+

Added: boost-build/branches/upstream/current/tools/types/rsp.jam
===================================================================
--- boost-build/branches/upstream/current/tools/types/rsp.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/types/rsp.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,4 @@
+# Copyright David Abrahams 2004. Distributed under the Boost
+# Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+type RSP : rsp ;

Modified: boost-build/branches/upstream/current/tools/unix.jam
===================================================================
--- boost-build/branches/upstream/current/tools/unix.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/unix.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -35,12 +35,12 @@
           $(requirements) ;
     }
     
-    rule run ( project name ? : property-set : sources + :  multiple ? )
+    rule run ( project name ? : property-set : sources + )
     {   
         local result = [ linking-generator.run $(project) $(name) : $(property-set)
-          : $(sources) : $(multiple) ] ;
+          : $(sources) ] ;
         
-        unix.set-library-order $(sources) : $(property-set) : $(result) ;
+        unix.set-library-order $(sources) : $(property-set) : $(result[2-]) ;
                                 
         return $(result) ;
     }
@@ -69,7 +69,7 @@
     
 } 
 
-class unix-archive-generator : generator
+class unix-archive-generator : archive-generator
 {
     import unix ; 
 
@@ -77,16 +77,16 @@
         requirements * )
     {
         composing ?= true ;
-        generator.__init__ $(id) $(composing) : $(source-types) : $(target-types) :
+        archive-generator.__init__ $(id) $(composing) : $(source-types) : $(target-types) :
           $(requirements) ;
     }
         
-    rule run ( project name ? : property-set : sources + :  multiple ? )
+    rule run ( project name ? : property-set : sources + )
     {                                
-        local result = [ generator.run $(project) $(name) : $(property-set)
-          : $(sources) : $(multiple) ] ;
+        local result = [ archive-generator.run $(project) $(name) : $(property-set)
+          : $(sources) ] ;
         
-        unix.set-library-order $(sources) : $(property-set) : $(result) ;
+        unix.set-library-order $(sources) : $(property-set) : $(result[2-]) ;
         
         return $(result) ;
 
@@ -107,12 +107,12 @@
         return $(self.requirements) ;
     }
               
-    rule run ( project name ? : property-set : sources * : multiple ? )
+    rule run ( project name ? : property-set : sources * )
     {
         local result = [ searched-lib-generator.run $(project) $(name) 
-          : $(property-set) : $(sources) : $(multiple) ] ;
+          : $(property-set) : $(sources) ] ;
         
-        unix.set-library-order $(sources) : $(property-set) : $(result) ;
+        unix.set-library-order $(sources) : $(property-set) : $(result[2-]) ;
         
         return $(result) ;
     }    
@@ -126,7 +126,7 @@
         generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
     }
 
-    rule run ( project name ? : property-set : sources * : multiple ? )
+    rule run ( project name ? : property-set : sources * )
     {
         local f = [ $(property-set).get <file> ] ;
         unix.set-library-order-aux $(f) : $(sources) ;
@@ -138,9 +138,9 @@
   [ new unix-prebuilt-lib-generator unix.prebuilt : : LIB 
       : <file> <toolset>unix ] ;
 
+generators.override unix.prebuilt : builtin.lib-generator ;
 
 
-
 # Declare generators
 generators.register [ new unix-linking-generator unix.link : LIB OBJ : EXE 
     : <toolset>unix ] ;
@@ -178,7 +178,7 @@
 .order = [ new order ] ;
 
 rule set-library-order-aux ( from * : to * )
-{
+{        
     for local f in $(from)
     {
         for local t in $(to)
@@ -194,7 +194,7 @@
 rule set-library-order ( sources * : property-set : result * )
 {
     local used-libraries ;
-    local deps = [ $(property-set).dependency ] ;
+    local deps = [ $(property-set).dependency ] ;        
     for local l in $(sources) $(deps:G=)        
     {
         if [ $(l).type ] && [ type.is-derived [ $(l).type ] LIB ]

Modified: boost-build/branches/upstream/current/tools/vacpp.jam
===================================================================
--- boost-build/branches/upstream/current/tools/vacpp.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/vacpp.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -10,26 +10,18 @@
 
 import toolset : flags ;
 import feature ;
+import common ;
+import generators ;
 
 feature.extend toolset : vacpp ;
 toolset.inherit vacpp : unix ;
+generators.override vacpp.prebuilt : builtin.lib-generator ;
+generators.override vacpp.searched-lib-generator : searched-lib-generator ;
 feature.subfeature toolset vacpp : version ;
 
 # Configures the vacpp toolset. 
 rule init ( version ? : command * : options * )
 {
-    local condition = [ common.check-init-parameters vacpp : version $(version) ] ;
-    local command = [ common.get-invocation-command vacpp : xlc : $(command) ] ;
-
-    common.handle-options acc : $(condition) : $(command) : $(options) ;    
-    
-    if $(command)
-    {        
-        command = [ common.get-absolute-tool-path $(command[-1]) ] ;
-    }
-    local root = $(command:D) ;
-    
-    flags vacpp ROOT $(condition) : $(root) ;    
 }
 
 
@@ -52,8 +44,8 @@
 flags vacpp C++FLAGS <rtti>off : -qnortti ;
 flags vacpp C++FLAGS <rtti>on : -qrtti ;
 
-# flags vacpp LINKFLAGS <link-runtime>static : -llibstd_v2.a ;
-# flags vacpp LINKFLAGS <link-runtime>shared : -llibstd_v2.sl ;
+# flags vacpp LINKFLAGS <runtime-link>static : -llibstd_v2.a ;
+# flags vacpp LINKFLAGS <runtime-link>shared : -llibstd_v2.sl ;
 
 # We want the full path to the sources in the debug symbols because otherwise
 # the debugger won't find the sources when we use boost.build.
@@ -87,11 +79,17 @@
 flags vacpp VA_CXX_COMPILER <threading>single : xlC   ;
 flags vacpp VA_CXX_COMPILER <threading>multi : xlC_r ;
 
+ROOT = /usr/vacpp/bin ;
 actions vacpp.link bind NEEDLIBS
 {
     $(ROOT)/$(VA_CXX_COMPILER) $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS)
 }
 
+actions vacpp.link.dll bind NEEDLIBS
+{
+    xlC_r -qmkshrobj $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS)
+}
+
 actions vacpp.compile.c
 {    
     $(ROOT)/$(VA_C_COMPILER) -c -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)"

Added: boost-build/branches/upstream/current/tools/whale.jam
===================================================================
--- boost-build/branches/upstream/current/tools/whale.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/whale.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,116 @@
+#  Copyright (C) Vladimir Prus 2002-2005. 
+
+#  Use, modification and distribution is subject to 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 support for Whale/Dolphin/WD parser/lexer tools. 
+#  See http://www.cs.queensu.ca/home/okhotin/whale/ for details.
+#
+#  There are three interesting target types:
+#  - WHL (the parser sources), that are converted to CPP and H
+#  - DLP (the lexer sources), that are converted to CPP and H
+#  - WD (combined parser/lexer sources), that are converted to WHL + DLP
+
+import type ;
+import generators ;
+import path ;
+import "class" : new ;
+import errors ;
+
+rule init ( path # path the Whale/Dolphin/WD binaries 
+          )
+{
+    if $(.configured) && $(.path) != $(path)
+    {
+        errors.user-error "Attempt to reconfigure Whale support" :
+          "Previously configured with path \"$(.path:E=<empty>)\"" :
+          "Now configuring with path \"$(path:E=<empty>)\"" ;
+
+    }
+    .configured = true ;
+    .path = $(path) ;
+
+    .whale = [ path.join $(path) whale ] ;
+    .dolphin = [ path.join $(path) dolphin ] ;
+    .wd = [ path.join $(path) wd ] ;
+}     
+
+
+# Declare the types.
+type.register WHL : whl ;
+type.register DLP : dlp ;
+type.register WHL_LR0 : lr0 ;
+type.register WD : wd ;
+
+# Declare standard generators.
+generators.register-standard whale.whale : WHL : CPP H H(%_symbols) ;
+generators.register-standard whale.dolphin : DLP : CPP H ;
+generators.register-standard whale.wd : WD : WHL(%_parser) DLP(%_lexer) ;
+
+# The conversions defines above a ambiguious when we generated CPP from WD.
+# We can either go via WHL type, or via DLP type.
+# The following custom generator handles this by running both conversions.
+
+class wd-to-cpp : generator
+{
+    rule __init__ ( * : * : * )
+    {
+        generator.__init__ $(1) : $(2) : $(3) ;
+    }
+    
+    rule run ( project name ? : property-set : source * )
+    {
+        if ! $(source[2])
+        {                
+            local new-sources ;
+            if ! [ $(source).type ] in WHL DLP
+            {            
+                local r1 = [ generators.construct $(project) $(name) 
+                  : WHL : $(property-set) : $(source) ] ;
+                local r2 = [ generators.construct $(project) $(name) 
+                  : DLP : $(property-set) : $(source) ] ;
+                
+                new-sources = [ sequence.unique $(r1[2-]) $(r2[2-]) ] ;
+            }
+            else
+            {
+                new-sources = $(source) ;
+            }
+            
+            local result ;
+            for local i in $(new-sources) 
+            {
+                local t = [ generators.construct $(project) $(name) : CPP 
+                  : $(property-set) : $(i) ] ;          
+                result += $(t[2-]) ;
+            }
+            return $(result) ;
+        }        
+    }
+    
+}
+
+
+generators.override whale.wd-to-cpp : whale.whale ;
+generators.override whale.wd-to-cpp : whale.dolphin ;
+
+
+generators.register [ new wd-to-cpp whale.wd-to-cpp : : CPP ] ;
+
+
+actions whale 
+{
+    $(.whale) -d $(<[1]:D) $(>)      
+}
+
+actions dolphin
+{    
+    $(.dolphin) -d $(<[1]:D) $(>)
+}
+
+actions wd
+{    
+    $(.wd) -d $(<[1]:D) -g $(>)
+}
+

Added: boost-build/branches/upstream/current/tools/xlf.jam
===================================================================
--- boost-build/branches/upstream/current/tools/xlf.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/xlf.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,39 @@
+# Copyright (C) 2004 Toon Knapen
+#
+#  Use, modification and distribution is subject to the Boost Software
+#  License Version 1.0. (See accompanying file LICENSE_1_0.txt or
+#  http://www.boost.org/LICENSE_1_0.txt)
+
+#
+# toolset configuration for the IBM Fortran compiler (xlf)
+# 
+
+import toolset : flags ;
+import feature ;
+import fortran ;
+
+rule init ( version ? : command * : options * )
+{
+}
+
+# Declare flags and action for compilation
+flags xlf OPTIONS <optimization>off : -O0 ;
+flags xlf OPTIONS <optimization>speed : -O3 ;
+flags xlf OPTIONS <optimization>space : -Os ;
+
+flags xlf OPTIONS <debug-symbols>on : -g ;
+flags xlf OPTIONS <profiling>on : -pg ;
+
+flags xlf DEFINES <define> ;
+flags xlf INCLUDES <include> ;
+
+rule compile-fortran
+{
+}
+
+actions compile-fortran
+{
+  xlf $(OPTIONS) -I$(INCLUDES) -c -o "$(<)" "$(>)" 
+}
+
+generators.register-fortran-compiler xlf.compile-fortran : FORTRAN : OBJ ; 

Added: boost-build/branches/upstream/current/tools/xsltproc-config.jam
===================================================================
--- boost-build/branches/upstream/current/tools/xsltproc-config.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/xsltproc-config.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,37 @@
+#~ Copyright 2005 Rene Rivera.
+#~ 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)
+
+# Automatic configuration for Python tools and librries. To use, just import this module.
+
+import os ;
+import toolset : using ;
+
+if [ os.name ] = NT
+{
+    local xsltproc-path = [ GLOB [ modules.peek : PATH ] "C:\\Boost\\bin" : xsltproc\.exe ] ;
+    xsltproc-path = $(xsltproc-path[1]) ;
+    
+    if $(xsltproc-path)
+    {
+        if --debug-configuration in [ modules.peek : ARGV ]
+        {
+            ECHO "notice:" using xsltproc ":" $(xsltproc-path) ;
+        }
+        using xsltproc : $(xsltproc-path) ;
+    }
+}
+else
+{
+    local xsltproc-path = [ GLOB [ modules.peek : PATH ] : xsltproc ] ;
+    xsltproc-path = $(xsltproc-path[1]) ;
+    
+    if $(xsltproc-path)
+    {
+        if --debug-configuration in [ modules.peek : ARGV ]
+        {
+            ECHO "notice:" using xsltproc ":" $(xsltproc-path) ;
+        }
+        using xsltproc : $(xsltproc-path) ;
+    }
+}

Modified: boost-build/branches/upstream/current/tools/xsltproc.jam
===================================================================
--- boost-build/branches/upstream/current/tools/xsltproc.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/tools/xsltproc.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -12,10 +12,12 @@
 
 import feature ;
 import regex ;
+import sequence ;
 import common ;
 
 feature.feature xsl:param : : free ;
 feature.feature xsl:path : : free ;
+feature.feature catalog : : free ;
 
 # Initialize xsltproc support. The parameters are:
 #   xsltproc: The xsltproc executable
@@ -48,31 +50,52 @@
     flags += --path $(path:G=) ;
   }
         
+  # Take care of implicit dependencies
+  local other-deps ;
+  for local dep in [ feature.get-values <implicit-dependency> : $(properties) ]
+  {
+    other-deps += [ $(dep:G=).creating-subvariant ] ;
+  }
+
+  local implicit-target-directories ;
+  for local dep in [ sequence.unique $(other-deps) ]
+  {
+    implicit-target-directories += [ $(dep).all-target-directories ] ;
+  }
+
+  for local dir in $(implicit-target-directories)
+  {
+    flags += --path $(dir) ;
+  }
+
   return $(flags) ;
 }
 
 
+local rule .xsltproc ( target : source stylesheet : properties * : dirname ? : action )
+{
+    STYLESHEET on $(target) = $(stylesheet) ;
+    FLAGS on $(target) = [ compute-xslt-flags $(target) : $(properties) ] ;
+    NAME on $(target) = $(.xsltproc) ;
+    
+    for local catalog in [ feature.get-values <catalog> : $(properties) ]
+    {
+        CATALOG = [ common.variable-setting-command XML_CATALOG_FILES : $(catalog) ] ;
+    }
+    
+    $(action) $(target) : $(source) ;
+}
+
 rule xslt ( target : source stylesheet : properties * )
 { 
-  STYLESHEET on $(target) = $(stylesheet) ;
-  FLAGS on $(target) = [ compute-xslt-flags $(target) : $(properties) ] ;
-  NAME on $(target) = $(.xsltproc) ;
-    
-  CATALOG = [ common.variable-setting-command "XML_CATALOG_FILES" "catalog.xml" ] ;  
-  xslt-xsltproc $(target) : $(source) ;
+    return [ .xsltproc $(target) : $(source) $(stylesheet) : $(properties) : : xslt-xsltproc ] ;
 }
 
 rule xslt-dir ( target : source stylesheet : properties * : dirname )
-{   
-  STYLESHEET on $(target) = $(stylesheet) ;
-  FLAGS on $(target) = [ compute-xslt-flags $(target) : $(properties) ] ;
-  DIRECTORY on $(target) = $(dirname) ;
-  NAME on $(target) = $(.xsltproc) ;
-  CATALOG = [ common.variable-setting-command "XML_CATALOG_FILES" "catalog.xml" ] ;      
-  xslt-xsltproc-dir $(target) : $(source) ;
+{ 
+    return [ .xsltproc $(target) : $(source) $(stylesheet) : $(properties) : $(dirname) : xslt-xsltproc-dir ] ;
 }
 
-
 actions xslt-xsltproc
 {
   $(CATALOG) "$(NAME:E=xsltproc)" $(FLAGS) --xinclude -o "$(<)" "$(STYLESHEET)" "$(>)"
@@ -80,8 +103,5 @@
 
 actions xslt-xsltproc-dir
 {
-  $(CATALOG) "$(NAME:E=xsltproc)" $(FLAGS) --xinclude -o "$(DIRECTORY)/" "$(STYLESHEET)" "$(>)"
+  $(CATALOG) "$(NAME:E=xsltproc)" $(FLAGS) --xinclude -o "$(<:D)/" "$(STYLESHEET)" "$(>)"
 }
-
-IMPORT $(__name__) : xslt : : xslt ;
-IMPORT $(__name__) : xslt-dir : : xslt-dir ;

Modified: boost-build/branches/upstream/current/user-config.jam
===================================================================
--- boost-build/branches/upstream/current/user-config.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/user-config.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -6,7 +6,7 @@
 #  This file is used to configure your Boost.Build installation. Please read
 #  the user manual to find out where to put it.
 
-#  Toolset declarations are most important in this file. The tell Boost.Build
+#  Toolset declarations are most important in this file. They tell Boost.Build
 #  what compilers are available and where to look for them. The first toolset
 #  will become "default" one.
 #  Some important libraries can also be configured.
@@ -20,7 +20,7 @@
 #  using gcc ;
 
 #  Configure specific gcc version, giving alternative name to use
-#  using gcc : 3.2 g++-3.2 ;
+#  using gcc : 3.2 : g++-3.2 ;
 
 #  MSVC configuration
 
@@ -40,7 +40,7 @@
 #  using stlport : : /usr/include/stlport ;
 
 #  Configure, specifying locatioh of both headers and libraries
-#  using stlport : : /usr/include/stlport : /usr/lib ;
+#  using stlport : : /usr/include/stlport /usr/lib ;
 
 
 #  QT configuration
@@ -51,18 +51,3 @@
 #  Configure with explicit installation prefix
 #  using qt : /usr/opt/qt ;
 
-#  xsltproc (from libxslt) configuration
-#  using xsltproc ;
-
-#  BoostBook configuration. Please see BoostBook for documentation
-#  on this.
-#  using boostbook ;
-#  using boostbook : /home/gregod/Projects/share/docbook-xsl-1.60.1/ 
-#                  : /home/gregod/Projects/share/docbook-dtd-4.2/
-#                  ;
-
-
-
-  
- 
-

Modified: boost-build/branches/upstream/current/util/container.jam
===================================================================
--- boost-build/branches/upstream/current/util/container.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/util/container.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -22,7 +22,7 @@
         
     # Set the value of this node, passing nothing will clear it.
     #
-    rule set ( value ? )
+    rule set ( value * )
     {
         self.value = $(value) ;
     }
@@ -214,6 +214,7 @@
 
     # Sorts the vector inplace, calling 'utility.less' for
     # comparisons.
+    # NOTE: this rule is unused at the moment.
     rule sort ( )
     {
         self.value = 

Modified: boost-build/branches/upstream/current/util/doc.jam
===================================================================
--- boost-build/branches/upstream/current/util/doc.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/util/doc.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -14,11 +14,12 @@
 import container ;
 import "class" ;
 import sequence ;
+import path ;
 
 # The type of output to generate.
 # "console" is formated text echoed to the console (the default);
 # "text" is formated text appended to the output file;
-# "html" is HTLM output to the file.
+# "html" is HTML output to the file.
 #
 help-output = console ;
 
@@ -251,7 +252,7 @@
     print.list-item --help-output <type>; The type of output to genetare.
         '"console" is formated text echoed to the console (the default);'
         '"text" is formated text appended to the output file;'
-        '"html" is HTLM output to the file.' ;
+        '"html" is HTML output to the file.' ;
     print.list-item --help-output-file <file>; The file to output the documentation. ;
     print.list-end ;
 }
@@ -570,6 +571,41 @@
     }
 }
 
+# Generate documentation for a project.
+#
+local rule print-help-project (
+    unused ?
+    : jamfile * # The project Jamfile.
+    )
+{
+    if $(jamfile<$(jamfile)>.docs[1])
+    {
+        # Print the docs.
+        print.section "Project-specific help"
+            Project has jamfile at $(jamfile) ;
+        
+        print.lines $(jamfile<$(jamfile)>.docs) "" ;
+    }
+}
+
+# Generate documentation for a config file.
+#
+local rule print-help-config (
+    unused ?
+    : type # The type of configuration file user or site.
+    config-file # The configuration Jamfile.
+    )
+{
+    if $(jamfile<$(config-file)>.docs[1])
+    {
+        # Print the docs.
+        print.section "Configuration help"
+            Configuration file at $(config-file) ;
+        
+        print.lines $(jamfile<$(config-file)>.docs) "" ;
+    }
+}
+
 local rule __test__
 {
 }
@@ -808,11 +844,11 @@
 rule scan-module (
     target # The module file.
     : text * # The text in the file, one item per line.
-    : binding
+    : action * # Rule to call to output docs for the module.
     )
-{    
+{
     if $(.option.debug) { ECHO "HELP:" scanning module target '$(target)' ; }
-    local module-name = $(.module<$(target)>.name) ;
+    local module-name = $(target:B) ;
     local module-documented = ;
     local comment-block = ;
     local syntax-block = ;
@@ -836,6 +872,12 @@
             # mark as the copy for the module.
             set-module-copyright $(module-name) : $(comment-block) ;
         }
+        else if $(action[1]) in "print-help-project" "print-help-config"
+            && ! $(jamfile<$(target)>.docs[1])
+        {
+            # special module docs for the project jamfile.
+            jamfile<$(target)>.docs = $(comment-block) ;
+        }
         else if ! $(module-documented)
         {
             # document the module.
@@ -843,11 +885,9 @@
             module-documented = true ;
         }
     }
-    for local action in $(.module<$(target)>.actions)
+    if $(action)
     {
-        local action-rule = [ $(action).front ] ; $(action).pop-front ;
-        local action-args = [ $(action).get ] ;
-        local ignored = [ $(action-rule) $(module-name) : $(action-args) ] ;
+        $(action[1]) $(module-name) : $(action[2-]) ;
     }
 }
 
@@ -855,7 +895,40 @@
 # header scanning phase.
 IMPORT $(__name__) : scan-module : : doc.scan-module ;
 
+# Read in a file using the SHELL builtin and return the
+# individual lines as would be done for header scanning.
+#
+local rule read-file (
+    file # The file to read in.
+    )
+{
+    file = [ path.native [ path.root [ path.make $(file) ] [ path.pwd ] ] ] ;
+    if ! $(.file<$(file)>.lines)
+    {
+        local content ;
+        switch [ modules.peek : OS ]
+        {
+            case NT :
+            content = [ SHELL "TYPE \"$(file)\"" ] ;
 
+            case * :
+            content = [ SHELL "cat \"$(file)\"" ] ;
+        }
+        local lines ;
+        local nl = "
+" ;
+        local << = "([^$(nl)]*)[$(nl)](.*)" ;
+        local line+ = [ MATCH "$(<<)" : "$(content)" ] ;
+        while $(line+)
+        {
+            lines += $(line+[1]) ;
+            line+ = [ MATCH "$(<<)" : "$(line+[2])" ] ;
+        }
+        .file<$(file)>.lines = $(lines) ;
+    }
+    return $(.file<$(file)>.lines) ;
+}
+
 # Add a scan action to perform to generate the help documentation.
 # The action rule is passed the name of the module as the first argument.
 # The second argument(s) are optional and passed directly as specified
@@ -866,38 +939,21 @@
     : action * # The action rule, plus the secondary arguments to pass to the action rule.
     )
 {
-    local targets = ;
-    for local module-file in $(modules)
-    {
-        local module-name = $(module-file:B) ;
-        .module<$(module-file)>.name = $(module-name) ;
-        if $(action)
-        {
-            .module<$(module-file)>.actions += [ class.new vector $(action) ] ;
-        }
-        HDRSCAN on $(module-file) = "^(.*).$" ;
-        HDRRULE on $(module-file) = doc.scan-module ;
-        NOTFILE $(module-name).scan ;
-        ALWAYS $(module-name).scan ;
-        INCLUDES $(module-name).scan : $(module-file) ;
-        targets += $(module-name).scan ;
-    }
-    if $(help-output) = console
-    {
-        DEPENDS all : $(targets) ;
-    }
     if $(help-output) = text
     {
         print.output $(help-output-file).txt plain ;
         ALWAYS $(help-output-file).txt ;
-        DEPENDS $(help-output-file).txt : $(targets) ;
         DEPENDS all : $(help-output-file).txt ;
     }
     if $(help-output) = html
     {
         print.output $(help-output-file).html html ;
         ALWAYS $(help-output-file).html ;
-        DEPENDS $(help-output-file).html : $(targets) ;
         DEPENDS all : $(help-output-file).html ;
     }
+    for local module-file in $(modules[1--2])
+    {
+        scan-module $(module-file) : [ read-file $(module-file) ] ;
+    }
+    scan-module $(modules[-1]) : [ read-file $(modules[-1]) ] : $(action) ;
 }


Property changes on: boost-build/branches/upstream/current/util/indirect.jam
___________________________________________________________________
Name: svn:executable
   - 
   + *

Added: boost-build/branches/upstream/current/util/option.jam
===================================================================
--- boost-build/branches/upstream/current/util/option.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/util/option.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -0,0 +1,93 @@
+#  Copyright (c) 2005 Vladimir Prus.
+#
+#  Use, modification and distribution is subject to 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 ;
+
+rule get ( name : default-value ? )
+{
+    local m = [ MATCH --$(name)=(.*) : [ modules.peek : ARGV ] ] ;
+    if $(m)
+    {
+        return $(m[1]) ;
+    }
+    else
+    {
+        return $(default-value) ;
+    }        
+}
+
+
+rule process ( )
+{ 
+    # Check command-line args as soon as possible.  For each option try
+    # to load module named after option. Is that succeeds, invoke 'process'
+    # rule in the module. The rule may return "true" to indicate that the
+    # regular built process should not be attempted.
+    #
+    # Options take the general form of: --<name>[=<value>] [<value>]
+    #
+    
+    local ARGV = [ modules.peek : ARGV ] ;
+    local BOOST_BUILD_PATH = [ modules.peek : BOOST_BUILD_PATH ] ;
+    
+    local dont-build ;
+    local args = $(ARGV) ;
+    while $(args)
+    {
+        local arg = [ MATCH ^--(.*) : $(args[1]) ] ;
+        while $(args[2-]) && ! $(arg)
+        {
+            args = $(args[2-]) ;
+            arg = [ MATCH ^--(.*) : $(args[1]) ] ;
+        }
+        args = $(args[2-]) ;
+
+        if $(arg)
+        {
+            local split = [ MATCH ^(([^-=]+)[^=]*)(=?)(.*)$ : $(arg) ] ;
+            local full-name = $(split[1]) ;
+            local prefix = $(split[2]) ;
+            local values ;
+
+            if $(split[3])
+            {
+                values = $(split[4]) ;
+            }
+            if $(args) && ! [ MATCH ^(--).* : $(args[1]) ]
+            {
+                values += $(args[1]) ;
+                args = $(args[2-]) ;
+            }
+
+            # look in options subdirectories of BOOST_BUILD_PATH for modules
+            # matching the full option name and then its prefix.
+            local plugin-dir = options ;
+            local option-files = [
+              GLOB $(plugin-dir:D=$(BOOST_BUILD_PATH)) : $(full-name).jam $(prefix).jam
+            ] ;
+
+            if $(option-files)
+            {
+                # load the file into a module named for the option
+                local f = $(option-files[1]) ;
+                local module-name = --$(f:D=:S=) ;
+                modules.load $(module-name) : $(f:D=) : $(f:D) ;
+
+                # if there's a process rule, call it with the full option name
+                # and its value (if any).  If there was no "=" in the option,
+                # the value will be empty.
+                if process in [ RULENAMES $(module-name) ]
+                {
+                    dont-build +=
+                      [ modules.call-in $(module-name) : process --$(full-name) : $(values) ] ;
+                }
+            }
+        }
+    }
+
+    return $(dont-build) ;
+}
+

Modified: boost-build/branches/upstream/current/util/os.jam
===================================================================
--- boost-build/branches/upstream/current/util/os.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/util/os.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -4,14 +4,87 @@
 #  warranty, and with no claim as to its suitability for any purpose.
 
 import modules ;
-name = [ modules.peek : OS ] ;
-platform = [ modules.peek : OSPLAT ] ;
-version = [ modules.peek : OSVER ] ;
 
-rule name { return $(name) ; }
-rule platform { return $(platform) ; }
-rule version { return $(version) ; }
+# Return the value(s) of the given environment variable(s) at the time
+# bjam was invoked.
+rule environ ( variable-names + )
+{
+    return [ modules.peek .ENVIRON : $(variable-names) ] ;
+}
 
+.name = [ modules.peek : OS ] ;
+.platform = [ modules.peek : OSPLAT ] ;
+.version = [ modules.peek : OSVER ] ;
+
+local rule constant ( c )
+{
+    # First look for platform-specific name, then general value
+    local variables = .$(c)-$(.name) .$(c) ;
+    local result = $($(variables)) ;
+    return $(result[1]) ;
+}
+
+rule get-constant  ( )
+{
+    # Find the name of the constant being accessed, which is
+    # equal to the name used to invoke us.
+    local bt = [ BACKTRACE 1 ] ;
+    local rulename = [ MATCH ([^.]*)$ : $(bt[4]) ] ;
+    return [ constant $(rulename) ] ;
+}
+
+
+# export all the common constants
+.constants = name platform version shared-library-path-variable path-separator ;
+for local constant in $(.constants) 
+{
+    IMPORT $(__name__) : get-constant : $(__name__) : $(constant) ;
+}
+EXPORT $(__name__) : $(.constants) ;
+
+.shared-library-path-variable-NT = PATH ;
+.path-separator-NT = ";" ;
+.expand-variable-prefix-NT = % ;
+.expand-variable-suffix-NT = % ;
+
+.shared-library-path-variable-CYGWIN = PATH ;
+.path-separator-CYGWIN = ":" ;
+.expand-variable-prefix-CYGWIN = $ ;
+.expand-variable-suffix-CYGWIN = "" ;
+
+.shared-library-path-variable-MACOSX = DYLD_LIBRARY_PATH ;
+
+
+.shared-library-path-variable = LD_LIBRARY_PATH ;
+.path-separator = ":" ;
+.expand-variable-prefix = $ ;
+.expand-variable-suffix = "" ;
+
+if $(.name) = NT
+{
+    local home = [ environ HOMEDRIVE HOMEPATH ] ;
+    .home-directories = $(home[1])$(home[2]) [ environ HOME ] ;
+}
+else
+{
+    .home-directories = [ environ HOME ] ;
+}
+
+# Can't use 'constant' mechanism because it only returns 1-element
+# values.
+rule home-directories ( )
+{
+    return $(.home-directories) ;
+}
+# Return the string needed to represent the expansion of the named
+# shell variable.
+rule expand-variable ( variable )
+{
+    local prefix = [ constant expand-variable-prefix ] ;
+    local suffix = [ constant expand-variable-suffix ] ;
+    return $(prefix)$(variable)$(suffix) ;
+}
+
 # Returns true if running on windows, whether in cygwin or not.
 rule on-windows 
 {
@@ -33,6 +106,15 @@
     return $(result) ;
 }
 
+if ! [ on-windows ] 
+{
+    .on-unix = 1 ;
+}
+
+rule on-unix
+{
+    return $(.on-unix) ;
+}
      
 
 import regex ;

Modified: boost-build/branches/upstream/current/util/path.jam
===================================================================
--- boost-build/branches/upstream/current/util/path.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/util/path.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -140,7 +140,16 @@
 #
 local rule join-imp ( elements + )
 {
-    return [ NORMALIZE_PATH $(elements:J="/") ] ;
+    local result = ;
+    if ! $(elements[1])
+    {
+        result = [ NORMALIZE_PATH "/" "$(elements[2-])" ] ;
+    }
+    else
+    {
+        result = [ NORMALIZE_PATH "$(elements)" ] ;
+    }
+    return $(result) ;
 }
 
 #
@@ -184,22 +193,50 @@
 #
 rule pwd ( )
 {
-    return [ make [ PWD ] ] ;
+    if $(.pwd)
+    {
+        return $(.pwd) ;
+    }
+    else
+    {
+        .pwd = [ make [ PWD ] ] ;
+        return $(.pwd) ;
+    }    
 }
 
 #
-#    Returns the list of files matching the given pattern in the specified directory.
+#    Returns the list of files matching the given pattern in the
+#    specified directory.  Both directories and patterns are 
+#    supplied as portable paths. Each pattern should be non-absolute
+#    path, and can't contain "." or ".." elements. Each slash separated
+#    element of pattern can contain the following special characters:
+#    -  '?', which match any character
+#    -  '*', which matches arbitrary number of characters.
+#    A file $(d)/e1/e2/e3 (where 'd' is in $(dirs)) matches pattern p1/p2/p3
+#    if and only if e1 matches p1, e2 matches p2 and so on.
 #
+#    For example: 
+#        [ glob . : *.cpp ] 
+#        [ glob . : */build/Jamfile ] 
 rule glob ( dirs * : patterns + )
 {
     local result ;
-    for dir in $(dirs)
+    local real-patterns ;
+    for local d in $(dirs)
     {
-        result += [ sequence.transform make : [ GLOB [ native $(dir) ] : $(patterns) ] ] ;
-    }
-    return $(result) ;
-}
+        for local p in $(patterns)
+        {
+            local pattern = [ path.root $(p) $(d) ] ;
+            real-patterns += [ path.native $(pattern) ] ;
+        }        
+    }        
+    
+    return [ sequence.transform path.make : 
+        [ GLOB-RECURSIVELY $(real-patterns) ] ] ;
 
+}    
+
+
 #
 #    Returns true is the specified file exists.
 #

Modified: boost-build/branches/upstream/current/util/print.jam
===================================================================
--- boost-build/branches/upstream/current/util/print.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/util/print.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -318,63 +318,35 @@
         }
         else
         {
-            while $(strings)
+            for local s in $(strings)
             {
-                ECHO $(strings[1]) ;
-                strings = $(strings[2-]) ;
+                ECHO $(s) ;
             }
         }
     }
-    # We ignore empty output because the Windows ECHO command is
-    # braindamaged. It doesn't have any facility for echoing a blank line.
-    else if $(output-target)
+    if ! $($(output-target).did-action)
     {
-        if ! $($(output-target).did-action)
-        {
-            $(output-target).did-action = yes ;
-            _ on $(output-target) = " " ;
-            nl on $(output-target) = "
+        $(output-target).did-action = yes ;
+        $(output-target).text-prefix = ;
+        $(output-target).text-body = ;
+        $(output-target).text-suffix = ;
+        
+        nl on $(output-target) = "
 " ;
-            text-redirect-0 on $(output-target) = ">>" ;
-            text-redirect-n on $(output-target) = ">>" ;
-            text-front on $(output-target) = ;
-            text-prefix on $(output-target) = ;
-            text-body on $(output-target) = ;
-            text-suffix on $(output-target) = ;
-            text-action $(output-target) ;
-            text-front-section.$(soutput-target) = ;
-        }
+        text-redirect on $(output-target) = ">>" ;
         if $(overwrite)
         {
-            text-redirect-0 on $(output-target) = ">" ;
+            text-redirect on $(output-target) = ">" ;
         }
-        if ! $(text-front-section.$(output-target))
-        {
-            text-front on $(output-target) = [ echo-cmd $(strings[1]) ] ;
-            text-front-section.$(output-target) = $(prefix-body-suffix) ;
-            strings = $(strings[2-]) ;
-        }
-        if $(strings)
-        {
-            if ( $(prefix-body-suffix) = prefix &&
-                    $(text-front-section.$(output-target)) != prefix ) ||
-                ( $(prefix-body-suffix) = body &&
-                $(text-front-section.$(output-target)) = suffix )
-            {
-                text-$(text-front-section.$(output-target)) on $(output-target) =
-                    [ on $(output-target) return $(text-front) ]
-                    [ on $(output-target) return $(text-$(text-front-section.$(output-target))) ] ;
-                text-front on $(output-target) = [ echo-cmd $(strings[1]) ] ;
-                text-front-section.$(output-target) = $(prefix-body-suffix) ;
-                strings = $(strings[2-]) ;
-            }
-            while $(strings)
-            {
-                text-$(prefix-body-suffix) on $(output-target) += [ echo-cmd $(strings[1]) ] ;
-                strings = $(strings[2-]) ;
-            }
-        }
+        text-content on $(output-target) = ;
+        
+        text-action $(output-target) ;
     }
+    $(output-target).text-$(prefix-body-suffix) += $(strings) ;
+    text-content on $(output-target) =
+        $($(output-target).text-prefix)
+        $($(output-target).text-body)
+        $($(output-target).text-suffix) ;
 }
 
 # Outputs the text to the current targets, after word-wrapping it.
@@ -415,43 +387,9 @@
 #
 actions quietly text-action
 {
-$(text-front)$(_)$(text-redirect-0)$(_)"$(<)"
-$(text-prefix)$(_)$(text-redirect-n)$(_)"$(<)"$(nl)
-$(text-body)$(_)$(text-redirect-n)$(_)"$(<)"$(nl)
-$(text-suffix)$(_)$(text-redirect-n)$(_)"$(<)"$(nl)
+    @($(STDOUT):E=$(text-content:J=$(nl))) $(text-redirect) "$(<)"
 }
 
-if [ modules.peek : NT ]
-{
-    rule echo-cmd ( string ? )
-    {
-        if $(string) || $(string) != ""
-        {
-            local escaped = [ regex.escape $(string) : "&|()<>^" : "^" ] ;
-            return "echo $(escaped)" ;
-        }
-        else
-        {
-            return "echo." ;
-        }
-    }
-}
-else
-{
-    rule echo-cmd ( string ? )
-    {
-        if $(string) || $(string) != ""
-        {
-            local escaped = [ regex.escape $(string) : "\\\"" : "\\" ] ;
-            return "echo \"$(escaped)\"" ;
-        }
-        else
-        {
-            return "echo" ;
-        }
-    }
-}
-
 local rule __test__ ( )
 {
     import assert ;
@@ -460,6 +398,8 @@
     assert.result "one two" three : split-at-words one two three : 8 ;
     assert.result "one two" three : split-at-words one two three : 9 ;
     assert.result "one two three" : split-at-words one two three ;
-    assert.result "one&nbsp;two&nbsp;three" "&amp;&lt;&gt;" :
-        escape-html "one two three" "&<>" ;
+    # VP, 2004-12-03 The following test fails for some reason,
+    # so commenting it out.
+    #assert.result "one&nbsp;two&nbsp;three" "&amp;&lt;&gt;" :
+    #    escape-html "one two three" "&<>" ;
 }

Modified: boost-build/branches/upstream/current/util/regex.jam
===================================================================
--- boost-build/branches/upstream/current/util/regex.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/util/regex.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -62,9 +62,7 @@
     return $(result) ;
 }
 
-# Commented out because of 'indices' parameter of 'transform' rule.
-#
-#NATIVE_RULE regex : transform ;
+NATIVE_RULE regex : transform ;
 
 # Escapes all of the characters in symbols using the escape symbol
 # escape-symbol for the given string, and returns the escaped string
@@ -154,7 +152,7 @@
     assert.result a.h c.h 
       : transform <a.h> \"b.h\" <c.h> :  <(.*)> ;
 
-    assert.result a.h "" b.h c.h 
+    assert.result a.h b.h c.h 
       : transform <a.h> \"b.h\" <c.h> :  <([^>]*)>|\"([^\"]*)\" : 1 2 ;
 
     assert.result "^<?xml version=\"1.0\"^>"

Modified: boost-build/branches/upstream/current/util/utility.jam
===================================================================
--- boost-build/branches/upstream/current/util/utility.jam	2006-11-09 09:41:48 UTC (rev 14015)
+++ boost-build/branches/upstream/current/util/utility.jam	2006-11-09 09:53:31 UTC (rev 14016)
@@ -95,7 +95,19 @@
     return $(result) ;    
 }
 
+# If 'name' contains a dot, returns the part before the last dot.
+# If 'name' contains no dot, returns it unmodified.
+rule basename ( name )
+{    
+    if $(name:S)
+    {
+        name = $(name:B) ;
+    }
+    return $(name) ;
+}
 
+
+
 local rule __test__ ( )
 {
     import assert ;
@@ -135,6 +147,10 @@
     assert.result "not sure" : equal [ new test-class__ ] 1 ;
     
     assert.result foo.lib foo.lib : apply-default-suffix .lib : foo.lib foo.lib ;
+    
+    assert.result foo : basename foo ;
+    assert.result foo : basename foo.so ;
+    assert.result foo.so : basename foo.so.1 ;
 }
 
 




More information about the pkg-boost-commits mailing list