2016-08-10 3 views
0

私は、Paul Smithのガイドhereを使ってGNU make 4.0用のmakefileをセットアップしました。 .dファイルが削除された場合を除き、すべてが動作するように見えますが、次のファイルで再作成されません。make all`make`に不足している依存ファイルを自動生成させるには?

%.o : %.c $(DEPDIR)/%.d 
     $(COMPILE.c) $(OUTPUT_OPTION) $< 
     $(POSTCOMPILE) 

パウロの説明:

... $(DEPDIR)/%.d

宣言をそれが欠けている場合は自動生成された依存関係ファイルがターゲットの依存関係としてリストされている場合、ガイドによると、その後、makeはそれを再作成しますターゲットの前提条件として として生成された依存関係ファイルが存在しない場合は、ターゲットが に再構築されます。

これは私の経験ではありません。 .dファイルを削除してmake allを再発行すると、すべてが最新であると判断されます。 .cの再コンパイルを強制すると、もちろん依存関係ファイルが再作成されますが、ファイルが見つからないときに再構築されるはずの依存ファイルはありません。私のメイクファイルから

抜粋(これは私はそれがGCCを使用していないIBMの上ですが、MAKEDEPパラメータは依存関係ファイルの作成が原因):依存関係ファイルを生成するこの方法にこだわっ

POSTCCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d 

%.MODULE: %.C 
%.MODULE: %.C $(DEPDIR)/%.d 
    @system -v "crtcmod module($(OBJLIB)/$*) srcstmf('$<') MAKEDEP('$(DEPDIR)/$*.Td')" 
    @$(POSTCCOMPILE) 

. . . 

$(DEPDIR)/%.d: ; 
.PRECIOUS: $(DEPDIR)/%.d 

. . . 

-include $(wildcard $(DEPDIR)/*.d) 

makeには.d個のファイルがありません(すべてのCファイルに含まれているとは限りません)。

答えて

0

これらの行は両方とも持っていましたか?

%.MODULE: %.C 
%.MODULE: %.C $(DEPDIR)/%.d 

私は2番目の行は十分なものでなければならないと考えている、と最初の行は$(DEPDIR)/%.dを必要としない%.MODULEを構築するためのルールを見つけることmakeを引き起こす可能性があります。

+0

リンクされた記事によると、最初の行は、その項目のビルトインルールを削除します。おそらく私の場合は必要ではないでしょう。なぜならGNU makeはおそらくモジュール用の組み込みルールを持っていないからです。ちょうど安全であるために、私はそれを取り出しました - 効果なし。 – smeep

2

hm。欠けているパターンの前提条件は、パターンターゲットの再構築を強制しないように見えます。つまり、makeが前提条件を構築するためのパターンルールを見つけても、そのルールが前提条件ファイルの作成に終わらない場合、パターンターゲットは期限切れとはみなされません。それは私にとっては驚くべきことであり、期待されていません。私は、これについての文書化された正当な理由があるのか​​、それを使用しているのか、それとも単なる見落としであるのかは分かりません。それがバグだとかなり長い間起こっています。私はそれについてもっと考えなければならないだろう。

すぐに問題を解決するには、パターンルールを明示的なルールに変更して修正することができます。これは、前提条件ファイルが作成されない明示的なルールによって前提条件が作成された場合でも、前提条件ファイルは更新されたものとみなされ、対象は古くなったとみなされるからです。この代わりに

$(DEPDIR)/%.d : ; 
.PRECIOUS: $(DEPDIR)/%.d 

$(SRCS:%.C=$(DEPDIR)/%.d) : ; 

それは意志あなたが変数を持っている場合たとえば、

は、あなたがこれらの行を変更した場合、すべてのソースファイルのリストが含まれSRCSを言いますすべて期待どおりに動作します。

代わりにオブジェクトのリストがある場合は、同じタイプのことを実行できます。置換を適切に変更するだけです。

関連する問題