【问题标题】:How to change the extension of each file in a list with multiple extensions in GNU make?如何在 GNU make 中更改具有多个扩展名的列表中每个文件的扩展名?
【发布时间】:2012-08-17 15:50:39
【问题描述】:

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

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

FILES_IN=file1.doc file2.xls

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

FILES_OUT=file1.docx file2.xlsx

有可能吗?怎么样?

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

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

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

    FILES_OUT = $(FILES_IN:=x)
    

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

    如果您只想使用此功能将.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)))
    

    【讨论】:

    • 如果规则真的可以通用的话,或者只是FILES_OUT := $(patsubst %,%x,$(FILES_IN))
    • 这个操作员叫什么名字?我想查看手册,但找不到正确的名称。
    • @rkioji 什么运算符?我提供了$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX) 的 GNU make 手册的链接,您还指的是什么?
    • @Gilles 哦,是的,没有看到链接。我提到了“替代”。谢谢!
    猜你喜欢
    • 2020-07-20
    • 2019-09-23
    • 2023-04-01
    • 2020-01-11
    • 2016-06-24
    • 2017-11-27
    • 2023-03-14
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多