如何在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)))