代码之家  ›  专栏  ›  技术社区  ›  Danijel

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

  •  1
  • Danijel  · 技术社区  · 7 年前

    我在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
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   jfMR    7 年前

    如中所述 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 不是一个真正的文件,它只是其他文件的简称(它是一个 “目标”)。
    2. 使用调用时 make wav_to_s32 应建立本文件所列的所有文件 $(OUTFILE) .

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

    INPUTFILE := $(wildcard *.wav)
    OUTFILE   := $(patsubst %.wav,%.s32,$(INPUTFILE))
    
    .PHONY: wav_to_s32
    wav_to_s32: $(OUTFILE)
    
    %.s32: %.wav
        sox $< -r 16000 $@
    

    请注意,make非常聪明,如果文件已经转换并且之后没有更改,就不会重新转换。它甚至是make的主要目的:跟踪文件间的依赖关系。

        2
  •  3
  •   jfMR    7 年前

    我会用下面的 pattern rule 在makefile中:

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

    以上规则将建立 .s32 .wav 文件夹。

    根据makefile中的规则,您可以调用 make

     $ make foo.s32 bar.s32
     sox foo.wav -r 16000 foo.s32
     sox bar.wav -r 16000 bar.s32
    

    它产生 foo.s32 bar.s32 foo.wav bar.wav