diff options
author | Akim Demaille <demaille@gostai.com> | 2012-02-22 14:42:39 +0100 |
---|---|---|
committer | Akim Demaille <demaille@gostai.com> | 2012-02-24 11:04:45 +0100 |
commit | 2191bb749b8f63b6037ca7e590ae499d0bb26db9 (patch) | |
tree | c4393108921e95f0c32bd51af26331a2c8163b74 /examples | |
parent | f518dbaf46eb28bd39695474de6118683d905e5f (diff) | |
download | bison-2191bb749b8f63b6037ca7e590ae499d0bb26db9.tar.gz |
maint: fix example extraction issues.
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.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/calc++/.gitignore | 5 | ||||
-rw-r--r-- | examples/calc++/calc++-parser.hh | 4 | ||||
-rw-r--r-- | examples/calc++/local.mk | 80 | ||||
-rw-r--r-- | examples/extexi | 16 | ||||
-rw-r--r-- | examples/local.mk | 21 | ||||
-rw-r--r-- | examples/mfcalc/local.mk | 23 | ||||
-rw-r--r-- | examples/rpcalc/local.mk | 23 |
7 files changed, 83 insertions, 89 deletions
diff --git a/examples/calc++/.gitignore b/examples/calc++/.gitignore index 2306d175..50eb5ba1 100644 --- a/examples/calc++/.gitignore +++ b/examples/calc++/.gitignore @@ -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 index 6f1e8852..00000000 --- a/examples/calc++/calc++-parser.hh +++ /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" diff --git a/examples/calc++/local.mk b/examples/calc++/local.mk index 5d9dce02..8a039736 100644 --- a/examples/calc++/local.mk +++ b/examples/calc++/local.mk @@ -15,55 +15,71 @@ # 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 diff --git a/examples/extexi b/examples/extexi index efce4e57..7ede7c4b 100644 --- a/examples/extexi +++ b/examples/extexi @@ -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]) { diff --git a/examples/local.mk b/examples/local.mk index 0d632023..24ad83c1 100644 --- a/examples/local.mk +++ b/examples/local.mk @@ -13,11 +13,28 @@ ## 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 diff --git a/examples/mfcalc/local.mk b/examples/mfcalc/local.mk index c6d94708..8083dea0 100644 --- a/examples/mfcalc/local.mk +++ b/examples/mfcalc/local.mk @@ -15,38 +15,19 @@ # 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 diff --git a/examples/rpcalc/local.mk b/examples/rpcalc/local.mk index c6cd7a33..844ffdff 100644 --- a/examples/rpcalc/local.mk +++ b/examples/rpcalc/local.mk @@ -15,37 +15,18 @@ # 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 |