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

用于调用具有多个目标的make的Makefile,makefile,cygwin,gnu-make,Makefile,Cygwin,Gnu Make,我在makefile中有一个规则,用于将wav文件转换为另一种格式 生成文件: INPUTFILE?=file1.wav OUTFILE=$(INPUTFILE:.wav=.s32) wav_to_s32: @sox $(INPUTFILE) -r 16000 $(OUTFILE) 对于输入时指定的多个文件(具有多个输出),我将如何使其工作 我会在您的makefile中使用以下内容: %.s32: %.wav sox $< -r 16000 $@ 它分别从foo.wa

我在makefile中有一个规则,用于将wav文件转换为另一种格式

生成文件:

INPUTFILE?=file1.wav
OUTFILE=$(INPUTFILE:.wav=.s32)

wav_to_s32:
    @sox $(INPUTFILE) -r 16000 $(OUTFILE)
对于输入时指定的多个文件(具有多个输出),我将如何使其工作

我会在您的makefile中使用以下内容:

%.s32: %.wav
    sox $< -r 16000 $@
它分别从
foo.wav
bar.wav
生成
foo.s32
bar.wav

%.s32: %.wav
    sox $< -r 16000 $@
它分别从
foo.wav
bar.wav
生成
foo.s32
bar.wav

如中所述,这里的关键是模式规则。如果要自动转换
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足够智能,如果文件已被转换并且此后未更改,则不会重新转换文件。make的主要目的甚至是:跟踪文件间的依赖关系。

如中所述,这里的关键是模式规则。如果要自动转换
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足够智能,如果文件已被转换并且此后未更改,则不会重新转换文件。make的主要目的甚至是:跟踪文件之间的依赖关系。

要清楚的是,Cygwin对此并没有什么特别之处。下面的答案适用于任何平台上的大多数make实现。以下答案适用于任何平台上的大多数make实现。
INPUTFILE := $(wildcard *.wav)
OUTFILE   := $(patsubst %.wav,%.s32,$(INPUTFILE))

.PHONY: wav_to_s32
wav_to_s32: $(OUTFILE)

%.s32: %.wav
    sox $< -r 16000 $@