2013-06-24 86 views
6

我目前正在研究一個項目,需要將目錄中的文件列表轉換爲C++頭文件來存儲有關資源的信息。例如:做遞歸依賴

/ 
update.py 
resources.h 
Makefile 
/resources 
    resource1.png 
    /sub1 
    /sub2 
     resource2.png 

我想讓Makefile只在目錄樹中任意位置的某個資源發生更改時運行update.py。沒有其他makefile會觸及資源,只有resources.h。我需要做什麼樣的makefile?

PS 從我讀過的,用make遞歸搜索是一個壞主意,但如果沒有別的東西在觸及相同的文件,會不會是一個問題?

回答

12

我不知道你讀過什麼,但有沒有問題使得編寫規則是這樣的:

RESOURCES := $(shell find . -name resource\*.png -print) 
resources.h: update.py $(RESOURCES) 
     ./update.py $(RESOURCES) 

或什麼的。

+0

如果發現一個文件中有空格,則失敗。可能需要一個小小的調整。 – HectorJ

+0

通常,使用當前版本的make來管理包含空白的文件名是不可行的。 – MadScientist

1

我覺得你弄錯了:Recursive Make Considered Harmful解釋說你不應該從另一箇中調用一個make,因爲這兩個都不會有完整的依賴關係的概述。這遲早會導致錯誤的構建,你只能用make clean來整理。

makepp是一種可以幫助您避免該缺陷的替代方案。它還與遞歸(無關上述遞歸)解決您的問題通配符:

RESOURCES := **/resource\*.png 
resources.h: $(RESOURCES) 
    .$/update.py $(inputs) 

這甚至工作,如果這些文件現在還沒有,因爲makepp的通配符考慮什麼可以根據自己的規則來建。請注意它是如何自動通知程序依賴項的。有趣的$/將依賴於它運行的系統而傾斜,因此它更加便攜。

makepp還有很多。除了幾乎所有的GNU make功能之外,還有更多有用的東西,甚至可以用一些Perl編程擴展makefile。