#!/usr/bin/perl -w # # Automatically find and install man pages. However, do not install any man # pages listed on the command line. # Also change man pages with .so commands in them into symlinks. # # This is a little bit (hah!) DWIMish, but still very handy. use File::Find; use Debian::Debhelper::Dh_Lib; init(); # Check if a file is a man page, for use by File::Find. my @manpages; my @allpackages; sub find_man { # Does its filename look like a man page? # .ex files are examples installed by deb-make, # we don't want those, or .in files, which are # from configure, nor do we want CVS .#* files. if (! (-f $_ && /^.*\.[1-9].*$/ && ! /\.(ex|in)$/ && ! /^\.#/)) { return; } # It's not in a tmp directory is it? if ($File::Find::dir=~m:debian/.*tmp.*:) { return; } foreach $dir (@allpackages) { if ($File::Find::dir=~m:debian/\Q$dir\E:) { return; } } # And file does think it's a real man page? my $type=`file -z $_`; if ($type !~ m/:.*roff/) { return; } # Good enough. push @manpages,"$File::Find::dir/$_"; } # Check if a file is a .so man page, for use by File::Find. my @sofiles; my @sodests; sub find_so_man { # The -s test is becuase a .so file tends to be small. We don't want # to open every man page. 1024 is arbitrary. if (! -f $_ || -s $_ > 1024) { return; } # Test first line of file for the .so thing. open (SOTEST,$_); my $l=; close SOTEST; if ($l=~m/\.so\s+(.*)/) { my $solink=$1; # This test is here to prevent links like ... man8/../man8/foo.8 if (Debian::Debhelper::Dh_Lib::basename($File::Find::dir) eq Debian::Debhelper::Dh_Lib::dirname($solink)) { $solink=Debian::Debhelper::Dh_Lib::basename($solink); } else { $solink="../$solink"; } push @sofiles,"$File::Find::dir/$_"; push @sodests,$solink; } } foreach $PACKAGE (@{$dh{DOPACKAGES}}) { $TMP=tmpdir($PACKAGE); # Find all filenames that look like man pages. @manpages=(); @allpackages=GetPackages(''); find(\&find_man,'.'); # populates @manpages foreach $page (@manpages) { $page=~s:^\./::; # just for looks $basename=Debian::Debhelper::Dh_Lib::basename($page); # Skip all files listed on command line. my $install=1; foreach $skip (@ARGV) { # Look at basename of what's on connect line # for backwards compatability. if ($basename eq Debian::Debhelper::Dh_Lib::basename($skip)) { $install=undef; last; } } if ($install) { my $extdir="share"; # Handle X man pages specially. if ($basename=~/x$/) { $extdir="X11R6"; } my ($section)=$basename=~m/.*\.([1-9])/; my $destdir="$TMP/usr/$extdir/man/man$section/"; # Handle translated man pages. my $instname=$basename; my ($langcode)=$basename=~m/.*\.([a-z][a-z])\.([1-9])/; if (defined $langcode && $langcode ne '') { $destdir="$TMP/usr/$extdir/man/$langcode/man$section/"; $instname=~s/\.$langcode\./\./; } $destdir=~tr:/:/:s; # just for looks if (! -e "$destdir/$basename" && !-l "$destdir/$basename") { if (! -d $destdir) { doit "install","-d",$destdir; } doit "install","-p","-m644",$page,$destdir.$instname; } } } # Now the .so conversion. @sofiles=@sodests=(); foreach $dir (qw{usr/share/man usr/X11R6/man}) { if (-e "$TMP/$dir") { find(\&find_so_man, "$TMP/$dir"); } } foreach $sofile (@sofiles) { my $sodest=shift(@sodests); doit "rm","-f",$sofile; doit "ln","-sf",$sodest,$sofile; } }