如何在GNU make中使用多个扩展名来更改列表中每个文件的扩展名?
在一个GNU makefile中,我想知道是否有可能用一个文件列表input来创build一个带有新扩展名的文件列表输出。
在input中,我得到这个列表:
FILES_IN=file1.doc file2.xls
我想从我的生成文件从FILES_INvariablesbuild立这个variables:
FILES_OUT=file1.docx file2.xlsx
可能吗 ? 怎么样 ?
这很困难,因为我必须parsing文件列表,并检测每个扩展名(.doc,.xls)以将其replace为正确的扩展名。
用空格分隔的文件名列表中的扩展名replace是常见的要求,并且有内置的function。 如果要在列表中的每个名称的末尾添加一个x
:
FILES_OUT = $(FILES_IN:=x)
一般forms是$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)
。 这取得了VARIABLE
的值,并以NEW_SUFFIX
(不匹配的单词保持不变)replace了以该后缀结尾的每个单词末尾的NEW_SUFFIX
。 GNU调用这个特性(它存在于每个make实现中) replace引用 。
如果您只是想使用此function将.doc
更改为.xlsx
和.xlsx
,则需要使用中间variables。
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 makefunction,可以让你在同一行上链接多个replace: patsubst
函数 。
FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))