2016-09-18 16 views
1

私はメイクファイルに新しいですし、いくつかのコードを理解しようとしている:Makefileの説明

%.o:%.c 
    $(CC) $^ -c -Wall 
    $(CC) -MM $*.c > $*.dep 
    $(OBJECTDUMP) -d -M intel -S [email protected] 
    @mv -f $*.dep $*.dep.tmp 
    @sed -e 's|.*:|$*.o:|' < $*.dep.tmp > $*.dep 
    @sed -e 's/.*://' -e 's/\\$$//' < $*.dep.tmp | fmt -1 | \ 
     sed -e 's/^ *//' -e 's/$$/:/' >> $*.dep 
    @rm -f $*.dep.tmp 

誰かがコードの最後の5行が何をしているか説明していただけますか?

+1

gcc -MMコールで依存出力の問題を再フォーマットしています。何のために? dunno ... –

答えて

4

これらの行の目的は、依存関係処理の問題に対処することです。ファイル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 
+0

GCCオプション '-MP'は、' sed' jiggery-pokeryを必要とせずにこの問題に対処しています。 – user657267

+0

@ user657267:非常に真実。 jiggery-pokeryはそのオプションに先行しているので、不要にするために実装されています。 – Beta

3

$*は、第1行目のおおよそ%に対応します。

  • @mvラインが最初@sed行は($*make、ないシェルによって展開されているため)basename.o:と結腸に何を交換し、basename.dep.tmpに何があるか編集basename.dep.tmp
  • に古いbasename.depファイルを移動。
  • 第2の@sed行と次の行は、basename.dep.tmpファイルの別の変形をbasename.depの末尾に追加します。
  • @rm行は、一時的なbasename.dep.tmpファイルを削除します。

sedシーケンスのより徹底的な分析が.depファイルと正確に何fmt -1はあなたのためにするには何があるかのより詳細な知識が必要です。

しかし、目標は、ソースファイルに適用される依存関係を、コンパイラからの情報に基づいて更新し、プログラマに合うようにマッサージすることです。なぜ私には分かりませんか。