Makefile для вызова make с несколькими целями - PullRequest
0 голосов
/ 25 октября 2018

У меня есть правило в make-файле, которое использует 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 голосов
/ 25 октября 2018

Как объяснено в этом другом ответе , ключ здесь - это шаблонные правила.Если вы хотите автоматизировать все преобразования для всех файлов, перечисленных в переменной 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: отслеживать зависимости между файлами.

0 голосов
/ 25 октября 2018

Я бы использовал следующее шаблонное правило в вашем make-файле:

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

Приведенное выше правило будет создавать .s32 файлы из .wav файлов.

С этим правилом в вашем make-файле вы можете вызвать 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 соответственно.

...