]> git.saurik.com Git - bison.git/commitdiff
maint: fix example extraction issues.
authorAkim Demaille <demaille@gostai.com>
Wed, 22 Feb 2012 13:42:39 +0000 (14:42 +0100)
committerAkim Demaille <demaille@gostai.com>
Fri, 24 Feb 2012 10:04:45 +0000 (11:04 +0100)
calc++: don't rely on Automake to compile a C++ parser.

Basically, revert commit 609b3d8096fb0cc1fa4d908b6e1a860ced260bda,
Automake 1.11.3 is not safe enough for C++ parser.

* examples/calc++/calc++-parser.hh: Remove.
* examples/calc++/local.mk (examples/calc++/calc++-parser.stamp):
New.

examples: factor the extractions into a single step

extexi had to be run in the extraction directory.  Now, it can be
given the files with expected output directory.  This allows to
use $(*_extracted) variables (before we had to list again their
members, but limited to their base names).  In turn, this also
allows fusing the extraction recipes into a single one.

Also, it is currently too hard (or requires too much duplication,
since Make wants all the occurrences of the files to be prefixed with
$(srcdir)/, which is something Automake cannot support for *_SOURCES)
to work in the source tree.  So extract, and compile scanners and parsers
in the build tree.

* examples/extexi (basename): New.
(BEGIN): Now "file_wanted" maps base name to extracted file name.
* examples/calc++/local.mk, examples/mfcalc/local.mk,
* examples/rpcalc/local.mk: Fuse extraction rules into...
* examples/local.mk: Here.
(extract, extracted): New.

examples/calc++/.gitignore
examples/calc++/calc++-parser.hh [deleted file]
examples/calc++/local.mk
examples/extexi
examples/local.mk
examples/mfcalc/local.mk
examples/rpcalc/local.mk

index 2306d1755edda542e98037153813582b407e6527..50eb5ba1e816d1a39714e311cbb403fbcdd82475 100644 (file)
@@ -4,10 +4,11 @@
 /calc++
 /calc++-driver.cc
 /calc++-driver.hh
+/calc++-parser.cc
+/calc++-parser.hh
 /calc++-parser.output
+/calc++-parser.stamp
 /calc++-parser.yy
-/calc++-parser.cc
-/calc++-parser.h
 /calc++-scanner.cc
 /calc++-scanner.ll
 /calc++.cc
diff --git a/examples/calc++/calc++-parser.hh b/examples/calc++/calc++-parser.hh
deleted file mode 100644 (file)
index 6f1e885..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-// Work around an Automake 1.11.2 bug: it asks for the creation of
-// y.tab.h and then renames it as calc++-parser.h instead of
-// calc++-parser.hh.  We don't want this to show in the documentation.
-#include "calc++-parser.h"
index 5d9dce023fccc39d8379305173b5b9e6386304f3..8a0397360f702ff4db3228190724255e80be075d 100644 (file)
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-## ------------ ##
-## Extracting.  ##
-## ------------ ##
+## ------------------- ##
+## Parser generation.  ##
+## ------------------- ##
 
-# Extract in src.
-$(top_srcdir)/examples/calc++/calc.stamp: $(doc) $(extexi)
-       $(AM_V_GEN)rm -f $@ $@.tmp
+CLEANFILES += $(top_srcdir)/examples/calc++/*.output *.tmp
+MAINTAINERCLEANFILES += examples/calc++/*.stamp $(calc_sources)
+
+# Compile the parser and save cycles.
+# This code comes from "Handling Tools that Produce Many Outputs",
+# from the Automake documentation.
+EXTRA_DIST +=                                  \
+  examples/calc++/calc++-parser.stamp          \
+  examples/calc++/calc++-parser.yy             \
+  examples/calc++/calc++.stamp
+# Don't depend on $(BISON) otherwise we would rebuild these files
+# in srcdir, including during distcheck, which is forbidden.
+examples/calc++/calc++-parser.stamp: examples/calc++/calc++-parser.yy $(BISON_IN)
+       $(AM_V_YACC)rm -f $@
        $(AM_V_at)touch $@.tmp
-       $(AM_V_at)cd $(top_srcdir)/examples/calc++ && \
-          $(AWK) -f ../extexi -v VERSION="$(VERSION)" \
-            ../../doc/bison.texinfo -- calc++-parser.yy \
-            calc++-scanner.ll calc++.cc calc++-driver.hh calc++-driver.cc
-       $(AM_V_at)mv $@.tmp $@
+       $(AM_V_at)$(YACCCOMPILE) -o examples/calc++/calc++-parser.cc    \
+         examples/calc++/calc++-parser.yy
+       $(AM_V_at)mv -f $@.tmp $@
+
+$(calc_sources_generated): examples/calc++/calc++-parser.stamp
+       @test -f $@ || rm -f examples/calc++/calc++-parser.stamp
+       @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/calc++/calc++-parser.stamp
 
-$(calc_extracted): $(top_srcdir)/examples/calc++/calc.stamp
-       $(AM_V_GEN)if test -f $@; then :; else \
-         rm -f $< && \
-         $(MAKE) $(AM_MAKEFLAGS) $<; \
-       fi
 
 ## -------------------- ##
 ## Building & testing.  ##
 ## -------------------- ##
 
-BUILT_SOURCES += $(calc_sources) examples/calc++/calc++-parser.h
+# Avoid using BUILT_SOURCES which is too global.
+$(examples_calc___calc___OBJECTS): $(calc_sources_generated)
 CLEANFILES += *.tmp
-MAINTAINERCLEANFILES += $(top_srcdir)/examples/calc++/calc.stamp $(calc_sources)
-EXTRA_DIST += examples/calc++/calc.stamp
+MAINTAINERCLEANFILES += $(calc_sources)
 
-calc_extracted =                               \
-  examples/calc++/calc++-scanner.ll            \
-  examples/calc++/calc++.cc                    \
-  examples/calc++/calc++-driver.hh             \
+calc_sources_extracted =                       \
   examples/calc++/calc++-driver.cc             \
+  examples/calc++/calc++-driver.hh             \
+  examples/calc++/calc++-scanner.ll            \
+  examples/calc++/calc++.cc
+calc_extracted =                               \
+  $(calc_sources_extracted)                    \
   examples/calc++/calc++-parser.yy
-calc_generated =                               \
-  examples/calc++/stack.hh                     \
+extracted += $(calc_extracted)
+calc_sources_generated =                       \
+  examples/calc++/calc++-parser.cc             \
+  examples/calc++/calc++-parser.hh             \
+  examples/calc++/location.hh                  \
   examples/calc++/position.hh                  \
-  examples/calc++/location.hh
+  examples/calc++/stack.hh
 calc_sources =                                 \
-  $(calc_extracted) $(calc_generated)
+  $(calc_sources_extracted)                    \
+  $(calc_sources_generated)
 if BISON_CXX_WORKS
 check_PROGRAMS += examples/calc++/calc++
 examples_calc___calc___SOURCES =               \
-  $(calc_sources)                              \
-  examples/calc++/y.tab.h                      \
-  examples/calc++/calc++-parser.hh
+  $(calc_sources)
 
-examples_calc___calc___CPPFLAGS = -I$(top_srcdir)/examples/calc++
+examples_calc___calc___CPPFLAGS =              \
+  -I$(top_builddir)/examples/calc++            \
+  -I$(top_srcdir)/examples/calc++
 TESTS += examples/calc++/calc++.test
 endif
-EXTRA_DIST += examples/calc++/calc++.test
+EXTRA_DIST +=                                  \
+  examples/calc++/calc++-parser.yy             \
+  examples/calc++/calc++.test
index efce4e5738f1852cb3b3ddcd7a5b35302be66d4e..7ede7c4b40072c5946d1bd6d91748685bdd01e8f 100644 (file)
@@ -29,7 +29,7 @@ BEGIN {
     if (ARGV[argc] == "--")
       break;
   for (i = argc + 1; i < ARGC; ++i)
-    file_wanted[ARGV[i]] = 1;
+    file_wanted[basename(ARGV[i])] = ARGV[i];
   ARGC = argc;
 }
 
@@ -43,13 +43,10 @@ BEGIN {
 }
 
 /^@comment file: / {
-  if (!file_wanted[$3])
-    message("ignoring " $3);
+  if (file = file_wanted[$3])
+    message(" GEN " file);
   else
-    {
-      message("extracting " $3);
-      file = $3;
-    }
+    message("SKIP " $3);
 }
 
 /^@(small)?example$/, /^@end (small)?example$/ {
@@ -125,6 +122,11 @@ function normalize(contents,    i, lines, n, line, res) {
 }
 
 
+function basename(name,     a, n) {
+  n = split (name, a, "/");
+  return a[n];
+}
+
 function message(msg) {
   if (! message_printed[msg])
     {
index 0d632023a608905c207117768cc2f682c9d05e63..24ad83c198b6bc1a3d7a7153e8bfb539641285ce 100644 (file)
 ## You should have received a copy of the GNU General Public License
 ## along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-doc = $(top_srcdir)/doc/bison.texinfo
-extexi = $(top_srcdir)/examples/extexi
 dist_noinst_SCRIPTS = examples/extexi examples/test
 TEST_LOG_COMPILER = $(top_srcdir)/examples/test
 
+## ------------ ##
+## Extracting.  ##
+## ------------ ##
+
+doc = $(top_srcdir)/doc/bison.texinfo
+extexi = $(top_srcdir)/examples/extexi
+extract = $(AWK) -f $(extexi) -v VERSION="$(VERSION)" $(doc) --
+extracted =
+MAINTAINERCLEANFILES += $(extracted)
+examples/extracted.stamp: $(doc) $(extexi)
+       $(AM_V_GEN)rm -f $@ $@.tmp
+       $(AM_V_at)touch $@.tmp
+       $(AM_V_at)$(extract) $(extracted)
+       $(AM_V_at)mv $@.tmp $@
+
+$(extracted): examples/extracted.stamp
+       @test -f $@ || rm -f examples/extracted.stamp
+       @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/extracted.stamp
+
 include examples/calc++/local.mk
 include examples/mfcalc/local.mk
 include examples/rpcalc/local.mk
index c6d94708df2b1d33eee4edab7566ddc6589c6937..8083dea06ff20e3ac5e8c3869dec2f03a59391a5 100644 (file)
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-## ------------ ##
-## Extracting.  ##
-## ------------ ##
-
-# Extract in src.
-$(top_srcdir)/examples/mfcalc/mfcalc.stamp: $(doc) $(extexi)
-       $(AM_V_GEN)rm -f $@ $@.tmp
-       $(AM_V_at)touch $@.tmp
-       $(AM_V_at)cd $(top_srcdir)/examples/mfcalc && \
-          $(AWK) -f ../extexi -v VERSION="$(VERSION)" \
-            ../../doc/bison.texinfo -- calc.h mfcalc.y
-       $(AM_V_at)mv $@.tmp $@
-
-$(mfcalc_extracted): $(top_srcdir)/examples/mfcalc/mfcalc.stamp
-       $(AM_V_GEN)if test -f $@; then :; else \
-         rm -f $< && \
-         $(MAKE) $(AM_MAKEFLAGS) $<; \
-       fi
-
 ## -------------------- ##
 ## Building & testing.  ##
 ## -------------------- ##
 
 BUILT_SOURCES += $(mfcalc_sources)
-MAINTAINERCLEANFILES += $(top_srcdir)/examples/mfcalc/mfcalc.stamp $(mfcalc_sources)
-EXTRA_DIST += examples/mfcalc/mfcalc.stamp
+MAINTAINERCLEANFILES += $(mfcalc_sources)
 
 mfcalc_extracted =                             \
   examples/mfcalc/calc.h                       \
   examples/mfcalc/mfcalc.y
 mfcalc_sources =                               \
   $(mfcalc_extracted)
+extracted += $(mfcalc_extracted)
 
 check_PROGRAMS += examples/mfcalc/mfcalc
 examples_mfcalc_mfcalc_LDADD = -lm
index c6cd7a33b0e4243674a4601fab34d28c8d9a3432..844ffdfff90b9e818d669f7b986309b36aea2cd5 100644 (file)
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-## ------------ ##
-## Extracting.  ##
-## ------------ ##
-
-# Extract in src.
-$(top_srcdir)/examples/rpcalc/rpcalc.stamp: $(doc) $(extexi)
-       $(AM_V_GEN)rm -f $@ $@.tmp
-       $(AM_V_at)touch $@.tmp
-       $(AM_V_at)cd $(top_srcdir)/examples/rpcalc && \
-          $(AWK) -f ../extexi -v VERSION="$(VERSION)" \
-            ../../doc/bison.texinfo -- calc.h rpcalc.y
-       $(AM_V_at)mv $@.tmp $@
-
-$(rpcalc_extracted): $(top_srcdir)/examples/rpcalc/rpcalc.stamp
-       $(AM_V_GEN)if test -f $@; then :; else \
-         rm -f $< && \
-         $(MAKE) $(AM_MAKEFLAGS) $<; \
-       fi
-
 ## -------------------- ##
 ## Building & testing.  ##
 ## -------------------- ##
 
 BUILT_SOURCES += $(rpcalc_sources)
-MAINTAINERCLEANFILES += $(top_srcdir)/examples/rpcalc/rpcalc.stamp $(rpcalc_sources)
-EXTRA_DIST += examples/rpcalc/rpcalc.stamp
+MAINTAINERCLEANFILES += $(rpcalc_sources)
 
 rpcalc_extracted =                             \
   examples/rpcalc/rpcalc.y
 rpcalc_sources =                               \
   $(rpcalc_extracted)
+extracted += $(rpcalc_extracted)
 
 check_PROGRAMS += examples/rpcalc/rpcalc
 examples_rpcalc_rpcalc_LDADD = -lm