我可以在包含的makefile中使用局部变量吗?

我可以在包含的makefile中使用局部变量吗?,makefile,gnu-make,Makefile,Gnu Make,我正在关注一个在许多文件夹中有数百个c文件的系统,有多个目标,因此不是每个构建都需要所有的c文件 因为并非所有文件都是必需的,所以我不能使用纯递归构建。我不想这样做,因为我不想有一个缓慢的串行构建与神秘的依赖无论如何 我提出的是一个顶级makefile,我在其中拉入一个文件夹列表,并从每个文件夹中包含一个makefile SUB_MAKEFILES := $(foreach subdir,$(SUBDIRS), $(subdir)/subdir.mk) -include $(SUB_MAKEFI

我正在关注一个在许多文件夹中有数百个c文件的系统,有多个目标,因此不是每个构建都需要所有的c文件

因为并非所有文件都是必需的,所以我不能使用纯递归构建。我不想这样做,因为我不想有一个缓慢的串行构建与神秘的依赖无论如何

我提出的是一个顶级makefile,我在其中拉入一个文件夹列表,并从每个文件夹中包含一个makefile

SUB_MAKEFILES := $(foreach subdir,$(SUBDIRS), $(subdir)/subdir.mk)
-include $(SUB_MAKEFILES)
有些文件夹有特定的文件要编译,所以包含的文件非常简单

srcs += path/a.c path/b.c
deps += path/a.d path/b.d
objs += op/path/a.o op/path/b.o

op/path/%.o: path/%.c path/subdir.mk
   compile ...
我不想这样做几十次,所以我有一个通用的模式,我使用的文件夹中的一切是要编译

PATH155 := src/f1/f2/f3/f4

srcs += $(shell $(FFshell) $(PATH155) -maxdepth 1 -name '*.c')
deps += $(addprefix ${OUT_DIR}, $(patsubst %.c,%.d,$(shell $(FFshell) $(PATH155) -maxdepth 1 -name '*.c')))
objs   += $(addprefix ${OUT_DIR}, $(patsubst %.c,%.o,$(shell $(FFshell) $(PATH155) -maxdepth 1 -name '*.c')))

$(OUT_O_DIR)$(PATH155)/%.o: $(PATH155)/%.c $(PATH155)/subdir.mk
    gcc -c $(CFLGS) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
PATH155:=src/f1/f2/f3/f4
srcs+=$(shell$(FFshell)$(路径155)-maxdepth 1-名称'*.c')
deps+=$(addprefix${OUT\u DIR},$(patsubst%.c,%.d,$(shell$(FFshell)$(PATH155)-maxdepth 1-name'*.c'))
objs+=$(addprefix${OUT_DIR},$(patsubst%.c,%.o,$(shell$(FFshell)$(PATH155)-maxdepth 1-name'*.c'))
$(输出目录)$(路径155)/%.O:$(路径155)/%.c$(路径155)/subdir.mk

gcc-c$(CFLGS)-MF“$(@:%.o=%.d)”-MT“$(@:%.o=%.d)”-o“$@”“$没有像您所建议的那样将变量限定在特定的makefile的范围内。但是,您有很多选项来实现这一点,从构造变量来指定范围,到使用
eval
来生成函数。例如,类似这样的东西:

SUBDIRS := foo bar biz baz

define INCLUDE_FILE
path = $S
include $S
endef

$(foreach S,$(SUBDIRS),$(eval $(INCLUDE_FILE)))

您可以通过浏览GNU make手册及其相关章节来了解更多信息。

您应该在您的博客中获得Makefile文档奖章。该死,生成本地范围的$(foreach…)想法太棒了!!