【メイク】

Make とは?

最終更新:
💡 依存関係をたどり、必要な成果物を作る職人

Makefileに記述した依存関係と作り方に従い、ファイルの生成などを自動化するビルドツール。通常のファイルのルールでは、成果物の有無と更新日時を基に、必要な作業を判断する。

📌 このページのポイント
依存関係に沿って、必要な成果物を更新Makefile:依存関係とレシピ通常は成果物の有無と更新日時で判断main.c更新されたutils.c変更なしmain.o再コンパイルutils.o再利用実行ファイルこの例では、実行ファイルもリンクし直す
矢印は材料から成果物を作る関係です。main.cだけが新しくなり、他の必要な依存ファイルは変わらず、依存関係も正しく記述されている例。main.oの更新後、実行ファイルもリンクし直します。
ひよこ ひよこ
Makeって名前はシンプルだけど、何をしてくれるの?
ペンギン先生 ペンギン先生
Makefileに書いた依存関係と作り方に従って、必要なコマンドを実行するよ。例えば、ソースコードから中間のファイルを作り、それらをリンクして実行ファイルを作る。依存先から順に更新することで、手順を自動化するんだ
ひよこ ひよこ
毎回全部コンパイルし直すの?
ペンギン先生 ペンギン先生
通常のファイルのルールでは、成果物が存在しないか、依存ファイルより古ければ作り直すよ。main.cだけが新しくなった例なら、main.oを作り直し、それを使う実行ファイルもリンクし直す。Makeが毎回ファイルの内容を比較して差分を見つける、という仕組みではないんだ
ひよこ ひよこ
Makefileってどんな感じで書くの?
ペンギン先生 ペンギン先生
ターゲット、依存ファイル、レシピという作り方を書くよ。例えばmain.oはmain.cからコンパイルして作る、といったルールだね。ヘッダーも材料なら依存関係に含める。必要な依存関係を記述し忘れると、変更したのに成果物が更新されないことがあるんだ
ひよこ ひよこ
C言語以外でも使えるの?
ペンギン先生 ペンギン先生
コマンドで行える文書の生成やテストなどにも使えるよ。cleanのように、同名のファイルがあっても実行したい作業は、GNU Makeでは.PHONYでファイルのターゲットと区別できる。更新日時だけで判断する通常のルールとは扱いが違うんだ
ひよこ ひよこ
タブとスペースの違いでエラーになるって本当?
ペンギン先生 ペンギン先生
GNU Makeでは、通常レシピ行の先頭にタブを使うよ。Makefileの全てのインデントがタブ必須、という意味ではない。また.RECIPEPREFIXで先頭文字を変えたり、ルールと同じ行のセミコロンの後にレシピを書いたりする形式もあるんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Make」って出てきたら「依存関係と作り方に従って、必要な成果物を作るツール」と思えばだいたいOK!
📖 おまけ:英語の意味
「Make」 = 作る・生成する
💬 ソースコードなどから成果物を作る、という名前だよ。ここでは主にGNU Makeのマニュアルに沿って、ファイルの依存関係とレシピの仕組みを説明しているんだ

参考資料

← 用語集にもどる