Prechádzať zdrojové kódy

dpkg-shlibdeps: New option -l to add private shared library directories

This allows to specify additional build-time shared library directories
without requiring the caller to set LD_LIBRARY_PATH, which is a run-time
dynamic linker variable, and abusing it might be problematic for example
when cross-compiling.

While accepting colon-separated paths might seem tempting, it disallows
valid paths with colons, while not common on system paths, these could
be present on user paths, which makes this a bad interface to have.

Closes: #698881
Guillem Jover 13 rokov pred
rodič
commit
7b73dab6a8

+ 3 - 0
debian/changelog

@@ -135,6 +135,9 @@ dpkg (1.17.0) UNRELEASED; urgency=low
   * Fix value caching in Dpkg::Arch by not shadowing the variables.
   * Fix chmod() arguments order in Dpkg::Source::Quilt. Closes: #710265
     Thanks to Pablo Oliveira <pablo@sifflez.org>.
+  * Add new dpkg-shlibdeps -l option to add private shared library directories.
+    This should be used instead of abusing LD_LIBRARY_PATH to pass the paths,
+    which might be problematic when cross-compiling. Closes: #698881
 
   [ Raphaël Hertzog ]
   * Fix dpkg-maintscript-helper rm_conffile and mv_conffile to do nothing

+ 15 - 3
man/dpkg-shlibdeps.1

@@ -4,7 +4,7 @@
 .\" Copyright © 2000 Wichert Akkerman <wakkerma@debian.org>
 .\" Copyright © 2006 Frank Lichtenheld <djpig@debian.org>
 .\" Copyright © 2007-2011 Raphaël Hertzog <hertzog@debian.org>
-.\" Copyright © 2012 Guillem Jover <guillem@debian.org>
+.\" Copyright © 2012-2013 Guillem Jover <guillem@debian.org>
 .\"
 .\" This is free software; you can redistribute it and/or modify
 .\" it under the terms of the GNU General Public License as published by
@@ -136,6 +136,17 @@ been supplied as
 Include dependencies appropriate for the shared libraries required by
 .IR executable .
 .TP
+.BI \-l directory
+Add
+.I directory
+to the list of directories to search for private shared libraries
+(since dpkg 1.17.0). This option can be used multiple times.
+
+Note: Use this option instead of setting \fBLD_LIBRARY_PATH\fP,
+as that environment variable is used to control the run-time linker
+and abusing it to set the shared library paths at build-time can be
+problematic when cross-compiling for example.
+.TP
 .BI \-d dependency-field
 Add dependencies to be added to the control file dependency field
 .IR dependency-field .
@@ -301,6 +312,7 @@ has been unable to find the library.
 .B dpkg\-shlibdeps
 creates a list of directories to check as following: directories listed in
 the RPATH of the binary, directories listed in /etc/ld.so.conf,
+directories added by the \fB\-l\fP option,
 directories listed in the \fBLD_LIBRARY_PATH\fP environment variable, and
 standard public directories (/lib, /usr/lib, /lib32, /usr/lib32, /lib64,
 /usr/lib64). Then it checks those directories in the package's build tree
@@ -311,9 +323,9 @@ If the library is not found in any of those directories, then you get this
 error.
 
 If the library not found is in a private directory of the same package,
-then you want to add the directory to \fBLD_LIBRARY_PATH\fP. If it's in another
+then you want to add the directory with \fB\-l\fP. If it's in another
 binary package being built, you want to make sure that the shlibs/symbols
-file of this package is already created and that \fBLD_LIBRARY_PATH\fP
+file of this package is already created and that \fB\-l\fP
 contains the appropriate directory if it also is in a private directory.
 .TP
 .BI "no dependency information found for " library-file " (used by " binary ")."

+ 8 - 3
scripts/Dpkg/Shlibs.pm

@@ -21,7 +21,7 @@ use warnings;
 our $VERSION = '0.01';
 
 use Exporter qw(import);
-our @EXPORT_OK = qw(@librarypaths find_library);
+our @EXPORT_OK = qw(@librarypaths find_library add_library_dir);
 
 use File::Spec;
 
@@ -67,11 +67,11 @@ if ($crossprefix) {
 
 our @librarypaths = (DEFAULT_LIBRARY_PATH, @crosslibrarypaths);
 
-# Update library paths with LD_LIBRARY_PATH
+# XXX: Deprecated. Update library paths with LD_LIBRARY_PATH
 if ($ENV{LD_LIBRARY_PATH}) {
     foreach my $path (reverse split( /:/, $ENV{LD_LIBRARY_PATH} )) {
 	$path =~ s{/+$}{};
-	unshift @librarypaths, $path;
+	add_library_dir($path);
     }
 }
 
@@ -103,6 +103,11 @@ sub parse_ldso_conf {
     close $fh;
 }
 
+sub add_library_dir {
+    my ($dir) = @_;
+    unshift @librarypaths, $dir;
+}
+
 # find_library ($soname, \@rpath, $format, $root)
 sub find_library {
     my ($lib, $rpath, $format, $root) = @_;

+ 4 - 1
scripts/dpkg-shlibdeps.pl

@@ -87,6 +87,8 @@ foreach (@ARGV) {
 	$varnameprefix = $1;
     } elsif (m/^-L(.*)$/) {
 	$shlibslocal = $1;
+    } elsif (m/^-l(.*)$/) {
+	Dpkg::Shlibs::add_library_dir($1);
     } elsif (m/^-S(.*)$/) {
 	push @pkg_dir_to_search, $1;
     } elsif (m/^-O$/) {
@@ -441,7 +443,7 @@ foreach my $soname (keys %global_soname_needed) {
 if ($error_count >= 1) {
     my $note = _g('Note: libraries are not searched in other binary packages ' .
 	"that do not have any shlibs or symbols file.\nTo help dpkg-shlibdeps " .
-	'find private libraries, you might need to set LD_LIBRARY_PATH.');
+	'find private libraries, you might need to use -l.');
     error(P_('cannot continue due to the error above',
              'cannot continue due to the errors listed above',
              $error_count) . "\n" . $note);
@@ -560,6 +562,7 @@ sub usage {
   -d<dependency-field>     next executable(s) set shlibs:<dependency-field>.")
     . "\n\n" . _g(
 "Options:
+  -l<library-dir>          add directory to private shared library search list.
   -p<varname-prefix>       set <varname-prefix>:* instead of shlibs:*.
   -O                       print variable settings to stdout.
   -L<local-shlibs-file>    shlibs override file, not debian/shlibs.local.