2009-07-22 6 views
1

Mes cafés audio compressés, qui devraient être copiés par la 4ème règle ci-dessous, sont traités prématurément par la deuxième règle car Assets/Audio/Compressed/Blah.caf correspond à la deuxième règle (mais je ne veux que des fichiers dans Actifs/Audio (pas plus profond) à gérer par cette règle). Des idées? Je ne veux pas vraiment changer simplement l'ordre des règles (comme je pense qu'il peut y avoir d'autres problèmes avec cela):Makefile Pattern Issue

$(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) 

Répondre

0

J'ai le sentiment est exagérait Makefile.
Pourquoi n'écrivez-vous pas un script simple pour traiter les fichiers?

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

ProcessScript doit convertir chaque fichier qui lui est passé comme dernier argument,
où le {} est écrit dans la ligne ci-dessus. Vous avez <args> pour tous les autres arguments du script que vous souhaitez transmettre.

+0

Parce que c'est ghetto! :-) Cela faisait partie d'un Makefile plus grand ... –

2

Une partie du problème est que vous abusez des règles de modèle. Ils sont vraiment destinés à des situations plus globales, comme raconter comment créer des * .o à partir de * .c. Les choses banales comme les répertoires ne devraient pas leur importer.

Je vous suggère de créer une liste complète de cibles en utilisant globbing sur votre répertoire racine. Vous pouvez ensuite utiliser des substitutions de chaînes pour obtenir des cibles pour les règles supérieures.

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

Une fois que vous avez cela, vous pouvez le transformer avec des fonctions en faire une liste parallèle des cibles, ou vous pouvez utiliser une règle de modèle statique comme ceci:

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]' 

L'avantage de la statique règle de modèle est qu'il limite la règle de modèle aux seuls fichiers répertoriés.