如何在GNU make中使用多个扩展名更改列表中每个文件的扩展名?

时间:2012-08-22 08:50:10

标签: makefile gnu-make

在GNU makefile中,我想知道是否可以通过文件列表输入来创建带有新扩展名的文件列表输出。

在输入中,我得到这个列表:

FILES_IN=file1.doc file2.xls

我想在 FILES_IN 变量的makefile中构建这个变量:

FILES_OUT=file1.docx file2.xlsx

有可能吗?怎么样?

这很困难,因为我必须解析文件列表,并检测每个扩展名(.doc,.xls)以将其替换为正确的扩展名。

1 个答案:

答案 0 :(得分:127)

在空格分隔的文件名列表中替换扩展名是一个常见的要求,并且有内置的功能。如果要在列表中的每个名称末尾添加x

FILES_OUT = $(FILES_IN:=x)

一般表格为$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)。这将取VARIABLE的值,并在每个以此后缀结尾的单词末尾替换OLD_SUFFIX NEW_SUFFIX(不匹配的单词保持不变)。 GNU make调用此功能(存在于每个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)))