autotools の出力について

最近,autotools に苦戦しているのでメモ.

autotools を使った時に make のログが以下のように表示される事があるが,これは configure の --enable-silent-rules が有効になっているため.

  CXX hoge.o
  CXX fuga.o
  AR libx.a

それ以外の方法では,configure.in に AM_SILENT_RULES([yes]) をつけるか,make V=0 で可能.
configure によって出力される Makefile を読んでも分かるが,このログは単純に @echo を使った簡単な方法で,自分で作っている Makefile にも使える.もうちょっとちゃんとしてるが,書くとこんな感じ.

DEFAULT_VERBOSE=0

V_CXX=@(V_CXX_at_$(V))
V_CXX_at_=@(V_CXX_at_$(DEFAULT_VERBOSE))
V_CXX_at_0=@echo " CXX " $@;

.cpp.o :
	$(V_CXX) $(CXX) -c -o $@ $<

autotools 上で,カスタムのビルドルール (例えば CUDA カーネルのビルドなど) では,通常この silent rule が動いてくれない.
そのため,automake 側で AM_V_GEN というマクロが用意されている.以下のように使う.

.cxx.o:
	$(AM_V_GEN) $(CXX) -c -o $& $<

とやると,ログには以下のように出力される.

  GEN hoge.o
  ...

カスタムのビルドルールで, silent rule が無効の時は出して欲しいが,有効のときは出力自体して欲しくない場合, AM_V_at で良さそう.AM_V_at は単独の at symbol が silent rule 有効時に設定される.

NVCC=nvcc

.cxx.o :
	$(AM_V_GEN) $(NVCC) -cuda -c -o _$*.cpp $<
	$(AM_V_at) $(CXX) -c -o $@ _$*.cpp

とすると,有効無効でログの出力は以下のようになる.

# silent rule 有効時
  GEN hoge.o

# silent rule 無効時
  nvcc -cuda -c -o _hoge.cpp hoge.cu
  g++ -c -o hoge.o _hoge.cpp

これでスマートな感じの出力が得られる.