2012-09-11 52 views
3

我正在使用makefile来构建我的flex/bison项目。我遇到问题,因为它正在添加对yaccmv命令的调用,从而覆盖我的一个文件。添加意外的mv命令

[email protected] ~/calc ±master⚡ » make clean                 
rm -rf lex.yy.c calc.tab.h calc.tab.c calc 
[email protected] ~/calc ±master » make 
bison -d calc.y 
flex calc.lex 
g++ -o calc calc.tab.c lex.yy.c calc.c 
[email protected] ~/calc ±master⚡ » make clean 
rm -rf lex.yy.c calc.tab.h calc.tab.c calc 
[email protected] ~/calc ±master » touch calc.y 
[email protected] ~/calc ±master » make 
bison -d calc.y 
flex calc.lex 
yacc calc.y 
mv -f y.tab.c calc.c 
g++ -o calc calc.tab.c lex.yy.c calc.c 
... Failure ... 

我简化了makefile到最低限度来重现这一点。使用野牛创建两个文件:calc.tab.ccalc.tab.h。我没有.h文件作为目标,因为我不确定正确的方法是什么。对野牛的调用将生成calc.tab。*文件,因此这不是我主要关心的问题。

什么是正确的方式来构建这个生成文件,以避免生成调用yacc和mv?

calc: calc.tab.c lex.yy.c calc.c 
    g++ -o calc calc.tab.c lex.yy.c calc.c 

calc.tab.c: calc.y 
    bison -d calc.y 

lex.yy.c: calc.lex calc.tab.h 
    flex calc.lex 

clean: 
    rm -rf lex.yy.c calc.tab.h calc.tab.c calc 

回答

2

mv来自内置的规则make的,其中包含:

%.c : %.y 
    $(YACC.y) $< 
    mv -f y.tab.c [email protected] 

看起来make正试图从calc.y创建calc.c。一些解决方案是自己重新定义该规则,或将calc.y重命名为不会为calc.c触发该规则或禁用make的内置规则的内容。

您可以列出所有内置规则make -p

+0

有道理。我不知道隐含的规则。谢谢。 – user1657033