diff options
Diffstat (limited to 'dh_strip')
-rwxr-xr-x | dh_strip | 115 |
1 files changed, 99 insertions, 16 deletions
@@ -1,12 +1,78 @@ #!/usr/bin/perl -w -# -# Strip files. +=head1 NAME + +dh_strip - strip executables, shared libraries, and some static libraries + +=cut + +use strict; use File::Find; -BEGIN { push @INC, "debian", "/usr/share/debhelper" } -use Dh_Lib; +use Debian::Debhelper::Dh_Lib; + +=head1 SYNOPSIS + +B<dh_strip> [S<I<debhelper options>>] [B<-X>I<item>] + +=head1 DESCRIPTION + +dh_strip is a debhelper program that is responsible for stripping +executables, shared libraries, and static libraries that are not used for +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 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 +libraries.) In general it seems to make very good guesses, and will do the +right thing in almost all cases. + +Since it is very hard to automatically guess if a file is a +module, and hard to determine how to strip a module, dh_strip does not +currently deal with stripping binary modules such as .o files. + +=head1 OPTIONS + +=over 4 + +=item B<-X>I<item>, B<--exclude=>I<item> + +Exclude files that contain "item" anywhere in their filename from being +stripped. You may use this option multiple times to build up a list of +things to exclude. + +=back + +=head1 NOTES + +If the DEB_BUILD_OPTIONS environment variable contains "nostrip", nothing +will be stripped, in accordance with Debian policy. + +=head1 CONFORMS TO + +Debian policy, version 3.0.1 + +=cut + init(); +# This variable can be used to turn off stripping (see Policy). +if (defined $ENV{DEB_BUILD_OPTIONS} && $ENV{DEB_BUILD_OPTIONS} =~ /nostrip/) { + exit; +} + +# I could just use `file $_[0]`, but this is safer +sub get_file_type { + my $file=shift; + open (FILE, '-|') # handle all filenames safely + || exec('file', $file) + || die "can't exec file: $!"; + my $type=<FILE>; + close FILE; + return $type; +} + # Check if a file is an elf binary, shared library, or static library, # for use by File::Find. It'll fill the following 3 arrays with anything # it finds: @@ -16,15 +82,18 @@ sub testfile { # See if we were asked to exclude this file. # Note that we have to test on the full filename, including directory. - $fn="$File::Find::dir/$_"; - foreach $f (@{$dh{EXCLUDE}}) { + my $fn="$File::Find::dir/$_"; + foreach my $f (@{$dh{EXCLUDE}}) { return if ($fn=~m/\Q$f\E/); } + # Is it a debug library in a debug subdir? + return if $fn=~m/debug\/.*\.so/; + # Does its filename look like a shared library? if (m/.*\.so.*?/) { # Ok, do the expensive test. - my $type=`file $_`; + my $type=get_file_type($_); if ($type=~m/.*ELF.*shared.*/) { push @shared_libs, $fn; return; @@ -32,40 +101,54 @@ sub testfile { } # Is it executable? -x isn't good enough, so we need to use stat. - (undef,undef,$mode,undef)=stat(_); + my (undef,undef,$mode,undef)=stat(_); if ($mode & 0111) { # Ok, expensive test. - my $type=`file $_`; - if ($type=~m/.*ELF.*executable.*/) { + my $type=get_file_type($_); + if ($type=~m/.*ELF.*(executable|shared).*/) { push @executables, $fn; return; } } # Is it a static library, and not a debug library? - if (m/lib.*\.a/ && ! m/.*_g\.a/) { + if (m/lib.*\.a$/ && ! m/.*_g\.a$/) { push @static_libs, $fn; return; } } -foreach $PACKAGE (@{$dh{DOPACKAGES}}) { - $TMP=tmpdir($PACKAGE); +foreach my $package (@{$dh{DOPACKAGES}}) { + my $tmp=tmpdir($package); @shared_libs=@executables=@static_libs=(); - find(\&testfile,$TMP); + find(\&testfile,$tmp); foreach (@shared_libs) { # Note that all calls to strip on shared libs # *must* inclde the --strip-unneeded. - doit("strip","--remove-section=.comment","--remove-section=.note","--strip-unneeded",$_); + doit("strip","--remove-section=.comment", + "--remove-section=.note","--strip-unneeded",$_); } foreach (@executables) { - doit("strip","--remove-section=.comment","--remove-section=.note",$_); + doit("strip","--remove-section=.comment", + "--remove-section=.note",$_); } foreach (@static_libs) { doit("strip","--strip-debug",$_); } } + +=head1 SEE ALSO + +L<debhelper(7)> + +This program is a part of debhelper. + +=head1 AUTHOR + +Joey Hess <joeyh@debian.org> + +=cut |