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):
- 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.
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
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
'INSTALL-INFO' => ! option 'no-installinfo',
'INSTALL-MAN' => ! option 'no-installman',
+ 'HAVE-MANS' => !! var ('MANS'),
'CK-NEWS' => !! option 'check-news',
'SUBDIRS' => !! var ('SUBDIRS'),
-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)'; \
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%
#! /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.
else
test -z "$file" || exec >$file
echo ".ab help2man is required to generate this page"
- exit 1
+ exit $?
fi
;;
man.test \
man2.test \
man3.test \
+man4.test \
mclean.test \
mdate.test \
mdate2.test \
man.test \
man2.test \
man3.test \
+man4.test \
mclean.test \
mdate.test \
mdate2.test \
--- /dev/null
+#! /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
+: