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))
参考文献
GNU make 日本語訳(Coop編) - テキスト変形関数