導入
レシピの中で「ターゲット名」や「依存ファイル名」をもう一度手で書くのは面倒だし、書き間違いのもと。make には、ルールごとに中身が変わる自動変数が用意されています。これを使うとレシピがぐっと短く、汎用的になります。
説明
よく使う自動変数はこの3つです。
| 自動変数 | 意味 |
|---|---|
$@ | ターゲット名 |
$< | 最初の依存ファイル |
$^ | すべての依存ファイル(スペース区切り) |
先ほどのビルドを自動変数で書き直します。
app: main.o utils.o
cc -o $@ $^
main.o: main.c
cc -c $< -o $@
utils.o: utils.c
cc -c $< -o $@
app のルールでは $@ が app、$^ が main.o utils.o に展開され、cc -o app main.o utils.o になります。main.o のルールでは $< が main.c、$@ が main.o なので cc -c main.c -o main.o。ルールごとに中身が自動で変わるのがポイントです。
もう1つ、$? は「ターゲットより新しい依存だけ」を表します。差分ビルドのログを出すときなどに便利です。
やってみよう
make して、各ルールで自動変数がどう展開されたかを見比べましょう。main.o と utils.o でレシピの文字列は同じなのに、展開後のコマンドが違うことに注目してください。この「同じ書き方で使い回せる」性質が、次章のパターンルールにつながります。
演習
app のリンクのレシピを、ファイル名を直書きせず cc -o $@ $^ の形にして、make で cc -o app main.o utils.o が生成されるようにしましょう。
ヒント1を見る
$@ はターゲット(app)、$^ は依存すべて(main.o utils.o)に展開されます。
ヒント2を見る
main.o / utils.o 側のルールも cc -c $< -o $@ にしておくと、全体が自動変数で統一できます。