Makefile模式问题

时间:2009-07-22 16:47:56

标签: makefile directory design-patterns

我的压缩音频库应该按照下面的第4条规则进行复制,第二条规则正在过早处理,因为Assets / Audio / Compressed / Blah.caf符合第二条规则(但我只想要Assets / Audio中的文件) (没有更深的)由这条规则来处理)。想法?我真的不想简单地改变规则顺序(因为我认为可能存在其他问题):

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

2 个答案:

答案 0 :(得分:2)

部分问题在于您滥用模式规则。它们的确适用于更全局的情况,比如告诉如何从* .c创建* .o。像目录这样的世俗事物应该对他们无关紧要。

我建议你在根目录下使用globbing创建一个完整的目标列表。然后,您可以使用字符串替换来获取更高规则的目标。

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

一旦你有了这个,你可以将make函数转换为并行的目标列表,或者你可以使用静态模式规则:

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 '$<' '$@'

静态模式规则的优点是它将模式规则限制为仅列出的文件。

答案 1 :(得分:0)

我有一种感觉,这是过度的Makefiles 你为什么不写一个简单的脚本来处理文件?

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

ProcessScript应该将传递给它的每个文件转换为最后一个参数,
其中{}写在上面一行。
对于您可能希望传递的脚本的任何其他参数,您有<args>