表示テーマ
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 cleanmake は先頭の通常ターゲットである all を起点に処理します。更新がなければ再コンパイルしません。make clean はこの例の実行ファイルとオブジェクトだけを削除します。
Explanation
target: prerequisites の次のタブで始まる行がrecipeです。通常、ターゲットが存在しないか、依存先が新しければrecipeを実行します。
| 変数 | 用途 |
|---|---|
CC | Cコンパイラ |
CPPFLAGS | -I、-D などプリプロセス用 |
CFLAGS | Cのコンパイル用 |
LDFLAGS | リンク用オプション |
LDLIBS | -lm などリンクするライブラリ |
この例のrecipe内の自動変数は次の意味です。
| 自動変数 | GNU Makeでの意味 |
|---|---|
$@ | ターゲット名 |
$< | 最初の依存先 |
$^ | 重複を除いたすべての依存先 |
%.o: %.c はパターンルール、.PHONY は実ファイルに対応しないターゲットの指定です。all や clean というファイルがあっても処理できます。
Pitfalls
GNU Makeの構文として扱う
この例のパターンルールや $^、.PHONY を、すべてのmakeで使えると考えないでください。AIXでは導入済みmakeの実装を確認します。
ヘッダーを追加したら依存関係も追加します。例えば main.c が app.h をincludeするなら main.o: app.h を追加します。この最小例には自動依存関係生成を含めていません。
コンパイラオプションの変更はファイルの更新時刻による依存判定に現れないため、この例では make clean の後に再ビルドします。別コンパイラへ切り替える場合は CC だけでなくオプションも見直してください。
Related
参考
GNU Make manual の Rules、Automatic Variables、Pattern Rules、Phony Targets。