Make添加意外的mv命令

时间:2012-09-11 03:22:02

标签: makefile bison flex-lexer

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

user@dk ~/calc ±master⚡ » make clean                                                                  
rm -rf lex.yy.c calc.tab.h calc.tab.c calc
user@dk ~/calc ±master » make
bison -d calc.y
flex calc.lex
g++ -o calc calc.tab.c lex.yy.c calc.c
user@dk ~/calc ±master⚡ » make clean
rm -rf lex.yy.c calc.tab.h calc.tab.c calc
user@dk ~/calc ±master » touch calc.y
user@dk ~/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简化为最低限度以重现这一点。使用bison创建两个文件:calc.tab.ccalc.tab.h。我没有.h文件作为目标,因为我不确定这样做的正确方法是什么。对bison的调用将生成两个calc.tab。*文件,因此这不是我主要关注的问题。

构造这个makefile的正确方法是什么,以避免生成对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

1 个答案:

答案 0 :(得分:2)

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

%.c : %.y
    $(YACC.y) $<
    mv -f y.tab.c $@

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

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

相关问题