+2011-01-07 Stefano Lattarini <stefano.lattarini@gmail.com>
+
+ yacc: "make clean" removes .c and .h files from non-distributed .y
+ Previously, while automake did *not* distribute C source and header
+ files derived from non-distributed Yacc sources, it still caused
+ them to be removed only by "make maintainer-clean" only, and not by
+ simply "make clean" or "make distclean".
+ This caused "make distcheck" to fail, unless the developer put
+ those generated .c and .h files in CLEANFILES or in DISTCLEANFILES
+ by hand.
+ This change fixes this issue, by making non-distributed `.c' and
+ `.h' files generated by non-distributed Yacc sources cleaned by
+ "make clean".
+ * tests/automake.in (lang_yacc_target_hook): Make C source and
+ header files derived from non-distributed Yacc files cleaned by
+ "make clean", not only by "make maintainer-clean".
+ * tests/yacc-clean.test: New test.
+ * tests/Makefile.am (TESTS): Update.
+ * NEWS: Update.
+
2011-01-02 Stefano Lattarini <stefano.lattarini@gmail.com>
* NEWS: Fix typo (forgotten word).
&push_dist_common ($header)
if $transform{'DIST_SOURCE'};
- # If the files are built in the build directory, then we want
- # to remove them with `make clean'. If they are in srcdir
- # they shouldn't be touched. However, we can't determine this
- # statically, and the GNU rules say that yacc/lex output files
- # should be removed by maintainer-clean. So that's what we
- # do.
- $clean_files{$header} = MAINTAINER_CLEAN;
- }
- # Erase $OUTPUT on `make maintainer-clean' (by GNU standards).
+ # The GNU rules say that yacc/lex output files should be removed
+ # by maintainer-clean. However, if the files are not distributed,
+ # then we want to remove them with "make clean"; otherwise,
+ # "make distcheck" will fail.
+ $clean_files{$header} = $transform{'DIST_SOURCE'} ? MAINTAINER_CLEAN : CLEAN;
+ }
# See the comment above for $HEADER.
- $clean_files{$output} = MAINTAINER_CLEAN;
+ $clean_files{$output} = $transform{'DIST_SOURCE'} ? MAINTAINER_CLEAN : CLEAN;
}
# This is a lex helper which is called whenever we have decided to
--- /dev/null
+#! /bin/sh
+# Copyright (C) 2011 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 2, 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/>.
+
+# Check that .c and .h files derived from non-distributed .y sources
+# are cleaned by "make clean", while .c and .h files derived from
+# distributed .y sources are cleaned by "make maintainer-clean".
+
+required=bison
+. ./defs || Exit 1
+
+set -e
+
+cat >> configure.in << 'END'
+AC_PROG_CC
+AC_PROG_YACC
+AC_CONFIG_FILES([sub1/Makefile sub2/Makefile])
+AC_OUTPUT
+END
+
+cat > Makefile.am << 'END'
+# Use two subdirectories, one to test with `-d' in YFLAGS, the
+# other one to test with empty YFLAGS.
+SUBDIRS = sub1 sub2
+END
+
+mkdir sub1 sub2
+
+cat > sub1/Makefile.am << 'END'
+bin_PROGRAMS = foo bar baz qux
+
+foo_SOURCES = main.c parse.y
+
+bar_SOURCES = main.c parse.y
+bar_YFLAGS = $(AM_YFLAGS)
+
+baz_SOURCES = main.c
+nodist_baz_SOURCES = baz.y
+
+qux_SOURCES = main.c
+nodist_qux_SOURCES = baz.y
+qux_YFLAGS = $(AM_YFLAGS)
+
+baz.y:
+ cp $(srcdir)/parse.y $@
+
+CLEANFILES = baz.y
+END
+
+cat > sub2/Makefile.am << 'END'
+include $(top_srcdir)/sub1/Makefile.am
+AM_YFLAGS = -d
+## FIXME: these apparently redundant definitions are required to
+## work around automake bug#7800.
+bar_YFLAGS += -d
+qux_YFLAGS += -d
+END
+
+cat > sub1/parse.y << 'END'
+%{
+int yylex () { return (getchar ()); }
+void yyerror (char *s) {}
+%}
+%%
+x : 'x' { };
+END
+cp sub1/parse.y sub2/parse.y
+
+cat > sub1/main.c << 'END'
+int main ()
+{
+ return yyparse ();
+}
+END
+cp sub1/main.c sub2/main.c
+
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE -a
+
+./configure
+
+cp config.status config.sav
+
+$MAKE
+ls -l . sub1 sub2
+# Sanity checks.
+test -f sub1/parse.y
+test -f sub1/parse.c
+test -f sub1/bar-parse.c
+test -f sub1/baz.y
+test -f sub1/baz.c
+test -f sub1/qux-baz.c
+test -f sub2/parse.y
+test -f sub2/parse.c
+test -f sub2/parse.h
+test -f sub2/bar-parse.c
+test -f sub2/bar-parse.h
+test -f sub2/baz.y
+test -f sub2/baz.c
+test -f sub2/baz.h
+test -f sub2/qux-baz.c
+test -f sub2/qux-baz.h
+
+for target in clean distclean; do
+ $MAKE $target
+ ls -l . sub1 sub2
+ test -f sub1/parse.y
+ test -f sub1/parse.c
+ test -f sub1/bar-parse.c
+ test ! -r sub1/baz.y
+ test ! -r sub1/baz.c
+ test ! -r sub1/qux-baz.c
+ test -f sub2/parse.y
+ test -f sub2/parse.c
+ test -f sub2/parse.h
+ test -f sub2/bar-parse.c
+ test -f sub2/bar-parse.h
+ test ! -r sub2/baz.y
+ test ! -r sub2/baz.c
+ test ! -r sub2/baz.h
+ test ! -r sub2/qux-baz.c
+ test ! -r sub2/qux-baz.h
+done
+
+cp config.sav config.status
+./config.status # re-create Makefile
+
+$MAKE maintainer-clean
+ls -l . sub1 sub2
+test -f sub1/parse.y
+test ! -r sub1/parse.c
+test ! -r sub1/bar-parse.c
+test -f sub2/parse.y
+test ! -r sub2/parse.c
+test ! -r sub2/parse.h
+test ! -r sub2/bar-parse.c
+test ! -r sub2/bar-parse.h
+
+cp config.sav config.status
+./config.status # re-create Makefile
+
+# The distribution must work correctly, assuming the user has
+# the proper tools to process yacc files.
+$MAKE distcheck
+
+: