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

Chr*_*aaa 7 makefile gnu-make

我正在管理一个在许多文件夹中包含数百个 c 文件的系统,有多个目标,因此并非每个构建中都需要所有 c 文件。

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

我广泛提出的是一个顶级生成文件,我在其中拉入文件夹列表并包含每个文件夹中的生成文件。

SUB_MAKEFILES := $(foreach subdir,$(SUBDIRS), $(subdir)/subdir.mk)
-include $(SUB_MAKEFILES)
Run Code Online (Sandbox Code Playgroud)

有些文件夹有特定的文件要编译,所以包含的文件非常简单;

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 ...
Run Code Online (Sandbox Code Playgroud)

我不想这样做几十次,所以我有一个通用模式,用于所有要编译的文件夹;

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"$@" "$<"
Run Code Online (Sandbox Code Playgroud)

这是有效的,但是我想避免为 subdir.mk 文件所在的路径组成一个随机的唯一名称。

有没有办法用“local SUBDIRPWD = $(some function...)”之类的东西替换“PATH155673423 := hand/entered/path”。

然后我就可以放入一个通用的 makefile 并包含它,无需输入容易出错的路径,也不必担心我会遇到唯一的名称冲突。

减少一些目录扫描也会很好,确实是同样的问题,需要一个局部变量。

即使是用于重复变量名等的某种宏也会更好

也许有一种方法可以将 makefile 包含在循环中,并在每个包含之前设置一个路径变量?

克里斯

Mad*_*ist 10

没有像您建议的那样将变量范围限定为特定的 makefile 之类的东西。但是,您有很多选择可以使这项工作顺利进行,从构造变量到指定范围,再到eval用于生成函数。例如,这样的事情:

SUBDIRS := foo bar biz baz

define INCLUDE_FILE
path = $S
include $S
endef

$(foreach S,$(SUBDIRS),$(eval $(INCLUDE_FILE)))
Run Code Online (Sandbox Code Playgroud)

您可以通过查看这组博客文章和 GNU make 手册的相关部分来找到更多关于这些的信息。

  • 您应该因博客中的 Makefile 文档而获得一枚奖章。 (4认同)