X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_shlibdeps;h=91930d747f0ab0cb5ba00f5da73fbe69e811c62e;hb=725a4d769be1573cca18ced3581a55ef906235ff;hp=2d7970d240072723bfc84213caa4f8a7b3aa871f;hpb=b3d9b13cb8f2a88f860ea0adc26d729d66c2fd36;p=debhelper.git diff --git a/dh_shlibdeps b/dh_shlibdeps index 2d7970d..91930d7 100755 --- a/dh_shlibdeps +++ b/dh_shlibdeps @@ -2,7 +2,7 @@ =head1 NAME -dh_shlibdeps - calculate shared library dependancies +dh_shlibdeps - calculate shared library dependencies =cut @@ -17,7 +17,7 @@ B [S>] [B<-L>I] [B<-l>I] =head1 DESCRIPTION dh_shlibdeps is a debhelper program that is responsible for calculating -shared library dependancies for packages. +shared library dependencies for packages. This program is merely a wrapper around L that calls it once for each package listed in the control file, passing it @@ -27,38 +27,42 @@ a list of ELF executables and shared libraries it has found. =over 4 -=item B<-u>I, B<--dpkg-shlibdeps-params=>I +=item B<-X>I, B<--exclude=>I + +Exclude files that contain "item" anywhere in their filename from being +passed to dpkg-shlibdeps. This will make their dependencies 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<--> I Pass "params" to L. -=item B<-X>I, B<--exclude=>I +=item B<-u>I, B<--dpkg-shlibdeps-params=>I -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. +This is another way to pass I to L. +It is deprecated; use B<--> instead. =item B<-l>I[: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. +With recent versions of dpkg-shlibdeps, this option is generally not +needed. -Note that the directory given should be the complete or relative path to -a directory that contains the library. See example below. +Before dpkg-shlibdeps is run, LD_LIBRARY_PATH will have added to it the +specified directory (or directories -- separate with colons). With recent +versions of dpkg-shlibdeps, this is mostly only useful for packages that +build multiple flavors of the same library, or other situations where +the library is installed into a directory not on the regular library search +path. =item B<-L>I, B<--libpackage=>I -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. +With recent versions of dpkg-shlibdeps, this option is generally not +needed, unless your package builds multiple flavors of the same library. + +It tells dpkg-shlibdeps (via its -S parameter) to look first in the package +build directory for the specified package, when searching for libraries, +symbol files, and shlibs files. =back @@ -69,18 +73,27 @@ 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 + dh_shlibdeps 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. +If a libbar1 package is also produced, that is an alternate build of +libfoo, and is installed into /usr/lib/bar/, you can make libfoo-bin depend +on libbar1 as follows: + + dh_shlibdeps -Llibbar1 -l/usr/lib/bar + =cut -init(); +init(options => { + "L|libpackage=s" => \$dh{LIBPACKAGE}, + "dpkg-shlibdeps-params=s", => \$dh{U_PARAMS}, + "l=s", => \$dh{L_PARAMS}, +}); -# Add directory to library search path. if ($dh{L_PARAMS}) { my @paths=(); # Add to existing paths, if set. @@ -92,18 +105,21 @@ if ($dh{L_PARAMS}) { push @paths, $_; } else { - push @paths, getcwd()."/$_"; + push @paths, "/$_"; } } $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); + # dpkg-shlibdeps expects this directory to exist + if (! -d "$tmp/DEBIAN") { + doit("install","-o",0,"-g",0,"-d","$tmp/DEBIAN"); + } + my @filelist; my $ff; @@ -113,7 +129,9 @@ foreach my $package (@{$dh{DOPACKAGES}}) { if (defined($dh{EXCLUDE_FIND}) && $dh{EXCLUDE_FIND} ne '') { $find_options="! \\( $dh{EXCLUDE_FIND} \\)"; } - foreach my $file (split(/\n/,`find $tmp -type f \\( -perm +111 -or -name "*.so*" \\) $find_options`)) { + foreach my $file (split(/\n/,`find $tmp -type f \\( -perm +111 -or -name "*.so*" -or -name "*.cmxs" \\) $find_options -print`)) { + # Prune directories that contain separated debug symbols. + next if $file=~m!^\Q$tmp\E/usr/lib/debug/(lib|lib64|usr|bin|sbin|opt|dev|emul)/!; # TODO this is slow, optimize. Ie, file can run once on # multiple files.. $ff=`file "$file"`; @@ -125,16 +143,34 @@ foreach my $package (@{$dh{DOPACKAGES}}) { if (@filelist) { my @opts; if (defined $dh{LIBPACKAGE} && length $dh{LIBPACKAGE}) { - @opts=("-L".tmpdir($dh{LIBPACKAGE}."/DEBIAN/shlibs")); + @opts=("-S".tmpdir($dh{LIBPACKAGE})); + } + + push @opts, "-tudeb" if is_udeb($package); + + my $ld_library_path_orig=$ENV{LD_LIBRARY_PATH}; + if ($dh{L_PARAMS}) { + $ENV{LD_LIBRARY_PATH}=$dh{L_PARAMS}; + verbose_print("LD_LIBRARY_PATH=$dh{L_PARAMS}"); } + doit("dpkg-shlibdeps","-Tdebian/${ext}substvars", @opts,@{$dh{U_PARAMS}},@filelist); + + if ($dh{L_PARAMS}) { + if (defined $ld_library_path_orig) { + $ENV{LD_LIBRARY_PATH}=$ld_library_path_orig; + } + else { + delete $ENV{LD_LIBRARY_PATH}; + } + } } } =head1 SEE ALSO -L +L, L This program is a part of debhelper.