[Telepathy] Libtool library versioning
Sjoerd Simons
sjoerd at luon.net
Sat Aug 11 05:28:16 PDT 2007
Hi!
As one of telepathy's friendly neighbourhood Debian maintainers i've noticed
some errors in the versioning of various telepathy related libraries. This is
probably due to a lack of knowledge in that area.
Section 6 of the libtool manual has some good information about how it all
works, especially 6.3 is a must-read [0].
A short overview:
libtool's -version-info argument takes CURRENT:REVISION:AGE. Where CURRENT
is the current version of the interface. AGE indicate the number of older
interfaces it's implementing and REVISION the revision of the current
interface.
So -version-info 8:2:3 says the current release is interface version 8,
compatible with interface versions 5, 6 and 7 and that it's the third release
with interface version 8. Resulting in the library name
<my_library>.so.5.3.2, which is <my_library>.so.(CURRENT - AGE).AGE.REVISION
The (CURRENT - AGE) number is what people usually mean when their talking
about bumping the soname (and the definition i'll use in the rest of this
mail). As in practise the linker will use the latest version of a library
with a correct (CURRENT - AGE) value even though it might not be recent
enough.
When doing a new release of your library:
If the source code was changed, but there were no interface changes:
Increment REVISION.
If there was a compatible interface change:
Increment CURRENT and AGE. Set REVISION to 0
If there was an incompatible interface change:
Increment CURRENT. Set AGE and REVISION to 0
Incompatible changes are changes to the size of public structs, removing
public functions, adding arguments to public functions etc etc. About the
only compatible change that one can do is adding new functions.
In practise there is some pain for binary distributions involved when a
library bumps it's soname. As all apps using the library will need to be
recompiled (and maybe fixed) for them to be able to use the new version of
the library (and for the distribution to be able to get rid of the old
version). So please limit incompatible changes to libraries. Failing to bump
a soname when needed results in even bigger issues though (like very nasty
bugs turning up suddenly), so please err on the side of caution... Bumping
sonames is not something to be ashamed of!
Some good ways of avoiding unnecessary soname bumps:
+ Deprecate functions instead of removing them (especially when renaming).
Using the gcc deprecated attribute helps here (G_GNUC_DEPRECATED for glib
users)
+ Try to use private/opaque structures where possible. (For glib users,
only put things in the object instance/class struct when really needed)
Hopefully this helps to prevent library versioning errors in the future :)..
Ofcourse always feel free to ask questions.
Sjoerd
0: http://www.gnu.org/software/libtool/manual.html#Versioning
--
Chemist who falls in acid is absorbed in work.
More information about the Telepathy
mailing list