On Tue, 20 Feb 2007, Michael Matz wrote:

> Hi,
> 
> On Tue, 20 Feb 2007, Richard Guenther wrote:
> 
> > > > /usr/lib64/libxfce4mcs-client.a
> > > 
> > > Well, tell the xfce maintainer ;)
> > 
> > Seems to be fixed in Factory (I quoted from an installed 10.2 system).
> > Still the .so links are not in the -devel package.
> 
> Reminds me of something which we eventually want to have (and which I had 
> on my disc since some time): A packaging policy for libraries.  I've 
> started to cobble up something, though I find my language a bit awkward 
> :-/ Anyway, the ideas should become clear.
> 
> I haven't yet read the debian library policy, but it certainly is inspired 
> by it (via conversation with debian guys).  Probably their policy contains 
> much more interesting stuff, which might become usable.  But let's start 
> with something small, and discuss about it.
> 
> 
> Ciao,
> Michael.
> 
> Definitions
> 
> lib$NAME.so.* - a shared library, programs can depend on them, usually
>             two files exist:
>               lib$NAME.so.$MAJOR
>               lib$NAME.so.$MAJOR.$MINOR.$MICRO
> lib$NAME.so - file used by link editor (ld) to build executable, usually
>             softlink to the shared library file
> 
> 
> Goal
> 
> Enable running old applications needing old shared libraries, without
> recompilation (i.e. by merely copying over some old binary rpms and installing
> them).
> 
> 
> Library policy
> 
> * Shared libs are to be packaged into rpms whose name is
>   "lib" + $NAME + $NUM.
> * There is no package containing lib*.so.* files which
>   is not named lib$NAME$NUM.rpm.
> * Packages named lib* contain only files named lib*.so.*
>   (no headers, no *.so files, no config files, nothing else).
> 
> * $NUM contains only decimal digits.
> * $NUM increases strictly with at least the SO version of the
>   contained shared libs.
> 
>   Ideally it corresponds with either the upstream package version or the SO
>   version.  Example: libfoo.so.1 is packaged in libfoo1.rpm.  Or
>   libbar.so.3, a part of the program suite PLONK 4.1, would be packaged
>   into libplonk41.rpm.

The latter sounds inconsistent.  Shouldn't it be named libbar41.rpm?  I
would add

  * lib$NAME$NUM.rpm either contains exactly one shared library named
    lib$NAME.so.* or it contains multiple shared libraries.

  * If lib$NAME$NUM.rpm may only contain multiple shared libraries if
    the SO versions of all of them change at the same time always.  For
    convenience library packages should be split if not a dependency
    on one shared library automatically creates a dependency on all other
    shared library in the package.

  * If lib$NAME$NUM.rpm contains multiple shared libraries $NAME should 
    match the package name.  For example if the program blorf.rpm has
    libfoo.so.* and libbar.so.* the library package shall be named
    libblorf$NUM.rpm

> * All packages named lib* end with $NUM.

Or with -devel.

> * Files needed to develop programs using shared libraries contained in
>   lib$NAME$NUM.rpm are packaged in lib$NAME-devel.rpm.
>   [??? do we really want to remove $NUM from the -devel rpm?]

That depends on whether multiple -devel versions can be installed in
parallel.  Usually this will result in file conflicts with includes
or documentation, so the recommended way is to only have the 
latest-and-greatest as lib$NAME-devel.  Exceptions allowed.

>   Those files include lib*.so, lib*.la and all headers.  Optionally those
>   files can also be placed in $NAME.rpm, in the case that it also comes
>   with other tools or documentation.  But _if_ there is a *-devel.rpm
>   package then it contains all lib*.{so,la} and headers.
> 
> 
> Rationale
> 
> That scheme makes it possible to install and use multiple shared libraries
> of the same base name, but different so-version (e.g. of older distribution
> in case there are programs requiring them).  A discriminator needs to be
> part of the rpm name, as otherwise the update stack will be confused, and
> using some monotonically increasing number as that makes sense.  A strict
> structure on rpm names will also help those writing quick&dirty tools.
> 
> From that follows that only files should be included therein, which aren't
> generating file conflicts later if installed together with another libbla*
> rpm.  Hence only lib*.so.* files are allowed in them.  To ensure that no
> shared libraries creep in which aren't handled that way we disallow them
> to be in any package not named via these rules.
> 
> Effectively that creates a partition of all files into shared libs and
> others, and makes sure that no rpm contains files from both partitions.

The policy currently misses to talk about static libraries, -fpic issues
and documentation subpackages.  A section on ABI compatibility and SO
versions would be nice.

I recommend to have a look at

http://www.debian.org/doc/debian-policy/ch-sharedlibs.html

and

http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html

also the following is a nice checklist for updating packages when
a SO version change is involved.

http://wiki.debian.org/TransitionBestPractices

Richard.

-- 
Richard Guenther <[EMAIL PROTECTED]>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to