On Fri, 18 Jul 2008, Joel E. Denny wrote: > On Sat, 12 Jul 2008, Joel E. Denny wrote: > > > On Fri, 11 Jul 2008, Eric Blake wrote: > > > > > It looks like bison generally tries to avoid generated files in version > > > control (for example, configure or Makefile.in). Any reason that > > > doc/bison.1 is an exception to this rule? > > > > There was a time when bison.1 was not generated, and I guess we just never > > thought to update this. > > > > > Also, I noticed that > > > .prev-version is NOT in version control, which means builds start out with > > > this message: > > > > > > cat: .prev-version: No such file or directory > > > > There are several issues in this general area that need updating. For > > example, at some point I noticed that GNUmakefile is now part of gnulib, > > but we still have a local copy. > > Here's a patch, not yet pushed, that fixes the above. My main goal is to > start using git-version-gen for naming versions between releases and to > drop our current "PREVIOUS-RELEASE+" scheme. The above changes seemed to > help with this.
Also, I need to add the tag v2.3b, but what's the git command to push that without pushing my other local tags? > The git-version-gen approach looks fairly robust. However, I dislike that > "make" leaves an incorrect version number. Our current scheme merely uses > imprecise version numbers instead. Fortunately, "make dist" does correct > the version number. Unfortunately, "make install" does not. > > I had to hack bootstrap to remove the "GNUmakefile" entry that gnulib adds > to .gitignore. It would be better to patch gnulib to add "/GNUmakefile" > instead. > > A lot of this is new to me. I'll wait a while for comments before > pushing. > > >From 8fa369111fcc3d06a0c9fc278f063b8033dac094 Mon Sep 17 00:00:00 2001 > From: Joel E. Denny <[EMAIL PROTECTED]> > Date: Fri, 18 Jul 2008 11:26:15 -0400 > Subject: [PATCH] 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. > --- > .cvsignore | 3 + > .gitignore | 3 + > .prev-version | 1 + > .version.in | 1 - > ChangeLog | 39 +++- > GNUmakefile | 71 ----- > Makefile.am | 9 +- > NEWS | 2 +- > bootstrap | 6 + > bootstrap.conf | 4 +- > configure.ac | 7 +- > doc/.cvsignore | 1 + > doc/.gitignore | 1 + > doc/bison.1 | 199 ------------- > maint.mk | 858 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > src/.cvsignore | 1 - > src/.gitignore | 1 - > src/Makefile.am | 12 - > src/getargs.c | 2 - > src/revision.h | 25 -- > 20 files changed, 925 insertions(+), 321 deletions(-) > create mode 100644 .prev-version > delete mode 100644 .version.in > delete mode 100644 GNUmakefile > delete mode 100644 doc/bison.1 > create mode 100644 maint.mk > delete mode 100644 src/revision.h > > diff --git a/.cvsignore b/.cvsignore > index d89800e..704acea 100644 > --- a/.cvsignore > +++ b/.cvsignore > @@ -1,9 +1,12 @@ > *.cache > *.flc > *.prj > +*~ > +.tarball-version > .version > ABOUT-NLS > COPYING > +GNUmakefile > INSTALL > Makefile > Makefile.in > diff --git a/.gitignore b/.gitignore > index 440a930..be0a7b7 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -1,9 +1,12 @@ > /*.cache > /*.flc > /*.prj > +/*~ > +/.tarball-version > /.version > /ABOUT-NLS > /COPYING > +/GNUmakefile > /INSTALL > /Makefile > /Makefile.in > diff --git a/.prev-version b/.prev-version > new file mode 100644 > index 0000000..0b6bb57 > --- /dev/null > +++ b/.prev-version > @@ -0,0 +1 @@ > +2.3b > diff --git a/.version.in b/.version.in > deleted file mode 100644 > index d78bda9..0000000 > --- a/.version.in > +++ /dev/null > @@ -1 +0,0 @@ > [EMAIL PROTECTED]@ > diff --git a/ChangeLog b/ChangeLog > index 9d5692c..35a839c 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,3 +1,40 @@ > +2008-07-18 Joel E. Denny <[EMAIL PROTECTED]> > + > + 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 <[EMAIL PROTECTED]> > > Fix untranslatable composition of sentences. Reported by Goran > @@ -20600,5 +20637,3 @@ > 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 > index 25426d1..0000000 > --- a/GNUmakefile > +++ /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: > diff --git a/Makefile.am b/Makefile.am > index bd91aff..b1e2669 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -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 > > -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 \ > @@ -42,3 +42,10 @@ maintainer-push-check: > .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) > [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ > +dist-hook: > + echo $(VERSION) > $(distdir)/.tarball-version > diff --git a/NEWS b/NEWS > index d5beea0..84236f8 100644 > --- a/NEWS > +++ b/NEWS > @@ -1,7 +1,7 @@ > Bison News > ---------- > > -Changes in version 2.3b+ (????-??-??): > +Changes in version ?.? (????-??-??): > > * > > diff --git a/bootstrap b/bootstrap > index 85d06a2..67063b5 100755 > --- a/bootstrap > +++ b/bootstrap > @@ -600,6 +600,12 @@ if test -f $mam_template; then > 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 \ > diff --git a/bootstrap.conf b/bootstrap.conf > index 7cb7a12..251e2ef 100644 > --- a/bootstrap.conf > +++ b/bootstrap.conf > @@ -18,8 +18,8 @@ > # 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 > diff --git a/configure.ac b/configure.ac > index 95d91dd..e1a6918 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -19,7 +19,9 @@ > # We have strange test case titles, so we need Autoconf 2.61 or better. > AC_PREREQ(2.61) > > -AC_INIT([GNU Bison], [2.3b+], [EMAIL PROTECTED]) > +AC_INIT([GNU Bison], > + m4_esyscmd([build-aux/git-version-gen .tarball-version]), > + [EMAIL PROTECTED]) > 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 > > -AC_CONFIG_FILES([.version > - Makefile > +AC_CONFIG_FILES([Makefile > build-aux/Makefile > po/Makefile.in > data/Makefile > diff --git a/doc/.cvsignore b/doc/.cvsignore > index 8365fea..0376b3e 100644 > --- a/doc/.cvsignore > +++ b/doc/.cvsignore > @@ -1,4 +1,5 @@ > Makefile > +bison.1 > bison.aux > bison.cp > bison.cps > diff --git a/doc/.gitignore b/doc/.gitignore > index 294a00d..1d55073 100644 > --- a/doc/.gitignore > +++ b/doc/.gitignore > @@ -1,4 +1,5 @@ > /Makefile > +/bison.1 > /bison.aux > /bison.cp > /bison.cps > diff --git a/doc/bison.1 b/doc/bison.1 > deleted file mode 100644 > index 2d13b4c..0000000 > --- a/doc/bison.1 > +++ /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 <[EMAIL PROTECTED]>. > -.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 > 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 /' \ > + > [EMAIL PROTECTED] > + @mv [EMAIL PROTECTED] $@ > + > +# 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[">]/' \ > + > [EMAIL PROTECTED] > + @mv [EMAIL PROTECTED] $@ > + > +# 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 [EMAIL PROTECTED] [EMAIL PROTECTED] > + cp -a src src-c89 > + (cd src-c89; patch -p1 -V never --fuzz=0) < src/c99-to-c89.diff \ > + > [EMAIL PROTECTED] 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 ' [EMAIL PROTECTED] > [EMAIL PROTECTED] || : > + msg=ok; test -s [EMAIL PROTECTED] && 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 [EMAIL PROTECTED] [EMAIL PROTECTED] > || 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) > [EMAIL PROTECTED]; > \ > + { echo N; \ > + info libc date calendar format | grep '^ `%.'\' \ > + | $(extract_char); } | sort > [EMAIL PROTECTED]; > \ > + diff -u [EMAIL PROTECTED] [EMAIL PROTECTED] || exit 1; > \ > + rm -f [EMAIL PROTECTED] [EMAIL PROTECTED]; > \ > + 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 > [EMAIL PROTECTED]; > \ > + 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 > [EMAIL PROTECTED]; > \ > + diff -u [EMAIL PROTECTED] [EMAIL PROTECTED] || exit 1; > \ > + rm -f [EMAIL PROTECTED] [EMAIL PROTECTED]; > \ > + 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 [EMAIL > PROTECTED]@'. > +# 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 > diff --git a/src/.cvsignore b/src/.cvsignore > index 3592ff0..00e5045 100644 > --- a/src/.cvsignore > +++ b/src/.cvsignore > @@ -5,7 +5,6 @@ > Makefile > Makefile.in > bison > -revision.c > scan-code.c > scan-gram.c > scan-skel.c > diff --git a/src/.gitignore b/src/.gitignore > index 1c1015b..c259f41 100644 > --- a/src/.gitignore > +++ b/src/.gitignore > @@ -7,7 +7,6 @@ > /Makefile.in > /bison > /bison.exe > -/revision.c > /scan-code.c > /scan-gram.c > /scan-skel.c > diff --git a/src/Makefile.am b/src/Makefile.am > index 9f74c0b..2b297ab 100644 > --- a/src/Makefile.am > +++ b/src/Makefile.am > @@ -53,7 +53,6 @@ bison_SOURCES = \ > 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 \ > @@ -70,7 +69,6 @@ EXTRA_bison_SOURCES = scan-code.l scan-skel.l scan-gram.l > > BUILT_SOURCES = \ > parse-gram.c parse-gram.h \ > -revision.c \ > scan-code.c \ > scan-skel.c \ > scan-gram.c > @@ -85,16 +83,6 @@ yacc: > 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. > > diff --git a/src/getargs.c b/src/getargs.c > index 92846b6..8eecb5f 100644 > --- a/src/getargs.c > +++ b/src/getargs.c > @@ -20,7 +20,6 @@ > > #include <config.h> > #include "system.h" > -#include "revision.h" > #include "output.h" > > #include <argmatch.h> > @@ -338,7 +337,6 @@ version (void) > 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); > > diff --git a/src/revision.h b/src/revision.h > deleted file mode 100644 > index 64c8acc..0000000 > --- a/src/revision.h > +++ /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_ */ > -- > 1.5.4.3 > > > >
