これらの行の目的は、依存関係処理の問題に対処することです。ファイルfoo.dep
は今含まれてい
$(CC) -MM $*.c > $*.dep
:
を使用すると、ヘッダファイルbar.h
があると仮定して、ライン
#include "bar.h"
を含むソースファイルfoo.c
は今の依存ファイルを生成します
foo.o: foo.cc bar.h
ワンダフルです。私はmakefileが-include *.dep
のような行を持っていると確信しているので、Makeはfooの依存関係を正しく扱います。しかし、今度はfoo.c
を編集し、その#include
行を削除し、不要になったbar.h
を削除するとします。次回にmake foo
を試すときには、bar.h
を呼び出す古いfoo.dep
を読んでください。そのようなヘッダーはなく、作成方法はわかりませんし、中止してください。 makeはヘッダファイルが再構築されるまでヘッダが必要でないことを知りません。デプファイルは、ヘッダがなくなってMakeが必要と思うのでできません。
解決策の1つは、この状況が発生したときに(可能であれば、中止を行う前に)foo.dep
を削除することです。もう一つは、foo.dep
に行を追加することです:行方不明ヘッダーについてメイクの不安を和らげるだろう
bar.h:
。最初のアプローチは人間の注意を必要とし、2番目は自動化することができます。
@mv -f $*.dep $*.dep.tmp # rename foo.dep -> foo.dep.tmp
@sed -e 's|.*:|$*.o:|' < $*.dep.tmp > $*.dep # this does nothing and appears to be vestigal
@sed -e 's/.*://' \ # remove the target, leaving foo.c bar.h
-e 's/\\$$//' \ # remove line continuation marks, if any
< $*.dep.tmp | fmt -1 | \ # put each word on its own line
sed -e 's/^ *//' \ # remove leading whitespace
-e 's/$$/:/' \ # add a colon to the end of each line (making it a rule)
>> $*.dep # save the result as foo.dep
@rm -f $*.dep.tmp # delete the temporary file
gcc -MMコールで依存出力の問題を再フォーマットしています。何のために? dunno ... –