2012-08-22 60 views
59

在GNU生成文件中,我想知道是否可以用文件列表輸入來創建帶有新擴展名的文件列表輸出。如何在GNU make中使用多個擴展名更改列表中每個文件的擴展名?

在輸入時,我得到這個列表:

FILES_IN=file1.doc file2.xls 

而且我想從FILES_IN變量在我的makefile構建此變量:

FILES_OUT=file1.docx file2.xlsx 

這可能嗎?怎麼樣 ?

這很困難,因爲我必須解析文件列表,並檢測每個擴展名(.doc,.xls)以將其替換爲正確的擴展名。

回答

107

將空白分隔的文件名列表中的擴展名替換是常見要求,並且有內置功能。如果你想在每一個名字的結尾在列表中添加x

FILES_OUT = $(FILES_IN:=x) 

的一般形式是$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)。這取值爲VARIABLE,並在以此後綴結尾的每個單詞末尾替換OLD_SUFFIXNEW_SUFFIX(不匹配的單詞保持不變)。 GNU調用這個特性(它存在於每個make實現中)substitution references

如果你只是想使用此功能更改.doc.docx.xls.xlsx,你需要使用一箇中間變量。

FILES_OUT_1 = $(FILES_IN:.doc=.docx) 
FILES_OUT = $(FILES_OUT_1:.xls=.xlsx) 

您還可以使用稍微更一般的語法$(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX)。這個特性對於GNU make來說並不是唯一的,但它不像普通的後綴改變替換那樣便攜。

還有一個GNU make功能,可以讓您在同一行上鍊接多個替換:patsubst function

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN))) 
+2

或者只是'FILES_OUT:= $(patsubst%,%x,$(FILES_IN))'如果規則真的可以做成通用的。 – tripleee

+0

@Gilles謝謝你這個有用的答案! – TheFrancisOne

+0

這個操作符的名字是什麼?我想查看手冊,但找不到合適的名稱。 – rkioji

相關問題