我正在寻找一个在许多文件夹中有数百个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"$@" "$<"
这样可行,但是我想避免为subdir.mk文件所在的路径组成一个随机唯一名称。
无论如何要替换&#34; PATH155673423:= hand / entered / path&#34;与#34;本地SUBDIRPWD = $(某些功能......)&#34;。
然后我可以放入一个通用的makefile并包含它,不会出现错误的路径输入,也不用担心我会得到一个独特的名字冲突。
最好还有一些目录扫描,同样的问题,需要一个局部变量。
即使是重复变量名等的某种宏也会更好
也许有一种方法可以将makefile包含在循环中,并在每次包含之前设置路径变量?
TA
克里斯
答案 0 :(得分:2)
没有变量作用于特定makefile的变量,例如你的建议。但是,您可以使用很多选项来完成这项工作,从构造变量到赋予范围,再到使用eval
生成函数。例如,像这样:
SUBDIRS := foo bar biz baz
define INCLUDE_FILE
path = $S
include $S
endef
$(foreach S,$(SUBDIRS),$(eval $(INCLUDE_FILE)))
您可以查看this set of blog posts以及GNU制作手册的相关部分,了解有关这些内容的更多信息。