本文へスキップ
BecomeCoder

Makefile / makeコース · 第2章 実用的なビルド · レッスン6

.PHONY と clean ― ファイルでないターゲット

ブラウザで完結

導入

ビルドで散らかった .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

cleanrm で生成物を消すだけで、clean という名前のファイルは作りません。だから make 的には「clean はいつ実行しても最新にならない=毎回走る」ターゲットです。

ではなぜ .PHONY: clean が要るのか? もし偶然 clean という名前のファイルが存在すると、make は「clean はもうあるじゃないか」と勘違いして rm を実行しなくなります。.PHONY: clean は「clean はファイル名ではなく“合図”だ」と make に教える宣言で、こうした事故を防ぎます。all / test / install なども同じ理由で .PHONY にします。

やってみよう

make でビルド → lsapp などができたのを確認 → 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 すれば元に戻ります。

実際に動かしてみよう

上のエディタが Makefile、下が端末です。Makefile を確かめたら端末に `make` と打って Enter を押すと、どのレシピがどの順で走るかが表示されます。`ls` で作業中のファイル(main.c などが最初から置いてあります)、`touch main.c` のあと `make` で差分ビルドの様子、`make -n` で「実行せず何が走るか」を確かめられます。各レッスンは毎回まっさらな状態から始まり、「最初からやり直す」でいつでも戻せます。

Makefile + make(シミュレート)

Makefile を書いて make を試せる学習用環境を読み込みます(本物のGNU Makeではなく、依存解決とタイムスタンプ再ビルドを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。