makeとを使用するプロジェクトではbison、コンパイルさgrammar.tab.cれた文法が文法入力grammar.yに依存すること、各オブジェクト ファイルが対応するソース ファイル (を含むgrammar.tab.o) に依存すること、および実行可能ファイルがすべてのオブジェクト ファイルに依存することを指定するのが困難です。
問題は、makegrammar.tab.c がまだ存在しないときに実行すると、それをビルドしようとする試みがないことを意味し、実行可能ファイルがビルドされたときにyyparse関数が欠落していることです。
私Makefileは:
CFLAGS = -g -Wall
YACC = bison -d -r all
OBJ=$(patsubst %.c, %.o, $(wildcard *.c))
HEADERS=grammar.tab.h hex.h compiler.h types.h
all: grammar.tab.h c
clean:
rm -f $(OBJ) *.tab.c *.tab.h c c.exe *.output
c: $(OBJ)
$(CC) -o $@ $(OBJ) $(CFLAGS)
grammar.tab.c: grammar.y
$(YACC) grammar.y
grammar.tab.h: grammar.y
$(YACC) grammar.y
%.o: %.c $(HEADERS)
$(CC) -c $< $(CFLAGS)
私がそれを変更した場合:
OBJ=$(patsubst %.c, %.o, $(wildcard *.c)) grammar.tab.o
次に、コンパイルされた文法がまだ存在しない場合は構築します。しかし、それが既に存在する場合、実行可能ファイルをビルドするときに、yyparse2 回提供されるというエラーが発生します (おそらく、 2 回$OBJ含まれているためgrammar.tab.o)。
私が目指しているのは、次のような Makefile です。
- コマンドで実行可能ファイルを正しくビルドし、
make必要に応じて中間ファイルを再ビルドします。 - ディレクトリ内のすべての
*.cファイルを取得します (つまり、新しいソース ファイルが追加されたときに変更する必要はありません)。 - 読みやすく、理解しやすい。
make一度に1 つか 2 つだけである限り、新しい機能を学ぶことは気にしません。
他の人の文法構築 Makefile はどのように機能しますか?
編集OK、それらは素晴らしい答えです。最小の変更だったので、フィルターを外したものを使用しました。私が話していることをみんなが正確に理解しているように見えて本当にうれしいです -- automake のような複雑なものを使うように言われるのが心配でした ;-)。
みんな、ありがとう。