version

Generate, parse and modify versions purely with CMake. Supports Semantic Versioning 2.0.0, 1.0.0 and other version formats.

Synopsis

version(PARSE <out-var> [REQUIRE [PATCH|TWEAK][;...]] <string>)
version(GENERATE <out-var> [COMPRESS] [MAJOR <major>] [MINOR <minor>] [PATCH <patch>] [TWEAK <tweak>] [PRERELEASE <prerelease>] [BUILD <build>] [REQUIRE [PATCH|TWEAK][;...]])
version(MODIFY <out-var> <string> [COMPRESS] [MAJOR <major>] [MINOR <minor] [PATCH <patch>] [TWEAK <tweak>] [PRERELEASE <prerelease>] [BUILD <build>] [REQUIRE [PATCH|TWEAK][;...]])
version(COMPARE <out-var> <a> <b>)

The following version constructs are currently supported:

<major> "." <minor> ["." <patch> ["." <tweak>]] [["-"] <pre-release> ["." <pre-release> [...]]] ["+" <build> ["." <build> [...]]]

Parsing

version(PARSE <out-var> [REQUIRE [PATCH|TWEAK][;...]] <string>)

Attempts to parse the version in <string> and stores the individual compoents into <out-var>_<component>. If a component is not present in the given version, it will be set to a false constant. If an error occurred, <out-var>_ERROR will contain the error message otherwise it will be a false constant. The PRERELEASE and BUILD components support the dot-separation specifier and will be turned into a list if they are encountered. The optional REQUIRE allows forcing the components PATCH and TWEAK to always be defined.

It is necessary to include a ; for the REQUIRE parameter, even if there is only one required part.

Generating

version(GENERATE <out-var> [COMPRESS] [MAJOR <major>] [MINOR <minor>] [PATCH <patch>] [TWEAK <tweak>] [PRERELEASE <prerelease>] [BUILD <build>] [REQUIRE [PATCH|TWEAK][;...]])

Generates a version from the components provided and stores the result in <out-var>. The components <major> and <minor> will default to 0 if not provided. If an error occurred, <out-var>_ERROR will contain the error message otherwise it will be a false constant. The PRERELEASE and BUILD components support the dot-separation specifier and will be converted from a list if encountered. The optional REQUIRE allows forcing the components PATCH and TWEAK to always be defined.

It is necessary to include a ; for the REQUIRE parameter, even if there is only one required part.

Modifying

version(MODIFY <out-var> <string> [COMPRESS] [MAJOR <major>] [MINOR <minor] [PATCH <patch>] [TWEAK <tweak>] [PRERELEASE <prerelease>] [BUILD <build>] [REQUIRE [PATCH|TWEAK][;...]])

Modifies the version provided in <string> with the components provided. The components <major>, <minor>, <patch> and <tweak> may have a prefix of + or - to add and subtract the value, or no prefix to replace. The result of this operation will be stored as a string in <out-var>. If a component did not exist in the original, it will be added to the version as a replace operation. If an error occurred, <out-var>_ERROR will contain the error message otherwise it will be a false constant. The optional REQUIRE allows forcing the components PATCH and TWEAK to always be defined.

It is necessary to include a ; for the REQUIRE parameter, even if there is only one required part.

Comparing

version(COMPARE <out-var> <a> <b>)

Compares the version <a> against <b> and stores the result in <out-var>. The provided version will be evaluated in the order MAJOR, MINOR, PATCH, TWEAK, PRERELEASE, and then BUILD. The following results should be expected:

  • If a component is only in <a>, <out-var> will contain the componenent name prefixed by +.

  • If a component is only in <b>, <out-var> will contain the componenent name prefixed by -.

  • If a component is numerical and the value is larger in <a>, <out-var> will contain the componenent name prefixed by >.

  • If a component is numerical and the value is larger in <b>, <out-var> will contain the componenent name prefixed by <.

  • If a component is alphanumerical and the value is different in either, <out-var> will contain the component name with no prefix.

  • If an error occurred, <out-var>_ERROR will contain the error message otherwise it will be a false constant, and <out-var> will be a false constant.

  • In all other cases, <out-var> will be a false constant.

There is no special handling for dot-separated PRERELEASE and BUILD component. They will be treated as if they were a string, as special handling for these is up to the application.