導入
make の本当のすごさは「前回から変わっていないものは作り直さない」ことです。ソースを1つ直しただけなのに全部を再コンパイルするのは時間の無駄。make はファイルの**更新時刻(タイムスタンプ)**を見て、必要なところだけビルドします。
説明
ターゲットが実ファイルになるルールで考えます。
app: main.c
cc -o app main.c
make の判断は単純です。「ターゲットのファイルが無い」または「依存ファイルのほうがターゲットより新しい」ときだけ、レシピを実行する。
flowchart TD
A{"app は存在する?"} -->|いいえ| B["レシピを実行してビルド"]
A -->|はい| C{"main.c は app より新しい?"}
C -->|はい| B
C -->|いいえ| D["最新の状態です(何もしない)"]
- 1回目の
make:appが無いのでビルド(cc -o app main.cが走り、appができる)。 - 2回目の
make:appがありmain.cも変わっていない → 「最新の状態です」 と出て何もしない。 main.cを編集(=新しくする)してからmake:main.cのほうが新しいので、もう一度ビルド。
やってみよう
順番に試してください。① make(ビルドされる)→ ② もう一度 make(「最新の状態です」)→ ③ touch main.c で main.c の時刻を更新 → ④ make(また main.c が新しいのでビルド)。ls -l を挟むと、更新の新しさが数字で見えます。この「差分ビルド」こそ make の心臓部です。
演習
make を1回実行してビルドし、続けてもう一度 make して「最新の状態です」と表示させてみましょう。そのあと touch main.c してから make すると、再びビルドが走ることを確かめてください。
ヒント1を見る
まず make、次に何もせず make。2回目に「app は最新の状態です」と出ます。
ヒント2を見る
touch main.c は main.c の更新時刻だけを今にするコマンドです。中身は変わりませんが、make は「新しくなった」と判断します。