Makefile перестраивает цель, даже если ее требования уже выполнены - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий 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
...