我正在管理一个在许多文件夹中包含数百个 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 手册的相关部分来找到更多关于这些的信息。