95

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

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

FILES_IN=file1.doc file2.xls

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

FILES_OUT=file1.docx file2.xlsx

是否可以 ?如何 ?

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

4

1 回答 1

157

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

FILES_OUT = $(FILES_IN:=x)

一般形式是$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)。这将取值VARIABLE并替换OLD_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 功能可以让您在同一行上链接多个替换:patsubst函数.

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))
于 2012-08-22T11:18:22.430 回答