-#!/bin/sh -e
-#
-# Strip files.
+#!/usr/bin/perl -w
-PATH=debian:$PATH:/usr/lib/debhelper
-source dh_lib
+=head1 NAME
-for PACKAGE in $DH_DOPACKAGES; do
- TMP=`tmpdir $PACKAGE`
+dh_strip - strip executables, shared libraries, and some static libraries
+
+=cut
+
+use strict;
+use File::Find;
+use Debian::Debhelper::Dh_Lib;
+
+=head1 SYNOPSIS
+
+ dh_strip [debhelper options] [-Xitem]
+
+=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.
+
+It assumes that files that have names like lib*_g.a are static libraries
+used in debugging, and will not strip them.
+
+=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 environement 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;
+}
+
+# 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:
+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/$_";
+ foreach my $f (@{$dh{EXCLUDE}}) {
+ return if ($fn=~m/\Q$f\E/);
+ }
+
+ # Does its filename look like a shared library?
+ if (m/.*\.so.*?/) {
+ # Ok, do the expensive test.
+ my $type=`file $_`;
+ if ($type=~m/.*ELF.*shared.*/) {
+ push @shared_libs, $fn;
+ return;
+ }
+ }
- # Handle executables and shared libraries.
- for file in `find debian/$TMP -type f \( -perm +111 -or -name "*.so*" \) 2>/dev/null` ; do
- case "`file $file`" in
- *ELF*shared*)
- doit "strip --strip-unneeded $file"
- ;;
- *ELF*executable*)
- doit "strip --remove-section=comment --remove-section=note $file"
- ;;
- esac
- done
-
- # Handle static libraries.
- for file in `find debian/$TMP -type f -name "lib*.a" 2>/dev/null` ; do
- # Don't strip debug libraries.
- if ! expr "$file" : ".*_g\.a" >/dev/null ; then
- doit "strip --strip-debug $file"
- fi
- done
-done
+ # Is it executable? -x isn't good enough, so we need to use stat.
+ my (undef,undef,$mode,undef)=stat(_);
+ if ($mode & 0111) {
+ # Ok, expensive test.
+ my $type=`file $_`;
+ if ($type=~m/.*ELF.*executable.*/) {
+ push @executables, $fn;
+ return;
+ }
+ }
+
+ # Is it a static library, and not a debug library?
+ if (m/lib.*\.a/ && ! m/.*_g\.a/) {
+ push @static_libs, $fn;
+ return;
+ }
+}
+
+foreach my $package (@{$dh{DOPACKAGES}}) {
+ my $tmp=tmpdir($package);
+
+ 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",$_);
+ }
+
+ foreach (@executables) {
+ doit("strip","--remove-section=.comment",
+ "--remove-section=.note",$_);
+ }
+
+ foreach (@static_libs) {
+ doit("strip","--strip-debug",$_);
+ }
+}
+
+=head1 SEE ALSO
+
+L<debhelper(1)>
+
+This program is a part of debhelper.
+
+=head1 AUTHOR
+
+Joey Hess <joeyh@debian.org>
+
+=cut