本文へスキップ
BecomeCoder

Makefile / makeコース · 第1章 Makefileとは · レッスン4

依存関係とタイムスタンプ ― 変わったものだけ作り直す

ブラウザで完結

導入

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回目の makeapp が無いのでビルド(cc -o app main.c が走り、app ができる)。
  • 2回目の makeapp があり main.c も変わっていない → 「最新の状態です」 と出て何もしない。
  • main.c を編集(=新しくする)してから makemain.c のほうが新しいので、もう一度ビルド。

やってみよう

順番に試してください。① make(ビルドされる)→ ② もう一度 make(「最新の状態です」)→ ③ touch main.cmain.c の時刻を更新 → ④ make(また main.c が新しいのでビルド)。ls -l を挟むと、更新の新しさが数字で見えます。この「差分ビルド」こそ make の心臓部です。

演習

make を1回実行してビルドし、続けてもう一度 make して「最新の状態です」と表示させてみましょう。そのあと touch main.c してから make すると、再びビルドが走ることを確かめてください。

ヒント1を見る

まず make、次に何もせず make。2回目に「app は最新の状態です」と出ます。

ヒント2を見る

touch main.cmain.c の更新時刻だけを今にするコマンドです。中身は変わりませんが、make は「新しくなった」と判断します。

実際に動かしてみよう

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

Makefile + make(シミュレート)

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