リメイクには必要な場合にのみ makefile が含まれます。

リメイクには必要な場合にのみ makefile が含まれます。

foo.o2つの「主な」目標であるとのMakefileがあるとしましょうclean。前者にはファイルを生成する方法がありますfoo.o。後者はすべての一時ファイルを削除します。

依存関係を手動で指定する必要性を排除するために、依存関係の形式を指定する有効なmakefileをfoo.o目指しています。この依存関係ファイルはmakefileに含まれています。foo.dfoo.o foo.d : dep1 dep2 depn

生成されたファイルは次のとおりです。

;; This buffer is for text that is not saved, and for Lisp evaluation.
;; To create a file, visit it with C-x C-f and enter text in its buffer.

foo.o: foo.c
    cc -c -o $@ $<

foo.d: foo.c
    sh deps.sh $< > $@

include foo.d

.PHONY: clean
clean:
    rm …

私がしたいときは、foo.oすべてが動作します。foo.d(再)作成され、含まれ、作成されますfoo.o。問題は、clean目標を設定したいときにfoo.d目標を含めるか設定するまですることです。

foo.dmakeがターゲットを作成するのにかかる時間を含めないようにするにはどうすればよいですか?clean(それともfoo.o製作時にのみどのように含めますか?)

このソリューションはGNU Makeの機能を使用します。

答え1

解決策は非常に簡単ですが、Makefileコードを少し読みにくくします。

includeまず、ディレクティブがファイルを含めようとし、ファイルがないと失敗することに注意してください。また、-include(またはsinclude)ファイルが存在しない場合、ファイルはまったく含まれません。しかし、それは私たちが望むものではありません。可能であれば、埋め込まれたmakefileを再生成しようとするからです。

これを防ぐ方法は2つあります。 Makefileがインクルードファイルを生成できないと思うようにincludeディレクティブパラメータを変更するか(たとえば、相対パスから絶対パスなど)、ファイルに含まれていない場合はパラメータを省略します。それ。存在する。これはいくつかの方法で行うことができます。

-include $(wildcard foo.d*)

しかし、問題があります。他のファイルとも一致します。だから私たちは次のように書くことができます:

-include $(filter foo.d,$(wildcard foo.d*))

またはこれも:

-include $(filter foo.d,$(wildcard *))

別の問題があります。foo.d実装されていないということです。この問題は他のターゲットとして追加することで解決できますfoo.o

foo.o: foo.c foo.d

またはコマンドとして追加します。

foo.o: foo.c
    $(MAKE) foo.d
    cc …

または電話なしで直接make

foo.o: foo.c
    sh script.sh …
    cc …

関連情報