2009-07-22 12 views
1

Meine komprimierten Audio - Cafs, die nach der 4. Regel kopiert werden sollten, werden von der zweiten Regel vorzeitig verarbeitet, weil Assets/Audio/Compressed/Blah.caf der zweiten Regel entspricht (aber ich möchte nur Dateien in Assets/Audio (nicht tiefer), die von dieser Regel behandelt werden. Ideen? Ich will nicht wirklich einfach die Reihenfolge der Regeln ändern (wie ich es denke mit, dass andere Probleme sein kann):Makefile - Muster Ausgabe

$(ASSETS_TARGET_PATH)/$(AUDIO_DIR): 
    mkdir -p $(ASSETS_TARGET_PATH)/$(AUDIO_DIR) 

$(ASSETS_TARGET_PATH)/$(AUDIO_DIR)/%.caf: $(BUILD_DIR)/$(ASSETS_DIR)/$(AUDIO_DIR)/%.caf 
    cp '$<' $(ASSETS_TARGET_PATH)/$(AUDIO_DIR) 

$(ASSETS_TARGET_PATH)/$(AUDIO_DIR)/$(AUDIO_COMPRESSED_DIR): 
    mkdir -p $(ASSETS_TARGET_PATH)/$(AUDIO_DIR)/$(AUDIO_COMPRESSED_DIR) 

$(ASSETS_TARGET_PATH)/$(AUDIO_DIR)/$(AUDIO_COMPRESSED_DIR)/%.caf: $(BUILD_DIR)/$(ASSETS_DIR)/$(AUDIO_DIR)/$(AUDIO_COMPRESSED_DIR)/%.caf 
    cp '$<' $(ASSETS_TARGET_PATH)/$(AUDIO_DIR)/$(AUDIO_COMPRESSED_DIR) 

Antwort

0

Ich habe das Gefühl, das Makefiles übertreibt.
Warum schreiben Sie kein einfaches Skript, um die Dateien zu verarbeiten?

find . -type f -name *.caf -exec ProcessScript <args> {} \; 

ProcessScript sollte jede Datei, um es als das letzte Argument übergeben konvertieren,
wo die {} in der obigen Zeile geschrieben wird.
Sie haben <args> für alle anderen Argumente für das Skript, die Sie möglicherweise übergeben möchten.

+0

Denn das ist Ghetto! :-) Dies war Teil eines größeren Makefiles ... –

2

Ein Teil des Problems besteht darin, dass Sie Musterregeln missbrauchen. Sie sind wirklich für globalere Situationen gedacht, wie zum Beispiel das Erstellen von * .o's aus * .c's. Alltägliche Dinge wie Verzeichnisse sollten ihnen egal sein.

Ich würde vorschlagen, Sie erstellen eine umfassende Liste von Zielen mit Globbing auf Ihrem Stammverzeichnis. Dann können Sie String-Substitutionen verwenden, um Ziele für die höheren Regeln zu erhalten.

CAF_ASSETS := $(notdir $(wildcard $(BUILD_DIR)/$(ASSETS_DIR)/$(AUDIO_DIR)/*.caf)) 

Sobald Sie diese haben, können Sie entweder verwandeln es mit Make-Funktionen in eine parallele Liste von Zielen, oder Sie können wie so ein statisches Muster Regel verwenden:

CAF_TARGETS := $(addprefix $(ASSETS_TARGET_PATH)/$(AUDIO_DIR)/, $(CAF_ASSETS)) 

$(CAF_TARGETS) : $(ASSETS_TARGET_PATH)/$(AUDIO_DIR)/%.caf : $(BUILD_DIR)/$(ASSETS_DIR)/$(AUDIO_DIR)/%.caf 
    cp '$<' '[email protected]' 

Der Vorteil der statischen Die Musterregel besagt, dass sie die Musterregel auf nur die aufgelisteten Dateien beschränkt.