2010-11-09 73 views
4

我想弄清楚爲什麼我不能指定一個目標作爲在不同的目錄中。如何在不同目錄中指定makefile目標?

我想從json文件生成一些php類,但我已經將實際生成php的行更改爲虛擬echo語句,所以其他人可以複製粘貼並測試它們是否感覺非常慷慨。

還有其他兩件事情要添加到包含生成文件的目錄:

  • 稱爲PatientDbPath.json
  • 目錄中的虛擬依賴文件叫出來

如果我有一個makefile與下列:

.SUFFIXES: .php .json 
.json.php: 
    echo "HelloMe" > PatientDbPath.php 

PatientDbPath.php: PatientDbPath.json 

clean: 
    $(RM) PatientDbPath.php 

然後,一切正常,當我運行; PatientDbPath.php正確地創建,下一次我運行make,我得到的消息make: 'PatientDbPath.php' is up to date.

不過,我要生成一個單獨的目錄下的PHP文件,所以我在我的makefile文件更新以下內容:

.SUFFIXES: .php .json 
.json.php: 
    echo "HelloMe" > out/PatientDbPath.php 

out/PatientDbPath.php: PatientDbPath.json 

clean: 
    $(RM) out/PatientDbPath.php 

只要我這樣做,即使在out目錄中沒有文件PatientDbPath.php,Make也會告訴我make: Nothing to be done for 'out/PatientDbPath.php'

所以我想也許這是後綴規則的東西,我創建了第三個makefile。

out/PatientDbPath.php: PatientDbPath.json 
    echo "Whatever" > out/PatientDbPath.php 

clean: 
    rm out/PatientDbPath.php 

這個效果很好,就像第一個一樣。任何人都可以看到我在我的第二個makefile中做錯了什麼?

謝謝。

回答

3

通配符規則(.json - > .php)中有兩個錯誤,一個概念和一個實際。

概念錯誤是,這是一個規則如何將任意json文件(比如說foo.json)轉換爲任意命名的.php文件(比如說json.php)。然而,你的規則是專門針對PatientDbPth.php的。一個更好的規則是

.json.php: 
    echo "HelloMe" > [email protected] 

其中[email protected]是一個變量命名輸出文件。

這也顯示了實際問題:這些規則實際上只限於同名文件。如果在.php中有翻譯.json的規則,並且您有foo.php,並且您想要bar.php,那麼通配符規則將不匹配。匹配涉及整個文件名,所以當你要求輸出/ PatientDbPath.php時,通配符規則不匹配。這給你留下了沒有任何行動的規則,因此推斷沒有任何事情要做。

如果這是您想要轉換的唯一文件,最好按照您在第三個文件中所做的方式進行編寫。如果你有很多json文件,並且你都想將它們轉換爲/ *。PHP的,並且您使用了GNU make,你可以使用GNU make的廣義通配符規則:

out/%.php: %.json 
    action 
+0

感謝您的回覆,我將嘗試更改我的真實makefile以使用建議的表示法。我會盡快跟進或標記答案。關於概念問題,我在這裏發佈的只是一個示例makefile,它顯示了問題,而不是我真正的makefile。 – 2010-11-09 21:21:53

+0

好吧,我測試了一下,你是絕對正確的,把我的makefile改成使用'out /%。php:%.json'完成了。我有一個後續問題。我是否需要爲該目錄​​中的每個.json文件創建單獨的規則? – 2010-11-09 23:02:58

+0

我找到了我想要的解決方案,基本上我需要添加下面一行:'all :: $(patsubst%.json,out /%。php,$(wildcard * .json))'這會添加一個依賴項每個php文件都要從該目錄中的每個.json生成 – 2010-11-09 23:59:38

2

還有另一種方式做同樣的事情,也許更優雅:

$(JSON_FILES): out/%.php: %.json 
    action 

這將創建一個規則在JSON_FILES上市,所以,如果它被定義JSON_FILES= foo.json bar.json每一個文件,那麼這將是等效於:

out/foo.php: foo.json 
    action 

out/bar.php: bar.json 
    action 

然後,您可以使用$(wildcard *.json)如果您真的想要所有.json文件,請設置該值,如果該規則僅適用於少數幾個,則可以手動設置該值。

相關問題