]> git.ipfire.org Git - thirdparty/automake.git/commitdiff
Revamp semantics for `missing help2man' and manpage distribution.
authorRalf Wildenhues <Ralf.Wildenhues@gmx.de>
Sun, 21 Dec 2008 21:38:37 +0000 (22:38 +0100)
committerRalf Wildenhues <Ralf.Wildenhues@gmx.de>
Sun, 21 Dec 2008 21:38:37 +0000 (22:38 +0100)
Previously, `missing help2man' would create a missing man page
containing an error message, and exit 1.  This does not play
well with `make': the next run will see this particular man page
as being up to date, and will only error out on the next
generated man page, if any; repeat until all pages are done.
This patch changes `missing' to exit successfully in this case,
but `make dist' will ensure that no such man pages are packaged.

* lib/missing: Exit successfully even if we create a replacement
page due to missing help2man.
* automake.in (make_paragraphs): Define %HAVE-MANS% to be true
if this makefile deals with man pages.
* lib/am/distdir.am (distdir): If %INSTALL-MAN% and %HAVE-MANS%,
check that no man page in $(MANS) contains the replacement text
from `missing'.
* tests/man4.test: New test.
* tests/Makefile.am: Update.
* NEWS: Reorder a bit, update.
* THANKS: Update.
Report by Werner Lemberg and Karl Berry.

Signed-off-by: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
ChangeLog
NEWS
THANKS
automake.in
doc/Makefile.in
lib/am/distdir.am
lib/missing
tests/Makefile.am
tests/Makefile.in
tests/man4.test [new file with mode: 0755]

index b425a42b7f7cb57083f1a7ce1153898fcf537eb3..173afd2ba64d8701cf218594fc5d87e7e0195ff0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,26 @@
 2008-12-21  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
+       Revamp semantics for `missing help2man' and manpage distribution.
+       Previously, `missing help2man' would create a missing man page
+       containing an error message, and exit 1.  This does not play
+       well with `make': the next run will see this particular man page
+       as being up to date, and will only error out on the next
+       generated man page, if any; repeat until all pages are done.
+       This patch changes `missing' to exit successfully in this case,
+       but `make dist' will ensure that no such man pages are packaged.
+       * lib/missing: Exit successfully even if we create a replacement
+       page due to missing help2man.
+       * automake.in (make_paragraphs): Define %HAVE-MANS% to be true
+       if this makefile deals with man pages.
+       * lib/am/distdir.am (distdir): If %INSTALL-MAN% and %HAVE-MANS%,
+       check that no man page in $(MANS) contains the replacement text
+       from `missing'.
+       * tests/man4.test: New test.
+       * tests/Makefile.am: Update.
+       * NEWS: Reorder a bit, update.
+       * THANKS: Update.
+       Report by Werner Lemberg and Karl Berry.
+
        Do not use 'global' for makefile-wide settings.
        * doc/automake.texi (Linking, Libtool Flags)
        (Program and Library Variables, Flag Variables Ordering):
diff --git a/NEWS b/NEWS
index e566172cdaebe37dd63a58716d7f51943134de8d..6fcc1a535b0bbab7333230d780fde8f194836131 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -125,8 +125,6 @@ New in 1.10a:
   - AM_SUBST_NOTMAKE may prevent substitution of AC_SUBSTed variables,
     useful especially for multi-line values.
 
-  - The `missing' script works better with versioned tool names.
-
   - Automake's early configure-time sanity check now diagnoses an
     unsafe absolute source directory name and makes configure fail.
 
@@ -154,6 +152,24 @@ Bugs fixed in 1.10a:
     extra quoting used internally by Autoconf 2.62 and newer
     (it used to work only without the `--file=' bit).
 
+  - The `missing' script works better with versioned tool names.
+
+  - Semantics for `missing help2man' have been revamped:
+
+    Previously, if `help2man' was not present, `missing help2man' would have
+    the following semantics: if some man page was out of date but present, then
+    a warning would be printed, but the exit status was 0.  If the man page was
+    not present at all, then `missing' would create a replacement man page
+    containing an error message, and exit with a status of 2.  This does not play
+    well with `make': the next run will see this particular man page as being up
+    to date, and will only error out on the next generated man page, if any;
+    repeat until all pages are done.  This was not desirable.
+
+    These are the new semantics: if some man page is not present, and help2man
+    is not either, then `missing' will warn and generate the replacement page
+    containing the error message, but exit successfully.  However, `make dist'
+    will ensure that no such bogus man pages are packaged into a tarball.
+
 * Bugs introduced by 1.10:
 
   - Fix output of dummy dependency files in presence of post-processed
diff --git a/THANKS b/THANKS
index 700f13bbbdaf1c0c4b9b700ad5588e414810cf32..cb147d9a27ffeef454fdf4ca289ae523664e6886 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -328,6 +328,7 @@ Vincent Lefevre             vincent@vinc17.org
 Volker Boerchers       vboerchers@tecon.de
 Werner John            john@oswf.de
 Werner Koch            wk@isil.d.shuttle.de
+Werner Lemberg         wl@gnu.org
 William Pursell                bill.pursell@gmail.com
 William S Fulton       wsf@fultondesigns.co.uk
 Yann Droneaud          ydroneaud@meuh.eu.org
index 24bb1931d38469c97e4b49501acd637fbb696e66..5523d750912b7c8b97c8a961df558bfcd79c20f5 100755 (executable)
@@ -6641,6 +6641,7 @@ sub make_paragraphs ($%)
 
                 'INSTALL-INFO' =>  ! option 'no-installinfo',
                 'INSTALL-MAN'  =>  ! option 'no-installman',
+                'HAVE-MANS'    => !! var ('MANS'),
                 'CK-NEWS'      => !! option 'check-news',
 
                 'SUBDIRS'      => !! var ('SUBDIRS'),
index e692797b0b7d8c53725f4139414534fe68ab6ce4..ee9483dbcdbfdd89a7a2ab6289d21cb745002a67 100644 (file)
@@ -526,6 +526,19 @@ distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
+       @list='$(MANS)'; if test -n "$$list"; then \
+         list=`for p in $$list; do \
+           if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+           if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
+         if test -n "$$list" && \
+           grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
+           echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
+           grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
+           echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
+           echo "       typically \`make maintainer-clean' will remove them" >&2; \
+           exit 1; \
+         else :; fi; \
+       else :; fi
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 218e65aefd755c948b949ffa501ad882395af900..81d2210b86af49966a1eeec23cece2fb8cc4298a 100644 (file)
@@ -80,6 +80,32 @@ if  %?CK-NEWS%
 endif  %?CK-NEWS%
 endif %?TOPDIR_P%
 ##
+## `missing help2man' may have created some bogus man pages.  Ensure they
+## are not distributed.
+##
+if %?INSTALL-MAN%
+if %?HAVE-MANS%
+       @list='$(MANS)'; if test -n "$$list"; then \
+         list=`for p in $$list; do \
+           if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+## Note that we check existing man pages here only.  If there are man pages
+## which are not distributed, and may be generated only conditionally, then
+## we should not error out because of them.  This could be refined to take
+## into account only dist_*_MANS, but then we'd be missing out on those
+## the user distributes with EXTRA_DIST.
+           if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
+         if test -n "$$list" && \
+           grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
+           echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
+           grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
+           echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
+           echo "       typically \`make maintainer-clean' will remove them" >&2; \
+           exit 1; \
+         else :; fi; \
+       else :; fi
+endif %?HAVE-MANS%
+endif %?INSTALL-MAN%
+##
 ## Only for the top dir.
 ##
 if %?TOPDIR_P%
index 32e23d23682292dd5ca628e470e5fa05aacaeccb..f359dae7a878d649d09dd7063e3b7220b5cc02d5 100755 (executable)
@@ -1,7 +1,7 @@
 #! /bin/sh
 # Common stub for a few missing GNU programs while installing.
 
-scriptversion=2008-12-13.14
+scriptversion=2008-12-21.33
 
 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
 # 2008  Free Software Foundation, Inc.
@@ -285,7 +285,7 @@ WARNING: \`$1' is $msg.  You should only need it if
     else
        test -z "$file" || exec >$file
        echo ".ab help2man is required to generate this page"
-       exit 1
+       exit $?
     fi
     ;;
 
index c2ace7843e5d68f1c21cd3305ae53f42c1e49e53..1ed0fd3049f41d0d7e3e4b4bd765a4aed291de2f 100644 (file)
@@ -396,6 +396,7 @@ makevars.test \
 man.test \
 man2.test \
 man3.test \
+man4.test \
 mclean.test \
 mdate.test \
 mdate2.test \
index f71bb7cab84c9366d62d09b2fba97214c6debcda..c88496af9f1608f20ab696d3bc357b3d90b4e56c 100644 (file)
@@ -550,6 +550,7 @@ makevars.test \
 man.test \
 man2.test \
 man3.test \
+man4.test \
 mclean.test \
 mdate.test \
 mdate2.test \
diff --git a/tests/man4.test b/tests/man4.test
new file mode 100755 (executable)
index 0000000..558c880
--- /dev/null
@@ -0,0 +1,109 @@
+#! /bin/sh
+# Copyright (C) 2008  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)
+# 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, see <http://www.gnu.org/licenses/>.
+
+# Ensure `make dist' fails when help2man replacement man pages are created.
+#
+# The assumption here is the following: if the developer uses help2man to
+# generate man pages from --help output, then these man pages may not be
+# stored in VCS.  However, they should be distributed, so that the end user
+# that receives the tarball doesn't have to install help2man.  If they are
+# not distributed, then the developer should make help2man a prerequisite
+# to building the package from a tarball, e.g., with a configure check for
+# help2man that errors out if it is unavailable.  In both cases it is
+# sufficient to check only distributed man pages.
+#
+# Idea of this whole shenanigan is to allow somebody to check out sources from
+# a VCS and build and install them without needing help2man installed.  The
+# installed man pages will be bogus in this case.  Typically, this happens
+# when developers ask users to try out a fix from VCS; the developers themselves
+# will usually have help2man installed (or should install it).
+
+. ./defs || Exit 1
+
+set -e
+
+cat > Makefile.am << 'END'
+dist_man_MANS = $(srcdir)/foo.1 bar.1
+dist_bin_SCRIPTS = foo bar
+$(srcdir)/foo.1:
+       $(HELP2MAN) --output=$@ $(srcdir)/foo
+bar.1:
+       $(HELP2MAN) --output=$(srcdir)/bar.1 $(srcdir)/bar
+
+## It is a bug that we need to list $(srcdir)/bar.1 explicitly here.
+MAINTAINERCLEANFILES = $(dist_man_MANS) $(srcdir)/bar.1
+END
+
+cat >>configure.in <<'END'
+AM_MISSING_PROG([HELP2MAN], [help2man])
+AC_OUTPUT
+END
+
+cat > foo <<'END'
+#! /bin/sh
+while test $# -gt 0; do
+  case $1 in
+    -h | --help) echo "usage: $0 [OPTIONS]..."; exit 0;;
+    -v | --version) echo "$0 1.0"; exit 0;;
+  esac
+  shift
+done
+END
+
+cp foo bar
+
+cat > help2man <<'END'
+#! /bin/sh
+# fake help2man script that lets `missing' think it is not installed
+exit 127
+END
+
+chmod +x foo bar help2man
+save_PATH=$PATH
+PATH=`pwd`:$PATH
+
+$ACLOCAL
+$AUTOMAKE
+$AUTOCONF
+./configure
+$MAKE
+$MAKE dist && Exit 1
+$MAKE distcheck && Exit 1
+$MAKE distclean
+
+mkdir build
+cd build
+../configure
+$MAKE
+$MAKE dist 2>stderr && { cat stderr >&2; Exit 1; }
+cat stderr >&2
+grep 'install help2man' stderr
+$MAKE distcheck 2>stderr && { cat stderr >&2; Exit 1; }
+cat stderr >&2
+grep 'install help2man' stderr
+
+rm -f ../help2man
+PATH=$save_PATH
+export PATH
+
+# If help2man is installed, then ensure that the recommendation works.
+if (help2man --version) >/dev/null 2>&1; then
+  $MAKE maintainer-clean
+  ../configure
+  $MAKE
+  $MAKE distcheck
+fi
+: