我有这样的规则。
$(OBJDIR)/%.s: %.c
$(CC) $(PPE-CFLAGS) $(DEFS) -S -o $@ $<
我有一个像
这样的清单dirs := $(OBJDIR) $(COMOBJDIR)
所以,不是为每个目录编写重复的代码,我可以将它们组合成一个吗?像需要迭代的东西?
答案 0 :(得分:1)
你已经击中了Make中的一个弱点:它无法同时处理多个通配符。有一种方法,但它很难看。
首先遵守你的规则:
$(OBJDIR)/%.s: %.c
$(CC) $(PPE-CFLAGS) $(DEFS) -S -o $@ $<
并将其放入变量中,转义'$'符号并将$(OBJDIR)
替换为$(1)
:
define myrule
$(1)/%.s: %.c
$$(CC) $$(PPE-CFLAGS) $$(DEFS) -S -o $$@ $$<
endef
然后您可以使用call
调用它并使用eval
调用它:
$(eval $(call myrule, $(OBJDIR))
这对于OBJDIR
来说已经足够了,但要对目录列表执行相同的操作,请使用foreach
:
$(foreach dir, $(OBJDIR) $(COMOBJDIR), $(eval $(call myrule, $(dir))))
或者只使用你的变量:
dirs := $(OBJDIR) $(COMOBJDIR)
$(foreach dir, $(dirs), $(eval $(call myrule, $(dir))))
丑陋但有效。