Package: automake;
Reported by: Stefano Lattarini <stefano.lattarini <at> gmail.com>
Date: Fri, 21 Jan 2011 21:21:01 UTC
Severity: normal
Tags: confirmed, help
View this message in rfc822 format
From: Stefano Lattarini <stefano.lattarini <at> gmail.com> To: automake-patches <at> gnu.org Cc: Ralf Wildenhues <Ralf.Wildenhues <at> gmx.de>, 7884 <at> debbugs.gnu.org Subject: bug#7884: [PATCH] yacc: fix VPATH builds with FreeBSD make (was: Re: bug#7884: Yacc and FreeBSD make in VPATH builds) Date: Thu, 27 Jan 2011 21:15:36 +0100
[Message part 1 (text/plain, inline)]
On Thursday 27 January 2011, Stefano Lattarini wrote: > Also, I'm halfway through an automake patch on the lines I've sketched, > and I can say that it seems remarkably easy at this point ... > In fact it has been even easier than I thought, after the discovery that the same 'Automake::Variable::define' call can be used to initialize the value of a variable as well as to append to it. The attached patch should fix automake bug#7884 (and now the test `yacc-dist-nobuild.test' passes also with FreeBSD make). OK for the 'yacc-work' branch? Regards, Stefano
[0001-yacc-fix-VPATH-builds-with-FreeBSD-make.patch (text/x-patch, inline)]
From 95e09f4b2b52d0e4ede51e238c2f8fce684fd085 Mon Sep 17 00:00:00 2001 From: Stefano Lattarini <stefano.lattarini <at> gmail.com> Date: Thu, 27 Jan 2011 20:30:56 +0100 Subject: [PATCH] yacc: fix VPATH builds with FreeBSD make Fixes automake bug#7884. * lib/am/yacc.am (.BEGIN): New target, hack to support VPATH builds with FreeBSD make. * automake.in (lang_yacc_target_hook): Now update the private make variable `am__yacc_c_outputs', used by the target above. * tests/yacc-dist-nobuild.test: Update. * tests/yacc-subdir-objects-vpath.test: New test. * tests/yacc-cond.test: Likewise. * tests/yacc-cond-minimal.test: New test, still failing with BSD make (but it's not a big deal). * tests/Makefile.am (TESTS): Update. --- ChangeLog | 15 ++++ automake.in | 7 ++ lib/am/yacc.am | 20 +++++ tests/Makefile.am | 3 + tests/Makefile.in | 3 + tests/yacc-cond-minimal.test | 81 ++++++++++++++++++++ tests/yacc-cond.test | 122 ++++++++++++++++++++++++++++++ tests/yacc-dist-nobuild.test | 7 +- tests/yacc-subdir-objects-vpath.test | 137 ++++++++++++++++++++++++++++++++++ 9 files changed, 392 insertions(+), 3 deletions(-) create mode 100755 tests/yacc-cond-minimal.test create mode 100755 tests/yacc-cond.test create mode 100755 tests/yacc-subdir-objects-vpath.test diff --git a/ChangeLog b/ChangeLog index 4470c28..93194b3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2011-01-27 Stefano Lattarini <stefano.lattarini <at> gmail.com> + + yacc: fix VPATH builds with FreeBSD make + Fixes automake bug#7884. + * lib/am/yacc.am (.BEGIN): New target, hack to support VPATH + builds with FreeBSD make. + * automake.in (lang_yacc_target_hook): Now update the private + make variable `am__yacc_c_outputs', used by the target above. + * tests/yacc-dist-nobuild.test: Update. + * tests/yacc-subdir-objects-vpath.test: New test. + * tests/yacc-cond.test: Likewise. + * tests/yacc-cond-minimal.test: New test, still failing with + BSD make (but it's not a big deal). + * tests/Makefile.am (TESTS): Update. + 2011-01-22 Stefano Lattarini <stefano.lattarini <at> gmail.com> configure: look for a yacc program to be used by the testsuite diff --git a/automake.in b/automake.in index fa458d6..c72e0bc 100755 --- a/automake.in +++ b/automake.in @@ -6082,6 +6082,13 @@ sub lang_yacc_target_hook } } + # Required to have FreeBSD make working correctly in VPATH builds. + # FIXME: It would be nice to add a yacc-generated C file to + # $(am__yacc_c_outputs) only if it's required by the build, e.g. + # only if it's not declared in a false conditional ... + Automake::Variable::define ('am__yacc_c_outputs', VAR_AUTOMAKE, '+', + TRUE, $output, '', INTERNAL, VAR_PRETTY); + if ($yflags_contains_minus_d) { (my $output_base = $output) =~ s/$KNOWN_EXTENSIONS_PATTERN$//; diff --git a/lib/am/yacc.am b/lib/am/yacc.am index 6d35cd4..8de0edc 100644 --- a/lib/am/yacc.am +++ b/lib/am/yacc.am @@ -46,3 +46,23 @@ endif %?MAINTAINER-MODE% ?!GENERIC??DIST_SOURCE? $(am__skipyacc) \ ## For non-suffix rules, we must emulate a VPATH search on %SOURCE%. ?!GENERIC? $(SHELL) $(YLWRAP) `test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE% y.tab.c %OBJ% y.tab.h %BASE%.h y.output %BASE%.output -- %COMPILE% + +## This is releated to automake bug#7884. +## The automake-generated Makefiles usually distribute the yacc-derived C +## files, so that the final user won't need a working yacc to build the +## package. But for some reason, in a VPATH build, FreeBSD make does not +## see (or decides not to use) the yacc-derived and distributed C files +## which are in the source directory, and tries to rebuild them (in the +## build directory). This might fail if the user hasn't a yacc program +## installed, or even if he has one which is uncompatible with that used +## by the developer. So we use the following hack to ensure that, with +## BSD make, the distributed, yacc-generated C sources are copied from +## the source directory into the build directory, before starting the +## "real" make operations. +.BEGIN: + @for f in $(am__yacc_c_outputs); do \ + if test ! -r $$f && test -f $(srcdir)/$$f; then \ + echo " cp -p $(srcdir)/$$f $$f"; \ + cp -p $(srcdir)/$$f $$f || exit 1; \ + else :; fi; \ + done; diff --git a/tests/Makefile.am b/tests/Makefile.am index e639b6c..d595c46 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -807,8 +807,11 @@ yacc6.test \ yacc7.test \ yacc8.test \ yaccdry.test \ +yacc-cond.test \ +yacc-cond-minimal.test \ yacc-dist-nobuild.test \ yacc-nodist.test \ +yacc-subdir-objects-vpath.test \ yaccpp.test \ yaccvpath.test \ yacc-d-vpath.test \ diff --git a/tests/Makefile.in b/tests/Makefile.in index 25fc4a8..74df65d 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -1075,8 +1075,11 @@ yacc6.test \ yacc7.test \ yacc8.test \ yaccdry.test \ +yacc-cond.test \ +yacc-cond-minimal.test \ yacc-dist-nobuild.test \ yacc-nodist.test \ +yacc-subdir-objects-vpath.test \ yaccpp.test \ yaccvpath.test \ yacc-d-vpath.test \ diff --git a/tests/yacc-cond-minimal.test b/tests/yacc-cond-minimal.test new file mode 100755 index 0000000..2956f01 --- /dev/null +++ b/tests/yacc-cond-minimal.test @@ -0,0 +1,81 @@ +#! /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 if a yacc-generated C source or header is not needed in the +# build tree, make won't generate not copy it there. + +. ./defs || Exit 1 + +set -e + +cat >> configure.in << 'END' +AM_CONDITIONAL([COND], [:]) +AC_PROG_CC +AC_PROG_YACC +AC_OUTPUT +END + +cat > Makefile.am << 'END' +bin_PROGRAMS = foo bar +if COND +foo_SOURCES = main.c +else +foo_SOURCES = parse.y main.c +endif + +bar_SOURCES = $(foo_SOURCES) +bar_YFLAGS = -d +END + +cat > main.c << 'END' +int main () { return 0; } +END + +mkdir bin +cat > bin/yacc <<'END' +#!/bin/sh +echo "$0 invoked, shouldn't happen!" >&2 +exit 1 +END +cp bin/yacc bin/bison +chmod a+x bin/yacc bin/bison +PATH=`pwd`/bin$PATH_SEPARATOR$PATH + +YACC=yacc BISON=bison +export YACC BISON + +$ACLOCAL +$AUTOCONF +$AUTOMAKE -a + +mkdir build +cd build +../configure +$MAKE +test ! -r parse.c +test ! -r bar-parse.c +test ! -r bar-parse.h +$MAKE clean +$sleep +: > ../parse.c +: > ../bar-parse.c +: > ../bar-parse.h +$MAKE +test ! -r parse.c +test ! -r bar-parse.c +test ! -r bar-parse.h + +: diff --git a/tests/yacc-cond.test b/tests/yacc-cond.test new file mode 100755 index 0000000..8c7729b --- /dev/null +++ b/tests/yacc-cond.test @@ -0,0 +1,122 @@ +#! /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 interaction of Yacc (without the `-d' option) and conditionals. + +required=yacc +. ./defs || Exit 1 + +set -e + +distdir=$me-1.0 + +cat >> configure.in << 'END' +AM_CONDITIONAL([COND], [:]) +AC_PROG_CC +AC_PROG_YACC +AC_OUTPUT +END + +cat > Makefile.am << 'END' +bin_PROGRAMS = foobar zardoz + +AM_YFLAGS = -d + +if COND +foobar_SOURCES = parse.y parse.h +else +foobar_SOURCES = parse.y main.c +endif + +if COND +zardoz_SOURCES = main2.c +else +zardoz_SOURCES = parse2.y parse2.h main2.c +endif + +.PHONY: test-objs +test-objs: + test -f parse.$(OBJEXT) + test ! -r parse2.$(OBJEXT) + test -f main2.$(OBJEXT) + test ! -r main.$(OBJEXT) +END + +cat > parse2.y << 'END' +%{ +int yylex () { return 0; } +void yyerror (char *s) {} +%} +%% +foobar : 'f' 'o' 'o' 'b' 'a' 'r' {}; +%% +END + +cat > main.c << 'END' +int main (void) { return 0; } +END + +cp main.c main2.c + +cat parse2.y main.c > parse.y + +$ACLOCAL +$AUTOCONF +$AUTOMAKE -a + +./configure +$MAKE +ls -l +test -f parse.c +test -f parse.h +test ! -r parse2.c +test ! -r parse2.h +$MAKE test-objs + +$MAKE distdir +ls -l $distdir +test -f $distdir/parse.c +test -f $distdir/parse.h +# For all we know, the `parse2.[ch]' generated files might be required by +# the end user (if he enable the COND conditional), so we must distribute +# them. +test -f $distdir/parse2.c +test -f $distdir/parse2.h + +# Now check that yacc is not needed to build from a distribution tarball. + +chmod -R a-w $distdir + +mkdir bin +cat > bin/yacc <<'END' +#!/bin/sh +echo "$0 invoked, shouldn't happen!" >&2 +exit 1 +END +cp bin/yacc bin/bison +chmod a+x bin/yacc bin/bison +PATH=`pwd`/bin$PATH_SEPARATOR$PATH + +YACC=yacc BISON=bison +export YACC BISON + +mkdir build +cd build +../$distdir/configure +$MAKE +$MAKE test-objs + +: diff --git a/tests/yacc-dist-nobuild.test b/tests/yacc-dist-nobuild.test index 9061f57..26f5924 100755 --- a/tests/yacc-dist-nobuild.test +++ b/tests/yacc-dist-nobuild.test @@ -79,9 +79,10 @@ cd build $MAKE # Sanity check. -chmod u+w ../$distdir -rm -f ../$distdir/parse.c -chmod a-w ../$distdir +$sleep +chmod u+w ../$distdir/parse.y +echo >> ../$distdir/parse.y +chmod a-w ../$distdir/parse.y $MAKE >out 2>&1 && { cat out; Exit 1; } cat out $FGREP parse.c out diff --git a/tests/yacc-subdir-objects-vpath.test b/tests/yacc-subdir-objects-vpath.test new file mode 100755 index 0000000..c427e47 --- /dev/null +++ b/tests/yacc-subdir-objects-vpath.test @@ -0,0 +1,137 @@ +#! /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/>. + +# Some tests for subdir parsers in VPATH builds. +# See also test `yacc8.test'. + +required=yacc +. ./defs || Exit 1 + +set -e + +cat >> configure.in << 'END' +AC_PROG_CC +AM_PROG_CC_C_O +AC_PROG_YACC +AC_OUTPUT +END + +cat > Makefile.am << 'END' +AUTOMAKE_OPTIONS = subdir-objects +bin_PROGRAMS = foo/bar baz/qux +foo_bar_SOURCES = foo/parse.y +baz_qux_SOURCES = baz/parse.y baz/main.c baz/parse.h +AM_YFLAGS = -d + +.PHONY: test-com test1 test2 +test-com: + ls -l . foo $(srcdir) $(srcdir)/foo + test ! -r parse.h + test ! -r parse.c + test ! -r parse.$(OBJEXT) + test -f foo/parse.$(OBJEXT) + test -f baz/parse.$(OBJEXT) +test1: test-com + test -f foo/parse.c + test -f foo/parse.h + test -f baz/parse.c + test -f baz/parse.h +test2: test-com + test -f $(srcdir)/foo/parse.c + test -f $(srcdir)/foo/parse.h + test -f $(srcdir)/baz/parse.c + test -f $(srcdir)/baz/parse.h +END + +mkdir foo +cat > foo/parse.y << 'END' +%{ +int yylex () { return 0; } +void yyerror (char *s) { return; } +%} +%% +x : 'x' {}; +%% +int main (void) { return 0; } +END + +mkdir baz +cat > baz/parse.y << 'END' +%{ +int yylex () { return 0; } +void yyerror (char *s) { return; } +%} +%token BAZBAZ +%% +x : 'x' {}; +%% +END +cat > baz/main.c << 'END' +#include "baz/parse.h" +int main (void) +{ + return (BAZBAZ); +} +END + +$ACLOCAL +$AUTOCONF +$AUTOMAKE -a + +# Try a from-scratch VPATH build. +mkdir sub1 +cd sub1 +../configure +$MAKE +$MAKE test1 + +# Also, let's see if we can recover from removal of generated header +# files. +rm -f foo/parse.h baz/parse.h +$MAKE foo/parse.h baz/parse.h +test -f foo/parse.h +test -f baz/parse.h +$MAKE clean +rm -f foo/parse.h baz/parse.h +$MAKE +test -f baz/parse.h +# foo/parse.h is not declares in any *_SOURCES, nor #included by any +# C file, so that it shouldn't be rebuilt by "make all". +test ! -r foo/parse.h + +cd .. + +# Generate yacc-derived files with an in-tree build. +./configure +$MAKE foo/parse.c foo/parse.h baz/parse.c baz/parse.h +$MAKE distclean +ls -l . foo +test -f foo/parse.c +test -f foo/parse.h +test -f baz/parse.c +test -f baz/parse.h + +# Now try a VPATH build with yacc-generated files already present in +# the srcdir. +YACC=false BISON=false +export YACC BISON +mkdir sub2 +cd sub2 +../configure +$MAKE +$MAKE test2 + +: -- 1.7.2.3
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.