2014-03-06 59 views
1

我想提出幾個來源的完整文本文檔(因爲文件源的變化之一,我希望DOC改變)。變量在多個文件中「%」匹配

我必須通過我開發的翻譯器來傳遞它。我想通過語言作爲論據,使其更清潔。

昨天深夜,我夢到這樣的makefile文件...

#makefile 
# ... 
my_complete_doc.%.html: my_trans_exe header.%.html $(wildcard source/*.%.html) 
     $< --language $(variable_for_%) > [email protected] 

(?)是否所有有自己header.language.html文件語言替換%。當source/*.language.html之一發生變化時,文件my_completed_doc.language.html是否被更改?

(?)如何獲得%替換幾個先決條件,這可能爲通配符和必然的祕訣是什麼?

回答

2

首先,簡單的問題:你希望使用的「%」變量在配方中。答案是使用「$ *」自動變量:

my_complete_doc.%.html: my_trans_exe ... 
    $< --language $* > [email protected] 

那麼簡單的問題:是的,前提是正確的。當您嘗試建立my_complete_doc.dutch.html make將會評估它爲header.dutch.html,當您嘗試建立my_complete_doc.french.html,使將評估它作爲header.french.html

現在棘手的問題:前提$(wildcard source/*.%.html)。通常,在執行任何規則或決定構建哪些目標之前,Make會擴展$(wildcard ...)語句因此,搜索任何文件,如source/foo.%.htmlsource/bar.%.html(即文件名稱中包含字符「%」),仍然沒有找到,並評估該語句爲空字符串。但請將推遲本次評估,直到它已選擇了規則,如果你使用SECONDEXPANSION

.SECONDEXPANSION: 
my_complete_doc.%.html: my_trans_exe header.%.html $$(wildcard source/*.%.html) 
    $< --language $* > [email protected] 

(注意「$$」在第 - 普通 - 擴展,使減少「$$(。 ..「)到」$(...)「,而在第二個 - 當'%'有值時 - 它展開」$(...)「。)現在,如果修改任何文件,如source/foo.german.html ,Make會考慮文件my_complete_doc.german.html過期並需要重建。