Makefile 生成文件模式问题

Makefile 生成文件模式问题,makefile,directory,design-patterns,Makefile,Directory,Design Patterns,我的压缩音频caf(应该由下面的第4条规则复制)被第二条规则提前处理,因为Assets/audio/compressed/Blah.caf与第二条规则匹配(但我只希望Assets/audio(没有更深层次的)中的文件由该规则处理)。思想?我真的不想简单地改变规则顺序(因为我认为可能还有其他问题): $(资产\目标\路径)/$(音频\目录): mkdir-p$(资产\目标\路径)/$(音频\目录) $(资产\目标\路径)/$(音频\目录)/%.caf:$(构建\目录)/$(资产\目录)/$(音频\

我的压缩音频caf(应该由下面的第4条规则复制)被第二条规则提前处理,因为Assets/audio/compressed/Blah.caf与第二条规则匹配(但我只希望Assets/audio(没有更深层次的)中的文件由该规则处理)。思想?我真的不想简单地改变规则顺序(因为我认为可能还有其他问题):

$(资产\目标\路径)/$(音频\目录):
mkdir-p$(资产\目标\路径)/$(音频\目录)
$(资产\目标\路径)/$(音频\目录)/%.caf:$(构建\目录)/$(资产\目录)/$(音频\目录)/%.caf

cp'$我觉得这是对makefile的过度使用。
为什么不写一个简单的脚本来处理这些文件呢

find . -type f -name *.caf -exec ProcessScript <args> {} \;
find-键入f-name*.caf-exec ProcessScript{}\;
ProcessScript
应转换作为最后一个参数传递给它的每个文件,
其中,
{}
写在上面的行中。

您可能需要传递脚本的任何其他参数。

部分问题在于您滥用了模式规则。它们实际上是针对更全球化的情况,比如告诉make如何从*.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 '$<' '$@'
CAF\u目标:=$(addprefix$(资产\u目标\u路径)/$(音频\u目录)/,$(CAF\u资产))
$(CAF\U目标):$(资产\U目标\U路径)/$(音频\U目录)/%。CAF:$(构建\U目录)/$(资产\U目录)/$(音频\U目录)/%。CAF
cp'$
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 '$<' '$@'