用于调用具有多个目标的make的Makefile

时间:2018-10-25 09:08:11

标签: makefile cygwin gnu-make

我在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

2 个答案:

答案 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.s32bar.s32生成foo.wavbar.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 $@

这说明了:

  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的主要目的:跟踪文件间的依赖关系。