我在makefile中有一条规则,该规则使用sox
将wav文件转换为另一种格式。
Makefile:
INPUTFILE?=file1.wav
OUTFILE=$(INPUTFILE:.wav=.s32)
wav_to_s32:
@sox $(INPUTFILE) -r 16000 $(OUTFILE)
我如何处理输入中指定的多个文件(具有多个输出)?
INPUTFILE?=file1.wav file2.wav file3.wav
答案 0 :(得分:3)
我会在您的Makefile中使用以下pattern rule:
%.s32: %.wav
sox $< -r 16000 $@
以上规则将从.s32
个文件中构建.wav
个文件。
在生成文件中使用该规则后,您可以通过以下方式为多个目标调用make
:
$ make foo.s32 bar.s32
sox foo.wav -r 16000 foo.s32
sox bar.wav -r 16000 bar.s32
它分别从foo.s32
和bar.s32
生成foo.wav
和bar.wav
。
答案 1 :(得分:3)
如this other answer中所述,此处的关键是模式规则。如果您要自动执行INPUTFILE
变量中列出的所有文件的所有转换,则可以完成初始版本以及其他类似的答案:
INPUTFILE?=file1.wav file2.wav file3.wav
OUTFILE=$(INPUTFILE:.wav=.s32)
.PHONY: wav_to_s32
wav_to_s32: $(OUTFILE)
%.s32: %.wav
sox $< -r 16000 $@
这说明了:
wav_to_s32
不是真实的文件,它只是其他名称的简称(它是“ phony ”目标)。make wav_to_s32
调用时,它将构建$(OUTFILE)
中列出的所有文件。如果您希望make自动发现输入文件,则可以使用以下方法进一步改善所有这些功能:
INPUTFILE := $(wildcard *.wav)
OUTFILE := $(patsubst %.wav,%.s32,$(INPUTFILE))
.PHONY: wav_to_s32
wav_to_s32: $(OUTFILE)
%.s32: %.wav
sox $< -r 16000 $@
请注意,如果文件已经被转换并且此后没有更改,那么make足够聪明以至于不会重新转换文件。它甚至是make的主要目的:跟踪文件间的依赖关系。