本文へスキップ
BecomeCoder

Makefile / makeコース · 第3章 パターンとテクニック · レッスン9

パターンルール ― %.o: %.c

ブラウザで完結

導入

main.o: main.c / utils.o: utils.c / helper.o: helper.c … ファイルの数だけ同じ形のルールを書くのは苦行です。パターンルールを使えば「.c から .o を作る方法」をたった1回書くだけで、全部の .o に効きます。

説明

%(パーセント)は「任意の共通部分(ステム)」を表すワイルドカードです。

app: main.o utils.o helper.o
	cc -o $@ $^

%.o: %.c
	cc -c $< -o $@

%.o: %.c は「何か.o は、同じ名前の 何か.c から作る」という意味。main.o を作るときは %main にマッチし、依存は main.c、レシピの $<main.c$@main.o になります。utils.o でも helper.o でも同じルールが使い回されます。

flowchart LR
  PAT["パターンルール %.o: %.c"] --> A["main.o ← main.c"]
  PAT --> B["utils.o ← utils.c"]
  PAT --> C["helper.o ← helper.c"]

自動変数$< $@)とパターンルールは相性抜群で、この2つで「1つ書けば全ソースに効く」レシピになります。

やってみよう

make を実行して、1つのパターンルールから main.o / utils.o / helper.o が次々と作られるのを見ましょう。個別ルールを3つ書いた第2章と、行数を比べてみてください。ソースが10個あっても、このパターンルールは1つのままです。

演習

パターンルール %.o: %.c を使って、appmain.o utils.o helper.o の3つから作られるようにしましょう。make の出力に cc -c helper.c -o helper.o が現れれば成功です。

ヒント1を見る

app: の依存に helper.o を含め、%.o: %.c のパターンルールを1つ置きます。

ヒント2を見る

helper.c はこの端末に最初からあります(ls で確認)。レシピは cc -c $< -o $@

実際に動かしてみよう

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

Makefile + make(シミュレート)

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