例えば、test.cとtest.hがあり、test.cはtest.hをincludeしていたとしよう。
依存関係を設定せずにMakefileを作ると、一度ビルドしてからtest.hを変更しても、makeで作り直してくれない。
では、依存関係を"gcc -MM"で作ってincludeさせるとしよう。
01: SRC=test.c 02: OBJ=test.o 03: BIN=tst 04: 05: all: $(BIN) 06: 07: $(BIN):$(OBJ) 08: gcc -o $(BIN) $(OBJ) 09: 10: $(OBJ): 11: gcc -c $(SRC) 12: 13: clean: 14: -rm -rf $(OBJ) $(BIN) .Depend 15: 16: .Depend: 17: gcc -MM $(SRC) > .Depend 18: 19: -include .Depend
これで初回ビルドすると、こう。
$ make
gcc -MM test.c > .Depend
gcc -c test.c
gcc -o tst test.o
2回目は、こう。
$ make
make: Nothing to be done for 'all'.
test.hだけ変更すると、こう。
$ make
gcc -c test.c
gcc -o tst test.o
言うことなしだ。
が、cleanする。
$ make clean
rm -rf test.o tst .Depend
ここまではよいのだが、続けてcleanする。
$ make clean
gcc -MM test.c > .Depend
rm -rf test.o tst .Depend
そう、一度.Dependを生成してから削除するのだ。。。
細かい動作は知らないのだが、.Dependをincludeするときに、依存を調べてしまうんじゃないだろうか。
GNU make 日本語訳(Coop編) - makeの実行方法
$(MAKECMDGOALS)などというものがあるのか!
01: SRC=test.c 02: OBJ=test.o 03: BIN=tst 04: 05: all: $(BIN) 06: 07: $(BIN):$(OBJ) 08: gcc -o $(BIN) $(OBJ) 09: 10: $(OBJ): 11: gcc -c $(SRC) 12: 13: clean: 14: -rm -rf $(OBJ) $(BIN) .Depend 15: 16: .Depend: 17: ifneq ($(MAKECMDGOALS),clean) 18: gcc -MM $(SRC) > .Depend 19: endif 20: 21: -include .Depend
$ make clean
rm -rf test.o tst .Depend
$ make clean
rm -rf test.o tst .Depend
そうそう、それでいいんだよ、それで!
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。