1

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

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

但是,规则中的 $< 和 $@ 变量评估为空字符串,可能是因为它们是由运行它们的函数定义的,而不是在评估规则之前保存。

我很好奇这个问题的答案,同时也进入了这个问题的其他合理解决方案(除了重组目录结构)。

4

2 回答 2

1

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

于 2012-09-03T04:12:10.683 回答
0

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

当我遇到这样的问题时,我倾向于在 Make 之外编写一个支持脚本。但是,GNU Make 确实提供了 .SECONDEPANSION 目标,这是一种晦涩难懂的 hack,旨在使您的某些任务能够完成。您可能会对其进行调查,尽管我自己的经验是 .SECONDEPANSION 并不总是一个干净的解决方案。

于 2012-09-03T04:06:12.080 回答