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

The*_*One 78 makefile gnu-make

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

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

FILES_IN=file1.doc file2.xls
Run Code Online (Sandbox Code Playgroud)

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

FILES_OUT=file1.docx file2.xlsx
Run Code Online (Sandbox Code Playgroud)

可能吗 ?怎么样 ?

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

Gil*_*il' 134

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

FILES_OUT = $(FILES_IN:=x)
Run Code Online (Sandbox Code Playgroud)

一般形式是$(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)
Run Code Online (Sandbox Code Playgroud)

您还可以使用稍微更一般的语法$(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX).此功能并非GNU make独有,但它不像普通后缀更改替换那样可移植.

还有一个GNU make功能,允许您在同一行上链接多个替换:patsubst函数.

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`FILES_OUT:= $(patsubst%,%x,$(FILES_IN))`如果规则真的可以做成通用的. (3认同)