Make自動変数リファレンス

Makeの自動変数をマスター:$@、$<、$^、$*、$?、$|、およびそれらのディレクトリ/ファイルバリアント。一般的なビルドルールでの各変数の実用的な例。

Reference

詳細な説明

Makeにおける自動変数

自動変数はMakeが各ルールに対して設定し、ターゲットと前提条件に関する情報を提供します。レシピ内でファイル名をハードコードする必要がなくなります。

コア変数

変数 意味
$@ ターゲットファイル名 main.o: main.c$@ = main.o
$< 最初の前提条件 main.o: main.c utils.h$< = main.c
$^ すべての前提条件 main: a.o b.o$^ = a.o b.o
$* パターンのステム %.o: %.csrc/main.oにマッチする場合$* = src/main
$? ターゲットより新しい前提条件 変更されたファイルのみ
`$ ` order-only前提条件

実践的な例

コンパイルルール:

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

$@はビルドされる.oファイル、$<.cソースファイルです。

リンクルール:

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

$@は最終バイナリ、$^はすべてのオブジェクトファイルです。

アーカイブ:

libutils.a: $(LIB_OBJS)
	ar rcs $@ $?

$?はアーカイブより新しいオブジェクトファイルのみを含み、不必要な再アーカイブを避けます。

ディレクトリとファイルのバリアント

各変数にはD(ディレクトリ)とF(ファイル)のバリアントがあります:

  • $(@D) — ターゲットのディレクトリ部分(src/main.oからsrc
  • $(@F) — ターゲットのファイル部分(src/main.oからmain.o
  • $(<D)$(<F) — 最初の前提条件に対して同様
%.o: %.c
	@mkdir -p $(@D)
	$(CC) $(CFLAGS) -c -o $@ $<

$(@D)はコンパイル前に出力ディレクトリを作成し、out-of-treeビルドをサポートします。

Order-Only前提条件

$(BIN_DIR)/app: src/main.c | $(BIN_DIR)
	$(CC) -o $@ $<

$(BIN_DIR):
	mkdir -p $@

|セパレータは$(BIN_DIR)をorder-onlyとしてマークします。存在する必要がありますが、タイムスタンプはチェックされません。

ユースケース

C/C++プロジェクトのビルドシステムのパターンルールを書く際に、Makefileレシピでファイルパスをハードコーディングせずに自動変数を正しく理解して使用する必要がある場合に使用します。

試してみる — Makefile Generator

フルツールを開く