本文へスキップ
BecomeCoder

Makefile / makeコース · 第2章 実用的なビルド · レッスン7

変数で繰り返しを減らす

ブラウザで完結

導入

cc というコンパイラ名やオプションを、あちこちのレシピに直書きすると、変えたいときに全部直すハメになります。変数にまとめておけば、1か所直すだけで済みます。

説明

変数は 名前 = 値 で定義し、$(名前) で使います。

CC = cc
CFLAGS = -Wall

app: main.c utils.c
	$(CC) $(CFLAGS) -o app main.c utils.c

make すると $(CC)cc$(CFLAGS)-Wall に展開され、cc -Wall -o app main.c utils.c が走ります。定石の変数名があります。

変数意味
CCCコンパイラ(既定 cc
CFLAGSコンパイルオプション
LDFLAGSリンク時のオプション

代入には種類があります。

  • = … 使うときに展開(再帰的変数)
  • := … その場で1回だけ展開(単純変数)
  • ?= … まだ定義されていなければ設定
  • += … うしろに追記

やってみよう

make して展開結果を確認したら、CFLAGS = -WallCFLAGS = -Wall -O2 に変えて再度 make。コマンドが変わります。コマンドラインから make CFLAGS=-g と渡すと、その場だけ上書きできることも試してみましょう。

演習

CC を使ったまま、CFLAGS に最適化オプション -O2 を追加して、make の出力に -O2 が現れるようにしましょう。

ヒント1を見る

CFLAGS = -Wall -O2 のようにスペース区切りで足します。

ヒント2を見る

レシピ側で $(CFLAGS) を使っていれば、変数を直すだけで反映されます。

実際に動かしてみよう

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

Makefile + make(シミュレート)

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