用于调用具有多个目标的 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.wavbar.wav生成foo.s32bar.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:

  1. wav_to_s32 不是真正的文件,它只是其他东西的简称(它是一个“phony”目标)。
  2. 当使用 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 的主要目的:跟踪文件间依赖关系。