使用makefile中的一个规则创建一些子目录

时间:2017-12-04 12:24:02

标签: c makefile gnu-make

我正在尝试在makefile中创建一些子目录。我知道如何使用每个子目录的规则。我正在寻找使用一个规则为所有子目录(使用循环或使用SUBDIRs列表)的语法。

例如:

$(dst_dir)/%.o : $(M2M_GENERIC_DIR)/rm/src/%.c
    $(TRACE_CC)
    $(Q)$(GCC) -c $(CFLAGS) $< -o $@
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT $@ -MF $(subst .o,.d,$@) $< -o $(subst .o,.d,$@)

$(dst_dir)/%.o : $(M2M_GENERIC_DIR)/utility/src/%.c
    $(TRACE_CC)
    $(Q)$(GCC) -c $(CFLAGS) $< -o $@
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT $@ -MF $(subst .o,.d,$@) $< -o $(subst .o,.d,$@)

$(dst_dir)/%.o : $(M2M_GENERIC_DIR)/fota/src/%.c
    $(TRACE_CC)
    $(Q)$(GCC) -c $(CFLAGS) $< -o $@
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT $@ -MF $(subst .o,.d,$@) $< -o $(subst .o,.d,$@)

$(dst_dir)/%.o : $(M2M_GENERIC_DIR)/fota/src/lzo/%.c
    $(TRACE_CC)
    $(Q)$(GCC) -c $(CFLAGS) $< -o $@
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT $@ -MF $(subst .o,.d,$@) $< -o $(subst .o,.d,$@)

2 个答案:

答案 0 :(得分:1)

这应该做的工作(GNU make):

define DIR_RULE
$$(dst_dir)/%.o : $$(M2M_GENERIC_DIR)/$(1)/%.c
    $$(TRACE_CC)
    $$(Q)$$(GCC) -c $$(CFLAGS) $$< -o $$@
    $$(Q)$$(GCC) -c $$(CFLAGS) -MM -MT $$@ -MF $$(subst .o,.d,$$@) $$< -o $$(subst .o,.d,$$@)
endef
SUBDIRS = rm/src utility/src fota/src fota/src/lzo
$(foreach d,$(SUBDIRS),$(eval $(call DIR_RULE,$(d))))

有关详细说明,请参阅此other question (and answer)

答案 1 :(得分:0)

好的,我认为你要找的是:

#-------------------------------------
define mk_subdir =

$1/%.o : $(M2M_GENERIC_DIR)/rm/src/%.c
    $(TRACE_CC)
    $(Q)$(GCC) -c $(CFLAGS) $< -o $@
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT $@ -MF $(subst .o,.d,$@) $< -o $(subst .o,.d,$@)

$1/%.o : $(M2M_GENERIC_DIR)/utility/src/%.c
    $(TRACE_CC)
    $(Q)$(GCC) -c $(CFLAGS) $< -o $@
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT $@ -MF $(subst .o,.d,$@) $< -o $(subst .o,.d,$@)

$1/%.o : $(M2M_GENERIC_DIR)/fota/src/%.c
    $(TRACE_CC)
    $(Q)$(GCC) -c $(CFLAGS) $< -o $@
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT $@ -MF $(subst .o,.d,$@) $< -o $(subst .o,.d,$@)

$1/%.o : $(M2M_GENERIC_DIR)/fota/src/lzo/%.c
    $(TRACE_CC)
    $(Q)$(GCC) -c $(CFLAGS) $< -o $@
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT $@ -MF $(subst .o,.d,$@) $< -o $(subst .o,.d,$@) 

endef
#-------------------------------------

foreach (dir,$(SUBDIRS),$(eval $(call mk_subdir,$(dir)))

有关详细信息,请参阅eval

当然这些定义使得其他人很难理解/调试/维护makefile,所以只有在真正需要的时候才使用...(免责声明 - 我从未测试过上面的代码,所以可能会出现语法错误躲在某处...)