2012-02-15 68 views
2

我想讓make自動生成一些生成的頭文件,然後自動創建依賴文件(.d)。不過,我不知道如何正確地按照正確的順序來完成兩個目標。如何在生成頭文件時正確創建依賴關係

這是我到目前爲止有:

all: test 

test: test.o 
    g++ test.o -o test 

test.o: test.cc test.d external-headers 
    g++ test.cc -c -o test.o 

test.d: test.cc external-headers 
    g++ -MM -MT [email protected] $< -o [email protected] 

external/some_header.hh: 
    mkdir -p external 
    touch external/some_header.hh 

.PHONY: external-headers 

-include test.d 

external-headers: external/some_header.hh 

的依賴性看,這看起來是正確的,因爲我必須使外部頭之前,我可以創建任何.d文件。此外,如果外部頭文件丟失,它們將不得不被重新生成。然而,這個小的Makefile會導致GNU make進入無限循環。我使用了調試選項,找出它爲什麼這樣做。

我能看到的是,每次重新創建任何包含的文件時,make都會自動重新啓動。這是好的,我期望的。然而,每次重啓時,它都會重新創建external-headers目標,因爲它是假的。但是,儘管不需要在後續目標中創建任何內容,但這意味着inclues的依賴目標自上次調用以來已重新構建,因此它將重新構建包含並重新啓動。

有沒有很好的解決這個問題?我得到的最簡單的想法是使.d文件直接依賴標題external/some_header.hh並跳過兩者之間的目標。當測試這工作正常。然而,在真實情況下,我有一大堆生成的頭文件,我希望能夠輕鬆地一次性重建所有頭文件。

我的另一個想法是在某個地方添加一個文件,這個文件實際上叫做external-headers,每次調用這個目標時都會觸摸這個文件。這種方式可以在最後重建目標時進行存儲,並且實際上注意到它不需要執行任何操作。

有沒有更好的方法來處理這樣的事情?

+1

如果您「想要輕鬆地一次重建[所有外部頭文件]」,爲什麼不按照您所說的使'.d'文件依賴於特定的頭文件,而是在您想要的時候保持PHONY目標重建他們所有的人? – Beta 2012-02-15 21:18:15

+0

@Beta:這實際上是我目前使用的解決方案。我想我現在會這樣,因爲make似乎沒有提供更好的選擇。 – LiKao 2012-02-16 09:19:13

+0

相關問題:http://stackoverflow.com/questions/5229561/gnu-make-generating-automatic-dependencies-with-generated-header-files – kostmo 2015-03-01 03:53:38

回答

1

圍繞此問題產生的文件是生成file.tmp文件,並且如果它們不同,則用file.tmp替換file。這種方式make沒有看到一個新的文件,並沒有重新啓動一切。請看Makefile的自動工具創建舞蹈./configure,它廣泛使用。