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