如何更改GNU make中具有多个扩展名的列表中每个文件的扩展名?


82

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

在输入中,我得到以下列表:

FILES_IN=file1.doc file2.xls

我想从FILES_IN变量在我的makefile中构建此变量:

FILES_OUT=file1.docx file2.xlsx

可能吗 ?怎么样 ?

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

Answers:


141

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

FILES_OUT = $(FILES_IN:=x)

一般形式为$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)。这将采用的值,VARIABLEOLD_SUFFIX在以该后缀结尾的每个单词的末尾替换为NEW_SUFFIX(不匹配的单词保持不变)。GNU make调用此功能(存在于每个make实现中)替代引用

如果你只是想改变.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功能,可让您在同一行上链接多个替换项:patsubstfunction

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

3
或只是FILES_OUT := $(patsubst %,%x,$(FILES_IN))真的可以使规则变得通用。
2012年

该运算符的名称是什么?我想查看手册,但找不到正确的名称。
rph

1
@rkioji什么运算符?我提供了GNU make手册的链接,$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)您还指的是什么?
吉尔斯(Gillles)“所以-别再邪恶了”

@Gilles哦,是的,没有看到链接。我指的是“替代”。谢谢!
rph
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.