首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用多个目标调用make的Makefile

使用多个目标调用make的Makefile
EN

Stack Overflow用户
提问于 2018-10-25 09:08:10
回答 2查看 211关注 0票数 1

我在makefile中有一个规则,它使用sox将wav文件转换成另一种格式。

Makefile:

代码语言:javascript
复制
INPUTFILE?=file1.wav
OUTFILE=$(INPUTFILE:.wav=.s32)

wav_to_s32:
    @sox $(INPUTFILE) -r 16000 $(OUTFILE)

如何为输入时指定的多个文件(具有多个输出)进行此操作?

代码语言:javascript
复制
INPUTFILE?=file1.wav file2.wav file3.wav
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-25 10:29:40

正如在另一个答案中所解释的,这里的关键是模式规则。如果您想要自动化您在INPUTFILE变量中列出的所有文件的所有转换,您可以完成初始版本和其他答案,如下所示:

代码语言:javascript
复制
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不是真正的文件,它只是其他东西的简称(它是一个“假的”目标)。
  2. 使用make wav_to_s32调用时,它将生成$(OUTFILE)中列出的所有文件。

如果您希望make自动发现输入文件,则可以通过以下方法进一步改进所有这些:

代码语言:javascript
复制
INPUTFILE := $(wildcard *.wav)
OUTFILE   := $(patsubst %.wav,%.s32,$(INPUTFILE))

.PHONY: wav_to_s32
wav_to_s32: $(OUTFILE)

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

请注意,如果文件已经转换且此后没有更改,那么make足够聪明,不需要重新转换文件。它甚至是创建的主要目的:跟踪文件间的依赖关系。

票数 3
EN

Stack Overflow用户

发布于 2018-10-25 09:13:31

我将在makefile中使用以下模式规则

代码语言:javascript
复制
%.s32: %.wav
    sox $< -r 16000 $@

上面的规则将从.s32文件构建.wav文件。

使用makefile中的规则,您可以通过以下方式为多个目标调用make

代码语言:javascript
复制
 $ make foo.s32 bar.s32
 sox foo.wav -r 16000 foo.s32
 sox bar.wav -r 16000 bar.s32

它分别从foo.s32bar.wav生成foo.wavbar.wav

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52985498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档