本文へスキップ
BecomeCoder

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

ルールの三要素 ― ターゲット・依存・レシピ

ブラウザで完結

導入

make の世界はすべて「ルール」でできています。ルールは3つの部品からなります。ターゲット・依存関係(prerequisites)・レシピ。この3つの関係が分かれば、Makefile の8割は読めるようになります。

説明

ルールの一般形はこうです。

build: main.c
	echo "コンパイルします: main.c"

図にするとこうなります。

flowchart LR
  P["依存: main.c"] --> T["ターゲット: build"]
  T --> R["レシピ: echo ..."]
  • ターゲットbuild): このルールで作りたいもの/実行したい名前。コロン : の左。
  • 依存関係main.c): ターゲットを作るのに必要なファイル。コロンの右。
  • レシピecho ...): ターゲットを作る手順。タブ字下げで、依存がそろってから実行される。

make build(または先頭ターゲットなので単に make)とすると、make はまず依存の main.c があるか確認し、あればレシピを実行します。main.c は最初から用意されているので、レシピが動きます。

やってみよう

make を実行してレシピが走るのを確認しましょう。次に cat main.c で依存ファイルの中身も覗いてみてください。依存に、存在しない nofile.c を書いて make するとどうなるかも試してみましょう(「ルールがありません」と怒られます)。

演習

ターゲット名を compile、依存を utils.c、レシピを echo "utils.c をコンパイル" にしたルールを書き、make で実行してみましょう。

ヒント1を見る

compile: utils.c と書き、次の行をタブ字下げして echo "utils.c をコンパイル"

ヒント2を見る

utils.c はこの端末に最初から置いてあります(ls で確認できます)。

実際に動かしてみよう

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

Makefile + make(シミュレート)

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