| # Overall Package Version |
| |
| This version number is set in the top level CMakeLists.txt: |
| |
| ```sh |
| set(PACKAGE_VERSION "11") |
| ``` |
| |
| For upstream releases this is a single integer showing the release |
| ordering. We do not attempt to encode any 'ABI' information in this version. |
| |
| Branched stabled releases can append an additional counter eg `11.2`. |
| |
| Unofficial releases should include a distributor tag, eg '11.vendor2'. |
| |
| When the PACKAGE_VERSION is changed, the packaging files should be updated: |
| |
| ```diff |
| diff --git a/CMakeLists.txt b/CMakeLists.txt |
| index a2464ec5..cf237904 100644 |
| --- a/CMakeLists.txt |
| +++ b/CMakeLists.txt |
| @@ -44,7 +44,7 @@ endif() |
| set(PACKAGE_NAME "RDMA") |
| |
| # See Documentation/versioning.md |
| -set(PACKAGE_VERSION "15") |
| +set(PACKAGE_VERSION "16") |
| # When this is changed the values in these files need changing too: |
| # debian/libibverbs1.symbols |
| # libibverbs/libibverbs.map |
| diff --git a/redhat/rdma-core.spec b/redhat/rdma-core.spec |
| index cc0c3ba0..62334730 100644 |
| --- a/redhat/rdma-core.spec |
| +++ b/redhat/rdma-core.spec |
| @@ -1,5 +1,5 @@ |
| Name: rdma-core |
| -Version: 15 |
| +Version: 16 |
| Release: 1%{?dist} |
| Summary: RDMA core userspace libraries and daemons |
| |
| diff --git a/suse/rdma-core.spec b/suse/rdma-core.spec |
| index 76ca7286..a19f9e01 100644 |
| --- a/suse/rdma-core.spec |
| +++ b/suse/rdma-core.spec |
| @@ -19,7 +19,7 @@ |
| %bcond_without systemd |
| %define git_ver %{nil} |
| Name: rdma-core |
| -Version: 15 |
| +Version: 16 |
| Release: 0 |
| Summary: RDMA core userspace libraries and daemons |
| License: GPL-2.0 or BSD-2-Clause |
| |
| ``` |
| |
| # Shared Library Versions |
| |
| The shared libraries use the typical semantic versioning scheme, eg |
| *libibumad* has a version like `3.1.11`. |
| |
| The version number is broken up into three fields: |
| - '3' is called the SONAME and is embedded into the ELF: |
| ```sh |
| $ readelf -ds build/lib/libibumad.so.3.1.11 |
| 0x000000000000000e (SONAME) Library soname: [libibumad.so.3] |
| ``` |
| |
| We do not expect this value to ever change for our libraries. It indicates |
| the overall ABI; changing it means the library will not dynamically link |
| to old programs anymore. |
| |
| - '1' is called the ABI level and is used within the ELF as the last component |
| symbol version tag. This version must be changed every time a new symbol |
| is introduced. It allows the user to see what version of the ABI the |
| library provides. |
| |
| - '11' is the overall release number and is copied from `PACKAGE_VERSION` This |
| version increases with every package release, even if the library code did |
| not change. It allows the user to see what upstream source was used to build |
| the library. |
| |
| This version is encoded into the filename `build/lib/libibumad.so.3.1.11` and |
| a symlink from `libibumad.so.3` to `build/lib/libibumad.so.3.1.11` is created. |
| |
| ## Shared Library Symbol Versions |
| |
| Symbol versions are a linker technique that lets the library author provide |
| two symbols with different ABIs that have the same API name. The linker |
| differentiates the two cases internally. This allows the library author to |
| change the ABI that the API uses. This project typically does not make use of |
| this feature. |
| |
| As a secondary feature, the symbol version is also used by package managers |
| like RPM to manage the ABI level. To make this work properly the ABI level |
| must be correctly encoded into the symbol version. |
| |
| ## Adding a new symbol |
| |
| First, increase the ABI level of the library. It is safe to re-use the ABI |
| level for multiple new functions within a single release, but once a release |
| is tagged the ABI level becomes *immutable*. The maintainer can provide |
| guidance on what ABI level to use for each series. |
| |
| ```diff |
| rdma_library(ibumad libibumad.map |
| # See Documentation/versioning.md |
| - 3 3.1.${PACKAGE_VERSION} |
| + 3 3.2.${PACKAGE_VERSION} |
| ``` |
| |
| Next, add your new symbol to the symbol version file: |
| |
| ```diff |
| + IBUMAD_3.2 { |
| + global: |
| + umad_new_symbol; |
| + } IBUMAD_1.0; |
| ``` |
| |
| NOTE: Once a release is made the stanzas in the map file are *immutable* and |
| cannot be changed. Do not add your new symbol to old stanzas. |
| |
| The new symbol should appear in the ELF: |
| |
| ```sh |
| $ readelf -s build/lib/libibumad.so.3.1.11 |
| 35: 00000000000031e0 450 FUNC GLOBAL DEFAULT 12 umad_new_symbol@@IBUMAD_3.2 |
| ``` |
| |
| Finally update the `debian/libibumad3.symbols` file. |
| |
| ## Private symbols in libibverbs |
| |
| Many symbols in libibverbs are private to rdma-core, they are being marked in |
| the map file using the IBVERBS_PRIVATE_ prefix. |
| |
| For simplicity, there is only one version of the private symbol version |
| stanza, and it is bumped whenever any change (add/remove/modify) to any of the |
| private ABI is done. This makes it very clear if an incompatible provider is |
| being used with libibverbs. |
| |
| Due to this there is no reason to provide compat symbol versions for the |
| private ABI. |
| |
| When the private symbol version is bumped, the packaging files should be updated: |
| |
| ```diff |
| diff --git a/debian/control b/debian/control |
| index 642a715e..8def05c9 100644 |
| --- a/debian/control |
| +++ b/debian/control |
| @@ -138,7 +138,7 @@ Section: libs |
| Pre-Depends: ${misc:Pre-Depends} |
| Depends: adduser, ${misc:Depends}, ${shlibs:Depends} |
| Recommends: ibverbs-providers |
| -Breaks: ibverbs-providers (<< 16~) |
| +Breaks: ibverbs-providers (<< 17~) |
| Description: Library for direct userspace use of RDMA (InfiniBand/iWARP) |
| libibverbs is a library that allows userspace processes to use RDMA |
| "verbs" as described in the InfiniBand Architecture Specification and |
| ``` |
| |
| ### Use of private symbols between component packages |
| |
| A distribution packaging system still must have the correct dependencies |
| between libraries within rdma-core that may use these private symbols. |
| |
| For this reason the private symbols can only be used by provider libraries and |
| the distribution must ensure that a matched set of provider libraries and |
| libibverbs are installed. |