make時に通常コンパイルとデバッグコンパイルを分ける。
makeはタイムスタンプと依存関係を洗い出しコンパイルの必要のあるものだけ再コンパイルしてくれる。しかし・・・それが仇になることもよくある話・・・。
例えば、makeとmake debugで、コンパイル条件を別けてコンパイルしたくなる。しかし、示しているターゲットは同じなので、上手くコンパイル出来ない。
all : make hoge degug : make hoge "CFLAGS=-g" hoge : hoge.c $(CC) $(CFLAGS) -o $@ $<
残念ながら,上手くいかない。どちらかがコンパイルされたら、依存が解消してしまう。cleanするしかない。
そこで、依存にターゲットを指定せず、フラグファイルを使って、makeに嘘をつく。
CFLAGS=-Wall target = hoge src = $(join $(target),.c) all : all.flag ; debug : debug.flag gdb $(target) all.flag : $(src) $(MAKEFILE_LIST) make clean $(CC) $(CFLAGS) -o $(target) $< touch $@ debug.flag : $(src) $(MAKEFILE_LIST) make clean $(CC) $(CFLAGS) -g -o $(target) $< touch $@ clean : rm -f *.flag rm -f $(target)
生成するターゲットは同じなので、フラグファイルall.flagとdebug.flagをダミーとして生成し、コンパイル前にcleanを実行する。
% make debug ...(略) (gdb) q % make ...(略) % make make: `all' is up to date.
ふふ。makeはうまく騙されてくれる。