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 »
