ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

FILES_IN=file1.doc file2.xls

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

FILES_OUT=file1.docx file2.xlsx

可能吗 ?如何 ?

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


G
Gilles 'SO- stop being evil'

在以空格分隔的文件名列表中替换扩展名是一项常见要求,并且为此提供了内置功能。如果要在列表中每个名称的末尾添加 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 哦,是的,没有看到链接。我提到了“替代”。谢谢!

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅