Hi,

On Mon, 02 Jan 2012, Russ Allbery wrote:
>       <p>
>         If a package contains a binary or library which links to a
>         shared library, we must ensure that, when the package is
>         installed on the system, all of the libraries needed are also
>         installed.  These dependencies must be added to the binary
>         package when it is built, since they may change based on which
>         version of a shared library the binary or library was linnked

s/linnked/linked/

[...]
>       <p>
>         <file>shlibs</file> files were the original mechanism for
>         handling library dependencies.  They are documented
>         in <ref id="sharedlibs-shlibdeps">.  <file>symbols</file> files,
>         documented in this section, are recommended for most packages,
>         since they provide dependency information for each exported
>         symbol and therefore generate more accurate dependencies for
>         binaries that do not use symbols from newer versions of the
>         shared library.  However, <file>shlibs</file> files must be used
>         for udebs.  Packages which provide a <file>symbols</file> file
>         are not required to provide a <file>shlibs</file> file.
>       </p>

In practice I don't think that we have any package providing a symbols
files without a shlibs file.

[...]
 
>       <sect1 id="dpkg-shlibdeps">
>         <heading>How to use <prgn>dpkg-shlibdeps</prgn> and the
>           <tt>symbols</tt> files</heading>
> 
>         <p>
>           If your package contains any compiled binaries or shared
>           libraries, put a call to <prgn>dpkg-shlibdeps</prgn> into
>           your <file>debian/rules</file> file in the source package.
>           List all of the compiled binaries, libraries, or loadable
>           modules in your package.

----
>   If your source package builds only a
>           single binary package that contains only compiled binaries and
>           libraries (but no scripts) and is not multiarch, you can use a
>           command such as:
>           <example compact="compact">
> dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/sbin/* \
>   debian/tmp/usr/lib/*
>           </example>
>           but normally finding all of the binaries is more
>           complex.

I would drop the part above (up to the 4 dashes that I added). This
example will only mislead people IMO because debian/tmp/ is far from being
the norm. debian/<pkg> is much more common for single binary packages. And
as you said, it doesn't cover all cases.

> <footnote>
>             The easiest way to do this is to use a package helper
>             framework such as <tt>debhelper</tt>.  If you are
>             using <tt>debhelper</tt>, the <prgn>dh_shlibdeps</prgn>
>             program will do this work for you.  It will also correctly
>             handle multi-binary packages.
>           </footnote>
>         </p>
> 
>         <p>
>           This command puts the dependency information into
>           the <file>debian/substvars</file> file, which is then used
>           by <prgn>dpkg-gencontrol</prgn>.  You will need to place
>           a <tt>${shlibs:Depends}</tt> variable in the <tt>Depends</tt>
>           field in the control file of every binary package built by
>           this source package that contains compiled binaries,
>           libraries, or loadable modules.  If you have multiple binary
>           packages, you will need to call <prgn>dpkg-shlibdeps</prgn> on
>           each one which contains compiled libraries or binaries, using
>           the <tt>-T</tt> option to the <tt>dpkg</tt> utilities to
>           specify a different <file>substvars</file> file for each
>           binary package.<footnote>
>             Again, <prgn>dh_shlibdeps</prgn>
>             and <prgn>dh_gencontrol</prgn> will handle all of this for
>             you if you're using <tt>debhelper</tt>.
>           </footnote>

I would indicate in the footnote that dh_shlibdeps/dh_gencontrol use an
alternate substvars file by default (debian/<pkg>.substvars).

>       <sect1 id="symbols">
>         <heading>The <file>symbols</file> File Format</heading>
[...]
>           For our example, the <tt>zlib1g</tt> <file>symbols</file> file
>           would contain:
>           <example compact="compact">
>  * Build-Depends-Package: zlib1g-dev
>           </example>
>           (Don't forget the leading space.)

What leading space are you referring to ?

[...]
>       <sect1 id="shlibs-paths">
>         <heading>The <file>shlibs</file> files present on the
>           system</heading>
[...]
>             <item>
>               <p><file>DEBIAN/shlibs</file> files in the "build
>                 directory"</p>
> 
>               <p>
>                 When packages are being built,
>                 any <file>debian/shlibs</file> files are copied into the
>                 control information file area of the temporary build
>                 directory and given the name <file>shlibs</file>.  These
>                 files give details of any shared libraries included in
>                 the same package.
>               </p>
>             </item>

debian/shlibs is (no longer) a standard file... debhelper doesn't install
such files, it generates shlibs files on the fly and I don't believe that
any modern package still has debian/shlibs.

So I would rewrite this paragraph to just say that DEBIAN/shlibs is the
shlibs file produced by the current package build.

[...]
>       <sect1>
>         <heading>Providing a <file>shlibs</file> file</heading>
> 
>         <p>
>           If your package provides a shared library, you need to create
>           a <file>shlibs</file> file following the format described
>           above.  It is usual to call this
>           file <file>debian/shlibs</file> (but if you have multiple
>           binary packages, you might want to call
>           it <file>debian/<var>package</var>.shlibs</file> instead).
>           Then let <file>debian/rules</file> install it in the control
>           information file area:
>           <example compact="compact">
> install -m644 debian/shlibs debian/tmp/DEBIAN
>           </example>
>           or, in the case of a multi-binary package:
>           <example compact="compact">
> install -m644 debian/<var>package</var>.shlibs 
> debian/<var>package</var>/DEBIAN/shlibs
>           </example>
>           An alternative way of doing this is to create
>           the <file>shlibs</file> file in the control information file
>           area directly from <file>debian/rules</file> without using
>           a <file>debian/shlibs</file> file at all,<footnote>
>             This is what <prgn>dh_makeshlibs</prgn> in
>             the <package>debhelper</package> suite does. If your package
>             also has a udeb that provides a shared
>             library, <prgn>dh_makeshlibs</prgn> can automatically
>             generate the <tt>udeb:</tt> lines if you specify the name of
>             the udeb with the <tt>--add-udeb</tt> option.
>           </footnote>
>           since the <file>debian/shlibs</file> file itself is ignored by
>           <prgn>dpkg-shlibdeps</prgn>.
>         </p>

I would shorten the explanation here and drop the example of how to
install a manually crafted shlibs file. This is far from being the norm
and should not be difficult to find out alone if one really needs it.

----
Besides those details, everything was excellent and I'm happy to second
this (with or without any of the suggested fixes above).

Thanks for the great work!
-- 
Raphaël Hertzog ◈ Debian Developer

Pre-order a copy of the Debian Administrator's Handbook and help
liberate it: http://debian-handbook.info/liberation/



--
To UNSUBSCRIBE, email to debian-policy-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/20120112075234.ga14...@rivendell.home.ouaza.com

Reply via email to