Skip to content

Makefile basics — 依存関係とレシピ

TL;DR

Makefileには「何を、何から、どのコマンドで作るか」を書きます。以下は GNU Make + GCC + POSIX系シェル の例です。AIX標準の make と同一の構文範囲とは限りません。

Example

C overviewのコードを main.c に保存し、同じディレクトリに次の Makefile を置きます。レシピの行頭は実際のタブです。

makefile
CC = gcc
CPPFLAGS =
CFLAGS = -std=c99 -Wall -Wextra -Wpedantic -O2
LDFLAGS =
LDLIBS =

TARGET = app
OBJS = main.o

.PHONY: all clean
all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)

%.o: %.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

clean:
	rm -f $(TARGET) $(OBJS)
sh
make
./app
make clean

make は先頭の通常ターゲットである all を起点に処理します。更新がなければ再コンパイルしません。make clean はこの例の実行ファイルとオブジェクトだけを削除します。

Explanation

target: prerequisites の次のタブで始まる行がrecipeです。通常、ターゲットが存在しないか、依存先が新しければrecipeを実行します。

変数用途
CCCコンパイラ
CPPFLAGS-I-D などプリプロセス用
CFLAGSCのコンパイル用
LDFLAGSリンク用オプション
LDLIBS-lm などリンクするライブラリ

この例のrecipe内の自動変数は次の意味です。

自動変数GNU Makeでの意味
$@ターゲット名
$<最初の依存先
$^重複を除いたすべての依存先

%.o: %.c はパターンルール、.PHONY は実ファイルに対応しないターゲットの指定です。allclean というファイルがあっても処理できます。

Pitfalls

GNU Makeの構文として扱う

この例のパターンルールや $^.PHONY を、すべてのmakeで使えると考えないでください。AIXでは導入済みmakeの実装を確認します。

ヘッダーを追加したら依存関係も追加します。例えば main.capp.h をincludeするなら main.o: app.h を追加します。この最小例には自動依存関係生成を含めていません。

コンパイラオプションの変更はファイルの更新時刻による依存判定に現れないため、この例では make clean の後に再ビルドします。別コンパイラへ切り替える場合は CC だけでなくオプションも見直してください。

参考

GNU Make manual の Rules、Automatic Variables、Pattern Rules、Phony Targets。