我想讓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
,每次調用這個目標時都會觸摸這個文件。這種方式可以在最後重建目標時進行存儲,並且實際上注意到它不需要執行任何操作。
有沒有更好的方法來處理這樣的事情?
如果您「想要輕鬆地一次重建[所有外部頭文件]」,爲什麼不按照您所說的使'.d'文件依賴於特定的頭文件,而是在您想要的時候保持PHONY目標重建他們所有的人? – Beta 2012-02-15 21:18:15
@Beta:這實際上是我目前使用的解決方案。我想我現在會這樣,因爲make似乎沒有提供更好的選擇。 – LiKao 2012-02-16 09:19:13
相關問題:http://stackoverflow.com/questions/5229561/gnu-make-generating-automatic-dependencies-with-generated-header-files – kostmo 2015-03-01 03:53:38