]> git.donarmstrong.com Git - debhelper.git/blobdiff - dh_shlibdeps
r1614: * Patch from Andrew Suffield <asuffield@debian.org> to make dh_strip
[debhelper.git] / dh_shlibdeps
index e30c4a5b34d4693f879c758c943934b968be502d..3192b189ae7791ed40056b273ffb1306d32d4d1b 100755 (executable)
-#!/bin/sh -e
-#
-# Find dependancies. Simple dpkg-shlibdeps wrapper.
-
-PATH=debian:$PATH:/usr/lib/debhelper
-. dh_lib
-
-for PACKAGE in $DH_DOPACKAGES; do
-       TMP=`tmpdir $PACKAGE`
-       EXT=`pkgext $PACKAGE`
-
-       # Run dpkg-shlibdeps to generate dependancies.
-       filelist=""
-       for file in `find $TMP -type f \( -perm +111 -or -name "*.so*" \) | tr "\n" " "` ; do
-               case "`file $file`" in
-                       *ELF*)
-                               filelist="$file $filelist"
-                       ;;
-               esac
-       done
-       if [ "$filelist" ]; then
-               doit "dpkg-shlibdeps -Tdebian/${EXT}substvars $DH_U_PARAMS $filelist"
-       fi
-done
+#!/usr/bin/perl -w
+
+=head1 NAME
+
+dh_shlibdeps - calculate shared library dependancies
+
+=cut
+
+use strict;
+use Cwd;
+use Debian::Debhelper::Dh_Lib;
+
+=head1 SYNOPSIS
+
+B<dh_shlibdeps> [S<I<debhelper options>>] [B<-L>I<package>] [B<-l>I<directory>] [B<-X>I<item>] [S<B<--> I<params>>]
+
+=head1 DESCRIPTION
+
+dh_shlibdeps is a debhelper program that is responsible for calculating
+shared library dependancies for packages.
+
+This program is merely a wrapper around L<dpkg-shlibdeps(1)> that calls it
+once for each package listed in the control file, passing it
+a list of ELF executables and shared libraries it has found.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-u>I<params>, B<--dpkg-shlibdeps-params=>I<params>
+
+=item B<--> I<params>
+
+Pass "params" to L<dpkg-shlibdeps(1)>.
+
+=item B<-X>I<item>, B<--exclude=>I<item>
+
+Exclude files that contain "item" anywhere in their filename from being
+passed to dpkg-shlibdeps. This will make their dependancies be ignored.
+This may be useful in some situations, but use it with caution. This option
+may be used more than once to exclude more than one thing.
+
+=item B<-l>I<directory>[:directory:directory:..]
+
+Before dpkg-shlibdeps is run, LD_LIBRARY_PATH will have added to it the 
+specified directory (or directories -- separate with colons). This is
+useful for multi-binary packages where a library is built in one
+package and another package contains binaries linked against said
+library. Relative paths will be made absolute for the benefit of
+dpkg-shlibdeps.
+
+Note that the directory given should be the complete or relative path to
+a directory that contains the library. See example below.
+
+=item B<-L>I<package>, B<--libpackage=>I<package>
+
+Use the shlibs file automatically generated by dh_makeshlibs for the named
+package as a kind of automatically generated shlibs.local file. You can use
+this switch in concert with the -l switch to make dpkg-shlibdeps find a
+library built as part of the current package, and get the shlibs information.
+See example below.
+
+=back
+
+=head1 EXAMPLES
+
+Suppose that your source package produces libfoo1, libfoo-dev, and
+libfoo-bin binary packages. libfoo-bin links against libfoo1, and should
+depend on it. In your rules file, first run dh_makeshlibs, then dh_shlibdeps:
+
+       dh_makeshlibs
+       dh_shlibdeps -L libfoo1 -l debian/libfoo1/usr/lib
+
+This will have the effect of generating automatically a shlibs file for
+libfoo1, and using that file and the libfoo1 library in the
+debian/libfoo1/usr/lib directory to calculate shared library dependency
+information.
+
+=cut
+
+init();
+
+# Add directory to library search path.
+if ($dh{L_PARAMS}) {
+       my @paths=();
+       # Add to existing paths, if set.
+       push @paths, $ENV{'LD_LIBRARY_PATH'}
+               if exists $ENV{'LD_LIBRARY_PATH'};
+       foreach (split(/:/, $dh{L_PARAMS})) {
+               # Force the path absolute.
+               if (m:^/:) {
+                       push @paths, $_;
+               }
+               else {
+                       push @paths, getcwd()."/$_";
+               }
+       }
+       $dh{L_PARAMS}=join(':', @paths);
+       $ENV{'LD_LIBRARY_PATH'}=$dh{L_PARAMS};
+       verbose_print("LD_LIBRARY_PATH=$dh{L_PARAMS}");
+}
+
+foreach my $package (@{$dh{DOPACKAGES}}) {
+       my $tmp=tmpdir($package);
+       my $ext=pkgext($package);
+
+       my @filelist;
+       my $ff;
+
+       # Generate a list of ELF binaries in the package, ignoring any
+       # we were told to exclude.
+       my $find_options='';
+       if (defined($dh{EXCLUDE_FIND}) && $dh{EXCLUDE_FIND} ne '') {
+               $find_options="! \\( $dh{EXCLUDE_FIND} \\)";
+       }
+       foreach my $file (split(/\n/,`find $tmp -path $tmp/usr/lib/debug -prune -or -type f \\( -perm +111 -or -name "*.so*" \\) $find_options -print`)) {
+               # TODO this is slow, optimize. Ie, file can run once on
+               # multiple files..
+               $ff=`file "$file"`;
+               if ($ff=~m/ELF/ && $ff!~/statically linked/) {
+                       push @filelist,$file;
+               }
+       }
+
+       if (@filelist) {
+               my @opts;
+               if (defined $dh{LIBPACKAGE} && length $dh{LIBPACKAGE}) {
+                       @opts=("-L".tmpdir($dh{LIBPACKAGE}."/DEBIAN/shlibs"));
+               }
+               doit("dpkg-shlibdeps","-Tdebian/${ext}substvars",
+                       @opts,@{$dh{U_PARAMS}},@filelist);
+       }
+}
+
+=head1 SEE ALSO
+
+L<debhelper(7)>
+
+This program is a part of debhelper.
+
+=head1 AUTHOR
+
+Joey Hess <joeyh@debian.org>
+
+=cut