在GNU makefile中,我想知道是否可以通过文件列表输入来制作具有新扩展名的文件列表输出。
在输入中,我得到以下列表:
FILES_IN=file1.doc file2.xls
我想从FILES_IN变量在我的makefile中构建此变量:
FILES_OUT=file1.docx file2.xlsx
可能吗 ?怎么样 ?
这很困难,因为我必须解析文件列表,并检测每个扩展名(.doc,.xls)以替换它以更正扩展名。
Answers:
将扩展名替换为以空格分隔的文件名列表是常见的要求,并且此功能具有内置功能。如果要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
function。
FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))
$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)
您还指的是什么?
FILES_OUT := $(patsubst %,%x,$(FILES_IN))
真的可以使规则变得通用。