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

时间:2015-10-02 09:56:24

标签: makefile gnu-make

我正在寻找一个在许多文件夹中有数百个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

克里斯

1 个答案:

答案 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制作手册的相关部分,了解有关这些内容的更多信息。