Changes for 1.5.0:

 * New feature: assertions can be safely called in multiple threads
   where the pthreads library is available.
 * New feature: predicates used inside EXPECT_TRUE() and friends
   can now generate custom failure messages.
 * New feature: Google Test can now be compiled as a DLL.
 * New feature: fused source files are included.
 * New feature: prints help when encountering unrecognized Google Test flags.
 * Experimental feature: CMake build script (requires CMake 2.6.4+).
 * Experimental feature: the Pump script for meta programming.
 * double values streamed to an assertion are printed with enough precision
   to differentiate any two different values.
 * Google Test now works on Solaris and AIX.
 * Build and test script improvements.
 * Bug fixes and implementation clean-ups.

 Potentially breaking changes:

 * Stopped supporting VC++ 7.1 with exceptions disabled.
 * Dropped support for 'make install'.

Changes for 1.4.0:

 * New feature: the event listener API
 * New feature: test shuffling
 * New feature: the XML report format is closer to junitreport and can
   be parsed by Hudson now.
 * New feature: when a test runs under Visual Studio, its failures are
   integrated in the IDE.
 * New feature: /MD(d) versions of VC++ projects.
 * New feature: elapsed time for the tests is printed by default.
 * New feature: comes with a TR1 tuple implementation such that Boost
   is no longer needed for Combine().
 * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends.
 * New feature: the Xcode project can now produce static gtest
   libraries in addition to a framework.
 * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile,
   Symbian, gcc, and C++Builder.
 * Bug fixes and implementation clean-ups.

Changes for 1.3.0:

 * New feature: death tests on Windows, Cygwin, and Mac.
 * New feature: ability to use Google Test assertions in other testing
   frameworks.
 * New feature: ability to run disabled test via
   --gtest_also_run_disabled_tests.
 * New feature: the --help flag for printing the usage.
 * New feature: access to Google Test flag values in user code.
 * New feature: a script that packs Google Test into one .h and one
   .cc file for easy deployment.
 * New feature: support for distributing test functions to multiple
   machines (requires support from the test runner).
 * Bug fixes and implementation clean-ups.

Changes for 1.2.1:

 * Compatibility fixes for Linux IA-64 and IBM z/OS.
 * Added support for using Boost and other TR1 implementations.
 * Changes to the build scripts to support upcoming release of Google C++
   Mocking Framework.
 * Added Makefile to the distribution package.
 * Improved build instructions in README.

Changes for 1.2.0:

 * New feature: value-parameterized tests.
 * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)
   macros.
 * Changed the XML report format to match JUnit/Ant's.
 * Added tests to the Xcode project.
 * Added scons/SConscript for building with SCons.
 * Added src/gtest-all.cc for building Google Test from a single file.
 * Fixed compatibility with Solaris and z/OS.
 * Enabled running Python tests on systems with python 2.3 installed,
   e.g. Mac OS X 10.4.
 * Bug fixes.

Changes for 1.1.0:

 * New feature: type-parameterized tests.
 * New feature: exception assertions.
 * New feature: printing elapsed time of tests.
 * Improved the robustness of death tests.
 * Added an Xcode project and samples.
 * Adjusted the output format on Windows to be understandable by Visual Studio.
 * Minor bug fixes.

Changes for 1.0.1:

 * Added project files for Visual Studio 7.1.
 * Fixed issues with compiling on Mac OS X.
 * Fixed issues with compiling on Cygwin.

Changes for 1.0.0:

 * Initial Open Source release of Google Test
