C 依存関係の自動検出

Makefile で行うことは

SRCS=$(wildcard *.c)

depend: $(SRCS)
    gcc -M $(CFLAGS) $(SRCS) >depend

include depend

これは、ソース ファイルのいずれかが更新された場合、依存ルールが実行され、gcc -M を使用して依存というファイルを更新することを意味します。これは、すべてのソース ファイルの依存関係規則を提供するために、makefile に含まれます。

Make は、ファイルをインクルードする前にファイルが最新であることを確認するため、make を実行するたびに、必要に応じてこの依存ルールが実行されます。

これは、ファイルが変更されたときにいつでも実行されます。私はこれが問題だと思ったことはありませんが、ディレクトリに膨大な数のファイルがある場合、時間がかかりすぎることに気付くかもしれません。その場合は、次のように、ソース ファイルごとに 1 つの依存関係ファイルを作成してみてください:

SRCS=$(wildcard *.c)
DEPS=$(SRCS:.c=.dep)

%.dep : %.c
    gcc -M $(CFLAGS) $< >[email protected]

include $(DEPS)

-M の代わりに -MM を使用して、システム ヘッダーを含めないようにできることに注意してください。


"gcc -M file.c" は必要なことを行います。


gcc -M の代替は fastdep です。 Fastdep の作成者は、fastdep が gcc の -M よりも 10 倍高速であると報告しています。プロジェクトのビルドに時間がかかる場合は、fastdep を検討する価値があります。