]> git.saurik.com Git - bison.git/commitdiff
Use git-version-gen for version names between releases.
authorJoel E. Denny <jdenny@ces.clemson.edu>
Fri, 18 Jul 2008 15:26:15 +0000 (11:26 -0400)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Fri, 18 Jul 2008 16:55:39 +0000 (12:55 -0400)
* .cvsignore (.tarball-version, GNUmakefile, *~): Add.
* .gitignore (/.tarball-version, /GNUmakefile, /*~): Add.
* .prev-version: New.
* .version.in: Remove.
* ChangeLog: Remove the $Id$ previously used for capturing the CVS
revision.
* GNUmakefile: Remove, now copied from Gnulib.
* Makefile.am: Add code suggested by comments in
build-aux/git-version-gen.
(EXTRA_DIST): Remove GNUmakefile, handled by Gnulib.  Add maint.mk,
.prev-version, and .version.
* NEWS (2.3b+): Rename to...
(?.?): ... this because we're dropping the "+" version naming scheme,
but, in general, we still can't be sure of our next release name.
* bootstrap: Add a quick hack to remove from .gitignore the
GNUmakefile entry that gnulib adds.  We already have a /GNUmakefile
entry.  This should really be fixed in gnulib instead.
* bootstrap.conf (gnulib_modules): Add gnumakefile.
* configure.ac (AC_INIT): Set version name by invoking
build-aux/git-version-gen.
(AC_CONFIG_FILES): Remove .version, now generated by
build-aux/git-version-gen.
* maint.mk: New, copied from coreutils.
* doc/.cvsignore (bison.1): Add.
* doc/.gitignore (/bison.1): Add.
* doc/bison.1: Remove, generated.
* src/.cvsignore (revision.c): Remove.
* src/.gitignore (/revision.c): Remove.
* src/Makefile.am (bison_SOURCES): Remove revision.c and revision.h.
(BUILT_SOURCES): Remove revision.c.
(revision.c): Remove.
* src/getargs.c (version): Don't print revision after the VERSION.
* src/revision.h: Remove.

20 files changed:
.cvsignore
.gitignore
.prev-version [new file with mode: 0644]
.version.in [deleted file]
ChangeLog
GNUmakefile [deleted file]
Makefile.am
NEWS
bootstrap
bootstrap.conf
configure.ac
doc/.cvsignore
doc/.gitignore
doc/bison.1 [deleted file]
maint.mk [new file with mode: 0644]
src/.cvsignore
src/.gitignore
src/Makefile.am
src/getargs.c
src/revision.h [deleted file]

index d89800ef39e638c2b437522d0dc72280cbee97ce..704acea7382a851dc2339ec398cd6f3d78842c76 100644 (file)
@@ -1,9 +1,12 @@
 *.cache
 *.flc
 *.prj
 *.cache
 *.flc
 *.prj
+*~
+.tarball-version
 .version
 ABOUT-NLS
 COPYING
 .version
 ABOUT-NLS
 COPYING
+GNUmakefile
 INSTALL
 Makefile
 Makefile.in
 INSTALL
 Makefile
 Makefile.in
index 440a9300628b78afef8483f36da3c0ccf84641c5..be0a7b79b66a1c8f498646f64f1d4d20593cf4b6 100644 (file)
@@ -1,9 +1,12 @@
 /*.cache
 /*.flc
 /*.prj
 /*.cache
 /*.flc
 /*.prj
+/*~
+/.tarball-version
 /.version
 /ABOUT-NLS
 /COPYING
 /.version
 /ABOUT-NLS
 /COPYING
+/GNUmakefile
 /INSTALL
 /Makefile
 /Makefile.in
 /INSTALL
 /Makefile
 /Makefile.in
diff --git a/.prev-version b/.prev-version
new file mode 100644 (file)
index 0000000..0b6bb57
--- /dev/null
@@ -0,0 +1 @@
+2.3b
diff --git a/.version.in b/.version.in
deleted file mode 100644 (file)
index d78bda9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-@VERSION@
index 9d5692cc27e9d8e166c7f5e3cf5b410823f2df10..35a839c6f16191f1aa516dd99fd558f970b1a813 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,40 @@
+2008-07-18  Joel E. Denny  <jdenny@ces.clemson.edu>
+
+       Use git-version-gen for version names between releases.
+       * .cvsignore (.tarball-version, GNUmakefile, *~): Add.
+       * .gitignore (/.tarball-version, /GNUmakefile, /*~): Add.
+       * .prev-version: New.
+       * .version.in: Remove.
+       * ChangeLog: Remove the $Id$ previously used for capturing the CVS
+       revision.
+       * GNUmakefile: Remove, now copied from Gnulib.
+       * Makefile.am: Add code suggested by comments in
+       build-aux/git-version-gen.
+       (EXTRA_DIST): Remove GNUmakefile, handled by Gnulib.  Add maint.mk,
+       .prev-version, and .version.
+       * NEWS (2.3b+): Rename to...
+       (?.?): ... this because we're dropping the "+" version naming scheme,
+       but, in general, we still can't be sure of our next release name.
+       * bootstrap: Add a quick hack to remove from .gitignore the
+       GNUmakefile entry that gnulib adds.  We already have a /GNUmakefile
+       entry.  This should really be fixed in gnulib instead.
+       * bootstrap.conf (gnulib_modules): Add gnumakefile.
+       * configure.ac (AC_INIT): Set version name by invoking
+       build-aux/git-version-gen.
+       (AC_CONFIG_FILES): Remove .version, now generated by
+       build-aux/git-version-gen.
+       * maint.mk: New, copied from coreutils.
+       * doc/.cvsignore (bison.1): Add.
+       * doc/.gitignore (/bison.1): Add.
+       * doc/bison.1: Remove, generated.
+       * src/.cvsignore (revision.c): Remove.
+       * src/.gitignore (/revision.c): Remove.
+       * src/Makefile.am (bison_SOURCES): Remove revision.c and revision.h.
+       (BUILT_SOURCES): Remove revision.c.
+       (revision.c): Remove.
+       * src/getargs.c (version): Don't print revision after the VERSION.
+       * src/revision.h: Remove.
+
 2008-07-16  Joel E. Denny  <jdenny@ces.clemson.edu>
 
        Fix untranslatable composition of sentences.  Reported by Goran
 2008-07-16  Joel E. Denny  <jdenny@ces.clemson.edu>
 
        Fix untranslatable composition of sentences.  Reported by Goran
        Copying and distribution of this file, with or without
        modification, are permitted provided the copyright notice and this
        notice are preserved.
        Copying and distribution of this file, with or without
        modification, are permitted provided the copyright notice and this
        notice are preserved.
-
-$Id$
diff --git a/GNUmakefile b/GNUmakefile
deleted file mode 100644 (file)
index 25426d1..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-# Having a separate GNUmakefile lets me `include' the dynamically
-# generated rules created via Makefile.maint as well as Makefile.maint itself.
-# This makefile is used only if you run GNU Make.
-# It is necessary if you want to build targets usually of interest
-# only to the maintainer.
-
-# Copyright (C) 2001, 2003, 2006-2007, 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 of the License, 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/>.
-
-# Systems where /bin/sh is not the default shell need this.  The $(shell)
-# command below won't work with e.g. stock DOS/Windows shells.
-ifeq ($(wildcard /bin/s[h]),/bin/sh)
-SHELL = /bin/sh
-else
-# will be used only with the next shell-test line, then overwritten
-# by a configured-in value
-SHELL = sh
-endif
-
-have-Makefile := $(shell test -f Makefile && echo yes)
-
-# If the user runs GNU make but has not yet run ./configure,
-# give them a diagnostic.
-ifeq ($(have-Makefile),yes)
-
-# Make tar archive easier to reproduce.
-export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner
-
-include Makefile
-
-# Ensure that $(VERSION) is up to date for dist-related targets, but not
-# for others: rerunning autoconf and recompiling everything isn't cheap.
-ifeq (0,$(MAKELEVEL))
-  _is-dist-target = $(filter dist% alpha beta major,$(MAKECMDGOALS))
-  ifneq (,$(_is-dist-target))
-    _curr-ver := $(shell build-aux/git-version-gen .version)
-    ifneq ($(_curr-ver),$(VERSION))
-      $(info INFO: rerunning autoconf for new version string: $(_curr-ver))
-      dummy := $(shell rm -rf autom4te.cache; $(AUTOCONF))
-    endif
-  endif
-endif
-
-include $(srcdir)/Makefile.cfg
-include $(srcdir)/Makefile.maint
-
-else
-
-all:
-       @echo There seems to be no Makefile in this directory.   1>&2
-       @echo "You must run ./configure before running \`make'." 1>&2
-       @exit 1
-
-endif
-
-# Tell version 3.79 and up of GNU make to not build goals in this
-# directory in parallel.  This is necessary in case someone tries to
-# build multiple targets on one command line.
-.NOTPARALLEL:
index bd91aff40591c10f19437345b9074ed377a36750..b1e2669004ea8766ddec27d1d17df2a01ba5d6d2 100644 (file)
@@ -23,7 +23,7 @@ SUBDIRS = build-aux po runtime-po lib data src doc examples tests etc
 aclocaldir = @aclocaldir@
 aclocal_DATA = m4/bison-i18n.m4
 
 aclocaldir = @aclocaldir@
 aclocal_DATA = m4/bison-i18n.m4
 
-EXTRA_DIST = GNUmakefile Makefile.cfg Makefile.maint \
+EXTRA_DIST = .prev-version .version Makefile.cfg Makefile.maint maint.mk \
   OChangeLog PACKAGING \
   djgpp/Makefile.maint djgpp/README.in djgpp/config.bat \
   djgpp/config.sed djgpp/config.site djgpp/config_h.sed \
   OChangeLog PACKAGING \
   djgpp/Makefile.maint djgpp/README.in djgpp/config.bat \
   djgpp/config.sed djgpp/config.site djgpp/config_h.sed \
@@ -42,3 +42,10 @@ maintainer-push-check:
 .PHONY: maintainer-xml-check
 maintainer-xml-check:
        cd tests && $(MAKE) $(AM_MAKEFLAGS) $@
 .PHONY: maintainer-xml-check
 maintainer-xml-check:
        cd tests && $(MAKE) $(AM_MAKEFLAGS) $@
+
+# See comments in build-aux/git-version-gen.
+BUILT_SOURCES = $(top_srcdir)/.version
+$(top_srcdir)/.version:
+       echo $(VERSION) > $@-t && mv $@-t $@
+dist-hook:
+       echo $(VERSION) > $(distdir)/.tarball-version
diff --git a/NEWS b/NEWS
index d5beea0ffb831fec3340e39426d6c23e79bdb113..84236f849219cf4a0a64cc35c4aecfa5ba8290f7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,7 +1,7 @@
 Bison News
 ----------
 
 Bison News
 ----------
 
-Changes in version 2.3b+ (????-??-??):
+Changes in version ?.? (????-??-??):
 
 *
 
 
 *
 
index 85d06a234251af3ac93e8a869fd60c36fc23e9ca..67063b5bfd000bd09626d9cb672fbc771d0171b1 100755 (executable)
--- a/bootstrap
+++ b/bootstrap
@@ -600,6 +600,12 @@ if test -f $mam_template; then
   done
 fi
 
   done
 fi
 
+# FIXME: Gnulib should be patched to add "/" in front of .gitignore entries
+# instead.  Anyway, this hack must be done before invoking autoconf so that
+# build-aux/git-version-gen doesn't think the version is dirty because
+# .gitignore isn't committed.
+grep -v '^GNUmakefile$' .gitignore > .gitignore~ && mv .gitignore~ .gitignore
+
 # Reconfigure, getting other files.
 
 for command in \
 # Reconfigure, getting other files.
 
 for command in \
index 7cb7a12e8fb8cefe0bf722bb06c7b6f2cd1c076a..251e2eff4c54262a848fa6a4b2c3de57ea4b7c29 100644 (file)
@@ -18,8 +18,8 @@
 # gnulib modules used by this package.
 gnulib_modules='
        argmatch config-h c-strcase configmake
 # gnulib modules used by this package.
 gnulib_modules='
        argmatch config-h c-strcase configmake
-       dirname error extensions fopen-safer git-version-gen
-       getopt gettext hash inttypes javacomp-script javaexec-script malloc
+       dirname error extensions fopen-safer getopt gettext git-version-gen
+       gnumakefile hash inttypes javacomp-script javaexec-script malloc
        mbswidth obstack quote quotearg stdbool stpcpy strerror strtoul
        strverscmp unistd unistd-safer unlocked-io unsetenv verify xalloc
        xalloc-die xstrndup
        mbswidth obstack quote quotearg stdbool stpcpy strerror strtoul
        strverscmp unistd unistd-safer unlocked-io unsetenv verify xalloc
        xalloc-die xstrndup
index 95d91ddeedaa32429a58078bb48ec64d490dbf15..e1a6918cc74b43b1090e715f3bf2907675b55288 100644 (file)
@@ -19,7 +19,9 @@
 # We have strange test case titles, so we need Autoconf 2.61 or better.
 AC_PREREQ(2.61)
 
 # We have strange test case titles, so we need Autoconf 2.61 or better.
 AC_PREREQ(2.61)
 
-AC_INIT([GNU Bison], [2.3b+], [bug-bison@gnu.org])
+AC_INIT([GNU Bison],
+        m4_esyscmd([build-aux/git-version-gen .tarball-version]),
+        [bug-bison@gnu.org])
 AC_DEFINE([PACKAGE_COPYRIGHT_YEAR], [2008],
           [The copyright year for this package])
 AC_SUBST([PACKAGE_COPYRIGHT_YEAR], [2008])
 AC_DEFINE([PACKAGE_COPYRIGHT_YEAR], [2008],
           [The copyright year for this package])
 AC_SUBST([PACKAGE_COPYRIGHT_YEAR], [2008])
@@ -142,8 +144,7 @@ AC_SUBST([O0CXXFLAGS], [`echo $CXXFLAGS | sed 's/-O[[0-9]] *//'`])
 gt_JAVACOMP([1.3])
 gt_JAVAEXEC
 
 gt_JAVACOMP([1.3])
 gt_JAVAEXEC
 
-AC_CONFIG_FILES([.version
-                Makefile
+AC_CONFIG_FILES([Makefile
                 build-aux/Makefile
                 po/Makefile.in
                 data/Makefile
                 build-aux/Makefile
                 po/Makefile.in
                 data/Makefile
index 8365feabbfe3efb6c830d6230dd55d0e9cf626ec..0376b3e7f34f072afecc76d6aa89406c67bcaa5c 100644 (file)
@@ -1,4 +1,5 @@
 Makefile
 Makefile
+bison.1
 bison.aux
 bison.cp
 bison.cps
 bison.aux
 bison.cp
 bison.cps
index 294a00d0e75ba0caee2933a6f142a2fc4f93b17a..1d55073d17ca7a8cdbaa6e343d2019985c9950d1 100644 (file)
@@ -1,4 +1,5 @@
 /Makefile
 /Makefile
+/bison.1
 /bison.aux
 /bison.cp
 /bison.cps
 /bison.aux
 /bison.cp
 /bison.cps
diff --git a/doc/bison.1 b/doc/bison.1
deleted file mode 100644 (file)
index 2d13b4c..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.36.
-.TH BISON "1" "July 2008" "bison 2.3b+" "User Commands"
-.SH NAME
-bison \- GNU Project parser generator (yacc replacement)
-.SH SYNOPSIS
-.B bison
-[\fIOPTION\fR]... \fIFILE\fR
-.SH DESCRIPTION
-.I Bison
-is a parser generator in the style of
-.IR yacc (1).
-It should be upwardly compatible with input files designed
-for
-.IR yacc .
-.PP
-Input files should follow the
-.I yacc
-convention of ending in
-.BR .y .
-Unlike
-.IR yacc ,
-the generated files do not have fixed names, but instead use the prefix
-of the input file.
-Moreover, if you need to put
-.I C++
-code in the input file, you can end his name by a C++-like extension
-(.ypp or .y++), then bison will follow your extension to name the
-output file (.cpp or .c++).
-For instance, a grammar description file named
-.B parse.yxx
-would produce the generated parser in a file named
-.BR parse.tab.cxx ,
-instead of
-.IR yacc 's
-.B y.tab.c
-or old
-.I Bison
-version's
-.BR parse.tab.c .
-.PP
-This description of the options that can be given to
-.I bison
-is adapted from the node
-.B Invocation
-in the
-.B bison.texinfo
-manual, which should be taken as authoritative.
-.PP
-.I Bison
-supports both traditional single-letter options and mnemonic long
-option names.  Long option names are indicated with
-.B \-\-
-instead of
-.BR \- .
-Abbreviations for option names are allowed as long as they
-are unique.  When a long option takes an argument, like
-.BR \-\-file-prefix ,
-connect the option name and the argument with
-.BR = .
-.PP
-Generate LALR(1) and GLR parsers.
-.PP
-Mandatory arguments to long options are mandatory for short options too.
-The same is true for optional arguments.
-.SS "Operation modes:"
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-display this help and exit
-.TP
-\fB\-V\fR, \fB\-\-version\fR
-output version information and exit
-.TP
-\fB\-\-print\-localedir\fR
-output directory containing locale\-dependent data
-.TP
-\fB\-\-print\-datadir\fR
-output directory containing skeletons and XSLT
-.TP
-\fB\-y\fR, \fB\-\-yacc\fR
-emulate POSIX Yacc
-.TP
-\fB\-W\fR, \fB\-\-warnings\fR=\fI[CATEGORY]\fR
-report the warnings falling in CATEGORY
-.SS "Parser:"
-.TP
-\fB\-L\fR, \fB\-\-language\fR=\fILANGUAGE\fR
-specify the output programming language
-.TP
-\fB\-S\fR, \fB\-\-skeleton\fR=\fIFILE\fR
-specify the skeleton to use
-.TP
-\fB\-t\fR, \fB\-\-debug\fR
-instrument the parser for debugging
-.TP
-\fB\-\-locations\fR
-enable locations computation
-.TP
-\fB\-p\fR, \fB\-\-name\-prefix\fR=\fIPREFIX\fR
-prepend PREFIX to the external symbols
-.TP
-\fB\-l\fR, \fB\-\-no\-lines\fR
-don't generate `#line' directives
-.TP
-\fB\-k\fR, \fB\-\-token\-table\fR
-include a table of token names
-.SS "Output:"
-.TP
-\fB\-\-defines\fR[=\fIFILE\fR]
-also produce a header file
-.TP
-\fB\-d\fR
-likewise but cannot specify FILE (for POSIX Yacc)
-.TP
-\fB\-r\fR, \fB\-\-report\fR=\fITHINGS\fR
-also produce details on the automaton
-.TP
-\fB\-\-report\-file\fR=\fIFILE\fR
-write report to FILE
-.TP
-\fB\-v\fR, \fB\-\-verbose\fR
-same as `\-\-report=state'
-.TP
-\fB\-b\fR, \fB\-\-file\-prefix\fR=\fIPREFIX\fR
-specify a PREFIX for output files
-.TP
-\fB\-o\fR, \fB\-\-output\fR=\fIFILE\fR
-leave output to FILE
-.TP
-\fB\-g\fR, \fB\-\-graph\fR[=\fIFILE\fR]
-also output a graph of the automaton
-.TP
-\fB\-x\fR, \fB\-\-xml\fR[=\fIFILE\fR]
-also output an XML report of the automaton
-(the XML schema is experimental)
-.SS "Warning categories include:"
-.TP
-`midrule\-values'
-unset or unused midrule values
-.TP
-`yacc'
-incompatibilities with POSIX YACC
-.TP
-`all'
-all the warnings
-.TP
-`no\-CATEGORY'
-turn off warnings in CATEGORY
-.TP
-`none'
-turn off all the warnings
-.TP
-`error'
-treat warnings as errors
-.SS "THINGS is a list of comma separated words that can include:"
-.TP
-`state'
-describe the states
-.TP
-`itemset'
-complete the core item sets with their closure
-.TP
-`lookahead'
-explicitly associate lookahead tokens to items
-.TP
-`solved'
-describe shift/reduce conflicts solving
-.TP
-`all'
-include all the above information
-.TP
-`none'
-disable the report
-.SH AUTHOR
-Written by Robert Corbett and Richard Stallman.
-.SH "REPORTING BUGS"
-Report bugs to <bug\-bison@gnu.org>.
-.PP
-Id
-.SH COPYRIGHT
-Copyright \(co 2008 Free Software Foundation, Inc.
-.br
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-.SH "SEE ALSO"
-.BR lex (1),
-.BR flex (1),
-.BR yacc (1).
-.PP
-The full documentation for
-.B bison
-is maintained as a Texinfo manual.  If the
-.B info
-and
-.B bison
-programs are properly installed at your site, the command
-.IP
-.B info bison
-.PP
-should give you access to the complete manual.
diff --git a/maint.mk b/maint.mk
new file mode 100644 (file)
index 0000000..19b7f12
--- /dev/null
+++ b/maint.mk
@@ -0,0 +1,858 @@
+# -*-Makefile-*-
+# This Makefile fragment tries to be general-purpose enough to be
+# used by at least coreutils, idutils, CPPI, Bison, and Autoconf.
+
+## Copyright (C) 2001-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 of the License, 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/>.
+
+# This is reported not to work with make-3.79.1
+# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
+ME := maint.mk
+
+# Do not save the original name or timestamp in the .tar.gz file.
+# Use --rsyncable if available.
+gzip_rsyncable := \
+  $(shell gzip --help 2>/dev/null|grep rsyncable >/dev/null && echo --rsyncable)
+GZIP_ENV = '--no-name --best $(gzip_rsyncable)'
+
+GIT = git
+VC = $(GIT)
+VC-tag = git tag -s -m '$(VERSION)'
+
+VC_LIST = build-aux/vc-list-files
+
+VC_LIST_EXCEPT = \
+  $(VC_LIST) | if test -f .x-$@; then grep -vEf .x-$@; else grep -v ChangeLog; fi
+
+ifeq ($(origin prev_version_file), undefined)
+  prev_version_file = $(srcdir)/.prev-version
+endif
+
+PREV_VERSION := $(shell cat $(prev_version_file))
+VERSION_REGEXP = $(subst .,\.,$(VERSION))
+PREV_VERSION_REGEXP = $(subst .,\.,$(PREV_VERSION))
+
+ifeq ($(VC),$(GIT))
+this-vc-tag = v$(VERSION)
+this-vc-tag-regexp = v$(VERSION_REGEXP)
+else
+tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]')
+tag-this-version = $(subst .,_,$(VERSION))
+this-vc-tag = $(tag-package)-$(tag-this-version)
+this-vc-tag-regexp = $(this-vc-tag)
+endif
+my_distdir = $(PACKAGE)-$(VERSION)
+
+# Old releases are stored here.
+release_archive_dir ?= ../release
+
+# Prevent programs like 'sort' from considering distinct strings to be equal.
+# Doing it here saves us from having to set LC_ALL elsewhere in this file.
+export LC_ALL = C
+
+
+
+## --------------- ##
+## Sanity checks.  ##
+## --------------- ##
+
+# Collect the names of rules starting with `sc_'.
+syntax-check-rules := $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' \
+                        $(srcdir)/$(ME))
+.PHONY: $(syntax-check-rules)
+
+local-checks-available = \
+  po-check copyright-check m4-check author_mark_check \
+  patch-check strftime-check $(syntax-check-rules) \
+  makefile_path_separator_check \
+  makefile-check check-AUTHORS
+.PHONY: $(local-checks-available)
+
+local-check := $(filter-out $(local-checks-to-skip), $(local-checks-available))
+
+syntax-check: $(local-check)
+#      @grep -nE '#  *include <(limits|std(def|arg|bool))\.h>'         \
+#          $$(find -type f -name '*.[chly]') &&                        \
+#        { echo '$(ME): found conditional include' 1>&2;               \
+#          exit 1; } || :
+
+#      grep -nE '^#  *include <(string|stdlib)\.h>'                    \
+#          $(srcdir)/{lib,src}/*.[chy] &&                              \
+#        { echo '$(ME): FIXME' 1>&2;                                   \
+#          exit 1; } || :
+# FIXME: don't allow `#include .strings\.h' anywhere
+
+sc_avoid_if_before_free:
+       @$(srcdir)/build-aux/useless-if-before-free                     \
+               $(useless_free_options)                                 \
+           $$($(VC_LIST_EXCEPT)) &&                                    \
+         { echo '$(ME): found useless "if" before "free" above' 1>&2;  \
+           exit 1; } || :
+
+sc_cast_of_argument_to_free:
+       @grep -nE '\<free *\( *\(' $$($(VC_LIST_EXCEPT)) &&             \
+         { echo '$(ME): don'\''t cast free argument' 1>&2;             \
+           exit 1; } || :
+
+sc_cast_of_x_alloc_return_value:
+       @grep -nE '\*\) *x(m|c|re)alloc\>' $$($(VC_LIST_EXCEPT)) &&     \
+         { echo '$(ME): don'\''t cast x*alloc return value' 1>&2;      \
+           exit 1; } || :
+
+sc_cast_of_alloca_return_value:
+       @grep -nE '\*\) *alloca\>' $$($(VC_LIST_EXCEPT)) &&             \
+         { echo '$(ME): don'\''t cast alloca return value' 1>&2;       \
+           exit 1; } || :
+
+sc_space_tab:
+       @grep -n '[ ]   ' $$($(VC_LIST_EXCEPT)) &&                      \
+         { echo '$(ME): found SPACE-TAB sequence; remove the SPACE'    \
+               1>&2; exit 1; } || :
+
+# Don't use *scanf or the old ato* functions in `real' code.
+# They provide no error checking mechanism.
+# Instead, use strto* functions.
+sc_prohibit_atoi_atof:
+       @grep -nE '\<([fs]?scanf|ato([filq]|ll))\>' $$($(VC_LIST_EXCEPT)) && \
+         { echo '$(ME): do not use *scan''f, ato''f, ato''i, ato''l, ato''ll, ato''q, or ss''canf'     \
+               1>&2; exit 1; } || :
+
+# Use STREQ rather than comparing strcmp == 0, or != 0.
+sc_prohibit_strcmp:
+       @grep -nE '! *str''cmp *\(|\<str''cmp *\([^)]+\) *=='           \
+           $$($(VC_LIST_EXCEPT)) &&                                    \
+         { echo '$(ME): use STREQ in place of the above uses of str''cmp' \
+               1>&2; exit 1; } || :
+
+# Using EXIT_SUCCESS as the first argument to error is misleading,
+# since when that parameter is 0, error does not exit.  Use `0' instead.
+sc_error_exit_success:
+       @grep -nF 'error (EXIT_SUCCESS,'                                \
+           $$(find -type f -name '*.[chly]') &&                        \
+         { echo '$(ME): found error (EXIT_SUCCESS' 1>&2;               \
+           exit 1; } || :
+
+# `FATAL:' should be fully upper-cased in error messages
+# `WARNING:' should be fully upper-cased, or fully lower-cased
+sc_error_message_warn_fatal:
+       @grep -nEA2 '[^rp]error \(' $$($(VC_LIST_EXCEPT))               \
+           | grep -E '"Warning|"Fatal|"fatal' &&                       \
+         { echo '$(ME): use FATAL, WARNING or warning' 1>&2;           \
+           exit 1; } || :
+
+# Error messages should not start with a capital letter
+sc_error_message_uppercase:
+       @grep -nEA2 '[^rp]error \(' $$($(VC_LIST_EXCEPT))               \
+           | grep -E '"[A-Z]'                                          \
+           | grep -vE '"FATAL|"WARNING|"Java|"C#|PRIuMAX' &&           \
+         { echo '$(ME): found capitalized error message' 1>&2;         \
+           exit 1; } || :
+
+# Error messages should not end with a period
+sc_error_message_period:
+       @grep -nEA2 '[^rp]error \(' $$($(VC_LIST_EXCEPT))               \
+           | grep -E '[^."]\."' &&                                     \
+         { echo '$(ME): found error message ending in period' 1>&2;    \
+           exit 1; } || :
+
+sc_file_system:
+       @grep -ni 'file''system' $$($(VC_LIST_EXCEPT)) &&               \
+         { echo '$(ME): found use of "file''system";'                  \
+           'rewrite to use "file system"' 1>&2;                        \
+           exit 1; } || :
+
+# Don't use cpp tests of this symbol.  All code assumes config.h is included.
+sc_no_have_config_h:
+       @grep -n '^# *if.*HAVE''_CONFIG_H' $$($(VC_LIST_EXCEPT)) &&     \
+         { echo '$(ME): found use of HAVE''_CONFIG_H; remove'          \
+               1>&2; exit 1; } || :
+
+# Nearly all .c files must include <config.h>.
+sc_require_config_h:
+       @if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then          \
+         grep -L '^# *include <config\.h>'                             \
+               $$($(VC_LIST_EXCEPT) | grep '\.c$$')                    \
+             | grep . &&                                               \
+         { echo '$(ME): the above files do not include <config.h>'     \
+               1>&2; exit 1; } || :;                                   \
+       else :;                                                         \
+       fi
+
+# To use this "command" macro, you must first define two shell variables:
+# h: the header, enclosed in <> or ""
+# re: a regular expression that matches IFF something provided by $h is used.
+define _header_without_use
+  h_esc=`echo "$$h"|sed 's/\./\\./'`;                                  \
+  if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then                        \
+    files=$$(grep -l '^# *include '"$$h_esc"                           \
+            $$($(VC_LIST_EXCEPT) | grep '\.c$$')) &&                   \
+    grep -LE "$$re" $$files | grep . &&                                        \
+      { echo "$(ME): the above files include $$h but don't use it"     \
+       1>&2; exit 1; } || :;                                           \
+  else :;                                                              \
+  fi
+endef
+
+# Prohibit the inclusion of assert.h without an actual use of assert.
+sc_prohibit_assert_without_use:
+       @h='<assert.h>' re='\<assert *\(' $(_header_without_use)
+
+# Prohibit the inclusion of getopt.h without an actual use.
+sc_prohibit_getopt_without_use:
+       @h='<getopt.h>' re='\<getopt(_long)? *\(' $(_header_without_use)
+
+# Don't include quotearg.h unless you use one of its functions.
+sc_prohibit_quotearg_without_use:
+       @h='"quotearg.h"' re='\<quotearg(_[^ ]+)? *\(' $(_header_without_use)
+
+# Don't include quote.h unless you use one of its functions.
+sc_prohibit_quote_without_use:
+       @h='"quote.h"' re='\<quote(_n)? *\(' $(_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_long_options_without_use:
+       @h='"long-options.h"' re='\<parse_long_options *\(' \
+         $(_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_inttostr_without_use:
+       @h='"inttostr.h"' re='\<(off|[iu]max|uint)tostr *\(' \
+         $(_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_error_without_use:
+       @h='"error.h"' \
+       re='\<error(_at_line|_print_progname|_one_per_line|_message_count)? *\('\
+         $(_header_without_use)
+
+sc_prohibit_safe_read_without_use:
+       @h='"safe-read.h"' re='(\<SAFE_READ_ERROR\>|\<safe_read *\()' \
+         $(_header_without_use)
+
+sc_prohibit_argmatch_without_use:
+       @h='"argmatch.h"' \
+       re='(\<(ARRAY_CARDINALITY|X?ARGMATCH(|_TO_ARGUMENT|_VERIFY))\>|\<argmatch(_exit_fn|_(in)?valid) *\()' \
+         $(_header_without_use)
+
+sc_prohibit_root_dev_ino_without_use:
+       @h='"root-dev-ino.h"' \
+       re='(\<ROOT_DEV_INO_(CHECK|WARN)\>|\<get_root_dev_ino *\()' \
+         $(_header_without_use)
+
+sc_obsolete_symbols:
+       @grep -nE '\<(HAVE''_FCNTL_H|O''_NDELAY)\>'                     \
+            $$($(VC_LIST_EXCEPT)) &&                                   \
+         { echo '$(ME): do not use HAVE''_FCNTL_H or O''_NDELAY'       \
+               1>&2; exit 1; } || :
+
+# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ
+
+# Each nonempty line must start with a year number, or a TAB.
+sc_changelog:
+       @grep -n '^[^12 ]' $$(find . -maxdepth 2 -name ChangeLog) &&    \
+         { echo '$(ME): found unexpected prefix in a ChangeLog' 1>&2;  \
+           exit 1; } || :
+
+# Ensure that dd's definition of LONGEST_SYMBOL stays in sync
+# with the strings from the two affected variables.
+dd_c = $(srcdir)/src/dd.c
+sc_dd_max_sym_length:
+ifneq ($(wildcard $(dd_c)),)
+       @len=$$( (sed -n '/conversions\[\] =$$/,/^};/p' $(dd_c);\
+                sed -n '/flags\[\] =$$/,/^};/p' $(dd_c) )      \
+               |sed -n '/"/s/^[^"]*"\([^"]*\)".*/\1/p'         \
+             | wc --max-line-length);                          \
+       max=$$(sed -n '/^#define LONGEST_SYMBOL /s///p' $(dd_c) \
+             |tr -d '"' | wc --max-line-length);               \
+       if test "$$len" = "$$max"; then :; else                 \
+         echo 'dd.c: LONGEST_SYMBOL is not longest' 1>&2;      \
+         exit 1;                                               \
+       fi
+endif
+
+# Many m4 macros names once began with `jm_'.
+# On 2004-04-13, they were all changed to start with gl_ instead.
+# Make sure that none are inadvertently reintroduced.
+sc_prohibit_jm_in_m4:
+       @grep -nE 'jm_[A-Z]'                                            \
+               $$($(VC_LIST) m4 |grep '\.m4$$'; echo /dev/null) &&     \
+           { echo '$(ME): do not use jm_ in m4 macro names'            \
+             1>&2; exit 1; } || :
+
+# Ensure that each root-requiring test is run via the "check-root" rule.
+sc_root_tests:
+       @if test -d tests \
+             && grep check-root tests/Makefile.am>/dev/null 2>&1; then \
+       t1=sc-root.expected; t2=sc-root.actual;                         \
+       grep -nl '^require_root_$$'                                     \
+         $$($(VC_LIST) tests) |sed s,tests/,, |sort > $$t1;            \
+       sed -n '/^root_tests =[  ]*\\$$/,/[^\]$$/p'                     \
+         $(srcdir)/tests/Makefile.am                                   \
+           | sed 's/^  *//;/^root_tests =/d'                           \
+           | tr -s '\012\\' '  ' | fmt -1 | sort > $$t2;               \
+       diff -u $$t1 $$t2 || diff=1;                                    \
+       rm -f $$t1 $$t2;                                                \
+       test "$$diff"                                                   \
+         && { echo 'tests/Makefile.am: missing check-root action'>&2;  \
+              exit 1; } || :;                                          \
+       fi
+
+headers_with_interesting_macro_defs = \
+  exit.h       \
+  fcntl_.h     \
+  fnmatch_.h   \
+  intprops.h   \
+  inttypes_.h  \
+  lchown.h     \
+  openat.h     \
+  stat-macros.h        \
+  stdint_.h
+
+# Create a list of regular expressions matching the names
+# of macros that are guaranteed by parts of gnulib to be defined.
+.re-defmac:
+       @(cd $(srcdir)/lib;                                             \
+         for f in $(headers_with_interesting_macro_defs); do           \
+           test -f $$f &&                                              \
+             sed -n '/^# *define \([^_ (][^ (]*\)[ (].*/s//\1/p' $$f;  \
+          done;                                                        \
+        ) | sort -u                                                    \
+          | grep -Ev 'ATTRIBUTE_NORETURN|SIZE_MAX'                     \
+          | sed 's/^/^# *define /'                                     \
+         > $@-t
+       @mv $@-t $@
+
+# Don't define macros that we already get from gnulib header files.
+sc_always_defined_macros: .re-defmac
+       @if test -f $(srcdir)/src/system.h; then                        \
+         trap 'rc=$$?; rm -f .re-defmac; exit $$rc' 0 1 2 3 15;        \
+         grep -f .re-defmac $$($(VC_LIST))                             \
+           && { echo '$(ME): define the above via some gnulib .h file' \
+                 1>&2;  exit 1; } || :;                                \
+       fi
+
+# Create a list of regular expressions matching the names
+# of files included from system.h.  Exclude a couple.
+.re-list:
+       @sed -n '/^# *include /s///p' $(srcdir)/src/system.h \
+         | grep -Ev 'sys/(param|file)\.h' \
+         | sed 's/ .*//;;s/^["<]/^# *include [<"]/;s/\.h[">]$$/\\.h[">]/' \
+         > $@-t
+       @mv $@-t $@
+
+# Files in src/ should not include directly any of
+# the headers already included via system.h.
+sc_system_h_headers: .re-list
+       @if test -f $(srcdir)/src/system.h; then                        \
+         trap 'rc=$$?; rm -f .re-list; exit $$rc' 0 1 2 3 15;          \
+         grep -nE -f .re-list                                          \
+             $$($(VC_LIST) src |                                       \
+                grep -Ev '((copy|system)\.h|parse-gram\.c)$$')         \
+           && { echo '$(ME): the above are already included via system.h'\
+                 1>&2;  exit 1; } || :;                                \
+       fi
+
+# Ensure that each .c file containing a "main" function also
+# calls set_program_name.
+sc_program_name:
+       @if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then          \
+         files=$$(grep -l '^main *(' $$($(VC_LIST_EXCEPT) | grep '\.c$$')); \
+         grep -LE 'set_program_name *\(m?argv\[0\]\);' $$files         \
+             | grep . &&                                               \
+         { echo '$(ME): the above files do not call set_program_name'  \
+               1>&2; exit 1; } || :;                                   \
+       else :;                                                         \
+       fi
+
+# Require that the final line of each test-lib.sh-using test be this one:
+# (exit $fail); exit $fail
+# Note: this test requires GNU grep's --label= option.
+sc_require_test_exit_idiom:
+       @if test -f $(srcdir)/tests/test-lib.sh; then                   \
+         die=0;                                                        \
+         for i in $$(grep -l -F /../test-lib.sh $$($(VC_LIST) tests)); do \
+           tail -n1 $$i | grep '^(exit \$$fail); exit \$$fail$$' > /dev/null \
+             && : || { die=1; echo $$i; }                              \
+         done;                                                         \
+         test $$die = 1 &&                                             \
+           { echo 1>&2 '$(ME): the final line in each of the above is not:'; \
+             echo 1>&2 '(exit $$fail); exit $$fail';                   \
+             exit 1; } || :;                                           \
+       fi
+
+sc_sun_os_names:
+       @grep -nEi \
+           'solaris[^[:alnum:]]*2\.(7|8|9|[1-9][0-9])|sunos[^[:alnum:]][6-9]' \
+           $$($(VC_LIST_EXCEPT)) &&                                    \
+         { echo '$(ME): found misuse of Sun OS version numbers' 1>&2;  \
+           exit 1; } || :
+
+sc_the_the:
+       @grep -ni '\<the ''the\>' $$($(VC_LIST_EXCEPT)) &&              \
+         { echo '$(ME): found use of "the ''the";' 1>&2;               \
+           exit 1; } || :
+
+sc_tight_scope:
+       $(MAKE) -C src $@
+
+sc_trailing_blank:
+       @grep -n '[      ]$$' $$($(VC_LIST_EXCEPT)) &&                  \
+         { echo '$(ME): found trailing blank(s)'                       \
+               1>&2; exit 1; } || :
+
+# Match lines like the following, but where there is only one space
+# between the options and the description:
+#   -D, --all-repeated[=delimit-method]  print all duplicate lines\n
+longopt_re = --[a-z][0-9A-Za-z-]*(\[?=[0-9A-Za-z-]*\]?)?
+sc_two_space_separator_in_usage:
+       @grep -nE '^   *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$'         \
+           $$($(VC_LIST_EXCEPT)) &&                                    \
+         { echo "$(ME): help2man requires at least two spaces between"; \
+           echo "$(ME): an option and its description"; \
+               1>&2; exit 1; } || :
+
+# Look for diagnostics that aren't marked for translation.
+# This won't find any for which error's format string is on a separate line.
+sc_unmarked_diagnostics:
+       @grep -nE                                                       \
+           '\<error \([^"]*"[^"]*[a-z]{3}' $$($(VC_LIST_EXCEPT))       \
+         | grep -v '_''(' &&                                           \
+         { echo '$(ME): found unmarked diagnostic(s)' 1>&2;            \
+           exit 1; } || :
+
+# Avoid useless parentheses like those in this example:
+# #if defined (SYMBOL) || defined (SYM2)
+sc_useless_cpp_parens:
+       @grep -n '^# *if .*defined *(' $$($(VC_LIST_EXCEPT)) &&         \
+         { echo '$(ME): found useless parentheses in cpp directive'    \
+               1>&2; exit 1; } || :
+
+# Require the latest GPL.
+sc_GPL_version:
+       @grep -n 'either ''version [^3]' $$($(VC_LIST_EXCEPT)) &&       \
+         { echo '$(ME): GPL vN, N!=3' 1>&2; exit 1; } || :
+
+# Perl-based tests used to exec perl from a #!/bin/sh script.
+# Now they all start with #!/usr/bin/perl and the portability
+# infrastructure is in tests/Makefile.am.  Make sure no old-style
+# script sneaks back in.
+sc_no_exec_perl_coreutils:
+       @if test -f $(srcdir)/tests/Coreutils.pm; then                  \
+         grep '^exec  *\$$PERL.*MCoreutils' $$($(VC_LIST) tests) &&    \
+           { echo 1>&2 '$(ME): found anachronistic Perl-based tests';  \
+             exit 1; } || :;                                           \
+       fi
+
+NEWS_hash = \
+  $$(sed -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p' \
+     $(srcdir)/NEWS | md5sum -)
+
+# Ensure that we don't accidentally insert an entry into an old NEWS block.
+sc_immutable_NEWS:
+       @if test -f $(srcdir)/NEWS; then                                \
+         test "$(NEWS_hash)" = '$(old_NEWS_hash)' && : ||              \
+           { echo '$(ME): you have modified old NEWS' 1>&2; exit 1; }; \
+       fi
+
+# Each program that uses proper_name_utf8 must link with
+# one of the ICONV libraries.
+sc_proper_name_utf8_requires_ICONV:
+       @progs=$$(grep -l 'proper_name_utf8 ''("' $$($(VC_LIST_EXCEPT)));\
+       if test "x$$progs" != x; then                                   \
+         fail=0;                                                       \
+         for p in $$progs; do                                          \
+           dir=$$(dirname "$$p");                                      \
+           base=$$(basename "$$p" .c);                                 \
+           grep "$${base}_LDADD.*ICONV)" $$dir/Makefile.am > /dev/null \
+             || { fail=1; echo 1>&2 "$(ME): $$p uses proper_name_utf8"; }; \
+         done;                                                         \
+         test $$fail = 1 &&                                            \
+           { echo 1>&2 '$(ME): the above do not link with any ICONV library'; \
+             exit 1; } || :;                                           \
+       fi
+
+# Warn about "c0nst struct Foo const foo[]",
+# but not about "char const *const foo" or "#define const const".
+sc_redundant_const:
+       @grep -E '\bconst\b[[:space:][:alnum:]]{2,}\bconst\b'           \
+               $$($(VC_LIST_EXCEPT)) &&                                \
+           { echo 1>&2 '$(ME): redundant "const" in declarations';     \
+             exit 1; } || :
+
+sc_const_long_option:
+       @grep '^ *static.*struct option ' $$($(VC_LIST_EXCEPT))         \
+         | grep -Ev 'const struct option|struct option const' && {     \
+             echo 1>&2 '$(ME): add "const" to the above declarations'; \
+             exit 1; } || :
+
+# Update the hash stored above.  Do this after each release and
+# for any corrections to old entries.
+update-NEWS-hash: NEWS
+       perl -pi -e 's/^(old_NEWS_hash = ).*/$${1}'"$(NEWS_hash)/" \
+         $(srcdir)/cfg.mk
+
+epoch_date = 1970-01-01 00:00:00.000000000 +0000
+# Ensure that the c99-to-c89 patch applies cleanly.
+patch-check:
+       rm -rf src-c89 $@.1 $@.2
+       cp -a src src-c89
+       (cd src-c89; patch -p1 -V never --fuzz=0) < src/c99-to-c89.diff \
+         > $@.1 2>&1
+       if test "$(REGEN_PATCH)" = yes; then                    \
+         diff -upr src src-c89 | sed 's,src-c89/,src/,'        \
+           | grep -vE '^(Only in|File )'                       \
+           | perl -pe 's/^((?:\+\+\+|---) \S+\t).*/$${1}$(epoch_date)/;' \
+              -e 's/^ $$//'                                    \
+           > new-diff || : ; fi
+       grep -v '^patching file ' $@.1 > $@.2 || :
+       msg=ok; test -s $@.2 && msg='fuzzy patch' || : ;        \
+       rm -f src-c89/*.o || msg='rm failed';                   \
+       $(MAKE) -C src-c89 CFLAGS='-Wdeclaration-after-statement -Werror' \
+         || msg='compile failure with extra options';          \
+       test "$$msg" = ok && rm -rf src-c89 $@.1 $@.2 || echo "$$msg" 1>&2; \
+       test "$$msg" = ok
+
+# Ensure that date's --help output stays in sync with the info
+# documentation for GNU strftime.  The only exception is %N,
+# which date accepts but GNU strftime does not.
+extract_char = sed 's/^[^%][^%]*%\(.\).*/\1/'
+strftime-check:
+       if test -f $(srcdir)/src/date.c; then                           \
+         grep '^  %.  ' $(srcdir)/src/date.c | sort                    \
+           | $(extract_char) > $@-src;                                 \
+         { echo N;                                                     \
+           info libc date calendar format | grep '^    `%.'\'          \
+             | $(extract_char); } | sort > $@-info;                    \
+         diff -u $@-src $@-info || exit 1;                             \
+         rm -f $@-src $@-info;                                         \
+       fi
+
+check-AUTHORS:
+       $(MAKE) -C src $@
+
+# Ensure that we use only the standard $(VAR) notation,
+# not @...@ in Makefile.am, now that we can rely on automake
+# to emit a definition for each substituted variable.
+makefile-check:
+       @grep -nE '@[A-Z_0-9]+@' `find . -name Makefile.am` \
+         && { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || :
+
+news-date-check: NEWS
+       today=`date +%Y-%m-%d`;                                         \
+       if head NEWS | grep '^\*.* $(VERSION_REGEXP) ('$$today')'       \
+           >/dev/null; then                                            \
+         :;                                                            \
+       else                                                            \
+         echo "version or today's date is not in NEWS" 1>&2;           \
+         exit 1;                                                       \
+       fi
+
+changelog-check:
+       if head ChangeLog | grep 'Version $(VERSION_REGEXP)\.$$'        \
+           >/dev/null; then                                            \
+         :;                                                            \
+       else                                                            \
+         echo "$(VERSION) not in ChangeLog" 1>&2;                      \
+         exit 1;                                                       \
+       fi
+
+m4-check:
+       @grep -n 'AC_DEFUN([^[]' m4/*.m4 \
+         && { echo '$(ME): quote the first arg to AC_DEFUN' 1>&2; \
+              exit 1; } || :
+
+# Verify that all source files using _() are listed in po/POTFILES.in.
+po-check:
+       @if test -f po/POTFILES.in; then                                \
+         grep -E -v '^(#|$$)' po/POTFILES.in                           \
+           | grep -v '^src/false\.c$$' | sort > $@-1;                  \
+         files=;                                                       \
+         for file in $$($(VC_LIST_EXCEPT)) lib/*.[ch]; do              \
+           case $$file in                                              \
+             *.?|*.??) ;;                                              \
+             *) continue;;                                             \
+           esac;                                                       \
+           case $$file in                                              \
+           *.[ch])                                                     \
+             base=`expr " $$file" : ' \(.*\)\..'`;                     \
+             { test -f $$base.l || test -f $$base.y; } && continue;;   \
+           esac;                                                       \
+           files="$$files $$file";                                     \
+         done;                                                         \
+         grep -E -l '\b(N?_|gettext *)\([^)"]*("|$$)' $$files          \
+           | sort -u > $@-2;                                           \
+         diff -u $@-1 $@-2 || exit 1;                                  \
+         rm -f $@-1 $@-2;                                              \
+       fi
+
+# In a definition of #define AUTHORS "... and ..." where the RHS contains
+# the English word `and', the string must be marked with `N_ (...)' so that
+# gettext recognizes it as a string requiring translation.
+author_mark_check:
+       @grep -n '^# *define AUTHORS "[^"]* and ' src/*.c |grep -v ' N_ (' && \
+         { echo '$(ME): enclose the above strings in N_ (...)' 1>&2; \
+           exit 1; } || :
+
+# Sometimes it is useful to change the PATH environment variable
+# in Makefiles.  When doing so, it's better not to use the Unix-centric
+# path separator of `:', but rather the automake-provided `@PATH_SEPARATOR@'.
+# It'd be better to use `find -print0 ...|xargs -0 ...', but less portable,
+# and there probably aren't many projects with so many Makefile.am files
+# that we'd have to worry about limits on command line length.
+msg = '$(ME): Do not use `:'\'' above; use @PATH_SEPARATOR@ instead'
+makefile_path_separator_check:
+       @grep -n 'PATH=.*:' `find $(srcdir) -name Makefile.am` \
+         && { echo $(msg) 1>&2; exit 1; } || :
+
+# Check that `make alpha' will not fail at the end of the process.
+writable-files:
+       if test -d $(release_archive_dir); then :; else                 \
+         for file in $(distdir).tar.gz                                 \
+                     $(release_archive_dir)/$(distdir).tar.gz; do      \
+           test -e $$file || continue;                                 \
+           test -w $$file                                              \
+             || { echo ERROR: $$file is not writable; fail=1; };       \
+         done;                                                         \
+         test "$$fail" && exit 1 || : ;                                \
+       fi
+
+v_etc_file = lib/version-etc.c
+sample-test = tests/sample-test
+texi = doc/$(PACKAGE).texi
+# Make sure that the copyright date in $(v_etc_file) is up to date.
+# Do the same for the $(sample-test) and the main doc/.texi file.
+copyright-check:
+       @if test -f $(v_etc_file); then \
+         grep 'enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' $(v_etc_file) \
+           >/dev/null \
+         || { echo 'out of date copyright in $(v_etc_file); update it' 1>&2; \
+              exit 1; }; \
+       fi
+       @if test -f $(sample-test); then \
+         grep '# Copyright (C) '$$(date +%Y)' Free' $(sample-test) \
+           >/dev/null \
+         || { echo 'out of date copyright in $(sample-test); update it' 1>&2; \
+              exit 1; }; \
+       fi
+       @if test -f $(texi); then \
+         grep 'Copyright @copyright{} .*'$$(date +%Y)' Free' $(texi) \
+           >/dev/null \
+         || { echo 'out of date copyright in $(texi); update it' 1>&2; \
+              exit 1; }; \
+       fi
+
+vc-diff-check:
+       $(VC) diff > vc-diffs || :
+       if test -s vc-diffs; then                               \
+         cat vc-diffs;                                         \
+         echo "Some files are locally modified:" 1>&2;         \
+         exit 1;                                               \
+       else                                                    \
+         rm vc-diffs;                                          \
+       fi
+
+cvs-check: vc-diff-check
+
+maintainer-distcheck:
+       $(MAKE) distcheck
+       $(MAKE) my-distcheck
+
+
+# Don't make a distribution if checks fail.
+# Also, make sure the NEWS file is up-to-date.
+vc-dist: $(local-check) cvs-check maintainer-distcheck
+       $(MAKE) dist
+
+# Use this to make sure we don't run these programs when building
+# from a virgin tgz file, below.
+null_AM_MAKEFLAGS = \
+  ACLOCAL=false \
+  AUTOCONF=false \
+  AUTOMAKE=false \
+  AUTOHEADER=false \
+  MAKEINFO=false
+
+built_programs = $$(cd src && MAKEFLAGS= $(MAKE) -s built_programs.list)
+
+warn_cflags = -Dlint -O -Werror -Wall -Wformat -Wshadow -Wpointer-arith
+bin=bin-$$$$
+
+write_loser = printf '\#!%s\necho $$0: bad path 1>&2; exit 1\n' '$(SHELL)'
+
+TMPDIR ?= /tmp
+t=$(TMPDIR)/$(PACKAGE)/test
+pfx=$(t)/i
+
+# Verify that a twisted use of --program-transform-name=PROGRAM works.
+define install-transform-check
+  rm -rf $(pfx);                                       \
+  $(MAKE) program_transform_name='s/.*/zyx/'           \
+      prefix=$(pfx) install                            \
+    && test "$$(echo $(pfx)/bin/*)" = "$(pfx)/bin/zyx" \
+    && test "$$(echo $(pfx)/share/man/man1/*)" =       \
+                    "$(pfx)/share/man/man1/zyx.1"
+endef
+
+# Install, then verify that all binaries and man pages are in place.
+# Note that neither the binary, ginstall, nor the ].1 man page is installed.
+define my-instcheck
+  $(MAKE) prefix=$(pfx) install                                \
+    && test ! -f $(pfx)/bin/ginstall                   \
+    && { fail=0;                                       \
+      for i in $(built_programs); do                   \
+        test "$$i" = ginstall && i=install;            \
+        for j in "$(pfx)/bin/$$i"                      \
+                 "$(pfx)/share/man/man1/$$i.1"; do     \
+          case $$j in *'[.1') continue;; esac;         \
+          test -f "$$j" && :                           \
+            || { echo "$$j not installed"; fail=1; };  \
+        done;                                          \
+      done;                                            \
+      test $$fail = 1 && exit 1 || :;                  \
+    }
+endef
+
+# Use -Wformat -Werror to detect format-string/arg-list mismatches.
+# Also, check for shadowing problems with -Wshadow, and for pointer
+# arithmetic problems with -Wpointer-arith.
+# These CFLAGS are pretty strict.  If you build this target, you probably
+# have to have a recent version of gcc and glibc headers.
+# The hard-linking for-loop below ensures that there is a bin/ directory
+# full of all of the programs under test (except the ones that are required
+# for basic Makefile rules), all symlinked to the just-built "false" program.
+# This is to ensure that if ever a test neglects to make PATH include
+# the build srcdir, these always-failing programs will run.
+# Otherwise, it is too easy to test the wrong programs.
+# Note that "false" itself is a symlink to true, so it too will malfunction.
+my-distcheck: $(DIST_ARCHIVES) $(local-check)
+       $(MAKE) syntax-check
+       $(MAKE) check
+       -rm -rf $(t)
+       mkdir -p $(t)
+       GZIP=$(GZIP_ENV) $(AMTAR) -C $(t) -zxf $(distdir).tar.gz
+       cd $(t)/$(distdir)                              \
+         && ./configure --disable-nls                  \
+         && $(MAKE) CFLAGS='$(warn_cflags)'            \
+             AM_MAKEFLAGS='$(null_AM_MAKEFLAGS)'       \
+         && $(MAKE) dvi                                \
+         && $(install-transform-check)                 \
+         && $(my-instcheck)                            \
+         && mkdir $(bin)                               \
+         && ($(write_loser)) > $(bin)/loser            \
+         && chmod a+x $(bin)/loser                     \
+         && for i in $(built_programs); do             \
+              case $$i in                              \
+                rm|expr|basename|echo|sort|ls|tr);;    \
+                cat|dirname|mv|wc);;                   \
+                *) ln $(bin)/loser $(bin)/$$i;;        \
+              esac;                                    \
+            done                                       \
+         && ln -sf ../src/true $(bin)/false            \
+         && PATH=`pwd`/$(bin):$$PATH $(MAKE) -C tests check \
+         && { test -d gnulib-tests                     \
+                && $(MAKE) -C gnulib-tests check       \
+                || :; }                                \
+         && rm -rf $(bin)                              \
+         && $(MAKE) distclean
+       (cd $(t) && mv $(distdir) $(distdir).old        \
+         && $(AMTAR) -zxf - ) < $(distdir).tar.gz
+       diff -ur $(t)/$(distdir).old $(t)/$(distdir)
+       if test -f $(srcdir)/src/c99-to-c89.diff; then                  \
+         cd $(t)/$(distdir)                                            \
+           && (cd src && patch -V never --fuzz=0 <c99-to-c89.diff)     \
+           && ./configure --disable-largefile                          \
+                CFLAGS='-Werror -ansi -Wno-long-long'                  \
+           && $(MAKE);                                                 \
+       fi
+       -rm -rf $(t)
+       @echo "========================"; \
+       echo "$(distdir).tar.gz is ready for distribution"; \
+       echo "========================"
+
+WGET = wget
+WGETFLAGS = -C off
+
+rel-check:
+       tarz=/tmp/rel-check-tarz-$$$$; \
+       md5_tmp=/tmp/rel-check-md5-$$$$; \
+       set -e; \
+       trap 'status=$$?; rm -f $$tarz $$md5_tmp; exit $$status' 0 1 2 3 15; \
+       $(WGET) $(WGETFLAGS) -q --output-document=$$tarz $(url); \
+       echo "$(md5)  -" > $$md5_tmp; \
+       md5sum -c $$md5_tmp < $$tarz
+
+rel-files = $(DIST_ARCHIVES)
+
+gnulib-version = $$(cd $(gnulib_dir) && git describe)
+
+announcement: NEWS ChangeLog $(rel-files)
+       @./build-aux/announce-gen                                       \
+           --release-type=$(RELEASE_TYPE)                              \
+           --package=$(PACKAGE)                                        \
+           --prev=$(PREV_VERSION)                                      \
+           --curr=$(VERSION)                                           \
+           --gpg-key-id=$(gpg_key_ID)                                  \
+           --news=NEWS                                                 \
+           --bootstrap-tools=autoconf,automake,bison,gnulib            \
+           --gnulib-version=$(gnulib-version)                          \
+           $(addprefix --url-dir=, $(url_dir_list))
+
+## ---------------- ##
+## Updating files.  ##
+## ---------------- ##
+
+ftp-gnu = ftp://ftp.gnu.org/gnu
+www-gnu = http://www.gnu.org
+
+# Use mv, if you don't have/want move-if-change.
+move_if_change ?= move-if-change
+
+emit_upload_commands:
+       @echo =====================================
+       @echo =====================================
+       @echo "$(srcdir)/build-aux/gnupload $(GNUPLOADFLAGS) \\"
+       @echo "    --to $(gnu_rel_host):$(PACKAGE) \\"
+       @echo "  $(rel-files)"
+       @echo '# send the /tmp/announcement e-mail'
+       @echo =====================================
+       @echo =====================================
+
+noteworthy = * Noteworthy changes in release ?.? (????-??-??) [?]
+define emit-commit-log
+  printf '%s\n' 'post-release administrivia' '' \
+    '* NEWS: Add header line for next release.' \
+    '* .prev-version: Record previous version.' \
+    '* cfg.mk (old_NEWS_hash): Auto-update.'
+endef
+
+.PHONY: alpha beta major
+alpha beta major: $(local-check) writable-files
+       test $@ = major                                         \
+         && { echo $(VERSION) | grep -E '^[0-9]+(\.[0-9]+)+$$' \
+              || { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\
+         || :
+       $(MAKE) vc-dist
+       $(MAKE) news-date-check
+       $(MAKE) -s announcement RELEASE_TYPE=$@ > /tmp/announce-$(my_distdir)
+       if test -d $(release_archive_dir); then                 \
+         ln $(rel-files) $(release_archive_dir);               \
+         chmod a-w $(rel-files);                               \
+       fi
+       $(MAKE) -s emit_upload_commands RELEASE_TYPE=$@
+       echo $(VERSION) > $(prev_version_file)
+       $(MAKE) update-NEWS-hash
+       perl -pi -e '$$. == 3 and print "$(noteworthy)\n\n\n"' NEWS
+       $(emit-commit-log) > .ci-msg
+       $(VC) commit -F .ci-msg
index 3592ff017ff38042ac3b78e120cb522b69530226..00e5045a63d2cfc9ebae5464c37f7666afcd9a62 100644 (file)
@@ -5,7 +5,6 @@
 Makefile
 Makefile.in
 bison
 Makefile
 Makefile.in
 bison
-revision.c
 scan-code.c
 scan-gram.c
 scan-skel.c
 scan-code.c
 scan-gram.c
 scan-skel.c
index 1c1015b4087a92444002cd7f85cf8de11ebc5d8b..c259f416c1e016e98c2222a378a5b7c7f2e0b878 100644 (file)
@@ -7,7 +7,6 @@
 /Makefile.in
 /bison
 /bison.exe
 /Makefile.in
 /bison
 /bison.exe
-/revision.c
 /scan-code.c
 /scan-gram.c
 /scan-skel.c
 /scan-code.c
 /scan-gram.c
 /scan-skel.c
index 9f74c0b2a325e28dd8d46e5834a4ec5251f765a2..2b297abdde39e767f0b3269d04a7956085b55c56 100644 (file)
@@ -53,7 +53,6 @@ bison_SOURCES =                                         \
        print-xml.c print-xml.h                   \
        reader.c reader.h                         \
        reduce.c reduce.h                         \
        print-xml.c print-xml.h                   \
        reader.c reader.h                         \
        reduce.c reduce.h                         \
-       revision.c revision.h                     \
        relation.c relation.h                     \
        scan-code.h scan-code-c.c                 \
        scan-gram.h scan-gram-c.c                 \
        relation.c relation.h                     \
        scan-code.h scan-code-c.c                 \
        scan-gram.h scan-gram-c.c                 \
@@ -70,7 +69,6 @@ EXTRA_bison_SOURCES = scan-code.l scan-skel.l scan-gram.l
 
 BUILT_SOURCES =                                        \
 parse-gram.c parse-gram.h                      \
 
 BUILT_SOURCES =                                        \
 parse-gram.c parse-gram.h                      \
-revision.c                                     \
 scan-code.c                                    \
 scan-skel.c                                    \
 scan-gram.c
 scan-code.c                                    \
 scan-skel.c                                    \
 scan-gram.c
@@ -85,16 +83,6 @@ yacc:
 echo:
        echo $(bison_SOURCES) $(noinst_HEADERS)
 
 echo:
        echo $(bison_SOURCES) $(noinst_HEADERS)
 
-revision.c: $(top_srcdir)/configure $(top_srcdir)/ChangeLog
-       case "$(VERSION)" in \
-         *+*) sed -n \
-           's/^\$$\(Id.*\)\$$$$/const char *revision = "\1\\n";/p' \
-           $(top_srcdir)/ChangeLog \
-           ;; \
-         *) echo 'const char *revision = "";' \
-           ;; \
-       esac >$@
-
 # The following rule is not designed to be portable,
 # and relies on tools that not everyone has.
 
 # The following rule is not designed to be portable,
 # and relies on tools that not everyone has.
 
index 92846b64720a0d9caaaa9b7bc78990381a3f03e5..8eecb5f278dc1868d32eecbc74a0326a92d60cc9 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <config.h>
 #include "system.h"
 
 #include <config.h>
 #include "system.h"
-#include "revision.h"
 #include "output.h"
 
 #include <argmatch.h>
 #include "output.h"
 
 #include <argmatch.h>
@@ -338,7 +337,6 @@ version (void)
      continue.  */
   printf (_("bison (GNU Bison) %s"), VERSION);
   putc ('\n', stdout);
      continue.  */
   printf (_("bison (GNU Bison) %s"), VERSION);
   putc ('\n', stdout);
-  printf ("%s", revision);
   fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
   putc ('\n', stdout);
 
   fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
   putc ('\n', stdout);
 
diff --git a/src/revision.h b/src/revision.h
deleted file mode 100644 (file)
index 64c8acc..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Between Bison releases, define a precise revision string.
-
-   Copyright (C) 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   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 of the License, 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/>.  */
-
-#ifndef REVISION_H_
-# define REVISION_H_
-
-extern const char *revision;
-
-#endif /* !REVISION_H_ */