6

GNU Makeを使用したプロジェクトの管理を読んでおり、この例は第2.7章-自動依存関係の生成にあります。著者はGNUマニュアルから彼らを言います:

%.d: %c
        $(CC) -M $(CPPFLAGS $< > $@.$$$$; \
              sed s',\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
              rm -f $@.$$$$

しかし、私はこれで同じことをすることができました(注意してくださいsed):

-include $(subst .c,.d,$(SOURCES))

%.d: %.c
          @$(CC) -M $(CPPFLAGS) $<  | sed 's|:| $*.d : |'  > $@;

これらの行はすべて、依存関係を生成してから、*.d名前を追加するだけです。彼らは最初の行を以下から変更しなければなりませんでした:

  foo.o: bar.h foo.h fubar.h

to foo.o foo.d:bar.h foo.h fubar.h

私のはもっと単純で、かなりうまく機能しているようですが、GNUの人々には彼らのsed命令の理由があったと思います。また:

  • なぜファイルをにリダイレクトするのsedですか?単純に共通線パラメータとして使用してみませんか
  • 中間ファイルを完全にスキップしてみませんか?

GNUの人たちもこれらについて考えていたかもしれませんが、何らかの理由で、より複雑な設定を採用しました。私は彼らの推論を理解したいので、その場でこれらを行うことができます。

4

3 に答える 3

12

実際には、ルール自体も必要ありません。ポール D. スミスによって書かれたAdvanced Auto-Dependency Generation の記事には、Make スタイルの依存関係を生成するさまざまなアプローチの優れた概要があります。

結局のところ、次のルールで十分です (GCC を使用している場合)。

%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -o $@ -c $<

-include $(SOURCES:.c=.d)

アップデート。

私も少し前に同様の質問に答えました。オプションの説明(GCCマニュアル引用)を記載して-MMD -MPいます。

于 2012-05-22T10:26:47.360 に答える
3

質問への対処:Why do a redirect of the file into sed? もしそうなら:

@$(CC) -M $(CPPFLAGS) $<  | sed 's|:| $*.d : |'  > $@;

コンパイルが失敗すると (エラーが発生し、出力が生成されません)、空のターゲット ファイルが作成されます。を再度実行するmakeと、新しく作成された空のファイルが表示され、再生成されないため、ビルド エラーが発生します。中間ファイルの使用は、誤って空のターゲットを作成しないようにするための一般的な防御戦略です。

于 2012-06-01T19:48:51.837 に答える
3

さらに簡単な解決策は、sed 呼び出しを完全に取り除くことです。gcc は必要なことすべてを直接行うことができるからです。

%.d: %.c
        $(CC) -M $(CPPFLAGS) -MF $@ $< -MT "$*.o $@"
于 2012-05-22T01:27:23.327 に答える