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はうまく騙されてくれる。

これでgdbでのデバッグ作業が楽になる〜。