Copyright 2004-2007 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) 

Milestone 13 (in development)

Changes in this release:

The following bugs were fixed:

    - gcc suport did not work on HP-UX systems

Milestone 12 (Oct 1, 2007)

Changes in this release:

    - The Pathscale, PGI and mipspro compilers are now supported.    
    - Support for autoconfiguration of toolset based on command-line
      toolset=xxxx request, and for default toolset
      configuration as a fallback.
    - Support for precompiled headers for gcc toolset,
      and improvements for msvc.
    - Mechanism for removing inherited requirements.
    - The 'make' rule support specifying usage-requirements.
    - New 'project.extension' rule for declaring standalone
      projects.
    - New 'conditional' convenience rule.
    - New 'glob-tree' rule.
    - The 'glob' rule accepts patterns to exclude.
    - Inline targets are now marked explicit automatically.
    - Toolsets can now implicitly add requirements to
    all targets.
    - New 'generate' rule.
    - The executables produced by the 'run' rule are automatically
    removed after run.
    - The gcc toolset uses the version obtained by running
    the compiler, if no explicit one is provided.    
    - The sun toolset now supports the 'address-model' feature,
    and uses -KPIC for shared libraries.
    - Free features on command line affect all targets, not
    just 'directly requested' ones.


Documentation changes:

    - Installation instructions for Linux distributors.
    - Configuration options for all supported C++ compilers
    are now documented.

The following bugs were fixed:

    - The 'cflags' and 'linkflags' now work on Darwin.o
    - The intel toolset now works on Windows.
    - Fix library search options for CodeWarriour toolset.
    - The <install-source-root> could cause duplicate
    mkdir commands.
    - Numerious fixes in Boost autolink support
    - Numerious fixes in Boost.Python support.
    - Indirect properties not evaluated in usage requirements.
    - Generator that returns a property set but not target is
    considered successful.
    - On Darwin, when several compiler versions
    are configured, -fcoalesce-templates is applied only to
    versions that need it.


Milestone 11 (Jule 20, 2006)

Changes in this release:

    - New C++ compilers: IBM xlf, HP aCC, HP CXX, Intel fortran compiler.
    - New tools: Qt4 support, MS message compiler and IDL compiler.
    - New main targets: 'notfile' and 'cast'.

    - Core changes:

        - Only one file required at top level of a project, named Jamroot.
        - Jamfiles can now contain project-specific help messages.
        - "Indirect conditional requirements" introduced
          (http://tinyurl.com/mn3jp)
        - Strip suffix in main target names when computing names of generated 
          files (URL) 
        - The 'source-location' project attribute can contain 
          several directories.
        - Usage requirements are propagated not only direct dependents, 
          but to indirect dependents.

    - Command line option changes (see http://tinyurl.com/zbycz)
        - New option --build-dir
        - The --clean option cleans only target below the current directory,
          not globally. 
        - New --clean-all option was added.
        - New option --debug-building
        - Running "bjam some_directory" works even if there's no Jamfile 
          in the current directory.

    - Toolset improvements:
        - Assembling support with gcc, borland and msvc.
        - Support amd64/ia64 cross-compiling with msvc.
        - Improved, registry-based autodetection for msvc.
        - Serialize execution of gcc.link actions  
        - Precompiled headers supported on MSVC 
          (Need documentation)

    - New features <warnings> and <warnings-as-errors>           
    - The 'glob' rule accepts wildcards in directory names.
    - The 'stage' rule was renamed to 'install' 
      (the old name still available for compatibility)
    - The <tag> feature can accept user-defined function as value
      (URL)
    - The 'install' rule can install a directory hierarchy preserving relative
      paths.
    - The 'install' rule no longer allows to change library 
      name during install.
    - The Jamfile referred via 'use-project' may declare project id different
      from the one in 'use-project'.
    - The 'using' rule now searches the directory of containing Jamfile.
     

The following bugs were fixed:

    - The <library> feature was ignored for static linking
    - Fix #include scanning for C files.
    - Child projects were sometimes loaded before parent projects.
    - Fix project references with absolute paths on Windows. 
    - The <dependency> feature was ignored for 'install' targets.
    - A generator having the same type in sources and targets was causing hang.
    - Use 'icpc' command for Intel, fixing errors with 8.1 and higher. 
    - Generation of PS files with the FOP tool really produces .PS files.
    - No dependency scanning was done for C files.
    - The 'constant' and 'path-constant' rules did not accept multi-element
      value.
    - Don't pass -fcoalesce-templates to gcc on OSX 10.4
    - Fix static lib suffix on OSX.
    - Fix rpath setting on Intel/Linux.
    - The 'install' rule don't unnecessary scans #includes in installed
      headers.
       

Developer visible changes:

    - Ability to customize type's prefix depending on build properties.
    - Generator's 'run' method can return usage-requirements.  
    - Main target rule is automatically declared for each new target type.
    - 'Link incompatible' feature attribute was removed
    - Generators no longer bypass unhandled sources, they just ignore them.
    - If there are several applicable generators, immediately report ambiguity.
      Provide a way to explicitly resolve conflicts between generators.
    - The 'flags' rule can match absense of feature.
    - Great improvement in response files handling
    - The 'toolset.flags' rules allows value-less feature to signify
      absense of this feature (fix hack-hack).
    - Automatically declare main target rule for each declared target type.
    - When inheriting types, inherit generators for the base type, as opposed
      to using various hacks to invoke base generators when needed.
    - Improve diagnostic for "duplicate actual target" and generator ambiguity.


Milestone 10 (October 29, 2004)

Changes in this release:

    Many toolsets were added: Intel, Metrowerks, Comeau, aCC, vacpp.
    Documentation was converted to BoostBook and improved.
    Performance was improved.
 
    - Toolsets initialization syntax is much more uniform. Compiler and linker
      flags can now be specified.
    - The algorithm for computing build properties was improved. Conditional
      requirements can be chained, and a number of bugs were fixed.
    - Specific order of properties can be specified.
    - The main target rules can be called from everywhere, not necessary from
      Jamfile.
    - Check for "unused sources" removed.
    - The <library> feature affects only linking now.
    - The <file> feature now works only for libraries.
    - Simpler syntax for "searched" libraries was added.
    - New <dependency> feature.
    

    Unix: 
        The right order of static libraries on Unix is automatically
        computed. 
        The <hardcode-dll-paths> feature is the default.
    gcc: 
         The -fPIC option is passed when creating shared libraries. 
         Problems with distcc were solved.
    Sun:         
         It's now possible to use the sun linker (as opposed to gnu), and
         to compile C files.
    Darwin:
         Shared libraries are now supported.
    MSVC: Before resource files compilation, the setup script is invoked.
          Options deprecated in 8.0 are not longer used.


The following bugs were fixed:

    - The <unit-test> rule did not handle the <library> property (!!!!!!)
    - Don't add "bin" to the build directory explicitly specified by the user.
    - Allow <include-type> to select staged targets,
      even with <traverse-dependencies>off.
    - Includes for the form '# include <whatever>" did not work.
    - (Qt) Add paths to all dependent libs to uic command
      line, which helps if the UI files uses plugins.
    - Using <toolset-msvc:version>xxx in requirements was broken.
    - Error message printed when target can be found is much more clear.
    - Inline targets in sources of 'stage' did not work.
    - Don't produce 'independent target' warnings on Windows
    - (gcc) The <link-runtime>static did not work.
    - (gcc) Suppress warnings from the 'ar' tool on some systems.
    - (gcc) Don't try to set soname on NT.

Developer visible changes:

    - Generator priorities are gone, explicit overrides are used.
    - 'Active' features were removed
    - Support for VMS paths was added.

Thanks to Christopher Currie, Pedro Ferreira, Philipp Frauenfelder,
Andre Hentz, Jurgen Hunold, Toon Knapen, Johan Nilsson, Alexey Pakhunov, 
Brock Peabody, Michael Stevens and Zbynek Winkler who contributed 
code to this release.
 

Milestone 9.1 (Nov 6, 2003)

The following bugs were fixed:

    - The 'unit-test' rule used to ignore <library> properties.
    - The gcc toolset used to ignore <threading> property.

Milestone 9 (Nov 6, 2003)

Changes in this release

    - Putting library in sources of other library now works even for static
      linking, which makes expressing library->library dependency much
      simpler.
    - Performance was considerably improved.      
    - Regression testing framework now works on windows.
    - The "alias" rule can have usage requirements and passes on usage
      requirements of sources.
    - The "stage" rule can traverse dependencies.
    - Support for "def files" was implemented.
    - Targets paths are now shorter.
    - Darwin toolset was improved.

The following bugs were fixed:

    - It was not possible to specify empty suffix for a target type derived
      from other type.
    - The stage rules used to generate incorrect suffix in some cases.
    - It was possible to load Jamfile twice. 
    - The 'use-project' rule was broken when referring to a child project.
    - Use of composite properties in requirements did not work.

Developer visible changes:

    - New CALC builtin, which considerable improves performance.
    - Source layout was reorganized.
    - Handling of response file was simplified.

Thanks to Pedro Ferreira, Kirill Lapshin, Andre Hentz, Paul Lin, 
Jurgen Hunold, Christopher Currie, and Brock Peabody, who contributed to 
this release.

Milestone 8 (Oct 15, 2003)

Changes in this release:
 
    - A regression testing framework was implemented.
    - New <implicit-dependency> feature was added for better handling 
      of dependencies to generated headers.
    - The link-compatibility checks not longer cause projects to be skipped,
      and issue warning, not error, for main targets.    
    - Algorithm for selecting main target alternative was improved.
    - The <dependency> feature was renamed to <use>.
    - Project root constants were made available in project root itself.

The following bugs were fixed:

    - failure to recognize shared libraries with version as such
    - the 'path-constant' rule was mishandling absolute paths on Windows.


Milestone 7 (Sep 11, 2003)

Changes in this release:

    - Performance was improved.
    - Support for Sun and Darwin toolsets was added.    
    - <tag> feature, which changes the name of target depending of build
      variant, was implemented.
    - Old-style targets-ids are no longer supported.
    - New 'glob' rule allows to easily perform wildcard matching in Jamfile.
    - Improve bison/flex support to understand C++.

The following bugs were fixed:

    - bogus error on use of project default-build attribute with several
      main target alternatives.
    - broken toolset inheritance
    - hard error after skipping a target due to incompatible requirements
    - incorrect behaviour of a generator when producing several targets of 
      the same type
    - errors on use of the 'project-root' rule in Jamfile context
    - inability to require specific compiler version for a main target.    
    - incorrect behaviour of "bjam msvc" when msvc is configured with explicit
      version.
    
Thanks to Christopher Currie, Pedro Ferreira and Michael Stevens, who
contributed to this release.


    

