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