У меня есть следующий Makefile, который должен извлечь кучу звуковых файлов в формате mp3 на основе списка звуковых идентификаторов, а затем преобразовать их в файлы .wav.Я не очень знаком с GNU make, поэтому, пожалуйста, потерпите меня.
В результате мне нужна куча WAV-файлов, поэтому я сделал цель «все», которая ожидает эти WAV-файлы.Этот Makefile при запуске обычно загружает файлы .mp3, а затем преобразует их в файлы .wav.После этого он удалит все файлы .mp3 (поскольку я пометил их как .INTERMEDIATE).Моя проблема в том, что если я перезапущу этот Makefile, он попытается повторно загрузить mp3-файлы и преобразовать их в файлы .wav, даже если файлы .wav уже присутствуют.
Я не могу понять, почему цель «все» перезапускается, даже если она должна быть удовлетворена, поскольку все ее требования уже выполнены.Как я могу это исправить?
BASE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
BASE_DIR := $(BASE_DIR:/=)
BUILD := $(BASE_DIR)/build
AUDIO := $(BUILD)/audio
SOUND_IDS_FILE := $(BASE_DIR)/sound_ids.txt
SOUND_IDS:=$(shell cat ${SOUND_IDS_FILE})
MP3_FILES:=$(patsubst %, $(AUDIO)/%.mp3, $(SOUND_IDS))
WAV_FILES:=$(patsubst %, $(AUDIO)/%.wav, $(SOUND_IDS))
.PHONY: all clean
.INTERMEDIATE: $(MP3_FILES)
# Main Rules:
all: $(WAV_FILES)
clean:
rm -rf $(BUILD)
# Dir Rules:
$(BUILD):
mkdir -p $@
$(AUDIO):
mkdir -p $@
$(WAV_FILES): $(MP3_FILES)
@echo "Converting $< into $@ ..."
ffmpeg -i $< -acodec pcm_s16le -ac 1 -ar 16000 $@
$(MP3_FILES): $(AUDIO)
@echo "Downloading file: $@ ..."
sound_fetcher -i $(patsubst %.mp3,%,$(@F)) -o $(AUDIO) -format mp3