用于调用具有多个目标的 make 的 Makefile
Makefile for calling make with multiple targets
我在 makefile 中有一个规则,它使用 sox
将 wav 文件转换为另一种格式。
生成文件:
INPUTFILE?=file1.wav
OUTFILE=$(INPUTFILE:.wav=.s32)
wav_to_s32:
@sox $(INPUTFILE) -r 16000 $(OUTFILE)
我将如何为在输入时指定的多个文件(具有多个输出)工作?
INPUTFILE?=file1.wav file2.wav file3.wav
我会在您的 makefile 中使用以下 pattern rule:
%.s32: %.wav
sox $< -r 16000 $@
上述规则将从 .wav
个文件构建 .s32
个文件。
在您的 makefile 中使用该规则,您可以通过以下方式为多个目标调用 make
:
$ make foo.s32 bar.s32
sox foo.wav -r 16000 foo.s32
sox bar.wav -r 16000 bar.s32
它分别从foo.wav
和bar.wav
生成foo.s32
和bar.s32
。
如中所述,这里的关键是模式规则。如果您想自动完成您在 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 $@
这告诉 make:
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 的主要目的:跟踪文件间依赖关系。
我在 makefile 中有一个规则,它使用 sox
将 wav 文件转换为另一种格式。
生成文件:
INPUTFILE?=file1.wav
OUTFILE=$(INPUTFILE:.wav=.s32)
wav_to_s32:
@sox $(INPUTFILE) -r 16000 $(OUTFILE)
我将如何为在输入时指定的多个文件(具有多个输出)工作?
INPUTFILE?=file1.wav file2.wav file3.wav
我会在您的 makefile 中使用以下 pattern rule:
%.s32: %.wav
sox $< -r 16000 $@
上述规则将从 .wav
个文件构建 .s32
个文件。
在您的 makefile 中使用该规则,您可以通过以下方式为多个目标调用 make
:
$ make foo.s32 bar.s32
sox foo.wav -r 16000 foo.s32
sox bar.wav -r 16000 bar.s32
它分别从foo.wav
和bar.wav
生成foo.s32
和bar.s32
。
如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 $@
这告诉 make:
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 的主要目的:跟踪文件间依赖关系。