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: %.cがsrc/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レシピでファイルパスをハードコーディングせずに自動変数を正しく理解して使用する必要がある場合に使用します。