- 2007/09/10 Mon
-
Q:-MMで依存関係を出力しているのに依存ファイルを更新してもMakefileと別ディレクトリにあるソースが再コンパイルされないのですが?
Q:だから、なんでそんな配置なの?-MMとか使わず自前で依存関係を記述するとか。
そもそも、$ cat Makefile TARGET = foo SRCS = foo.cc \ bar/bar.cc OBJS = $(SRCS:%.cc=%.o) DEPEND = $(TARGET).d CXXFLAGS = -Ibar all: $(TARGET) $(TARGET): $(OBJS) $(DEPEND): $(SRCS) $(CXX) $(CXXFLAGS) -MM $^ >$@ include $(DEPEND)
とかなっていた時、dependファイルには$ cat foo.d foo.o: foo.cc foo.h bar/bar.h bar.o: bar/bar.cc bar/bar.h
のようにbar/bar.oではなくbar.oの依存関係として出力されており、bar/bar.oには結局暗黙ルールが使われてしまう。
ので、$(DEPEND): $(SRCS) $(CXX) $(CXXFLAGS) -MM $^|perl -e '\ do{\ do{\ /([^\/]+)$$/ and $$IN =~ s/$$1/$$_/\ } foreach split(/\s/, qq{$(OBJS)});\ print $$IN\ } while($$IN = <>)' >$@
とかして-MMの出力結果を加工してみる。$(DEPEND): $(SRCS) $(CXX) $(CXXFLAGS) -MM $^|perl -e '\ do{\ sub{\ do{\ /([^\/]+)$$/ and $$_[0] =~ s/$$1/$$_/\ } foreach split(/\s/, qq{$(OBJS)})\ }->($$_);\ print\ } while(<>)' >$@
無名サブルーチンで一時変数を除去。$(DEPEND): $(SRCS) $(CXX) $(CXXFLAGS) -MM $^|perl -pe '\ sub{\ do{\ /([^\/]+)$$/ and $$_[0] =~ s/$$1/$$_/\ } foreach split(/\s/, qq{$(OBJS)})\ }->($$_)' >$@
-pでwhileとprintを省略。$(DEPEND): $(SRCS) $(CXX) $(CXXFLAGS) -MM $^|perl -0pe 'sub{do{/([^\/]+)$$/ and $$_[0]=~s/$$1/$$_/}foreach split(/\s/,qq{$(OBJS)})}->($$_)' >$@
ワンライナー。
ついでに繰り返しが無駄なので-0。