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

标签 makefile gnu-make

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

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

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

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 文件所在的路径组成一个随机的唯一名称。

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

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

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

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

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



克里斯

最佳答案

没有像您建议的那样将变量范围限定为特定的 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 make 手册的相关部分。

关于makefile - 我可以在包含的 makefile 中有局部变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32904790/

相关文章:

c++ - 在 Makefile 的什么地方放东西(CFLAGS 或 CXXFLAGS)?

makefile - 在一个文件夹中从不同的源文件夹创建目标文件

linux - 有没有办法在不重建其依赖项的情况下强制重建目标(make -B)?

makefile - 我怎样才能让 klocwork 在执行 kwinject 命令时忽略一个目录?

android - 什么是构建 Android 时的 export_includes 和 import_includes 文件

c++ - Eclipse CDT 生成的 Makefile 在哪里?

cuda - 检查 makefile 中 nvcc 是否可用

windows - 这是什么错误 `make.exe": no_c_compiler: Command not found`

makefile - 匹配具有依赖性的任何模式规则

linux - Makefile 匹配规则基于其他文件中的变量