Keeping binary compatibility
Lubos Lunak
l.lunak at suse.cz
Fri Oct 1 14:32:41 BST 2010
Hello,
as you probably know, the theory is that KDE libraries keep backwards binary
compatibility. As you might or might not know, that is the theory.
I've found a tool called abi-compliance-checker
(http://ispras.linux-foundation.org/index.php/ABI_compliance_checker) and it
has a page with checks for various libraries including ours
(http://linuxtesting.org/upstream-tracker/versions/kde-libs.html), which is
not as green as it should be.
I've also compared openSUSE packages for 4.4.4 and 4.5.1 and there are
problems too (http://ktown.kde.org/~seli/abi/ for what I checked). Let me
point out just one, http://reviewboard.kde.org/r/2608/ , which I think shows
that this occassionally happening is inevitable.
Moreover, there seem to be cases where we simply don't seem to have rules (or
at least I couldn't find them). Do we have rules that say more than "kdelibs
is BC stable, we don't care about the rest"? What's the status with e.g.
kdeedu libs? I'm asking because, consider e.g. these errors from an attempt
to uninstall kdebase/workspace package here:
libkscreensaver.so.5()(64bit) is needed by (installed)
kdeartwork4-screensaver-4.4.4-2.1.1.x86_64
libkworkspace.so.4()(64bit) is needed by (installed) ktorrent-3.3.4-4.1.x86_64
libkworkspace.so.4()(64bit) is needed by (installed) kor-0.3-2.2s.x86_64
libsolidcontrol.so.4()(64bit) is needed by (installed)
ktorrent-3.3.4-4.1.x86_64
libsolidcontrol.so.4()(64bit) is needed by (installed)
kbluetooth-0.4.2-3.1.x86_64
libsolidcontrol.so.4()(64bit) is needed by (installed)
NetworkManager-kde4-libs-0.9.svn1057339-4.1.x86_64
libtaskmanager.so.4()(64bit) is needed by (installed)
ktorrent-3.3.4-4.1.x86_64
Now, an explanation is probably needed for those who live only in the SVN
world or with distros where breakages are solved by rebuilding everything. If
you develop e.g. on openSUSE and you notice a library you might like to use,
then you perhaps install its -devel package, maybe go as far as reading its
documentation (which doesn't say anything interesting in the case of
kdebase4-workspace-devel or libkeedu4-devel), or maybe you just read its .h
files and then make your app use the library.
Then you release a tarball, some packager builds it, adds also the -devel
package to the build requirements, the app builds and the packaging system
records a dependency on the library, as seen above. That is, on the library
soname (lib<name>.so.+<one number>). That's how it's done. I read somewhere
that when using "unstable" KDE libs the requirement should be on the exact
version, but that's not how it's done. Can you see above ktorrent requiring
kdebase4-workspace = 4.4.4? No, and it's unlikely a system like that would
get as far as the packager knowing and doing so (not only because not
knowing, but also because it's stupid - why should anybody be forced to
upgrade ktorrent from a 3rd party repo whenever there's another patchlevel SC
release).
Looking at how KDE provides various libraries leads to a number of WTH
questions, like:
- WTH is the ABI stability documented, besides kdelibs?
- WTH is there e.g. libiris_ksirk.so (i.e. a development .so symlink), where
are the .h files?
- WTH does e.g. libtaskmanager seem to have soname versioning following SC
version, like stable kdelibs libraries do, but it's not actually stable?
- WTH does e.g. ksysguard install libraries .so and .h files for something
that looks a lot like its internal libraries?
Therefore I propose the following:
- private libraries do not (obviously ...?) install their .h files and do use
NAMELINK_SKIP option in install (see e.g.
http://websvn.kde.org/trunk/KDE/kdebase/workspace/khotkeys/libkhotkeysprivate/CMakeLists.txt?r1=862343&r2=895764)
- ABI stability for each public library is documented, I would suggest a
README.<library> file in sources and in the main doxygen page
- ABI of each stable library (obviously) does not change
- whenever ABI of an unstable library changes, its soname is increased (which
means that each library will need in its CMakeLists.txt something like this
http://websvn.kde.org/trunk/KDE/kdelibs/plasma/CMakeLists.txt?r1=879765&r2=879766& ,
handled manually, instead of generic macros)
- the release team howto gets a new entry 'each new version is ABI tested
before release' (I do not have tests for 4.5.2 yet as I'm waiting for the
packages to rebuild, and as said above I also don't quite know what to check,
but in general I have a quite easy way of checking the whole KDE SC on each
release)
--
Lubos Lunak
openSUSE Boosters team, KDE developer
l.lunak at suse.cz , l.lunak at kde.org
More information about the kde-core-devel
mailing list