[Mageia-dev] Utter frustration
ftg at roadrunner.com
Sat Dec 1 03:04:53 CET 2012
Op vrijdag 30 november 2012 12:59:25 schreef Anne Wilson:
>> On 30/11/12 12:26, Frank Griffin wrote:
>>> On 11/30/2012 07:13 AM, Anne Wilson wrote:
>>>> Before doing all that, can you explain the significance of the
>>>> suffixes here?
>>>> ls /usr/lib/ | grep powerdevil
>>>> libpowerdevilcore.so.0@ libpowerdevilcore.so.0.1.0*
>>>> libpowerdevilui.so.4@ libpowerdevilui.so.4.10.0*
>>> Library naming conventions use several, actual version, e. g.
>>> 4.10.0, major version, e. g. 4, and a generic name, e. g.
>>> libxxx.so. The last two are usually symlinked to the first.
>>> The major version usually signals an ABI difference or some other
>>> major difference, e. g. new function, from the previous version.
>>> The actual version changes whenever any change is made. Developers
>>> use the major version if their code is dependent on that major
>>> version, but just use the generic name if any version will do.
>>> In this way, the majority of packages using the library just ask
>>> for libxxx.so, and don't have to be rebuilt or have their makefiles
>>> or spec modified when the library changes. A few packages, which
>>> are dependent on a specific version, ask for libxxx.so.N (or
>>> higher), and these have to be changed when the major version they
>>> require is released. A very very few packages are dependent on the
>>> actual version, and these may have to change more often.
>> I assume the starred ones are actually in use - what's the
>> significance of '@'? I'm not sure I've really understood this.
OK, say libXXX provides functions funcA, funcB, and funcC. The library
developer releases version 1.0.0, and the package installs
libXXX.so.1.0.0 and symlinks libXXX.so.1.0, libXXX.so.1.0, and libXXX.so
Now, the library developer fixes some minor bugs. They don't involve
any changes to the binary interface (ABI), e. g. they don't change the
datatypes of any of the parameters to the three functions, and they
don't change the number of parameters to any of them. So any
application that used version 1.0.0 should work with the new version.
The developer calls this version 1.0.1, and when the libXXX package
installs, it adds libXXX.so.1.0.1, and changes the libXXX.so.1 and
libXXX.so symlinks to point to that. Applications which used 1.0.0 by
asking for libXXX.so or libXXX.so.1 don't see any difference. If an
application specifically asked for libXXX.so.1.0, it gets the older
version (provided you didn't unistall it). Same goes for an application
that specifically asks for libXXX.1.0.0.
Now, suppose the library developer adds funcD to the library, and
doesn't change the ABI (Application Binary Interface) of A/B/C. He
calls the new package 1.1.0, and when it installs, it installs
libXXX.so.1.1.0, adds a libXXX.so.1.1 symlink to it, and changes the
linXXX.so symlink accordingly. Applications that used 1.0.0 or 1.0.1
could only use funcA/B/C, and will work exactly as they always did with
the new version. But a new application that uses funcD won't work with
the older versions, so its package has to say that it requires 1.1.0 or
Now the library developer finds a serious day-zero bug in funcA. Maybe
one of the parameters was originally an int when it should have been a
time_t, and the library doesn't work with newer system libraries because
time_t has changed from an int to an int64. This means that the ABI
changes. Applications compiled to use the older libraries won't work
with the newer versions. Applications written to use the newer version
won't work with the older versions.
So the library developer bumps the major version and releases 2.0.0,
along with an advisory that any applications with dependencies on the
ABI changes from 1.x.x. -> 2.0.0 must either be modified to use the
newer ABI (in which case they can continue to use libXXX.so and
requiring >=libXXX.so.2) or must have their spec file modified to
require =libXXX.so.1 or <=libXXX.so.1.1.
Any app that just asks for libXXX.so has to be modified to use the new
funcA ABI whether it uses funcD or not. Any app that uses libXXX.so and
uses funcD and the original ABI for funcA has to be changed to use
libXXX.so.1.1 and require <=1.1 or else be changed to use the the new ABI.
As time goes on, either the source code or the makefiles/specfiles for
old apps have to be changed in one way or the other. But the intent is
that as many old apps as possible can use libXXX.so until circumstances
make that impossible. At that point. the makefile/specfile has to
change in a minor way, if you're willing to have multiple versions of
libXXX installed. Or, if the app is under active development, the
developer can choose to update the source to conform to the newer ABI
and update the makefile/specfile to require at least the version that
supports that ABI.
More information about the Mageia-dev