我是 Makefile 新手,只是想更改文件后缀。我想将文件从一种格式转换为另一种格式,例如 .mov 到 .mp4
在 bash 中我会做类似的事情
out1 = "${input/mov/mp4}"
(有没有办法在 Make 中使用内联 Bash 语法?)
无论如何它不起作用。所以我在文本函数上找到了这些文档 https://www.gnu.org/software/make/manual/html_node/Text-Functions.html
$(var:suffix=replacement)
所以尝试将其转化为我可以使用的东西......
out1 := "${input/mov/mp4}" ##bash syntax doesnt work
out2 := $(input:suffix=mp4)
check:
@echo " input: ${input}"
@echo " out1: ${out1}"
@echo " out2: ${out2}"
但这不起作用,后缀未受影响
$ input=tutorial-v1.mov make check
input: tutorial-v1.mov
out1:
out2: tutorial-v1.mov
我见过其他使用 sed 的脚本,但只是为了更改后缀,我只需要正确使用咒语语法即可。
第二个问题,我不认为有比定义命名环境变量更好的方法将参数传递给 makefile 脚本。例如,make cmd param1 param2
就像任何其他 shell 脚本一样$1
?
答案1
我的建议是将PARAM1
和PARAM2
作为参数,然后在您的目标中使用它们:
check:
@echo " input: ${INPUT}"
@echo " param1: ${PARAM1}"
@echo " param2: ${PARAM2}"
@echo " out: $(INPUT:$(PARAM1)=$(PARAM2))"
下面是它的用法示例:
INPUT=file.mkv PARAM1=.mkv PARAM2=.avi make check
input: file.mkv
param1: .mkv
param2: .avi
out: file.avi
另一种选择使用文件名函数
check:
@echo " input: ${INPUT}"
@echo "suffix: ${SUFFIX}"
@echo " out: $(addsuffix $(SUFFIX), $(basename $(INPUT)))"
像这样测试它:INPUT=file.avi SUFFIX=.mp4 make check
,它应该产生以下结果:
input: file.avi
suffix: .mp4
out: file.mp4
答案2
out1 = $(patsubst %.mov,%.mp4,$(input))
注意:像 makefile 中的大多数内容一样,如果文件名中有空格,它就不起作用。
如果输入是空格分隔的文件名列表,则输出也是如此。每个文件名都是单独转换的。