Philip Withnall
philip.withnall@collabora.co.uk 2015
Versionering och utgåvor av bibliotek och program
Anders Jonsson
anders.jonsson@norsjovallen.se 2018

# Versionering

#

        Sammanfattning

        Versionering för moduler skiljer sig åt för bibliotek och program: bibliotek behöver en libtool-version angiven utöver sin paketversion. Program behöver bara ha en paketversion.

            Libraries and applications have a package version of the form
            major.minor.micro. ()

            Libraries additionally have a libtool version of the form
            current:revision:age. ()

            Version numbers should be updated for each release (using release and
            post-release increments). ()

          Paketversioner bör öka vid funktionsändringar eller tillägg. ()
          Libtool-versioner bör uppdateras vid ändringar eller tillägg till API:t. ()

            Even/odd minor package versions can be used respectively for
            stable/unstable releases. ()

# Paketversionering

Both libraries and applications have a package version of the form major.minor.micro.

The package version number is that passed to `AC_INIT()`, and the one which is typically known as the project’s version number. For example, the Debian package for a library will use the library’s package version (though may also include the major version number in the package name to allow for parallel installability). Package versions are updated by the following rules:

If breaking API compatibility in a library, or making a large change to an application which affects everything (such as a UI redesign), increment major and set minor and micro to 0.

Otherwise, if changing or adding a feature, or adding any API, increment minor and set micro to 0.

Otherwise (if making a release containing only bug fixes and translation updates), increment micro.

Note that the minor version number should be updated if any API is added.

# Libtool-versionering

Libraries have two version numbers: a libtool version which tracks ABI backwards compatibility (see ), and a package version which tracks feature changes. These are normally incremented in synchronization, but should be kept separate because ABI backwards compatibility is not necessarily related to feature changes or bug fixes. Furthermore, the two version numbers have different semantics, and cannot be automatically generated from each other.

En bra överblick för libtool-versionering, och skillnaderna mot paketversionering ges i Autotools Mythbuster; en annan finns i libtool-handboken.

För att uppdatera libtool-versionen, följ algoritmen given i kommentarerna nedan. Detta är en typisk configure.ac-kodsnutt för att konfigurera libtool-versionering:

# Before making a release, the LT_VERSION string should be modified. The # string is of the form c:r:a. Follow these instructions sequentially: # 1. If the library source code has changed at all since the last update, then # increment revision (‘c:r:a’ becomes ‘c:r+1:a’). # 2. If any interfaces have been added, removed, or changed since the last # update, increment current, and set revision to 0. # 3. If any interfaces have been added since the last public release, then # increment age. # 4. If any interfaces have been removed or changed since the last public # release, then set age to 0. AC_SUBST([LT_VERSION],[0:0:0])

Följande kodsnutt kan användas i Makefile.am för att skicka versionsinformationen till libtool:

my_library_la_LDFLAGS = -version-info $(LT_VERSION)

# Stabila och instabila paketversioner

Most GNOME modules follow a convention for stable and unstable releases. The minor version is even for stable releases and is odd for unstable releases. For example, the 3.20.* versions are stable, but the 3.19.* versions are unstable. The 3.19.* versions can be seen as alpha and beta releases of the 3.20 version.

A new micro stable version (e.g. 3.20.0 → 3.20.1) doesn’t add new features, only translation updates and bug fixes. On the other hand, unstable micro releases (e.g. 3.19.1 → 3.19.2) can add API, or change or remove API which was added in a previous micro release in that minor series.

libtool-versionen bör endast uppdateras för stabila paketversioner.

# Utgåveprocess

The standard process for making a release of a module increments the libtool version (if the module is a library) at the time of release, then increments the package version number immediately afterwards (this is called a post-release increment).

Updating the libtool versions at the time of release means that they are only incremented once for all ABI changes in a release. The use of post-release increment for package versions means the package version number is not outdated (still equal to the previous release) during the development cycle.

The release process (based on the GNOME release process):

Make sure code is up to date: git pull

Säkerställ att du inte har några lokala ändringar: git status

Om utgåvan är för en stabil paketversion, öka libtool-versionsnumret i configure.ac (om den existerar)

Lägg till en post i NEWS-filen

Kör ./autogen.sh && make && make install && make distcheck och säkerställ att det lyckas

Fixa alla problem som dyker upp, checka in ändringarna, och börja om på steg 3

If make distcheck finishes with “[archive] is ready for distribution”, run git commit -a -m "Release version x.y.z" (where ‘x.y.z’ is the package version number)

Kör git push

If that fails due to other commits having been pushed in the meantime, run git pull to merge your commit on the branch followed by a second git push. This is an exception to the GNOME guideline to have a linear Git history (). If you prefer to have a linear history, you need to restart at step 1.

Tagga utgåvan: git tag -s x.y.z (där ”x.y.z” är paketets versionsnummer)

Kör git push origin x.y.z (där ”x.y.z” är paketets versionsnummer)

The release is now complete, and the post-release version increment can be done:

Öka paketets versionsnummer i configure.ac

Kör git commit -a -m "Post-release version increment"

Kör git push

Paketarkivet som genererats av make distcheck kan nu skickas till download.gnome.org eller distribueras på andra sätt.