This patch series stems from a discussion on bug-automake: [<http://comments.gmane.org/gmane.comp.sysutils.automake.bugs/4892>]
In short, some make implementations tend to use their built-in ".y => .o" and ".l => .o" rules instead of respectively the ".y => .c => .o" and ".l => .c => .o" implicit rule chains provided by the automake-generated Makefiles. This problem can be solved by always declaring more dependencies *explicitly* in the generated Makefile.in. The patch n.4 in the series does this. The other patches provide new and enhanced tests to verify the functionalities affected by the change. -*-*-*- It might be worth reporting the extensive comments in the automake scripts regarding dependencies/rules generation. Note that the following comments are the updated, extended version provided by the propsed patch series: # If the object file has been renamed (because per-target # flags are used) we cannot compile the file with an # inference rule: we need an explicit rule. # # If the source is in a subdirectory and the object is in # the current directory, we also need an explicit rule. # # If both source and object files are in a subdirectory # (this happens when the subdir-objects option is used), # then the inference will work. # # [CUT] # # Using inference rules for subdir-objects has been tested # with GNU make, Solaris make, Ultrix make, BSD make, # HP-UX make, and OSF1 make successfully. # # Unfortunately, explicit *dependencies* might still be needed # in the generated Makefile.in, even when explicit *rules* are # *not* required. Otherwise, in particular situations, some # make implementations (e.g. Heirloom make) might end up using # their built-in implicit rules, rather then the rules' chains # inferred from Automake-generated generic suffix rules. # # An example will help to clarify this. # # Let's say we have a C file `foo.c' generated from a Yacc # input `foo.y'. If the Makefile contains no target which # depends *explicitly* from foo.c, Heirloom make will end up # using its builtin `.y => .o' rule (calling $(YACC) and $(CC) # directly, and obviously ignoring the $(AM_CFLAGS) variable, # the ylwarp script, etc.), instead of the `.y => .c => .o' # rule chain generated by Automake (thanks to the two suffix # rules `.y.c' and `.c.o'). # # So, for consistency and simplicity, we always declare # *explicit* dependencies, while avoiding to output # unnecessary explicit *rules*. -*-*-*- Most relevant bits of the original discussion on bug-automake are reported here, just for the record ... Stefano Lattarini: > I encounterd the following failure in silent5.test when trying out the > Automake testsuite using Heirloom make as $MAKE: >> [...] >> rm -f baz5.c >> flex -t baz5.l > baz5.c >> gcc -g -O2 -c -o baz5.o baz5.c >> rm -f baz5.c >> CC baz6.o >> [...] >> LEX baz5.c >> CC ba2-baz5.o >> [...] >> rm -f foo5.c >> flex -t foo5.l > foo5.c >> gcc -g -O2 -c -o foo5.o foo5.c >> rm -f foo5.c >> [...] > [CUT] > The failure is not spurious, and seems due to the fact that heirloom > make is overly verbose in rules involving `flex' even when silent-rules > are enabled. Ralf Wildenhues: > That looks like heirloom-make uses its own internal rule for baz5.c and > for foo5.c. That would be problematic because ylwrap is not used, and > other problems. With a non-flex lex you'd see more test failures I > suppose. > [CUT] > I'm guessing this has to do with chains of inference rules not being > detected or so. Ralf Wildenhues: > Yeah, the make has a .l.o rule that triggers before our .l.c and .c.o > rule chains. > I guess this could be worked around by adding explicit rules (at least > that's what SUSv3 recommends), maybe explicit dependencies without > rules suffice. Stefano Lattarini: > Yes, explicit dependencies without rules suffice. > If I venture to write a patch to solve this problem, will you > consider it? Ralf Wildenhues: > Yes, if it's not dangerous or regresses other situations. -*-*-*- Patch series' summary: Stefano Lattarini (6): Extend, fix and improve tests on Yacc/Lex support. New tests: Heirloom make and Lex/Yacc rules. Add new tests on Lex and Yacc. automake.in: improve declaration of dependencies in generated Makefile.in New tests on Lex and Yacc dependencies declarations. More tests on AM_PROG_LEX, AC_PROG_LEX and @lex...@. ChangeLog | 77 +++++++++++ automake.in | 114 ++++++++++------ tests/Makefile.am | 22 +++- tests/Makefile.in | 22 +++- tests/defs.in | 7 + tests/exeext3.test | 10 +- tests/lex10.test | 26 ++++ tests/lex11.test | 26 ++++ tests/lex12.test | 49 +++++++ tests/lex13.test | 70 ++++++++++ tests/lex2.test | 2 + tests/lex3.test | 28 ++-- tests/lex4.test | 2 + tests/lex5.test | 21 +-- tests/lex6.test | 54 ++++++++ tests/lex7.test | 152 +++++++++++++++++++++ tests/lex8.test | 134 ++++++++++++++++++ tests/lex9.test | 102 ++++++++++++++ tests/lexcpp.test | 46 ++++++ tests/lexlib.test | 55 ++++++++ tests/lexvpath.test | 117 ++++++++++++++++ tests/suffix3.test | 26 +++-- tests/yacc.test | 7 +- tests/yacc10.test | 164 ++++++++++++++++++++++ tests/yacc11.test | 145 ++++++++++++++++++++ tests/yacc12.test | 26 ++++ tests/yacc13.test | 26 ++++ tests/yacc2.test | 15 +- tests/yacc3.test | 15 +- tests/yacc4.test | 18 +-- tests/yacc5.test | 24 ++-- tests/yacc6.test | 14 +- tests/yacc7.test | 8 +- tests/yacc8.test | 21 ++-- tests/yacc9.test | 56 ++++++++ tests/yaccpp.test | 21 ++- tests/yaccvpath.test | 27 ++-- tests/yl-static-checks.sh | 333 +++++++++++++++++++++++++++++++++++++++++++++ 38 files changed, 1920 insertions(+), 162 deletions(-) create mode 100755 tests/lex10.test create mode 100755 tests/lex11.test create mode 100755 tests/lex12.test create mode 100755 tests/lex13.test create mode 100755 tests/lex6.test create mode 100755 tests/lex7.test create mode 100755 tests/lex8.test create mode 100755 tests/lex9.test create mode 100755 tests/lexcpp.test create mode 100755 tests/lexlib.test create mode 100755 tests/lexvpath.test create mode 100755 tests/yacc10.test create mode 100755 tests/yacc11.test create mode 100755 tests/yacc12.test create mode 100755 tests/yacc13.test create mode 100755 tests/yacc9.test create mode 100644 tests/yl-static-checks.sh -*-*-*- Patches will follow soon. Regards, Stefano