導入
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 を使って、app が main.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 $@。