|
| 1 | +# Semantic Versioning |
| 2 | + |
| 3 | +Version numbers of SIL Kit have the structure `<MAJOR>.<MINOR>.<PATCH>`, e.g., `4.0.55`. |
| 4 | +The structure is reminiscent of [semantic versioning], which also uses these same three components. |
| 5 | +For SIL Kit however, the version components had different meanings, largely as a relict from the |
| 6 | +project that evolved into SIL Kit in the distant past of 2022. |
| 7 | + |
| 8 | +Going forward, SIL Kit will adopt [semantic versioning]. |
| 9 | + |
| 10 | +Therefore, we will increment the |
| 11 | + |
| 12 | +- `MAJOR` version if we make any incompatible changes to the API, e.g., |
| 13 | + - removing deprecated functionality, |
| 14 | +- `MINOR` version if we make any compatible changes to the API, e.g., |
| 15 | + - adding functionality, |
| 16 | + - deprecating existing functionality, |
| 17 | +- `PATCH` version if we fix bugs, but keep the API compatible with the previous version. |
| 18 | + |
| 19 | +The first version of SIL Kit using [semantic versioning] will be `5.0.0`. |
| 20 | + |
| 21 | +## Commitments |
| 22 | + |
| 23 | +We will **never** |
| 24 | + |
| 25 | +- remove non-experimental functionality without deprecating it first for at least _one_ delivery, |
| 26 | +- break the ABI of exported symbols, e.g., |
| 27 | + - by changing the signature of an exported function without changing its name in an incompatible manner, |
| 28 | + - by modifying structures defined in the header files and used in the signature of exported functions in an incompatible manner, |
| 29 | +- change the network protocol in an incompatible way such that the previous version **is not** able to |
| 30 | + detect the incompatibility and drop the connection. |
| 31 | + |
| 32 | +## SIL Kit API |
| 33 | + |
| 34 | +When the above definitions use the term API, we refer to the `C` API, which is declared in the `silkit/capi/...` include directory. |
| 35 | + |
| 36 | +### Header-Only C++ API |
| 37 | + |
| 38 | +The `C++` API, declared and defined in the `C++` headers in the `silkit` include directory, is a wrapper around the `C` API, following an hourglass pattern. |
| 39 | +It can be understood as a standalone header-only library, which depends on the `C` API. |
| 40 | +We currently make no statements about inter-version compatibility for the `C++` API. |
| 41 | + |
| 42 | +### Experimental API |
| 43 | + |
| 44 | +The `C` API contains functions and data types named `SilKit_Experimental_...`. |
| 45 | +These functions and data types are not subject to the versioning scheme. |
| 46 | + |
| 47 | +- We will never **modify** function signatures or data types in an incompatible manner. |
| 48 | + This would break the ABI of the modified function and create extremely hard to diagnose issues in user code. |
| 49 | +- We may **remove** such functions or data types _without_ the major version increment and _without_ prior deprecation. |
| 50 | + |
| 51 | +<!-- ========================================================================================== --> |
| 52 | + |
| 53 | +[semantic versioning]: https://semver.org/ |
0 commit comments