【问题标题】:Make some sub-directories using one rule in makefile使用 makefile 中的一条规则创建一些子目录
【发布时间】:2017-12-04 12:24:02
【问题描述】:

我正在尝试在 makefile 中创建一些子目录。我知道如何使用每个子目录的规则来做到这一点。我正在寻找对所有子目录使用一条规则的语法(使用循环或使用 SUBDIR 列表)。

例如:

$(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,$@)

【问题讨论】:

标签: c makefile gnu-make


【解决方案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)

【讨论】:

    【解决方案2】:

    好的,我想你要找的是这个:

    #-------------------------------------
    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,所以只有在你真的需要时才使用...(免责声明——我从未测试过上面的代码,所以可能存在语法错误躲在某个地方……)

    【讨论】:

      猜你喜欢
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2011-04-22
      • 2012-09-24
      相关资源
      最近更新 更多