【问题标题】:Makefile for calling make with multiple targets使用多个目标调用 make 的 Makefile
【发布时间】:2019-03-29 20:14:08
【问题描述】:

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

【问题讨论】:

  • 需要明确的是,Cygwin 与此无关。以下答案适用于任何平台上的大多数 make 实现。

标签: makefile cygwin gnu-make


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我会在您的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      相关资源
      最近更新 更多