X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_installman;h=52d1e6b11541c7e5c7d3150b8911eca5b2eed521;hb=18a0da8092ea9f3dc48bca92b36f592af25a608d;hp=84b9469a2aabf2f49a4c5ea274bc988d558fa191;hpb=1b294974795510843d19adc178e936eb4f2c65bb;p=debhelper.git diff --git a/dh_installman b/dh_installman index 84b9469..52d1e6b 100755 --- a/dh_installman +++ b/dh_installman @@ -12,44 +12,51 @@ use Debian::Debhelper::Dh_Lib; =head1 SYNOPSIS -B [S>] [S>] +B [S>] [S ...>] =head1 DESCRIPTION -dh_installman is a debhelper program that handles installing +B is a debhelper program that handles installing man pages into the correct locations in package build directories. You tell -it what man pages go in your packages, and it figures out where to -install them based on the section field in their .TH line. If you have a -properly formatted .TH line, your man page will be installed into the right -directory, with the right name (this includes proper handling of pages -with a subsection, like "3perl", which are placed in man3, and given an -extension of ".3perl"). If your .TH line is incorrect or missing, the program -may guess wrong based on the file extension. +it what man pages go in your packages, and it figures out where to install +them based on the section field in their B<.TH> or B<.Dt> line. If you have +a properly formatted B<.TH> or B<.Dt> line, your man page will be installed +into the right directory, with the right name (this includes proper handling +of pages with a subsection, like B<3perl>, which are placed in F, and +given an extension of F<.3perl>). If your B<.TH> or B<.Dt> line is incorrect +or missing, the program may guess wrong based on the file extension. It also supports translated man pages, by looking for extensions -like .ll.8 and .ll_LL.8 +like F<.ll.8> and F<.ll_LL.8>, or by use of the B<--language> switch. -If dh_installman seems to install a man page into the wrong section or with +If B seems to install a man page into the wrong section or with the wrong extension, this is because the man page has the wrong section -listed in its .TH line. Edit the man page and correct the section, and -dh_installman will follow suit. See to L for details about the .TH -section. If dh_installman seems to install a man page into a directory -like /usr/share/man/pl/man1/, that is because your program has a -name like "foo.pl", and dh_installman assumes that means it is translated -into Polish. There is currently no support for resolving this ambiguity; -programs in debian should proably not have extensions like that anyway. - -Any man page filenames specified as parameters will be installed into the -first package dh_installman is told to act on. By default, this is the -first binary package in debian/control, but if you use -p, -i, or -a flags, -it will be the first package specified by those flags. - -Files named debian/package.manpages can list other man pages to be -installed. - -After the man page installation step, dh_installman will check to see if +listed in its B<.TH> or B<.Dt> line. Edit the man page and correct the +section, and B will follow suit. See L for details +about the B<.TH> section, and L for the B<.Dt> section. If +B seems to install a man page into a directory +like F, that is because your program has a +name like F, and B assumes that means it is translated +into Polish. Use B<--language=C> to avoid this. + +After the man page installation step, B will check to see if any of the man pages in the temporary directories of any of the packages it -is acting on contain ".so" links. If so, it changes them to symlinks. +is acting on contain F<.so> links. If so, it changes them to symlinks. + +Also, B will use man to guess the character encoding of each +manual page and convert it to UTF-8. If the guesswork fails for some +reason, you can override it using an encoding declaration. See +L for details. + +=head1 FILES + +=over 4 + +=item debian/I.manpages + +Lists man pages to be installed. + +=back =head1 OPTIONS @@ -60,10 +67,15 @@ is acting on contain ".so" links. If so, it changes them to symlinks. Install all files specified by command line parameters in ALL packages acted on. -=item I +=item B<--language=>I + +Use this to specify that the man pages being acted on are written in the +specified language. + +=item I ... Install these man pages into the first package acted on. (Or in all -packages if -A is specified). +packages if B<-A> is specified). =back @@ -76,19 +88,21 @@ interface. Use this program instead. =cut -init(); +init(options => { + "language=s" => \$dh{LANGUAGE}, +}); my @sofiles; my @sodests; foreach my $package (@{$dh{DOPACKAGES}}) { + next if is_udeb($package); + my $tmp=tmpdir($package); my $file=pkgfile($package,"manpages"); my @manpages; - if ($file) { - @manpages=filearray($file, "."); - } + @manpages=filearray($file, ".") if $file; if (($package eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) { push @manpages, @ARGV; @@ -105,7 +119,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) { } my $section; - # See if there is a .TH entry in the man page. If so, + # See if there is a .TH or .Dt entry in the man page. If so, # we'll pull the section field from that. if ($gz) { open (IN, "zcat $page|") or die "$page: $!"; @@ -114,7 +128,8 @@ foreach my $package (@{$dh{DOPACKAGES}}) { open (IN, $page) or die "$page: $!"; } while () { - if (/^\.TH\s+\S+\s+"?(\d+\S*)"?/) { + if (/^\.TH\s+\S+\s+"?(\d+[^"\s]*)"?/ || + /^\.Dt\s+\S+\s+(\d+[^\s]*)/) { $section=$1; last; } @@ -126,8 +141,6 @@ foreach my $package (@{$dh{DOPACKAGES}}) { # Now get the numeric component of the section. my ($realsection)=$section=~m/^(\d)/ if defined $section; - - # If there is no numeric section, bail. if (! $realsection) { error("Could not determine section for $page"); } @@ -136,31 +149,45 @@ foreach my $package (@{$dh{DOPACKAGES}}) { my ($instname)=$basename=~m/^(.*)\./; my $destdir="$tmp/usr/share/man/man$realsection/"; - # Translated man pages are typically specified by adding the - # language code to the filename, so detect that and - # redirect to appropriate directory, stripping the code. - my ($langcode)=$basename=~m/.*\.([a-z][a-z](?:_[A-Z][A-Z])?)\.(?:[1-9]|man)/; + my $langcode; + if (! defined $dh{LANGUAGE} || ! exists $dh{LANGUAGE}) { + # Translated man pages are typically specified by adding the + # language code to the filename, so detect that and + # redirect to appropriate directory, stripping the code. + ($langcode)=$basename=~m/.*\.([a-z][a-z](?:_[A-Z][A-Z])?)\.(?:[1-9]|man)/; + } + elsif ($dh{LANGUAGE} ne 'C') { + $langcode=$dh{LANGUAGE}; + } + if (defined $langcode && $langcode ne '') { - $destdir="$tmp/usr/share/man/$langcode/man$realsection/"; # Strip the language code from the instname. $instname=~s/\.$langcode$//; } + + if (defined $langcode && $langcode ne '') { + $destdir="$tmp/usr/share/man/$langcode/man$realsection/"; + } $destdir=~tr:/:/:s; # just for looks + my $instpage="$destdir$instname.$section"; - if (! -e "$destdir/$instname.$section" && - ! -l "$destdir/$instname.$section") { - if (! -d $destdir) { - doit "install","-d",$destdir; - } - doit "install","-p","-m644",$page, - "$destdir$instname.$section$gz"; + next if -l $instpage; + next if compat(5) && -e $instpage; + + if (! -d $destdir) { + doit "install","-d",$destdir; + } + if ($gz) { + complex_doit "zcat \Q$page\E > \Q$instpage\E"; + } + else { + doit "install","-p","-m644",$page,$instpage; } - } # Now the .so conversion. @sofiles=@sodests=(); - foreach my $dir (qw{usr/share/man usr/X11R6/man}) { + foreach my $dir (qw{usr/share/man}) { if (-e "$tmp/$dir") { find(\&find_so_man, "$tmp/$dir"); } @@ -170,6 +197,22 @@ foreach my $package (@{$dh{DOPACKAGES}}) { doit "rm","-f",$sofile; doit "ln","-sf",$sodest,$sofile; } + + # Now utf-8 conversion. + if (defined `man --version`) { + foreach my $dir (qw{usr/share/man}) { + next unless -e "$tmp/$dir"; + find(sub { + return if ! -f $_ || -l $_; + my ($tmp, $orig)=($_.".new", $_); + complex_doit "man --recode UTF-8 ./\Q$orig\E > \Q$tmp\E"; + # recode uncompresses compressed pages + doit "rm", "-f", $orig if s/\.(gz|Z)$//; + doit "chmod", 644, $tmp; + doit "mv", "-f", $tmp, $_; + }, "$tmp/$dir"); + } + } } # Check if a file is a .so man page, for use by File::Find. @@ -181,22 +224,37 @@ sub find_so_man { } # Test first line of file for the .so thing. - open (SOTEST,$_) || die "$_: $!"; + if (/\.gz$/) { + open (SOTEST, "zcat $_|") or die "$_: $!"; + } + else { + open (SOTEST,$_) || die "$_: $!"; + } my $l=; close SOTEST; - if ($l=~m/\.so\s+(.*)/) { + + if (! defined $l) { + error("failed to read $_"); + } + + if ($l=~m/\.so\s+(.*)\s*/) { my $solink=$1; # This test is here to prevent links like ... man8/../man8/foo.8 if (basename($File::Find::dir) eq dirname($solink)) { $solink=basename($solink); } - else { + # A so link with a path is relative to the base of the man + # page hierarchy, but without a path, is relative to the + # current section. + elsif ($solink =~ m!/!) { $solink="../$solink"; } - push @sofiles,"$File::Find::dir/$_"; - push @sodests,$solink; + if (-e $solink || -e "$solink.gz") { + push @sofiles,"$File::Find::dir/$_"; + push @sodests,$solink; + } } }