Makefile重建目标,即使已经满足其要求

时间:2018-11-29 19:25:58

标签: makefile gnu-make gnu

我有以下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

0 个答案:

没有答案