From 171a31b10048968c70c963239e40b7a6d5c648de Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Fri, 13 Apr 2012 17:58:04 +0200 Subject: [PATCH] build: use slightly older help2man, for improved portability Fixes automake bug#11235 * doc/help2man: Downgrade to help2man-1.36.4, so that it does not require Locale/gettext.pm, which is not available on a default Fedora 16 installation. Reported by Stefano Lattarini. --- doc/help2man | 201 +++++++++++++++++++++++++++-------------------------------- 1 file changed, 92 insertions(+), 109 deletions(-) diff --git a/doc/help2man b/doc/help2man index 96896f6..01e690b 100755 --- a/doc/help2man +++ b/doc/help2man @@ -1,12 +1,12 @@ #!/usr/bin/perl -w # Generate a short man page from --help and --version output. -# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2009 +# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 # 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 3, or (at your option) +# 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, @@ -26,57 +26,54 @@ use strict; use Getopt::Long; use Text::Tabs qw(expand); use POSIX qw(strftime setlocale LC_ALL); -use Locale::gettext; -use Encode qw(decode encode); -use I18N::Langinfo qw(langinfo CODESET); +use locale; my $this_program = 'help2man'; -my $this_version = '1.37.1'; -my $encoding; +my $this_version = '1.36'; -{ - my $gettext = Locale::gettext->domain($this_program); - sub _ { $gettext->get($_[0]) } - - my ($user_locale) = grep defined && length, - (map $ENV{$_}, qw(LANGUAGE LC_ALL LC_MESSAGES LANG)), 'C'; - - my $user_encoding = langinfo CODESET; +my $have_gettext; +BEGIN { + eval { + require Locale::gettext; + Locale::gettext->import; + $have_gettext = 1; + }; - # Set localisation of date and executable's output. - sub configure_locale + unless ($have_gettext) { - delete @ENV{qw(LANGUAGE LC_MESSAGES LANG)}; - setlocale LC_ALL, $ENV{LC_ALL} = shift || 'C'; - $encoding = langinfo CODESET; + *gettext = sub { $_[0] }; + *textdomain = sub {}; } +} + +sub _ { gettext @_ } +sub N_ { $_[0] } + +textdomain $this_program; +{ + my ($user_locale) = grep defined && length, + (map $ENV{$_}, qw(LANGUAGE LC_ALL LC_MESSAGES LANG)), 'C'; - sub dec { $encoding ? decode $encoding, $_[0] : $_[0] } - sub enc { $encoding ? encode $encoding, $_[0] : $_[0] } - sub enc_user { encode $user_encoding, $_[0] } sub kark # die with message formatted in the invoking user's locale { setlocale LC_ALL, $user_locale; - my $fmt = $gettext->get(shift); - my $errmsg = enc_user sprintf $fmt, @_; - die $errmsg, "\n"; + my $fmt = gettext shift; + die +(sprintf $fmt, @_), "\n"; } } -sub N_ { $_[0] } - -my $version_info = enc_user sprintf _(<<'EOT'), $this_program, $this_version; +my $version_info = sprintf _(<<'EOT'), $this_program, $this_version; GNU %s %s -Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2009 -Free Software Foundation, Inc. +Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free +Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Brendan O'Dea EOT -my $help_info = enc_user sprintf _(<<'EOT'), $this_program, $this_program; +my $help_info = sprintf _(<<'EOT'), $this_program, $this_program; `%s' generates a man page out of `--help' and `--version' output. Usage: %s [OPTION]... EXECUTABLE @@ -94,13 +91,11 @@ Usage: %s [OPTION]... EXECUTABLE --help print this help, then exit --version print version number, then exit -EXECUTABLE should accept `--help' and `--version' options and produce output on -stdout although alternatives may be specified using: +EXECUTABLE should accept `--help' and `--version' options although +alternatives may be specified using: -h, --help-option=STRING help option string -v, --version-option=STRING version option string - --version-string=STRING version string - --no-discard-stderr include stderr when parsing option output Report bugs to . EOT @@ -108,35 +103,44 @@ EOT my $section = 1; my $manual = ''; my $source = ''; +my $locale = 'C'; my $help_option = '--help'; my $version_option = '--version'; -my $discard_stderr = 1; -my ($opt_name, @opt_include, $opt_output, $opt_info, $opt_no_info, $version_text); +my ($opt_name, @opt_include, $opt_output, $opt_info, $opt_no_info); my %opt_def = ( 'n|name=s' => \$opt_name, 's|section=s' => \$section, 'm|manual=s' => \$manual, 'S|source=s' => \$source, - 'L|locale=s' => sub { configure_locale pop }, + 'L|locale=s' => \$locale, 'i|include=s' => sub { push @opt_include, [ pop, 1 ] }, 'I|opt-include=s' => sub { push @opt_include, [ pop, 0 ] }, 'o|output=s' => \$opt_output, 'p|info-page=s' => \$opt_info, 'N|no-info' => \$opt_no_info, - 'help' => sub { print $help_info; exit }, - 'version' => sub { print $version_info; exit }, 'h|help-option=s' => \$help_option, 'v|version-option=s' => \$version_option, - 'version-string=s' => \$version_text, - 'discard-stderr!' => \$discard_stderr, ); # Parse options. Getopt::Long::config('bundling'); -die $help_info unless GetOptions %opt_def and @ARGV == 1; +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; -configure_locale unless $encoding; +die "$this_program: no locale support (Locale::gettext required)\n" + unless $locale eq 'C' or $have_gettext; + +# Add default territory to locale. +$locale .= "_\U$locale" if $locale =~ /^[a-z]{2}$/; + +# Set localisation of date and executable's ouput. +delete @ENV{qw(LANGUAGE LC_MESSAGES LANG)}; +setlocale LC_ALL, $ENV{LC_ALL} = $locale; my %include = (); my %append = (); @@ -166,12 +170,8 @@ while (@opt_include) while () { - # Convert input to internal Perl format, so that multibyte - # sequences are treated as single characters. - $_ = dec $_; - # [section] - if (/^\[([^]]+)\]\s*$/) + if (/^\[([^]]+)\]/) { $key = uc $1; $key =~ s/^\s+//; @@ -182,7 +182,7 @@ while (@opt_include) } # /pattern/ - if (m!^/(.*)/([ims]*)\s*$!) + if (m!^/(.*)/([ims]*)!) { my $pat = $2 ? "(?$2)$1" : $1; @@ -229,11 +229,12 @@ for my $hash (\(%include, %append)) for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ } } -sub get_option_value; - # Grab help and version info from executable. -my $help_text = get_option_value $ARGV[0], $help_option; -$version_text ||= get_option_value $ARGV[0], $version_option; +my ($help_text, $version_text) = map { + join '', map { s/ +$//; expand $_ } `$ARGV[0] $_ 2>/dev/null` + or kark N_("%s: can't get `%s' info from %s"), $this_program, + $_, $ARGV[0] +} $help_option, $version_option; my $date = strftime "%B %Y", localtime; (my $program = $ARGV[0]) =~ s!.*/!!; @@ -258,9 +259,9 @@ if ($opt_output) # ({GNU,Free} ) # - {GNU,Free} # -# and separated from any copyright/author details by a blank line. +# and seperated from any copyright/author details by a blank line. -($_, $version_text) = ((split /\n+/, $version_text, 2), ''); +($_, $version_text) = split /\n+/, $version_text, 2; if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or /^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/) @@ -371,18 +372,14 @@ s/^\./\x80/mg; s/^'/\x81/mg; s/\\/\x82/g; -my $PAT_BUGS = _('Report +(?:[\w-]* +)?bugs|Email +bug +reports +to'); +my $PAT_BUGS = _('Report +bugs|Email +bug +reports +to'); my $PAT_AUTHOR = _('Written +by'); my $PAT_OPTIONS = _('Options'); my $PAT_EXAMPLES = _('Examples'); my $PAT_FREE_SOFTWARE = _('This +is +free +software'); # Start a new paragraph (if required) for these. -s/([^\n])\n($PAT_BUGS|$PAT_AUTHOR) /$1\n\n$2 /og; - -# Convert iso-8859-1 copyright symbol or (c) to nroff -# character. -s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg; +s/([^\n])\n($PAT_BUGS|$PAT_AUTHOR)/$1\n\n$2/og; sub convert_option; @@ -401,13 +398,36 @@ while (length) } # Copyright section - if (/^Copyright /) + 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 |$PAT_FREE_SOFTWARE)/$1\n.br\n$2/og; + } + + $include{$sect} .= $copy; + $_ ||= ''; + next; } - # Bug reporting section. - elsif (/^($PAT_BUGS) /o) + # Catch bug report text. + if (/^($PAT_BUGS) /o) { $sect = _('REPORTING BUGS'); } @@ -498,7 +518,7 @@ while (length) while ($indent ? s/^ {$indent}(\S.*)\n// : s/^(\S.*)\n//) { $matched .= $& if %append; - $content .= "\x84$1\n"; + $content .= "\x84$1\n" } # Move to next paragraph. @@ -516,22 +536,6 @@ while (length) # Escape remaining hyphens s/-/\x83/g; - - if ($sect eq 'COPYRIGHT') - { - # Insert line breaks before additional copyright messages - # and the disclaimer. - s/\n(Copyright |$PAT_FREE_SOFTWARE)/\n.br\n$1/og; - } - elsif ($sect eq 'REPORTING BUGS') - { - # Handle multi-line bug reporting sections of the form: - # - # Report bugs to - # GNU home page: - # ... - s/\n([[:upper:]])/\n.br\n$1/g; - } } # Check if matched paragraph contains /pat/. @@ -574,7 +578,7 @@ EOT } # Output header. -print enc <$stderr`; - - unless ($value) - { - my $err = N_("%s: can't get `%s' info from %s"); - $err .= N_("\nTry `--no-discard-stderr' if option outputs to stderr") - if $discard_stderr; - - kark $err, $this_program, $opt, $prog; - } - - return $value; -} - # Convert option dashes to \- to stop nroff from hyphenating 'em, and # embolden. Option arguments get italicised. sub convert_option -- 2.7.4