2012-09-11 53 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