たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

Makefileの存在意義: 依存性に基づく実行管理

Makefileの目的はファイル更新日とファイル依存木に基づいた無駄のないレシピ/コマンド実行である.

(Target, Prerequisites, Recipe) の3つ組を考える.
make Target すると Prerequisites ファイルの更新を確認し、更新があれば Recipe を実行し、なければパスする.
基本これだけ. 無駄のないレシピ実行が可能になる.

ここで思いつくのが「Prerequisites も古かったら作り直して欲しい」というもの.
Prerequisites の Rrerequisites、つまり前提条件の前提条件があればこれが実現できる. そうやって再帰的に辿って根元が新鮮だったら、木全体が新鮮だと確定できる.
Makeの賢いところは Target に Prerequisite を書くとファイルだけじゃなく その3つ組もチェックするようにしたこと.
例えば (C, B, Recipe_1) & (B, A, Recipe_2) と用意すれば、make C したときに B を確認 → そのとき Target=Bがあるからまず A を確認し、と再帰的に辿れるようにした.
Recipe_2==change_B と設定しておけば、Aに変更 → TargetB が走って B が変化 → TargetC が走る、という感じになる.
これで依存木を作り、make するだけで木を自動で辿りクレバーにレシピ実行/パスをしてくれるようになった.