#!/usr/bin/perl
#
#  dh_strip - Modified verion of dh_strip for dpkg-cross
#  Copyright (C) 2004  Raphael Bossek <bossekr@debian.org>
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#  $Id: dh_strip,v 1.2 2004/06/23 19:56:47 yoush-guest Exp $

use strict;
use File::Find;
use Debian::Debhelper::Dh_Lib;
require "dpkg-cross.pl";

dpkgcross_application();
read_config();
setup();
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:
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/);
	}

	# 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=get_file_type($_);
		if ($type=~m/.*ELF.*shared.*/) {
			push @shared_libs, $fn;
			return;
		}
	}
	
	# 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=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$/) {
		push @static_libs, $fn;
		return;
	}
}

sub make_debug {
	my $file=shift;
	my $tmp=shift;
	my $desttmp=shift;

	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{KEEP_DEBUG};
	my $debugtmp=$tmp;
	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(find_strip(),"--remove-section=.comment",
			"--remove-section=.note","--strip-unneeded",$_);
		attach_debug($_, $debug_path) if $keep_debug;
	}
	
	foreach (@executables) {
		my $debug_path = make_debug($_, $tmp, $debugtmp) if $keep_debug;
		doit(find_strip(),"--remove-section=.comment",
			"--remove-section=.note",$_);
 		attach_debug($_, $debug_path) if $keep_debug
	}

	foreach (@static_libs) {
		doit(find_strip(),"--strip-debug",$_);
	}
}

