在 GNU makefile 中,我想知道是否可以通过文件列表输入来制作具有新扩展名的文件列表输出。
在输入中,我得到这个列表:
FILES_IN=file1.doc file2.xls
我想从 FILES_IN 变量在我的 makefile 中构建这个变量:
FILES_OUT=file1.docx file2.xlsx
可能吗?怎么办?
这非常困难,因为我必须解析文件列表,并检测每个扩展名(.doc,.xls)以将其替换为正确的扩展名。
替换空白分隔的文件名列表中的扩展名是一种常见的要求,并且有为此提供的内置功能。如果您想在列表中每个名称的末尾添加
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)))
我正在尝试
FILES_OUT = $(FILES_IN:.dts=.dtb)
和
FILES_OUT = $(FILES_IN:%.dts=%.dtb)
但由于某种原因,列表中的最后一个文件名未被替换并保留 .dts 扩展名。这是 GNU Make 4.2.1.