Makefile重修班

前几天一直在研究boost的spirit库。很强大也很难使用,根本没有轻量级的特点。转而研究lex/yacc。

但是在给lex/yacc写Makefile的时候出了点问题。

%.yy.o : %.yy.c %.tab.h
        $(CC) -c -o $@ $*.yy.c

%.yy.c : %.l
        $(LEX) -o $@ $<

%.tab.c %.tab.h : %.y
        $(YACC) -d -o $*.tab.c $<

后两个规则把lex和yacc文件编译成对应的.yy.c、.tab.c和.tab.h。第一个规则是确保在编译.yy.c之前,先得到对应的.tab.h文件。

保存,make,bin文件一切正常。但是.yy.c和.tab.h却不翼而飞。煮熟的鸭子要飞走……

重新读了一下陈皓那本跟我一起学写Makefile关于隐含规则的一章。原来这种由隐含规则链生成的中间文件默认是会被rm -f删除的。如果不想删除这些中间文件,应该加上一行告诉make它们是珍贵的:

.PRECIOUS: %.yy.c %.tab.c %.tab.h

不过这样做通常并无必要,因为位于隐含规则链中间的文件最后修改时间是无关紧要的,只要链的源头新于链的目标,在任何时候整条链都需要重新编译。及时保存了中间文件也不可能让编译从中间开始。当然,如果可能需要手动修改中间文件,这样做也许是必要的。

你可能会感兴趣

on December 13th, 2008 | No Comments »

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>