On 3/29/2010 2:18 PM, tom honermann wrote:
   .INTERMEDIATE: yacc.ts

   all: y.tab.h y.tab.c y.output y.tab.o

   clean:
           rm -f y.tab.h y.tab.c y.output y.tab.o

   grammar.y:
           @touch $@

   yacc.ts: grammar.y
           @echo "Running yacc..."
           @sleep 1
           @touch y.tab.h y.tab.c y.output

   y.tab.h y.tab.c y.output: yacc.ts

   y.tab.o: y.tab.c y.tab.h
           @echo "Compiling y.tab.c..."
           @sleep 1
           @touch $@

The only problem I could find with this approach is that downstream targets might not get rebuilt as expected. For example, run gmake once to build everything, then remove y.output and run gmake again. Using make 3.81 on Linux, y.output is rebuilt which also rebuilds y.tab.c and y.tab.h, but y.tab.o is not rebuilt (as might be expected since y.tab.h and y.tab.c were regenerated). This makes sense because gmake has no way of knowing that rebuilding y.output would also regenerate y.tab.h and y.tab.c. A full solution for static multiple target rules would recognize that these files had been regenerated and would also rebuild y.tab.o. But, I think this is good enough for my use cases.
This isn't working as well as I had at first thought. For example, updating grammar.y doesn't always result in y.tab.o getting rebuilt. This can be reproduced consistently in parallel make invocations:

   rtdc60007stdb:$ gmake clean
   rm -f y.tab.h y.tab.c y.output y.tab.o
   rtdc60007stdb:$ gmake
   Running yacc...
   Compiling y.tab.c...
   rtdc60007stdb:$ touch grammar.y
   rtdc60007stdb:$ gmake
   Running yacc...
   Compiling y.tab.c...
   rtdc60007stdb:$ gmake
   gmake: Nothing to be done for `all'.

   rtdc60007stdb:$ gmake clean
   rm -f y.tab.h y.tab.c y.output y.tab.o
   rtdc60007stdb:$ gmake -j
   Running yacc...
   Compiling y.tab.c...
   rtdc60007stdb:$ touch grammar.y
   rtdc60007stdb:$ gmake -j
   Running yacc...
   rtdc60007stdb:$ gmake -j
   Compiling y.tab.c...
   rtdc60007stdb:$ gmake -j
   gmake: Nothing to be done for `all'.

Note that the second run using '-j' required an extra 'gmake' invocation before everything was up to date. Bummer.

Tom.


_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to