2018/02/14

[c/c++][make]dependを作成せずにcleanしたい

例えば、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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。