From: Bruno Haible Date: Tue, 12 Jun 2001 12:58:01 +0000 (+0000) Subject: Generate man pages for the programs using help2man. X-Git-Tag: v0.11~667 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e32a886f0dd4749e4a0fcf2c63a1339621fb957;p=thirdparty%2Fgettext.git Generate man pages for the programs using help2man. --- diff --git a/ChangeLog b/ChangeLog index 03df4c289..a65acd20c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2001-06-10 Bruno Haible + + * configure.in: Add test for cross compilation and for PERL. + 2001-06-10 Bruno Haible * configure.in: Bump version number to 0.11. diff --git a/configure.in b/configure.in index be26b049a..944cf9599 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.13) -AC_REVISION($Revision: 1.31 $) +AC_REVISION($Revision: 1.32 $) AC_INIT(src/msgfmt.c) AM_INIT_AUTOMAKE(gettext, 0.11) RELEASE_DATE=2001-05-23 dnl in "date +%Y-%m-%d" format @@ -99,6 +99,11 @@ AC_PATH_PROG(DVIPS, dvips, $ac_aux_dir_abs/missing dvips) AC_PATH_PROG(TEXI2PDF, texi2pdf, $ac_aux_dir_abs/missing texi2pdf) AC_PATH_PROG(TEXI2HTML, texi2html, $ac_aux_dir_abs/missing texi2html) +dnl Check for tools needed for formatting man pages. +CROSS_COMPILING=$cross_compiling +AC_SUBST(CROSS_COMPILING) +AC_PATH_PROG(PERL, perl, $ac_aux_dir_abs/missing perl) + dnl Generate the version information file in the intl/ directory. test -d intl || mkdir intl echo "GNU gettext library from $PACKAGE-$VERSION" > intl/VERSION diff --git a/man/ChangeLog b/man/ChangeLog index 81394ba51..2672fa549 100644 --- a/man/ChangeLog +++ b/man/ChangeLog @@ -1,3 +1,33 @@ +2001-06-10 Bruno Haible + + * help2man: New file, from help2man-1.24. + * gettext.x: New file. + * msgcat.x: New file. + * msgcmp.x: New file. + * msgcomm.x: New file. + * msgconv.x: New file. + * msgen.x: New file. + * msgfmt.x: New file. + * msggrep.x: New file. + * msgmerge.x: New file. + * msgsed.x: New file. + * msgunfmt.x: New file. + * ngettext.x: New file. + * xgettext.x: New file. + * Makefile.am (man_aux, man_MAN1): New variables. + (man_MANS): Add $(man_MAN1). + (man_HTML): Add *.1.html for all programs. + (EXTRA_DIST): Add help2man, $(man_aux). + (SUFFIXES): Recognize .1 and .x. + (PERL): New variable. + (HELP2MAN): New variable. + (.x.1): New rule. + ($(man_MAN1)): Depend on help2man and configure.in. + (gettext.1.html, ngettext.1.html, msgcmp.1.html, msgfmt.1.html, + msgmerge.1.html, msgunfmt.1.html, xgettext.1.html, msgcat.1.html, + msgcomm.1.html, msgconv.1.html, msgen.1.html, msggrep.1.html, + msgsed.1.html): New rules. + 2001-05-23 Bruno Haible * gettext-0.10.38 released. diff --git a/man/Makefile.am b/man/Makefile.am index dc1c4d14e..ba16c072e 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -24,21 +24,40 @@ htmldir = $(docdir) AUTOMAKE_OPTIONS = 1.2 gnits +# A manual page for each of the bin_PROGRAMS in src/Makefile.am. + +man_aux = gettext.x ngettext.x \ +msgcmp.x msgfmt.x msgmerge.x msgunfmt.x xgettext.x \ +msgcat.x msgcomm.x msgconv.x msgen.x msggrep.x msgsed.x + +# Likewise, plus additional manual pages for the libintl functions. + +man_MAN1 = gettext.1 ngettext.1 \ +msgcmp.1 msgfmt.1 msgmerge.1 msgunfmt.1 xgettext.1 \ +msgcat.1 msgcomm.1 msgconv.1 msgen.1 msggrep.1 msgsed.1 man_MAN3 = gettext.3 ngettext.3 \ textdomain.3 bindtextdomain.3 bind_textdomain_codeset.3 man_MAN3IN = gettext.3.in ngettext.3.in \ textdomain.3.in bindtextdomain.3.in bind_textdomain_codeset.3.in -man_MANS = $(man_MAN3) \ +man_MANS = $(man_MAN1) $(man_MAN3) \ dgettext.3 dcgettext.3 dngettext.3 dcngettext.3 -man_HTML = gettext.3.html ngettext.3.html \ +man_HTML = gettext.1.html ngettext.1.html \ +msgcmp.1.html msgfmt.1.html msgmerge.1.html msgunfmt.1.html xgettext.1.html \ +msgcat.1.html msgcomm.1.html msgconv.1.html msgen.1.html msggrep.1.html msgsed.1.html \ +gettext.3.html ngettext.3.html \ textdomain.3.html bindtextdomain.3.html bind_textdomain_codeset.3.html -EXTRA_DIST = $(man_MANS) $(man_MAN3IN) $(man_HTML) +EXTRA_DIST = help2man $(man_aux) $(man_MANS) $(man_MAN3IN) $(man_HTML) MAINTAINERCLEANFILES = $(man_MAN1) $(man_MAN3) $(man_HTML) +SUFFIXES = .1 .x +PERL = @PERL@ RM = rm -f +# help2man 1.24 or newer. +HELP2MAN = $(PERL) -w -- $(srcdir)/help2man + # groff 1.17 or newer. MAN2HTML = groff -mandoc -Thtml @@ -56,6 +75,25 @@ uninstall-local: uninstall-html # Man pages. +# The progname.x files contain some extra information not found in the +# "progname --help" output. +.x.1: + @progname=`basename $@ .1`; \ + executable=../src/$$progname; \ + case "$(PERL)" in *"/missing perl") perlok=no;; *) perlok=yes;; esac; \ + if test @CROSS_COMPILING@ = no && test -f $$executable && test $$perlok = yes; then \ + echo "Updating man page $@"; \ + echo "$(HELP2MAN) --include=$$progname.x $$executable > $$progname.1"; \ + rm -f t-$$progname.1; \ + $(HELP2MAN) --include=$$progname.x $$executable > t-$$progname.1 || exit 1; \ + mv t-$$progname.1 $$progname.1; \ + else \ + echo "WARNING: The man page $@ cannot be updated yet."; \ + fi + +# Depend on configure.in to get version number changes. +$(man_MAN1): help2man $(top_srcdir)/configure.in + gettext.3: gettext.3.in $(top_srcdir)/configure.in sed -e 's/@''VERSION''@/@VERSION@/g' < $(srcdir)/gettext.3.in > t-$@ mv t-$@ $@ @@ -77,6 +115,45 @@ bind_textdomain_codeset.3: bind_textdomain_codeset.3.in $(top_srcdir)/configure. html: $(man_HTML) +gettext.1.html: gettext.1 + $(MAN2HTML) `if test -f gettext.1; then echo .; else echo $(srcdir); fi`/gettext.1 > t-$@ + mv t-$@ $@ +ngettext.1.html: ngettext.1 + $(MAN2HTML) `if test -f ngettext.1; then echo .; else echo $(srcdir); fi`/ngettext.1 > t-$@ + mv t-$@ $@ +msgcmp.1.html: msgcmp.1 + $(MAN2HTML) `if test -f msgcmp.1; then echo .; else echo $(srcdir); fi`/msgcmp.1 > t-$@ + mv t-$@ $@ +msgfmt.1.html: msgfmt.1 + $(MAN2HTML) `if test -f msgfmt.1; then echo .; else echo $(srcdir); fi`/msgfmt.1 > t-$@ + mv t-$@ $@ +msgmerge.1.html: msgmerge.1 + $(MAN2HTML) `if test -f msgmerge.1; then echo .; else echo $(srcdir); fi`/msgmerge.1 > t-$@ + mv t-$@ $@ +msgunfmt.1.html: msgunfmt.1 + $(MAN2HTML) `if test -f msgunfmt.1; then echo .; else echo $(srcdir); fi`/msgunfmt.1 > t-$@ + mv t-$@ $@ +xgettext.1.html: xgettext.1 + $(MAN2HTML) `if test -f xgettext.1; then echo .; else echo $(srcdir); fi`/xgettext.1 > t-$@ + mv t-$@ $@ +msgcat.1.html: msgcat.1 + $(MAN2HTML) `if test -f msgcat.1; then echo .; else echo $(srcdir); fi`/msgcat.1 > t-$@ + mv t-$@ $@ +msgcomm.1.html: msgcomm.1 + $(MAN2HTML) `if test -f msgcomm.1; then echo .; else echo $(srcdir); fi`/msgcomm.1 > t-$@ + mv t-$@ $@ +msgconv.1.html: msgconv.1 + $(MAN2HTML) `if test -f msgconv.1; then echo .; else echo $(srcdir); fi`/msgconv.1 > t-$@ + mv t-$@ $@ +msgen.1.html: msgen.1 + $(MAN2HTML) `if test -f msgen.1; then echo .; else echo $(srcdir); fi`/msgen.1 > t-$@ + mv t-$@ $@ +msggrep.1.html: msggrep.1 + $(MAN2HTML) `if test -f msggrep.1; then echo .; else echo $(srcdir); fi`/msggrep.1 > t-$@ + mv t-$@ $@ +msgsed.1.html: msgsed.1 + $(MAN2HTML) `if test -f msgsed.1; then echo .; else echo $(srcdir); fi`/msgsed.1 > t-$@ + mv t-$@ $@ gettext.3.html: gettext.3.in $(MAN2HTML) $(srcdir)/gettext.3.in > t-$@ mv t-$@ $@ diff --git a/man/gettext.x b/man/gettext.x new file mode 100644 index 000000000..81964c281 --- /dev/null +++ b/man/gettext.x @@ -0,0 +1,6 @@ +[NAME] +gettext \- translate message +[DESCRIPTION] +.\" Add any additional description here +The \fBgettext\fP program translates a natural language message into the +user's language, by looking up the translation in a message catalog. diff --git a/man/help2man b/man/help2man new file mode 100755 index 000000000..c8821b072 --- /dev/null +++ b/man/help2man @@ -0,0 +1,530 @@ +#!/usr/bin/perl -w + +# Generate a short man page from --help and --version output. +# Copyright © 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + +# 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, 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. + +# Written by Brendan O'Dea +# Available from ftp://ftp.gnu.org/gnu/help2man/ + +use 5.004; +use strict; +use Getopt::Long; +use Text::Tabs qw(expand); +use POSIX qw(strftime setlocale LC_TIME); + +my $this_program = 'help2man'; +my $this_version = '1.24'; +my $version_info = < +EOT + +my $help_info = <. +EOT + +my $section = 1; +my ($opt_name, @opt_include, $opt_output, $opt_no_info); +my %opt_def = ( + 'n|name=s' => \$opt_name, + 's|section=s' => \$section, + 'i|include=s' => sub { push @opt_include, [ pop, 1 ] }, + 'I|opt-include=s' => sub { push @opt_include, [ pop, 0 ] }, + 'o|output=s' => \$opt_output, + 'N|no-info' => \$opt_no_info, +); + +# Parse options. +Getopt::Long::config('bundling'); +GetOptions (%opt_def, + help => sub { print $help_info; exit }, + version => sub { print $version_info; exit }, +) or die $help_info; + +die $help_info unless @ARGV == 1; + +my %include = (); +my %append = (); +my @include = (); # retain order given in include file + +# Provide replacement `quote-regex' operator for pre-5.005. +BEGIN { eval q(sub qr { '' =~ $_[0]; $_[0] }) if $] < 5.005 } + +# Process include file (if given). Format is: +# +# [section name] +# verbatim text +# +# or +# +# /pattern/ +# verbatim text +# + +while (@opt_include) +{ + my ($inc, $required) = @{shift @opt_include}; + + next unless -f $inc or $required; + die "$this_program: can't open `$inc' ($!)\n" + unless open INC, $inc; + + my $key; + my $hash = \%include; + + while () + { + # [section] + if (/^\[([^]]+)\]/) + { + $key = uc $1; + $key =~ s/^\s+//; + $key =~ s/\s+$//; + $hash = \%include; + push @include, $key unless $include{$key}; + next; + } + + # /pattern/ + if (m!^/(.*)/([ims]*)!) + { + my $pat = $2 ? "(?$2)$1" : $1; + + # Check pattern. + eval { $key = qr($pat) }; + if ($@) + { + $@ =~ s/ at .*? line \d.*//; + die "$inc:$.:$@"; + } + + $hash = \%append; + next; + } + + # Check for options before the first section--anything else is + # silently ignored, allowing the first for comments and + # revision info. + unless ($key) + { + # handle options + if (/^-/) + { + local @ARGV = split; + GetOptions %opt_def; + } + + next; + } + + $hash->{$key} ||= ''; + $hash->{$key} .= $_; + } + + close INC; + + die "$this_program: no valid information found in `$inc'\n" + unless $key; +} + +# Compress trailing blank lines. +for my $hash (\(%include, %append)) +{ + for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ } +} + +# Turn off localisation of executable's ouput. +@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; + +# Turn off localisation of date (for strftime). +setlocale LC_TIME, 'C'; + +# Grab help and version info from executable. +my ($help_text, $version_text) = map { + join '', map { s/ +$//; expand $_ } `$ARGV[0] --$_ 2>/dev/null` + or die "$this_program: can't get `--$_' info from $ARGV[0]\n" +} qw(help version); + +my $date = strftime "%B %Y", localtime; +(my $program = $ARGV[0]) =~ s!.*/!!; +my $package = $program; +my $version; + +if ($opt_output) +{ + unlink $opt_output + or die "$this_program: can't unlink $opt_output ($!)\n" + if -e $opt_output; + + open STDOUT, ">$opt_output" + or die "$this_program: can't create $opt_output ($!)\n"; +} + +# The first line of the --version information is assumed to be in one +# of the following formats: +# +# +# +# {GNU,Free} +# ({GNU,Free} ) +# - {GNU,Free} +# +# and seperated from any copyright/author details by a blank line. + +($_, $version_text) = split /\n+/, $version_text, 2; + +if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or + /^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/) +{ + $program = $1; + $package = $2; + $version = $3; +} +elsif (/^((?:GNU|Free) +)?(\S+) +(.*)/) +{ + $program = $2; + $package = $1 ? "$1$2" : $2; + $version = $3; +} +else +{ + $version = $_; +} + +$program =~ s!.*/!!; + +# No info for `info' itself. +$opt_no_info = 1 if $program eq 'info'; + +# --name overrides --include contents. +$include{NAME} = "$program \\- $opt_name\n" if $opt_name; + +# Default (useless) NAME paragraph. +$include{NAME} ||= "$program \\- manual page for $program $version\n"; + +# Man pages traditionally have the page title in caps. +my $PROGRAM = uc $program; + +# Extract usage clause(s) [if any] for SYNOPSIS. +if ($help_text =~ s/^Usage:( +(\S+))(.*)((?:\n(?: {6}\1| *or: +\S).*)*)//m) +{ + my @syn = $2 . $3; + + if ($_ = $4) + { + s/^\n//; + for (split /\n/) { s/^ *(or: +)?//; push @syn, $_ } + } + + my $synopsis = ''; + for (@syn) + { + $synopsis .= ".br\n" if $synopsis; + s!^\S*/!!; + s/^(\S+) *//; + $synopsis .= ".B $1\n"; + s/\s+$//; + s/(([][]|\.\.+)+)/\\fR$1\\fI/g; + s/^/\\fI/ unless s/^\\fR//; + $_ .= '\fR'; + s/(\\fI)( *)/$2$1/g; + s/\\fI\\fR//g; + s/^\\fR//; + s/\\fI$//; + s/^\./\\&./; + + $synopsis .= "$_\n"; + } + + $include{SYNOPSIS} ||= $synopsis; +} + +# Process text, initial section is DESCRIPTION. +my $sect = 'DESCRIPTION'; +$_ = "$help_text\n\n$version_text"; + +# Normalise paragraph breaks. +s/^\n+//; +s/\n*$/\n/; +s/\n\n+/\n\n/g; + +# Temporarily exchange leading dots, apostrophes and backslashes for +# tokens. +s/^\./\x80/mg; +s/^'/\x81/mg; +s/\\/\x82/g; + +# Start a new paragraph (if required) for these. +s/([^\n])\n(Report +bugs|Email +bug +reports +to|Written +by)/$1\n\n$2/g; + +sub convert_option; + +while (length) +{ + # Convert some standard paragraph names. + if (s/^(Options|Examples): *\n//) + { + $sect = uc $1; + next; + } + + # Copyright section + if (/^Copyright +[(\xa9]/) + { + $sect = 'COPYRIGHT'; + $include{$sect} ||= ''; + $include{$sect} .= ".PP\n" if $include{$sect}; + + my $copy; + ($copy, $_) = split /\n\n/, $_, 2; + + for ($copy) + { + # Add back newline + s/\n*$/\n/; + + # Convert iso9959-1 copyright symbol or (c) to nroff + # character. + s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg; + + # Insert line breaks before additional copyright messages + # and the disclaimer. + s/(.)\n(Copyright |This +is +free +software)/$1\n.br\n$2/g; + + # Join hyphenated lines. + s/([A-Za-z])-\n */$1/g; + } + + $include{$sect} .= $copy; + $_ ||= ''; + next; + } + + # Catch bug report text. + if (/^(Report +bugs|Email +bug +reports +to) /) + { + $sect = 'REPORTING BUGS'; + } + + # Author section. + elsif (/^Written +by/) + { + $sect = 'AUTHOR'; + } + + # Examples, indicated by an indented leading $, % or > are + # rendered in a constant width font. + if (/^( +)([\$\%>] )\S/) + { + my $indent = $1; + my $prefix = $2; + my $break = '.IP'; + $include{$sect} ||= ''; + while (s/^$indent\Q$prefix\E(\S.*)\n*//) + { + $include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n"; + $break = '.br'; + } + + next; + } + + my $matched = ''; + $include{$sect} ||= ''; + + # Sub-sections have a trailing colon and the second line indented. + if (s/^(\S.*:) *\n / /) + { + $matched .= $& if %append; + $include{$sect} .= qq(.SS "$1"\n); + } + + my $indent = 0; + my $content = ''; + + # Option with description. + if (s/^( {1,10}([+-]\S.*?))(?:( +)|\n( {20,}))(\S.*)\n//) + { + $matched .= $& if %append; + $indent = length ($4 || "$1$3"); + $content = ".TP\n\x83$2\n\x83$5\n"; + unless ($4) + { + # Indent may be different on second line. + $indent = length $& if /^ {20,}/; + } + } + + # Option without description. + elsif (s/^ {1,10}([+-]\S.*)\n//) + { + $matched .= $& if %append; + $content = ".HP\n\x83$1\n"; + $indent = 80; # not continued + } + + # Indented paragraph with tag. + elsif (s/^( +(\S.*?) +)(\S.*)\n//) + { + $matched .= $& if %append; + $indent = length $1; + $content = ".TP\n\x83$2\n\x83$3\n"; + } + + # Indented paragraph. + elsif (s/^( +)(\S.*)\n//) + { + $matched .= $& if %append; + $indent = length $1; + $content = ".IP\n\x83$2\n"; + } + + # Left justified paragraph. + else + { + s/(.*)\n//; + $matched .= $& if %append; + $content = ".PP\n" if $include{$sect}; + $content .= "$1\n"; + } + + # Append continuations. + while (s/^ {$indent}(\S.*)\n//) + { + $matched .= $& if %append; + $content .= "\x83$1\n" + } + + # Move to next paragraph. + s/^\n+//; + + for ($content) + { + # Leading dot and apostrophe protection. + s/\x83\./\x80/g; + s/\x83'/\x81/g; + s/\x83//g; + + # Convert options. + s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge; + } + + # Check if matched paragraph contains /pat/. + if (%append) + { + for my $pat (keys %append) + { + if ($matched =~ $pat) + { + $content .= ".PP\n" unless $append{$pat} =~ /^\./; + $content .= $append{$pat}; + } + } + } + + $include{$sect} .= $content; +} + +# Refer to the real documentation. +unless ($opt_no_info) +{ + $sect = 'SEE ALSO'; + $include{$sect} ||= ''; + $include{$sect} .= ".PP\n" if $include{$sect}; + $include{$sect} .= <