Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在makefile中使用一个规则生成一些子目录_C_Makefile_Gnu Make - Fatal编程技术网

C 在makefile中使用一个规则生成一些子目录

C 在makefile中使用一个规则生成一些子目录,c,makefile,gnu-make,C,Makefile,Gnu Make,我试图在makefile中创建一些子目录。我知道如何为每个子目录使用规则。我正在寻找一种语法,它可以对所有子目录使用一个规则(使用循环或使用子目录列表) 例如: $(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,$@) $<

我试图在makefile中创建一些子目录。我知道如何为每个子目录使用规则。我正在寻找一种语法,它可以对所有子目录使用一个规则(使用循环或使用子目录列表)

例如:

$(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,$@)
$(dst\U目录)/%.o:$(M2M\U通用目录)/rm/src/%.c
$(跟踪抄送)
$(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
$(跟踪抄送)
$(Q)$(GCC)-c$(CFLAGS)$<-o$@
$(Q)$(GCC)-c$(CFLAGS)-MM-MT$@-MF$(subst.o.d,$@)$<-o$(subst.o.d,$@)
$(dst目录)/%.o:$(M2M目录)/fota/src/%.c
$(跟踪抄送)
$(Q)$(GCC)-c$(CFLAGS)$<-o$@
$(Q)$(GCC)-c$(CFLAGS)-MM-MT$@-MF$(subst.o.d,$@)$<-o$(subst.o.d,$@)
$(dst目录)/%.o:$(M2M目录)/fota/src/lzo/%.c
$(跟踪抄送)
$(Q)$(GCC)-c$(CFLAGS)$<-o$@
$(Q)$(GCC)-c$(CFLAGS)-MM-MT$@-MF$(subst.o.d,$@)$<-o$(subst.o.d,$@)

好的,我想你要找的是:

#-------------------------------------
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)))
#-------------------------------------
定义mk_细分曲面=
$1/%.o:$(M2M\u通用目录)/rm/src/%.c
$(跟踪抄送)
$(Q)$(GCC)-c$(CFLAGS)$<-o$@
$(Q)$(GCC)-c$(CFLAGS)-MM-MT$@-MF$(subst.o.d,$@)$<-o$(subst.o.d,$@)
$1/%.o:$(M2M\u通用目录)/utility/src/%.c
$(跟踪抄送)
$(Q)$(GCC)-c$(CFLAGS)$<-o$@
$(Q)$(GCC)-c$(CFLAGS)-MM-MT$@-MF$(subst.o.d,$@)$<-o$(subst.o.d,$@)
$1/%.o:$(M2M\u通用目录)/fota/src/%.c
$(跟踪抄送)
$(Q)$(GCC)-c$(CFLAGS)$<-o$@
$(Q)$(GCC)-c$(CFLAGS)-MM-MT$@-MF$(subst.o.d,$@)$<-o$(subst.o.d,$@)
$1/%.o:$(M2M\u通用目录)/fota/src/lzo/%.c
$(跟踪抄送)
$(Q)$(GCC)-c$(CFLAGS)$<-o$@
$(Q)$(GCC)-c$(CFLAGS)-MM-MT$@-MF$(subst.o.d,$@)$<-o$(subst.o.d,$@)
恩德夫
#-------------------------------------
foreach(dir,$(SUBDIRS),$(eval$(调用mk_subdir,$(dir)))
有关更多详细信息,请参阅

当然,这样的定义会使其他人很难理解/调试/维护makefile,因此仅在您确实需要的情况下使用…(免责声明--我从未测试过上述代码,因此可能隐藏在其中的某个地方有语法错误…

这应该可以完成工作(GNU make):

define DIR\u规则
$$(dst_目录)/%.o:$$(M2M_通用目录)/$(1)/%.c
$$(跟踪抄送)
$$(Q)$$(GCC)-c$$(CFLAGS)$$<-o$$@
$$(Q)$$(GCC)-c$$(CFLAGS)-MM-MT$$@-MF$$(subst.o、.d、$$@)$$<-o$$(subst.o、.d、$$@)
恩德夫
SUBDIRS=rm/src utility/src fota/src fota/src/lzo
$(foreach d,$(SUBDIRS),$(eval$(call DIR_RULE,$(d)))

如需更详细的解释,请参阅此示例。

大量重复会使您更难看到您正在尝试完成的内容,并且本身就是一种反模式。您只是在寻找
mkdir-p“$(dst_dir)”
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))))