Hello automakers. What I'm going to illustrate here is a long-standing bug in automake; but since I don't see it described in the manual, nor reported in the GNATS database, making it explicitly registered here in Debbugs won't hurt IMHO.
-*-*- Here is a description of the bug. 1) The package developer declares a Yacc-generated program in the Makefile.am: bin_PROGRAMS = calc cacl_SOURCES = calc.y 2) From that input, automake can generate rules to create *and distribute* the Yacc-derived C file `calc.c'. This C file is distributed so that the user won't need to have a yacc program installed in order to build the package. 3) The user has GNU bison installed on his developement machine, and also wants to take advantage of bison-specific features. So he decides to just require GNU bison, knowing that such a decision shouldn't affect the end users -- the `calc.c' file will be shipped in the distribution tarball, so that those users won't need bison in order to rebuild it. 4) The developer completes the program, and uses "make dist" to build the distribution tarball; a proper, up-to-date copy of the generated `calc.c' file will be bundled there. 4) A FreeBSD user, which doesn't have bison installed, but which has the standard BSD yacc available in his PATH, fetch the tarball, and attempts a VPATH build of the package: $ tar xzvf calc-1.0.tar.gz $ cd calc-1.0 $ mkdir build && cd build $ ../configure ... $ make # this is FreeBSD make 5) For some reason, FreeBSD make does not see, or decides not to use, the `calc.c' file in VPATH (here, `..'), and tries to rebuild it in thecurrent directory, obviously using FreeBSD yacc. Oops. I used to think that this bug was due to the fact that FreeBSD make never performs a VPATH search for a dependency that has an explicit rule, as reported also in the autoconf manual, see: <http://www.gnu.org/software/autoconf/manual/html_node/Make-Target-Lookup.html> But digging some more, I realized that the bug is present even when only suffix rues are involved :-( (see the minmal testcase attached). -*-*- The already-committed (to master) testcase `yacc-dist-nobuild.test' should provide coverage for the bug. -*-*- Proposals for a fix (Note: none of these solutions has been really attempted by me in practice, and none of them seems particularly appealing, either): - Always create yacc-derived and distributed .c and .h files in $(srcdir), and explicitly instruct make to alwsys look fr them there at first -- similarly to what is done for info files (yuck) - Tell the developer to add proper AC_CONFIG_LINKS to configure in order to support VPATH builds with FreeBSD make (yuck^2, since that means keeping track of renamed files when object-specific flags are involved). - Make the `parse.c' and `parse.h' rules look for same named files in $(srcdir) during a VPATH build, and copy them in $(builddir) if they're neweer than `parse.y'. But then how can distclean be made to work in evey situation? - Tell that FreeBSD make is not supported in VPATH builds (not really a solution, I admit). -*-*- Regards, Stefano
foo.test
Description: application/shellscript