=head1 SYNOPSIS
-B<dh_strip> [S<I<debhelper options>>] [B<-X>I<item>]
+B<dh_strip> [S<I<debhelper options>>] [B<-X>I<item>] [--dbg-package=package] [--keep-debug]
=head1 DESCRIPTION
debugging.
This program examines your package build directories and works out what
-to strip on its own. It uses L<file(1)> and file permisions and filenames
+to strip on its own. It uses L<file(1)> and file permissions and filenames
to figure out what files are shared libraries (*.so), executable binaries,
and static (lib*.a) and debugging libraries (lib*_g.a, debug/*.so), and
strips each as much as is possible. (Which is not at all for debugging
stripped. You may use this option multiple times to build up a list of
things to exclude.
+=item B<--dbg-package=>I<package>
+
+Causes dh_strip to save debug symbols stripped from the packages it acts on
+as independent files in the package build directory of the specified debugging
+package.
+
+For example, if your packages are libfoo and foo and you want to include a
+foo-dbg package with debugging symbols, use dh_strip --dbg-package=foo-dbg.
+
+Note that this option behaves significantly different in debhelper
+compatibility levels 4 and below. Instead of specifying the name of a debug
+package to put symbols in, it specifies a package (or packages) which
+should have separated debug symbols, and the separated symbols are placed
+in packages with "-dbg" added to their name.
+
+=item B<-k>, B<--keep-debug>
+
+Debug symbols will be retained, but split into an independent
+file in usr/lib/debug/ in the package build directory. --dbg-package
+is easier to use than this option, but this option is more flexible.
+
=back
=head1 NOTES
If the DEB_BUILD_OPTIONS environment variable contains "nostrip", nothing
-will be stripped, in accordance with Debian policy.
+will be stripped, in accordance with Debian policy (section 10.1
+"Binaries").
=head1 CONFORMS TO
=cut
-init();
+init(options => {
+ "keep-debug" => \$dh{K_FLAG},
+});
# This variable can be used to turn off stripping (see Policy).
if (defined $ENV{DEB_BUILD_OPTIONS} && $ENV{DEB_BUILD_OPTIONS} =~ /nostrip/) {
my (@shared_libs, @executables, @static_libs);
sub testfile {
return if -l $_ or -d $_; # Skip directories and symlinks always.
-
+
# See if we were asked to exclude this file.
# Note that we have to test on the full filename, including directory.
my $fn="$File::Find::dir/$_";
# Is it a static library, and not a debug library?
if (m/lib.*\.a$/ && ! m/.*_g\.a$/) {
- push @static_libs, $fn;
- return;
+ # Is it a binary file, or something else (maybe a liner
+ # script on Hurd, for example? I don't use file, because
+ # file returns a varity of things on static libraries.
+ if (-B $_) {
+ push @static_libs, $fn;
+ return;
+ }
}
}
+sub make_debug {
+ my $file=shift;
+ my $tmp=shift;
+ my $desttmp=shift;
+
+ # Don't try to copy debug symbols out if the file is already
+ # stripped.
+ return unless get_file_type($file) =~ /not stripped/;
+
+ my ($base_file)=$file=~/^\Q$tmp\E(.*)/;
+ my $debug_path=$desttmp."/usr/lib/debug/".$base_file;
+ my $debug_dir=dirname($debug_path);
+ if (! -d $debug_dir) {
+ doit("install", "-d", $debug_dir);
+ }
+ doit("objcopy", "--only-keep-debug", $file, $debug_path);
+ # No reason for this to be executable.
+ doit("chmod", 644, $debug_path);
+ return $debug_path;
+}
+
+sub attach_debug {
+ my $file=shift;
+ my $debug_path=shift;
+ doit("objcopy", "--add-gnu-debuglink", $debug_path, $file);
+}
+
foreach my $package (@{$dh{DOPACKAGES}}) {
my $tmp=tmpdir($package);
+ # Support for keeping the debugging symbols in a detached file.
+ my $keep_debug=$dh{K_FLAG};
+ my $debugtmp=$tmp;
+ if (! compat(4)) {
+ if (ref $dh{DEBUGPACKAGES}) {
+ $keep_debug=1;
+ # Note that it's only an array for the v4 stuff;
+ # for v5 only one value is used.
+ my $debugpackage=@{$dh{DEBUGPACKAGES}}[0];
+ if (! grep { $_ eq $debugpackage } getpackages()) {
+ error("debug package $debugpackage is not listed in the control file");
+ }
+ $debugtmp=tmpdir($debugpackage);
+ }
+ }
+ else {
+ if (ref $dh{DEBUGPACKAGES} && grep { $_ eq $package } @{$dh{DEBUGPACKAGES}}) {
+ $keep_debug=1;
+ $debugtmp=tmpdir($package."-dbg");
+ }
+ }
+
+ @shared_libs=@executables=@static_libs=();
find(\&testfile,$tmp);
foreach (@shared_libs) {
+ my $debug_path = make_debug($_, $tmp, $debugtmp) if $keep_debug;
# Note that all calls to strip on shared libs
# *must* inclde the --strip-unneeded.
doit("strip","--remove-section=.comment",
"--remove-section=.note","--strip-unneeded",$_);
+ attach_debug($_, $debug_path) if defined $debug_path;
}
foreach (@executables) {
+ my $debug_path = make_debug($_, $tmp, $debugtmp) if $keep_debug;
doit("strip","--remove-section=.comment",
"--remove-section=.note",$_);
+ attach_debug($_, $debug_path) if defined $debug_path;
}
foreach (@static_libs) {