我想定义一些类似的规则,所以我决定尝试在函数内定义它们:
COMPILED_JS_FILES=$(COMPILED_JS_FILES) $(foreach m,$(notdir $(wildcard src/$(1)/*.$(2))),$(TARGET_DIR)/$(1)/$(m))
$(TARGET_DIR)/$(1)/%.$(2) : src/$(1)/%.$(2)
$(CAT) $< > $@
endef
$(eval $(call COMPILE_JS,modules,js))
$(eval $(call COMPILE_JS,modules,jsm))
$(eval $(call COMPILE_JS,models,js))
$(eval $(call COMPILE_JS,firefox,js))
$(eval $(call COMPILE_JS,helpers,js))
然而,$&lt;规则中的$和变量评估为空字符串,大概是因为它们是由运行它们的函数定义的,而不是在评估规则之前保存。
我很好奇这个问题的答案,但也对这个问题的其他合理解决方案感兴趣(除了重组目录结构)。
答案 0 :(得分:1)
我实际上找到了答案(在这种情况下,我一般不知道) - $$<
和$$@
。此外,$$(CAT)将延迟$(CAT)的扩展,直到评估规则。
答案 1 :(得分:0)
这是makefile的一个老问题。确实没有一种好的,通用的方法可以在Make中解决它,因为你是对的:$<
和$@
在你需要的时候不可用。
当我遇到这样的问题时,我倾向于在Make之外写一个支持脚本。但是,GNU Make确实提供了.SECONDEXPANSION目标,这是一个模糊的黑客攻击,旨在使像您这样的任务完成。你可以调查一下,虽然我自己的经验是这样的.SECONDEXPANSION并不总是一个干净的解决方案。