グレインの備忘録

プログラミング関係とかをつらつらと。

Makefile覚書

毎回作るときに忘れるのでメモ。

変数

定義

変数を作るときは変数名 = 値でよい。$(変数名)=としてはならない。

CXX = g++

参照

参照するときは$(変数名)で参照

$(CXX) $< -o $@

自動変数

ターゲットの名前などを参照できる。

$@ : ターゲットファイル名
$% : ターゲットがアーカイブメンバだったときのターゲットメンバ名
$< : 最初の依存するファイルの名前
$? : ターゲットより新しいすべての依存するファイル名
$^ : すべての依存するファイルの名前
$+ : Makefileと同じ順番の依存するファイルの名前
$* : サフィックスを除いたターゲットの名前

一般規則

%.拡張子で一般的な規則を記述可能。

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

サフィックスルール

単に「.cファイルから.oファイルの拡張子に変換する」といったルールの場合は、以下のようにも書ける。

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

ただし、これは互換性のために残された機能で、使うべきではない。

さらには、これは.SUFFIXES変数に登録された拡張子しかサフィックスとして扱わない。 自前で登録するには、

#.SUFFIXES:   ←空の.SUFFIXESを一旦定義することで既存のサフィックスを削除可能
.SUFFIXES: .c .o

暗黙のルール

Makefileには定義しなくてもデフォルトのルールがいくつか用意されている。例えば、

.c.o:
    $(CC) -c $< -o $@ $(CFLAGS)
.cpp.o:
    $(CXX) -c $< -o $@ $(CXXFLAGS)

など。これらを無効にするには、

$ make -r

としてmakeする。

変数操作

wildcard - ディレクトリ内のファイル検索

SRCS = $(wildcard *.c)

サフィックス置換

OBJS = $(SRCS:.c=.o)
#または
OBJS = $(patsubst %.c, %.o, $(SRCS))

addprefix - 各語にプレフィックスをつける

OBJS = $(addprefix $(STAGEDIR)/,$(SRCS:.c=.o))

参考文献

トリビアなmakefile入門

GNU make 日本語訳(Coop編) - テキスト変形関数

GNU make 日本語訳(Coop編) - 暗黙ルールの利用

Makeでヘッダファイルの依存関係に対応する - wagavulin's blog