在VPATH中进行递归搜索?

时间:2019-01-15 03:15:17

标签: c++ makefile vpath

我的C ++项目的源文件组织在./src的嵌套子目录中。我的Makefile中有一个模式规则,该规则将所有.cpp源文件编译为对象:

$(OBJDIR)/%.o: %.cpp makefile
    $(CXX) -c $< -o $@

由于我使用的是这种模式,而不是为每个源文件编写一个编译规则,因此我需要告诉make通过./src递归查找这些先决条件。现在我有:

VPATH := $./src/:./src/folder1:./src/folder2:./src/folder3

这有效,但是感觉很不雅致,而且当我不可避免地忘记添加新文件夹时,也会引起错误。

希望有人有更好的解决方案!

2 个答案:

答案 0 :(得分:1)

gmake本身不具有递归目录遍历的任何功能,因此您必须求助于$(shell ...)

VPATH := $(shell find src -type d -print | tr '\012' ':' | sed 's/:$$//')

调整shell脚本以获得正确的语义。您想使用:=运算符,以便对此进行一次评估。

答案 1 :(得分:1)

您可以通过搜索子目录并用冒号替换空格来像您一样自动构建VPATH变量:

space :=
space +=
VPATH := $(subst $(space),:,$(shell find src -type d))

这假定您的目录或文件名中没有空格。

使用这种方法,我不清楚如果两个不同子目录中的两个源文件具有相同的名称,该怎么办–但这似乎与您的整体设置有关,而不是与您对{{ 1}}。

有关VPATH可变技巧,请参阅漂亮的Escaping comma and space in GNU Make博客文章。