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
これでスマートな感じの出力が得られる.