導入
ビルドで散らかった .o や実行ファイルを消したくなります。慣習として clean というターゲットを作ります。ただし clean は「ファイルを作る」ターゲットではないので、.PHONY という宣言とセットで書くのが定石です。
説明
clean を足し、.PHONY を付けます。
app: main.o utils.o
cc -o app main.o utils.o
main.o: main.c
cc -c main.c
utils.o: utils.c
cc -c utils.c
clean:
rm -f app main.o utils.o
.PHONY: clean
clean は rm で生成物を消すだけで、clean という名前のファイルは作りません。だから make 的には「clean はいつ実行しても最新にならない=毎回走る」ターゲットです。
ではなぜ .PHONY: clean が要るのか? もし偶然 clean という名前のファイルが存在すると、make は「clean はもうあるじゃないか」と勘違いして rm を実行しなくなります。.PHONY: clean は「clean はファイル名ではなく“合図”だ」と make に教える宣言で、こうした事故を防ぎます。all / test / install なども同じ理由で .PHONY にします。
やってみよう
make でビルド → ls で app などができたのを確認 → make clean で消える → もう一度 ls。そのあと make すると、消えた分がまた作り直されます。make clean は何度打っても毎回 rm が走ることも見てみましょう(=phony なターゲットの性質)。
演習
make でビルドしたあと make clean を実行し、生成物が消えることを確認しましょう。
ヒント1を見る
make clean と打つと、clean ターゲットのレシピ rm -f app main.o utils.o が走ります。
ヒント2を見る
消えたか確かめるには ls を使います。make clean のあと make すれば元に戻ります。