$(warning ...)
で変数の値を表示する
Makefileのどこかに
$(warning MAKE = $(MAKE))
$(warning CC = $(CC))
$(warning CFLAGS = $(CFLAGS))
と書いておいてmake
を実行すると
Makefile:58: MAKE = /Applications/Xcode.app/Contents/Developer/usr/bin/make
Makefile:59: CC = gcc
Makefile:60: CFLAGS = -W -Wall -Wno-unused-parameter -pedantic -g -O0 -DDEBUG -I.
のように変数の値が表示される。
どのターゲットがなぜコンパイルされたのかを調べる
OLD_SHELL := $(SHELL)
SHELL = $(warning [Making: $@] [Dependencies: $^] [Changed: $?])$(OLD_SHELL)
と書いておくてmake
を実行すると以下のように表示される。
Makefile:39: [Making: a.out] [Dependencies: hage.o hoge.o] [Changed: hage.o]
ここには次の情報が含まれている:
- Makefileの39行目のルールによりコンパイルを実行します(…のはずだが実際はルールは38行目に書かれている。1行ずれている?)
- a.outを作成します
- a.outはhage.o、hoge.oに依存します
- 依存ファイルのうち、hage.oが変更されています
実際に実行すると同じ行が2回以上表示されることがあるが、これはターゲットを作成するためのコマンドが2行以上に渡っているためと思われる(Makefileでは別の行に書いたコマンドは別のシェルにより実行されるので)。
参考
Debugging Makefiles 本記事の元ネタ
remake GNU makeにパッチをあて、デバッグに役立つ情報を出すようにしたものらしい。それに留まらず高機能なmakeデバッガになっているとか。