3

私が書いているプログラムの要件は、構成ファイルを信頼できる必要があるということです。これを達成するために、コンパイル時にファイルのハッシュを生成するためにいくつかの種類のハッシュ アルゴリズムを使用しています。これにより、ハッシュを定数として含むヘッダーが生成されます。

これに対する依存関係は非常に簡単です。私のプログラムは、それを生成するターゲットを持つ config_hash.h に依存しています。

メイクファイルは次のようになります。

config_hash.h:
    $(SH) genhash config/config_file.cfg > $(srcdir)/config_hash.h

$(PROGRAM): config_hash.h $(PROGRAM_DEPS)
    $(CC) ... ... ... 

依存関係を処理するのに最適な -M オプションを gcc に使用しています。ヘッダーが変更されると、プログラムが再構築されます。

私の問題は、 config_hash.h が再生成されるように、構成ファイルが変更されたかどうかを確認できる必要があることです。GNU make へのその種の依存関係をどのように説明するのか、私にはよくわかりません。

config/config_file.cfg を config_hash.h の依存関係としてリストし、config_file.cfg の.PHONYターゲットを提供しようとしましたが、成功しませんでした。明らかに、構成ファイルはオブジェクト コードの一部ではないため、gcc への -M スイッチに頼ることはできません。

助言がありますか?残念ながら、私は Makefile の多くを投稿することはできません。

4

2 に答える 2

5

でファイルを宣言するの.PHONYは間違っています。そこにリストされている依存関係は、ファイルシステムでチェックされません。ハッシュヘッダーの依存関係としてリストし、そこから移動します。

于 2010-05-23T02:07:44.523 に答える
3

config/config_file.cfgの依存関係にを追加したときに何が起こったのですconfig_hash.hか? また、期待どおりにならなかったのはなぜですか?

みたいなルール

config_hash.h:config/config_file.cfg
    $(SH) genhash $< > $@

最新のconfig_hash.h場合は再生されます。config/config_file.cfggcc で生成された依存関係は、に依存するものを再コンパイルしconfig_hash.hます。

変数はターゲットです。$@これを使用すると、要求したファイルを確実に作成できます(質問では、srcdirが定義されている場合、ルールはそれが生成すると言っていますが./config_hash.h、実際には作成します./$(srcdir)/config_hash.h)。同様$<$^、最初とすべての前提条件をそれぞれ与えます。

次のようなメイクファイルがあると仮定しています

CPPFLAGS+=-MMD -MP
all:
# etc.
config_hash.h:config/config_file.cfg
    $(SH) genhash $< > $@
%.d %.o:%.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $*.o $<
%.d %.o:%.cpp
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $*.o $<
-include $(wildcard *.d) /dev/null
于 2010-05-23T02:06:21.053 に答える