Release Versioning is the process of assigning version numbers to software releases. Versioning helps manage the project in four ways. First, it allows us to refer to a particular state of the source code using friendly names, like Crypto++ 5.6.2 rather than a check-in number like R541. Second, it helps convey significance to a unique state of the software in time. Third, it helps locate a previous software state in source control, if needed. Fourth, it helps convey information about ABI and API compatibility.
This pages discusses how the project names a version of Crypto++, what to expect when a version number changes, and how to locate a particular state of the source code in Subversion or Git. The page also provides a brief history of releases. A related topic is Release Testing, and what it takes to release a version of Crypto++.
There is no definitive guide on versioning requirements, but it is important to follow best practices when a change occurs. The version number assigned to a release often conveys information on both ABI and API compatibility. Best practices often attempt to capture client compatibility requirements, especially in the context of shared objects and dynamic linking.
Header files with definitions and inlined functions makes consistent versioning a challenge because the library attempts to respect requirements on a number of different platforms. Each platform, like Debian and Apple, has its own expectation of what changes when a number is incremented or bumped. Some distributions, like Debian, will also monitor source control for a tagged release event and then automatically kick-off an update. Since its an automatic process, care must be taken to avoid problems for down stream.
Currently there is no process to evaluate the effects of changing source code on the ABI or API. The project does not use an ABI tracker in order to automate binary compatibility analysis. The project would like to add it in the future.
Crypto++ historically utilizes a scheme consisting of a prefix and monotonically increasing version for naming releases. The prefix is
CRYPTOPP, and the version consists of Major, Minor, and an optional Compatibility (or Patch). Each part of the name is separated with an underscore or _. Sometimes the third number is omitted when it is 0.
The library does not use the 4th tuple, sometimes called Revision, and it does not use letters like
b. In addition, the library does not use an odd/even scheme. Finally, the library does not name release candidates.
Examples of the name are
Crypto++ releases are shown in the table below. The first column is the version, the second column is the tag name, the third column is the filesystem date. The filesystem date is the time on the server, and not the release date reported by subversion.
The fourth column is the symbolic define from
config.h. The symbolic define is
CRYPTOPP_VERSION. The fifth column is the filename made available for download. The sixth and seventh columns provide revision and check-in numbers, if available.
|Crypto++ 4 and earlier were in CVS. There is no historical source control record, other than filesystem names and dates.|
† Crypto++ supplied the macro
CRYPTOPP_VERSION at X.Y.Z.
‡ Crypto++ migrated from Sourceforge to Git in August, 2015.
After releasing the library the project's version should be bumped, even for SVN and GitHub. For example, if Crypto++ 5.6.4 was released, then the compatibility number should be changed from 4 to 5 in in 5.6.5. And if Crypto++ 5.7.0 was released, then the version should be changed to 5.7.1.
This change helps with user questions that start with "I'm using Crypto++ 5.6.3 and I'm having problems with ...". When the project encounters the question, its unclear if its the 5.6.3 release ZIP, or Master without the next version bump. The change also helps determine the actual compatibility level during development. That is, if Master advertises version information X.Y.Z, then it better be compatible with X.Y.
Its also OK to release under a more appropriate version number. For example, the following is perfectly valid: release 5.6.3, bump to 5.6.4 during development, and then release 5.7.0. In this case version information is monotonically increasing, and there is no confusion or disambiguation needed.
The locations of version numbers are:
cryptlib.hand Doxygen comment
Two additional projects should also have its version incremented. The first is Autotools, and the second is CMake.
Also see the discussion Post-release version number increment on the user mailing list.