3

私はmakefileを使用してflex/bisonプロジェクトをビルドしています。呼び出しyaccmvコマンドを追加してファイルの1つを上書きしているため、問題が発生しています。

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を使用して2つのファイルを作成します:calc.tab.ccalc.tab.h。.hファイルをターゲットとして使用していません。これを行う正しい方法がわからないためです。bisonを呼び出すと、両方のcalc.tab。*ファイルが生成されるため、これは私の主な関心事ではありません。

yaccとmvの呼び出しが生成されないように、このmakefileを構造化する正しい方法は何ですか?

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
4

1 に答える 1

2

は、次のものを含むの組み込みルールに由来しますmvmake

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

からmake作成しようとしているようです。これに対するいくつかの解決策は、そのルールを自分で再定義するか、そのルールをトリガーしない名前に変更するか、の組み込みルールを無効にすることです。calc.ccalc.ycalc.ycalc.cmake

ですべての組み込みルールを一覧表示できますmake -p

于 2012-09-11T04:36:26.027 に答える