2010-05-23 60 views
3

我寫的程序的一個要求是它必須能夠信任配置文件。爲了達到這個目的,我使用了幾種哈希算法來在編譯時生成文件的哈希值,這會產生一個哈希值爲常量的頭文件。GNU Make - 非程序代碼的依賴關係

這個的依賴性非常直接,我的程序依賴於config_hash.h,它有一個產生它的目標。

的makefile文件看起來是這樣的:

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目標,但沒有成功。顯然,我不能依靠-M開關來gcc來幫助我,因爲配置文件不是任何目標代碼的一部分。

有什麼建議嗎?不幸的是,我不能發佈很多Makefile文件,或者我只是發佈了所有的東西。

+1

您是否嘗試過運行「make -d」?你會得到很多的輸出(有可能會減少輸出,但仍然足夠的變種-d,請參閱make --help),但將config_hash.h列表config_file.cfg作爲依賴項應該有效。我的猜測是目標名稱沒有正確匹配:您的目標可能需要爲$(srcdir)/config_hash.h,具體取決於config/config_file.cfg,例如... make -d應該明顯。 (另外,檢查gcc -M生成的.d文件也可能會對某些事情有所幫助。) – leander 2010-05-23 02:07:03

回答

5

一個makefile聲明文件中.PHONY是錯誤的。列出的任何依賴項都不會在文件系統中檢查。只需將它列爲哈希頭的依賴項並從那裏開始。

+0

謝謝,那就是問題所在。我沒有意識到.PHONY疏遠了依賴關係,我認爲它應該用在實際上並不構建任何東西的目標上,即使其他目標實際上依賴於它們。 – 2010-05-23 02:16:10

3

當您將config/config_file.cfg添加到config_hash.h的依存關係時,發生了什麼?爲什麼它不是您所期望的?

config_hash.h:config/config_file.cfg 
    $(SH) genhash $< > [email protected] 

規則將重新config_hash.h如果config/config_file.cfg更近。根據config_hash.h,您的gcc生成的依賴關係會重新編譯任何內容。

[email protected]變量是目標,使用這種確保你正在創建你要的文件(在你的問題,如果srcdir定義規則表示,將產生./config_hash.h,但實際上將創建./$(srcdir)/config_hash.h)。同樣,$<$^分別給出第一個和所有先決條件。

我假設你有一個像

CPPFLAGS+=-MMD -MP 
all: 
# etc. 
config_hash.h:config/config_file.cfg 
    $(SH) genhash $< > [email protected] 
%.d %.o:%.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $*.o $< 
%.d %.o:%.cpp 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $*.o $< 
-include $(wildcard *.d) /dev/null