# 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.