我正在尝试在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,$@)
答案 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,所以只有在真正需要的时候才使用...(免责声明 - 我从未测试过上面的代码,所以可能会出现语法错误躲在某处...)