我有以下Makefile,应该根据声音ID列表获取一堆mp3格式的声音文件,然后将它们转换为.wav文件。我对GNU make不太熟悉,所以请多多包涵。
因此,我需要的是一堆.wav文件,因此,我确定了一个“全部”目标,期望这些.wav文件。该Makefile在运行时将正常下载.mp3文件,然后将其转换为.wav文件。之后,它将删除所有.mp3文件(因为我将其标记为.INTERMEDIATE)。我的问题是,如果我重新运行此Makefile,即使.wav文件已经存在,它也会尝试重新下载mp3文件并将其重新转换为.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