automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] {master} yacc: "make clean" removes .c and .h files from non-dis


From: Stefano Lattarini
Subject: [PATCH] {master} yacc: "make clean" removes .c and .h files from non-distributed .y
Date: Fri, 7 Jan 2011 16:02:59 +0100
User-agent: KMail/1.13.3 (Linux/2.6.30-2-686; KDE/4.4.4; i686; ; )

Hello automakers.

Currently, while automake does *not* distribute C source and header
files derived from non-distributed Yacc sources, it still cause them
to be removed only by "make maintainer-clean" only, and not by simply
"make clean" or "make distclean".  This causes "make distcheck" to
fail, unless the developer puts those generated .c and .h files in
CLEANFILES or in DISTCLEANFILES by hand.

The attached patch fixes this issue, by making non-distributed
.c and .h files generated by non-distributed Yacc sources cleaned
by "make clean".

The patch is based off of maint.  OK to apply to a temporary
branch and merge to master?

Regards,
   Stefano
From ed2c8bc8d83137428ce1976061d199768c1917eb Mon Sep 17 00:00:00 2001
From: Stefano Lattarini <address@hidden>
Date: Fri, 7 Jan 2011 15:44:47 +0100
Subject: [PATCH] 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.
---
 ChangeLog             |   20 ++++++
 NEWS                  |    3 +
 automake.in           |   15 ++---
 tests/Makefile.am     |    1 +
 tests/Makefile.in     |    1 +
 tests/yacc-clean.test |  160 +++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 191 insertions(+), 9 deletions(-)
 create mode 100755 tests/yacc-clean.test

diff --git a/ChangeLog b/ChangeLog
index bf44677..2482bbf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2011-01-07   Stefano Lattarini  <address@hidden>
+
+       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  <address@hidden>
 
        * NEWS: Fix typo (forgotten word).
diff --git a/NEWS b/NEWS
index eb31266..0575935 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,9 @@ New in 1.11.0a:
   - The `lzma' compression scheme and associated automake option `dist-lzma'
     is obsoleted by `xz' and `dist-xz' due to upstream changes.
 
+  - C source and header files derived from non-distributed Yacc sources are
+    now removed by "make clean", not only by "make maintainer-clean".
+
 Bugs fixed in 1.11.0a:
 
 * Bugs introduced by 1.11:
diff --git a/automake.in b/automake.in
index fa110a5..b97d4a6 100755
--- a/automake.in
+++ b/automake.in
@@ -6092,17 +6092,14 @@ sub lang_yacc_target_hook
        &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
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8842be3..bed5e41 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -793,6 +793,7 @@ werror3.test \
 whoami.test \
 xsource.test \
 xz.test \
+yacc-clean.test \
 yacc.test \
 yacc2.test \
 yacc3.test \
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 3bc4415..77e9a38 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -1060,6 +1060,7 @@ werror3.test \
 whoami.test \
 xsource.test \
 xz.test \
+yacc-clean.test \
 yacc.test \
 yacc2.test \
 yacc3.test \
diff --git a/tests/yacc-clean.test b/tests/yacc-clean.test
new file mode 100755
index 0000000..a8df065
--- /dev/null
+++ b/tests/yacc-clean.test
@@ -0,0 +1,160 @@
+#! /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
+
+:
-- 
1.7.2.3


reply via email to

[Prev in Thread] Current Thread [Next in Thread]