在Makefile函数中定义规则

时间:2012-09-03 03:57:25

标签: makefile

我想定义一些类似的规则,所以我决定尝试在函数内定义它们:

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;规则中的$和变量评估为空字符串,大概是因为它们是由运行它们的函数定义的,而不是在评估规则之前保存。

我很好奇这个问题的答案,但也对这个问题的其他合理解决方案感兴趣(除了重组目录结构)。

2 个答案:

答案 0 :(得分:1)

我实际上找到了答案(在这种情况下,我一般不知道) - $$<$$@。此外,$$(CAT)将延迟$(CAT)的扩展,直到评估规则。

答案 1 :(得分:0)

这是makefile的一个老问题。确实没有一种好的,通用的方法可以在Make中解决它,因为你是对的:$<$@在你需要的时候不可用。

当我遇到这样的问题时,我倾向于在Make之外写一个支持脚本。但是,GNU Make确实提供了.SECONDEXPANSION目标,这是一个模糊的黑客攻击,旨在使像您这样的任务完成。你可以调查一下,虽然我自己的经验是这样的.SECONDEXPANSION并不总是一个干净的解决方案。