makefile中不同目录的规则相同

时间:2016-06-15 17:55:18

标签: makefile

我有这样的规则。

$(OBJDIR)/%.s: %.c
    $(CC) $(PPE-CFLAGS) $(DEFS) -S -o $@ $<

我有一个像

这样的清单
dirs := $(OBJDIR) $(COMOBJDIR)

所以,不是为每个目录编写重复的代码,我可以将它们组合成一个吗?像需要迭代的东西?

1 个答案:

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

丑陋但有效。