Makeの依存関係を生成する方法には,色々選択肢がある.
手っ取り早いのは
depend:
makedepend -Y -- $(CPPFLAGS) -- *.cc とMakefileに書いておいて,
$ make depend
とすることで Makefile自身に依存関係を自動で記入する方法.
しかし,この方法には以下の二つの問題がある.
- make depend を実行しないと,依存関係は更新されない
- 依存関係がそのままMakefileに含まれている.(これは,cvs や svn で Makefile を共有するとき,とてつもなく不便になる).
後者の問題は,つぎのようにすることで解決できる.
depend:
makedepend -f- -Y -- $(CPPFLAGS) -- *.cc > .depends
-include .dependsただし,これでも 前者の問題は尚残されたまま.
この問題に対して make の info には,"Generating Prerequisites Automatically"という節が設けられている.この節では,
ことでうまく解決する方法が紹介されている.
そこで,この方法をもう少し改良して *.d を 適当なディレクトリへ保存するルールを書いてみた.
DEPDIR=.deps
$(DEPDIR)/%.d: %.cc
(rm -f $@; mkdir -p $(DEPDIR); \
$(CXX) -MM $(CXXFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
[ -s $@ ] || rm -f $@; rm -f $@.$$$$; )
$(DEPDIR)/%.d: %.c
(rm -f $@; mkdir -p $(DEPDIR); \
$(CC) -MM $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
[ -s $@ ] || rm -f $@; rm -f $@.$$$$; )
include $(OBJS:%.o=$(DEPDIR)/%.d)これは,すんごい便利.